mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2025-04-21 12:27:27 +03:00
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@15875 3c298f89-4303-0410-b956-a3cf2f4a3e73
121448 lines
3.8 MiB
121448 lines
3.8 MiB
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/include/asm/bug.h linux-2.6.29-rc3.owrt/arch/alpha/include/asm/bug.h
|
|
--- linux-2.6.29.owrt/arch/alpha/include/asm/bug.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/include/asm/bug.h 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -8,12 +8,17 @@
|
|
|
|
/* ??? Would be nice to use .gprel32 here, but we can't be sure that the
|
|
function loaded the GP, so this could fail in modules. */
|
|
-#define BUG() do { \
|
|
- __asm__ __volatile__( \
|
|
- "call_pal %0 # bugchk\n\t" \
|
|
- ".long %1\n\t.8byte %2" \
|
|
- : : "i"(PAL_bugchk), "i"(__LINE__), "i"(__FILE__)); \
|
|
- for ( ; ; ); } while (0)
|
|
+static inline void ATTRIB_NORET __BUG(const char *file, int line)
|
|
+{
|
|
+ __asm__ __volatile__(
|
|
+ "call_pal %0 # bugchk\n\t"
|
|
+ ".long %1\n\t.8byte %2"
|
|
+ : : "i" (PAL_bugchk), "i"(line), "i"(file));
|
|
+ for ( ; ; )
|
|
+ ;
|
|
+}
|
|
+
|
|
+#define BUG() __BUG(__FILE__, __LINE__)
|
|
|
|
#define HAVE_ARCH_BUG
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/include/asm/dma-mapping.h linux-2.6.29-rc3.owrt/arch/alpha/include/asm/dma-mapping.h
|
|
--- linux-2.6.29.owrt/arch/alpha/include/asm/dma-mapping.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/include/asm/dma-mapping.h 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -29,8 +29,6 @@
|
|
|
|
#else /* no PCI - no IOMMU. */
|
|
|
|
-#include <asm/io.h> /* for virt_to_phys() */
|
|
-
|
|
struct scatterlist;
|
|
void *dma_alloc_coherent(struct device *dev, size_t size,
|
|
dma_addr_t *dma_handle, gfp_t gfp);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/Kconfig linux-2.6.29-rc3.owrt/arch/alpha/Kconfig
|
|
--- linux-2.6.29.owrt/arch/alpha/Kconfig 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/Kconfig 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -8,7 +8,6 @@
|
|
select HAVE_AOUT
|
|
select HAVE_IDE
|
|
select HAVE_OPROFILE
|
|
- select HAVE_SYSCALL_WRAPPERS
|
|
help
|
|
The Alpha is a 64-bit general-purpose processor designed and
|
|
marketed by the Digital Equipment Corporation of blessed memory,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/kernel/entry.S linux-2.6.29-rc3.owrt/arch/alpha/kernel/entry.S
|
|
--- linux-2.6.29.owrt/arch/alpha/kernel/entry.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/entry.S 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -933,7 +933,7 @@
|
|
osf_sigprocmask:
|
|
.prologue 0
|
|
mov $sp, $18
|
|
- jmp $31, sys_osf_sigprocmask
|
|
+ jmp $31, do_osf_sigprocmask
|
|
.end osf_sigprocmask
|
|
|
|
.align 4
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/kernel/osf_sys.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/osf_sys.c
|
|
--- linux-2.6.29.owrt/arch/alpha/kernel/osf_sys.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/osf_sys.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -54,7 +54,8 @@
|
|
* identical to OSF as we don't return 0 on success, but doing otherwise
|
|
* would require changes to libc. Hopefully this is good enough.
|
|
*/
|
|
-SYSCALL_DEFINE1(osf_brk, unsigned long, brk)
|
|
+asmlinkage unsigned long
|
|
+osf_brk(unsigned long brk)
|
|
{
|
|
unsigned long retval = sys_brk(brk);
|
|
if (brk && brk != retval)
|
|
@@ -65,9 +66,9 @@
|
|
/*
|
|
* This is pure guess-work..
|
|
*/
|
|
-SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start,
|
|
- unsigned long, text_len, unsigned long, bss_start,
|
|
- unsigned long, bss_len)
|
|
+asmlinkage int
|
|
+osf_set_program_attributes(unsigned long text_start, unsigned long text_len,
|
|
+ unsigned long bss_start, unsigned long bss_len)
|
|
{
|
|
struct mm_struct *mm;
|
|
|
|
@@ -145,9 +146,9 @@
|
|
return -EFAULT;
|
|
}
|
|
|
|
-SYSCALL_DEFINE4(osf_getdirentries, unsigned int, fd,
|
|
- struct osf_dirent __user *, dirent, unsigned int, count,
|
|
- long __user *, basep)
|
|
+asmlinkage int
|
|
+osf_getdirentries(unsigned int fd, struct osf_dirent __user *dirent,
|
|
+ unsigned int count, long __user *basep)
|
|
{
|
|
int error;
|
|
struct file *file;
|
|
@@ -176,9 +177,9 @@
|
|
|
|
#undef NAME_OFFSET
|
|
|
|
-SYSCALL_DEFINE6(osf_mmap, unsigned long, addr, unsigned long, len,
|
|
- unsigned long, prot, unsigned long, flags, unsigned long, fd,
|
|
- unsigned long, off)
|
|
+asmlinkage unsigned long
|
|
+osf_mmap(unsigned long addr, unsigned long len, unsigned long prot,
|
|
+ unsigned long flags, unsigned long fd, unsigned long off)
|
|
{
|
|
struct file *file = NULL;
|
|
unsigned long ret = -EBADF;
|
|
@@ -253,8 +254,8 @@
|
|
return error;
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(osf_statfs, char __user *, pathname,
|
|
- struct osf_statfs __user *, buffer, unsigned long, bufsiz)
|
|
+asmlinkage int
|
|
+osf_statfs(char __user *pathname, struct osf_statfs __user *buffer, unsigned long bufsiz)
|
|
{
|
|
struct path path;
|
|
int retval;
|
|
@@ -267,8 +268,8 @@
|
|
return retval;
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(osf_fstatfs, unsigned long, fd,
|
|
- struct osf_statfs __user *, buffer, unsigned long, bufsiz)
|
|
+asmlinkage int
|
|
+osf_fstatfs(unsigned long fd, struct osf_statfs __user *buffer, unsigned long bufsiz)
|
|
{
|
|
struct file *file;
|
|
int retval;
|
|
@@ -367,8 +368,8 @@
|
|
return do_mount("", dirname, "proc", flags, NULL);
|
|
}
|
|
|
|
-SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, char __user *, path,
|
|
- int, flag, void __user *, data)
|
|
+asmlinkage int
|
|
+osf_mount(unsigned long typenr, char __user *path, int flag, void __user *data)
|
|
{
|
|
int retval = -EINVAL;
|
|
char *name;
|
|
@@ -398,7 +399,8 @@
|
|
return retval;
|
|
}
|
|
|
|
-SYSCALL_DEFINE1(osf_utsname, char __user *, name)
|
|
+asmlinkage int
|
|
+osf_utsname(char __user *name)
|
|
{
|
|
int error;
|
|
|
|
@@ -421,12 +423,14 @@
|
|
return error;
|
|
}
|
|
|
|
-SYSCALL_DEFINE0(getpagesize)
|
|
+asmlinkage unsigned long
|
|
+sys_getpagesize(void)
|
|
{
|
|
return PAGE_SIZE;
|
|
}
|
|
|
|
-SYSCALL_DEFINE0(getdtablesize)
|
|
+asmlinkage unsigned long
|
|
+sys_getdtablesize(void)
|
|
{
|
|
return sysctl_nr_open;
|
|
}
|
|
@@ -434,7 +438,8 @@
|
|
/*
|
|
* For compatibility with OSF/1 only. Use utsname(2) instead.
|
|
*/
|
|
-SYSCALL_DEFINE2(osf_getdomainname, char __user *, name, int, namelen)
|
|
+asmlinkage int
|
|
+osf_getdomainname(char __user *name, int namelen)
|
|
{
|
|
unsigned len;
|
|
int i;
|
|
@@ -522,8 +527,8 @@
|
|
PL_DEL = 5, PL_FDEL = 6
|
|
};
|
|
|
|
-SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
|
|
- union pl_args __user *, args)
|
|
+asmlinkage long
|
|
+osf_proplist_syscall(enum pl_code code, union pl_args __user *args)
|
|
{
|
|
long error;
|
|
int __user *min_buf_size_ptr;
|
|
@@ -562,8 +567,8 @@
|
|
return error;
|
|
}
|
|
|
|
-SYSCALL_DEFINE2(osf_sigstack, struct sigstack __user *, uss,
|
|
- struct sigstack __user *, uoss)
|
|
+asmlinkage int
|
|
+osf_sigstack(struct sigstack __user *uss, struct sigstack __user *uoss)
|
|
{
|
|
unsigned long usp = rdusp();
|
|
unsigned long oss_sp = current->sas_ss_sp + current->sas_ss_size;
|
|
@@ -603,7 +608,8 @@
|
|
return error;
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
|
|
+asmlinkage long
|
|
+osf_sysinfo(int command, char __user *buf, long count)
|
|
{
|
|
char *sysinfo_table[] = {
|
|
utsname()->sysname,
|
|
@@ -641,8 +647,9 @@
|
|
return err;
|
|
}
|
|
|
|
-SYSCALL_DEFINE5(osf_getsysinfo, unsigned long, op, void __user *, buffer,
|
|
- unsigned long, nbytes, int __user *, start, void __user *, arg)
|
|
+asmlinkage unsigned long
|
|
+osf_getsysinfo(unsigned long op, void __user *buffer, unsigned long nbytes,
|
|
+ int __user *start, void __user *arg)
|
|
{
|
|
unsigned long w;
|
|
struct percpu_struct *cpu;
|
|
@@ -698,8 +705,9 @@
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
-SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer,
|
|
- unsigned long, nbytes, int __user *, start, void __user *, arg)
|
|
+asmlinkage unsigned long
|
|
+osf_setsysinfo(unsigned long op, void __user *buffer, unsigned long nbytes,
|
|
+ int __user *start, void __user *arg)
|
|
{
|
|
switch (op) {
|
|
case SSI_IEEE_FP_CONTROL: {
|
|
@@ -872,8 +880,8 @@
|
|
value->tv_sec = jiffies / HZ;
|
|
}
|
|
|
|
-SYSCALL_DEFINE2(osf_gettimeofday, struct timeval32 __user *, tv,
|
|
- struct timezone __user *, tz)
|
|
+asmlinkage int
|
|
+osf_gettimeofday(struct timeval32 __user *tv, struct timezone __user *tz)
|
|
{
|
|
if (tv) {
|
|
struct timeval ktv;
|
|
@@ -888,8 +896,8 @@
|
|
return 0;
|
|
}
|
|
|
|
-SYSCALL_DEFINE2(osf_settimeofday, struct timeval32 __user *, tv,
|
|
- struct timezone __user *, tz)
|
|
+asmlinkage int
|
|
+osf_settimeofday(struct timeval32 __user *tv, struct timezone __user *tz)
|
|
{
|
|
struct timespec kts;
|
|
struct timezone ktz;
|
|
@@ -908,7 +916,8 @@
|
|
return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
|
|
}
|
|
|
|
-SYSCALL_DEFINE2(osf_getitimer, int, which, struct itimerval32 __user *, it)
|
|
+asmlinkage int
|
|
+osf_getitimer(int which, struct itimerval32 __user *it)
|
|
{
|
|
struct itimerval kit;
|
|
int error;
|
|
@@ -920,8 +929,8 @@
|
|
return error;
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(osf_setitimer, int, which, struct itimerval32 __user *, in,
|
|
- struct itimerval32 __user *, out)
|
|
+asmlinkage int
|
|
+osf_setitimer(int which, struct itimerval32 __user *in, struct itimerval32 __user *out)
|
|
{
|
|
struct itimerval kin, kout;
|
|
int error;
|
|
@@ -943,8 +952,8 @@
|
|
|
|
}
|
|
|
|
-SYSCALL_DEFINE2(osf_utimes, char __user *, filename,
|
|
- struct timeval32 __user *, tvs)
|
|
+asmlinkage int
|
|
+osf_utimes(char __user *filename, struct timeval32 __user *tvs)
|
|
{
|
|
struct timespec tv[2];
|
|
|
|
@@ -970,8 +979,9 @@
|
|
#define MAX_SELECT_SECONDS \
|
|
((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1)
|
|
|
|
-SYSCALL_DEFINE5(osf_select, int, n, fd_set __user *, inp, fd_set __user *, outp,
|
|
- fd_set __user *, exp, struct timeval32 __user *, tvp)
|
|
+asmlinkage int
|
|
+osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
|
+ struct timeval32 __user *tvp)
|
|
{
|
|
struct timespec end_time, *to = NULL;
|
|
if (tvp) {
|
|
@@ -1016,7 +1026,8 @@
|
|
long ru_nivcsw; /* involuntary " */
|
|
};
|
|
|
|
-SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)
|
|
+asmlinkage int
|
|
+osf_getrusage(int who, struct rusage32 __user *ru)
|
|
{
|
|
struct rusage32 r;
|
|
|
|
@@ -1042,8 +1053,9 @@
|
|
return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
|
|
}
|
|
|
|
-SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,
|
|
- struct rusage32 __user *, ur)
|
|
+asmlinkage long
|
|
+osf_wait4(pid_t pid, int __user *ustatus, int options,
|
|
+ struct rusage32 __user *ur)
|
|
{
|
|
struct rusage r;
|
|
long ret, err;
|
|
@@ -1089,8 +1101,8 @@
|
|
* seems to be a timeval pointer, and I suspect the second
|
|
* one is the time remaining.. Ho humm.. No documentation.
|
|
*/
|
|
-SYSCALL_DEFINE2(osf_usleep_thread, struct timeval32 __user *, sleep,
|
|
- struct timeval32 __user *, remain)
|
|
+asmlinkage int
|
|
+osf_usleep_thread(struct timeval32 __user *sleep, struct timeval32 __user *remain)
|
|
{
|
|
struct timeval tmp;
|
|
unsigned long ticks;
|
|
@@ -1143,7 +1155,8 @@
|
|
int :32; int :32; int :32; int :32;
|
|
};
|
|
|
|
-SYSCALL_DEFINE1(old_adjtimex, struct timex32 __user *, txc_p)
|
|
+asmlinkage int
|
|
+sys_old_adjtimex(struct timex32 __user *txc_p)
|
|
{
|
|
struct timex txc;
|
|
int ret;
|
|
@@ -1254,8 +1267,8 @@
|
|
return 0;
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(osf_readv, unsigned long, fd,
|
|
- const struct iovec __user *, vector, unsigned long, count)
|
|
+asmlinkage ssize_t
|
|
+osf_readv(unsigned long fd, const struct iovec __user * vector, unsigned long count)
|
|
{
|
|
if (unlikely(personality(current->personality) == PER_OSF4))
|
|
if (osf_fix_iov_len(vector, count))
|
|
@@ -1263,8 +1276,8 @@
|
|
return sys_readv(fd, vector, count);
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(osf_writev, unsigned long, fd,
|
|
- const struct iovec __user *, vector, unsigned long, count)
|
|
+asmlinkage ssize_t
|
|
+osf_writev(unsigned long fd, const struct iovec __user * vector, unsigned long count)
|
|
{
|
|
if (unlikely(personality(current->personality) == PER_OSF4))
|
|
if (osf_fix_iov_len(vector, count))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/kernel/pci-noop.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/pci-noop.c
|
|
--- linux-2.6.29.owrt/arch/alpha/kernel/pci-noop.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/pci-noop.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -109,8 +109,7 @@
|
|
/* Stubs for the routines in pci_iommu.c: */
|
|
|
|
void *
|
|
-__pci_alloc_consistent(struct pci_dev *pdev, size_t size,
|
|
- dma_addr_t *dma_addrp, gfp_t gfp)
|
|
+pci_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp)
|
|
{
|
|
return NULL;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/kernel/process.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/process.c
|
|
--- linux-2.6.29.owrt/arch/alpha/kernel/process.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/process.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -93,8 +93,8 @@
|
|
if (cpuid != boot_cpuid) {
|
|
flags |= 0x00040000UL; /* "remain halted" */
|
|
*pflags = flags;
|
|
- set_cpu_present(cpuid, false);
|
|
- set_cpu_possible(cpuid, false);
|
|
+ cpu_clear(cpuid, cpu_present_map);
|
|
+ cpu_clear(cpuid, cpu_possible_map);
|
|
halt();
|
|
}
|
|
#endif
|
|
@@ -120,8 +120,8 @@
|
|
|
|
#ifdef CONFIG_SMP
|
|
/* Wait for the secondaries to halt. */
|
|
- set_cpu_present(boot_cpuid, false);
|
|
- set_cpu_possible(boot_cpuid, false);
|
|
+ cpu_clear(boot_cpuid, cpu_present_map);
|
|
+ cpu_clear(boot_cpuid, cpu_possible_map);
|
|
while (cpus_weight(cpu_present_map))
|
|
barrier();
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/kernel/signal.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/signal.c
|
|
--- linux-2.6.29.owrt/arch/alpha/kernel/signal.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/signal.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
#include <linux/tty.h>
|
|
#include <linux/binfmts.h>
|
|
#include <linux/bitops.h>
|
|
-#include <linux/syscalls.h>
|
|
|
|
#include <asm/uaccess.h>
|
|
#include <asm/sigcontext.h>
|
|
@@ -52,8 +51,8 @@
|
|
* Note that we don't need to acquire the kernel lock for SMP
|
|
* operation, as all of this is local to this thread.
|
|
*/
|
|
-SYSCALL_DEFINE3(osf_sigprocmask, int, how, unsigned long, newmask,
|
|
- struct pt_regs *, regs)
|
|
+asmlinkage unsigned long
|
|
+do_osf_sigprocmask(int how, unsigned long newmask, struct pt_regs *regs)
|
|
{
|
|
unsigned long oldmask = -EINVAL;
|
|
|
|
@@ -82,9 +81,9 @@
|
|
return oldmask;
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(osf_sigaction, int, sig,
|
|
- const struct osf_sigaction __user *, act,
|
|
- struct osf_sigaction __user *, oact)
|
|
+asmlinkage int
|
|
+osf_sigaction(int sig, const struct osf_sigaction __user *act,
|
|
+ struct osf_sigaction __user *oact)
|
|
{
|
|
struct k_sigaction new_ka, old_ka;
|
|
int ret;
|
|
@@ -113,9 +112,10 @@
|
|
return ret;
|
|
}
|
|
|
|
-SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
|
|
- struct sigaction __user *, oact,
|
|
- size_t, sigsetsize, void __user *, restorer)
|
|
+asmlinkage long
|
|
+sys_rt_sigaction(int sig, const struct sigaction __user *act,
|
|
+ struct sigaction __user *oact,
|
|
+ size_t sigsetsize, void __user *restorer)
|
|
{
|
|
struct k_sigaction new_ka, old_ka;
|
|
int ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/kernel/smp.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/smp.c
|
|
--- linux-2.6.29.owrt/arch/alpha/kernel/smp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/smp.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -121,11 +121,10 @@
|
|
{
|
|
int cpuid = hard_smp_processor_id();
|
|
|
|
- if (cpu_online(cpuid)) {
|
|
+ if (cpu_test_and_set(cpuid, cpu_online_map)) {
|
|
printk("??, cpu 0x%x already present??\n", cpuid);
|
|
BUG();
|
|
}
|
|
- set_cpu_online(cpuid, true);
|
|
|
|
/* Turn on machine checks. */
|
|
wrmces(7);
|
|
@@ -436,8 +435,8 @@
|
|
((char *)cpubase + i*hwrpb->processor_size);
|
|
if ((cpu->flags & 0x1cc) == 0x1cc) {
|
|
smp_num_probed++;
|
|
- set_cpu_possible(i, true);
|
|
- set_cpu_present(i, true);
|
|
+ cpu_set(i, cpu_possible_map);
|
|
+ cpu_set(i, cpu_present_map);
|
|
cpu->pal_revision = boot_cpu_palrev;
|
|
}
|
|
|
|
@@ -470,8 +469,8 @@
|
|
|
|
/* Nothing to do on a UP box, or when told not to. */
|
|
if (smp_num_probed == 1 || max_cpus == 0) {
|
|
- init_cpu_possible(cpumask_of(boot_cpuid));
|
|
- init_cpu_present(cpumask_of(boot_cpuid));
|
|
+ cpu_possible_map = cpumask_of_cpu(boot_cpuid);
|
|
+ cpu_present_map = cpumask_of_cpu(boot_cpuid);
|
|
printk(KERN_INFO "SMP mode deactivated.\n");
|
|
return;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/alpha/kernel/systbls.S linux-2.6.29-rc3.owrt/arch/alpha/kernel/systbls.S
|
|
--- linux-2.6.29.owrt/arch/alpha/kernel/systbls.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/systbls.S 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -17,7 +17,7 @@
|
|
.quad sys_write
|
|
.quad alpha_ni_syscall /* 5 */
|
|
.quad sys_close
|
|
- .quad sys_osf_wait4
|
|
+ .quad osf_wait4
|
|
.quad alpha_ni_syscall
|
|
.quad sys_link
|
|
.quad sys_unlink /* 10 */
|
|
@@ -27,11 +27,11 @@
|
|
.quad sys_mknod
|
|
.quad sys_chmod /* 15 */
|
|
.quad sys_chown
|
|
- .quad sys_osf_brk
|
|
+ .quad osf_brk
|
|
.quad alpha_ni_syscall
|
|
.quad sys_lseek
|
|
.quad sys_getxpid /* 20 */
|
|
- .quad sys_osf_mount
|
|
+ .quad osf_mount
|
|
.quad sys_umount
|
|
.quad sys_setuid
|
|
.quad sys_getxuid
|
|
@@ -53,7 +53,7 @@
|
|
.quad alpha_ni_syscall /* 40 */
|
|
.quad sys_dup
|
|
.quad sys_alpha_pipe
|
|
- .quad sys_osf_set_program_attributes
|
|
+ .quad osf_set_program_attributes
|
|
.quad alpha_ni_syscall
|
|
.quad sys_open /* 45 */
|
|
.quad alpha_ni_syscall
|
|
@@ -81,7 +81,7 @@
|
|
.quad sys_newlstat
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall /* 70 */
|
|
- .quad sys_osf_mmap
|
|
+ .quad osf_mmap
|
|
.quad alpha_ni_syscall
|
|
.quad sys_munmap
|
|
.quad sys_mprotect
|
|
@@ -94,17 +94,17 @@
|
|
.quad sys_setgroups /* 80 */
|
|
.quad alpha_ni_syscall
|
|
.quad sys_setpgid
|
|
- .quad sys_osf_setitimer
|
|
+ .quad osf_setitimer
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall /* 85 */
|
|
- .quad sys_osf_getitimer
|
|
+ .quad osf_getitimer
|
|
.quad sys_gethostname
|
|
.quad sys_sethostname
|
|
.quad sys_getdtablesize
|
|
.quad sys_dup2 /* 90 */
|
|
.quad sys_newfstat
|
|
.quad sys_fcntl
|
|
- .quad sys_osf_select
|
|
+ .quad osf_select
|
|
.quad sys_poll
|
|
.quad sys_fsync /* 95 */
|
|
.quad sys_setpriority
|
|
@@ -123,22 +123,22 @@
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall /* 110 */
|
|
.quad sys_sigsuspend
|
|
- .quad sys_osf_sigstack
|
|
+ .quad osf_sigstack
|
|
.quad sys_recvmsg
|
|
.quad sys_sendmsg
|
|
.quad alpha_ni_syscall /* 115 */
|
|
- .quad sys_osf_gettimeofday
|
|
- .quad sys_osf_getrusage
|
|
+ .quad osf_gettimeofday
|
|
+ .quad osf_getrusage
|
|
.quad sys_getsockopt
|
|
.quad alpha_ni_syscall
|
|
#ifdef CONFIG_OSF4_COMPAT
|
|
- .quad sys_osf_readv /* 120 */
|
|
- .quad sys_osf_writev
|
|
+ .quad osf_readv /* 120 */
|
|
+ .quad osf_writev
|
|
#else
|
|
.quad sys_readv /* 120 */
|
|
.quad sys_writev
|
|
#endif
|
|
- .quad sys_osf_settimeofday
|
|
+ .quad osf_settimeofday
|
|
.quad sys_fchown
|
|
.quad sys_fchmod
|
|
.quad sys_recvfrom /* 125 */
|
|
@@ -154,7 +154,7 @@
|
|
.quad sys_socketpair /* 135 */
|
|
.quad sys_mkdir
|
|
.quad sys_rmdir
|
|
- .quad sys_osf_utimes
|
|
+ .quad osf_utimes
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall /* 140 */
|
|
.quad sys_getpeername
|
|
@@ -172,16 +172,16 @@
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall /* 155 */
|
|
- .quad sys_osf_sigaction
|
|
+ .quad osf_sigaction
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
- .quad sys_osf_getdirentries
|
|
- .quad sys_osf_statfs /* 160 */
|
|
- .quad sys_osf_fstatfs
|
|
+ .quad osf_getdirentries
|
|
+ .quad osf_statfs /* 160 */
|
|
+ .quad osf_fstatfs
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
- .quad sys_osf_getdomainname /* 165 */
|
|
+ .quad osf_getdomainname /* 165 */
|
|
.quad sys_setdomainname
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
@@ -224,7 +224,7 @@
|
|
.quad sys_semctl
|
|
.quad sys_semget /* 205 */
|
|
.quad sys_semop
|
|
- .quad sys_osf_utsname
|
|
+ .quad osf_utsname
|
|
.quad sys_lchown
|
|
.quad sys_shmat
|
|
.quad sys_shmctl /* 210 */
|
|
@@ -258,23 +258,23 @@
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall /* 240 */
|
|
- .quad sys_osf_sysinfo
|
|
+ .quad osf_sysinfo
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
- .quad sys_osf_proplist_syscall
|
|
+ .quad osf_proplist_syscall
|
|
.quad alpha_ni_syscall /* 245 */
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall /* 250 */
|
|
- .quad sys_osf_usleep_thread
|
|
+ .quad osf_usleep_thread
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
.quad sys_sysfs
|
|
.quad alpha_ni_syscall /* 255 */
|
|
- .quad sys_osf_getsysinfo
|
|
- .quad sys_osf_setsysinfo
|
|
+ .quad osf_getsysinfo
|
|
+ .quad osf_setsysinfo
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall
|
|
.quad alpha_ni_syscall /* 260 */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/kernel/elf.c linux-2.6.29-rc3.owrt/arch/arm/kernel/elf.c
|
|
--- linux-2.6.29.owrt/arch/arm/kernel/elf.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/kernel/elf.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -74,9 +74,9 @@
|
|
*/
|
|
int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack)
|
|
{
|
|
- if (executable_stack != EXSTACK_DISABLE_X)
|
|
+ if (executable_stack != EXSTACK_ENABLE_X)
|
|
return 1;
|
|
- if (cpu_architecture() < CPU_ARCH_ARMv6)
|
|
+ if (cpu_architecture() <= CPU_ARCH_ARMv6)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/kernel/entry-armv.S linux-2.6.29-rc3.owrt/arch/arm/kernel/entry-armv.S
|
|
--- linux-2.6.29.owrt/arch/arm/kernel/entry-armv.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/kernel/entry-armv.S 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -650,7 +650,6 @@
|
|
no_fp: mov pc, lr
|
|
|
|
__und_usr_unknown:
|
|
- enable_irq
|
|
mov r0, sp
|
|
adr lr, ret_from_exception
|
|
b do_undefinstr
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/kernel/entry-common.S linux-2.6.29-rc3.owrt/arch/arm/kernel/entry-common.S
|
|
--- linux-2.6.29.owrt/arch/arm/kernel/entry-common.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/kernel/entry-common.S 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -111,7 +111,6 @@
|
|
.globl mcount_call
|
|
mcount_call:
|
|
bl ftrace_stub
|
|
- ldr lr, [fp, #-4] @ restore lr
|
|
ldmia sp!, {r0-r3, pc}
|
|
|
|
ENTRY(ftrace_caller)
|
|
@@ -123,7 +122,6 @@
|
|
.globl ftrace_call
|
|
ftrace_call:
|
|
bl ftrace_stub
|
|
- ldr lr, [fp, #-4] @ restore lr
|
|
ldmia sp!, {r0-r3, pc}
|
|
|
|
#else
|
|
@@ -135,16 +133,14 @@
|
|
adr r0, ftrace_stub
|
|
cmp r0, r2
|
|
bne trace
|
|
- ldr lr, [fp, #-4] @ restore lr
|
|
ldmia sp!, {r0-r3, pc}
|
|
|
|
trace:
|
|
- ldr r1, [fp, #-4] @ lr of instrumented routine
|
|
+ ldr r1, [fp, #-4]
|
|
mov r0, lr
|
|
sub r0, r0, #MCOUNT_INSN_SIZE
|
|
mov lr, pc
|
|
mov pc, r2
|
|
- mov lr, r1 @ restore lr
|
|
ldmia sp!, {r0-r3, pc}
|
|
|
|
#endif /* CONFIG_DYNAMIC_FTRACE */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/kernel/fiq.c linux-2.6.29-rc3.owrt/arch/arm/kernel/fiq.c
|
|
--- linux-2.6.29.owrt/arch/arm/kernel/fiq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/kernel/fiq.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -88,7 +88,7 @@
|
|
* disable irqs for the duration. Note - these functions are almost
|
|
* entirely coded in assembly.
|
|
*/
|
|
-void __naked set_fiq_regs(struct pt_regs *regs)
|
|
+void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs)
|
|
{
|
|
register unsigned long tmp;
|
|
asm volatile (
|
|
@@ -106,7 +106,7 @@
|
|
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
|
|
}
|
|
|
|
-void __naked get_fiq_regs(struct pt_regs *regs)
|
|
+void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs)
|
|
{
|
|
register unsigned long tmp;
|
|
asm volatile (
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/kernel/irq.c linux-2.6.29-rc3.owrt/arch/arm/kernel/irq.c
|
|
--- linux-2.6.29.owrt/arch/arm/kernel/irq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/kernel/irq.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -101,7 +101,7 @@
|
|
/* Handle bad interrupts */
|
|
static struct irq_desc bad_irq_desc = {
|
|
.handle_irq = handle_bad_irq,
|
|
- .lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock),
|
|
+ .lock = SPIN_LOCK_UNLOCKED
|
|
};
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/kernel/machine_kexec.c linux-2.6.29-rc3.owrt/arch/arm/kernel/machine_kexec.c
|
|
--- linux-2.6.29.owrt/arch/arm/kernel/machine_kexec.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/kernel/machine_kexec.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -13,8 +13,8 @@
|
|
#include <asm/cacheflush.h>
|
|
#include <asm/mach-types.h>
|
|
|
|
-extern const unsigned char relocate_new_kernel[];
|
|
-extern const unsigned int relocate_new_kernel_size;
|
|
+const extern unsigned char relocate_new_kernel[];
|
|
+const extern unsigned int relocate_new_kernel_size;
|
|
|
|
extern void setup_mm_for_reboot(char mode);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/kernel/setup.c linux-2.6.29-rc3.owrt/arch/arm/kernel/setup.c
|
|
--- linux-2.6.29.owrt/arch/arm/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/kernel/setup.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -233,13 +233,12 @@
|
|
unsigned int cachetype = read_cpuid_cachetype();
|
|
unsigned int arch = cpu_architecture();
|
|
|
|
- if (arch >= CPU_ARCH_ARMv6) {
|
|
- if ((cachetype & (7 << 29)) == 4 << 29) {
|
|
- /* ARMv7 register format */
|
|
- cacheid = CACHEID_VIPT_NONALIASING;
|
|
- if ((cachetype & (3 << 14)) == 1 << 14)
|
|
- cacheid |= CACHEID_ASID_TAGGED;
|
|
- } else if (cachetype & (1 << 23))
|
|
+ if (arch >= CPU_ARCH_ARMv7) {
|
|
+ cacheid = CACHEID_VIPT_NONALIASING;
|
|
+ if ((cachetype & (3 << 14)) == 1 << 14)
|
|
+ cacheid |= CACHEID_ASID_TAGGED;
|
|
+ } else if (arch >= CPU_ARCH_ARMv6) {
|
|
+ if (cachetype & (1 << 23))
|
|
cacheid = CACHEID_VIPT_ALIASING;
|
|
else
|
|
cacheid = CACHEID_VIPT_NONALIASING;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-at91/at91cap9_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91cap9_devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-at91/at91cap9_devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91cap9_devices.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -697,7 +697,7 @@
|
|
* Watchdog
|
|
* -------------------------------------------------------------------- */
|
|
|
|
-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
|
+#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
|
static struct platform_device at91cap9_wdt_device = {
|
|
.name = "at91_wdt",
|
|
.id = -1,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9260_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9260_devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9260_devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9260_devices.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -643,7 +643,7 @@
|
|
* Watchdog
|
|
* -------------------------------------------------------------------- */
|
|
|
|
-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
|
+#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
|
static struct platform_device at91sam9260_wdt_device = {
|
|
.name = "at91_wdt",
|
|
.id = -1,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9261_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9261_devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9261_devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9261_devices.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -621,7 +621,7 @@
|
|
* Watchdog
|
|
* -------------------------------------------------------------------- */
|
|
|
|
-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
|
+#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
|
static struct platform_device at91sam9261_wdt_device = {
|
|
.name = "at91_wdt",
|
|
.id = -1,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9263_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9263_devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9263_devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9263_devices.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -347,111 +347,6 @@
|
|
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
|
#endif
|
|
|
|
-/* --------------------------------------------------------------------
|
|
- * Compact Flash (PCMCIA or IDE)
|
|
- * -------------------------------------------------------------------- */
|
|
-
|
|
-#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \
|
|
- defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE)
|
|
-
|
|
-static struct at91_cf_data cf0_data;
|
|
-
|
|
-static struct resource cf0_resources[] = {
|
|
- [0] = {
|
|
- .start = AT91_CHIPSELECT_4,
|
|
- .end = AT91_CHIPSELECT_4 + SZ_256M - 1,
|
|
- .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,
|
|
- }
|
|
-};
|
|
-
|
|
-static struct platform_device cf0_device = {
|
|
- .id = 0,
|
|
- .dev = {
|
|
- .platform_data = &cf0_data,
|
|
- },
|
|
- .resource = cf0_resources,
|
|
- .num_resources = ARRAY_SIZE(cf0_resources),
|
|
-};
|
|
-
|
|
-static struct at91_cf_data cf1_data;
|
|
-
|
|
-static struct resource cf1_resources[] = {
|
|
- [0] = {
|
|
- .start = AT91_CHIPSELECT_5,
|
|
- .end = AT91_CHIPSELECT_5 + SZ_256M - 1,
|
|
- .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,
|
|
- }
|
|
-};
|
|
-
|
|
-static struct platform_device cf1_device = {
|
|
- .id = 1,
|
|
- .dev = {
|
|
- .platform_data = &cf1_data,
|
|
- },
|
|
- .resource = cf1_resources,
|
|
- .num_resources = ARRAY_SIZE(cf1_resources),
|
|
-};
|
|
-
|
|
-void __init at91_add_device_cf(struct at91_cf_data *data)
|
|
-{
|
|
- unsigned long ebi0_csa;
|
|
- struct platform_device *pdev;
|
|
-
|
|
- if (!data)
|
|
- return;
|
|
-
|
|
- /*
|
|
- * assign CS4 or CS5 to SMC with Compact Flash logic support,
|
|
- * we assume SMC timings are configured by board code,
|
|
- * except True IDE where timings are controlled by driver
|
|
- */
|
|
- ebi0_csa = at91_sys_read(AT91_MATRIX_EBI0CSA);
|
|
- switch (data->chipselect) {
|
|
- case 4:
|
|
- at91_set_A_periph(AT91_PIN_PD6, 0); /* EBI0_NCS4/CFCS0 */
|
|
- ebi0_csa |= AT91_MATRIX_EBI0_CS4A_SMC_CF1;
|
|
- cf0_data = *data;
|
|
- pdev = &cf0_device;
|
|
- break;
|
|
- case 5:
|
|
- at91_set_A_periph(AT91_PIN_PD7, 0); /* EBI0_NCS5/CFCS1 */
|
|
- ebi0_csa |= AT91_MATRIX_EBI0_CS5A_SMC_CF2;
|
|
- cf1_data = *data;
|
|
- pdev = &cf1_device;
|
|
- break;
|
|
- default:
|
|
- printk(KERN_ERR "AT91 CF: bad chip-select requested (%u)\n",
|
|
- data->chipselect);
|
|
- return;
|
|
- }
|
|
- at91_sys_write(AT91_MATRIX_EBI0CSA, ebi0_csa);
|
|
-
|
|
- if (data->det_pin) {
|
|
- at91_set_gpio_input(data->det_pin, 1);
|
|
- at91_set_deglitch(data->det_pin, 1);
|
|
- }
|
|
-
|
|
- if (data->irq_pin) {
|
|
- at91_set_gpio_input(data->irq_pin, 1);
|
|
- at91_set_deglitch(data->irq_pin, 1);
|
|
- }
|
|
-
|
|
- if (data->vcc_pin)
|
|
- /* initially off */
|
|
- at91_set_gpio_output(data->vcc_pin, 0);
|
|
-
|
|
- /* enable EBI controlled pins */
|
|
- at91_set_A_periph(AT91_PIN_PD5, 1); /* NWAIT */
|
|
- at91_set_A_periph(AT91_PIN_PD8, 0); /* CFCE1 */
|
|
- at91_set_A_periph(AT91_PIN_PD9, 0); /* CFCE2 */
|
|
- at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */
|
|
-
|
|
- pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf";
|
|
- platform_device_register(pdev);
|
|
-}
|
|
-#else
|
|
-void __init at91_add_device_cf(struct at91_cf_data *data) {}
|
|
-#endif
|
|
|
|
/* --------------------------------------------------------------------
|
|
* NAND / SmartMedia
|
|
@@ -959,7 +854,7 @@
|
|
* Watchdog
|
|
* -------------------------------------------------------------------- */
|
|
|
|
-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
|
+#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
|
static struct platform_device at91sam9263_wdt_device = {
|
|
.name = "at91_wdt",
|
|
.id = -1,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9rl_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9rl_devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9rl_devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9rl_devices.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -609,7 +609,7 @@
|
|
* Watchdog
|
|
* -------------------------------------------------------------------- */
|
|
|
|
-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
|
|
+#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
|
static struct platform_device at91sam9rl_wdt_device = {
|
|
.name = "at91_wdt",
|
|
.id = -1,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-at91/gpio.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/gpio.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-at91/gpio.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/gpio.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -490,8 +490,7 @@
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
-/*
|
|
- * This lock class tells lockdep that GPIO irqs are in a different
|
|
+/* This lock class tells lockdep that GPIO irqs are in a different
|
|
* category than their parents, so it won't report false recursion.
|
|
*/
|
|
static struct lock_class_key gpio_lock_class;
|
|
@@ -510,6 +509,9 @@
|
|
unsigned id = this->id;
|
|
unsigned i;
|
|
|
|
+ /* enable PIO controller's clock */
|
|
+ clk_enable(this->clock);
|
|
+
|
|
__raw_writel(~0, this->regbase + PIO_IDR);
|
|
|
|
for (i = 0, pin = this->chipbase; i < 32; i++, pin++) {
|
|
@@ -554,14 +556,7 @@
|
|
data->chipbase = PIN_BASE + i * 32;
|
|
data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS;
|
|
|
|
- /* enable PIO controller's clock */
|
|
- clk_enable(data->clock);
|
|
-
|
|
- /*
|
|
- * Some processors share peripheral ID between multiple GPIO banks.
|
|
- * SAM9263 (PIOC, PIOD, PIOE)
|
|
- * CAP9 (PIOA, PIOB, PIOC, PIOD)
|
|
- */
|
|
+ /* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */
|
|
if (last && last->id == data->id)
|
|
last->next = data;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-at91/include/mach/board.h linux-2.6.29-rc3.owrt/arch/arm/mach-at91/include/mach/board.h
|
|
--- linux-2.6.29.owrt/arch/arm/mach-at91/include/mach/board.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/include/mach/board.h 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -56,9 +56,6 @@
|
|
u8 vcc_pin; /* power switching */
|
|
u8 rst_pin; /* card reset */
|
|
u8 chipselect; /* EBI Chip Select number */
|
|
- u8 flags;
|
|
-#define AT91_CF_TRUE_IDE 0x01
|
|
-#define AT91_IDE_SWAP_A0_A2 0x02
|
|
};
|
|
extern void __init at91_add_device_cf(struct at91_cf_data *data);
|
|
|
|
@@ -96,7 +93,6 @@
|
|
u8 enable_pin; /* chip enable */
|
|
u8 det_pin; /* card detect */
|
|
u8 rdy_pin; /* ready/busy */
|
|
- u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
|
u8 ale; /* address line number connected to ALE */
|
|
u8 cle; /* address line number connected to CLE */
|
|
u8 bus_width_16; /* buswidth is 16 bit */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-at91/pm.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/pm.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-at91/pm.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/pm.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -332,6 +332,7 @@
|
|
at91_sys_read(AT91_AIC_IPR) & at91_sys_read(AT91_AIC_IMR));
|
|
|
|
error:
|
|
+ sdram_selfrefresh_disable();
|
|
target_state = PM_SUSPEND_ON;
|
|
at91_irq_resume();
|
|
at91_gpio_resume();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-davinci/board-evm.c linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/board-evm.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-davinci/board-evm.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/board-evm.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -311,9 +311,6 @@
|
|
gpio_request(gpio + 7, "nCF_SEL");
|
|
gpio_direction_output(gpio + 7, 1);
|
|
|
|
- /* irlml6401 sustains over 3A, switches 5V in under 8 msec */
|
|
- setup_usb(500, 8);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -420,6 +417,9 @@
|
|
platform_add_devices(davinci_evm_devices,
|
|
ARRAY_SIZE(davinci_evm_devices));
|
|
evm_init_i2c();
|
|
+
|
|
+ /* irlml6401 sustains over 3A, switches 5V in under 8 msec */
|
|
+ setup_usb(500, 8);
|
|
}
|
|
|
|
static __init void davinci_evm_irq_init(void)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-davinci/clock.c linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/clock.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-davinci/clock.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/clock.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -231,11 +231,6 @@
|
|
.lpsc = DAVINCI_LPSC_GPIO,
|
|
},
|
|
{
|
|
- .name = "usb",
|
|
- .rate = &commonrate,
|
|
- .lpsc = DAVINCI_LPSC_USB,
|
|
- },
|
|
- {
|
|
.name = "AEMIFCLK",
|
|
.rate = &commonrate,
|
|
.lpsc = DAVINCI_LPSC_AEMIF,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-davinci/usb.c linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/usb.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-davinci/usb.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/usb.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -47,7 +47,6 @@
|
|
#elif defined(CONFIG_USB_MUSB_HOST)
|
|
.mode = MUSB_HOST,
|
|
#endif
|
|
- .clock = "usb",
|
|
.config = &musb_config,
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/gesbc9312.h linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/gesbc9312.h
|
|
--- linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/gesbc9312.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/gesbc9312.h 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -0,0 +1,3 @@
|
|
+/*
|
|
+ * arch/arm/mach-ep93xx/include/mach/gesbc9312.h
|
|
+ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/hardware.h linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/hardware.h
|
|
--- linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/hardware.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/hardware.h 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -10,6 +10,7 @@
|
|
|
|
#include "platform.h"
|
|
|
|
+#include "gesbc9312.h"
|
|
#include "ts72xx.h"
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/platform.h linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/platform.h
|
|
--- linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/platform.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/platform.h 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -4,8 +4,6 @@
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
-struct i2c_board_info;
|
|
-
|
|
struct ep93xx_eth_data
|
|
{
|
|
unsigned char dev_addr[6];
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-kirkwood/irq.c linux-2.6.29-rc3.owrt/arch/arm/mach-kirkwood/irq.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-kirkwood/irq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-kirkwood/irq.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -42,7 +42,7 @@
|
|
writel(0, GPIO_EDGE_CAUSE(32));
|
|
|
|
for (i = IRQ_KIRKWOOD_GPIO_START; i < NR_IRQS; i++) {
|
|
- set_irq_chip(i, &orion_gpio_irq_chip);
|
|
+ set_irq_chip(i, &orion_gpio_irq_level_chip);
|
|
set_irq_handler(i, handle_level_irq);
|
|
irq_desc[i].status |= IRQ_LEVEL;
|
|
set_irq_flags(i, IRQF_VALID);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-msm/board-halibut.c linux-2.6.29-rc3.owrt/arch/arm/mach-msm/board-halibut.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-msm/board-halibut.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-msm/board-halibut.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -27,7 +27,6 @@
|
|
#include <asm/mach/map.h>
|
|
#include <asm/mach/flash.h>
|
|
|
|
-#include <mach/irqs.h>
|
|
#include <mach/board.h>
|
|
#include <mach/msm_iomap.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-mv78xx0/irq.c linux-2.6.29-rc3.owrt/arch/arm/mach-mv78xx0/irq.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-mv78xx0/irq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-mv78xx0/irq.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -40,7 +40,7 @@
|
|
writel(0, GPIO_EDGE_CAUSE(0));
|
|
|
|
for (i = IRQ_MV78XX0_GPIO_START; i < NR_IRQS; i++) {
|
|
- set_irq_chip(i, &orion_gpio_irq_chip);
|
|
+ set_irq_chip(i, &orion_gpio_irq_level_chip);
|
|
set_irq_handler(i, handle_level_irq);
|
|
irq_desc[i].status |= IRQ_LEVEL;
|
|
set_irq_flags(i, IRQF_VALID);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-mx1/devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-mx1/devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-mx1/devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-mx1/devices.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -23,8 +23,6 @@
|
|
#include <linux/init.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/gpio.h>
|
|
-
|
|
-#include <mach/irqs.h>
|
|
#include <mach/hardware.h>
|
|
|
|
static struct resource imx_csi_resources[] = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-mx1/mx1ads.c linux-2.6.29-rc3.owrt/arch/arm/mach-mx1/mx1ads.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-mx1/mx1ads.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-mx1/mx1ads.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -21,7 +21,6 @@
|
|
#include <asm/mach/arch.h>
|
|
#include <asm/mach/time.h>
|
|
|
|
-#include <mach/irqs.h>
|
|
#include <mach/hardware.h>
|
|
#include <mach/common.h>
|
|
#include <mach/imx-uart.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap1/devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap1/devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap1/devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap1/devices.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -181,7 +181,7 @@
|
|
}
|
|
size = OMAP1_MMC_SIZE;
|
|
|
|
- omap_mmc_add("mmci-omap", i, base, size, irq, mmc_data[i]);
|
|
+ omap_mmc_add(i, base, size, irq, mmc_data[i]);
|
|
};
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap1/mcbsp.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap1/mcbsp.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap1/mcbsp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap1/mcbsp.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -28,8 +28,81 @@
|
|
#define DPS_RSTCT2_PER_EN (1 << 0)
|
|
#define DSP_RSTCT2_WD_PER_EN (1 << 1)
|
|
|
|
+struct mcbsp_internal_clk {
|
|
+ struct clk clk;
|
|
+ struct clk **childs;
|
|
+ int n_childs;
|
|
+};
|
|
+
|
|
#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
|
|
-const char *clk_names[] = { "dsp_ck", "api_ck", "dspxor_ck" };
|
|
+static void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
|
|
+{
|
|
+ const char *clk_names[] = { "dsp_ck", "api_ck", "dspxor_ck" };
|
|
+ int i;
|
|
+
|
|
+ mclk->n_childs = ARRAY_SIZE(clk_names);
|
|
+ mclk->childs = kzalloc(mclk->n_childs * sizeof(struct clk *),
|
|
+ GFP_KERNEL);
|
|
+
|
|
+ for (i = 0; i < mclk->n_childs; i++) {
|
|
+ /* We fake a platform device to get correct device id */
|
|
+ struct platform_device pdev;
|
|
+
|
|
+ pdev.dev.bus = &platform_bus_type;
|
|
+ pdev.id = mclk->clk.id;
|
|
+ mclk->childs[i] = clk_get(&pdev.dev, clk_names[i]);
|
|
+ if (IS_ERR(mclk->childs[i]))
|
|
+ printk(KERN_ERR "Could not get clock %s (%d).\n",
|
|
+ clk_names[i], mclk->clk.id);
|
|
+ }
|
|
+}
|
|
+
|
|
+static int omap_mcbsp_clk_enable(struct clk *clk)
|
|
+{
|
|
+ struct mcbsp_internal_clk *mclk = container_of(clk,
|
|
+ struct mcbsp_internal_clk, clk);
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < mclk->n_childs; i++)
|
|
+ clk_enable(mclk->childs[i]);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void omap_mcbsp_clk_disable(struct clk *clk)
|
|
+{
|
|
+ struct mcbsp_internal_clk *mclk = container_of(clk,
|
|
+ struct mcbsp_internal_clk, clk);
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < mclk->n_childs; i++)
|
|
+ clk_disable(mclk->childs[i]);
|
|
+}
|
|
+
|
|
+static struct mcbsp_internal_clk omap_mcbsp_clks[] = {
|
|
+ {
|
|
+ .clk = {
|
|
+ .name = "mcbsp_clk",
|
|
+ .id = 1,
|
|
+ .enable = omap_mcbsp_clk_enable,
|
|
+ .disable = omap_mcbsp_clk_disable,
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .clk = {
|
|
+ .name = "mcbsp_clk",
|
|
+ .id = 3,
|
|
+ .enable = omap_mcbsp_clk_enable,
|
|
+ .disable = omap_mcbsp_clk_disable,
|
|
+ },
|
|
+ },
|
|
+};
|
|
+
|
|
+#define omap_mcbsp_clks_size ARRAY_SIZE(omap_mcbsp_clks)
|
|
+#else
|
|
+#define omap_mcbsp_clks_size 0
|
|
+static struct mcbsp_internal_clk __initdata *omap_mcbsp_clks;
|
|
+static inline void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
|
|
+{ }
|
|
#endif
|
|
|
|
static void omap1_mcbsp_request(unsigned int id)
|
|
@@ -94,9 +167,8 @@
|
|
.rx_irq = INT_McBSP1RX,
|
|
.tx_irq = INT_McBSP1TX,
|
|
.ops = &omap1_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 3,
|
|
- },
|
|
+ .clk_name = "mcbsp_clk",
|
|
+ },
|
|
{
|
|
.phys_base = OMAP1510_MCBSP2_BASE,
|
|
.dma_rx_sync = OMAP_DMA_MCBSP2_RX,
|
|
@@ -112,8 +184,7 @@
|
|
.rx_irq = INT_McBSP3RX,
|
|
.tx_irq = INT_McBSP3TX,
|
|
.ops = &omap1_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 3,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
};
|
|
#define OMAP15XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap15xx_mcbsp_pdata)
|
|
@@ -131,8 +202,7 @@
|
|
.rx_irq = INT_McBSP1RX,
|
|
.tx_irq = INT_McBSP1TX,
|
|
.ops = &omap1_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 3,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP1610_MCBSP2_BASE,
|
|
@@ -149,8 +219,7 @@
|
|
.rx_irq = INT_McBSP3RX,
|
|
.tx_irq = INT_McBSP3TX,
|
|
.ops = &omap1_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 3,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
};
|
|
#define OMAP16XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap16xx_mcbsp_pdata)
|
|
@@ -161,6 +230,15 @@
|
|
|
|
int __init omap1_mcbsp_init(void)
|
|
{
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < omap_mcbsp_clks_size; i++) {
|
|
+ if (cpu_is_omap15xx() || cpu_is_omap16xx()) {
|
|
+ omap_mcbsp_clk_init(&omap_mcbsp_clks[i]);
|
|
+ clk_register(&omap_mcbsp_clks[i].clk);
|
|
+ }
|
|
+ }
|
|
+
|
|
if (cpu_is_omap730())
|
|
omap_mcbsp_count = OMAP730_MCBSP_PDATA_SZ;
|
|
if (cpu_is_omap15xx())
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/board-ldp.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/board-ldp.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/board-ldp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/board-ldp.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -81,7 +81,7 @@
|
|
}
|
|
|
|
ldp_smc911x_resources[0].start = cs_mem_base + 0x0;
|
|
- ldp_smc911x_resources[0].end = cs_mem_base + 0xff;
|
|
+ ldp_smc911x_resources[0].end = cs_mem_base + 0xf;
|
|
udelay(100);
|
|
|
|
eth_gpio = LDP_SMC911X_GPIO;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/board-omap3beagle.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/board-omap3beagle.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/board-omap3beagle.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/board-omap3beagle.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -178,9 +178,7 @@
|
|
#ifdef CONFIG_I2C2_OMAP_BEAGLE
|
|
omap_register_i2c_bus(2, 400, NULL, 0);
|
|
#endif
|
|
- /* Bus 3 is attached to the DVI port where devices like the pico DLP
|
|
- * projector don't work reliably with 400kHz */
|
|
- omap_register_i2c_bus(3, 100, NULL, 0);
|
|
+ omap_register_i2c_bus(3, 400, NULL, 0);
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/clock.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/clock.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/clock.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/clock.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -565,7 +565,7 @@
|
|
*
|
|
* Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
|
|
* find the corresponding register field value. The return register value is
|
|
- * the value before left-shifting. Returns ~0 on error
|
|
+ * the value before left-shifting. Returns 0xffffffff on error
|
|
*/
|
|
u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
|
|
{
|
|
@@ -577,7 +577,7 @@
|
|
|
|
clks = omap2_get_clksel_by_parent(clk, clk->parent);
|
|
if (clks == NULL)
|
|
- return ~0;
|
|
+ return 0;
|
|
|
|
for (clkr = clks->rates; clkr->div; clkr++) {
|
|
if ((clkr->flags & cpu_mask) && (clkr->div == div))
|
|
@@ -588,7 +588,7 @@
|
|
printk(KERN_ERR "clock: Could not find divisor %d for "
|
|
"clock %s parent %s\n", div, clk->name,
|
|
clk->parent->name);
|
|
- return ~0;
|
|
+ return 0;
|
|
}
|
|
|
|
return clkr->val;
|
|
@@ -708,7 +708,7 @@
|
|
return 0;
|
|
|
|
for (clkr = clks->rates; clkr->div; clkr++) {
|
|
- if (clkr->flags & cpu_mask && clkr->flags & DEFAULT_RATE)
|
|
+ if (clkr->flags & (cpu_mask | DEFAULT_RATE))
|
|
break; /* Found the default rate for this platform */
|
|
}
|
|
|
|
@@ -746,7 +746,7 @@
|
|
return -EINVAL;
|
|
|
|
if (clk->usecount > 0)
|
|
- omap2_clk_disable(clk);
|
|
+ _omap2_clk_disable(clk);
|
|
|
|
/* Set new source value (previous dividers if any in effect) */
|
|
reg_val = __raw_readl(src_addr) & ~field_mask;
|
|
@@ -759,10 +759,10 @@
|
|
wmb();
|
|
}
|
|
|
|
- clk->parent = new_parent;
|
|
-
|
|
if (clk->usecount > 0)
|
|
- omap2_clk_enable(clk);
|
|
+ _omap2_clk_enable(clk);
|
|
+
|
|
+ clk->parent = new_parent;
|
|
|
|
/* CLKSEL clocks follow their parents' rates, divided by a divisor */
|
|
clk->rate = new_parent->rate;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/devices.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -421,7 +421,6 @@
|
|
int nr_controllers)
|
|
{
|
|
int i;
|
|
- char *name;
|
|
|
|
for (i = 0; i < nr_controllers; i++) {
|
|
unsigned long base, size;
|
|
@@ -451,14 +450,12 @@
|
|
continue;
|
|
}
|
|
|
|
- if (cpu_is_omap2420()) {
|
|
+ if (cpu_is_omap2420())
|
|
size = OMAP2420_MMC_SIZE;
|
|
- name = "mmci-omap";
|
|
- } else {
|
|
+ else
|
|
size = HSMMC_SIZE;
|
|
- name = "mmci-omap-hs";
|
|
- }
|
|
- omap_mmc_add(name, i, base, size, irq, mmc_data[i]);
|
|
+
|
|
+ omap_mmc_add(i, base, size, irq, mmc_data[i]);
|
|
};
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/id.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/id.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/id.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/id.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -172,13 +172,9 @@
|
|
omap_revision = OMAP3430_REV_ES3_0;
|
|
rev_name = "ES3.0";
|
|
break;
|
|
- case 4:
|
|
- omap_revision = OMAP3430_REV_ES3_1;
|
|
- rev_name = "ES3.1";
|
|
- break;
|
|
default:
|
|
/* Use the latest known revision as default */
|
|
- omap_revision = OMAP3430_REV_ES3_1;
|
|
+ omap_revision = OMAP3430_REV_ES3_0;
|
|
rev_name = "Unknown revision\n";
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/irq.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/irq.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/irq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/irq.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -134,7 +134,6 @@
|
|
.ack = omap_mask_ack_irq,
|
|
.mask = omap_mask_irq,
|
|
.unmask = omap_unmask_irq,
|
|
- .disable = omap_mask_irq,
|
|
};
|
|
|
|
static void __init omap_irq_bank_init_one(struct omap_irq_bank *bank)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/mcbsp.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/mcbsp.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/mcbsp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/mcbsp.c 2009-05-10 23:48:27.000000000 +0200
|
|
@@ -24,7 +24,106 @@
|
|
#include <mach/cpu.h>
|
|
#include <mach/mcbsp.h>
|
|
|
|
-const char *clk_names[] = { "mcbsp_ick", "mcbsp_fck" };
|
|
+struct mcbsp_internal_clk {
|
|
+ struct clk clk;
|
|
+ struct clk **childs;
|
|
+ int n_childs;
|
|
+};
|
|
+
|
|
+#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
|
|
+static void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
|
|
+{
|
|
+ const char *clk_names[] = { "mcbsp_ick", "mcbsp_fck" };
|
|
+ int i;
|
|
+
|
|
+ mclk->n_childs = ARRAY_SIZE(clk_names);
|
|
+ mclk->childs = kzalloc(mclk->n_childs * sizeof(struct clk *),
|
|
+ GFP_KERNEL);
|
|
+
|
|
+ for (i = 0; i < mclk->n_childs; i++) {
|
|
+ /* We fake a platform device to get correct device id */
|
|
+ struct platform_device pdev;
|
|
+
|
|
+ pdev.dev.bus = &platform_bus_type;
|
|
+ pdev.id = mclk->clk.id;
|
|
+ mclk->childs[i] = clk_get(&pdev.dev, clk_names[i]);
|
|
+ if (IS_ERR(mclk->childs[i]))
|
|
+ printk(KERN_ERR "Could not get clock %s (%d).\n",
|
|
+ clk_names[i], mclk->clk.id);
|
|
+ }
|
|
+}
|
|
+
|
|
+static int omap_mcbsp_clk_enable(struct clk *clk)
|
|
+{
|
|
+ struct mcbsp_internal_clk *mclk = container_of(clk,
|
|
+ struct mcbsp_internal_clk, clk);
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < mclk->n_childs; i++)
|
|
+ clk_enable(mclk->childs[i]);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void omap_mcbsp_clk_disable(struct clk *clk)
|
|
+{
|
|
+ struct mcbsp_internal_clk *mclk = container_of(clk,
|
|
+ struct mcbsp_internal_clk, clk);
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < mclk->n_childs; i++)
|
|
+ clk_disable(mclk->childs[i]);
|
|
+}
|
|
+
|
|
+static struct mcbsp_internal_clk omap_mcbsp_clks[] = {
|
|
+ {
|
|
+ .clk = {
|
|
+ .name = "mcbsp_clk",
|
|
+ .id = 1,
|
|
+ .enable = omap_mcbsp_clk_enable,
|
|
+ .disable = omap_mcbsp_clk_disable,
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .clk = {
|
|
+ .name = "mcbsp_clk",
|
|
+ .id = 2,
|
|
+ .enable = omap_mcbsp_clk_enable,
|
|
+ .disable = omap_mcbsp_clk_disable,
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .clk = {
|
|
+ .name = "mcbsp_clk",
|
|
+ .id = 3,
|
|
+ .enable = omap_mcbsp_clk_enable,
|
|
+ .disable = omap_mcbsp_clk_disable,
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .clk = {
|
|
+ .name = "mcbsp_clk",
|
|
+ .id = 4,
|
|
+ .enable = omap_mcbsp_clk_enable,
|
|
+ .disable = omap_mcbsp_clk_disable,
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .clk = {
|
|
+ .name = "mcbsp_clk",
|
|
+ .id = 5,
|
|
+ .enable = omap_mcbsp_clk_enable,
|
|
+ .disable = omap_mcbsp_clk_disable,
|
|
+ },
|
|
+ },
|
|
+};
|
|
+
|
|
+#define omap_mcbsp_clks_size ARRAY_SIZE(omap_mcbsp_clks)
|
|
+#else
|
|
+#define omap_mcbsp_clks_size 0
|
|
+static struct mcbsp_internal_clk __initdata *omap_mcbsp_clks;
|
|
+static inline void omap_mcbsp_clk_init(struct clk *clk)
|
|
+{ }
|
|
+#endif
|
|
|
|
static void omap2_mcbsp2_mux_setup(void)
|
|
{
|
|
@@ -57,8 +156,7 @@
|
|
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP24XX_MCBSP2_BASE,
|
|
@@ -67,8 +165,7 @@
|
|
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
};
|
|
#define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
|
|
@@ -86,8 +183,7 @@
|
|
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP24XX_MCBSP2_BASE,
|
|
@@ -96,8 +192,7 @@
|
|
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP2430_MCBSP3_BASE,
|
|
@@ -106,8 +201,7 @@
|
|
.rx_irq = INT_24XX_MCBSP3_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP2430_MCBSP4_BASE,
|
|
@@ -116,8 +210,7 @@
|
|
.rx_irq = INT_24XX_MCBSP4_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP2430_MCBSP5_BASE,
|
|
@@ -126,8 +219,7 @@
|
|
.rx_irq = INT_24XX_MCBSP5_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
};
|
|
#define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
|
|
@@ -145,8 +237,7 @@
|
|
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP34XX_MCBSP2_BASE,
|
|
@@ -155,8 +246,7 @@
|
|
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP34XX_MCBSP3_BASE,
|
|
@@ -165,8 +255,7 @@
|
|
.rx_irq = INT_24XX_MCBSP3_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP34XX_MCBSP4_BASE,
|
|
@@ -175,8 +264,7 @@
|
|
.rx_irq = INT_24XX_MCBSP4_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
{
|
|
.phys_base = OMAP34XX_MCBSP5_BASE,
|
|
@@ -185,8 +273,7 @@
|
|
.rx_irq = INT_24XX_MCBSP5_IRQ_RX,
|
|
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
|
.ops = &omap2_mcbsp_ops,
|
|
- .clk_names = clk_names,
|
|
- .num_clks = 2,
|
|
+ .clk_name = "mcbsp_clk",
|
|
},
|
|
};
|
|
#define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
|
|
@@ -197,6 +284,14 @@
|
|
|
|
static int __init omap2_mcbsp_init(void)
|
|
{
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < omap_mcbsp_clks_size; i++) {
|
|
+ /* Once we call clk_get inside init, we do not register it */
|
|
+ omap_mcbsp_clk_init(&omap_mcbsp_clks[i]);
|
|
+ clk_register(&omap_mcbsp_clks[i].clk);
|
|
+ }
|
|
+
|
|
if (cpu_is_omap2420())
|
|
omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
|
|
if (cpu_is_omap2430())
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/sleep24xx.S linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/sleep24xx.S
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/sleep24xx.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/sleep24xx.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -93,8 +93,9 @@
|
|
orr r4, r4, #0x40 @ enable self refresh on idle req
|
|
mov r5, #0x2000 @ set delay (DPLL relock + DLL relock)
|
|
str r4, [r2] @ make it so
|
|
+ mov r2, #0
|
|
nop
|
|
- mcr p15, 0, r3, c7, c0, 4 @ wait for interrupt
|
|
+ mcr p15, 0, r2, c7, c0, 4 @ wait for interrupt
|
|
nop
|
|
loop:
|
|
subs r5, r5, #0x1 @ awake, wait just a bit
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-omap2/timer-gp.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/timer-gp.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-omap2/timer-gp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/timer-gp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -118,8 +118,7 @@
|
|
clockevent_gpt.max_delta_ns =
|
|
clockevent_delta2ns(0xffffffff, &clockevent_gpt);
|
|
clockevent_gpt.min_delta_ns =
|
|
- clockevent_delta2ns(3, &clockevent_gpt);
|
|
- /* Timer internal resynch latency. */
|
|
+ clockevent_delta2ns(1, &clockevent_gpt);
|
|
|
|
clockevent_gpt.cpumask = cpumask_of(0);
|
|
clockevents_register_device(&clockevent_gpt);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-orion5x/common.c linux-2.6.29-rc3.owrt/arch/arm/mach-orion5x/common.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-orion5x/common.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-orion5x/common.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -431,10 +431,6 @@
|
|
/*****************************************************************************
|
|
* XOR engine
|
|
****************************************************************************/
|
|
-struct mv_xor_platform_shared_data orion5x_xor_shared_data = {
|
|
- .dram = &orion5x_mbus_dram_info,
|
|
-};
|
|
-
|
|
static struct resource orion5x_xor_shared_resources[] = {
|
|
{
|
|
.name = "xor low",
|
|
@@ -452,9 +448,6 @@
|
|
static struct platform_device orion5x_xor_shared = {
|
|
.name = MV_XOR_SHARED_NAME,
|
|
.id = 0,
|
|
- .dev = {
|
|
- .platform_data = &orion5x_xor_shared_data,
|
|
- },
|
|
.num_resources = ARRAY_SIZE(orion5x_xor_shared_resources),
|
|
.resource = orion5x_xor_shared_resources,
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-orion5x/irq.c linux-2.6.29-rc3.owrt/arch/arm/mach-orion5x/irq.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-orion5x/irq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-orion5x/irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -44,7 +44,7 @@
|
|
* User can use set_type() if he wants to use edge types handlers.
|
|
*/
|
|
for (i = IRQ_ORION5X_GPIO_START; i < NR_IRQS; i++) {
|
|
- set_irq_chip(i, &orion_gpio_irq_chip);
|
|
+ set_irq_chip(i, &orion_gpio_irq_level_chip);
|
|
set_irq_handler(i, handle_level_irq);
|
|
irq_desc[i].status |= IRQ_LEVEL;
|
|
set_irq_flags(i, IRQF_VALID);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-pxa/dma.c linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/dma.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-pxa/dma.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/dma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -121,16 +121,6 @@
|
|
if (dma_channels == NULL)
|
|
return -ENOMEM;
|
|
|
|
- /* dma channel priorities on pxa2xx processors:
|
|
- * ch 0 - 3, 16 - 19 <--> (0) DMA_PRIO_HIGH
|
|
- * ch 4 - 7, 20 - 23 <--> (1) DMA_PRIO_MEDIUM
|
|
- * ch 8 - 15, 24 - 31 <--> (2) DMA_PRIO_LOW
|
|
- */
|
|
- for (i = 0; i < num_ch; i++) {
|
|
- DCSR(i) = 0;
|
|
- dma_channels[i].prio = min((i & 0xf) >> 2, DMA_PRIO_LOW);
|
|
- }
|
|
-
|
|
ret = request_irq(IRQ_DMA, dma_irq_handler, IRQF_DISABLED, "DMA", NULL);
|
|
if (ret) {
|
|
printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n");
|
|
@@ -138,6 +128,14 @@
|
|
return ret;
|
|
}
|
|
|
|
+ /* dma channel priorities on pxa2xx processors:
|
|
+ * ch 0 - 3, 16 - 19 <--> (0) DMA_PRIO_HIGH
|
|
+ * ch 4 - 7, 20 - 23 <--> (1) DMA_PRIO_MEDIUM
|
|
+ * ch 8 - 15, 24 - 31 <--> (2) DMA_PRIO_LOW
|
|
+ */
|
|
+ for (i = 0; i < num_ch; i++)
|
|
+ dma_channels[i].prio = min((i & 0xf) >> 2, DMA_PRIO_LOW);
|
|
+
|
|
num_dma_channels = num_ch;
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-pxa/include/mach/regs-ac97.h linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/include/mach/regs-ac97.h
|
|
--- linux-2.6.29.owrt/arch/arm/mach-pxa/include/mach/regs-ac97.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/include/mach/regs-ac97.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef __ASM_ARCH_REGS_AC97_H
|
|
#define __ASM_ARCH_REGS_AC97_H
|
|
|
|
-#include <mach/hardware.h>
|
|
-
|
|
/*
|
|
* AC97 Controller registers
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-pxa/include/mach/regs-ssp.h linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/include/mach/regs-ssp.h
|
|
--- linux-2.6.29.owrt/arch/arm/mach-pxa/include/mach/regs-ssp.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/include/mach/regs-ssp.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -41,9 +41,6 @@
|
|
#elif defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
|
|
#define SSCR0_SCR (0x000fff00) /* Serial Clock Rate (mask) */
|
|
#define SSCR0_SerClkDiv(x) (((x) - 1) << 8) /* Divisor [1..4096] */
|
|
-#endif
|
|
-
|
|
-#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
|
|
#define SSCR0_EDSS (1 << 20) /* Extended data size select */
|
|
#define SSCR0_NCS (1 << 21) /* Network clock select */
|
|
#define SSCR0_RIM (1 << 22) /* Receive FIFO overrrun interrupt mask */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-pxa/pxa300.c linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/pxa300.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-pxa/pxa300.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/pxa300.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -88,13 +88,13 @@
|
|
static DEFINE_PXA3_CKEN(common_nand, NAND, 156000000, 0);
|
|
|
|
static struct clk_lookup common_clkregs[] = {
|
|
- INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", NULL),
|
|
+ INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", "NANDCLK"),
|
|
};
|
|
|
|
static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0);
|
|
|
|
static struct clk_lookup pxa310_clkregs[] = {
|
|
- INIT_CLKREG(&clk_pxa310_mmc3, "pxa2xx-mci.2", NULL),
|
|
+ INIT_CLKREG(&clk_pxa310_mmc3, "pxa2xx-mci.2", "MMCCLK"),
|
|
};
|
|
|
|
static int __init pxa300_init(void)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-pxa/pxa320.c linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/pxa320.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-pxa/pxa320.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/pxa320.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -83,7 +83,7 @@
|
|
static DEFINE_PXA3_CKEN(pxa320_nand, NAND, 104000000, 0);
|
|
|
|
static struct clk_lookup pxa320_clkregs[] = {
|
|
- INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", NULL),
|
|
+ INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", "NANDCLK"),
|
|
};
|
|
|
|
static int __init pxa320_init(void)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-rpc/riscpc.c linux-2.6.29-rc3.owrt/arch/arm/mach-rpc/riscpc.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-rpc/riscpc.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-rpc/riscpc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
#include <linux/serial_8250.h>
|
|
#include <linux/ata_platform.h>
|
|
#include <linux/io.h>
|
|
-#include <linux/i2c.h>
|
|
|
|
#include <asm/elf.h>
|
|
#include <asm/mach-types.h>
|
|
@@ -202,13 +201,8 @@
|
|
&pata_device,
|
|
};
|
|
|
|
-static struct i2c_board_info i2c_rtc = {
|
|
- I2C_BOARD_INFO("pcf8583", 0x50)
|
|
-};
|
|
-
|
|
static int __init rpc_init(void)
|
|
{
|
|
- i2c_register_board_info(0, &i2c_rtc, 1);
|
|
return platform_add_devices(devs, ARRAY_SIZE(devs));
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -129,7 +129,7 @@
|
|
.vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
|
|
};
|
|
|
|
-static struct map_desc smdk6410_iodesc[] = {};
|
|
+struct map_desc smdk6410_iodesc[] = {};
|
|
|
|
static struct platform_device *smdk6410_devices[] __initdata = {
|
|
#ifdef CONFIG_SMDK6410_SD_CH0
|
|
@@ -146,7 +146,7 @@
|
|
|
|
static struct i2c_board_info i2c_devs0[] __initdata = {
|
|
{ I2C_BOARD_INFO("24c08", 0x50), },
|
|
- { I2C_BOARD_INFO("wm8580", 0x1b), },
|
|
+ { I2C_BOARD_INFO("WM8580", 0X1b), },
|
|
};
|
|
|
|
static struct i2c_board_info i2c_devs1[] __initdata = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mach-sa1100/generic.c linux-2.6.29-rc3.owrt/arch/arm/mach-sa1100/generic.c
|
|
--- linux-2.6.29.owrt/arch/arm/mach-sa1100/generic.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mach-sa1100/generic.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -289,7 +289,7 @@
|
|
};
|
|
|
|
static struct platform_device sa11x0mtd_device = {
|
|
- .name = "sa1100-mtd",
|
|
+ .name = "flash",
|
|
.id = -1,
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/abort-ev6.S linux-2.6.29-rc3.owrt/arch/arm/mm/abort-ev6.S
|
|
--- linux-2.6.29.owrt/arch/arm/mm/abort-ev6.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/abort-ev6.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -23,8 +23,7 @@
|
|
#ifdef CONFIG_CPU_32v6K
|
|
clrex
|
|
#else
|
|
- sub r1, sp, #4 @ Get unused stack location
|
|
- strex r0, r1, [r1] @ Clear the exclusive monitor
|
|
+ strex r0, r1, [sp] @ Clear the exclusive monitor
|
|
#endif
|
|
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
|
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/copypage-feroceon.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-feroceon.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/copypage-feroceon.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-feroceon.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -13,7 +13,7 @@
|
|
#include <linux/init.h>
|
|
#include <linux/highmem.h>
|
|
|
|
-static void __naked
|
|
+static void __attribute__((naked))
|
|
feroceon_copy_user_page(void *kto, const void *kfrom)
|
|
{
|
|
asm("\
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/copypage-v3.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v3.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/copypage-v3.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v3.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -15,7 +15,7 @@
|
|
*
|
|
* FIXME: do we need to handle cache stuff...
|
|
*/
|
|
-static void __naked
|
|
+static void __attribute__((naked))
|
|
v3_copy_user_page(void *kto, const void *kfrom)
|
|
{
|
|
asm("\n\
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/copypage-v4mc.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4mc.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/copypage-v4mc.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4mc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -44,7 +44,7 @@
|
|
* instruction. If your processor does not supply this, you have to write your
|
|
* own copy_user_highpage that does the right thing.
|
|
*/
|
|
-static void __naked
|
|
+static void __attribute__((naked))
|
|
mc_copy_user_page(void *from, void *to)
|
|
{
|
|
asm volatile(
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/copypage-v4wb.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4wb.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/copypage-v4wb.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4wb.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -22,7 +22,7 @@
|
|
* instruction. If your processor does not supply this, you have to write your
|
|
* own copy_user_highpage that does the right thing.
|
|
*/
|
|
-static void __naked
|
|
+static void __attribute__((naked))
|
|
v4wb_copy_user_page(void *kto, const void *kfrom)
|
|
{
|
|
asm("\
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/copypage-v4wt.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4wt.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/copypage-v4wt.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4wt.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -20,7 +20,7 @@
|
|
* dirty data in the cache. However, we do have to ensure that
|
|
* subsequent reads are up to date.
|
|
*/
|
|
-static void __naked
|
|
+static void __attribute__((naked))
|
|
v4wt_copy_user_page(void *kto, const void *kfrom)
|
|
{
|
|
asm("\
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/copypage-xsc3.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-xsc3.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/copypage-xsc3.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-xsc3.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -29,7 +29,7 @@
|
|
* if we eventually end up using our copied page.
|
|
*
|
|
*/
|
|
-static void __naked
|
|
+static void __attribute__((naked))
|
|
xsc3_mc_copy_user_page(void *kto, const void *kfrom)
|
|
{
|
|
asm("\
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/copypage-xscale.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-xscale.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/copypage-xscale.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-xscale.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -42,7 +42,7 @@
|
|
* Dcache aliasing issue. The writes will be forwarded to the write buffer,
|
|
* and merged as appropriate.
|
|
*/
|
|
-static void __naked
|
|
+static void __attribute__((naked))
|
|
mc_copy_user_page(void *from, void *to)
|
|
{
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/dma-mapping.c linux-2.6.29-rc3.owrt/arch/arm/mm/dma-mapping.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/dma-mapping.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/dma-mapping.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -490,30 +490,26 @@
|
|
*/
|
|
void dma_cache_maint(const void *start, size_t size, int direction)
|
|
{
|
|
- void (*inner_op)(const void *, const void *);
|
|
- void (*outer_op)(unsigned long, unsigned long);
|
|
+ const void *end = start + size;
|
|
|
|
- BUG_ON(!virt_addr_valid(start) || !virt_addr_valid(start + size - 1));
|
|
+ BUG_ON(!virt_addr_valid(start) || !virt_addr_valid(end - 1));
|
|
|
|
switch (direction) {
|
|
case DMA_FROM_DEVICE: /* invalidate only */
|
|
- inner_op = dmac_inv_range;
|
|
- outer_op = outer_inv_range;
|
|
+ dmac_inv_range(start, end);
|
|
+ outer_inv_range(__pa(start), __pa(end));
|
|
break;
|
|
case DMA_TO_DEVICE: /* writeback only */
|
|
- inner_op = dmac_clean_range;
|
|
- outer_op = outer_clean_range;
|
|
+ dmac_clean_range(start, end);
|
|
+ outer_clean_range(__pa(start), __pa(end));
|
|
break;
|
|
case DMA_BIDIRECTIONAL: /* writeback and invalidate */
|
|
- inner_op = dmac_flush_range;
|
|
- outer_op = outer_flush_range;
|
|
+ dmac_flush_range(start, end);
|
|
+ outer_flush_range(__pa(start), __pa(end));
|
|
break;
|
|
default:
|
|
BUG();
|
|
}
|
|
-
|
|
- inner_op(start, start + size);
|
|
- outer_op(__pa(start), __pa(start) + size);
|
|
}
|
|
EXPORT_SYMBOL(dma_cache_maint);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/fault-armv.c linux-2.6.29-rc3.owrt/arch/arm/mm/fault-armv.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/fault-armv.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/fault-armv.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -66,10 +66,7 @@
|
|
* fault (ie, is old), we can safely ignore any issues.
|
|
*/
|
|
if (ret && (pte_val(entry) & L_PTE_MT_MASK) != shared_pte_mask) {
|
|
- unsigned long pfn = pte_pfn(entry);
|
|
- flush_cache_page(vma, address, pfn);
|
|
- outer_flush_range((pfn << PAGE_SHIFT),
|
|
- (pfn << PAGE_SHIFT) + PAGE_SIZE);
|
|
+ flush_cache_page(vma, address, pte_pfn(entry));
|
|
pte_val(entry) &= ~L_PTE_MT_MASK;
|
|
pte_val(entry) |= shared_pte_mask;
|
|
set_pte_at(vma->vm_mm, address, pte, entry);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/init.c linux-2.6.29-rc3.owrt/arch/arm/mm/init.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/init.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/init.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -382,7 +382,7 @@
|
|
for_each_node(node)
|
|
bootmem_free_node(node, mi);
|
|
|
|
- high_memory = __va((memend_pfn << PAGE_SHIFT) - 1) + 1;
|
|
+ high_memory = __va(memend_pfn << PAGE_SHIFT);
|
|
|
|
/*
|
|
* This doesn't seem to be used by the Linux memory manager any
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/mmap.c linux-2.6.29-rc3.owrt/arch/arm/mm/mmap.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/mmap.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/mmap.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -124,7 +124,7 @@
|
|
{
|
|
if (addr < PHYS_OFFSET)
|
|
return 0;
|
|
- if (addr + size >= __pa(high_memory - 1))
|
|
+ if (addr + size > __pa(high_memory))
|
|
return 0;
|
|
|
|
return 1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/mm/mmu.c linux-2.6.29-rc3.owrt/arch/arm/mm/mmu.c
|
|
--- linux-2.6.29.owrt/arch/arm/mm/mmu.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/mm/mmu.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -693,8 +693,7 @@
|
|
* Check whether this memory bank would entirely overlap
|
|
* the vmalloc area.
|
|
*/
|
|
- if (__va(bank->start) >= VMALLOC_MIN ||
|
|
- __va(bank->start) < PAGE_OFFSET) {
|
|
+ if (__va(bank->start) >= VMALLOC_MIN) {
|
|
printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx "
|
|
"(vmalloc region overlap).\n",
|
|
bank->start, bank->start + bank->size - 1);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-mxc/include/mach/mmc.h linux-2.6.29-rc3.owrt/arch/arm/plat-mxc/include/mach/mmc.h
|
|
--- linux-2.6.29.owrt/arch/arm/plat-mxc/include/mach/mmc.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-mxc/include/mach/mmc.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,36 +0,0 @@
|
|
-#ifndef ASMARM_ARCH_MMC_H
|
|
-#define ASMARM_ARCH_MMC_H
|
|
-
|
|
-#include <linux/mmc/host.h>
|
|
-
|
|
-struct device;
|
|
-
|
|
-/* board specific SDHC data, optional.
|
|
- * If not present, a writable card with 3,3V is assumed.
|
|
- */
|
|
-struct imxmmc_platform_data {
|
|
- /* Return values for the get_ro callback should be:
|
|
- * 0 for a read/write card
|
|
- * 1 for a read-only card
|
|
- * -ENOSYS when not supported (equal to NULL callback)
|
|
- * or a negative errno value when something bad happened
|
|
- */
|
|
- int (*get_ro)(struct device *);
|
|
-
|
|
- /* board specific hook to (de)initialize the SD slot.
|
|
- * The board code can call 'handler' on a card detection
|
|
- * change giving data as argument.
|
|
- */
|
|
- int (*init)(struct device *dev, irq_handler_t handler, void *data);
|
|
- void (*exit)(struct device *dev, void *data);
|
|
-
|
|
- /* available voltages. If not given, assume
|
|
- * MMC_VDD_32_33 | MMC_VDD_33_34
|
|
- */
|
|
- unsigned int ocr_avail;
|
|
-
|
|
- /* adjust slot voltage */
|
|
- void (*setpower)(struct device *, unsigned int vdd);
|
|
-};
|
|
-
|
|
-#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/common.c linux-2.6.29-rc3.owrt/arch/arm/plat-omap/common.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/common.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/common.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -200,16 +200,20 @@
|
|
};
|
|
|
|
/*
|
|
+ * Rounds down to nearest nsec.
|
|
+ */
|
|
+unsigned long long omap_32k_ticks_to_nsecs(unsigned long ticks_32k)
|
|
+{
|
|
+ return cyc2ns(&clocksource_32k, ticks_32k);
|
|
+}
|
|
+
|
|
+/*
|
|
* Returns current time from boot in nsecs. It's OK for this to wrap
|
|
* around for now, as it's just a relative time stamp.
|
|
*/
|
|
unsigned long long sched_clock(void)
|
|
{
|
|
- unsigned long long ret;
|
|
-
|
|
- ret = (unsigned long long)omap_32k_read();
|
|
- ret = (ret * clocksource_32k.mult_orig) >> clocksource_32k.shift;
|
|
- return ret;
|
|
+ return omap_32k_ticks_to_nsecs(omap_32k_read());
|
|
}
|
|
|
|
static int __init omap_init_clocksource_32k(void)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/devices.c linux-2.6.29-rc3.owrt/arch/arm/plat-omap/devices.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/devices.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/devices.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -200,15 +200,14 @@
|
|
/*
|
|
* Register MMC devices. Called from mach-omap1 and mach-omap2 device init.
|
|
*/
|
|
-int __init omap_mmc_add(const char *name, int id, unsigned long base,
|
|
- unsigned long size, unsigned int irq,
|
|
- struct omap_mmc_platform_data *data)
|
|
+int __init omap_mmc_add(int id, unsigned long base, unsigned long size,
|
|
+ unsigned int irq, struct omap_mmc_platform_data *data)
|
|
{
|
|
struct platform_device *pdev;
|
|
struct resource res[OMAP_MMC_NR_RES];
|
|
int ret;
|
|
|
|
- pdev = platform_device_alloc(name, id);
|
|
+ pdev = platform_device_alloc("mmci-omap", id);
|
|
if (!pdev)
|
|
return -ENOMEM;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/dma.c linux-2.6.29-rc3.owrt/arch/arm/plat-omap/dma.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/dma.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/dma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -709,7 +709,6 @@
|
|
chan->dev_name = dev_name;
|
|
chan->callback = callback;
|
|
chan->data = data;
|
|
- chan->flags = 0;
|
|
|
|
#ifndef CONFIG_ARCH_OMAP1
|
|
if (cpu_class_is_omap2()) {
|
|
@@ -1889,11 +1888,11 @@
|
|
status = dma_read(CSR(ch));
|
|
}
|
|
|
|
- dma_write(status, CSR(ch));
|
|
-
|
|
if (likely(dma_chan[ch].callback != NULL))
|
|
dma_chan[ch].callback(ch, status, dma_chan[ch].data);
|
|
|
|
+ dma_write(status, CSR(ch));
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/common.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/common.h
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/common.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/common.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -35,7 +35,7 @@
|
|
extern struct sys_timer omap_timer;
|
|
extern void omap_serial_init(void);
|
|
extern void omap_serial_enable_clocks(int enable);
|
|
-#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
|
|
+#ifdef CONFIG_I2C_OMAP
|
|
extern int omap_register_i2c_bus(int bus_id, u32 clkrate,
|
|
struct i2c_board_info const *info,
|
|
unsigned len);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/cpu.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/cpu.h
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/cpu.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/cpu.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -339,7 +339,6 @@
|
|
#define OMAP3430_REV_ES2_0 0x34301034
|
|
#define OMAP3430_REV_ES2_1 0x34302034
|
|
#define OMAP3430_REV_ES3_0 0x34303034
|
|
-#define OMAP3430_REV_ES3_1 0x34304034
|
|
|
|
/*
|
|
* omap_chip bits
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/mcbsp.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/mcbsp.h
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/mcbsp.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/mcbsp.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -344,8 +344,7 @@
|
|
u8 dma_rx_sync, dma_tx_sync;
|
|
u16 rx_irq, tx_irq;
|
|
struct omap_mcbsp_ops *ops;
|
|
- char const **clk_names;
|
|
- int num_clks;
|
|
+ char const *clk_name;
|
|
};
|
|
|
|
struct omap_mcbsp {
|
|
@@ -377,8 +376,7 @@
|
|
/* Protect the field .free, while checking if the mcbsp is in use */
|
|
spinlock_t lock;
|
|
struct omap_mcbsp_platform_data *pdata;
|
|
- struct clk **clks;
|
|
- int num_clks;
|
|
+ struct clk *clk;
|
|
};
|
|
extern struct omap_mcbsp **mcbsp_ptr;
|
|
extern int omap_mcbsp_count;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/mmc.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/mmc.h
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/mmc.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/mmc.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -115,9 +115,8 @@
|
|
int nr_controllers);
|
|
void omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
|
int nr_controllers);
|
|
-int omap_mmc_add(const char *name, int id, unsigned long base,
|
|
- unsigned long size, unsigned int irq,
|
|
- struct omap_mmc_platform_data *data);
|
|
+int omap_mmc_add(int id, unsigned long base, unsigned long size,
|
|
+ unsigned int irq, struct omap_mmc_platform_data *data);
|
|
#else
|
|
static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
|
int nr_controllers)
|
|
@@ -127,9 +126,8 @@
|
|
int nr_controllers)
|
|
{
|
|
}
|
|
-static inline int omap_mmc_add(const char *name, int id, unsigned long base,
|
|
- unsigned long size, unsigned int irq,
|
|
- struct omap_mmc_platform_data *data)
|
|
+static inline int omap_mmc_add(int id, unsigned long base, unsigned long size,
|
|
+ unsigned int irq, struct omap_mmc_platform_data *data)
|
|
{
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/pm.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/pm.h
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/pm.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/pm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -108,7 +108,7 @@
|
|
!defined(CONFIG_ARCH_OMAP15XX) && \
|
|
!defined(CONFIG_ARCH_OMAP16XX) && \
|
|
!defined(CONFIG_ARCH_OMAP24XX)
|
|
-#warning "Power management for this processor not implemented yet"
|
|
+#error "Power management for this processor not implemented yet"
|
|
#endif
|
|
|
|
#ifndef __ASSEMBLER__
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/Makefile linux-2.6.29-rc3.owrt/arch/arm/plat-omap/Makefile
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/Makefile 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -18,8 +18,7 @@
|
|
obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o
|
|
obj-$(CONFIG_OMAP_DEBUG_DEVICES) += debug-devices.o
|
|
obj-$(CONFIG_OMAP_DEBUG_LEDS) += debug-leds.o
|
|
-i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o
|
|
-obj-y += $(i2c-omap-m) $(i2c-omap-y)
|
|
+obj-$(CONFIG_I2C_OMAP) += i2c.o
|
|
|
|
# OMAP mailbox framework
|
|
obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-omap/mcbsp.c linux-2.6.29-rc3.owrt/arch/arm/plat-omap/mcbsp.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-omap/mcbsp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/mcbsp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -214,7 +214,6 @@
|
|
int omap_mcbsp_request(unsigned int id)
|
|
{
|
|
struct omap_mcbsp *mcbsp;
|
|
- int i;
|
|
int err;
|
|
|
|
if (!omap_mcbsp_check_valid_id(id)) {
|
|
@@ -226,8 +225,7 @@
|
|
if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
|
|
mcbsp->pdata->ops->request(id);
|
|
|
|
- for (i = 0; i < mcbsp->num_clks; i++)
|
|
- clk_enable(mcbsp->clks[i]);
|
|
+ clk_enable(mcbsp->clk);
|
|
|
|
spin_lock(&mcbsp->lock);
|
|
if (!mcbsp->free) {
|
|
@@ -278,7 +276,6 @@
|
|
void omap_mcbsp_free(unsigned int id)
|
|
{
|
|
struct omap_mcbsp *mcbsp;
|
|
- int i;
|
|
|
|
if (!omap_mcbsp_check_valid_id(id)) {
|
|
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
|
@@ -289,8 +286,7 @@
|
|
if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
|
|
mcbsp->pdata->ops->free(id);
|
|
|
|
- for (i = mcbsp->num_clks - 1; i >= 0; i--)
|
|
- clk_disable(mcbsp->clks[i]);
|
|
+ clk_disable(mcbsp->clk);
|
|
|
|
spin_lock(&mcbsp->lock);
|
|
if (mcbsp->free) {
|
|
@@ -876,7 +872,6 @@
|
|
struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data;
|
|
struct omap_mcbsp *mcbsp;
|
|
int id = pdev->id - 1;
|
|
- int i;
|
|
int ret = 0;
|
|
|
|
if (!pdata) {
|
|
@@ -921,25 +916,14 @@
|
|
mcbsp->dma_rx_sync = pdata->dma_rx_sync;
|
|
mcbsp->dma_tx_sync = pdata->dma_tx_sync;
|
|
|
|
- if (pdata->num_clks) {
|
|
- mcbsp->num_clks = pdata->num_clks;
|
|
- mcbsp->clks = kzalloc(mcbsp->num_clks * sizeof(struct clk *),
|
|
- GFP_KERNEL);
|
|
- if (!mcbsp->clks) {
|
|
- ret = -ENOMEM;
|
|
- goto exit;
|
|
- }
|
|
- for (i = 0; i < mcbsp->num_clks; i++) {
|
|
- mcbsp->clks[i] = clk_get(&pdev->dev, pdata->clk_names[i]);
|
|
- if (IS_ERR(mcbsp->clks[i])) {
|
|
- dev_err(&pdev->dev,
|
|
- "Invalid %s configuration for McBSP%d.\n",
|
|
- pdata->clk_names[i], mcbsp->id);
|
|
- ret = PTR_ERR(mcbsp->clks[i]);
|
|
- goto err_clk;
|
|
- }
|
|
- }
|
|
-
|
|
+ if (pdata->clk_name)
|
|
+ mcbsp->clk = clk_get(&pdev->dev, pdata->clk_name);
|
|
+ if (IS_ERR(mcbsp->clk)) {
|
|
+ dev_err(&pdev->dev,
|
|
+ "Invalid clock configuration for McBSP%d.\n",
|
|
+ mcbsp->id);
|
|
+ ret = PTR_ERR(mcbsp->clk);
|
|
+ goto err_clk;
|
|
}
|
|
|
|
mcbsp->pdata = pdata;
|
|
@@ -948,9 +932,6 @@
|
|
return 0;
|
|
|
|
err_clk:
|
|
- while (i--)
|
|
- clk_put(mcbsp->clks[i]);
|
|
- kfree(mcbsp->clks);
|
|
iounmap(mcbsp->io_base);
|
|
err_ioremap:
|
|
mcbsp->free = 0;
|
|
@@ -961,7 +942,6 @@
|
|
static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
|
|
{
|
|
struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);
|
|
- int i;
|
|
|
|
platform_set_drvdata(pdev, NULL);
|
|
if (mcbsp) {
|
|
@@ -970,18 +950,12 @@
|
|
mcbsp->pdata->ops->free)
|
|
mcbsp->pdata->ops->free(mcbsp->id);
|
|
|
|
- for (i = mcbsp->num_clks - 1; i >= 0; i--) {
|
|
- clk_disable(mcbsp->clks[i]);
|
|
- clk_put(mcbsp->clks[i]);
|
|
- }
|
|
+ clk_disable(mcbsp->clk);
|
|
+ clk_put(mcbsp->clk);
|
|
|
|
iounmap(mcbsp->io_base);
|
|
|
|
- if (mcbsp->num_clks) {
|
|
- kfree(mcbsp->clks);
|
|
- mcbsp->clks = NULL;
|
|
- mcbsp->num_clks = 0;
|
|
- }
|
|
+ mcbsp->clk = NULL;
|
|
mcbsp->free = 0;
|
|
mcbsp->dev = NULL;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-orion/gpio.c linux-2.6.29-rc3.owrt/arch/arm/plat-orion/gpio.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-orion/gpio.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-orion/gpio.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -265,36 +265,51 @@
|
|
* polarity LEVEL mask
|
|
*
|
|
****************************************************************************/
|
|
+static void gpio_irq_edge_ack(u32 irq)
|
|
+{
|
|
+ int pin = irq_to_gpio(irq);
|
|
+
|
|
+ writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
|
|
+}
|
|
|
|
-static void gpio_irq_ack(u32 irq)
|
|
+static void gpio_irq_edge_mask(u32 irq)
|
|
{
|
|
- int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
|
- if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
|
|
- int pin = irq_to_gpio(irq);
|
|
- writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
|
|
- }
|
|
+ int pin = irq_to_gpio(irq);
|
|
+ u32 u;
|
|
+
|
|
+ u = readl(GPIO_EDGE_MASK(pin));
|
|
+ u &= ~(1 << (pin & 31));
|
|
+ writel(u, GPIO_EDGE_MASK(pin));
|
|
+}
|
|
+
|
|
+static void gpio_irq_edge_unmask(u32 irq)
|
|
+{
|
|
+ int pin = irq_to_gpio(irq);
|
|
+ u32 u;
|
|
+
|
|
+ u = readl(GPIO_EDGE_MASK(pin));
|
|
+ u |= 1 << (pin & 31);
|
|
+ writel(u, GPIO_EDGE_MASK(pin));
|
|
}
|
|
|
|
-static void gpio_irq_mask(u32 irq)
|
|
+static void gpio_irq_level_mask(u32 irq)
|
|
{
|
|
int pin = irq_to_gpio(irq);
|
|
- int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
|
- u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
|
|
- GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
|
|
- u32 u = readl(reg);
|
|
+ u32 u;
|
|
+
|
|
+ u = readl(GPIO_LEVEL_MASK(pin));
|
|
u &= ~(1 << (pin & 31));
|
|
- writel(u, reg);
|
|
+ writel(u, GPIO_LEVEL_MASK(pin));
|
|
}
|
|
|
|
-static void gpio_irq_unmask(u32 irq)
|
|
+static void gpio_irq_level_unmask(u32 irq)
|
|
{
|
|
int pin = irq_to_gpio(irq);
|
|
- int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
|
|
- u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
|
|
- GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
|
|
- u32 u = readl(reg);
|
|
+ u32 u;
|
|
+
|
|
+ u = readl(GPIO_LEVEL_MASK(pin));
|
|
u |= 1 << (pin & 31);
|
|
- writel(u, reg);
|
|
+ writel(u, GPIO_LEVEL_MASK(pin));
|
|
}
|
|
|
|
static int gpio_irq_set_type(u32 irq, u32 type)
|
|
@@ -316,9 +331,9 @@
|
|
* Set edge/level type.
|
|
*/
|
|
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
|
|
- desc->handle_irq = handle_edge_irq;
|
|
+ desc->chip = &orion_gpio_irq_edge_chip;
|
|
} else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
|
|
- desc->handle_irq = handle_level_irq;
|
|
+ desc->chip = &orion_gpio_irq_level_chip;
|
|
} else {
|
|
printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type);
|
|
return -EINVAL;
|
|
@@ -356,11 +371,19 @@
|
|
return 0;
|
|
}
|
|
|
|
-struct irq_chip orion_gpio_irq_chip = {
|
|
- .name = "orion_gpio",
|
|
- .ack = gpio_irq_ack,
|
|
- .mask = gpio_irq_mask,
|
|
- .unmask = gpio_irq_unmask,
|
|
+struct irq_chip orion_gpio_irq_edge_chip = {
|
|
+ .name = "orion_gpio_irq_edge",
|
|
+ .ack = gpio_irq_edge_ack,
|
|
+ .mask = gpio_irq_edge_mask,
|
|
+ .unmask = gpio_irq_edge_unmask,
|
|
+ .set_type = gpio_irq_set_type,
|
|
+};
|
|
+
|
|
+struct irq_chip orion_gpio_irq_level_chip = {
|
|
+ .name = "orion_gpio_irq_level",
|
|
+ .mask = gpio_irq_level_mask,
|
|
+ .mask_ack = gpio_irq_level_mask,
|
|
+ .unmask = gpio_irq_level_unmask,
|
|
.set_type = gpio_irq_set_type,
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-orion/include/plat/gpio.h linux-2.6.29-rc3.owrt/arch/arm/plat-orion/include/plat/gpio.h
|
|
--- linux-2.6.29.owrt/arch/arm/plat-orion/include/plat/gpio.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-orion/include/plat/gpio.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -31,7 +31,8 @@
|
|
/*
|
|
* GPIO interrupt handling.
|
|
*/
|
|
-extern struct irq_chip orion_gpio_irq_chip;
|
|
+extern struct irq_chip orion_gpio_irq_edge_chip;
|
|
+extern struct irq_chip orion_gpio_irq_level_chip;
|
|
void orion_gpio_irq_handler(int irqoff);
|
|
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/clock.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/clock.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/clock.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/clock.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -248,7 +248,7 @@
|
|
&clk_48m,
|
|
};
|
|
|
|
-void __init s3c64xx_register_clocks(void)
|
|
+void s3c64xx_register_clocks(void)
|
|
{
|
|
struct clk *clkp;
|
|
int ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/gpiolib.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/gpiolib.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/gpiolib.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/gpiolib.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -417,4 +417,4 @@
|
|
return 0;
|
|
}
|
|
|
|
-core_initcall(s3c64xx_gpiolib_init);
|
|
+arch_initcall(s3c64xx_gpiolib_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h
|
|
--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -117,7 +117,7 @@
|
|
#define IRQ_ONENAND1 S3C64XX_IRQ_VIC1(12)
|
|
#define IRQ_NFC S3C64XX_IRQ_VIC1(13)
|
|
#define IRQ_CFCON S3C64XX_IRQ_VIC1(14)
|
|
-#define IRQ_USBH S3C64XX_IRQ_VIC1(15)
|
|
+#define IRQ_UHOST S3C64XX_IRQ_VIC1(15)
|
|
#define IRQ_SPI0 S3C64XX_IRQ_VIC1(16)
|
|
#define IRQ_SPI1 S3C64XX_IRQ_VIC1(17)
|
|
#define IRQ_IIC S3C64XX_IRQ_VIC1(18)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/irq.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/irq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -207,7 +207,7 @@
|
|
|
|
static void __init s3c64xx_uart_irq(struct uart_irq *uirq)
|
|
{
|
|
- void __iomem *reg_base = uirq->regs;
|
|
+ void *reg_base = uirq->regs;
|
|
unsigned int irq;
|
|
int offs;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/irq-eint.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq-eint.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/irq-eint.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq-eint.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -14,15 +14,12 @@
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/interrupt.h>
|
|
-#include <linux/gpio.h>
|
|
#include <linux/irq.h>
|
|
#include <linux/io.h>
|
|
|
|
#include <asm/hardware/vic.h>
|
|
|
|
#include <plat/regs-irqtype.h>
|
|
-#include <plat/regs-gpio.h>
|
|
-#include <plat/gpio-cfg.h>
|
|
|
|
#include <mach/map.h>
|
|
#include <plat/cpu.h>
|
|
@@ -58,7 +55,7 @@
|
|
u32 mask;
|
|
|
|
mask = __raw_readl(S3C64XX_EINT0MASK);
|
|
- mask &= ~eint_irq_to_bit(irq);
|
|
+ mask |= eint_irq_to_bit(irq);
|
|
__raw_writel(mask, S3C64XX_EINT0MASK);
|
|
}
|
|
|
|
@@ -77,7 +74,6 @@
|
|
static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type)
|
|
{
|
|
int offs = eint_offset(irq);
|
|
- int pin;
|
|
int shift;
|
|
u32 ctrl, mask;
|
|
u32 newvalue = 0;
|
|
@@ -129,15 +125,6 @@
|
|
ctrl |= newvalue << shift;
|
|
__raw_writel(ctrl, reg);
|
|
|
|
- /* set the GPIO pin appropriately */
|
|
-
|
|
- if (offs < 23)
|
|
- pin = S3C64XX_GPN(offs);
|
|
- else
|
|
- pin = S3C64XX_GPM(offs - 23);
|
|
-
|
|
- s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(2));
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -194,7 +181,7 @@
|
|
s3c_irq_demux_eint(20, 27);
|
|
}
|
|
|
|
-static int __init s3c64xx_init_irq_eint(void)
|
|
+int __init s3c64xx_init_irq_eint(void)
|
|
{
|
|
int irq;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c
|
|
--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -36,7 +36,7 @@
|
|
* ext_xtal_mux for want of an actual name from the manual.
|
|
*/
|
|
|
|
-static struct clk clk_ext_xtal_mux = {
|
|
+struct clk clk_ext_xtal_mux = {
|
|
.name = "ext_xtal",
|
|
.id = -1,
|
|
};
|
|
@@ -63,7 +63,7 @@
|
|
void __iomem *reg_divider;
|
|
};
|
|
|
|
-static struct clk clk_fout_apll = {
|
|
+struct clk clk_fout_apll = {
|
|
.name = "fout_apll",
|
|
.id = -1,
|
|
};
|
|
@@ -78,7 +78,7 @@
|
|
.nr_sources = ARRAY_SIZE(clk_src_apll_list),
|
|
};
|
|
|
|
-static struct clksrc_clk clk_mout_apll = {
|
|
+struct clksrc_clk clk_mout_apll = {
|
|
.clk = {
|
|
.name = "mout_apll",
|
|
.id = -1,
|
|
@@ -88,7 +88,7 @@
|
|
.sources = &clk_src_apll,
|
|
};
|
|
|
|
-static struct clk clk_fout_epll = {
|
|
+struct clk clk_fout_epll = {
|
|
.name = "fout_epll",
|
|
.id = -1,
|
|
};
|
|
@@ -103,7 +103,7 @@
|
|
.nr_sources = ARRAY_SIZE(clk_src_epll_list),
|
|
};
|
|
|
|
-static struct clksrc_clk clk_mout_epll = {
|
|
+struct clksrc_clk clk_mout_epll = {
|
|
.clk = {
|
|
.name = "mout_epll",
|
|
.id = -1,
|
|
@@ -123,7 +123,7 @@
|
|
.nr_sources = ARRAY_SIZE(clk_src_mpll_list),
|
|
};
|
|
|
|
-static struct clksrc_clk clk_mout_mpll = {
|
|
+struct clksrc_clk clk_mout_mpll = {
|
|
.clk = {
|
|
.name = "mout_mpll",
|
|
.id = -1,
|
|
@@ -145,7 +145,7 @@
|
|
return rate;
|
|
}
|
|
|
|
-static struct clk clk_dout_mpll = {
|
|
+struct clk clk_dout_mpll = {
|
|
.name = "dout_mpll",
|
|
.id = -1,
|
|
.parent = &clk_mout_mpll.clk,
|
|
@@ -189,10 +189,10 @@
|
|
};
|
|
|
|
static struct clk *clkset_uhost_list[] = {
|
|
- &clk_48m,
|
|
&clk_mout_epll.clk,
|
|
&clk_dout_mpll,
|
|
&clk_fin_epll,
|
|
+ &clk_48m,
|
|
};
|
|
|
|
static struct clk_sources clkset_uhost = {
|
|
@@ -239,12 +239,10 @@
|
|
|
|
rate = clk_round_rate(clk, rate);
|
|
div = clk_get_rate(clk->parent) / rate;
|
|
- if (div > 16)
|
|
- return -EINVAL;
|
|
|
|
val = __raw_readl(reg);
|
|
- val &= ~(0xf << sclk->shift);
|
|
- val |= (div - 1) << sclk->shift;
|
|
+ val &= ~sclk->mask;
|
|
+ val |= (rate - 1) << sclk->shift;
|
|
__raw_writel(val, reg);
|
|
|
|
return 0;
|
|
@@ -353,7 +351,7 @@
|
|
|
|
static struct clksrc_clk clk_usbhost = {
|
|
.clk = {
|
|
- .name = "usb-bus-host",
|
|
+ .name = "usb-host-bus",
|
|
.id = -1,
|
|
.ctrlbit = S3C_CLKCON_SCLK_UHOST,
|
|
.enable = s3c64xx_sclk_ctrl,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/arm/tools/mach-types linux-2.6.29-rc3.owrt/arch/arm/tools/mach-types
|
|
--- linux-2.6.29.owrt/arch/arm/tools/mach-types 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/arm/tools/mach-types 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -12,7 +12,7 @@
|
|
#
|
|
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
|
#
|
|
-# Last update: Thu Mar 12 18:01:45 2009
|
|
+# Last update: Sun Nov 30 16:39:36 2008
|
|
#
|
|
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
|
#
|
|
@@ -1811,7 +1811,7 @@
|
|
jade MACH_JADE JADE 1821
|
|
ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822
|
|
gprisc3 MACH_GPRISC3 GPRISC3 1823
|
|
-stamp9g20 MACH_STAMP9G20 STAMP9G20 1824
|
|
+stamp9260 MACH_STAMP9260 STAMP9260 1824
|
|
smdk6430 MACH_SMDK6430 SMDK6430 1825
|
|
smdkc100 MACH_SMDKC100 SMDKC100 1826
|
|
tavorevb MACH_TAVOREVB TAVOREVB 1827
|
|
@@ -1993,134 +1993,4 @@
|
|
benzina MACH_BENZINA BENZINA 2003
|
|
blaze MACH_BLAZE BLAZE 2004
|
|
linkstation_ls_hgl MACH_LINKSTATION_LS_HGL LINKSTATION_LS_HGL 2005
|
|
-htckovsky MACH_HTCVENUS HTCVENUS 2006
|
|
-sony_prs505 MACH_SONY_PRS505 SONY_PRS505 2007
|
|
-hanlin_v3 MACH_HANLIN_V3 HANLIN_V3 2008
|
|
-sapphira MACH_SAPPHIRA SAPPHIRA 2009
|
|
-dack_sda_01 MACH_DACK_SDA_01 DACK_SDA_01 2010
|
|
-armbox MACH_ARMBOX ARMBOX 2011
|
|
-harris_rvp MACH_HARRIS_RVP HARRIS_RVP 2012
|
|
-ribaldo MACH_RIBALDO RIBALDO 2013
|
|
-agora MACH_AGORA AGORA 2014
|
|
-omap3_mini MACH_OMAP3_MINI OMAP3_MINI 2015
|
|
-a9sam6432_b MACH_A9SAM6432_B A9SAM6432_B 2016
|
|
-usg2410 MACH_USG2410 USG2410 2017
|
|
-pc72052_i10_revb MACH_PC72052_I10_REVB PC72052_I10_REVB 2018
|
|
-mx35_exm32 MACH_MX35_EXM32 MX35_EXM32 2019
|
|
-topas910 MACH_TOPAS910 TOPAS910 2020
|
|
-hyena MACH_HYENA HYENA 2021
|
|
-pospax MACH_POSPAX POSPAX 2022
|
|
-hdl_gx MACH_HDL_GX HDL_GX 2023
|
|
-ctera_4bay MACH_CTERA_4BAY CTERA_4BAY 2024
|
|
-ctera_plug_c MACH_CTERA_PLUG_C CTERA_PLUG_C 2025
|
|
-crwea_plug_i MACH_CRWEA_PLUG_I CRWEA_PLUG_I 2026
|
|
-egauge2 MACH_EGAUGE2 EGAUGE2 2027
|
|
-didj MACH_DIDJ DIDJ 2028
|
|
-m_s3c2443 MACH_MEISTER MEISTER 2029
|
|
-htcblackstone MACH_HTCBLACKSTONE HTCBLACKSTONE 2030
|
|
-cpuat9g20 MACH_CPUAT9G20 CPUAT9G20 2031
|
|
-smdk6440 MACH_SMDK6440 SMDK6440 2032
|
|
-omap_35xx_mvp MACH_OMAP_35XX_MVP OMAP_35XX_MVP 2033
|
|
-ctera_plug_i MACH_CTERA_PLUG_I CTERA_PLUG_I 2034
|
|
-pvg610_100 MACH_PVG610 PVG610 2035
|
|
-hprw6815 MACH_HPRW6815 HPRW6815 2036
|
|
-omap3_oswald MACH_OMAP3_OSWALD OMAP3_OSWALD 2037
|
|
-nas4220b MACH_NAS4220B NAS4220B 2038
|
|
-htcraphael_cdma MACH_HTCRAPHAEL_CDMA HTCRAPHAEL_CDMA 2039
|
|
-htcdiamond_cdma MACH_HTCDIAMOND_CDMA HTCDIAMOND_CDMA 2040
|
|
-scaler MACH_SCALER SCALER 2041
|
|
-zylonite2 MACH_ZYLONITE2 ZYLONITE2 2042
|
|
-aspenite MACH_ASPENITE ASPENITE 2043
|
|
-teton MACH_TETON TETON 2044
|
|
-ttc_dkb MACH_TTC_DKB TTC_DKB 2045
|
|
-bishop2 MACH_BISHOP2 BISHOP2 2046
|
|
-ippv5 MACH_IPPV5 IPPV5 2047
|
|
-farm926 MACH_FARM926 FARM926 2048
|
|
-mmccpu MACH_MMCCPU MMCCPU 2049
|
|
-sgmsfl MACH_SGMSFL SGMSFL 2050
|
|
-tt8000 MACH_TT8000 TT8000 2051
|
|
-zrn4300lp MACH_ZRN4300LP ZRN4300LP 2052
|
|
-mptc MACH_MPTC MPTC 2053
|
|
-h6051 MACH_H6051 H6051 2054
|
|
-pvg610_101 MACH_PVG610_101 PVG610_101 2055
|
|
-stamp9261_pc_evb MACH_STAMP9261_PC_EVB STAMP9261_PC_EVB 2056
|
|
-pelco_odysseus MACH_PELCO_ODYSSEUS PELCO_ODYSSEUS 2057
|
|
-tny_a9260 MACH_TNY_A9260 TNY_A9260 2058
|
|
-tny_a9g20 MACH_TNY_A9G20 TNY_A9G20 2059
|
|
-aesop_mp2530f MACH_AESOP_MP2530F AESOP_MP2530F 2060
|
|
-dx900 MACH_DX900 DX900 2061
|
|
-cpodc2 MACH_CPODC2 CPODC2 2062
|
|
-tilt_8925 MACH_TILT_8925 TILT_8925 2063
|
|
-davinci_dm357_evm MACH_DAVINCI_DM357_EVM DAVINCI_DM357_EVM 2064
|
|
-swordfish MACH_SWORDFISH SWORDFISH 2065
|
|
-corvus MACH_CORVUS CORVUS 2066
|
|
-taurus MACH_TAURUS TAURUS 2067
|
|
-axm MACH_AXM AXM 2068
|
|
-axc MACH_AXC AXC 2069
|
|
-baby MACH_BABY BABY 2070
|
|
-mp200 MACH_MP200 MP200 2071
|
|
-pcm043 MACH_PCM043 PCM043 2072
|
|
-hanlin_v3c MACH_HANLIN_V3C HANLIN_V3C 2073
|
|
-kbk9g20 MACH_KBK9G20 KBK9G20 2074
|
|
-adsturbog5 MACH_ADSTURBOG5 ADSTURBOG5 2075
|
|
-avenger_lite1 MACH_AVENGER_LITE1 AVENGER_LITE1 2076
|
|
-suc82x MACH_SUC SUC 2077
|
|
-at91sam7s256 MACH_AT91SAM7S256 AT91SAM7S256 2078
|
|
-mendoza MACH_MENDOZA MENDOZA 2079
|
|
-kira MACH_KIRA KIRA 2080
|
|
-mx1hbm MACH_MX1HBM MX1HBM 2081
|
|
-quatro43xx MACH_QUATRO43XX QUATRO43XX 2082
|
|
-quatro4230 MACH_QUATRO4230 QUATRO4230 2083
|
|
-nsb400 MACH_NSB400 NSB400 2084
|
|
-drp255 MACH_DRP255 DRP255 2085
|
|
-thoth MACH_THOTH THOTH 2086
|
|
-firestone MACH_FIRESTONE FIRESTONE 2087
|
|
-asusp750 MACH_ASUSP750 ASUSP750 2088
|
|
-ctera_dl MACH_CTERA_DL CTERA_DL 2089
|
|
-socr MACH_SOCR SOCR 2090
|
|
-htcoxygen MACH_HTCOXYGEN HTCOXYGEN 2091
|
|
-heroc MACH_HEROC HEROC 2092
|
|
-zeno6800 MACH_ZENO6800 ZENO6800 2093
|
|
-sc2mcs MACH_SC2MCS SC2MCS 2094
|
|
-gene100 MACH_GENE100 GENE100 2095
|
|
-as353x MACH_AS353X AS353X 2096
|
|
-sheevaplug MACH_SHEEVAPLUG SHEEVAPLUG 2097
|
|
-at91sam9g20 MACH_AT91SAM9G20 AT91SAM9G20 2098
|
|
-mv88f6192gtw_fe MACH_MV88F6192GTW_FE MV88F6192GTW_FE 2099
|
|
-cc9200 MACH_CC9200 CC9200 2100
|
|
-sm9200 MACH_SM9200 SM9200 2101
|
|
-tp9200 MACH_TP9200 TP9200 2102
|
|
-snapperdv MACH_SNAPPERDV SNAPPERDV 2103
|
|
-avengers_lite MACH_AVENGERS_LITE AVENGERS_LITE 2104
|
|
-avengers_lite1 MACH_AVENGERS_LITE1 AVENGERS_LITE1 2105
|
|
-omap3axon MACH_OMAP3AXON OMAP3AXON 2106
|
|
-ma8xx MACH_MA8XX MA8XX 2107
|
|
-mp201ek MACH_MP201EK MP201EK 2108
|
|
-davinci_tux MACH_DAVINCI_TUX DAVINCI_TUX 2109
|
|
-mpa1600 MACH_MPA1600 MPA1600 2110
|
|
-pelco_troy MACH_PELCO_TROY PELCO_TROY 2111
|
|
-nsb667 MACH_NSB667 NSB667 2112
|
|
-rovers5_4mpix MACH_ROVERS5_4MPIX ROVERS5_4MPIX 2113
|
|
-twocom MACH_TWOCOM TWOCOM 2114
|
|
-ubisys_p9_rcu3r2 MACH_UBISYS_P9_RCU3R2 UBISYS_P9_RCU3R2 2115
|
|
-hero_espresso MACH_HERO_ESPRESSO HERO_ESPRESSO 2116
|
|
-afeusb MACH_AFEUSB AFEUSB 2117
|
|
-t830 MACH_T830 T830 2118
|
|
-spd8020_cc MACH_SPD8020_CC SPD8020_CC 2119
|
|
-om_3d7k MACH_OM_3D7K OM_3D7K 2120
|
|
-picocom2 MACH_PICOCOM2 PICOCOM2 2121
|
|
-uwg4mx27 MACH_UWG4MX27 UWG4MX27 2122
|
|
-uwg4mx31 MACH_UWG4MX31 UWG4MX31 2123
|
|
-cherry MACH_CHERRY CHERRY 2124
|
|
-mx51_babbage MACH_MX51_BABBAGE MX51_BABBAGE 2125
|
|
-s3c2440turkiye MACH_S3C2440TURKIYE S3C2440TURKIYE 2126
|
|
-tx37 MACH_TX37 TX37 2127
|
|
-sbc2800_9g20 MACH_SBC2800_9G20 SBC2800_9G20 2128
|
|
-benzglb MACH_BENZGLB BENZGLB 2129
|
|
-benztd MACH_BENZTD BENZTD 2130
|
|
-cartesio_plus MACH_CARTESIO_PLUS CARTESIO_PLUS 2131
|
|
-solrad_g20 MACH_SOLRAD_G20 SOLRAD_G20 2132
|
|
-mx27wallace MACH_MX27WALLACE MX27WALLACE 2133
|
|
-fmzwebmodul MACH_FMZWEBMODUL FMZWEBMODUL 2134
|
|
-rd78x00_masa MACH_RD78X00_MASA RD78X00_MASA 2135
|
|
-smallogger MACH_SMALLOGGER SMALLOGGER 2136
|
|
+htcvenus MACH_HTCVENUS HTCVENUS 2006
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/avr32/mach-at32ap/include/mach/board.h linux-2.6.29-rc3.owrt/arch/avr32/mach-at32ap/include/mach/board.h
|
|
--- linux-2.6.29.owrt/arch/avr32/mach-at32ap/include/mach/board.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/avr32/mach-at32ap/include/mach/board.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -116,7 +116,6 @@
|
|
int enable_pin; /* chip enable */
|
|
int det_pin; /* card detect */
|
|
int rdy_pin; /* ready/busy */
|
|
- u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
|
u8 ale; /* address line number connected to ALE */
|
|
u8 cle; /* address line number connected to CLE */
|
|
u8 bus_width_16; /* buswidth is 16 bit */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/bfin_sport.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/bfin_sport.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/bfin_sport.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/bfin_sport.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,9 +1,30 @@
|
|
/*
|
|
- * bfin_sport.h - userspace header for bfin sport driver
|
|
+ * File: include/asm-blackfin/bfin_sport.h
|
|
+ * Based on:
|
|
+ * Author: Roy Huang (roy.huang@analog.com)
|
|
*
|
|
- * Copyright 2004-2008 Analog Devices Inc.
|
|
+ * Created: Thu Aug. 24 2006
|
|
+ * Description:
|
|
*
|
|
- * Licensed under the GPL-2 or later.
|
|
+ * Modified:
|
|
+ * Copyright 2004-2006 Analog Devices Inc.
|
|
+ *
|
|
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
+ * (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, see the file COPYING, or write
|
|
+ * to the Free Software Foundation, Inc.,
|
|
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef __BFIN_SPORT_H__
|
|
@@ -21,10 +42,11 @@
|
|
#define NORM_FORMAT 0x0
|
|
#define ALAW_FORMAT 0x2
|
|
#define ULAW_FORMAT 0x3
|
|
+struct sport_register;
|
|
|
|
/* Function driver which use sport must initialize the structure */
|
|
struct sport_config {
|
|
- /* TDM (multichannels), I2S or other mode */
|
|
+ /*TDM (multichannels), I2S or other mode */
|
|
unsigned int mode:3;
|
|
|
|
/* if TDM mode is selected, channels must be set */
|
|
@@ -50,18 +72,12 @@
|
|
int serial_clk;
|
|
int fsync_clk;
|
|
|
|
- unsigned int data_format:2; /* Normal, u-law or a-law */
|
|
+ unsigned int data_format:2; /*Normal, u-law or a-law */
|
|
|
|
int word_len; /* How length of the word in bits, 3-32 bits */
|
|
int dma_enabled;
|
|
};
|
|
|
|
-/* Userspace interface */
|
|
-#define SPORT_IOC_MAGIC 'P'
|
|
-#define SPORT_IOC_CONFIG _IOWR('P', 0x01, struct sport_config)
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-
|
|
struct sport_register {
|
|
unsigned short tcr1;
|
|
unsigned short reserved0;
|
|
@@ -101,6 +117,9 @@
|
|
unsigned long mrcs3;
|
|
};
|
|
|
|
+#define SPORT_IOC_MAGIC 'P'
|
|
+#define SPORT_IOC_CONFIG _IOWR('P', 0x01, struct sport_config)
|
|
+
|
|
struct sport_dev {
|
|
struct cdev cdev; /* Char device structure */
|
|
|
|
@@ -130,8 +149,6 @@
|
|
struct sport_config config;
|
|
};
|
|
|
|
-#endif
|
|
-
|
|
#define SPORT_TCR1 0
|
|
#define SPORT_TCR2 1
|
|
#define SPORT_TCLKDIV 2
|
|
@@ -152,4 +169,4 @@
|
|
#define SPORT_MRCS2 22
|
|
#define SPORT_MRCS3 23
|
|
|
|
-#endif
|
|
+#endif /*__BFIN_SPORT_H__*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/checksum.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/checksum.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/checksum.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/checksum.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -63,23 +63,23 @@
|
|
csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
|
unsigned short proto, __wsum sum)
|
|
{
|
|
- unsigned int carry;
|
|
|
|
- __asm__ ("%0 = %0 + %2;\n\t"
|
|
- "CC = AC0;\n\t"
|
|
- "%1 = CC;\n\t"
|
|
- "%0 = %0 + %1;\n\t"
|
|
- "%0 = %0 + %3;\n\t"
|
|
- "CC = AC0;\n\t"
|
|
- "%1 = CC;\n\t"
|
|
- "%0 = %0 + %1;\n\t"
|
|
- "%0 = %0 + %4;\n\t"
|
|
- "CC = AC0;\n\t"
|
|
- "%1 = CC;\n\t"
|
|
- "%0 = %0 + %1;\n\t"
|
|
- : "=d" (sum), "=&d" (carry)
|
|
- : "d" (daddr), "d" (saddr), "d" ((len + proto) << 8), "0"(sum)
|
|
- : "CC");
|
|
+ __asm__ ("%0 = %0 + %1;\n\t"
|
|
+ "CC = AC0;\n\t"
|
|
+ "if !CC jump 4;\n\t"
|
|
+ "%0 = %0 + %4;\n\t"
|
|
+ "%0 = %0 + %2;\n\t"
|
|
+ "CC = AC0;\n\t"
|
|
+ "if !CC jump 4;\n\t"
|
|
+ "%0 = %0 + %4;\n\t"
|
|
+ "%0 = %0 + %3;\n\t"
|
|
+ "CC = AC0;\n\t"
|
|
+ "if !CC jump 4;\n\t"
|
|
+ "%0 = %0 + %4;\n\t"
|
|
+ "NOP;\n\t"
|
|
+ : "=d" (sum)
|
|
+ : "d" (daddr), "d" (saddr), "d" ((ntohs(len)<<16)+proto*256), "d" (1), "0"(sum)
|
|
+ : "CC");
|
|
|
|
return (sum);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/delay.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/delay.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/delay.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/delay.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -13,7 +13,29 @@
|
|
|
|
static inline void __delay(unsigned long loops)
|
|
{
|
|
-__asm__ __volatile__ (
|
|
+ if (ANOMALY_05000312) {
|
|
+ /* Interrupted loads to loop registers -> bad */
|
|
+ unsigned long tmp;
|
|
+ __asm__ __volatile__(
|
|
+ "[--SP] = LC0;"
|
|
+ "[--SP] = LT0;"
|
|
+ "[--SP] = LB0;"
|
|
+ "LSETUP (1f,1f) LC0 = %1;"
|
|
+ "1: NOP;"
|
|
+ /* We take advantage of the fact that LC0 is 0 at
|
|
+ * the end of the loop. Otherwise we'd need some
|
|
+ * NOPs after the CLI here.
|
|
+ */
|
|
+ "CLI %0;"
|
|
+ "LB0 = [SP++];"
|
|
+ "LT0 = [SP++];"
|
|
+ "LC0 = [SP++];"
|
|
+ "STI %0;"
|
|
+ : "=d" (tmp)
|
|
+ : "a" (loops)
|
|
+ );
|
|
+ } else
|
|
+ __asm__ __volatile__ (
|
|
"LSETUP(1f, 1f) LC0 = %0;"
|
|
"1: NOP;"
|
|
:
|
|
@@ -25,15 +47,16 @@
|
|
#include <linux/param.h> /* needed for HZ */
|
|
|
|
/*
|
|
- * close approximation borrowed from m68knommu to avoid 64-bit math
|
|
+ * Use only for very small delays ( < 1 msec). Should probably use a
|
|
+ * lookup table, really, as the multiplications take much too long with
|
|
+ * short delays. This is a "reasonable" implementation, though (and the
|
|
+ * first constant multiplications gets optimized away if the delay is
|
|
+ * a constant)
|
|
*/
|
|
-
|
|
-#define HZSCALE (268435456 / (1000000/HZ))
|
|
-
|
|
static inline void udelay(unsigned long usecs)
|
|
{
|
|
extern unsigned long loops_per_jiffy;
|
|
- __delay((((usecs * HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6);
|
|
+ __delay(usecs * loops_per_jiffy / (1000000 / HZ));
|
|
}
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/gpio.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/gpio.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/gpio.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/gpio.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -27,6 +27,60 @@
|
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
+/*
|
|
+* Number BF537/6/4 BF561 BF533/2/1
|
|
+* BF527/5/2
|
|
+*
|
|
+* GPIO_0 PF0 PF0 PF0
|
|
+* GPIO_1 PF1 PF1 PF1
|
|
+* GPIO_2 PF2 PF2 PF2
|
|
+* GPIO_3 PF3 PF3 PF3
|
|
+* GPIO_4 PF4 PF4 PF4
|
|
+* GPIO_5 PF5 PF5 PF5
|
|
+* GPIO_6 PF6 PF6 PF6
|
|
+* GPIO_7 PF7 PF7 PF7
|
|
+* GPIO_8 PF8 PF8 PF8
|
|
+* GPIO_9 PF9 PF9 PF9
|
|
+* GPIO_10 PF10 PF10 PF10
|
|
+* GPIO_11 PF11 PF11 PF11
|
|
+* GPIO_12 PF12 PF12 PF12
|
|
+* GPIO_13 PF13 PF13 PF13
|
|
+* GPIO_14 PF14 PF14 PF14
|
|
+* GPIO_15 PF15 PF15 PF15
|
|
+* GPIO_16 PG0 PF16
|
|
+* GPIO_17 PG1 PF17
|
|
+* GPIO_18 PG2 PF18
|
|
+* GPIO_19 PG3 PF19
|
|
+* GPIO_20 PG4 PF20
|
|
+* GPIO_21 PG5 PF21
|
|
+* GPIO_22 PG6 PF22
|
|
+* GPIO_23 PG7 PF23
|
|
+* GPIO_24 PG8 PF24
|
|
+* GPIO_25 PG9 PF25
|
|
+* GPIO_26 PG10 PF26
|
|
+* GPIO_27 PG11 PF27
|
|
+* GPIO_28 PG12 PF28
|
|
+* GPIO_29 PG13 PF29
|
|
+* GPIO_30 PG14 PF30
|
|
+* GPIO_31 PG15 PF31
|
|
+* GPIO_32 PH0 PF32
|
|
+* GPIO_33 PH1 PF33
|
|
+* GPIO_34 PH2 PF34
|
|
+* GPIO_35 PH3 PF35
|
|
+* GPIO_36 PH4 PF36
|
|
+* GPIO_37 PH5 PF37
|
|
+* GPIO_38 PH6 PF38
|
|
+* GPIO_39 PH7 PF39
|
|
+* GPIO_40 PH8 PF40
|
|
+* GPIO_41 PH9 PF41
|
|
+* GPIO_42 PH10 PF42
|
|
+* GPIO_43 PH11 PF43
|
|
+* GPIO_44 PH12 PF44
|
|
+* GPIO_45 PH13 PF45
|
|
+* GPIO_46 PH14 PF46
|
|
+* GPIO_47 PH15 PF47
|
|
+*/
|
|
+
|
|
#ifndef __ARCH_BLACKFIN_GPIO_H__
|
|
#define __ARCH_BLACKFIN_GPIO_H__
|
|
|
|
@@ -241,6 +295,10 @@
|
|
int bfin_gpio_get_value(unsigned gpio);
|
|
void bfin_gpio_set_value(unsigned gpio, int value);
|
|
|
|
+#ifndef BF548_FAMILY
|
|
+#define bfin_gpio_set_value(gpio, value) set_gpio_data(gpio, value)
|
|
+#endif
|
|
+
|
|
#ifdef CONFIG_GPIOLIB
|
|
#include <asm-generic/gpio.h> /* cansleep wrappers */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/ipipe_base.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/ipipe_base.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/ipipe_base.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/ipipe_base.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,5 +1,5 @@
|
|
/* -*- linux-c -*-
|
|
- * include/asm-blackfin/ipipe_base.h
|
|
+ * include/asm-blackfin/_baseipipe.h
|
|
*
|
|
* Copyright (C) 2007 Philippe Gerum.
|
|
*
|
|
@@ -27,9 +27,8 @@
|
|
#define IPIPE_NR_XIRQS NR_IRQS
|
|
#define IPIPE_IRQ_ISHIFT 5 /* 2^5 for 32bits arch. */
|
|
|
|
-/* Blackfin-specific, per-cpu pipeline status */
|
|
-#define IPIPE_SYNCDEFER_FLAG 15
|
|
-#define IPIPE_SYNCDEFER_MASK (1L << IPIPE_SYNCDEFER_MASK)
|
|
+/* Blackfin-specific, global domain flags */
|
|
+#define IPIPE_ROOTLOCK_FLAG 1 /* Lock pipeline for root */
|
|
|
|
/* Blackfin traps -- i.e. exception vector numbers */
|
|
#define IPIPE_NR_FAULTS 52 /* We leave a gap after VEC_ILL_RES. */
|
|
@@ -49,6 +48,11 @@
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
+#include <linux/bitops.h>
|
|
+
|
|
+extern int test_bit(int nr, const void *addr);
|
|
+
|
|
+
|
|
extern unsigned long __ipipe_root_status; /* Alias to ipipe_root_cpudom_var(status) */
|
|
|
|
static inline void __ipipe_stall_root(void)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/ipipe.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/ipipe.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/ipipe.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/ipipe.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -35,9 +35,9 @@
|
|
#include <asm/atomic.h>
|
|
#include <asm/traps.h>
|
|
|
|
-#define IPIPE_ARCH_STRING "1.9-00"
|
|
+#define IPIPE_ARCH_STRING "1.8-00"
|
|
#define IPIPE_MAJOR_NUMBER 1
|
|
-#define IPIPE_MINOR_NUMBER 9
|
|
+#define IPIPE_MINOR_NUMBER 8
|
|
#define IPIPE_PATCH_NUMBER 0
|
|
|
|
#ifdef CONFIG_SMP
|
|
@@ -83,9 +83,9 @@
|
|
"%2 = CYCLES2\n" \
|
|
"CC = %2 == %0\n" \
|
|
"if ! CC jump 1b\n" \
|
|
- : "=d,a" (((unsigned long *)&t)[1]), \
|
|
- "=d,a" (((unsigned long *)&t)[0]), \
|
|
- "=d,a" (__cy2) \
|
|
+ : "=r" (((unsigned long *)&t)[1]), \
|
|
+ "=r" (((unsigned long *)&t)[0]), \
|
|
+ "=r" (__cy2) \
|
|
: /*no input*/ : "CC"); \
|
|
t; \
|
|
})
|
|
@@ -118,40 +118,35 @@
|
|
|
|
#define __ipipe_disable_irq(irq) (irq_desc[irq].chip->mask(irq))
|
|
|
|
-static inline int __ipipe_check_tickdev(const char *devname)
|
|
-{
|
|
- return 1;
|
|
-}
|
|
+#define __ipipe_lock_root() \
|
|
+ set_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags)
|
|
|
|
-static inline void __ipipe_lock_root(void)
|
|
-{
|
|
- set_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status));
|
|
-}
|
|
-
|
|
-static inline void __ipipe_unlock_root(void)
|
|
-{
|
|
- clear_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status));
|
|
-}
|
|
+#define __ipipe_unlock_root() \
|
|
+ clear_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags)
|
|
|
|
void __ipipe_enable_pipeline(void);
|
|
|
|
#define __ipipe_hook_critical_ipi(ipd) do { } while (0)
|
|
|
|
-#define __ipipe_sync_pipeline ___ipipe_sync_pipeline
|
|
-void ___ipipe_sync_pipeline(unsigned long syncmask);
|
|
+#define __ipipe_sync_pipeline(syncmask) \
|
|
+ do { \
|
|
+ struct ipipe_domain *ipd = ipipe_current_domain; \
|
|
+ if (likely(ipd != ipipe_root_domain || !test_bit(IPIPE_ROOTLOCK_FLAG, &ipd->flags))) \
|
|
+ __ipipe_sync_stage(syncmask); \
|
|
+ } while (0)
|
|
|
|
void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs);
|
|
|
|
int __ipipe_get_irq_priority(unsigned irq);
|
|
|
|
+int __ipipe_get_irqthread_priority(unsigned irq);
|
|
+
|
|
void __ipipe_stall_root_raw(void);
|
|
|
|
void __ipipe_unstall_root_raw(void);
|
|
|
|
void __ipipe_serial_debug(const char *fmt, ...);
|
|
|
|
-asmlinkage void __ipipe_call_irqtail(unsigned long addr);
|
|
-
|
|
DECLARE_PER_CPU(struct pt_regs, __ipipe_tick_regs);
|
|
|
|
extern unsigned long __ipipe_core_clock;
|
|
@@ -167,25 +162,42 @@
|
|
|
|
#define __ipipe_run_irqtail() /* Must be a macro */ \
|
|
do { \
|
|
+ asmlinkage void __ipipe_call_irqtail(void); \
|
|
unsigned long __pending; \
|
|
- CSYNC(); \
|
|
+ CSYNC(); \
|
|
__pending = bfin_read_IPEND(); \
|
|
if (__pending & 0x8000) { \
|
|
__pending &= ~0x8010; \
|
|
if (__pending && (__pending & (__pending - 1)) == 0) \
|
|
- __ipipe_call_irqtail(__ipipe_irq_tail_hook); \
|
|
+ __ipipe_call_irqtail(); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define __ipipe_run_isr(ipd, irq) \
|
|
do { \
|
|
if (ipd == ipipe_root_domain) { \
|
|
- local_irq_enable_hw(); \
|
|
- if (ipipe_virtual_irq_p(irq)) \
|
|
+ /* \
|
|
+ * Note: the I-pipe implements a threaded interrupt model on \
|
|
+ * this arch for Linux external IRQs. The interrupt handler we \
|
|
+ * call here only wakes up the associated IRQ thread. \
|
|
+ */ \
|
|
+ if (ipipe_virtual_irq_p(irq)) { \
|
|
+ /* No irqtail here; virtual interrupts have no effect \
|
|
+ on IPEND so there is no need for processing \
|
|
+ deferral. */ \
|
|
+ local_irq_enable_nohead(ipd); \
|
|
ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \
|
|
- else \
|
|
+ local_irq_disable_nohead(ipd); \
|
|
+ } else \
|
|
+ /* \
|
|
+ * No need to run the irqtail here either; \
|
|
+ * we can't be preempted by hw IRQs, so \
|
|
+ * non-Linux IRQs cannot stack over the short \
|
|
+ * thread wakeup code. Which in turn means \
|
|
+ * that no irqtail condition could be pending \
|
|
+ * for domains above Linux in the pipeline. \
|
|
+ */ \
|
|
ipd->irqs[irq].handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs)); \
|
|
- local_irq_disable_hw(); \
|
|
} else { \
|
|
__clear_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \
|
|
local_irq_enable_nohead(ipd); \
|
|
@@ -205,24 +217,42 @@
|
|
|
|
int ipipe_start_irq_thread(unsigned irq, struct irq_desc *desc);
|
|
|
|
-#ifdef CONFIG_GENERIC_CLOCKEVENTS
|
|
-#define IRQ_SYSTMR IRQ_CORETMR
|
|
-#define IRQ_PRIOTMR IRQ_CORETMR
|
|
-#else
|
|
+#define IS_SYSIRQ(irq) ((irq) > IRQ_CORETMR && (irq) <= SYS_IRQS)
|
|
+#define IS_GPIOIRQ(irq) ((irq) >= GPIO_IRQ_BASE && (irq) < NR_IRQS)
|
|
+
|
|
#define IRQ_SYSTMR IRQ_TIMER0
|
|
#define IRQ_PRIOTMR CONFIG_IRQ_TIMER0
|
|
-#endif
|
|
|
|
-#ifdef CONFIG_BF561
|
|
+#if defined(CONFIG_BF531) || defined(CONFIG_BF532) || defined(CONFIG_BF533)
|
|
+#define PRIO_GPIODEMUX(irq) CONFIG_PFA
|
|
+#elif defined(CONFIG_BF534) || defined(CONFIG_BF536) || defined(CONFIG_BF537)
|
|
+#define PRIO_GPIODEMUX(irq) CONFIG_IRQ_PROG_INTA
|
|
+#elif defined(CONFIG_BF52x)
|
|
+#define PRIO_GPIODEMUX(irq) ((irq) == IRQ_PORTF_INTA ? CONFIG_IRQ_PORTF_INTA : \
|
|
+ (irq) == IRQ_PORTG_INTA ? CONFIG_IRQ_PORTG_INTA : \
|
|
+ (irq) == IRQ_PORTH_INTA ? CONFIG_IRQ_PORTH_INTA : \
|
|
+ -1)
|
|
+#elif defined(CONFIG_BF561)
|
|
+#define PRIO_GPIODEMUX(irq) ((irq) == IRQ_PROG0_INTA ? CONFIG_IRQ_PROG0_INTA : \
|
|
+ (irq) == IRQ_PROG1_INTA ? CONFIG_IRQ_PROG1_INTA : \
|
|
+ (irq) == IRQ_PROG2_INTA ? CONFIG_IRQ_PROG2_INTA : \
|
|
+ -1)
|
|
#define bfin_write_TIMER_DISABLE(val) bfin_write_TMRS8_DISABLE(val)
|
|
#define bfin_write_TIMER_ENABLE(val) bfin_write_TMRS8_ENABLE(val)
|
|
#define bfin_write_TIMER_STATUS(val) bfin_write_TMRS8_STATUS(val)
|
|
#define bfin_read_TIMER_STATUS() bfin_read_TMRS8_STATUS()
|
|
#elif defined(CONFIG_BF54x)
|
|
+#define PRIO_GPIODEMUX(irq) ((irq) == IRQ_PINT0 ? CONFIG_IRQ_PINT0 : \
|
|
+ (irq) == IRQ_PINT1 ? CONFIG_IRQ_PINT1 : \
|
|
+ (irq) == IRQ_PINT2 ? CONFIG_IRQ_PINT2 : \
|
|
+ (irq) == IRQ_PINT3 ? CONFIG_IRQ_PINT3 : \
|
|
+ -1)
|
|
#define bfin_write_TIMER_DISABLE(val) bfin_write_TIMER_DISABLE0(val)
|
|
#define bfin_write_TIMER_ENABLE(val) bfin_write_TIMER_ENABLE0(val)
|
|
#define bfin_write_TIMER_STATUS(val) bfin_write_TIMER_STATUS0(val)
|
|
#define bfin_read_TIMER_STATUS(val) bfin_read_TIMER_STATUS0(val)
|
|
+#else
|
|
+# error "no PRIO_GPIODEMUX() for this part"
|
|
#endif
|
|
|
|
#define __ipipe_root_tick_p(regs) ((regs->ipend & 0x10) != 0)
|
|
@@ -245,6 +275,4 @@
|
|
|
|
#endif /* !CONFIG_IPIPE */
|
|
|
|
-#define ipipe_update_tick_evtdev(evtdev) do { } while (0)
|
|
-
|
|
#endif /* !__ASM_BLACKFIN_IPIPE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/irq.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/irq.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/irq.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/irq.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -61,38 +61,20 @@
|
|
#define raw_irqs_disabled_flags(flags) (!irqs_enabled_from_flags_hw(flags))
|
|
#define local_test_iflag_hw(x) irqs_enabled_from_flags_hw(x)
|
|
|
|
-#define local_save_flags(x) \
|
|
- do { \
|
|
- (x) = __ipipe_test_root() ? \
|
|
- __all_masked_irq_flags : bfin_irq_flags; \
|
|
- barrier(); \
|
|
- } while (0)
|
|
-
|
|
-#define local_irq_save(x) \
|
|
- do { \
|
|
- (x) = __ipipe_test_and_stall_root() ? \
|
|
+#define local_save_flags(x) \
|
|
+ do { \
|
|
+ (x) = __ipipe_test_root() ? \
|
|
__all_masked_irq_flags : bfin_irq_flags; \
|
|
- barrier(); \
|
|
} while (0)
|
|
|
|
-static inline void local_irq_restore(unsigned long x)
|
|
-{
|
|
- barrier();
|
|
- __ipipe_restore_root(x == __all_masked_irq_flags);
|
|
-}
|
|
-
|
|
-#define local_irq_disable() \
|
|
- do { \
|
|
- __ipipe_stall_root(); \
|
|
- barrier(); \
|
|
+#define local_irq_save(x) \
|
|
+ do { \
|
|
+ (x) = __ipipe_test_and_stall_root(); \
|
|
} while (0)
|
|
|
|
-static inline void local_irq_enable(void)
|
|
-{
|
|
- barrier();
|
|
- __ipipe_unstall_root();
|
|
-}
|
|
-
|
|
+#define local_irq_restore(x) __ipipe_restore_root(x)
|
|
+#define local_irq_disable() __ipipe_stall_root()
|
|
+#define local_irq_enable() __ipipe_unstall_root()
|
|
#define irqs_disabled() __ipipe_test_root()
|
|
|
|
#define local_save_flags_hw(x) \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/Kbuild linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/Kbuild
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/Kbuild 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/Kbuild 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,4 +1,3 @@
|
|
include include/asm-generic/Kbuild.asm
|
|
|
|
-unifdef-y += bfin_sport.h
|
|
unifdef-y += fixed_code.h
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/kgdb.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/kgdb.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/kgdb.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/kgdb.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,8 +1,32 @@
|
|
-/* Blackfin KGDB header
|
|
+/*
|
|
+ * File: include/asm-blackfin/kgdb.h
|
|
+ * Based on:
|
|
+ * Author: Sonic Zhang
|
|
+ *
|
|
+ * Created:
|
|
+ * Description:
|
|
+ *
|
|
+ * Rev: $Id: kgdb_bfin_linux-2.6.x.patch 4934 2007-02-13 09:32:11Z sonicz $
|
|
+ *
|
|
+ * Modified:
|
|
+ * Copyright 2005-2006 Analog Devices Inc.
|
|
+ *
|
|
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
*
|
|
- * Copyright 2005-2009 Analog Devices Inc.
|
|
+ * 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.
|
|
*
|
|
- * Licensed under the GPL-2 or later.
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, see the file COPYING, or write
|
|
+ * to the Free Software Foundation, Inc.,
|
|
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef __ASM_BLACKFIN_KGDB_H__
|
|
@@ -13,18 +37,17 @@
|
|
/* gdb locks */
|
|
#define KGDB_MAX_NO_CPUS 8
|
|
|
|
-/*
|
|
- * BUFMAX defines the maximum number of characters in inbound/outbound buffers.
|
|
- * At least NUMREGBYTES*2 are needed for register packets.
|
|
- * Longer buffer is needed to list all threads.
|
|
- */
|
|
+/************************************************************************/
|
|
+/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
|
|
+/* at least NUMREGBYTES*2 are needed for register packets */
|
|
+/* Longer buffer is needed to list all threads */
|
|
#define BUFMAX 2048
|
|
|
|
/*
|
|
- * Note that this register image is different from
|
|
- * the register image that Linux produces at interrupt time.
|
|
- *
|
|
- * Linux's register image is defined by struct pt_regs in ptrace.h.
|
|
+ * Note that this register image is different from
|
|
+ * the register image that Linux produces at interrupt time.
|
|
+ *
|
|
+ * Linux's register image is defined by struct pt_regs in ptrace.h.
|
|
*/
|
|
enum regnames {
|
|
/* Core Registers */
|
|
@@ -81,14 +104,14 @@
|
|
BFIN_RETX,
|
|
BFIN_RETN,
|
|
BFIN_RETE,
|
|
-
|
|
+
|
|
/* Pseudo Registers */
|
|
BFIN_PC,
|
|
BFIN_CC,
|
|
BFIN_EXTRA1, /* Address of .text section. */
|
|
BFIN_EXTRA2, /* Address of .data section. */
|
|
BFIN_EXTRA3, /* Address of .bss section. */
|
|
- BFIN_FDPIC_EXEC,
|
|
+ BFIN_FDPIC_EXEC,
|
|
BFIN_FDPIC_INTERP,
|
|
|
|
/* MMRs */
|
|
@@ -103,7 +126,7 @@
|
|
|
|
static inline void arch_kgdb_breakpoint(void)
|
|
{
|
|
- asm("EXCPT 2;");
|
|
+ asm(" EXCPT 2;");
|
|
}
|
|
#define BREAK_INSTR_SIZE 2
|
|
#define CACHE_FLUSH_IS_SAFE 1
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/mem_init.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/mem_init.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/mem_init.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/mem_init.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -115,7 +115,7 @@
|
|
#define mem_SDRRC (((CONFIG_SCLK_HZ / 1000) * SDRAM_Tref) / SDRAM_NRA) - (SDRAM_tRAS_num + SDRAM_tRP_num)
|
|
|
|
/* Enable SCLK Out */
|
|
-#define mem_SDGCTL (SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR | PSS)
|
|
+#define mem_SDGCTL (0x80000000 | SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR | PSS)
|
|
#else
|
|
#define mem_SDRRC CONFIG_MEM_SDRRC
|
|
#define mem_SDGCTL CONFIG_MEM_SDGCTL
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/pda.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/pda.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/pda.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/pda.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -59,7 +59,6 @@
|
|
unsigned long icplb_fault_addr;
|
|
unsigned long retx;
|
|
unsigned long seqstat;
|
|
- unsigned int __nmi_count; /* number of times NMI asserted on this CPU */
|
|
};
|
|
|
|
extern struct blackfin_pda cpu_pda[];
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/reboot.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/reboot.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/reboot.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/reboot.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -15,6 +15,6 @@
|
|
extern void native_machine_power_off(void);
|
|
|
|
/* common reboot workarounds */
|
|
-extern void bfin_reset_boot_spi_cs(unsigned short pin);
|
|
+extern void bfin_gpio_reset_spi0_ssel1(void);
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/include/asm/thread_info.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/thread_info.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/include/asm/thread_info.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/thread_info.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -122,7 +122,6 @@
|
|
#define TIF_MEMDIE 4
|
|
#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */
|
|
#define TIF_FREEZE 6 /* is freezing for suspend */
|
|
-#define TIF_IRQ_SYNC 7 /* sync pipeline stage */
|
|
|
|
/* as above, but as bit values */
|
|
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
|
|
@@ -131,7 +130,6 @@
|
|
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
|
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
|
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
|
-#define _TIF_IRQ_SYNC (1<<TIF_IRQ_SYNC)
|
|
|
|
#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/Kconfig linux-2.6.29-rc3.owrt/arch/blackfin/Kconfig
|
|
--- linux-2.6.29.owrt/arch/blackfin/Kconfig 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -169,51 +169,26 @@
|
|
help
|
|
BF542 Processor Support.
|
|
|
|
-config BF542M
|
|
- bool "BF542m"
|
|
- help
|
|
- BF542 Processor Support.
|
|
-
|
|
config BF544
|
|
bool "BF544"
|
|
help
|
|
BF544 Processor Support.
|
|
|
|
-config BF544M
|
|
- bool "BF544m"
|
|
- help
|
|
- BF544 Processor Support.
|
|
-
|
|
config BF547
|
|
bool "BF547"
|
|
help
|
|
BF547 Processor Support.
|
|
|
|
-config BF547M
|
|
- bool "BF547m"
|
|
- help
|
|
- BF547 Processor Support.
|
|
-
|
|
config BF548
|
|
bool "BF548"
|
|
help
|
|
BF548 Processor Support.
|
|
|
|
-config BF548M
|
|
- bool "BF548m"
|
|
- help
|
|
- BF548 Processor Support.
|
|
-
|
|
config BF549
|
|
bool "BF549"
|
|
help
|
|
BF549 Processor Support.
|
|
|
|
-config BF549M
|
|
- bool "BF549m"
|
|
- help
|
|
- BF549 Processor Support.
|
|
-
|
|
config BF561
|
|
bool "BF561"
|
|
help
|
|
@@ -249,39 +224,39 @@
|
|
|
|
config BF_REV_MIN
|
|
int
|
|
- default 0 if (BF51x || BF52x || (BF54x && !BF54xM))
|
|
+ default 0 if (BF51x || BF52x || BF54x)
|
|
default 2 if (BF537 || BF536 || BF534)
|
|
- default 3 if (BF561 || BF533 || BF532 || BF531 || BF54xM)
|
|
+ default 3 if (BF561 ||BF533 || BF532 || BF531)
|
|
default 4 if (BF538 || BF539)
|
|
|
|
config BF_REV_MAX
|
|
int
|
|
- default 2 if (BF51x || BF52x || (BF54x && !BF54xM))
|
|
- default 3 if (BF537 || BF536 || BF534 || BF54xM)
|
|
+ default 2 if (BF51x || BF52x || BF54x)
|
|
+ default 3 if (BF537 || BF536 || BF534)
|
|
default 5 if (BF561 || BF538 || BF539)
|
|
default 6 if (BF533 || BF532 || BF531)
|
|
|
|
choice
|
|
prompt "Silicon Rev"
|
|
- default BF_REV_0_1 if (BF51x || BF52x || (BF54x && !BF54xM))
|
|
+ default BF_REV_0_1 if (BF51x || BF52x || BF54x)
|
|
default BF_REV_0_2 if (BF534 || BF536 || BF537)
|
|
- default BF_REV_0_3 if (BF531 || BF532 || BF533 || BF54xM || BF561)
|
|
+ default BF_REV_0_3 if (BF531 || BF532 || BF533 || BF561)
|
|
|
|
config BF_REV_0_0
|
|
bool "0.0"
|
|
- depends on (BF51x || BF52x || (BF54x && !BF54xM))
|
|
+ depends on (BF51x || BF52x || BF54x)
|
|
|
|
config BF_REV_0_1
|
|
bool "0.1"
|
|
- depends on (BF52x || (BF54x && !BF54xM))
|
|
+ depends on (BF52x || BF54x)
|
|
|
|
config BF_REV_0_2
|
|
bool "0.2"
|
|
- depends on (BF52x || BF537 || BF536 || BF534 || (BF54x && !BF54xM))
|
|
+ depends on (BF52x || BF537 || BF536 || BF534 || BF54x)
|
|
|
|
config BF_REV_0_3
|
|
bool "0.3"
|
|
- depends on (BF54xM || BF561 || BF537 || BF536 || BF534 || BF533 || BF532 || BF531)
|
|
+ depends on (BF561 || BF537 || BF536 || BF534 || BF533 || BF532 || BF531)
|
|
|
|
config BF_REV_0_4
|
|
bool "0.4"
|
|
@@ -318,14 +293,9 @@
|
|
depends on (BF531 || BF532 || BF533 || BF534 || BF536 || BF537)
|
|
default y
|
|
|
|
-config BF54xM
|
|
- bool
|
|
- depends on (BF542M || BF544M || BF547M || BF548M || BF549M)
|
|
- default y
|
|
-
|
|
config BF54x
|
|
bool
|
|
- depends on (BF542 || BF544 || BF547 || BF548 || BF549 || BF54xM)
|
|
+ depends on (BF542 || BF544 || BF547 || BF548 || BF549)
|
|
default y
|
|
|
|
config MEM_GENERIC_BOARD
|
|
@@ -1129,7 +1099,6 @@
|
|
|
|
config PM_WAKEUP_BY_GPIO
|
|
bool "Allow Wakeup from Standby by GPIO"
|
|
- depends on PM && !BF54x
|
|
|
|
config PM_WAKEUP_GPIO_NUMBER
|
|
int "GPIO number"
|
|
@@ -1169,12 +1138,6 @@
|
|
default n
|
|
help
|
|
Enable General-Purpose Wake-Up (Voltage Regulator Power-Up)
|
|
- (all processors, except ADSP-BF549). This option sets
|
|
- the general-purpose wake-up enable (GPWE) control bit to enable
|
|
- wake-up upon detection of an active low signal on the /GPW (PH7) pin.
|
|
- On ADSP-BF549 this option enables the the same functionality on the
|
|
- /MRXON pin also PH7.
|
|
-
|
|
endmenu
|
|
|
|
menu "CPU Frequency scaling"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/Kconfig.debug linux-2.6.29-rc3.owrt/arch/blackfin/Kconfig.debug
|
|
--- linux-2.6.29.owrt/arch/blackfin/Kconfig.debug 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/Kconfig.debug 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,6 +21,12 @@
|
|
config HAVE_ARCH_KGDB
|
|
def_bool y
|
|
|
|
+config KGDB_TESTCASE
|
|
+ tristate "KGDB: for test case in expect"
|
|
+ default n
|
|
+ help
|
|
+ This is a kgdb test case for automated testing.
|
|
+
|
|
config DEBUG_VERBOSE
|
|
bool "Verbose fault messages"
|
|
default y
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/bfin_dma_5xx.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/bfin_dma_5xx.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/bfin_dma_5xx.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/bfin_dma_5xx.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -249,13 +249,6 @@
|
|
|
|
spin_lock_irqsave(&mdma_lock, flags);
|
|
|
|
- /* Force a sync in case a previous config reset on this channel
|
|
- * occurred. This is needed so subsequent writes to DMA registers
|
|
- * are not spuriously lost/corrupted. Do it under irq lock and
|
|
- * without the anomaly version (because we are atomic already).
|
|
- */
|
|
- __builtin_bfin_ssync();
|
|
-
|
|
if (bfin_read_MDMA_S0_CONFIG())
|
|
while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE))
|
|
continue;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/bfin_gpio.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/bfin_gpio.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/bfin_gpio.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/bfin_gpio.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -27,6 +27,59 @@
|
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
+/*
|
|
+* Number BF537/6/4 BF561 BF533/2/1 BF549/8/4/2
|
|
+*
|
|
+* GPIO_0 PF0 PF0 PF0 PA0...PJ13
|
|
+* GPIO_1 PF1 PF1 PF1
|
|
+* GPIO_2 PF2 PF2 PF2
|
|
+* GPIO_3 PF3 PF3 PF3
|
|
+* GPIO_4 PF4 PF4 PF4
|
|
+* GPIO_5 PF5 PF5 PF5
|
|
+* GPIO_6 PF6 PF6 PF6
|
|
+* GPIO_7 PF7 PF7 PF7
|
|
+* GPIO_8 PF8 PF8 PF8
|
|
+* GPIO_9 PF9 PF9 PF9
|
|
+* GPIO_10 PF10 PF10 PF10
|
|
+* GPIO_11 PF11 PF11 PF11
|
|
+* GPIO_12 PF12 PF12 PF12
|
|
+* GPIO_13 PF13 PF13 PF13
|
|
+* GPIO_14 PF14 PF14 PF14
|
|
+* GPIO_15 PF15 PF15 PF15
|
|
+* GPIO_16 PG0 PF16
|
|
+* GPIO_17 PG1 PF17
|
|
+* GPIO_18 PG2 PF18
|
|
+* GPIO_19 PG3 PF19
|
|
+* GPIO_20 PG4 PF20
|
|
+* GPIO_21 PG5 PF21
|
|
+* GPIO_22 PG6 PF22
|
|
+* GPIO_23 PG7 PF23
|
|
+* GPIO_24 PG8 PF24
|
|
+* GPIO_25 PG9 PF25
|
|
+* GPIO_26 PG10 PF26
|
|
+* GPIO_27 PG11 PF27
|
|
+* GPIO_28 PG12 PF28
|
|
+* GPIO_29 PG13 PF29
|
|
+* GPIO_30 PG14 PF30
|
|
+* GPIO_31 PG15 PF31
|
|
+* GPIO_32 PH0 PF32
|
|
+* GPIO_33 PH1 PF33
|
|
+* GPIO_34 PH2 PF34
|
|
+* GPIO_35 PH3 PF35
|
|
+* GPIO_36 PH4 PF36
|
|
+* GPIO_37 PH5 PF37
|
|
+* GPIO_38 PH6 PF38
|
|
+* GPIO_39 PH7 PF39
|
|
+* GPIO_40 PH8 PF40
|
|
+* GPIO_41 PH9 PF41
|
|
+* GPIO_42 PH10 PF42
|
|
+* GPIO_43 PH11 PF43
|
|
+* GPIO_44 PH12 PF44
|
|
+* GPIO_45 PH13 PF45
|
|
+* GPIO_46 PH14 PF46
|
|
+* GPIO_47 PH15 PF47
|
|
+*/
|
|
+
|
|
#include <linux/delay.h>
|
|
#include <linux/module.h>
|
|
#include <linux/err.h>
|
|
@@ -66,61 +119,62 @@
|
|
#define AWA_DUMMY_READ(...) do { } while (0)
|
|
#endif
|
|
|
|
-static struct gpio_port_t * const gpio_array[] = {
|
|
#if defined(BF533_FAMILY) || defined(BF538_FAMILY)
|
|
+static struct gpio_port_t *gpio_bankb[] = {
|
|
(struct gpio_port_t *) FIO_FLAG_D,
|
|
-#elif defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
|
+static struct gpio_port_t *gpio_bankb[] = {
|
|
(struct gpio_port_t *) PORTFIO,
|
|
(struct gpio_port_t *) PORTGIO,
|
|
(struct gpio_port_t *) PORTHIO,
|
|
-#elif defined(BF561_FAMILY)
|
|
- (struct gpio_port_t *) FIO0_FLAG_D,
|
|
- (struct gpio_port_t *) FIO1_FLAG_D,
|
|
- (struct gpio_port_t *) FIO2_FLAG_D,
|
|
-#elif defined(BF548_FAMILY)
|
|
- (struct gpio_port_t *)PORTA_FER,
|
|
- (struct gpio_port_t *)PORTB_FER,
|
|
- (struct gpio_port_t *)PORTC_FER,
|
|
- (struct gpio_port_t *)PORTD_FER,
|
|
- (struct gpio_port_t *)PORTE_FER,
|
|
- (struct gpio_port_t *)PORTF_FER,
|
|
- (struct gpio_port_t *)PORTG_FER,
|
|
- (struct gpio_port_t *)PORTH_FER,
|
|
- (struct gpio_port_t *)PORTI_FER,
|
|
- (struct gpio_port_t *)PORTJ_FER,
|
|
-#else
|
|
-# error no gpio arrays defined
|
|
-#endif
|
|
};
|
|
|
|
-#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
|
-static unsigned short * const port_fer[] = {
|
|
+static unsigned short *port_fer[] = {
|
|
(unsigned short *) PORTF_FER,
|
|
(unsigned short *) PORTG_FER,
|
|
(unsigned short *) PORTH_FER,
|
|
};
|
|
+#endif
|
|
|
|
-# if !defined(BF537_FAMILY)
|
|
-static unsigned short * const port_mux[] = {
|
|
+#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
|
+static unsigned short *port_mux[] = {
|
|
(unsigned short *) PORTF_MUX,
|
|
(unsigned short *) PORTG_MUX,
|
|
(unsigned short *) PORTH_MUX,
|
|
};
|
|
|
|
static const
|
|
-u8 pmux_offset[][16] = {
|
|
-# if defined(BF527_FAMILY)
|
|
- { 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 4, 6, 8, 8, 10, 10 }, /* PORTF */
|
|
- { 0, 0, 0, 0, 0, 2, 2, 4, 4, 6, 8, 10, 10, 10, 12, 12 }, /* PORTG */
|
|
- { 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 4, 4 }, /* PORTH */
|
|
-# elif defined(BF518_FAMILY)
|
|
- { 0, 2, 2, 2, 2, 2, 2, 4, 6, 6, 6, 8, 8, 8, 8, 10 }, /* PORTF */
|
|
- { 0, 0, 0, 2, 4, 6, 6, 6, 8, 10, 10, 12, 14, 14, 14, 14 }, /* PORTG */
|
|
- { 0, 0, 0, 0, 2, 2, 4, 6, 10, 10, 10, 10, 10, 10, 10, 10 }, /* PORTH */
|
|
-# endif
|
|
+u8 pmux_offset[][16] =
|
|
+ {{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 4, 6, 8, 8, 10, 10 }, /* PORTF */
|
|
+ { 0, 0, 0, 0, 0, 2, 2, 4, 4, 6, 8, 10, 10, 10, 12, 12 }, /* PORTG */
|
|
+ { 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 4, 4 }, /* PORTH */
|
|
+ };
|
|
+#endif
|
|
+
|
|
+#ifdef BF561_FAMILY
|
|
+static struct gpio_port_t *gpio_bankb[] = {
|
|
+ (struct gpio_port_t *) FIO0_FLAG_D,
|
|
+ (struct gpio_port_t *) FIO1_FLAG_D,
|
|
+ (struct gpio_port_t *) FIO2_FLAG_D,
|
|
};
|
|
-# endif
|
|
+#endif
|
|
|
|
+#ifdef BF548_FAMILY
|
|
+static struct gpio_port_t *gpio_array[] = {
|
|
+ (struct gpio_port_t *)PORTA_FER,
|
|
+ (struct gpio_port_t *)PORTB_FER,
|
|
+ (struct gpio_port_t *)PORTC_FER,
|
|
+ (struct gpio_port_t *)PORTD_FER,
|
|
+ (struct gpio_port_t *)PORTE_FER,
|
|
+ (struct gpio_port_t *)PORTF_FER,
|
|
+ (struct gpio_port_t *)PORTG_FER,
|
|
+ (struct gpio_port_t *)PORTH_FER,
|
|
+ (struct gpio_port_t *)PORTI_FER,
|
|
+ (struct gpio_port_t *)PORTJ_FER,
|
|
+};
|
|
#endif
|
|
|
|
static unsigned short reserved_gpio_map[GPIO_BANK_NUM];
|
|
@@ -134,9 +188,35 @@
|
|
} str_ident[MAX_RESOURCES];
|
|
|
|
#if defined(CONFIG_PM)
|
|
+#if defined(CONFIG_BF54x)
|
|
+static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
|
|
+#else
|
|
+static unsigned short wakeup_map[GPIO_BANK_NUM];
|
|
+static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
|
|
static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
|
|
+
|
|
+#ifdef BF533_FAMILY
|
|
+static unsigned int sic_iwr_irqs[] = {IRQ_PROG_INTB};
|
|
+#endif
|
|
+
|
|
+#ifdef BF537_FAMILY
|
|
+static unsigned int sic_iwr_irqs[] = {IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX};
|
|
+#endif
|
|
+
|
|
+#ifdef BF538_FAMILY
|
|
+static unsigned int sic_iwr_irqs[] = {IRQ_PORTF_INTB};
|
|
#endif
|
|
|
|
+#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
|
+static unsigned int sic_iwr_irqs[] = {IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB};
|
|
+#endif
|
|
+
|
|
+#ifdef BF561_FAMILY
|
|
+static unsigned int sic_iwr_irqs[] = {IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB};
|
|
+#endif
|
|
+#endif
|
|
+#endif /* CONFIG_PM */
|
|
+
|
|
inline int check_gpio(unsigned gpio)
|
|
{
|
|
#if defined(BF548_FAMILY)
|
|
@@ -250,10 +330,9 @@
|
|
{.res = P_SPI0_SSEL3, .offset = 0},
|
|
};
|
|
|
|
-static void portmux_setup(unsigned short per)
|
|
+static void portmux_setup(unsigned short per, unsigned short function)
|
|
{
|
|
u16 y, offset, muxreg;
|
|
- u16 function = P_FUNCT2MUX(per);
|
|
|
|
for (y = 0; y < ARRAY_SIZE(port_mux_lut); y++) {
|
|
if (port_mux_lut[y].res == per) {
|
|
@@ -274,33 +353,30 @@
|
|
}
|
|
}
|
|
#elif defined(BF548_FAMILY)
|
|
-inline void portmux_setup(unsigned short per)
|
|
+inline void portmux_setup(unsigned short portno, unsigned short function)
|
|
{
|
|
u32 pmux;
|
|
- u16 ident = P_IDENT(per);
|
|
- u16 function = P_FUNCT2MUX(per);
|
|
|
|
- pmux = gpio_array[gpio_bank(ident)]->port_mux;
|
|
+ pmux = gpio_array[gpio_bank(portno)]->port_mux;
|
|
|
|
- pmux &= ~(0x3 << (2 * gpio_sub_n(ident)));
|
|
- pmux |= (function & 0x3) << (2 * gpio_sub_n(ident));
|
|
+ pmux &= ~(0x3 << (2 * gpio_sub_n(portno)));
|
|
+ pmux |= (function & 0x3) << (2 * gpio_sub_n(portno));
|
|
|
|
- gpio_array[gpio_bank(ident)]->port_mux = pmux;
|
|
+ gpio_array[gpio_bank(portno)]->port_mux = pmux;
|
|
}
|
|
|
|
-inline u16 get_portmux(unsigned short per)
|
|
+inline u16 get_portmux(unsigned short portno)
|
|
{
|
|
u32 pmux;
|
|
- u16 ident = P_IDENT(per);
|
|
|
|
- pmux = gpio_array[gpio_bank(ident)]->port_mux;
|
|
+ pmux = gpio_array[gpio_bank(portno)]->port_mux;
|
|
|
|
- return (pmux >> (2 * gpio_sub_n(ident)) & 0x3);
|
|
+ return (pmux >> (2 * gpio_sub_n(portno)) & 0x3);
|
|
}
|
|
#elif defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
|
-inline void portmux_setup(unsigned short per)
|
|
+inline void portmux_setup(unsigned short portno, unsigned short function)
|
|
{
|
|
- u16 pmux, ident = P_IDENT(per), function = P_FUNCT2MUX(per);
|
|
+ u16 pmux, ident = P_IDENT(portno);
|
|
u8 offset = pmux_offset[gpio_bank(ident)][gpio_sub_n(ident)];
|
|
|
|
pmux = *port_mux[gpio_bank(ident)];
|
|
@@ -348,71 +424,90 @@
|
|
unsigned long flags; \
|
|
local_irq_save_hw(flags); \
|
|
if (arg) \
|
|
- gpio_array[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
|
|
+ gpio_bankb[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
|
|
else \
|
|
- gpio_array[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
|
|
+ gpio_bankb[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
|
|
AWA_DUMMY_READ(name); \
|
|
local_irq_restore_hw(flags); \
|
|
} \
|
|
EXPORT_SYMBOL(set_gpio_ ## name);
|
|
|
|
-SET_GPIO(dir) /* set_gpio_dir() */
|
|
-SET_GPIO(inen) /* set_gpio_inen() */
|
|
-SET_GPIO(polar) /* set_gpio_polar() */
|
|
-SET_GPIO(edge) /* set_gpio_edge() */
|
|
-SET_GPIO(both) /* set_gpio_both() */
|
|
+SET_GPIO(dir)
|
|
+SET_GPIO(inen)
|
|
+SET_GPIO(polar)
|
|
+SET_GPIO(edge)
|
|
+SET_GPIO(both)
|
|
|
|
|
|
+#if ANOMALY_05000311 || ANOMALY_05000323
|
|
#define SET_GPIO_SC(name) \
|
|
void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
|
|
{ \
|
|
unsigned long flags; \
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) \
|
|
- local_irq_save_hw(flags); \
|
|
+ local_irq_save_hw(flags); \
|
|
if (arg) \
|
|
- gpio_array[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
|
|
+ gpio_bankb[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
|
|
else \
|
|
- gpio_array[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) { \
|
|
- AWA_DUMMY_READ(name); \
|
|
- local_irq_restore_hw(flags); \
|
|
- } \
|
|
+ gpio_bankb[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
|
|
+ AWA_DUMMY_READ(name); \
|
|
+ local_irq_restore_hw(flags); \
|
|
} \
|
|
EXPORT_SYMBOL(set_gpio_ ## name);
|
|
+#else
|
|
+#define SET_GPIO_SC(name) \
|
|
+void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
|
|
+{ \
|
|
+ if (arg) \
|
|
+ gpio_bankb[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
|
|
+ else \
|
|
+ gpio_bankb[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
|
|
+} \
|
|
+EXPORT_SYMBOL(set_gpio_ ## name);
|
|
+#endif
|
|
|
|
SET_GPIO_SC(maska)
|
|
SET_GPIO_SC(maskb)
|
|
SET_GPIO_SC(data)
|
|
|
|
+#if ANOMALY_05000311 || ANOMALY_05000323
|
|
void set_gpio_toggle(unsigned gpio)
|
|
{
|
|
unsigned long flags;
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323)
|
|
- local_irq_save_hw(flags);
|
|
- gpio_array[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) {
|
|
- AWA_DUMMY_READ(toggle);
|
|
- local_irq_restore_hw(flags);
|
|
- }
|
|
+ local_irq_save_hw(flags);
|
|
+ gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
|
|
+ AWA_DUMMY_READ(toggle);
|
|
+ local_irq_restore_hw(flags);
|
|
+}
|
|
+#else
|
|
+void set_gpio_toggle(unsigned gpio)
|
|
+{
|
|
+ gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
|
|
}
|
|
+#endif
|
|
EXPORT_SYMBOL(set_gpio_toggle);
|
|
|
|
|
|
/*Set current PORT date (16-bit word)*/
|
|
|
|
+#if ANOMALY_05000311 || ANOMALY_05000323
|
|
#define SET_GPIO_P(name) \
|
|
void set_gpiop_ ## name(unsigned gpio, unsigned short arg) \
|
|
{ \
|
|
unsigned long flags; \
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) \
|
|
- local_irq_save_hw(flags); \
|
|
- gpio_array[gpio_bank(gpio)]->name = arg; \
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) { \
|
|
- AWA_DUMMY_READ(name); \
|
|
- local_irq_restore_hw(flags); \
|
|
- } \
|
|
+ local_irq_save_hw(flags); \
|
|
+ gpio_bankb[gpio_bank(gpio)]->name = arg; \
|
|
+ AWA_DUMMY_READ(name); \
|
|
+ local_irq_restore_hw(flags); \
|
|
+} \
|
|
+EXPORT_SYMBOL(set_gpiop_ ## name);
|
|
+#else
|
|
+#define SET_GPIO_P(name) \
|
|
+void set_gpiop_ ## name(unsigned gpio, unsigned short arg) \
|
|
+{ \
|
|
+ gpio_bankb[gpio_bank(gpio)]->name = arg; \
|
|
} \
|
|
EXPORT_SYMBOL(set_gpiop_ ## name);
|
|
+#endif
|
|
|
|
SET_GPIO_P(data)
|
|
SET_GPIO_P(dir)
|
|
@@ -424,21 +519,27 @@
|
|
SET_GPIO_P(maskb)
|
|
|
|
/* Get a specific bit */
|
|
+#if ANOMALY_05000311 || ANOMALY_05000323
|
|
#define GET_GPIO(name) \
|
|
unsigned short get_gpio_ ## name(unsigned gpio) \
|
|
{ \
|
|
unsigned long flags; \
|
|
unsigned short ret; \
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) \
|
|
- local_irq_save_hw(flags); \
|
|
- ret = 0x01 & (gpio_array[gpio_bank(gpio)]->name >> gpio_sub_n(gpio)); \
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) { \
|
|
- AWA_DUMMY_READ(name); \
|
|
- local_irq_restore_hw(flags); \
|
|
- } \
|
|
+ local_irq_save_hw(flags); \
|
|
+ ret = 0x01 & (gpio_bankb[gpio_bank(gpio)]->name >> gpio_sub_n(gpio)); \
|
|
+ AWA_DUMMY_READ(name); \
|
|
+ local_irq_restore_hw(flags); \
|
|
return ret; \
|
|
} \
|
|
EXPORT_SYMBOL(get_gpio_ ## name);
|
|
+#else
|
|
+#define GET_GPIO(name) \
|
|
+unsigned short get_gpio_ ## name(unsigned gpio) \
|
|
+{ \
|
|
+ return (0x01 & (gpio_bankb[gpio_bank(gpio)]->name >> gpio_sub_n(gpio))); \
|
|
+} \
|
|
+EXPORT_SYMBOL(get_gpio_ ## name);
|
|
+#endif
|
|
|
|
GET_GPIO(data)
|
|
GET_GPIO(dir)
|
|
@@ -451,21 +552,27 @@
|
|
|
|
/*Get current PORT date (16-bit word)*/
|
|
|
|
+#if ANOMALY_05000311 || ANOMALY_05000323
|
|
#define GET_GPIO_P(name) \
|
|
unsigned short get_gpiop_ ## name(unsigned gpio) \
|
|
{ \
|
|
unsigned long flags; \
|
|
unsigned short ret; \
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) \
|
|
- local_irq_save_hw(flags); \
|
|
- ret = (gpio_array[gpio_bank(gpio)]->name); \
|
|
- if (ANOMALY_05000311 || ANOMALY_05000323) { \
|
|
- AWA_DUMMY_READ(name); \
|
|
- local_irq_restore_hw(flags); \
|
|
- } \
|
|
+ local_irq_save_hw(flags); \
|
|
+ ret = (gpio_bankb[gpio_bank(gpio)]->name); \
|
|
+ AWA_DUMMY_READ(name); \
|
|
+ local_irq_restore_hw(flags); \
|
|
return ret; \
|
|
} \
|
|
EXPORT_SYMBOL(get_gpiop_ ## name);
|
|
+#else
|
|
+#define GET_GPIO_P(name) \
|
|
+unsigned short get_gpiop_ ## name(unsigned gpio) \
|
|
+{ \
|
|
+ return (gpio_bankb[gpio_bank(gpio)]->name);\
|
|
+} \
|
|
+EXPORT_SYMBOL(get_gpiop_ ## name);
|
|
+#endif
|
|
|
|
GET_GPIO_P(data)
|
|
GET_GPIO_P(dir)
|
|
@@ -478,26 +585,6 @@
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
-
|
|
-static unsigned short wakeup_map[GPIO_BANK_NUM];
|
|
-static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
|
|
-
|
|
-static const unsigned int sic_iwr_irqs[] = {
|
|
-#if defined(BF533_FAMILY)
|
|
- IRQ_PROG_INTB
|
|
-#elif defined(BF537_FAMILY)
|
|
- IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX
|
|
-#elif defined(BF538_FAMILY)
|
|
- IRQ_PORTF_INTB
|
|
-#elif defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
|
- IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB
|
|
-#elif defined(BF561_FAMILY)
|
|
- IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB
|
|
-#else
|
|
-# error no SIC_IWR defined
|
|
-#endif
|
|
-};
|
|
-
|
|
/***********************************************************
|
|
*
|
|
* FUNCTIONS: Blackfin PM Setup API
|
|
@@ -582,18 +669,18 @@
|
|
mask = wakeup_map[gpio_bank(i)];
|
|
bank = gpio_bank(i);
|
|
|
|
- gpio_bank_saved[bank].maskb = gpio_array[bank]->maskb;
|
|
- gpio_array[bank]->maskb = 0;
|
|
+ gpio_bank_saved[bank].maskb = gpio_bankb[bank]->maskb;
|
|
+ gpio_bankb[bank]->maskb = 0;
|
|
|
|
if (mask) {
|
|
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
|
gpio_bank_saved[bank].fer = *port_fer[bank];
|
|
#endif
|
|
- gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
|
- gpio_bank_saved[bank].polar = gpio_array[bank]->polar;
|
|
- gpio_bank_saved[bank].dir = gpio_array[bank]->dir;
|
|
- gpio_bank_saved[bank].edge = gpio_array[bank]->edge;
|
|
- gpio_bank_saved[bank].both = gpio_array[bank]->both;
|
|
+ gpio_bank_saved[bank].inen = gpio_bankb[bank]->inen;
|
|
+ gpio_bank_saved[bank].polar = gpio_bankb[bank]->polar;
|
|
+ gpio_bank_saved[bank].dir = gpio_bankb[bank]->dir;
|
|
+ gpio_bank_saved[bank].edge = gpio_bankb[bank]->edge;
|
|
+ gpio_bank_saved[bank].both = gpio_bankb[bank]->both;
|
|
gpio_bank_saved[bank].reserved =
|
|
reserved_gpio_map[bank];
|
|
|
|
@@ -613,7 +700,7 @@
|
|
}
|
|
|
|
bfin_internal_set_wake(sic_iwr_irqs[bank], 1);
|
|
- gpio_array[bank]->maskb_set = wakeup_map[gpio_bank(i)];
|
|
+ gpio_bankb[bank]->maskb_set = wakeup_map[gpio_bank(i)];
|
|
}
|
|
}
|
|
|
|
@@ -634,18 +721,18 @@
|
|
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
|
*port_fer[bank] = gpio_bank_saved[bank].fer;
|
|
#endif
|
|
- gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
|
- gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
|
|
- gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
|
|
- gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
|
|
- gpio_array[bank]->both = gpio_bank_saved[bank].both;
|
|
+ gpio_bankb[bank]->inen = gpio_bank_saved[bank].inen;
|
|
+ gpio_bankb[bank]->dir = gpio_bank_saved[bank].dir;
|
|
+ gpio_bankb[bank]->polar = gpio_bank_saved[bank].polar;
|
|
+ gpio_bankb[bank]->edge = gpio_bank_saved[bank].edge;
|
|
+ gpio_bankb[bank]->both = gpio_bank_saved[bank].both;
|
|
|
|
reserved_gpio_map[bank] =
|
|
gpio_bank_saved[bank].reserved;
|
|
bfin_internal_set_wake(sic_iwr_irqs[bank], 0);
|
|
}
|
|
|
|
- gpio_array[bank]->maskb = gpio_bank_saved[bank].maskb;
|
|
+ gpio_bankb[bank]->maskb = gpio_bank_saved[bank].maskb;
|
|
}
|
|
AWA_DUMMY_READ(maskb);
|
|
}
|
|
@@ -658,21 +745,21 @@
|
|
bank = gpio_bank(i);
|
|
|
|
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
|
- gpio_bank_saved[bank].fer = *port_fer[bank];
|
|
+ gpio_bank_saved[bank].fer = *port_fer[bank];
|
|
#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
|
- gpio_bank_saved[bank].mux = *port_mux[bank];
|
|
+ gpio_bank_saved[bank].mux = *port_mux[bank];
|
|
#else
|
|
- if (bank == 0)
|
|
- gpio_bank_saved[bank].mux = bfin_read_PORT_MUX();
|
|
+ if (bank == 0)
|
|
+ gpio_bank_saved[bank].mux = bfin_read_PORT_MUX();
|
|
#endif
|
|
#endif
|
|
- gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
|
- gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
|
- gpio_bank_saved[bank].polar = gpio_array[bank]->polar;
|
|
- gpio_bank_saved[bank].dir = gpio_array[bank]->dir;
|
|
- gpio_bank_saved[bank].edge = gpio_array[bank]->edge;
|
|
- gpio_bank_saved[bank].both = gpio_array[bank]->both;
|
|
- gpio_bank_saved[bank].maska = gpio_array[bank]->maska;
|
|
+ gpio_bank_saved[bank].data = gpio_bankb[bank]->data;
|
|
+ gpio_bank_saved[bank].inen = gpio_bankb[bank]->inen;
|
|
+ gpio_bank_saved[bank].polar = gpio_bankb[bank]->polar;
|
|
+ gpio_bank_saved[bank].dir = gpio_bankb[bank]->dir;
|
|
+ gpio_bank_saved[bank].edge = gpio_bankb[bank]->edge;
|
|
+ gpio_bank_saved[bank].both = gpio_bankb[bank]->both;
|
|
+ gpio_bank_saved[bank].maska = gpio_bankb[bank]->maska;
|
|
}
|
|
|
|
AWA_DUMMY_READ(maska);
|
|
@@ -683,27 +770,27 @@
|
|
int i, bank;
|
|
|
|
for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
- bank = gpio_bank(i);
|
|
+ bank = gpio_bank(i);
|
|
|
|
#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
|
|
#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
|
|
- *port_mux[bank] = gpio_bank_saved[bank].mux;
|
|
+ *port_mux[bank] = gpio_bank_saved[bank].mux;
|
|
#else
|
|
- if (bank == 0)
|
|
- bfin_write_PORT_MUX(gpio_bank_saved[bank].mux);
|
|
+ if (bank == 0)
|
|
+ bfin_write_PORT_MUX(gpio_bank_saved[bank].mux);
|
|
#endif
|
|
- *port_fer[bank] = gpio_bank_saved[bank].fer;
|
|
+ *port_fer[bank] = gpio_bank_saved[bank].fer;
|
|
#endif
|
|
- gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
|
- gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
|
|
- gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
|
|
- gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
|
|
- gpio_array[bank]->both = gpio_bank_saved[bank].both;
|
|
+ gpio_bankb[bank]->inen = gpio_bank_saved[bank].inen;
|
|
+ gpio_bankb[bank]->dir = gpio_bank_saved[bank].dir;
|
|
+ gpio_bankb[bank]->polar = gpio_bank_saved[bank].polar;
|
|
+ gpio_bankb[bank]->edge = gpio_bank_saved[bank].edge;
|
|
+ gpio_bankb[bank]->both = gpio_bank_saved[bank].both;
|
|
|
|
- gpio_array[bank]->data_set = gpio_bank_saved[bank].data
|
|
- | gpio_bank_saved[bank].dir;
|
|
+ gpio_bankb[bank]->data_set = gpio_bank_saved[bank].data
|
|
+ | gpio_bank_saved[bank].dir;
|
|
|
|
- gpio_array[bank]->maska = gpio_bank_saved[bank].maska;
|
|
+ gpio_bankb[bank]->maska = gpio_bank_saved[bank].maska;
|
|
}
|
|
AWA_DUMMY_READ(maska);
|
|
}
|
|
@@ -730,12 +817,12 @@
|
|
for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
bank = gpio_bank(i);
|
|
|
|
- gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
|
|
- gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
|
|
- gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
|
- gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
|
- gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
|
- gpio_bank_saved[bank].dir = gpio_array[bank]->dir_set;
|
|
+ gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
|
|
+ gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
|
|
+ gpio_bank_saved[bank].data = gpio_array[bank]->port_data;
|
|
+ gpio_bank_saved[bank].data = gpio_array[bank]->port_data;
|
|
+ gpio_bank_saved[bank].inen = gpio_array[bank]->port_inen;
|
|
+ gpio_bank_saved[bank].dir = gpio_array[bank]->port_dir_set;
|
|
}
|
|
}
|
|
|
|
@@ -744,21 +831,21 @@
|
|
int i, bank;
|
|
|
|
for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
- bank = gpio_bank(i);
|
|
+ bank = gpio_bank(i);
|
|
|
|
- gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux;
|
|
- gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer;
|
|
- gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
|
- gpio_array[bank]->dir_set = gpio_bank_saved[bank].dir;
|
|
- gpio_array[bank]->data_set = gpio_bank_saved[bank].data
|
|
- | gpio_bank_saved[bank].dir;
|
|
+ gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux;
|
|
+ gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer;
|
|
+ gpio_array[bank]->port_inen = gpio_bank_saved[bank].inen;
|
|
+ gpio_array[bank]->port_dir_set = gpio_bank_saved[bank].dir;
|
|
+ gpio_array[bank]->port_set = gpio_bank_saved[bank].data
|
|
+ | gpio_bank_saved[bank].dir;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
unsigned short get_gpio_dir(unsigned gpio)
|
|
{
|
|
- return (0x01 & (gpio_array[gpio_bank(gpio)]->dir_clear >> gpio_sub_n(gpio)));
|
|
+ return (0x01 & (gpio_array[gpio_bank(gpio)]->port_dir_clear >> gpio_sub_n(gpio)));
|
|
}
|
|
EXPORT_SYMBOL(get_gpio_dir);
|
|
|
|
@@ -818,7 +905,9 @@
|
|
*/
|
|
|
|
#ifdef BF548_FAMILY
|
|
- if (!((per & P_MAYSHARE) && get_portmux(per) == P_FUNCT2MUX(per))) {
|
|
+ u16 funct = get_portmux(ident);
|
|
+
|
|
+ if (!((per & P_MAYSHARE) && (funct == P_FUNCT2MUX(per)))) {
|
|
#else
|
|
if (!(per & P_MAYSHARE)) {
|
|
#endif
|
|
@@ -842,7 +931,11 @@
|
|
anyway:
|
|
reserved_peri_map[gpio_bank(ident)] |= gpio_bit(ident);
|
|
|
|
- portmux_setup(per);
|
|
+#ifdef BF548_FAMILY
|
|
+ portmux_setup(ident, P_FUNCT2MUX(per));
|
|
+#else
|
|
+ portmux_setup(per, P_FUNCT2MUX(per));
|
|
+#endif
|
|
port_setup(ident, PERIPHERAL_USAGE);
|
|
|
|
local_irq_restore_hw(flags);
|
|
@@ -884,6 +977,9 @@
|
|
if (!(per & P_DEFINED))
|
|
return;
|
|
|
|
+ if (check_gpio(ident) < 0)
|
|
+ return;
|
|
+
|
|
local_irq_save_hw(flags);
|
|
|
|
if (unlikely(!(reserved_peri_map[gpio_bank(ident)] & gpio_bit(ident)))) {
|
|
@@ -960,15 +1056,9 @@
|
|
local_irq_restore_hw(flags);
|
|
return -EBUSY;
|
|
}
|
|
- if (unlikely(reserved_gpio_irq_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
|
|
+ if (unlikely(reserved_gpio_irq_map[gpio_bank(gpio)] & gpio_bit(gpio)))
|
|
printk(KERN_NOTICE "bfin-gpio: GPIO %d is already reserved as gpio-irq!"
|
|
" (Documentation/blackfin/bfin-gpio-notes.txt)\n", gpio);
|
|
- }
|
|
-#ifndef BF548_FAMILY
|
|
- else { /* Reset POLAR setting when acquiring a gpio for the first time */
|
|
- set_gpio_polar(gpio, 0);
|
|
- }
|
|
-#endif
|
|
|
|
reserved_gpio_map[gpio_bank(gpio)] |= gpio_bit(gpio);
|
|
set_label(gpio, label);
|
|
@@ -988,8 +1078,6 @@
|
|
if (check_gpio(gpio) < 0)
|
|
return;
|
|
|
|
- might_sleep();
|
|
-
|
|
local_irq_save_hw(flags);
|
|
|
|
if (unlikely(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)))) {
|
|
@@ -1070,16 +1158,8 @@
|
|
local_irq_restore_hw(flags);
|
|
}
|
|
|
|
-static inline void __bfin_gpio_direction_input(unsigned gpio)
|
|
-{
|
|
-#ifdef BF548_FAMILY
|
|
- gpio_array[gpio_bank(gpio)]->dir_clear = gpio_bit(gpio);
|
|
-#else
|
|
- gpio_array[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
|
|
-#endif
|
|
- gpio_array[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
|
|
-}
|
|
|
|
+#ifdef BF548_FAMILY
|
|
int bfin_gpio_direction_input(unsigned gpio)
|
|
{
|
|
unsigned long flags;
|
|
@@ -1090,85 +1170,125 @@
|
|
}
|
|
|
|
local_irq_save_hw(flags);
|
|
- __bfin_gpio_direction_input(gpio);
|
|
- AWA_DUMMY_READ(inen);
|
|
+ gpio_array[gpio_bank(gpio)]->port_dir_clear = gpio_bit(gpio);
|
|
+ gpio_array[gpio_bank(gpio)]->port_inen |= gpio_bit(gpio);
|
|
local_irq_restore_hw(flags);
|
|
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL(bfin_gpio_direction_input);
|
|
|
|
-void bfin_gpio_irq_prepare(unsigned gpio)
|
|
+int bfin_gpio_direction_output(unsigned gpio, int value)
|
|
{
|
|
-#ifdef BF548_FAMILY
|
|
unsigned long flags;
|
|
-#endif
|
|
|
|
- port_setup(gpio, GPIO_USAGE);
|
|
+ if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
|
|
+ gpio_error(gpio);
|
|
+ return -EINVAL;
|
|
+ }
|
|
|
|
-#ifdef BF548_FAMILY
|
|
local_irq_save_hw(flags);
|
|
- __bfin_gpio_direction_input(gpio);
|
|
+ gpio_array[gpio_bank(gpio)]->port_inen &= ~gpio_bit(gpio);
|
|
+ gpio_set_value(gpio, value);
|
|
+ gpio_array[gpio_bank(gpio)]->port_dir_set = gpio_bit(gpio);
|
|
local_irq_restore_hw(flags);
|
|
-#endif
|
|
+
|
|
+ return 0;
|
|
}
|
|
+EXPORT_SYMBOL(bfin_gpio_direction_output);
|
|
|
|
void bfin_gpio_set_value(unsigned gpio, int arg)
|
|
{
|
|
if (arg)
|
|
- gpio_array[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
|
|
+ gpio_array[gpio_bank(gpio)]->port_set = gpio_bit(gpio);
|
|
else
|
|
- gpio_array[gpio_bank(gpio)]->data_clear = gpio_bit(gpio);
|
|
+ gpio_array[gpio_bank(gpio)]->port_clear = gpio_bit(gpio);
|
|
}
|
|
EXPORT_SYMBOL(bfin_gpio_set_value);
|
|
|
|
-int bfin_gpio_direction_output(unsigned gpio, int value)
|
|
+int bfin_gpio_get_value(unsigned gpio)
|
|
+{
|
|
+ return (1 & (gpio_array[gpio_bank(gpio)]->port_data >> gpio_sub_n(gpio)));
|
|
+}
|
|
+EXPORT_SYMBOL(bfin_gpio_get_value);
|
|
+
|
|
+void bfin_gpio_irq_prepare(unsigned gpio)
|
|
{
|
|
unsigned long flags;
|
|
|
|
- if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
|
|
- gpio_error(gpio);
|
|
- return -EINVAL;
|
|
- }
|
|
+ port_setup(gpio, GPIO_USAGE);
|
|
|
|
local_irq_save_hw(flags);
|
|
-
|
|
- gpio_array[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
|
|
- gpio_set_value(gpio, value);
|
|
-#ifdef BF548_FAMILY
|
|
- gpio_array[gpio_bank(gpio)]->dir_set = gpio_bit(gpio);
|
|
-#else
|
|
- gpio_array[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
|
|
-#endif
|
|
-
|
|
- AWA_DUMMY_READ(dir);
|
|
+ gpio_array[gpio_bank(gpio)]->port_dir_clear = gpio_bit(gpio);
|
|
+ gpio_array[gpio_bank(gpio)]->port_inen |= gpio_bit(gpio);
|
|
local_irq_restore_hw(flags);
|
|
-
|
|
- return 0;
|
|
}
|
|
-EXPORT_SYMBOL(bfin_gpio_direction_output);
|
|
+
|
|
+#else
|
|
|
|
int bfin_gpio_get_value(unsigned gpio)
|
|
{
|
|
-#ifdef BF548_FAMILY
|
|
- return (1 & (gpio_array[gpio_bank(gpio)]->data >> gpio_sub_n(gpio)));
|
|
-#else
|
|
unsigned long flags;
|
|
+ int ret;
|
|
|
|
if (unlikely(get_gpio_edge(gpio))) {
|
|
- int ret;
|
|
local_irq_save_hw(flags);
|
|
set_gpio_edge(gpio, 0);
|
|
ret = get_gpio_data(gpio);
|
|
set_gpio_edge(gpio, 1);
|
|
local_irq_restore_hw(flags);
|
|
+
|
|
return ret;
|
|
} else
|
|
return get_gpio_data(gpio);
|
|
-#endif
|
|
}
|
|
EXPORT_SYMBOL(bfin_gpio_get_value);
|
|
|
|
+
|
|
+int bfin_gpio_direction_input(unsigned gpio)
|
|
+{
|
|
+ unsigned long flags;
|
|
+
|
|
+ if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
|
|
+ gpio_error(gpio);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ local_irq_save_hw(flags);
|
|
+ gpio_bankb[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
|
|
+ gpio_bankb[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
|
|
+ AWA_DUMMY_READ(inen);
|
|
+ local_irq_restore_hw(flags);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+EXPORT_SYMBOL(bfin_gpio_direction_input);
|
|
+
|
|
+int bfin_gpio_direction_output(unsigned gpio, int value)
|
|
+{
|
|
+ unsigned long flags;
|
|
+
|
|
+ if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
|
|
+ gpio_error(gpio);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ local_irq_save_hw(flags);
|
|
+ gpio_bankb[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
|
|
+
|
|
+ if (value)
|
|
+ gpio_bankb[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
|
|
+ else
|
|
+ gpio_bankb[gpio_bank(gpio)]->data_clear = gpio_bit(gpio);
|
|
+
|
|
+ gpio_bankb[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
|
|
+ AWA_DUMMY_READ(dir);
|
|
+ local_irq_restore_hw(flags);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+EXPORT_SYMBOL(bfin_gpio_direction_output);
|
|
+
|
|
/* If we are booting from SPI and our board lacks a strong enough pull up,
|
|
* the core can reset and execute the bootrom faster than the resistor can
|
|
* pull the signal logically high. To work around this (common) error in
|
|
@@ -1179,15 +1299,23 @@
|
|
* lives here as we need to force all the GPIO states w/out going through
|
|
* BUG() checks and such.
|
|
*/
|
|
-void bfin_reset_boot_spi_cs(unsigned short pin)
|
|
+void bfin_gpio_reset_spi0_ssel1(void)
|
|
{
|
|
- unsigned short gpio = P_IDENT(pin);
|
|
+ u16 gpio = P_IDENT(P_SPI0_SSEL1);
|
|
+
|
|
port_setup(gpio, GPIO_USAGE);
|
|
- gpio_array[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
|
|
+ gpio_bankb[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
|
|
AWA_DUMMY_READ(data_set);
|
|
udelay(1);
|
|
}
|
|
|
|
+void bfin_gpio_irq_prepare(unsigned gpio)
|
|
+{
|
|
+ port_setup(gpio, GPIO_USAGE);
|
|
+}
|
|
+
|
|
+#endif /*BF548_FAMILY */
|
|
+
|
|
#if defined(CONFIG_PROC_FS)
|
|
static int gpio_proc_read(char *buf, char **start, off_t offset,
|
|
int len, int *unused_i, void *unused_v)
|
|
@@ -1241,7 +1369,11 @@
|
|
|
|
void bfin_gpiolib_set_value(struct gpio_chip *chip, unsigned gpio, int value)
|
|
{
|
|
+#ifdef BF548_FAMILY
|
|
return bfin_gpio_set_value(gpio, value);
|
|
+#else
|
|
+ return set_gpio_data(gpio, value);
|
|
+#endif
|
|
}
|
|
|
|
int bfin_gpiolib_gpio_request(struct gpio_chip *chip, unsigned gpio)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/cplb-mpu/cplbinit.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-mpu/cplbinit.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/cplb-mpu/cplbinit.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-mpu/cplbinit.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -63,8 +63,10 @@
|
|
dcplb_tbl[cpu][i_d].addr = 0;
|
|
dcplb_tbl[cpu][i_d++].data = SDRAM_OOPS | PAGE_SIZE_1KB;
|
|
|
|
+#if 0
|
|
icplb_tbl[cpu][i_i].addr = 0;
|
|
- icplb_tbl[cpu][i_i++].data = i_cache | CPLB_USER_RD | PAGE_SIZE_1KB;
|
|
+ icplb_tbl[cpu][i_i++].data = i_cache | CPLB_USER_RD | PAGE_SIZE_4KB;
|
|
+#endif
|
|
|
|
/* Cover kernel memory with 4M pages. */
|
|
addr = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/cplb-nompu/cplbinit.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-nompu/cplbinit.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/cplb-nompu/cplbinit.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-nompu/cplbinit.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -53,13 +53,9 @@
|
|
|
|
i_d = i_i = 0;
|
|
|
|
-#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
|
|
/* Set up the zero page. */
|
|
d_tbl[i_d].addr = 0;
|
|
d_tbl[i_d++].data = SDRAM_OOPS | PAGE_SIZE_1KB;
|
|
- i_tbl[i_i].addr = 0;
|
|
- i_tbl[i_i++].data = SDRAM_OOPS | PAGE_SIZE_1KB;
|
|
-#endif
|
|
|
|
/* Cover kernel memory with 4M pages. */
|
|
addr = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/cplb-nompu/cplbmgr.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-nompu/cplbmgr.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/cplb-nompu/cplbmgr.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-nompu/cplbmgr.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -163,14 +163,12 @@
|
|
nr_icplb_supv_miss[cpu]++;
|
|
|
|
base = 0;
|
|
- idx = 0;
|
|
- do {
|
|
+ for (idx = 0; idx < icplb_nr_bounds; idx++) {
|
|
eaddr = icplb_bounds[idx].eaddr;
|
|
if (addr < eaddr)
|
|
break;
|
|
base = eaddr;
|
|
- } while (++idx < icplb_nr_bounds);
|
|
-
|
|
+ }
|
|
if (unlikely(idx == icplb_nr_bounds))
|
|
return CPLB_NO_ADDR_MATCH;
|
|
|
|
@@ -210,14 +208,12 @@
|
|
nr_dcplb_supv_miss[cpu]++;
|
|
|
|
base = 0;
|
|
- idx = 0;
|
|
- do {
|
|
+ for (idx = 0; idx < dcplb_nr_bounds; idx++) {
|
|
eaddr = dcplb_bounds[idx].eaddr;
|
|
if (addr < eaddr)
|
|
break;
|
|
base = eaddr;
|
|
- } while (++idx < dcplb_nr_bounds);
|
|
-
|
|
+ }
|
|
if (unlikely(idx == dcplb_nr_bounds))
|
|
return CPLB_NO_ADDR_MATCH;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/ipipe.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/ipipe.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/ipipe.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/ipipe.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -35,8 +35,14 @@
|
|
#include <asm/atomic.h>
|
|
#include <asm/io.h>
|
|
|
|
+static int create_irq_threads;
|
|
+
|
|
DEFINE_PER_CPU(struct pt_regs, __ipipe_tick_regs);
|
|
|
|
+static DEFINE_PER_CPU(unsigned long, pending_irqthread_mask);
|
|
+
|
|
+static DEFINE_PER_CPU(int [IVG13 + 1], pending_irq_count);
|
|
+
|
|
asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs);
|
|
|
|
static void __ipipe_no_irqtail(void);
|
|
@@ -87,7 +93,6 @@
|
|
*/
|
|
void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)
|
|
{
|
|
- struct ipipe_percpu_domain_data *p = ipipe_root_cpudom_ptr();
|
|
struct ipipe_domain *this_domain, *next_domain;
|
|
struct list_head *head, *pos;
|
|
int m_ack, s = -1;
|
|
@@ -99,6 +104,7 @@
|
|
* interrupt.
|
|
*/
|
|
m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR);
|
|
+
|
|
this_domain = ipipe_current_domain;
|
|
|
|
if (unlikely(test_bit(IPIPE_STICKY_FLAG, &this_domain->irqs[irq].control)))
|
|
@@ -108,28 +114,49 @@
|
|
next_domain = list_entry(head, struct ipipe_domain, p_link);
|
|
if (likely(test_bit(IPIPE_WIRED_FLAG, &next_domain->irqs[irq].control))) {
|
|
if (!m_ack && next_domain->irqs[irq].acknowledge != NULL)
|
|
- next_domain->irqs[irq].acknowledge(irq, irq_to_desc(irq));
|
|
- if (test_bit(IPIPE_SYNCDEFER_FLAG, &p->status))
|
|
- s = __test_and_set_bit(IPIPE_STALL_FLAG, &p->status);
|
|
+ next_domain->irqs[irq].acknowledge(irq, irq_desc + irq);
|
|
+ if (test_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags))
|
|
+ s = __test_and_set_bit(IPIPE_STALL_FLAG,
|
|
+ &ipipe_root_cpudom_var(status));
|
|
__ipipe_dispatch_wired(next_domain, irq);
|
|
- goto out;
|
|
+ goto finalize;
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
/* Ack the interrupt. */
|
|
|
|
pos = head;
|
|
+
|
|
while (pos != &__ipipe_pipeline) {
|
|
next_domain = list_entry(pos, struct ipipe_domain, p_link);
|
|
+ /*
|
|
+ * For each domain handling the incoming IRQ, mark it
|
|
+ * as pending in its log.
|
|
+ */
|
|
if (test_bit(IPIPE_HANDLE_FLAG, &next_domain->irqs[irq].control)) {
|
|
+ /*
|
|
+ * Domains that handle this IRQ are polled for
|
|
+ * acknowledging it by decreasing priority
|
|
+ * order. The interrupt must be made pending
|
|
+ * _first_ in the domain's status flags before
|
|
+ * the PIC is unlocked.
|
|
+ */
|
|
__ipipe_set_irq_pending(next_domain, irq);
|
|
+
|
|
if (!m_ack && next_domain->irqs[irq].acknowledge != NULL) {
|
|
- next_domain->irqs[irq].acknowledge(irq, irq_to_desc(irq));
|
|
+ next_domain->irqs[irq].acknowledge(irq, irq_desc + irq);
|
|
m_ack = 1;
|
|
}
|
|
}
|
|
+
|
|
+ /*
|
|
+ * If the domain does not want the IRQ to be passed
|
|
+ * down the interrupt pipe, exit the loop now.
|
|
+ */
|
|
if (!test_bit(IPIPE_PASS_FLAG, &next_domain->irqs[irq].control))
|
|
break;
|
|
+
|
|
pos = next_domain->p_link.next;
|
|
}
|
|
|
|
@@ -139,24 +166,18 @@
|
|
* immediately to the current domain if the interrupt has been
|
|
* marked as 'sticky'. This search does not go beyond the
|
|
* current domain in the pipeline. We also enforce the
|
|
- * additional root stage lock (blackfin-specific).
|
|
- */
|
|
- if (test_bit(IPIPE_SYNCDEFER_FLAG, &p->status))
|
|
- s = __test_and_set_bit(IPIPE_STALL_FLAG, &p->status);
|
|
+ * additional root stage lock (blackfin-specific). */
|
|
|
|
- /*
|
|
- * If the interrupt preempted the head domain, then do not
|
|
- * even try to walk the pipeline, unless an interrupt is
|
|
- * pending for it.
|
|
- */
|
|
- if (test_bit(IPIPE_AHEAD_FLAG, &this_domain->flags) &&
|
|
- ipipe_head_cpudom_var(irqpend_himask) == 0)
|
|
- goto out;
|
|
+ if (test_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags))
|
|
+ s = __test_and_set_bit(IPIPE_STALL_FLAG,
|
|
+ &ipipe_root_cpudom_var(status));
|
|
+finalize:
|
|
|
|
__ipipe_walk_pipeline(head);
|
|
-out:
|
|
+
|
|
if (!s)
|
|
- __clear_bit(IPIPE_STALL_FLAG, &p->status);
|
|
+ __clear_bit(IPIPE_STALL_FLAG,
|
|
+ &ipipe_root_cpudom_var(status));
|
|
}
|
|
|
|
int __ipipe_check_root(void)
|
|
@@ -166,7 +187,7 @@
|
|
|
|
void __ipipe_enable_irqdesc(struct ipipe_domain *ipd, unsigned irq)
|
|
{
|
|
- struct irq_desc *desc = irq_to_desc(irq);
|
|
+ struct irq_desc *desc = irq_desc + irq;
|
|
int prio = desc->ic_prio;
|
|
|
|
desc->depth = 0;
|
|
@@ -178,7 +199,7 @@
|
|
|
|
void __ipipe_disable_irqdesc(struct ipipe_domain *ipd, unsigned irq)
|
|
{
|
|
- struct irq_desc *desc = irq_to_desc(irq);
|
|
+ struct irq_desc *desc = irq_desc + irq;
|
|
int prio = desc->ic_prio;
|
|
|
|
if (ipd != &ipipe_root &&
|
|
@@ -215,18 +236,15 @@
|
|
{
|
|
unsigned long flags;
|
|
|
|
- /*
|
|
- * We need to run the IRQ tail hook whenever we don't
|
|
+ /* We need to run the IRQ tail hook whenever we don't
|
|
* propagate a syscall to higher domains, because we know that
|
|
* important operations might be pending there (e.g. Xenomai
|
|
- * deferred rescheduling).
|
|
- */
|
|
+ * deferred rescheduling). */
|
|
|
|
- if (regs->orig_p0 < NR_syscalls) {
|
|
+ if (!__ipipe_syscall_watched_p(current, regs->orig_p0)) {
|
|
void (*hook)(void) = (void (*)(void))__ipipe_irq_tail_hook;
|
|
hook();
|
|
- if ((current->flags & PF_EVNOTIFY) == 0)
|
|
- return 0;
|
|
+ return 0;
|
|
}
|
|
|
|
/*
|
|
@@ -294,46 +312,112 @@
|
|
{
|
|
unsigned long flags;
|
|
|
|
-#ifdef CONFIG_IPIPE_DEBUG
|
|
if (irq >= IPIPE_NR_IRQS ||
|
|
(ipipe_virtual_irq_p(irq)
|
|
&& !test_bit(irq - IPIPE_VIRQ_BASE, &__ipipe_virtual_irq_map)))
|
|
return -EINVAL;
|
|
-#endif
|
|
|
|
local_irq_save_hw(flags);
|
|
+
|
|
__ipipe_handle_irq(irq, NULL);
|
|
+
|
|
local_irq_restore_hw(flags);
|
|
|
|
return 1;
|
|
}
|
|
|
|
-asmlinkage void __ipipe_sync_root(void)
|
|
+/* Move Linux IRQ to threads. */
|
|
+
|
|
+static int do_irqd(void *__desc)
|
|
{
|
|
- unsigned long flags;
|
|
+ struct irq_desc *desc = __desc;
|
|
+ unsigned irq = desc - irq_desc;
|
|
+ int thrprio = desc->thr_prio;
|
|
+ int thrmask = 1 << thrprio;
|
|
+ int cpu = smp_processor_id();
|
|
+ cpumask_t cpumask;
|
|
+
|
|
+ sigfillset(¤t->blocked);
|
|
+ current->flags |= PF_NOFREEZE;
|
|
+ cpumask = cpumask_of_cpu(cpu);
|
|
+ set_cpus_allowed(current, cpumask);
|
|
+ ipipe_setscheduler_root(current, SCHED_FIFO, 50 + thrprio);
|
|
+
|
|
+ while (!kthread_should_stop()) {
|
|
+ local_irq_disable();
|
|
+ if (!(desc->status & IRQ_SCHEDULED)) {
|
|
+ set_current_state(TASK_INTERRUPTIBLE);
|
|
+resched:
|
|
+ local_irq_enable();
|
|
+ schedule();
|
|
+ local_irq_disable();
|
|
+ }
|
|
+ __set_current_state(TASK_RUNNING);
|
|
+ /*
|
|
+ * If higher priority interrupt servers are ready to
|
|
+ * run, reschedule immediately. We need this for the
|
|
+ * GPIO demux IRQ handler to unmask the interrupt line
|
|
+ * _last_, after all GPIO IRQs have run.
|
|
+ */
|
|
+ if (per_cpu(pending_irqthread_mask, cpu) & ~(thrmask|(thrmask-1)))
|
|
+ goto resched;
|
|
+ if (--per_cpu(pending_irq_count[thrprio], cpu) == 0)
|
|
+ per_cpu(pending_irqthread_mask, cpu) &= ~thrmask;
|
|
+ desc->status &= ~IRQ_SCHEDULED;
|
|
+ desc->thr_handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs));
|
|
+ local_irq_enable();
|
|
+ }
|
|
+ __set_current_state(TASK_RUNNING);
|
|
+ return 0;
|
|
+}
|
|
|
|
- BUG_ON(irqs_disabled());
|
|
+static void kick_irqd(unsigned irq, void *cookie)
|
|
+{
|
|
+ struct irq_desc *desc = irq_desc + irq;
|
|
+ int thrprio = desc->thr_prio;
|
|
+ int thrmask = 1 << thrprio;
|
|
+ int cpu = smp_processor_id();
|
|
+
|
|
+ if (!(desc->status & IRQ_SCHEDULED)) {
|
|
+ desc->status |= IRQ_SCHEDULED;
|
|
+ per_cpu(pending_irqthread_mask, cpu) |= thrmask;
|
|
+ ++per_cpu(pending_irq_count[thrprio], cpu);
|
|
+ wake_up_process(desc->thread);
|
|
+ }
|
|
+}
|
|
|
|
- local_irq_save_hw(flags);
|
|
+int ipipe_start_irq_thread(unsigned irq, struct irq_desc *desc)
|
|
+{
|
|
+ if (desc->thread || !create_irq_threads)
|
|
+ return 0;
|
|
|
|
- clear_thread_flag(TIF_IRQ_SYNC);
|
|
+ desc->thread = kthread_create(do_irqd, desc, "IRQ %d", irq);
|
|
+ if (desc->thread == NULL) {
|
|
+ printk(KERN_ERR "irqd: could not create IRQ thread %d!\n", irq);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
|
|
- if (ipipe_root_cpudom_var(irqpend_himask) != 0)
|
|
- __ipipe_sync_pipeline(IPIPE_IRQMASK_ANY);
|
|
+ wake_up_process(desc->thread);
|
|
|
|
- local_irq_restore_hw(flags);
|
|
+ desc->thr_handler = ipipe_root_domain->irqs[irq].handler;
|
|
+ ipipe_root_domain->irqs[irq].handler = &kick_irqd;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
-void ___ipipe_sync_pipeline(unsigned long syncmask)
|
|
+void __init ipipe_init_irq_threads(void)
|
|
{
|
|
- struct ipipe_domain *ipd = ipipe_current_domain;
|
|
+ unsigned irq;
|
|
+ struct irq_desc *desc;
|
|
|
|
- if (ipd == ipipe_root_domain) {
|
|
- if (test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status)))
|
|
- return;
|
|
- }
|
|
+ create_irq_threads = 1;
|
|
|
|
- __ipipe_sync_stage(syncmask);
|
|
+ for (irq = 0; irq < NR_IRQS; irq++) {
|
|
+ desc = irq_desc + irq;
|
|
+ if (desc->action != NULL ||
|
|
+ (desc->status & IRQ_NOREQUEST) != 0)
|
|
+ ipipe_start_irq_thread(irq, desc);
|
|
+ }
|
|
}
|
|
|
|
EXPORT_SYMBOL(show_stack);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/irqchip.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/irqchip.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/irqchip.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/irqchip.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -35,7 +35,6 @@
|
|
#include <linux/interrupt.h>
|
|
#include <linux/irq.h>
|
|
#include <asm/trace.h>
|
|
-#include <asm/pda.h>
|
|
|
|
static atomic_t irq_err_count;
|
|
static spinlock_t irq_controller_lock;
|
|
@@ -92,13 +91,8 @@
|
|
seq_putc(p, '\n');
|
|
skip:
|
|
spin_unlock_irqrestore(&irq_desc[i].lock, flags);
|
|
- } else if (i == NR_IRQS) {
|
|
- seq_printf(p, "NMI: ");
|
|
- for_each_online_cpu(j)
|
|
- seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
|
|
- seq_printf(p, " CORE Non Maskable Interrupt\n");
|
|
+ } else if (i == NR_IRQS)
|
|
seq_printf(p, "Err: %10u\n", atomic_read(&irq_err_count));
|
|
- }
|
|
return 0;
|
|
}
|
|
|
|
@@ -144,15 +138,11 @@
|
|
#endif
|
|
generic_handle_irq(irq);
|
|
|
|
-#ifndef CONFIG_IPIPE
|
|
- /*
|
|
- * If we're the only interrupt running (ignoring IRQ15 which
|
|
- * is for syscalls), lower our priority to IRQ14 so that
|
|
- * softirqs run at that level. If there's another,
|
|
- * lower-level interrupt, irq_exit will defer softirqs to
|
|
- * that. If the interrupt pipeline is enabled, we are already
|
|
- * running at IRQ14 priority, so we don't need this code.
|
|
- */
|
|
+#ifndef CONFIG_IPIPE /* Useless and bugous over the I-pipe: IRQs are threaded. */
|
|
+ /* If we're the only interrupt running (ignoring IRQ15 which is for
|
|
+ syscalls), lower our priority to IRQ14 so that softirqs run at
|
|
+ that level. If there's another, lower-level interrupt, irq_exit
|
|
+ will defer softirqs to that. */
|
|
CSYNC();
|
|
pending = bfin_read_IPEND() & ~0x8000;
|
|
other_ints = pending & (pending - 1);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/kgdb_test.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/kgdb_test.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/kgdb_test.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/kgdb_test.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -20,7 +20,6 @@
|
|
static char cmdline[256];
|
|
static unsigned long len;
|
|
|
|
-#ifndef CONFIG_SMP
|
|
static int num1 __attribute__((l1_data));
|
|
|
|
void kgdb_l1_test(void) __attribute__((l1_text));
|
|
@@ -33,8 +32,6 @@
|
|
printk(KERN_ALERT "L1(after change) : data variable addr = 0x%p, data value is %d\n", &num1, num1);
|
|
return ;
|
|
}
|
|
-#endif
|
|
-
|
|
#if L2_LENGTH
|
|
|
|
static int num2 __attribute__((l2));
|
|
@@ -62,12 +59,10 @@
|
|
static int test_proc_output(char *buf)
|
|
{
|
|
kgdb_test("hello world!", 12, 0x55, 0x10);
|
|
-#ifndef CONFIG_SMP
|
|
kgdb_l1_test();
|
|
-#endif
|
|
-#if L2_LENGTH
|
|
+ #if L2_LENGTH
|
|
kgdb_l2_test();
|
|
-#endif
|
|
+ #endif
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/kernel/Makefile
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/Makefile 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,9 +21,5 @@
|
|
obj-$(CONFIG_CPLB_INFO) += cplbinfo.o
|
|
obj-$(CONFIG_MODULES) += module.o
|
|
obj-$(CONFIG_KGDB) += kgdb.o
|
|
-obj-$(CONFIG_KGDB_TESTS) += kgdb_test.o
|
|
+obj-$(CONFIG_KGDB_TESTCASE) += kgdb_test.o
|
|
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
|
-
|
|
-# the kgdb test puts code into L2 and without linker
|
|
-# relaxation, we need to force long calls to/from it
|
|
-CFLAGS_kgdb_test.o := -mlong-calls -O0
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/ptrace.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/ptrace.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/ptrace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/ptrace.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -45,7 +45,6 @@
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/dma.h>
|
|
#include <asm/fixed_code.h>
|
|
-#include <asm/cacheflush.h>
|
|
#include <asm/mem_map.h>
|
|
|
|
#define TEXT_OFFSET 0
|
|
@@ -241,7 +240,7 @@
|
|
|
|
} else if (addr >= FIXED_CODE_START
|
|
&& addr + sizeof(tmp) <= FIXED_CODE_END) {
|
|
- copy_from_user_page(0, 0, 0, &tmp, (const void *)(addr), sizeof(tmp));
|
|
+ memcpy(&tmp, (const void *)(addr), sizeof(tmp));
|
|
copied = sizeof(tmp);
|
|
|
|
} else
|
|
@@ -321,7 +320,7 @@
|
|
|
|
} else if (addr >= FIXED_CODE_START
|
|
&& addr + sizeof(data) <= FIXED_CODE_END) {
|
|
- copy_to_user_page(0, 0, 0, (void *)(addr), &data, sizeof(data));
|
|
+ memcpy((void *)(addr), &data, sizeof(data));
|
|
copied = sizeof(data);
|
|
|
|
} else
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/reboot.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/reboot.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/reboot.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/reboot.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -20,8 +20,8 @@
|
|
* reset while the Core B bit (on dual core parts) is cleared by
|
|
* the core reset.
|
|
*/
|
|
-__attribute__ ((__l1_text__, __noreturn__))
|
|
-static void bfin_reset(void)
|
|
+__attribute__((l1_text))
|
|
+static void _bfin_reset(void)
|
|
{
|
|
/* Wait for completion of "system" events such as cache line
|
|
* line fills so that we avoid infinite stalls later on as
|
|
@@ -30,11 +30,7 @@
|
|
*/
|
|
__builtin_bfin_ssync();
|
|
|
|
- /* The bootrom checks to see how it was reset and will
|
|
- * automatically perform a software reset for us when
|
|
- * it starts executing after the core reset.
|
|
- */
|
|
- if (ANOMALY_05000353 || ANOMALY_05000386) {
|
|
+ while (1) {
|
|
/* Initiate System software reset. */
|
|
bfin_write_SWRST(0x7);
|
|
|
|
@@ -54,11 +50,6 @@
|
|
/* Clear System software reset */
|
|
bfin_write_SWRST(0);
|
|
|
|
- /* The BF526 ROM will crash during reset */
|
|
-#if defined(__ADSPBF522__) || defined(__ADSPBF524__) || defined(__ADSPBF526__)
|
|
- bfin_read_SWRST();
|
|
-#endif
|
|
-
|
|
/* Wait for the SWRST write to complete. Cannot rely on SSYNC
|
|
* though as the System state is all reset now.
|
|
*/
|
|
@@ -69,11 +60,22 @@
|
|
: "a" (15 * 1)
|
|
: "LC1", "LB1", "LT1"
|
|
);
|
|
- }
|
|
|
|
- while (1)
|
|
/* Issue core reset */
|
|
asm("raise 1");
|
|
+ }
|
|
+}
|
|
+
|
|
+static void bfin_reset(void)
|
|
+{
|
|
+ if (ANOMALY_05000353 || ANOMALY_05000386)
|
|
+ _bfin_reset();
|
|
+ else
|
|
+ /* the bootrom checks to see how it was reset and will
|
|
+ * automatically perform a software reset for us when
|
|
+ * it starts executing boot
|
|
+ */
|
|
+ asm("raise 1;");
|
|
}
|
|
|
|
__attribute__((weak))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/setup.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/setup.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -60,7 +60,7 @@
|
|
#define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */
|
|
#define BFIN_MEMMAP_RAM 1
|
|
#define BFIN_MEMMAP_RESERVED 2
|
|
-static struct bfin_memmap {
|
|
+struct bfin_memmap {
|
|
int nr_map;
|
|
struct bfin_memmap_entry {
|
|
unsigned long long addr; /* start of memory segment */
|
|
@@ -824,15 +824,7 @@
|
|
flash_probe();
|
|
#endif
|
|
|
|
- printk(KERN_INFO "Boot Mode: %i\n", bfin_read_SYSCR() & 0xF);
|
|
-
|
|
- /* Newer parts mirror SWRST bits in SYSCR */
|
|
-#if defined(CONFIG_BF53x) || defined(CONFIG_BF561) || \
|
|
- defined(CONFIG_BF538) || defined(CONFIG_BF539)
|
|
_bfin_swrst = bfin_read_SWRST();
|
|
-#else
|
|
- _bfin_swrst = bfin_read_SYSCR();
|
|
-#endif
|
|
|
|
#ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT
|
|
bfin_write_SWRST(_bfin_swrst & ~DOUBLE_FAULT);
|
|
@@ -861,7 +853,7 @@
|
|
else if (_bfin_swrst & RESET_SOFTWARE)
|
|
printk(KERN_NOTICE "Reset caused by Software reset\n");
|
|
|
|
- printk(KERN_INFO "Blackfin support (C) 2004-2009 Analog Devices, Inc.\n");
|
|
+ printk(KERN_INFO "Blackfin support (C) 2004-2008 Analog Devices, Inc.\n");
|
|
if (bfin_compiled_revid() == 0xffff)
|
|
printk(KERN_INFO "Compiled for ADSP-%s Rev any\n", CPU);
|
|
else if (bfin_compiled_revid() == -1)
|
|
@@ -889,10 +881,6 @@
|
|
CPU, bfin_revid());
|
|
}
|
|
|
|
- /* We can't run on BF548-0.1 due to ANOMALY 05000448 */
|
|
- if (bfin_cpuid() == 0x27de && bfin_revid() == 1)
|
|
- panic("You can't run on this processor due to 05000448\n");
|
|
-
|
|
printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n");
|
|
|
|
printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n",
|
|
@@ -1145,12 +1133,12 @@
|
|
icache_size = 0;
|
|
|
|
seq_printf(m, "cache size\t: %d KB(L1 icache) "
|
|
- "%d KB(L1 dcache%s) %d KB(L2 cache)\n",
|
|
+ "%d KB(L1 dcache-%s) %d KB(L2 cache)\n",
|
|
icache_size, dcache_size,
|
|
#if defined CONFIG_BFIN_WB
|
|
- "-wb"
|
|
+ "wb"
|
|
#elif defined CONFIG_BFIN_WT
|
|
- "-wt"
|
|
+ "wt"
|
|
#endif
|
|
"", 0);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/time.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/time.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/time.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/time.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -134,10 +134,7 @@
|
|
|
|
write_seqlock(&xtime_lock);
|
|
#if defined(CONFIG_TICK_SOURCE_SYSTMR0) && !defined(CONFIG_IPIPE)
|
|
- /*
|
|
- * TIMIL0 is latched in __ipipe_grab_irq() when the I-Pipe is
|
|
- * enabled.
|
|
- */
|
|
+/* FIXME: Here TIMIL0 is not set when IPIPE enabled, why? */
|
|
if (get_gptimer_status(0) & TIMER_STATUS_TIMIL0) {
|
|
#endif
|
|
do_timer(1);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/kernel/traps.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/traps.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/kernel/traps.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/traps.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -673,14 +673,6 @@
|
|
verbose_printk("RTI");
|
|
else if (opcode == 0x0012)
|
|
verbose_printk("RTX");
|
|
- else if (opcode == 0x0013)
|
|
- verbose_printk("RTN");
|
|
- else if (opcode == 0x0014)
|
|
- verbose_printk("RTE");
|
|
- else if (opcode == 0x0025)
|
|
- verbose_printk("EMUEXCPT");
|
|
- else if (opcode == 0x0040 && opcode <= 0x0047)
|
|
- verbose_printk("STI R%i", opcode & 7);
|
|
else if (opcode >= 0x0050 && opcode <= 0x0057)
|
|
verbose_printk("JUMP (P%i)", opcode & 7);
|
|
else if (opcode >= 0x0060 && opcode <= 0x0067)
|
|
@@ -689,10 +681,6 @@
|
|
verbose_printk("CALL (PC+P%i)", opcode & 7);
|
|
else if (opcode >= 0x0080 && opcode <= 0x0087)
|
|
verbose_printk("JUMP (PC+P%i)", opcode & 7);
|
|
- else if (opcode >= 0x0090 && opcode <= 0x009F)
|
|
- verbose_printk("RAISE 0x%x", opcode & 0xF);
|
|
- else if (opcode >= 0x00A0 && opcode <= 0x00AF)
|
|
- verbose_printk("EXCPT 0x%x", opcode & 0xF);
|
|
else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF))
|
|
verbose_printk("IF !CC JUMP");
|
|
else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff))
|
|
@@ -832,8 +820,11 @@
|
|
decode_address(buf, (unsigned int)stack);
|
|
printk(KERN_NOTICE " SP: [0x%p] %s\n", stack, buf);
|
|
|
|
+ addr = (unsigned int *)((unsigned int)stack & ~0x3F);
|
|
+
|
|
/* First thing is to look for a frame pointer */
|
|
- for (addr = (unsigned int *)((unsigned int)stack & ~0xF); addr < endstack; addr++) {
|
|
+ for (addr = (unsigned int *)((unsigned int)stack & ~0xF), i = 0;
|
|
+ addr < endstack; addr++, i++) {
|
|
if (*addr & 0x1)
|
|
continue;
|
|
ins_addr = (unsigned short *)*addr;
|
|
@@ -843,8 +834,7 @@
|
|
|
|
if (fp) {
|
|
/* Let's check to see if it is a frame pointer */
|
|
- while (fp >= (addr - 1) && fp < endstack
|
|
- && fp && ((unsigned int) fp & 0x3) == 0)
|
|
+ while (fp >= (addr - 1) && fp < endstack && fp)
|
|
fp = (unsigned int *)*fp;
|
|
if (fp == 0 || fp == endstack) {
|
|
fp = addr - 1;
|
|
@@ -1062,9 +1052,8 @@
|
|
char buf [150];
|
|
struct irqaction *action;
|
|
unsigned int i;
|
|
- unsigned long flags = 0;
|
|
+ unsigned long flags;
|
|
unsigned int cpu = smp_processor_id();
|
|
- unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic();
|
|
|
|
verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted());
|
|
verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n",
|
|
@@ -1084,22 +1073,17 @@
|
|
}
|
|
verbose_printk(KERN_NOTICE " EXCAUSE : 0x%lx\n",
|
|
fp->seqstat & SEQSTAT_EXCAUSE);
|
|
- for (i = 2; i <= 15 ; i++) {
|
|
+ for (i = 6; i <= 15 ; i++) {
|
|
if (fp->ipend & (1 << i)) {
|
|
- if (i != 4) {
|
|
- decode_address(buf, bfin_read32(EVT0 + 4*i));
|
|
- verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf);
|
|
- } else
|
|
- verbose_printk(KERN_NOTICE " interrupts disabled\n");
|
|
+ decode_address(buf, bfin_read32(EVT0 + 4*i));
|
|
+ verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf);
|
|
}
|
|
}
|
|
|
|
/* if no interrupts are going off, don't print this out */
|
|
if (fp->ipend & ~0x3F) {
|
|
for (i = 0; i < (NR_IRQS - 1); i++) {
|
|
- if (!in_atomic)
|
|
- spin_lock_irqsave(&irq_desc[i].lock, flags);
|
|
-
|
|
+ spin_lock_irqsave(&irq_desc[i].lock, flags);
|
|
action = irq_desc[i].action;
|
|
if (!action)
|
|
goto unlock;
|
|
@@ -1112,8 +1096,7 @@
|
|
}
|
|
verbose_printk("\n");
|
|
unlock:
|
|
- if (!in_atomic)
|
|
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
|
|
+ spin_unlock_irqrestore(&irq_desc[i].lock, flags);
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf518/boards/ezbrd.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/boards/ezbrd.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf518/boards/ezbrd.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/boards/ezbrd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -46,7 +46,6 @@
|
|
#include <asm/dpmc.h>
|
|
#include <asm/bfin_sdh.h>
|
|
#include <linux/spi/ad7877.h>
|
|
-#include <net/dsa.h>
|
|
|
|
/*
|
|
* Name the Board for the /proc/cpuinfo
|
|
@@ -105,33 +104,10 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
-};
|
|
-
|
|
-#if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
|
|
-static struct dsa_platform_data ksz8893m_switch_data = {
|
|
- .mii_bus = &bfin_mii_bus.dev,
|
|
- .netdev = &bfin_mac_device.dev,
|
|
- .port_names[0] = NULL,
|
|
- .port_names[1] = "eth%d",
|
|
- .port_names[2] = "eth%d",
|
|
- .port_names[3] = "cpu",
|
|
-};
|
|
-
|
|
-static struct platform_device ksz8893m_switch_device = {
|
|
- .name = "dsa",
|
|
- .id = 0,
|
|
- .num_resources = 0,
|
|
- .dev.platform_data = &ksz8893m_switch_data,
|
|
};
|
|
#endif
|
|
-#endif
|
|
|
|
#if defined(CONFIG_MTD_M25P80) \
|
|
|| defined(CONFIG_MTD_M25P80_MODULE)
|
|
@@ -171,20 +147,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-#if defined(CONFIG_NET_DSA_KSZ8893M) \
|
|
- || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
|
|
-/* SPI SWITCH CHIP */
|
|
-static struct bfin5xx_spi_chip spi_switch_info = {
|
|
- .enable_dma = 0,
|
|
- .bits_per_word = 8,
|
|
-};
|
|
-#endif
|
|
-#endif
|
|
-
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -261,28 +226,23 @@
|
|
},
|
|
#endif
|
|
|
|
-#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-#if defined(CONFIG_NET_DSA_KSZ8893M) \
|
|
- || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
{
|
|
- .modalias = "ksz8893m",
|
|
- .max_speed_hz = 5000000,
|
|
+ .modalias = "spi_mmc_dummy",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 1,
|
|
+ .chip_select = 0,
|
|
.platform_data = NULL,
|
|
- .controller_data = &spi_switch_info,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
-#endif
|
|
-#endif
|
|
-
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc",
|
|
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
@@ -513,6 +473,7 @@
|
|
};
|
|
#endif
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|
#if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
|
{
|
|
@@ -526,6 +487,7 @@
|
|
},
|
|
#endif
|
|
};
|
|
+#endif
|
|
|
|
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
|
static struct platform_device bfin_sport0_uart_device = {
|
|
@@ -622,11 +584,7 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
-#if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
|
|
- &ksz8893m_switch_device,
|
|
-#endif
|
|
#endif
|
|
|
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
@@ -674,8 +632,12 @@
|
|
static int __init ezbrd_init(void)
|
|
{
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
+
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
i2c_register_board_info(0, bfin_i2c_board_info,
|
|
ARRAY_SIZE(bfin_i2c_board_info));
|
|
+#endif
|
|
+
|
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
|
return 0;
|
|
@@ -687,7 +649,7 @@
|
|
{
|
|
/* workaround reboot hang when booting from SPI */
|
|
if ((bfin_read_SYSCR() & 0x7) == 0x3)
|
|
- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
|
+ bfin_gpio_reset_spi0_ssel1();
|
|
}
|
|
|
|
void bfin_get_ether_addr(char *addr)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/anomaly.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/anomaly.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,12 +2,12 @@
|
|
* File: include/asm-blackfin/mach-bf518/anomaly.h
|
|
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
*
|
|
- * Copyright (C) 2004-2009 Analog Devices Inc.
|
|
+ * Copyright (C) 2004-2008 Analog Devices Inc.
|
|
* Licensed under the GPL-2 or later.
|
|
*/
|
|
|
|
/* This file shoule be up to date with:
|
|
- * - Revision B, 02/03/2009; ADSP-BF512/BF514/BF516/BF518 Blackfin Processor Anomaly List
|
|
+ * - ????
|
|
*/
|
|
|
|
#ifndef _MACH_ANOMALY_H_
|
|
@@ -19,8 +19,6 @@
|
|
#define ANOMALY_05000122 (1)
|
|
/* False Hardware Error from an Access in the Shadow of a Conditional Branch */
|
|
#define ANOMALY_05000245 (1)
|
|
-/* Incorrect Timer Pulse Width in Single-Shot PWM_OUT Mode with External Clock */
|
|
-#define ANOMALY_05000254 (1)
|
|
/* Sensitivity To Noise with Slow Input Edge Rates on External SPORT TX and RX Clocks */
|
|
#define ANOMALY_05000265 (1)
|
|
/* False Hardware Errors Caused by Fetches at the Boundary of Reserved Memory */
|
|
@@ -55,12 +53,6 @@
|
|
#define ANOMALY_05000443 (1)
|
|
/* Incorrect L1 Instruction Bank B Memory Map Location */
|
|
#define ANOMALY_05000444 (1)
|
|
-/* Incorrect Default Hysteresis Setting for RESET, NMI, and BMODE Signals */
|
|
-#define ANOMALY_05000452 (1)
|
|
-/* PWM_TRIPB Signal Not Available on PG10 */
|
|
-#define ANOMALY_05000453 (1)
|
|
-/* PPI_FS3 is Driven One Half Cycle Later Than PPI Data */
|
|
-#define ANOMALY_05000455 (1)
|
|
|
|
/* Anomalies that don't exist on this proc */
|
|
#define ANOMALY_05000125 (0)
|
|
@@ -73,20 +65,15 @@
|
|
#define ANOMALY_05000263 (0)
|
|
#define ANOMALY_05000266 (0)
|
|
#define ANOMALY_05000273 (0)
|
|
-#define ANOMALY_05000278 (0)
|
|
#define ANOMALY_05000285 (0)
|
|
-#define ANOMALY_05000305 (0)
|
|
#define ANOMALY_05000307 (0)
|
|
#define ANOMALY_05000311 (0)
|
|
#define ANOMALY_05000312 (0)
|
|
#define ANOMALY_05000323 (0)
|
|
#define ANOMALY_05000353 (0)
|
|
#define ANOMALY_05000363 (0)
|
|
-#define ANOMALY_05000380 (0)
|
|
#define ANOMALY_05000386 (0)
|
|
#define ANOMALY_05000412 (0)
|
|
#define ANOMALY_05000432 (0)
|
|
-#define ANOMALY_05000447 (0)
|
|
-#define ANOMALY_05000448 (0)
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -144,7 +144,7 @@
|
|
CH_UART0_TX,
|
|
CH_UART0_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART0_CTSRTS
|
|
CONFIG_UART0_CTS_PIN,
|
|
CONFIG_UART0_RTS_PIN,
|
|
#endif
|
|
@@ -158,7 +158,7 @@
|
|
CH_UART1_TX,
|
|
CH_UART1_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART1_CTSRTS
|
|
CONFIG_UART1_CTS_PIN,
|
|
CONFIG_UART1_RTS_PIN,
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/portmux.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/portmux.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -103,8 +103,6 @@
|
|
#define P_SPI1_SSEL4 (P_DEFINED | P_IDENT(GPIO_PF8) | P_FUNCT(2))
|
|
#define P_SPI1_SSEL5 (P_DEFINED | P_IDENT(GPIO_PG11) | P_FUNCT(2))
|
|
|
|
-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL2
|
|
-
|
|
/* SPORT Port Mux */
|
|
#define P_SPORT0_DRPRI (P_DEFINED | P_IDENT(GPIO_PG3) | P_FUNCT(0))
|
|
#define P_SPORT0_RSCLK (P_DEFINED | P_IDENT(GPIO_PG4) | P_FUNCT(0))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/cm_bf527.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/cm_bf527.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/cm_bf527.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/cm_bf527.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -403,13 +403,8 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
};
|
|
#endif
|
|
|
|
@@ -487,9 +482,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -585,13 +580,23 @@
|
|
.controller_data = &ad9960_spi_chip_info,
|
|
},
|
|
#endif
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
- .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .modalias = "spi_mmc_dummy",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = 0,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+ {
|
|
+ .modalias = "spi_mmc",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
@@ -788,6 +793,7 @@
|
|
};
|
|
#endif
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|
#if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
|
{
|
|
@@ -803,6 +809,7 @@
|
|
},
|
|
#endif
|
|
};
|
|
+#endif
|
|
|
|
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
|
static struct platform_device bfin_sport0_uart_device = {
|
|
@@ -913,7 +920,6 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
#endif
|
|
|
|
@@ -962,23 +968,27 @@
|
|
&bfin_gpios_device,
|
|
};
|
|
|
|
-static int __init cm_init(void)
|
|
+static int __init stamp_init(void)
|
|
{
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
+
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
i2c_register_board_info(0, bfin_i2c_board_info,
|
|
ARRAY_SIZE(bfin_i2c_board_info));
|
|
+#endif
|
|
+
|
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
|
return 0;
|
|
}
|
|
|
|
-arch_initcall(cm_init);
|
|
+arch_initcall(stamp_init);
|
|
|
|
void native_machine_restart(char *cmd)
|
|
{
|
|
/* workaround reboot hang when booting from SPI */
|
|
if ((bfin_read_SYSCR() & 0x7) == 0x3)
|
|
- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
|
+ bfin_gpio_reset_spi0_ssel1();
|
|
}
|
|
|
|
void bfin_get_ether_addr(char *addr)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/ezbrd.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/ezbrd.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/ezbrd.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/ezbrd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -208,13 +208,8 @@
|
|
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
};
|
|
#endif
|
|
|
|
@@ -256,9 +251,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -366,13 +361,23 @@
|
|
},
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc_dummy",
|
|
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = 0,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+ {
|
|
+ .modalias = "spi_mmc",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
@@ -585,6 +590,7 @@
|
|
};
|
|
#endif
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|
#if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
|
{
|
|
@@ -598,6 +604,7 @@
|
|
},
|
|
#endif
|
|
};
|
|
+#endif
|
|
|
|
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
|
static struct platform_device bfin_sport0_uart_device = {
|
|
@@ -713,7 +720,6 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
#endif
|
|
|
|
@@ -758,23 +764,27 @@
|
|
&bfin_gpios_device,
|
|
};
|
|
|
|
-static int __init ezbrd_init(void)
|
|
+static int __init stamp_init(void)
|
|
{
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
+
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
i2c_register_board_info(0, bfin_i2c_board_info,
|
|
ARRAY_SIZE(bfin_i2c_board_info));
|
|
+#endif
|
|
+
|
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
|
return 0;
|
|
}
|
|
|
|
-arch_initcall(ezbrd_init);
|
|
+arch_initcall(stamp_init);
|
|
|
|
void native_machine_restart(char *cmd)
|
|
{
|
|
/* workaround reboot hang when booting from SPI */
|
|
if ((bfin_read_SYSCR() & 0x7) == 0x3)
|
|
- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
|
+ bfin_gpio_reset_spi0_ssel1();
|
|
}
|
|
|
|
void bfin_get_ether_addr(char *addr)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/ezkit.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/ezkit.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/ezkit.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/ezkit.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -425,13 +425,8 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
};
|
|
#endif
|
|
|
|
@@ -835,6 +830,7 @@
|
|
};
|
|
#endif
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|
#if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
|
{
|
|
@@ -848,6 +844,7 @@
|
|
},
|
|
#endif
|
|
};
|
|
+#endif
|
|
|
|
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
|
static struct platform_device bfin_sport0_uart_device = {
|
|
@@ -991,7 +988,6 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
#endif
|
|
|
|
@@ -1052,23 +1048,27 @@
|
|
&bfin_gpios_device,
|
|
};
|
|
|
|
-static int __init ezkit_init(void)
|
|
+static int __init stamp_init(void)
|
|
{
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
+
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
i2c_register_board_info(0, bfin_i2c_board_info,
|
|
ARRAY_SIZE(bfin_i2c_board_info));
|
|
+#endif
|
|
+
|
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
|
return 0;
|
|
}
|
|
|
|
-arch_initcall(ezkit_init);
|
|
+arch_initcall(stamp_init);
|
|
|
|
void native_machine_restart(char *cmd)
|
|
{
|
|
/* workaround reboot hang when booting from SPI */
|
|
if ((bfin_read_SYSCR() & 0x7) == 0x3)
|
|
- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
|
+ bfin_gpio_reset_spi0_ssel1();
|
|
}
|
|
|
|
void bfin_get_ether_addr(char *addr)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/anomaly.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/anomaly.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
* File: include/asm-blackfin/mach-bf527/anomaly.h
|
|
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
*
|
|
- * Copyright (C) 2004-2009 Analog Devices Inc.
|
|
+ * Copyright (C) 2004-2008 Analog Devices Inc.
|
|
* Licensed under the GPL-2 or later.
|
|
*/
|
|
|
|
@@ -167,16 +167,12 @@
|
|
#define ANOMALY_05000263 (0)
|
|
#define ANOMALY_05000266 (0)
|
|
#define ANOMALY_05000273 (0)
|
|
-#define ANOMALY_05000278 (0)
|
|
#define ANOMALY_05000285 (0)
|
|
-#define ANOMALY_05000305 (0)
|
|
#define ANOMALY_05000307 (0)
|
|
#define ANOMALY_05000311 (0)
|
|
#define ANOMALY_05000312 (0)
|
|
#define ANOMALY_05000323 (0)
|
|
#define ANOMALY_05000363 (0)
|
|
#define ANOMALY_05000412 (0)
|
|
-#define ANOMALY_05000447 (0)
|
|
-#define ANOMALY_05000448 (0)
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -144,7 +144,7 @@
|
|
CH_UART0_TX,
|
|
CH_UART0_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART0_CTSRTS
|
|
CONFIG_UART0_CTS_PIN,
|
|
CONFIG_UART0_RTS_PIN,
|
|
#endif
|
|
@@ -158,7 +158,7 @@
|
|
CH_UART1_TX,
|
|
CH_UART1_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART1_CTSRTS
|
|
CONFIG_UART1_CTS_PIN,
|
|
CONFIG_UART1_RTS_PIN,
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/portmux.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/portmux.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -73,8 +73,6 @@
|
|
|
|
#define P_HWAIT (P_DONTCARE)
|
|
|
|
-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL1
|
|
-
|
|
#define P_SPI0_SS (P_DEFINED | P_IDENT(GPIO_PG1) | P_FUNCT(0))
|
|
#define P_SPI0_SSEL1 (P_DEFINED | P_IDENT(GPIO_PG1) | P_FUNCT(2))
|
|
#define P_SPI0_SCK (P_DEFINED | P_IDENT(GPIO_PG2) | P_FUNCT(2))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/blackstamp.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/blackstamp.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/blackstamp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/blackstamp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -101,9 +101,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -129,13 +129,23 @@
|
|
},
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+ {
|
|
+ .modalias = "spi_mmc_dummy",
|
|
+ .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = 0,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc",
|
|
.max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
@@ -299,8 +309,10 @@
|
|
};
|
|
#endif
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|
};
|
|
+#endif
|
|
|
|
static const unsigned int cclk_vlev_datasheet[] =
|
|
{
|
|
@@ -378,8 +390,10 @@
|
|
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
i2c_register_board_info(0, bfin_i2c_board_info,
|
|
ARRAY_SIZE(bfin_i2c_board_info));
|
|
+#endif
|
|
|
|
ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
if (ret < 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/cm_bf533.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/cm_bf533.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/cm_bf533.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/cm_bf533.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -96,9 +96,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -138,13 +138,23 @@
|
|
},
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc_dummy",
|
|
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = 0,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+ {
|
|
+ .modalias = "spi_mmc",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/generic_board.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/generic_board.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/generic_board.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/generic_board.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,126 @@
|
|
+/*
|
|
+ * File: arch/blackfin/mach-bf533/generic_board.c
|
|
+ * Based on: arch/blackfin/mach-bf533/ezkit.c
|
|
+ * Author: Aidan Williams <aidan@nicta.com.au>
|
|
+ *
|
|
+ * Created: 2005
|
|
+ * Description:
|
|
+ *
|
|
+ * Modified:
|
|
+ * Copyright 2005 National ICT Australia (NICTA)
|
|
+ * Copyright 2004-2006 Analog Devices Inc.
|
|
+ *
|
|
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
+ * (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, see the file COPYING, or write
|
|
+ * to the Free Software Foundation, Inc.,
|
|
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
+ */
|
|
+
|
|
+#include <linux/device.h>
|
|
+#include <linux/platform_device.h>
|
|
+#include <linux/irq.h>
|
|
+
|
|
+/*
|
|
+ * Name the Board for the /proc/cpuinfo
|
|
+ */
|
|
+const char bfin_board_name[] = "UNKNOWN BOARD";
|
|
+
|
|
+#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
|
+static struct platform_device rtc_device = {
|
|
+ .name = "rtc-bfin",
|
|
+ .id = -1,
|
|
+};
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * Driver needs to know address, irq and flag pin.
|
|
+ */
|
|
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
|
+static struct resource smc91x_resources[] = {
|
|
+ {
|
|
+ .start = 0x20300300,
|
|
+ .end = 0x20300300 + 16,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = IRQ_PROG_INTB,
|
|
+ .end = IRQ_PROG_INTB,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
+ }, {
|
|
+ .start = IRQ_PF7,
|
|
+ .end = IRQ_PF7,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device smc91x_device = {
|
|
+ .name = "smc91x",
|
|
+ .id = 0,
|
|
+ .num_resources = ARRAY_SIZE(smc91x_resources),
|
|
+ .resource = smc91x_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
|
|
+#ifdef CONFIG_BFIN_SIR0
|
|
+static struct resource bfin_sir0_resources[] = {
|
|
+ {
|
|
+ .start = 0xFFC00400,
|
|
+ .end = 0xFFC004FF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ {
|
|
+ .start = IRQ_UART0_RX,
|
|
+ .end = IRQ_UART0_RX+1,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+ {
|
|
+ .start = CH_UART0_RX,
|
|
+ .end = CH_UART0_RX+1,
|
|
+ .flags = IORESOURCE_DMA,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_sir0_device = {
|
|
+ .name = "bfin_sir",
|
|
+ .id = 0,
|
|
+ .num_resources = ARRAY_SIZE(bfin_sir0_resources),
|
|
+ .resource = bfin_sir0_resources,
|
|
+};
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+static struct platform_device *generic_board_devices[] __initdata = {
|
|
+#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
|
+ &rtc_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
|
+ &smc91x_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
|
|
+#ifdef CONFIG_BFIN_SIR0
|
|
+ &bfin_sir0_device,
|
|
+#endif
|
|
+#endif
|
|
+};
|
|
+
|
|
+static int __init generic_board_init(void)
|
|
+{
|
|
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
+ return platform_add_devices(generic_board_devices, ARRAY_SIZE(generic_board_devices));
|
|
+}
|
|
+
|
|
+arch_initcall(generic_board_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/ip0x.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/ip0x.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/ip0x.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/ip0x.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -127,8 +127,8 @@
|
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
/* all SPI peripherals info goes here */
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
/*
|
|
* CPOL (Clock Polarity)
|
|
* 0 - Active high SCK
|
|
@@ -152,13 +152,14 @@
|
|
/* Notice: for blackfin, the speed_hz is the value of register
|
|
* SPI_BAUD, not the real baudrate */
|
|
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc",
|
|
.max_speed_hz = 2,
|
|
.bus_num = 1,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
},
|
|
#endif
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/Kconfig linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/Kconfig
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/Kconfig 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -38,4 +38,9 @@
|
|
help
|
|
Core support for IP04/IP04 open hardware IP-PBX.
|
|
|
|
+config GENERIC_BF533_BOARD
|
|
+ bool "Generic"
|
|
+ help
|
|
+ Generic or Custom board support.
|
|
+
|
|
endchoice
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/Makefile
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/Makefile 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,6 +2,7 @@
|
|
# arch/blackfin/mach-bf533/boards/Makefile
|
|
#
|
|
|
|
+obj-$(CONFIG_GENERIC_BF533_BOARD) += generic_board.o
|
|
obj-$(CONFIG_BFIN533_STAMP) += stamp.o
|
|
obj-$(CONFIG_BFIN532_IP0X) += ip0x.o
|
|
obj-$(CONFIG_BFIN533_EZKIT) += ezkit.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/stamp.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/stamp.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/stamp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/stamp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -441,6 +441,7 @@
|
|
};
|
|
#endif
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|
#if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
|
|
{
|
|
@@ -460,6 +461,7 @@
|
|
},
|
|
#endif
|
|
};
|
|
+#endif
|
|
|
|
static const unsigned int cclk_vlev_datasheet[] =
|
|
{
|
|
@@ -548,8 +550,10 @@
|
|
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
i2c_register_board_info(0, bfin_i2c_board_info,
|
|
ARRAY_SIZE(bfin_i2c_board_info));
|
|
+#endif
|
|
|
|
ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
if (ret < 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/anomaly.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/anomaly.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
* File: include/asm-blackfin/mach-bf533/anomaly.h
|
|
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
*
|
|
- * Copyright (C) 2004-2009 Analog Devices Inc.
|
|
+ * Copyright (C) 2004-2008 Analog Devices Inc.
|
|
* Licensed under the GPL-2 or later.
|
|
*/
|
|
|
|
@@ -160,7 +160,7 @@
|
|
#define ANOMALY_05000301 (__SILICON_REVISION__ < 6)
|
|
/* SSYNCs After Writes To DMA MMR Registers May Not Be Handled Correctly */
|
|
#define ANOMALY_05000302 (__SILICON_REVISION__ < 5)
|
|
-/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */
|
|
+/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */
|
|
#define ANOMALY_05000305 (__SILICON_REVISION__ < 5)
|
|
/* New Feature: Additional PPI Frame Sync Sampling Options (Not Available On Older Silicon) */
|
|
#define ANOMALY_05000306 (__SILICON_REVISION__ < 5)
|
|
@@ -278,12 +278,9 @@
|
|
#define ANOMALY_05000266 (0)
|
|
#define ANOMALY_05000323 (0)
|
|
#define ANOMALY_05000353 (1)
|
|
-#define ANOMALY_05000380 (0)
|
|
#define ANOMALY_05000386 (1)
|
|
#define ANOMALY_05000412 (0)
|
|
#define ANOMALY_05000432 (0)
|
|
#define ANOMALY_05000435 (0)
|
|
-#define ANOMALY_05000447 (0)
|
|
-#define ANOMALY_05000448 (0)
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -134,7 +134,7 @@
|
|
CH_UART_TX,
|
|
CH_UART_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART0_CTSRTS
|
|
CONFIG_UART0_CTS_PIN,
|
|
CONFIG_UART0_RTS_PIN,
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/portmux.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/portmux.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -54,11 +54,14 @@
|
|
#define P_SPI0_SSEL2 (P_DEFINED | P_IDENT(GPIO_PF2))
|
|
#define P_SPI0_SSEL1 (P_DEFINED | P_IDENT(GPIO_PF1))
|
|
#define P_SPI0_SS (P_DEFINED | P_IDENT(GPIO_PF0))
|
|
-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL2
|
|
|
|
#define P_TMR2 (P_DONTCARE)
|
|
#define P_TMR1 (P_DONTCARE)
|
|
#define P_TMR0 (P_DONTCARE)
|
|
#define P_TMRCLK (P_DEFINED | P_IDENT(GPIO_PF1))
|
|
|
|
+
|
|
+
|
|
+
|
|
+
|
|
#endif /* _MACH_PORTMUX_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/cm_bf537.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/cm_bf537.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/cm_bf537.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/cm_bf537.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -108,9 +108,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -160,13 +160,23 @@
|
|
},
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
- .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .modalias = "spi_mmc_dummy",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 1,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = 7,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+ {
|
|
+ .modalias = "spi_mmc",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
@@ -469,13 +479,8 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
};
|
|
#endif
|
|
|
|
@@ -586,7 +591,6 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/generic_board.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/generic_board.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/generic_board.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/generic_board.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,739 @@
|
|
+/*
|
|
+ * File: arch/blackfin/mach-bf537/boards/generic_board.c
|
|
+ * Based on: arch/blackfin/mach-bf533/boards/ezkit.c
|
|
+ * Author: Aidan Williams <aidan@nicta.com.au>
|
|
+ *
|
|
+ * Created:
|
|
+ * Description:
|
|
+ *
|
|
+ * Modified:
|
|
+ * Copyright 2005 National ICT Australia (NICTA)
|
|
+ * Copyright 2004-2008 Analog Devices Inc.
|
|
+ *
|
|
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
+ * (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, see the file COPYING, or write
|
|
+ * to the Free Software Foundation, Inc.,
|
|
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
+ */
|
|
+
|
|
+#include <linux/device.h>
|
|
+#include <linux/etherdevice.h>
|
|
+#include <linux/platform_device.h>
|
|
+#include <linux/mtd/mtd.h>
|
|
+#include <linux/mtd/partitions.h>
|
|
+#include <linux/spi/spi.h>
|
|
+#include <linux/spi/flash.h>
|
|
+#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
|
+#include <linux/usb/isp1362.h>
|
|
+#endif
|
|
+#include <linux/irq.h>
|
|
+#include <linux/interrupt.h>
|
|
+#include <linux/usb/sl811.h>
|
|
+#include <asm/dma.h>
|
|
+#include <asm/bfin5xx_spi.h>
|
|
+#include <asm/reboot.h>
|
|
+#include <asm/portmux.h>
|
|
+#include <linux/spi/ad7877.h>
|
|
+
|
|
+/*
|
|
+ * Name the Board for the /proc/cpuinfo
|
|
+ */
|
|
+const char bfin_board_name[] = "UNKNOWN BOARD";
|
|
+
|
|
+/*
|
|
+ * Driver needs to know address, irq and flag pin.
|
|
+ */
|
|
+
|
|
+#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
|
|
+#include <linux/usb/isp1760.h>
|
|
+static struct resource bfin_isp1760_resources[] = {
|
|
+ [0] = {
|
|
+ .start = 0x203C0000,
|
|
+ .end = 0x203C0000 + 0x000fffff,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ [1] = {
|
|
+ .start = IRQ_PF7,
|
|
+ .end = IRQ_PF7,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct isp1760_platform_data isp1760_priv = {
|
|
+ .is_isp1761 = 0,
|
|
+ .port1_disable = 0,
|
|
+ .bus_width_16 = 1,
|
|
+ .port1_otg = 0,
|
|
+ .analog_oc = 0,
|
|
+ .dack_polarity_high = 0,
|
|
+ .dreq_polarity_high = 0,
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_isp1760_device = {
|
|
+ .name = "isp1760-hcd",
|
|
+ .id = 0,
|
|
+ .dev = {
|
|
+ .platform_data = &isp1760_priv,
|
|
+ },
|
|
+ .num_resources = ARRAY_SIZE(bfin_isp1760_resources),
|
|
+ .resource = bfin_isp1760_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
|
|
+static struct resource bfin_pcmcia_cf_resources[] = {
|
|
+ {
|
|
+ .start = 0x20310000, /* IO PORT */
|
|
+ .end = 0x20312000,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = 0x20311000, /* Attribute Memory */
|
|
+ .end = 0x20311FFF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = IRQ_PF4,
|
|
+ .end = IRQ_PF4,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
|
|
+ }, {
|
|
+ .start = 6, /* Card Detect PF6 */
|
|
+ .end = 6,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_pcmcia_cf_device = {
|
|
+ .name = "bfin_cf_pcmcia",
|
|
+ .id = -1,
|
|
+ .num_resources = ARRAY_SIZE(bfin_pcmcia_cf_resources),
|
|
+ .resource = bfin_pcmcia_cf_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
|
+static struct platform_device rtc_device = {
|
|
+ .name = "rtc-bfin",
|
|
+ .id = -1,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
|
+static struct resource smc91x_resources[] = {
|
|
+ {
|
|
+ .name = "smc91x-regs",
|
|
+ .start = 0x20300300,
|
|
+ .end = 0x20300300 + 16,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+
|
|
+ .start = IRQ_PF7,
|
|
+ .end = IRQ_PF7,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
+ },
|
|
+};
|
|
+static struct platform_device smc91x_device = {
|
|
+ .name = "smc91x",
|
|
+ .id = 0,
|
|
+ .num_resources = ARRAY_SIZE(smc91x_resources),
|
|
+ .resource = smc91x_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
|
|
+static struct resource dm9000_resources[] = {
|
|
+ [0] = {
|
|
+ .start = 0x203FB800,
|
|
+ .end = 0x203FB800 + 1,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ [1] = {
|
|
+ .start = 0x203FB800 + 4,
|
|
+ .end = 0x203FB800 + 5,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ [2] = {
|
|
+ .start = IRQ_PF9,
|
|
+ .end = IRQ_PF9,
|
|
+ .flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device dm9000_device = {
|
|
+ .name = "dm9000",
|
|
+ .id = -1,
|
|
+ .num_resources = ARRAY_SIZE(dm9000_resources),
|
|
+ .resource = dm9000_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE)
|
|
+static struct resource sl811_hcd_resources[] = {
|
|
+ {
|
|
+ .start = 0x20340000,
|
|
+ .end = 0x20340000,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = 0x20340004,
|
|
+ .end = 0x20340004,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = CONFIG_USB_SL811_BFIN_IRQ,
|
|
+ .end = CONFIG_USB_SL811_BFIN_IRQ,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
+ },
|
|
+};
|
|
+
|
|
+#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS)
|
|
+void sl811_port_power(struct device *dev, int is_on)
|
|
+{
|
|
+ gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS");
|
|
+ gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS, is_on);
|
|
+
|
|
+}
|
|
+#endif
|
|
+
|
|
+static struct sl811_platform_data sl811_priv = {
|
|
+ .potpg = 10,
|
|
+ .power = 250, /* == 500mA */
|
|
+#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS)
|
|
+ .port_power = &sl811_port_power,
|
|
+#endif
|
|
+};
|
|
+
|
|
+static struct platform_device sl811_hcd_device = {
|
|
+ .name = "sl811-hcd",
|
|
+ .id = 0,
|
|
+ .dev = {
|
|
+ .platform_data = &sl811_priv,
|
|
+ },
|
|
+ .num_resources = ARRAY_SIZE(sl811_hcd_resources),
|
|
+ .resource = sl811_hcd_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
|
+static struct resource isp1362_hcd_resources[] = {
|
|
+ {
|
|
+ .start = 0x20360000,
|
|
+ .end = 0x20360000,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = 0x20360004,
|
|
+ .end = 0x20360004,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = CONFIG_USB_ISP1362_BFIN_GPIO_IRQ,
|
|
+ .end = CONFIG_USB_ISP1362_BFIN_GPIO_IRQ,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct isp1362_platform_data isp1362_priv = {
|
|
+ .sel15Kres = 1,
|
|
+ .clknotstop = 0,
|
|
+ .oc_enable = 0,
|
|
+ .int_act_high = 0,
|
|
+ .int_edge_triggered = 0,
|
|
+ .remote_wakeup_connected = 0,
|
|
+ .no_power_switching = 1,
|
|
+ .power_switching_mode = 0,
|
|
+};
|
|
+
|
|
+static struct platform_device isp1362_hcd_device = {
|
|
+ .name = "isp1362-hcd",
|
|
+ .id = 0,
|
|
+ .dev = {
|
|
+ .platform_data = &isp1362_priv,
|
|
+ },
|
|
+ .num_resources = ARRAY_SIZE(isp1362_hcd_resources),
|
|
+ .resource = isp1362_hcd_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
+static struct platform_device bfin_mac_device = {
|
|
+ .name = "bfin_mac",
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
|
+static struct resource net2272_bfin_resources[] = {
|
|
+ {
|
|
+ .start = 0x20300000,
|
|
+ .end = 0x20300000 + 0x100,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = IRQ_PF7,
|
|
+ .end = IRQ_PF7,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device net2272_bfin_device = {
|
|
+ .name = "net2272",
|
|
+ .id = -1,
|
|
+ .num_resources = ARRAY_SIZE(net2272_bfin_resources),
|
|
+ .resource = net2272_bfin_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
+/* all SPI peripherals info goes here */
|
|
+
|
|
+#if defined(CONFIG_MTD_M25P80) \
|
|
+ || defined(CONFIG_MTD_M25P80_MODULE)
|
|
+static struct mtd_partition bfin_spi_flash_partitions[] = {
|
|
+ {
|
|
+ .name = "bootloader(spi)",
|
|
+ .size = 0x00020000,
|
|
+ .offset = 0,
|
|
+ .mask_flags = MTD_CAP_ROM
|
|
+ }, {
|
|
+ .name = "linux kernel(spi)",
|
|
+ .size = 0xe0000,
|
|
+ .offset = 0x20000
|
|
+ }, {
|
|
+ .name = "file system(spi)",
|
|
+ .size = 0x700000,
|
|
+ .offset = 0x00100000,
|
|
+ }
|
|
+};
|
|
+
|
|
+static struct flash_platform_data bfin_spi_flash_data = {
|
|
+ .name = "m25p80",
|
|
+ .parts = bfin_spi_flash_partitions,
|
|
+ .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
|
|
+ .type = "m25p64",
|
|
+};
|
|
+
|
|
+/* SPI flash chip (m25p64) */
|
|
+static struct bfin5xx_spi_chip spi_flash_chip_info = {
|
|
+ .enable_dma = 0, /* use dma transfer with this chip*/
|
|
+ .bits_per_word = 8,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SPI_ADC_BF533) \
|
|
+ || defined(CONFIG_SPI_ADC_BF533_MODULE)
|
|
+/* SPI ADC chip */
|
|
+static struct bfin5xx_spi_chip spi_adc_chip_info = {
|
|
+ .enable_dma = 1, /* use dma transfer with this chip*/
|
|
+ .bits_per_word = 16,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
|
+ || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|
+static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
|
+ .enable_dma = 0,
|
|
+ .bits_per_word = 16,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
+static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
|
|
+ .enable_dma = 0,
|
|
+ .bits_per_word = 16,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
+ .bits_per_word = 8,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_PBX)
|
|
+static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
|
|
+ .ctl_reg = 0x4, /* send zero */
|
|
+ .enable_dma = 0,
|
|
+ .bits_per_word = 8,
|
|
+ .cs_change_per_word = 1,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
|
|
+ .enable_dma = 0,
|
|
+ .bits_per_word = 16,
|
|
+};
|
|
+
|
|
+static const struct ad7877_platform_data bfin_ad7877_ts_info = {
|
|
+ .model = 7877,
|
|
+ .vref_delay_usecs = 50, /* internal, no capacitor */
|
|
+ .x_plate_ohms = 419,
|
|
+ .y_plate_ohms = 486,
|
|
+ .pressure_max = 1000,
|
|
+ .pressure_min = 0,
|
|
+ .stopacq_polarity = 1,
|
|
+ .first_conversion_delay = 3,
|
|
+ .acquisition_time = 1,
|
|
+ .averaging = 1,
|
|
+ .pen_down_acc_interval = 1,
|
|
+};
|
|
+#endif
|
|
+
|
|
+static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
|
+#if defined(CONFIG_MTD_M25P80) \
|
|
+ || defined(CONFIG_MTD_M25P80_MODULE)
|
|
+ {
|
|
+ /* the modalias must be the same as spi device driver name */
|
|
+ .modalias = "m25p80", /* Name of spi_driver for this device */
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0, /* Framework bus number */
|
|
+ .chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/
|
|
+ .platform_data = &bfin_spi_flash_data,
|
|
+ .controller_data = &spi_flash_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SPI_ADC_BF533) \
|
|
+ || defined(CONFIG_SPI_ADC_BF533_MODULE)
|
|
+ {
|
|
+ .modalias = "bfin_spi_adc", /* Name of spi_driver for this device */
|
|
+ .max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0, /* Framework bus number */
|
|
+ .chip_select = 1, /* Framework chip select. */
|
|
+ .platform_data = NULL, /* No spi_driver specific config */
|
|
+ .controller_data = &spi_adc_chip_info,
|
|
+ },
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
|
+ || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|
+ {
|
|
+ .modalias = "ad1836-spi",
|
|
+ .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
|
|
+ .controller_data = &ad1836_spi_chip_info,
|
|
+ },
|
|
+#endif
|
|
+#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
|
|
+ {
|
|
+ .modalias = "ad9960-spi",
|
|
+ .max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = 1,
|
|
+ .controller_data = &ad9960_spi_chip_info,
|
|
+ },
|
|
+#endif
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+ {
|
|
+ .modalias = "spi_mmc_dummy",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = 0,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+ {
|
|
+ .modalias = "spi_mmc",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+#endif
|
|
+#if defined(CONFIG_PBX)
|
|
+ {
|
|
+ .modalias = "fxs-spi",
|
|
+ .max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = 8 - CONFIG_J11_JUMPER,
|
|
+ .controller_data = &spi_si3xxx_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+ {
|
|
+ .modalias = "fxo-spi",
|
|
+ .max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = 8 - CONFIG_J19_JUMPER,
|
|
+ .controller_data = &spi_si3xxx_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+#endif
|
|
+#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
|
|
+ {
|
|
+ .modalias = "ad7877",
|
|
+ .platform_data = &bfin_ad7877_ts_info,
|
|
+ .irq = IRQ_PF6,
|
|
+ .max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = 1,
|
|
+ .controller_data = &spi_ad7877_chip_info,
|
|
+ },
|
|
+#endif
|
|
+};
|
|
+
|
|
+/* SPI controller data */
|
|
+static struct bfin5xx_spi_master bfin_spi0_info = {
|
|
+ .num_chipselect = 8,
|
|
+ .enable_dma = 1, /* master has the ability to do dma transfer */
|
|
+ .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
|
|
+};
|
|
+
|
|
+/* SPI (0) */
|
|
+static struct resource bfin_spi0_resource[] = {
|
|
+ [0] = {
|
|
+ .start = SPI0_REGBASE,
|
|
+ .end = SPI0_REGBASE + 0xFF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ [1] = {
|
|
+ .start = CH_SPI,
|
|
+ .end = CH_SPI,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_spi0_device = {
|
|
+ .name = "bfin-spi",
|
|
+ .id = 0, /* Bus number */
|
|
+ .num_resources = ARRAY_SIZE(bfin_spi0_resource),
|
|
+ .resource = bfin_spi0_resource,
|
|
+ .dev = {
|
|
+ .platform_data = &bfin_spi0_info, /* Passed to driver */
|
|
+ },
|
|
+};
|
|
+#endif /* spi master and devices */
|
|
+
|
|
+#if defined(CONFIG_FB_BF537_LQ035) || defined(CONFIG_FB_BF537_LQ035_MODULE)
|
|
+static struct platform_device bfin_fb_device = {
|
|
+ .name = "bf537-lq035",
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE)
|
|
+static struct platform_device bfin_fb_adv7393_device = {
|
|
+ .name = "bfin-adv7393",
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
|
+static struct resource bfin_uart_resources[] = {
|
|
+ {
|
|
+ .start = 0xFFC00400,
|
|
+ .end = 0xFFC004FF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = 0xFFC02000,
|
|
+ .end = 0xFFC020FF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_uart_device = {
|
|
+ .name = "bfin-uart",
|
|
+ .id = 1,
|
|
+ .num_resources = ARRAY_SIZE(bfin_uart_resources),
|
|
+ .resource = bfin_uart_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
|
|
+#ifdef CONFIG_BFIN_SIR0
|
|
+static struct resource bfin_sir0_resources[] = {
|
|
+ {
|
|
+ .start = 0xFFC00400,
|
|
+ .end = 0xFFC004FF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ {
|
|
+ .start = IRQ_UART0_RX,
|
|
+ .end = IRQ_UART0_RX+1,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+ {
|
|
+ .start = CH_UART0_RX,
|
|
+ .end = CH_UART0_RX+1,
|
|
+ .flags = IORESOURCE_DMA,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_sir0_device = {
|
|
+ .name = "bfin_sir",
|
|
+ .id = 0,
|
|
+ .num_resources = ARRAY_SIZE(bfin_sir0_resources),
|
|
+ .resource = bfin_sir0_resources,
|
|
+};
|
|
+#endif
|
|
+#ifdef CONFIG_BFIN_SIR1
|
|
+static struct resource bfin_sir1_resources[] = {
|
|
+ {
|
|
+ .start = 0xFFC02000,
|
|
+ .end = 0xFFC020FF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ {
|
|
+ .start = IRQ_UART1_RX,
|
|
+ .end = IRQ_UART1_RX+1,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+ {
|
|
+ .start = CH_UART1_RX,
|
|
+ .end = CH_UART1_RX+1,
|
|
+ .flags = IORESOURCE_DMA,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_sir1_device = {
|
|
+ .name = "bfin_sir",
|
|
+ .id = 1,
|
|
+ .num_resources = ARRAY_SIZE(bfin_sir1_resources),
|
|
+ .resource = bfin_sir1_resources,
|
|
+};
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
|
|
+static struct resource bfin_twi0_resource[] = {
|
|
+ [0] = {
|
|
+ .start = TWI0_REGBASE,
|
|
+ .end = TWI0_REGBASE + 0xFF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ [1] = {
|
|
+ .start = IRQ_TWI,
|
|
+ .end = IRQ_TWI,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device i2c_bfin_twi_device = {
|
|
+ .name = "i2c-bfin-twi",
|
|
+ .id = 0,
|
|
+ .num_resources = ARRAY_SIZE(bfin_twi0_resource),
|
|
+ .resource = bfin_twi0_resource,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
|
+static struct platform_device bfin_sport0_uart_device = {
|
|
+ .name = "bfin-sport-uart",
|
|
+ .id = 0,
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_sport1_uart_device = {
|
|
+ .name = "bfin-sport-uart",
|
|
+ .id = 1,
|
|
+};
|
|
+#endif
|
|
+
|
|
+static struct platform_device *stamp_devices[] __initdata = {
|
|
+#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
|
|
+ &bfin_pcmcia_cf_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
|
|
+ &rtc_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE)
|
|
+ &sl811_hcd_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
|
|
+ &isp1362_hcd_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
|
+ &smc91x_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
|
|
+ &dm9000_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
+ &bfin_mac_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
|
|
+ &net2272_bfin_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
|
|
+ &bfin_isp1760_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
+ &bfin_spi0_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_FB_BF537_LQ035) || defined(CONFIG_FB_BF537_LQ035_MODULE)
|
|
+ &bfin_fb_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE)
|
|
+ &bfin_fb_adv7393_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
|
|
+ &bfin_uart_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
|
|
+#ifdef CONFIG_BFIN_SIR0
|
|
+ &bfin_sir0_device,
|
|
+#endif
|
|
+#ifdef CONFIG_BFIN_SIR1
|
|
+ &bfin_sir1_device,
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
|
|
+ &i2c_bfin_twi_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
|
+ &bfin_sport0_uart_device,
|
|
+ &bfin_sport1_uart_device,
|
|
+#endif
|
|
+};
|
|
+
|
|
+static int __init stamp_init(void)
|
|
+{
|
|
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
+ platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
+#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
+ spi_register_board_info(bfin_spi_board_info,
|
|
+ ARRAY_SIZE(bfin_spi_board_info));
|
|
+#endif
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+arch_initcall(stamp_init);
|
|
+
|
|
+void native_machine_restart(char *cmd)
|
|
+{
|
|
+ /* workaround reboot hang when booting from SPI */
|
|
+ if ((bfin_read_SYSCR() & 0x7) == 0x3)
|
|
+ bfin_gpio_reset_spi0_ssel1();
|
|
+}
|
|
+
|
|
+#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
+void bfin_get_ether_addr(char *addr)
|
|
+{
|
|
+ random_ether_addr(addr);
|
|
+ printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
|
|
+}
|
|
+EXPORT_SYMBOL(bfin_get_ether_addr);
|
|
+#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/Kconfig linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/Kconfig
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/Kconfig 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -33,4 +33,9 @@
|
|
help
|
|
Board supply package for CSP Minotaur
|
|
|
|
+config GENERIC_BF537_BOARD
|
|
+ bool "Generic"
|
|
+ help
|
|
+ Generic or Custom board support.
|
|
+
|
|
endchoice
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/Makefile
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/Makefile 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,6 +2,7 @@
|
|
# arch/blackfin/mach-bf537/boards/Makefile
|
|
#
|
|
|
|
+obj-$(CONFIG_GENERIC_BF537_BOARD) += generic_board.o
|
|
obj-$(CONFIG_BFIN537_STAMP) += stamp.o
|
|
obj-$(CONFIG_BFIN537_BLUETECHNIX_CM) += cm_bf537.o
|
|
obj-$(CONFIG_BFIN537_BLUETECHNIX_TCM) += tcm_bf537.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/minotaur.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/minotaur.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/minotaur.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/minotaur.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -61,13 +61,8 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
};
|
|
#endif
|
|
|
|
@@ -134,9 +129,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -156,13 +151,23 @@
|
|
},
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+ {
|
|
+ .modalias = "spi_mmc_dummy",
|
|
+ .max_speed_hz = 5000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = 0,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc",
|
|
.max_speed_hz = 5000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
@@ -319,7 +324,6 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
#endif
|
|
|
|
@@ -373,5 +377,5 @@
|
|
{
|
|
/* workaround reboot hang when booting from SPI */
|
|
if ((bfin_read_SYSCR() & 0x7) == 0x3)
|
|
- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
|
+ bfin_gpio_reset_spi0_ssel1();
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/pnav10.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/pnav10.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/pnav10.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/pnav10.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -198,13 +198,8 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
};
|
|
#endif
|
|
|
|
@@ -289,9 +284,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -364,13 +359,23 @@
|
|
.controller_data = &ad9960_spi_chip_info,
|
|
},
|
|
#endif
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+ {
|
|
+ .modalias = "spi_mmc_dummy",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = 7,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc",
|
|
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
@@ -524,7 +529,6 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
#endif
|
|
|
|
@@ -554,7 +558,7 @@
|
|
#endif
|
|
};
|
|
|
|
-static int __init pnav_init(void)
|
|
+static int __init stamp_init(void)
|
|
{
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
@@ -565,7 +569,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-arch_initcall(pnav_init);
|
|
+arch_initcall(stamp_init);
|
|
|
|
void bfin_get_ether_addr(char *addr)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/stamp.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/stamp.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/stamp.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/stamp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -321,13 +321,8 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
};
|
|
#endif
|
|
|
|
@@ -1073,6 +1068,7 @@
|
|
};
|
|
#endif
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|
#if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
|
|
{
|
|
@@ -1106,6 +1102,7 @@
|
|
},
|
|
#endif
|
|
};
|
|
+#endif
|
|
|
|
#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
|
|
static struct platform_device bfin_sport0_uart_device = {
|
|
@@ -1220,7 +1217,6 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
#endif
|
|
|
|
@@ -1288,8 +1284,12 @@
|
|
static int __init stamp_init(void)
|
|
{
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
+
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
i2c_register_board_info(0, bfin_i2c_board_info,
|
|
ARRAY_SIZE(bfin_i2c_board_info));
|
|
+#endif
|
|
+
|
|
bfin_plat_nand_init();
|
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
|
@@ -1307,7 +1307,7 @@
|
|
{
|
|
/* workaround reboot hang when booting from SPI */
|
|
if ((bfin_read_SYSCR() & 0x7) == 0x3)
|
|
- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
|
|
+ bfin_gpio_reset_spi0_ssel1();
|
|
}
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/tcm_bf537.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/tcm_bf537.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/tcm_bf537.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/tcm_bf537.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -108,9 +108,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -160,13 +160,23 @@
|
|
},
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc_dummy",
|
|
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = 7,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
+ .mode = SPI_MODE_3,
|
|
+ },
|
|
+ {
|
|
+ .modalias = "spi_mmc",
|
|
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
+ .bus_num = 0,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
@@ -471,13 +481,8 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
-static struct platform_device bfin_mii_bus = {
|
|
- .name = "bfin_mii_bus",
|
|
-};
|
|
-
|
|
static struct platform_device bfin_mac_device = {
|
|
.name = "bfin_mac",
|
|
- .dev.platform_data = &bfin_mii_bus,
|
|
};
|
|
#endif
|
|
|
|
@@ -588,7 +593,6 @@
|
|
#endif
|
|
|
|
#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
|
|
- &bfin_mii_bus,
|
|
&bfin_mac_device,
|
|
#endif
|
|
|
|
@@ -611,7 +615,7 @@
|
|
&bfin_gpios_device,
|
|
};
|
|
|
|
-static int __init tcm_bf537_init(void)
|
|
+static int __init cm_bf537_init(void)
|
|
{
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
platform_add_devices(cm_bf537_devices, ARRAY_SIZE(cm_bf537_devices));
|
|
@@ -625,7 +629,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-arch_initcall(tcm_bf537_init);
|
|
+arch_initcall(cm_bf537_init);
|
|
|
|
void bfin_get_ether_addr(char *addr)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/anomaly.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/anomaly.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
* File: include/asm-blackfin/mach-bf537/anomaly.h
|
|
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
*
|
|
- * Copyright (C) 2004-2009 Analog Devices Inc.
|
|
+ * Copyright (C) 2004-2008 Analog Devices Inc.
|
|
* Licensed under the GPL-2 or later.
|
|
*/
|
|
|
|
@@ -110,7 +110,7 @@
|
|
#define ANOMALY_05000301 (1)
|
|
/* SSYNCs After Writes To CAN/DMA MMR Registers Are Not Always Handled Correctly */
|
|
#define ANOMALY_05000304 (__SILICON_REVISION__ < 3)
|
|
-/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */
|
|
+/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */
|
|
#define ANOMALY_05000305 (__SILICON_REVISION__ < 3)
|
|
/* SCKELOW Bit Does Not Maintain State Through Hibernate */
|
|
#define ANOMALY_05000307 (__SILICON_REVISION__ < 3)
|
|
@@ -168,12 +168,9 @@
|
|
#define ANOMALY_05000323 (0)
|
|
#define ANOMALY_05000353 (1)
|
|
#define ANOMALY_05000363 (0)
|
|
-#define ANOMALY_05000380 (0)
|
|
#define ANOMALY_05000386 (1)
|
|
#define ANOMALY_05000412 (0)
|
|
#define ANOMALY_05000432 (0)
|
|
#define ANOMALY_05000435 (0)
|
|
-#define ANOMALY_05000447 (0)
|
|
-#define ANOMALY_05000448 (0)
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -144,7 +144,7 @@
|
|
CH_UART0_TX,
|
|
CH_UART0_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART0_CTSRTS
|
|
CONFIG_UART0_CTS_PIN,
|
|
CONFIG_UART0_RTS_PIN,
|
|
#endif
|
|
@@ -158,7 +158,7 @@
|
|
CH_UART1_TX,
|
|
CH_UART1_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART1_CTSRTS
|
|
CONFIG_UART1_CTS_PIN,
|
|
CONFIG_UART1_RTS_PIN,
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/portmux.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/portmux.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -31,7 +31,6 @@
|
|
#define P_PPI0_FS1 (P_DEFINED | P_IDENT(GPIO_PF9) | P_FUNCT(1))
|
|
#define P_TACLK0 (P_DEFINED | P_IDENT(GPIO_PF14) | P_FUNCT(1))
|
|
#define P_TMRCLK (P_DEFINED | P_IDENT(GPIO_PF15) | P_FUNCT(1))
|
|
-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL1
|
|
|
|
#define P_PPI0_D0 (P_DEFINED | P_IDENT(GPIO_PG0) | P_FUNCT(0))
|
|
#define P_PPI0_D1 (P_DEFINED | P_IDENT(GPIO_PG1) | P_FUNCT(0))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/anomaly.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/anomaly.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
* File: include/asm-blackfin/mach-bf538/anomaly.h
|
|
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
*
|
|
- * Copyright (C) 2004-2009 Analog Devices Inc.
|
|
+ * Copyright (C) 2004-2008 Analog Devices Inc.
|
|
* Licensed under the GPL-2 or later.
|
|
*/
|
|
|
|
@@ -120,17 +120,13 @@
|
|
#define ANOMALY_05000198 (0)
|
|
#define ANOMALY_05000230 (0)
|
|
#define ANOMALY_05000263 (0)
|
|
-#define ANOMALY_05000305 (0)
|
|
#define ANOMALY_05000311 (0)
|
|
#define ANOMALY_05000323 (0)
|
|
#define ANOMALY_05000353 (1)
|
|
#define ANOMALY_05000363 (0)
|
|
-#define ANOMALY_05000380 (0)
|
|
#define ANOMALY_05000386 (1)
|
|
#define ANOMALY_05000412 (0)
|
|
#define ANOMALY_05000432 (0)
|
|
#define ANOMALY_05000435 (0)
|
|
-#define ANOMALY_05000447 (0)
|
|
-#define ANOMALY_05000448 (0)
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -144,7 +144,7 @@
|
|
CH_UART0_TX,
|
|
CH_UART0_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART0_CTSRTS
|
|
CONFIG_UART0_CTS_PIN,
|
|
CONFIG_UART0_RTS_PIN,
|
|
#endif
|
|
@@ -158,7 +158,7 @@
|
|
CH_UART1_TX,
|
|
CH_UART1_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART1_CTSRTS
|
|
CONFIG_UART1_CTS_PIN,
|
|
CONFIG_UART1_RTS_PIN,
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/portmux.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/portmux.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -102,6 +102,5 @@
|
|
#define P_SPI0_SSEL2 (P_DEFINED | P_IDENT(GPIO_PF2))
|
|
#define P_SPI0_SSEL1 (P_DEFINED | P_IDENT(GPIO_PF1))
|
|
#define P_SPI0_SS (P_DEFINED | P_IDENT(GPIO_PF0))
|
|
-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL2
|
|
|
|
#endif /* _MACH_PORTMUX_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf548/boards/ezkit.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/boards/ezkit.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/boards/ezkit.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/boards/ezkit.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -781,6 +781,7 @@
|
|
#endif
|
|
#endif
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
static struct i2c_board_info __initdata bfin_i2c_board_info0[] = {
|
|
};
|
|
|
|
@@ -799,6 +800,7 @@
|
|
#endif
|
|
};
|
|
#endif
|
|
+#endif
|
|
|
|
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
|
#include <linux/gpio_keys.h>
|
|
@@ -954,12 +956,14 @@
|
|
{
|
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
|
|
+#ifdef CONFIG_I2C_BOARDINFO
|
|
i2c_register_board_info(0, bfin_i2c_board_info0,
|
|
ARRAY_SIZE(bfin_i2c_board_info0));
|
|
#if !defined(CONFIG_BF542) /* The BF542 only has 1 TWI */
|
|
i2c_register_board_info(1, bfin_i2c_board_info1,
|
|
ARRAY_SIZE(bfin_i2c_board_info1));
|
|
#endif
|
|
+#endif
|
|
|
|
platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/anomaly.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/anomaly.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,12 +2,12 @@
|
|
* File: include/asm-blackfin/mach-bf548/anomaly.h
|
|
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
*
|
|
- * Copyright (C) 2004-2009 Analog Devices Inc.
|
|
+ * Copyright (C) 2004-2008 Analog Devices Inc.
|
|
* Licensed under the GPL-2 or later.
|
|
*/
|
|
|
|
/* This file shoule be up to date with:
|
|
- * - Revision H, 01/16/2009; ADSP-BF542/BF544/BF547/BF548/BF549 Blackfin Processor Anomaly List
|
|
+ * - Revision G, 08/07/2008; ADSP-BF542/BF544/BF547/BF548/BF549 Blackfin Processor Anomaly List
|
|
*/
|
|
|
|
#ifndef _MACH_ANOMALY_H_
|
|
@@ -91,6 +91,8 @@
|
|
#define ANOMALY_05000371 (__SILICON_REVISION__ < 2)
|
|
/* USB DP/DM Data Pins May Lose State When Entering Hibernate */
|
|
#define ANOMALY_05000372 (__SILICON_REVISION__ < 1)
|
|
+/* Mobile DDR Operation Not Functional */
|
|
+#define ANOMALY_05000377 (1)
|
|
/* Security/Authentication Speedpath Causes Authentication To Fail To Initiate */
|
|
#define ANOMALY_05000378 (__SILICON_REVISION__ < 2)
|
|
/* 16-Bit NAND FLASH Boot Mode Is Not Functional */
|
|
@@ -155,22 +157,8 @@
|
|
#define ANOMALY_05000429 (__SILICON_REVISION__ < 2)
|
|
/* Software System Reset Corrupts PLL_LOCKCNT Register */
|
|
#define ANOMALY_05000430 (__SILICON_REVISION__ >= 2)
|
|
-/* Incorrect Use of Stack in Lockbox Firmware During Authentication */
|
|
-#define ANOMALY_05000431 (__SILICON_REVISION__ < 3)
|
|
-/* OTP Write Accesses Not Supported */
|
|
-#define ANOMALY_05000442 (__SILICON_REVISION__ < 1)
|
|
/* IFLUSH Instruction at End of Hardware Loop Causes Infinite Stall */
|
|
#define ANOMALY_05000443 (1)
|
|
-/* CDMAPRIO and L2DMAPRIO Bits in the SYSCR Register Are Not Functional */
|
|
-#define ANOMALY_05000446 (1)
|
|
-/* UART IrDA Receiver Fails on Extended Bit Pulses */
|
|
-#define ANOMALY_05000447 (1)
|
|
-/* DDR Clock Duty Cycle Spec Violation (tCH, tCL) */
|
|
-#define ANOMALY_05000448 (__SILICON_REVISION__ == 1)
|
|
-/* Reduced Timing Margins on DDR Output Setup and Hold (tDS and tDH) */
|
|
-#define ANOMALY_05000449 (__SILICON_REVISION__ == 1)
|
|
-/* USB DMA Mode 1 Short Packet Data Corruption */
|
|
-#define ANOMALY_05000450 (1
|
|
|
|
/* Anomalies that don't exist on this proc */
|
|
#define ANOMALY_05000125 (0)
|
|
@@ -183,13 +171,10 @@
|
|
#define ANOMALY_05000263 (0)
|
|
#define ANOMALY_05000266 (0)
|
|
#define ANOMALY_05000273 (0)
|
|
-#define ANOMALY_05000278 (0)
|
|
-#define ANOMALY_05000305 (0)
|
|
#define ANOMALY_05000307 (0)
|
|
#define ANOMALY_05000311 (0)
|
|
#define ANOMALY_05000323 (0)
|
|
#define ANOMALY_05000363 (0)
|
|
-#define ANOMALY_05000380 (0)
|
|
#define ANOMALY_05000412 (0)
|
|
#define ANOMALY_05000432 (0)
|
|
#define ANOMALY_05000435 (0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/bf548.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/bf548.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/bf548.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/bf548.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -104,18 +104,6 @@
|
|
|
|
#define AMGCTLVAL (V_AMBEN | V_AMCKEN)
|
|
|
|
-#if defined(CONFIG_BF542M)
|
|
-# define CONFIG_BF542
|
|
-#elif defined(CONFIG_BF544M)
|
|
-# define CONFIG_BF544
|
|
-#elif defined(CONFIG_BF547M)
|
|
-# define CONFIG_BF547
|
|
-#elif defined(CONFIG_BF548M)
|
|
-# define CONFIG_BF548
|
|
-#elif defined(CONFIG_BF549M)
|
|
-# define CONFIG_BF549
|
|
-#endif
|
|
-
|
|
#if defined(CONFIG_BF542)
|
|
# define CPU "BF542"
|
|
# define CPUID 0x27de
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -63,7 +63,7 @@
|
|
#define UART_ENABLE_INTS(x, v) UART_SET_IER(x, v)
|
|
#define UART_DISABLE_INTS(x) UART_CLEAR_IER(x, 0xF)
|
|
|
|
-#if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART2_CTSRTS)
|
|
+#if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS)
|
|
# define CONFIG_SERIAL_BFIN_CTSRTS
|
|
|
|
# ifndef CONFIG_UART0_CTS_PIN
|
|
@@ -74,12 +74,12 @@
|
|
# define CONFIG_UART0_RTS_PIN -1
|
|
# endif
|
|
|
|
-# ifndef CONFIG_UART2_CTS_PIN
|
|
-# define CONFIG_UART2_CTS_PIN -1
|
|
+# ifndef CONFIG_UART1_CTS_PIN
|
|
+# define CONFIG_UART1_CTS_PIN -1
|
|
# endif
|
|
|
|
-# ifndef CONFIG_UART2_RTS_PIN
|
|
-# define CONFIG_UART2_RTS_PIN -1
|
|
+# ifndef CONFIG_UART1_RTS_PIN
|
|
+# define CONFIG_UART1_RTS_PIN -1
|
|
# endif
|
|
#endif
|
|
|
|
@@ -130,7 +130,7 @@
|
|
CH_UART0_TX,
|
|
CH_UART0_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART0_CTSRTS
|
|
CONFIG_UART0_CTS_PIN,
|
|
CONFIG_UART0_RTS_PIN,
|
|
#endif
|
|
@@ -144,10 +144,6 @@
|
|
CH_UART1_TX,
|
|
CH_UART1_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
- 0,
|
|
- 0,
|
|
-#endif
|
|
},
|
|
#endif
|
|
#ifdef CONFIG_SERIAL_BFIN_UART2
|
|
@@ -158,7 +154,7 @@
|
|
CH_UART2_TX,
|
|
CH_UART2_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART2_CTSRTS
|
|
CONFIG_UART2_CTS_PIN,
|
|
CONFIG_UART2_RTS_PIN,
|
|
#endif
|
|
@@ -172,10 +168,6 @@
|
|
CH_UART3_TX,
|
|
CH_UART3_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
- 0,
|
|
- 0,
|
|
-#endif
|
|
},
|
|
#endif
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/gpio.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/gpio.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/gpio.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/gpio.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -195,17 +195,17 @@
|
|
struct gpio_port_t {
|
|
unsigned short port_fer;
|
|
unsigned short dummy1;
|
|
- unsigned short data;
|
|
+ unsigned short port_data;
|
|
unsigned short dummy2;
|
|
- unsigned short data_set;
|
|
+ unsigned short port_set;
|
|
unsigned short dummy3;
|
|
- unsigned short data_clear;
|
|
+ unsigned short port_clear;
|
|
unsigned short dummy4;
|
|
- unsigned short dir_set;
|
|
+ unsigned short port_dir_set;
|
|
unsigned short dummy5;
|
|
- unsigned short dir_clear;
|
|
+ unsigned short port_dir_clear;
|
|
unsigned short dummy6;
|
|
- unsigned short inen;
|
|
+ unsigned short port_inen;
|
|
unsigned short dummy7;
|
|
unsigned int port_mux;
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/irq.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/irq.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/irq.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/irq.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -123,8 +123,8 @@
|
|
#define IRQ_MXVR_ERROR BFIN_IRQ(51) /* MXVR Status (Error) Interrupt */
|
|
#define IRQ_MXVR_MSG BFIN_IRQ(52) /* MXVR Message Interrupt */
|
|
#define IRQ_MXVR_PKT BFIN_IRQ(53) /* MXVR Packet Interrupt */
|
|
-#define IRQ_EPPI1_ERROR BFIN_IRQ(54) /* EPPI1 Error Interrupt */
|
|
-#define IRQ_EPPI2_ERROR BFIN_IRQ(55) /* EPPI2 Error Interrupt */
|
|
+#define IRQ_EPP1_ERROR BFIN_IRQ(54) /* EPPI1 Error Interrupt */
|
|
+#define IRQ_EPP2_ERROR BFIN_IRQ(55) /* EPPI2 Error Interrupt */
|
|
#define IRQ_UART3_ERROR BFIN_IRQ(56) /* UART3 Status (Error) Interrupt */
|
|
#define IRQ_HOST_ERROR BFIN_IRQ(57) /* HOST Status (Error) Interrupt */
|
|
#define IRQ_PIXC_ERROR BFIN_IRQ(59) /* PIXC Status (Error) Interrupt */
|
|
@@ -361,8 +361,8 @@
|
|
#define IRQ_UART2_ERR IRQ_UART2_ERROR
|
|
#define IRQ_CAN0_ERR IRQ_CAN0_ERROR
|
|
#define IRQ_MXVR_ERR IRQ_MXVR_ERROR
|
|
-#define IRQ_EPPI1_ERR IRQ_EPPI1_ERROR
|
|
-#define IRQ_EPPI2_ERR IRQ_EPPI2_ERROR
|
|
+#define IRQ_EPP1_ERR IRQ_EPP1_ERROR
|
|
+#define IRQ_EPP2_ERR IRQ_EPP2_ERROR
|
|
#define IRQ_UART3_ERR IRQ_UART3_ERROR
|
|
#define IRQ_HOST_ERR IRQ_HOST_ERROR
|
|
#define IRQ_PIXC_ERR IRQ_PIXC_ERROR
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/portmux.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/portmux.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -125,7 +125,6 @@
|
|
#define P_KEY_COL2 (P_DEFINED | P_IDENT(GPIO_PD14) | P_FUNCT(3))
|
|
#define P_KEY_COL3 (P_DEFINED | P_IDENT(GPIO_PD15) | P_FUNCT(3))
|
|
|
|
-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL1
|
|
#define P_SPI0_SCK (P_DEFINED | P_IDENT(GPIO_PE0) | P_FUNCT(0))
|
|
#define P_SPI0_MISO (P_DEFINED | P_IDENT(GPIO_PE1) | P_FUNCT(0))
|
|
#define P_SPI0_MOSI (P_DEFINED | P_IDENT(GPIO_PE2) | P_FUNCT(0))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/cm_bf561.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/cm_bf561.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/cm_bf561.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/cm_bf561.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -105,9 +105,9 @@
|
|
};
|
|
#endif
|
|
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
|
|
- .enable_dma = 0,
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
+static struct bfin5xx_spi_chip spi_mmc_chip_info = {
|
|
+ .enable_dma = 1,
|
|
.bits_per_word = 8,
|
|
};
|
|
#endif
|
|
@@ -155,13 +155,14 @@
|
|
.controller_data = &ad9960_spi_chip_info,
|
|
},
|
|
#endif
|
|
-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
|
|
+#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
|
|
{
|
|
- .modalias = "mmc_spi",
|
|
+ .modalias = "spi_mmc",
|
|
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
|
|
.bus_num = 0,
|
|
- .chip_select = 5,
|
|
- .controller_data = &mmc_spi_chip_info,
|
|
+ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
|
|
+ .platform_data = NULL,
|
|
+ .controller_data = &spi_mmc_chip_info,
|
|
.mode = SPI_MODE_3,
|
|
},
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/generic_board.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/generic_board.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/generic_board.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/generic_board.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,113 @@
|
|
+/*
|
|
+ * File: arch/blackfin/mach-bf561/generic_board.c
|
|
+ * Based on: arch/blackfin/mach-bf533/ezkit.c
|
|
+ * Author: Aidan Williams <aidan@nicta.com.au>
|
|
+ *
|
|
+ * Created:
|
|
+ * Description:
|
|
+ *
|
|
+ * Modified:
|
|
+ * Copyright 2005 National ICT Australia (NICTA)
|
|
+ * Copyright 2004-2006 Analog Devices Inc.
|
|
+ *
|
|
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License as published by
|
|
+ * the Free Software Foundation; either version 2 of the License, or
|
|
+ * (at your option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, see the file COPYING, or write
|
|
+ * to the Free Software Foundation, Inc.,
|
|
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
+ */
|
|
+
|
|
+#include <linux/device.h>
|
|
+#include <linux/platform_device.h>
|
|
+#include <linux/irq.h>
|
|
+
|
|
+const char bfin_board_name[] = "UNKNOWN BOARD";
|
|
+
|
|
+/*
|
|
+ * Driver needs to know address, irq and flag pin.
|
|
+ */
|
|
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
|
+static struct resource smc91x_resources[] = {
|
|
+ {
|
|
+ .start = 0x2C010300,
|
|
+ .end = 0x2C010300 + 16,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }, {
|
|
+ .start = IRQ_PROG_INTB,
|
|
+ .end = IRQ_PROG_INTB,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
+ }, {
|
|
+ .start = IRQ_PF9,
|
|
+ .end = IRQ_PF9,
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device smc91x_device = {
|
|
+ .name = "smc91x",
|
|
+ .id = 0,
|
|
+ .num_resources = ARRAY_SIZE(smc91x_resources),
|
|
+ .resource = smc91x_resources,
|
|
+};
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
|
|
+#ifdef CONFIG_BFIN_SIR0
|
|
+static struct resource bfin_sir0_resources[] = {
|
|
+ {
|
|
+ .start = 0xFFC00400,
|
|
+ .end = 0xFFC004FF,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ },
|
|
+ {
|
|
+ .start = IRQ_UART0_RX,
|
|
+ .end = IRQ_UART0_RX+1,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+ {
|
|
+ .start = CH_UART0_RX,
|
|
+ .end = CH_UART0_RX+1,
|
|
+ .flags = IORESOURCE_DMA,
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct platform_device bfin_sir0_device = {
|
|
+ .name = "bfin_sir",
|
|
+ .id = 0,
|
|
+ .num_resources = ARRAY_SIZE(bfin_sir0_resources),
|
|
+ .resource = bfin_sir0_resources,
|
|
+};
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+static struct platform_device *generic_board_devices[] __initdata = {
|
|
+#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
|
|
+ &smc91x_device,
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
|
|
+#ifdef CONFIG_BFIN_SIR0
|
|
+ &bfin_sir0_device,
|
|
+#endif
|
|
+#endif
|
|
+};
|
|
+
|
|
+static int __init generic_board_init(void)
|
|
+{
|
|
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
|
+ return platform_add_devices(generic_board_devices,
|
|
+ ARRAY_SIZE(generic_board_devices));
|
|
+}
|
|
+
|
|
+arch_initcall(generic_board_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/Kconfig linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/Kconfig
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/Kconfig 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -19,4 +19,9 @@
|
|
help
|
|
CM-BF561 support for EVAL- and DEV-Board.
|
|
|
|
+config GENERIC_BF561_BOARD
|
|
+ bool "Generic"
|
|
+ help
|
|
+ Generic or Custom board support.
|
|
+
|
|
endchoice
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/Makefile
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/Makefile 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,6 +2,7 @@
|
|
# arch/blackfin/mach-bf561/boards/Makefile
|
|
#
|
|
|
|
+obj-$(CONFIG_GENERIC_BF561_BOARD) += generic_board.o
|
|
obj-$(CONFIG_BFIN561_BLUETECHNIX_CM) += cm_bf561.o
|
|
obj-$(CONFIG_BFIN561_EZKIT) += ezkit.o
|
|
obj-$(CONFIG_BFIN561_TEPLA) += tepla.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/anomaly.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/anomaly.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
* File: include/asm-blackfin/mach-bf561/anomaly.h
|
|
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
*
|
|
- * Copyright (C) 2004-2009 Analog Devices Inc.
|
|
+ * Copyright (C) 2004-2008 Analog Devices Inc.
|
|
* Licensed under the GPL-2 or later.
|
|
*/
|
|
|
|
@@ -224,7 +224,7 @@
|
|
#define ANOMALY_05000301 (1)
|
|
/* SSYNCs After Writes To DMA MMR Registers May Not Be Handled Correctly */
|
|
#define ANOMALY_05000302 (1)
|
|
-/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */
|
|
+/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */
|
|
#define ANOMALY_05000305 (__SILICON_REVISION__ < 5)
|
|
/* SCKELOW Bit Does Not Maintain State Through Hibernate */
|
|
#define ANOMALY_05000307 (__SILICON_REVISION__ < 5)
|
|
@@ -283,11 +283,8 @@
|
|
#define ANOMALY_05000273 (0)
|
|
#define ANOMALY_05000311 (0)
|
|
#define ANOMALY_05000353 (1)
|
|
-#define ANOMALY_05000380 (0)
|
|
#define ANOMALY_05000386 (1)
|
|
#define ANOMALY_05000432 (0)
|
|
#define ANOMALY_05000435 (0)
|
|
-#define ANOMALY_05000447 (0)
|
|
-#define ANOMALY_05000448 (0)
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -134,7 +134,7 @@
|
|
CH_UART_TX,
|
|
CH_UART_RX,
|
|
#endif
|
|
-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
|
|
+#ifdef CONFIG_BFIN_UART0_CTSRTS
|
|
CONFIG_UART0_CTS_PIN,
|
|
CONFIG_UART0_RTS_PIN,
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/defBF561.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/defBF561.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/defBF561.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/defBF561.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1106,8 +1106,6 @@
|
|
#define DLEN_8 0x0 /* PPI Data Length mask for DLEN=8 */
|
|
#define DLEN(x) (((x-9) & 0x07) << 11) /* PPI Data Length (only works for x=10-->x=16) */
|
|
#define POL 0x0000C000 /* PPI Signal Polarities */
|
|
-#define POLC 0x4000 /* PPI Clock Polarity */
|
|
-#define POLS 0x8000 /* PPI Frame Sync Polarity */
|
|
|
|
/* PPI_STATUS Masks */
|
|
#define FLD 0x00000400 /* Field Indicator */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/portmux.h
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/portmux.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -85,6 +85,5 @@
|
|
#define P_SPI0_MOSI (P_DONTCARE)
|
|
#define P_SPI0_MISO (P_DONTCARE)
|
|
#define P_SPI0_SCK (P_DONTCARE)
|
|
-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL2
|
|
|
|
#endif /* _MACH_PORTMUX_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/arch_checks.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/arch_checks.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/arch_checks.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/arch_checks.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -62,12 +62,3 @@
|
|
#if (CONFIG_BOOT_LOAD & 0x3)
|
|
# error "The kernel load address must be 4 byte aligned"
|
|
#endif
|
|
-
|
|
-/* The entire kernel must be able to make a 24bit pcrel call to start of L1 */
|
|
-#if ((0xffffffff - L1_CODE_START + 1) + CONFIG_BOOT_LOAD) > 0x1000000
|
|
-# error "The kernel load address is too high; keep it below 10meg for safety"
|
|
-#endif
|
|
-
|
|
-#if ANOMALY_05000448
|
|
-# error You are using a part with anomaly 05000448, this issue causes random memory read/write failures - that means random crashes.
|
|
-#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/cache.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/cache.S
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/cache.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/cache.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -66,33 +66,11 @@
|
|
|
|
/* Invalidate all instruction cache lines assocoiated with this memory area */
|
|
ENTRY(_blackfin_icache_flush_range)
|
|
-/*
|
|
- * Walkaround to avoid loading wrong instruction after invalidating icache
|
|
- * and following sequence is met.
|
|
- *
|
|
- * 1) One instruction address is cached in the instruction cache.
|
|
- * 2) This instruction in SDRAM is changed.
|
|
- * 3) IFLASH[P0] is executed only once in blackfin_icache_flush_range().
|
|
- * 4) This instruction is executed again, but the old one is loaded.
|
|
- */
|
|
- P0 = R0;
|
|
- IFLUSH[P0];
|
|
do_flush IFLUSH, , nop
|
|
ENDPROC(_blackfin_icache_flush_range)
|
|
|
|
/* Flush all cache lines assocoiated with this area of memory. */
|
|
ENTRY(_blackfin_icache_dcache_flush_range)
|
|
-/*
|
|
- * Walkaround to avoid loading wrong instruction after invalidating icache
|
|
- * and following sequence is met.
|
|
- *
|
|
- * 1) One instruction address is cached in the instruction cache.
|
|
- * 2) This instruction in SDRAM is changed.
|
|
- * 3) IFLASH[P0] is executed only once in blackfin_icache_flush_range().
|
|
- * 4) This instruction is executed again, but the old one is loaded.
|
|
- */
|
|
- P0 = R0;
|
|
- IFLUSH[P0];
|
|
do_flush FLUSH, IFLUSH
|
|
ENDPROC(_blackfin_icache_dcache_flush_range)
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/clocks-init.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/clocks-init.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/clocks-init.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/clocks-init.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -14,10 +14,9 @@
|
|
#include <asm/clocks.h>
|
|
#include <asm/mem_init.h>
|
|
|
|
-#define SDGCTL_WIDTH (1 << 31) /* SDRAM external data path width */
|
|
#define PLL_CTL_VAL \
|
|
(((CONFIG_VCO_MULT & 63) << 9) | CLKIN_HALF | \
|
|
- (PLL_BYPASS << 8) | (ANOMALY_05000305 ? 0 : 0x8000))
|
|
+ (PLL_BYPASS << 8) | (ANOMALY_05000265 ? 0x8000 : 0))
|
|
|
|
__attribute__((l1_text))
|
|
static void do_sync(void)
|
|
@@ -77,7 +76,7 @@
|
|
bfin_write_PLL_DIV(CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
|
|
#ifdef EBIU_SDGCTL
|
|
bfin_write_EBIU_SDRRC(mem_SDRRC);
|
|
- bfin_write_EBIU_SDGCTL((bfin_read_EBIU_SDGCTL() & SDGCTL_WIDTH) | mem_SDGCTL);
|
|
+ bfin_write_EBIU_SDGCTL(mem_SDGCTL);
|
|
#else
|
|
bfin_write_EBIU_RSTCTL(bfin_read_EBIU_RSTCTL() & ~(SRREQ));
|
|
do_sync();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/dpmc_modes.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/dpmc_modes.S
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/dpmc_modes.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/dpmc_modes.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -376,22 +376,10 @@
|
|
#endif
|
|
|
|
#ifdef PINT0_ASSIGN
|
|
- PM_SYS_PUSH(PINT0_MASK_SET)
|
|
- PM_SYS_PUSH(PINT1_MASK_SET)
|
|
- PM_SYS_PUSH(PINT2_MASK_SET)
|
|
- PM_SYS_PUSH(PINT3_MASK_SET)
|
|
PM_SYS_PUSH(PINT0_ASSIGN)
|
|
PM_SYS_PUSH(PINT1_ASSIGN)
|
|
PM_SYS_PUSH(PINT2_ASSIGN)
|
|
PM_SYS_PUSH(PINT3_ASSIGN)
|
|
- PM_SYS_PUSH(PINT0_INVERT_SET)
|
|
- PM_SYS_PUSH(PINT1_INVERT_SET)
|
|
- PM_SYS_PUSH(PINT2_INVERT_SET)
|
|
- PM_SYS_PUSH(PINT3_INVERT_SET)
|
|
- PM_SYS_PUSH(PINT0_EDGE_SET)
|
|
- PM_SYS_PUSH(PINT1_EDGE_SET)
|
|
- PM_SYS_PUSH(PINT2_EDGE_SET)
|
|
- PM_SYS_PUSH(PINT3_EDGE_SET)
|
|
#endif
|
|
|
|
PM_SYS_PUSH(EBIU_AMBCTL0)
|
|
@@ -726,22 +714,10 @@
|
|
PM_SYS_POP(EBIU_AMBCTL0)
|
|
|
|
#ifdef PINT0_ASSIGN
|
|
- PM_SYS_POP(PINT3_EDGE_SET)
|
|
- PM_SYS_POP(PINT2_EDGE_SET)
|
|
- PM_SYS_POP(PINT1_EDGE_SET)
|
|
- PM_SYS_POP(PINT0_EDGE_SET)
|
|
- PM_SYS_POP(PINT3_INVERT_SET)
|
|
- PM_SYS_POP(PINT2_INVERT_SET)
|
|
- PM_SYS_POP(PINT1_INVERT_SET)
|
|
- PM_SYS_POP(PINT0_INVERT_SET)
|
|
PM_SYS_POP(PINT3_ASSIGN)
|
|
PM_SYS_POP(PINT2_ASSIGN)
|
|
PM_SYS_POP(PINT1_ASSIGN)
|
|
PM_SYS_POP(PINT0_ASSIGN)
|
|
- PM_SYS_POP(PINT3_MASK_SET)
|
|
- PM_SYS_POP(PINT2_MASK_SET)
|
|
- PM_SYS_POP(PINT1_MASK_SET)
|
|
- PM_SYS_POP(PINT0_MASK_SET)
|
|
#endif
|
|
|
|
#ifdef SICA_IWR1
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/entry.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/entry.S
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/entry.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/entry.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -151,6 +151,13 @@
|
|
jump.s _bfin_return_from_exception;
|
|
ENDPROC(_ex_syscall)
|
|
|
|
+ENTRY(_ex_soft_bp)
|
|
+ r7 = retx;
|
|
+ r7 += -2;
|
|
+ retx = r7;
|
|
+ jump.s _ex_trap_c;
|
|
+ENDPROC(_ex_soft_bp)
|
|
+
|
|
ENTRY(_ex_single_step)
|
|
/* If we just returned from an interrupt, the single step event is
|
|
for the RTI instruction. */
|
|
@@ -600,19 +607,6 @@
|
|
p2 = [p2];
|
|
|
|
[p2+(TASK_THREAD+THREAD_KSP)] = sp;
|
|
-#ifdef CONFIG_IPIPE
|
|
- r0 = sp;
|
|
- SP += -12;
|
|
- call ___ipipe_syscall_root;
|
|
- SP += 12;
|
|
- cc = r0 == 1;
|
|
- if cc jump .Lsyscall_really_exit;
|
|
- cc = r0 == -1;
|
|
- if cc jump .Lresume_userspace;
|
|
- r3 = [sp + PT_R3];
|
|
- r4 = [sp + PT_R4];
|
|
- p0 = [sp + PT_ORIG_P0];
|
|
-#endif /* CONFIG_IPIPE */
|
|
|
|
/* Check the System Call */
|
|
r7 = __NR_syscall;
|
|
@@ -667,17 +661,6 @@
|
|
r7 = r7 & r4;
|
|
|
|
.Lsyscall_resched:
|
|
-#ifdef CONFIG_IPIPE
|
|
- cc = BITTST(r7, TIF_IRQ_SYNC);
|
|
- if !cc jump .Lsyscall_no_irqsync;
|
|
- [--sp] = reti;
|
|
- r0 = [sp++];
|
|
- SP += -12;
|
|
- call ___ipipe_sync_root;
|
|
- SP += 12;
|
|
- jump .Lresume_userspace_1;
|
|
-.Lsyscall_no_irqsync:
|
|
-#endif
|
|
cc = BITTST(r7, TIF_NEED_RESCHED);
|
|
if !cc jump .Lsyscall_sigpending;
|
|
|
|
@@ -709,10 +692,6 @@
|
|
.Lsyscall_really_exit:
|
|
r5 = [sp + PT_RESERVED];
|
|
rets = r5;
|
|
-#ifdef CONFIG_IPIPE
|
|
- [--sp] = reti;
|
|
- r5 = [sp++];
|
|
-#endif /* CONFIG_IPIPE */
|
|
rts;
|
|
ENDPROC(_system_call)
|
|
|
|
@@ -799,15 +778,6 @@
|
|
ENDPROC(_resume)
|
|
|
|
ENTRY(_ret_from_exception)
|
|
-#ifdef CONFIG_IPIPE
|
|
- [--sp] = rets;
|
|
- SP += -12;
|
|
- call ___ipipe_check_root
|
|
- SP += 12
|
|
- rets = [sp++];
|
|
- cc = r0 == 0;
|
|
- if cc jump 4f; /* not on behalf of Linux, get out */
|
|
-#endif /* CONFIG_IPIPE */
|
|
p2.l = lo(IPEND);
|
|
p2.h = hi(IPEND);
|
|
|
|
@@ -864,28 +834,6 @@
|
|
rts;
|
|
ENDPROC(_ret_from_exception)
|
|
|
|
-#ifdef CONFIG_IPIPE
|
|
-
|
|
-_sync_root_irqs:
|
|
- [--sp] = reti; /* Reenable interrupts */
|
|
- r0 = [sp++];
|
|
- jump.l ___ipipe_sync_root
|
|
-
|
|
-_resume_kernel_from_int:
|
|
- r0.l = _sync_root_irqs
|
|
- r0.h = _sync_root_irqs
|
|
- [--sp] = rets;
|
|
- [--sp] = ( r7:4, p5:3 );
|
|
- SP += -12;
|
|
- call ___ipipe_call_irqtail
|
|
- SP += 12;
|
|
- ( r7:4, p5:3 ) = [sp++];
|
|
- rets = [sp++];
|
|
- rts
|
|
-#else
|
|
-#define _resume_kernel_from_int 2f
|
|
-#endif
|
|
-
|
|
ENTRY(_return_from_int)
|
|
/* If someone else already raised IRQ 15, do nothing. */
|
|
csync;
|
|
@@ -907,7 +855,7 @@
|
|
r1 = r0 - r1;
|
|
r2 = r0 & r1;
|
|
cc = r2 == 0;
|
|
- if !cc jump _resume_kernel_from_int;
|
|
+ if !cc jump 2f;
|
|
|
|
/* Lower the interrupt level to 15. */
|
|
p0.l = lo(EVT15);
|
|
@@ -1139,7 +1087,7 @@
|
|
* EXCPT instruction can provide 4 bits of EXCAUSE, allowing 16 to be user defined
|
|
*/
|
|
.long _ex_syscall /* 0x00 - User Defined - Linux Syscall */
|
|
- .long _ex_trap_c /* 0x01 - User Defined - Software breakpoint */
|
|
+ .long _ex_soft_bp /* 0x01 - User Defined - Software breakpoint */
|
|
#ifdef CONFIG_KGDB
|
|
.long _ex_trap_c /* 0x02 - User Defined - KGDB initial connection
|
|
and break signal trap */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/head.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/head.S
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/head.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/head.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -17,19 +17,6 @@
|
|
|
|
__INIT
|
|
|
|
-ENTRY(__init_clear_bss)
|
|
- r2 = r2 - r1;
|
|
- cc = r2 == 0;
|
|
- if cc jump .L_bss_done;
|
|
- r2 >>= 2;
|
|
- p1 = r1;
|
|
- p2 = r2;
|
|
- lsetup (1f, 1f) lc0 = p2;
|
|
-1: [p1++] = r0;
|
|
-.L_bss_done:
|
|
- rts;
|
|
-ENDPROC(__init_clear_bss)
|
|
-
|
|
#define INITIAL_STACK (L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12)
|
|
|
|
ENTRY(__start)
|
|
@@ -157,35 +144,6 @@
|
|
call _init_early_exception_vectors;
|
|
#endif
|
|
|
|
- r0 = 0 (x);
|
|
- /* Zero out all of the fun bss regions */
|
|
-#if L1_DATA_A_LENGTH > 0
|
|
- r1.l = __sbss_l1;
|
|
- r1.h = __sbss_l1;
|
|
- r2.l = __ebss_l1;
|
|
- r2.h = __ebss_l1;
|
|
- call __init_clear_bss
|
|
-#endif
|
|
-#if L1_DATA_B_LENGTH > 0
|
|
- r1.l = __sbss_b_l1;
|
|
- r1.h = __sbss_b_l1;
|
|
- r2.l = __ebss_b_l1;
|
|
- r2.h = __ebss_b_l1;
|
|
- call __init_clear_bss
|
|
-#endif
|
|
-#if L2_LENGTH > 0
|
|
- r1.l = __sbss_l2;
|
|
- r1.h = __sbss_l2;
|
|
- r2.l = __ebss_l2;
|
|
- r2.h = __ebss_l2;
|
|
- call __init_clear_bss
|
|
-#endif
|
|
- r1.l = ___bss_start;
|
|
- r1.h = ___bss_start;
|
|
- r2.l = ___bss_stop;
|
|
- r2.h = ___bss_stop;
|
|
- call __init_clear_bss
|
|
-
|
|
/* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
|
|
call _bfin_relocate_l1_mem;
|
|
#ifdef CONFIG_BFIN_KERNEL_CLOCK
|
|
@@ -227,6 +185,19 @@
|
|
# define WDOG_CTL WDOGA_CTL
|
|
#endif
|
|
|
|
+ENTRY(__init_clear_bss)
|
|
+ r2 = r2 - r1;
|
|
+ cc = r2 == 0;
|
|
+ if cc jump .L_bss_done;
|
|
+ r2 >>= 2;
|
|
+ p1 = r1;
|
|
+ p2 = r2;
|
|
+ lsetup (1f, 1f) lc0 = p2;
|
|
+1: [p1++] = r0;
|
|
+.L_bss_done:
|
|
+ rts;
|
|
+ENDPROC(__init_clear_bss)
|
|
+
|
|
ENTRY(_real_start)
|
|
/* Enable nested interrupts */
|
|
[--sp] = reti;
|
|
@@ -238,6 +209,35 @@
|
|
w[p0] = r0;
|
|
ssync;
|
|
|
|
+ r0 = 0 (x);
|
|
+ /* Zero out all of the fun bss regions */
|
|
+#if L1_DATA_A_LENGTH > 0
|
|
+ r1.l = __sbss_l1;
|
|
+ r1.h = __sbss_l1;
|
|
+ r2.l = __ebss_l1;
|
|
+ r2.h = __ebss_l1;
|
|
+ call __init_clear_bss
|
|
+#endif
|
|
+#if L1_DATA_B_LENGTH > 0
|
|
+ r1.l = __sbss_b_l1;
|
|
+ r1.h = __sbss_b_l1;
|
|
+ r2.l = __ebss_b_l1;
|
|
+ r2.h = __ebss_b_l1;
|
|
+ call __init_clear_bss
|
|
+#endif
|
|
+#if L2_LENGTH > 0
|
|
+ r1.l = __sbss_l2;
|
|
+ r1.h = __sbss_l2;
|
|
+ r2.l = __ebss_l2;
|
|
+ r2.h = __ebss_l2;
|
|
+ call __init_clear_bss
|
|
+#endif
|
|
+ r1.l = ___bss_start;
|
|
+ r1.h = ___bss_start;
|
|
+ r2.l = ___bss_stop;
|
|
+ r2.h = ___bss_stop;
|
|
+ call __init_clear_bss
|
|
+
|
|
/* Pass the u-boot arguments to the global value command line */
|
|
R0 = R7;
|
|
call _cmdline_init;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/interrupt.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/interrupt.S
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/interrupt.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/interrupt.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -195,7 +195,7 @@
|
|
/* Interrupt routine for evt2 (NMI).
|
|
* We don't actually use this, so just return.
|
|
* For inner circle type details, please see:
|
|
- * http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:nmi
|
|
+ * http://docs.blackfin.uclinux.org/doku.php?id=linux:nmi
|
|
*/
|
|
ENTRY(_evt_nmi)
|
|
.weak _evt_nmi
|
|
@@ -235,7 +235,6 @@
|
|
|
|
#ifdef CONFIG_IPIPE
|
|
ENTRY(___ipipe_call_irqtail)
|
|
- p0 = r0;
|
|
r0.l = 1f;
|
|
r0.h = 1f;
|
|
reti = r0;
|
|
@@ -243,6 +242,9 @@
|
|
1:
|
|
[--sp] = rets;
|
|
[--sp] = ( r7:4, p5:3 );
|
|
+ p0.l = ___ipipe_irq_tail_hook;
|
|
+ p0.h = ___ipipe_irq_tail_hook;
|
|
+ p0 = [p0];
|
|
sp += -12;
|
|
call (p0);
|
|
sp += 12;
|
|
@@ -257,7 +259,7 @@
|
|
p0.h = hi(EVT14);
|
|
[p0] = r0;
|
|
csync;
|
|
- r0 = 0x401f (z);
|
|
+ r0 = 0x401f;
|
|
sti r0;
|
|
raise 14;
|
|
[--sp] = reti; /* IRQs on. */
|
|
@@ -275,7 +277,11 @@
|
|
p0.h = _bfin_irq_flags;
|
|
r0 = [p0];
|
|
sti r0;
|
|
+#if 0 /* FIXME: this actually raises scheduling latencies */
|
|
+ /* Reenable interrupts */
|
|
+ [--sp] = reti;
|
|
+ r0 = [sp++];
|
|
+#endif
|
|
rts;
|
|
ENDPROC(___ipipe_call_irqtail)
|
|
-
|
|
#endif /* CONFIG_IPIPE */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/ints-priority.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/ints-priority.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/ints-priority.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/ints-priority.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -161,15 +161,11 @@
|
|
|
|
static void bfin_internal_mask_irq(unsigned int irq)
|
|
{
|
|
- unsigned long flags;
|
|
-
|
|
#ifdef CONFIG_BF53x
|
|
- local_irq_save_hw(flags);
|
|
bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() &
|
|
~(1 << SIC_SYSIRQ(irq)));
|
|
#else
|
|
unsigned mask_bank, mask_bit;
|
|
- local_irq_save_hw(flags);
|
|
mask_bank = SIC_SYSIRQ(irq) / 32;
|
|
mask_bit = SIC_SYSIRQ(irq) % 32;
|
|
bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) &
|
|
@@ -179,20 +175,15 @@
|
|
~(1 << mask_bit));
|
|
#endif
|
|
#endif
|
|
- local_irq_restore_hw(flags);
|
|
}
|
|
|
|
static void bfin_internal_unmask_irq(unsigned int irq)
|
|
{
|
|
- unsigned long flags;
|
|
-
|
|
#ifdef CONFIG_BF53x
|
|
- local_irq_save_hw(flags);
|
|
bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() |
|
|
(1 << SIC_SYSIRQ(irq)));
|
|
#else
|
|
unsigned mask_bank, mask_bit;
|
|
- local_irq_save_hw(flags);
|
|
mask_bank = SIC_SYSIRQ(irq) / 32;
|
|
mask_bit = SIC_SYSIRQ(irq) % 32;
|
|
bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) |
|
|
@@ -202,7 +193,6 @@
|
|
(1 << mask_bit));
|
|
#endif
|
|
#endif
|
|
- local_irq_restore_hw(flags);
|
|
}
|
|
|
|
#ifdef CONFIG_PM
|
|
@@ -400,7 +390,7 @@
|
|
static inline void bfin_set_irq_handler(unsigned irq, irq_flow_handler_t handle)
|
|
{
|
|
#ifdef CONFIG_IPIPE
|
|
- _set_irq_handler(irq, handle_level_irq);
|
|
+ _set_irq_handler(irq, handle_edge_irq);
|
|
#else
|
|
struct irq_desc *desc = irq_desc + irq;
|
|
/* May not call generic set_irq_handler() due to spinlock
|
|
@@ -1065,18 +1055,13 @@
|
|
#endif
|
|
default:
|
|
#ifdef CONFIG_IPIPE
|
|
- /*
|
|
- * We want internal interrupt sources to be
|
|
- * masked, because ISRs may trigger interrupts
|
|
- * recursively (e.g. DMA), but interrupts are
|
|
- * _not_ masked at CPU level. So let's handle
|
|
- * most of them as level interrupts, except
|
|
- * the timer interrupt which is special.
|
|
- */
|
|
- if (irq == IRQ_SYSTMR || irq == IRQ_CORETMR)
|
|
- set_irq_handler(irq, handle_simple_irq);
|
|
- else
|
|
- set_irq_handler(irq, handle_level_irq);
|
|
+ /*
|
|
+ * We want internal interrupt sources to be masked, because
|
|
+ * ISRs may trigger interrupts recursively (e.g. DMA), but
|
|
+ * interrupts are _not_ masked at CPU level. So let's handle
|
|
+ * them as level interrupts.
|
|
+ */
|
|
+ set_irq_handler(irq, handle_level_irq);
|
|
#else /* !CONFIG_IPIPE */
|
|
set_irq_handler(irq, handle_simple_irq);
|
|
#endif /* !CONFIG_IPIPE */
|
|
@@ -1116,9 +1101,10 @@
|
|
IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 |
|
|
IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW;
|
|
|
|
-#ifdef SIC_IWR0
|
|
+#if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) \
|
|
+ || defined(BF538_FAMILY) || defined(CONFIG_BF51x)
|
|
bfin_write_SIC_IWR0(IWR_DISABLE_ALL);
|
|
-# ifdef SIC_IWR1
|
|
+#if defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
|
|
/* BF52x/BF51x system reset does not properly reset SIC_IWR1 which
|
|
* will screw up the bootrom as it relies on MDMA0/1 waking it
|
|
* up from IDLE instructions. See this report for more info:
|
|
@@ -1128,8 +1114,10 @@
|
|
bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11));
|
|
else
|
|
bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
|
|
-# endif
|
|
-# ifdef SIC_IWR2
|
|
+#else
|
|
+ bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
|
|
+#endif
|
|
+# ifdef CONFIG_BF54x
|
|
bfin_write_SIC_IWR2(IWR_DISABLE_ALL);
|
|
# endif
|
|
#else
|
|
@@ -1138,8 +1126,9 @@
|
|
|
|
#ifdef CONFIG_IPIPE
|
|
for (irq = 0; irq < NR_IRQS; irq++) {
|
|
- struct irq_desc *desc = irq_to_desc(irq);
|
|
+ struct irq_desc *desc = irq_desc + irq;
|
|
desc->ic_prio = __ipipe_get_irq_priority(irq);
|
|
+ desc->thr_prio = __ipipe_get_irqthread_priority(irq);
|
|
}
|
|
#endif /* CONFIG_IPIPE */
|
|
|
|
@@ -1222,21 +1211,76 @@
|
|
return IVG15;
|
|
}
|
|
|
|
+int __ipipe_get_irqthread_priority(unsigned irq)
|
|
+{
|
|
+ int ient, prio;
|
|
+ int demux_irq;
|
|
+
|
|
+ /* The returned priority value is rescaled to [0..IVG13+1]
|
|
+ * with 0 being the lowest effective priority level. */
|
|
+
|
|
+ if (irq <= IRQ_CORETMR)
|
|
+ return IVG13 - irq + 1;
|
|
+
|
|
+ /* GPIO IRQs are given the priority of the demux
|
|
+ * interrupt. */
|
|
+ if (IS_GPIOIRQ(irq)) {
|
|
+#if defined(CONFIG_BF54x)
|
|
+ u32 bank = PINT_2_BANK(irq2pint_lut[irq - SYS_IRQS]);
|
|
+ demux_irq = (bank == 0 ? IRQ_PINT0 :
|
|
+ bank == 1 ? IRQ_PINT1 :
|
|
+ bank == 2 ? IRQ_PINT2 :
|
|
+ IRQ_PINT3);
|
|
+#elif defined(CONFIG_BF561)
|
|
+ demux_irq = (irq >= IRQ_PF32 ? IRQ_PROG2_INTA :
|
|
+ irq >= IRQ_PF16 ? IRQ_PROG1_INTA :
|
|
+ IRQ_PROG0_INTA);
|
|
+#elif defined(CONFIG_BF52x)
|
|
+ demux_irq = (irq >= IRQ_PH0 ? IRQ_PORTH_INTA :
|
|
+ irq >= IRQ_PG0 ? IRQ_PORTG_INTA :
|
|
+ IRQ_PORTF_INTA);
|
|
+#else
|
|
+ demux_irq = irq;
|
|
+#endif
|
|
+ return IVG13 - PRIO_GPIODEMUX(demux_irq) + 1;
|
|
+ }
|
|
+
|
|
+ /* The GPIO demux interrupt is given a lower priority
|
|
+ * than the GPIO IRQs, so that its threaded handler
|
|
+ * unmasks the interrupt line after the decoded IRQs
|
|
+ * have been processed. */
|
|
+ prio = PRIO_GPIODEMUX(irq);
|
|
+ /* demux irq? */
|
|
+ if (prio != -1)
|
|
+ return IVG13 - prio;
|
|
+
|
|
+ for (ient = 0; ient < NR_PERI_INTS; ient++) {
|
|
+ struct ivgx *ivg = ivg_table + ient;
|
|
+ if (ivg->irqno == irq) {
|
|
+ for (prio = 0; prio <= IVG13-IVG7; prio++) {
|
|
+ if (ivg7_13[prio].ifirst <= ivg &&
|
|
+ ivg7_13[prio].istop > ivg)
|
|
+ return IVG7 - prio;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
/* Hw interrupts are disabled on entry (check SAVE_CONTEXT). */
|
|
#ifdef CONFIG_DO_IRQ_L1
|
|
__attribute__((l1_text))
|
|
#endif
|
|
asmlinkage int __ipipe_grab_irq(int vec, struct pt_regs *regs)
|
|
{
|
|
- struct ipipe_percpu_domain_data *p = ipipe_root_cpudom_ptr();
|
|
- struct ipipe_domain *this_domain = ipipe_current_domain;
|
|
struct ivgx *ivg_stop = ivg7_13[vec-IVG7].istop;
|
|
struct ivgx *ivg = ivg7_13[vec-IVG7].ifirst;
|
|
- int irq, s;
|
|
+ int irq;
|
|
|
|
if (likely(vec == EVT_IVTMR_P)) {
|
|
irq = IRQ_CORETMR;
|
|
- goto core_tick;
|
|
+ goto handle_irq;
|
|
}
|
|
|
|
SSYNC();
|
|
@@ -1278,39 +1322,24 @@
|
|
irq = ivg->irqno;
|
|
|
|
if (irq == IRQ_SYSTMR) {
|
|
-#ifdef CONFIG_GENERIC_CLOCKEVENTS
|
|
-core_tick:
|
|
-#else
|
|
bfin_write_TIMER_STATUS(1); /* Latch TIMIL0 */
|
|
-#endif
|
|
/* This is basically what we need from the register frame. */
|
|
__raw_get_cpu_var(__ipipe_tick_regs).ipend = regs->ipend;
|
|
__raw_get_cpu_var(__ipipe_tick_regs).pc = regs->pc;
|
|
- if (this_domain != ipipe_root_domain)
|
|
- __raw_get_cpu_var(__ipipe_tick_regs).ipend &= ~0x10;
|
|
- else
|
|
+ if (!ipipe_root_domain_p)
|
|
__raw_get_cpu_var(__ipipe_tick_regs).ipend |= 0x10;
|
|
+ else
|
|
+ __raw_get_cpu_var(__ipipe_tick_regs).ipend &= ~0x10;
|
|
}
|
|
|
|
-#ifndef CONFIG_GENERIC_CLOCKEVENTS
|
|
-core_tick:
|
|
-#endif
|
|
- if (this_domain == ipipe_root_domain) {
|
|
- s = __test_and_set_bit(IPIPE_SYNCDEFER_FLAG, &p->status);
|
|
- barrier();
|
|
- }
|
|
+handle_irq:
|
|
|
|
ipipe_trace_irq_entry(irq);
|
|
__ipipe_handle_irq(irq, regs);
|
|
- ipipe_trace_irq_exit(irq);
|
|
+ ipipe_trace_irq_exit(irq);
|
|
|
|
- if (this_domain == ipipe_root_domain) {
|
|
- set_thread_flag(TIF_IRQ_SYNC);
|
|
- if (!s) {
|
|
- __clear_bit(IPIPE_SYNCDEFER_FLAG, &p->status);
|
|
- return !test_bit(IPIPE_STALL_FLAG, &p->status);
|
|
- }
|
|
- }
|
|
+ if (ipipe_root_domain_p)
|
|
+ return !test_bit(IPIPE_STALL_FLAG, &ipipe_root_cpudom_var(status));
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/pm.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/pm.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/pm.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/pm.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -82,9 +82,10 @@
|
|
|
|
bfin_pm_standby_restore();
|
|
|
|
-#ifdef SIC_IWR0
|
|
+#if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) || \
|
|
+ defined(CONFIG_BF538) || defined(CONFIG_BF539) || defined(CONFIG_BF51x)
|
|
bfin_write_SIC_IWR0(IWR_DISABLE_ALL);
|
|
-# ifdef SIC_IWR1
|
|
+#if defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
|
|
/* BF52x system reset does not properly reset SIC_IWR1 which
|
|
* will screw up the bootrom as it relies on MDMA0/1 waking it
|
|
* up from IDLE instructions. See this report for more info:
|
|
@@ -94,8 +95,10 @@
|
|
bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11));
|
|
else
|
|
bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
|
|
-# endif
|
|
-# ifdef SIC_IWR2
|
|
+#else
|
|
+ bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
|
|
+#endif
|
|
+# ifdef CONFIG_BF54x
|
|
bfin_write_SIC_IWR2(IWR_DISABLE_ALL);
|
|
# endif
|
|
#else
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mach-common/smp.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/smp.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mach-common/smp.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/smp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -158,14 +158,10 @@
|
|
kfree(msg);
|
|
break;
|
|
case BFIN_IPI_CALL_FUNC:
|
|
- spin_unlock(&msg_queue->lock);
|
|
ipi_call_function(cpu, msg);
|
|
- spin_lock(&msg_queue->lock);
|
|
break;
|
|
case BFIN_IPI_CPU_STOP:
|
|
- spin_unlock(&msg_queue->lock);
|
|
ipi_cpu_stop(cpu);
|
|
- spin_lock(&msg_queue->lock);
|
|
kfree(msg);
|
|
break;
|
|
default:
|
|
@@ -461,7 +457,7 @@
|
|
smp_flush_data.start = start;
|
|
smp_flush_data.end = end;
|
|
|
|
- if (smp_call_function(&ipi_flush_icache, &smp_flush_data, 0))
|
|
+ if (smp_call_function(&ipi_flush_icache, &smp_flush_data, 1))
|
|
printk(KERN_WARNING "SMP: failed to run I-cache flush request on other CPUs\n");
|
|
}
|
|
EXPORT_SYMBOL_GPL(smp_icache_flush_range_others);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/Makefile
|
|
--- linux-2.6.29.owrt/arch/blackfin/Makefile 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,67 +21,57 @@
|
|
KBUILD_DEFCONFIG := BF537-STAMP_defconfig
|
|
|
|
# setup the machine name and the machine dependent settings
|
|
-machine-$(CONFIG_BF512) := bf518
|
|
-machine-$(CONFIG_BF514) := bf518
|
|
-machine-$(CONFIG_BF516) := bf518
|
|
-machine-$(CONFIG_BF518) := bf518
|
|
-machine-$(CONFIG_BF522) := bf527
|
|
-machine-$(CONFIG_BF523) := bf527
|
|
-machine-$(CONFIG_BF524) := bf527
|
|
-machine-$(CONFIG_BF525) := bf527
|
|
-machine-$(CONFIG_BF526) := bf527
|
|
-machine-$(CONFIG_BF527) := bf527
|
|
-machine-$(CONFIG_BF531) := bf533
|
|
-machine-$(CONFIG_BF532) := bf533
|
|
-machine-$(CONFIG_BF533) := bf533
|
|
-machine-$(CONFIG_BF534) := bf537
|
|
-machine-$(CONFIG_BF536) := bf537
|
|
-machine-$(CONFIG_BF537) := bf537
|
|
-machine-$(CONFIG_BF538) := bf538
|
|
-machine-$(CONFIG_BF539) := bf538
|
|
-machine-$(CONFIG_BF542) := bf548
|
|
-machine-$(CONFIG_BF542M) := bf548
|
|
-machine-$(CONFIG_BF544) := bf548
|
|
-machine-$(CONFIG_BF544M) := bf548
|
|
-machine-$(CONFIG_BF547) := bf548
|
|
-machine-$(CONFIG_BF547M) := bf548
|
|
-machine-$(CONFIG_BF548) := bf548
|
|
-machine-$(CONFIG_BF548M) := bf548
|
|
-machine-$(CONFIG_BF549) := bf548
|
|
-machine-$(CONFIG_BF549M) := bf548
|
|
-machine-$(CONFIG_BF561) := bf561
|
|
+machine-$(CONFIG_BF512) := bf518
|
|
+machine-$(CONFIG_BF514) := bf518
|
|
+machine-$(CONFIG_BF516) := bf518
|
|
+machine-$(CONFIG_BF518) := bf518
|
|
+machine-$(CONFIG_BF522) := bf527
|
|
+machine-$(CONFIG_BF523) := bf527
|
|
+machine-$(CONFIG_BF524) := bf527
|
|
+machine-$(CONFIG_BF525) := bf527
|
|
+machine-$(CONFIG_BF526) := bf527
|
|
+machine-$(CONFIG_BF527) := bf527
|
|
+machine-$(CONFIG_BF531) := bf533
|
|
+machine-$(CONFIG_BF532) := bf533
|
|
+machine-$(CONFIG_BF533) := bf533
|
|
+machine-$(CONFIG_BF534) := bf537
|
|
+machine-$(CONFIG_BF536) := bf537
|
|
+machine-$(CONFIG_BF537) := bf537
|
|
+machine-$(CONFIG_BF538) := bf538
|
|
+machine-$(CONFIG_BF539) := bf538
|
|
+machine-$(CONFIG_BF542) := bf548
|
|
+machine-$(CONFIG_BF544) := bf548
|
|
+machine-$(CONFIG_BF547) := bf548
|
|
+machine-$(CONFIG_BF548) := bf548
|
|
+machine-$(CONFIG_BF549) := bf548
|
|
+machine-$(CONFIG_BF561) := bf561
|
|
MACHINE := $(machine-y)
|
|
export MACHINE
|
|
|
|
-cpu-$(CONFIG_BF512) := bf512
|
|
-cpu-$(CONFIG_BF514) := bf514
|
|
-cpu-$(CONFIG_BF516) := bf516
|
|
-cpu-$(CONFIG_BF518) := bf518
|
|
-cpu-$(CONFIG_BF522) := bf522
|
|
-cpu-$(CONFIG_BF523) := bf523
|
|
-cpu-$(CONFIG_BF524) := bf524
|
|
-cpu-$(CONFIG_BF525) := bf525
|
|
-cpu-$(CONFIG_BF526) := bf526
|
|
-cpu-$(CONFIG_BF527) := bf527
|
|
-cpu-$(CONFIG_BF531) := bf531
|
|
-cpu-$(CONFIG_BF532) := bf532
|
|
-cpu-$(CONFIG_BF533) := bf533
|
|
-cpu-$(CONFIG_BF534) := bf534
|
|
-cpu-$(CONFIG_BF536) := bf536
|
|
-cpu-$(CONFIG_BF537) := bf537
|
|
-cpu-$(CONFIG_BF538) := bf538
|
|
-cpu-$(CONFIG_BF539) := bf539
|
|
-cpu-$(CONFIG_BF542) := bf542
|
|
-cpu-$(CONFIG_BF542M) := bf542m
|
|
-cpu-$(CONFIG_BF544) := bf544
|
|
-cpu-$(CONFIG_BF544M) := bf544m
|
|
-cpu-$(CONFIG_BF547) := bf547
|
|
-cpu-$(CONFIG_BF547M) := bf547m
|
|
-cpu-$(CONFIG_BF548) := bf548
|
|
-cpu-$(CONFIG_BF548M) := bf548m
|
|
-cpu-$(CONFIG_BF549) := bf549
|
|
-cpu-$(CONFIG_BF549M) := bf549m
|
|
-cpu-$(CONFIG_BF561) := bf561
|
|
+cpu-$(CONFIG_BF512) := bf512
|
|
+cpu-$(CONFIG_BF514) := bf514
|
|
+cpu-$(CONFIG_BF516) := bf516
|
|
+cpu-$(CONFIG_BF518) := bf518
|
|
+cpu-$(CONFIG_BF522) := bf522
|
|
+cpu-$(CONFIG_BF523) := bf523
|
|
+cpu-$(CONFIG_BF524) := bf524
|
|
+cpu-$(CONFIG_BF525) := bf525
|
|
+cpu-$(CONFIG_BF526) := bf526
|
|
+cpu-$(CONFIG_BF527) := bf527
|
|
+cpu-$(CONFIG_BF531) := bf531
|
|
+cpu-$(CONFIG_BF532) := bf532
|
|
+cpu-$(CONFIG_BF533) := bf533
|
|
+cpu-$(CONFIG_BF534) := bf534
|
|
+cpu-$(CONFIG_BF536) := bf536
|
|
+cpu-$(CONFIG_BF537) := bf537
|
|
+cpu-$(CONFIG_BF538) := bf538
|
|
+cpu-$(CONFIG_BF539) := bf539
|
|
+cpu-$(CONFIG_BF542) := bf542
|
|
+cpu-$(CONFIG_BF544) := bf544
|
|
+cpu-$(CONFIG_BF547) := bf547
|
|
+cpu-$(CONFIG_BF548) := bf548
|
|
+cpu-$(CONFIG_BF549) := bf549
|
|
+cpu-$(CONFIG_BF561) := bf561
|
|
|
|
rev-$(CONFIG_BF_REV_0_0) := 0.0
|
|
rev-$(CONFIG_BF_REV_0_1) := 0.1
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/blackfin/mm/init.c linux-2.6.29-rc3.owrt/arch/blackfin/mm/init.c
|
|
--- linux-2.6.29.owrt/arch/blackfin/mm/init.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/blackfin/mm/init.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -104,7 +104,7 @@
|
|
}
|
|
}
|
|
|
|
-asmlinkage void __init init_pda(void)
|
|
+asmlinkage void init_pda(void)
|
|
{
|
|
unsigned int cpu = raw_smp_processor_id();
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/frv/mm/dma-alloc.c linux-2.6.29-rc3.owrt/arch/frv/mm/dma-alloc.c
|
|
--- linux-2.6.29.owrt/arch/frv/mm/dma-alloc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/frv/mm/dma-alloc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -36,10 +36,10 @@
|
|
#include <linux/vmalloc.h>
|
|
#include <linux/init.h>
|
|
#include <linux/pci.h>
|
|
-#include <linux/hardirq.h>
|
|
|
|
#include <asm/pgalloc.h>
|
|
#include <asm/io.h>
|
|
+#include <asm/hardirq.h>
|
|
#include <asm/mmu_context.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/mmu.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/hp/common/sba_iommu.c linux-2.6.29-rc3.owrt/arch/ia64/hp/common/sba_iommu.c
|
|
--- linux-2.6.29.owrt/arch/ia64/hp/common/sba_iommu.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/hp/common/sba_iommu.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -906,7 +906,7 @@
|
|
* @dir: R/W or both.
|
|
* @attrs: optional dma attributes
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
dma_addr_t
|
|
sba_map_single_attrs(struct device *dev, void *addr, size_t size, int dir,
|
|
@@ -1024,7 +1024,7 @@
|
|
* @dir: R/W or both.
|
|
* @attrs: optional dma attributes
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
void sba_unmap_single_attrs(struct device *dev, dma_addr_t iova, size_t size,
|
|
int dir, struct dma_attrs *attrs)
|
|
@@ -1102,7 +1102,7 @@
|
|
* @size: number of bytes mapped in driver buffer.
|
|
* @dma_handle: IOVA of new buffer.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
void *
|
|
sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags)
|
|
@@ -1165,7 +1165,7 @@
|
|
* @vaddr: virtual address IOVA of "consistent" buffer.
|
|
* @dma_handler: IO virtual address of "consistent" buffer.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
void sba_free_coherent (struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle)
|
|
{
|
|
@@ -1420,7 +1420,7 @@
|
|
* @dir: R/W or both.
|
|
* @attrs: optional dma attributes
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
int sba_map_sg_attrs(struct device *dev, struct scatterlist *sglist, int nents,
|
|
int dir, struct dma_attrs *attrs)
|
|
@@ -1512,7 +1512,7 @@
|
|
* @dir: R/W or both.
|
|
* @attrs: optional dma attributes
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
void sba_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,
|
|
int nents, int dir, struct dma_attrs *attrs)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/include/asm/kvm.h linux-2.6.29-rc3.owrt/arch/ia64/include/asm/kvm.h
|
|
--- linux-2.6.29.owrt/arch/ia64/include/asm/kvm.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/include/asm/kvm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -25,10 +25,6 @@
|
|
|
|
#include <linux/ioctl.h>
|
|
|
|
-/* Select x86 specific features in <linux/kvm.h> */
|
|
-#define __KVM_HAVE_IOAPIC
|
|
-#define __KVM_HAVE_DEVICE_ASSIGNMENT
|
|
-
|
|
/* Architectural interrupt line count. */
|
|
#define KVM_NR_INTERRUPTS 256
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/include/asm/mmzone.h linux-2.6.29-rc3.owrt/arch/ia64/include/asm/mmzone.h
|
|
--- linux-2.6.29.owrt/arch/ia64/include/asm/mmzone.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/include/asm/mmzone.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -31,6 +31,10 @@
|
|
#endif
|
|
}
|
|
|
|
+#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
|
|
+extern int early_pfn_to_nid(unsigned long pfn);
|
|
+#endif
|
|
+
|
|
#ifdef CONFIG_IA64_DIG /* DIG systems are small */
|
|
# define MAX_PHYSNODE_ID 8
|
|
# define NR_NODE_MEMBLKS (MAX_NUMNODES * 8)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/include/asm/sn/bte.h linux-2.6.29-rc3.owrt/arch/ia64/include/asm/sn/bte.h
|
|
--- linux-2.6.29.owrt/arch/ia64/include/asm/sn/bte.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/include/asm/sn/bte.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -39,7 +39,7 @@
|
|
/* BTE status register only supports 16 bits for length field */
|
|
#define BTE_LEN_BITS (16)
|
|
#define BTE_LEN_MASK ((1 << BTE_LEN_BITS) - 1)
|
|
-#define BTE_MAX_XFER (BTE_LEN_MASK << L1_CACHE_SHIFT)
|
|
+#define BTE_MAX_XFER ((1 << BTE_LEN_BITS) * L1_CACHE_BYTES)
|
|
|
|
|
|
/* Define hardware */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/Kconfig linux-2.6.29-rc3.owrt/arch/ia64/Kconfig
|
|
--- linux-2.6.29.owrt/arch/ia64/Kconfig 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -221,11 +221,7 @@
|
|
|
|
config IA64_XEN_GUEST
|
|
bool "Xen guest"
|
|
- select SWIOTLB
|
|
depends on XEN
|
|
- help
|
|
- Build a kernel that runs on Xen guest domain. At this moment only
|
|
- 16KB page size in supported.
|
|
|
|
endchoice
|
|
|
|
@@ -483,7 +479,8 @@
|
|
default y if VIRTUAL_MEM_MAP
|
|
|
|
config HAVE_ARCH_EARLY_PFN_TO_NID
|
|
- def_bool NUMA && SPARSEMEM
|
|
+ def_bool y
|
|
+ depends on NEED_MULTIPLE_NODES
|
|
|
|
config HAVE_ARCH_NODEDATA_EXTENSION
|
|
def_bool y
|
|
@@ -638,17 +635,6 @@
|
|
and include PCI device scope covered by these DMA
|
|
remapping devices.
|
|
|
|
-config DMAR_DEFAULT_ON
|
|
- def_bool y
|
|
- prompt "Enable DMA Remapping Devices by default"
|
|
- depends on DMAR
|
|
- help
|
|
- Selecting this option will enable a DMAR device at boot time if
|
|
- one is found. If this option is not selected, DMAR support can
|
|
- be enabled by passing intel_iommu=on to the kernel. It is
|
|
- recommended you say N here while the DMAR code remains
|
|
- experimental.
|
|
-
|
|
endmenu
|
|
|
|
endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/kernel/iosapic.c linux-2.6.29-rc3.owrt/arch/ia64/kernel/iosapic.c
|
|
--- linux-2.6.29.owrt/arch/ia64/kernel/iosapic.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/kernel/iosapic.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -507,7 +507,7 @@
|
|
if (trigger == IOSAPIC_EDGE)
|
|
return -EINVAL;
|
|
|
|
- for (i = 0; i < NR_IRQS; i++) {
|
|
+ for (i = 0; i <= NR_IRQS; i++) {
|
|
info = &iosapic_intr_info[i];
|
|
if (info->trigger == trigger && info->polarity == pol &&
|
|
(info->dmode == IOSAPIC_FIXED ||
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/kernel/smpboot.c linux-2.6.29-rc3.owrt/arch/ia64/kernel/smpboot.c
|
|
--- linux-2.6.29.owrt/arch/ia64/kernel/smpboot.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/kernel/smpboot.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -736,15 +736,14 @@
|
|
return -EBUSY;
|
|
}
|
|
|
|
- cpu_clear(cpu, cpu_online_map);
|
|
-
|
|
if (migrate_platform_irqs(cpu)) {
|
|
cpu_set(cpu, cpu_online_map);
|
|
- return -EBUSY;
|
|
+ return (-EBUSY);
|
|
}
|
|
|
|
remove_siblinginfo(cpu);
|
|
fixup_irqs();
|
|
+ cpu_clear(cpu, cpu_online_map);
|
|
local_flush_tlb_all();
|
|
cpu_clear(cpu, cpu_callin_map);
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/kernel/unwind.c linux-2.6.29-rc3.owrt/arch/ia64/kernel/unwind.c
|
|
--- linux-2.6.29.owrt/arch/ia64/kernel/unwind.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/kernel/unwind.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2149,7 +2149,7 @@
|
|
|
|
/* next, remove hash table entries for this table */
|
|
|
|
- for (index = 0; index < UNW_HASH_SIZE; ++index) {
|
|
+ for (index = 0; index <= UNW_HASH_SIZE; ++index) {
|
|
tmp = unw.cache + unw.hash[index];
|
|
if (unw.hash[index] >= UNW_CACHE_SIZE
|
|
|| tmp->ip < table->start || tmp->ip >= table->end)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/kvm/kvm-ia64.c linux-2.6.29-rc3.owrt/arch/ia64/kvm/kvm-ia64.c
|
|
--- linux-2.6.29.owrt/arch/ia64/kvm/kvm-ia64.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/kvm/kvm-ia64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1337,10 +1337,6 @@
|
|
}
|
|
}
|
|
|
|
-void kvm_arch_sync_events(struct kvm *kvm)
|
|
-{
|
|
-}
|
|
-
|
|
void kvm_arch_destroy_vm(struct kvm *kvm)
|
|
{
|
|
kvm_iommu_unmap_guest(kvm);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/kvm/process.c linux-2.6.29-rc3.owrt/arch/ia64/kvm/process.c
|
|
--- linux-2.6.29.owrt/arch/ia64/kvm/process.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/kvm/process.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -455,18 +455,13 @@
|
|
if (!vmm_fpswa_interface)
|
|
return (fpswa_ret_t) {-1, 0, 0, 0};
|
|
|
|
- memset(&fp_state, 0, sizeof(fp_state_t));
|
|
-
|
|
/*
|
|
- * compute fp_state. only FP registers f6 - f11 are used by the
|
|
- * vmm, so set those bits in the mask and set the low volatile
|
|
- * pointer to point to these registers.
|
|
+ * Just let fpswa driver to use hardware fp registers.
|
|
+ * No fp register is valid in memory.
|
|
*/
|
|
- fp_state.bitmask_low64 = 0xfc0; /* bit6..bit11 */
|
|
-
|
|
- fp_state.fp_state_low_volatile = (fp_state_low_volatile_t *) ®s->f6;
|
|
+ memset(&fp_state, 0, sizeof(fp_state_t));
|
|
|
|
- /*
|
|
+ /*
|
|
* unsigned long (*EFI_FPSWA) (
|
|
* unsigned long trap_type,
|
|
* void *Bundle,
|
|
@@ -550,6 +545,10 @@
|
|
status = vmm_handle_fpu_swa(0, regs, isr);
|
|
if (!status)
|
|
return ;
|
|
+ else if (-EAGAIN == status) {
|
|
+ vcpu_decrement_iip(vcpu);
|
|
+ return ;
|
|
+ }
|
|
break;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/mm/numa.c linux-2.6.29-rc3.owrt/arch/ia64/mm/numa.c
|
|
--- linux-2.6.29.owrt/arch/ia64/mm/numa.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/mm/numa.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -58,7 +58,7 @@
|
|
* SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where
|
|
* the section resides.
|
|
*/
|
|
-int __meminit __early_pfn_to_nid(unsigned long pfn)
|
|
+int early_pfn_to_nid(unsigned long pfn)
|
|
{
|
|
int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec;
|
|
|
|
@@ -70,7 +70,7 @@
|
|
return node_memblk[i].nid;
|
|
}
|
|
|
|
- return -1;
|
|
+ return 0;
|
|
}
|
|
|
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/sn/kernel/bte.c linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/bte.c
|
|
--- linux-2.6.29.owrt/arch/ia64/sn/kernel/bte.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/bte.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -97,10 +97,9 @@
|
|
return BTE_SUCCESS;
|
|
}
|
|
|
|
- BUG_ON(len & L1_CACHE_MASK);
|
|
- BUG_ON(src & L1_CACHE_MASK);
|
|
- BUG_ON(dest & L1_CACHE_MASK);
|
|
- BUG_ON(len > BTE_MAX_XFER);
|
|
+ BUG_ON((len & L1_CACHE_MASK) ||
|
|
+ (src & L1_CACHE_MASK) || (dest & L1_CACHE_MASK));
|
|
+ BUG_ON(!(len < ((BTE_LEN_MASK + 1) << L1_CACHE_SHIFT)));
|
|
|
|
/*
|
|
* Start with interface corresponding to cpu number
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/sn/kernel/io_acpi_init.c linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/io_acpi_init.c
|
|
--- linux-2.6.29.owrt/arch/ia64/sn/kernel/io_acpi_init.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/io_acpi_init.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -443,7 +443,7 @@
|
|
size = pci_resource_len(dev, PCI_ROM_RESOURCE);
|
|
addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE],
|
|
size);
|
|
- image_size = pci_get_rom_size(dev, addr, size);
|
|
+ image_size = pci_get_rom_size(addr, size);
|
|
dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr;
|
|
dev->resource[PCI_ROM_RESOURCE].end =
|
|
(unsigned long) addr + image_size - 1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/sn/kernel/io_init.c linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/io_init.c
|
|
--- linux-2.6.29.owrt/arch/ia64/sn/kernel/io_init.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/io_init.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -269,7 +269,7 @@
|
|
|
|
rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE),
|
|
size + 1);
|
|
- image_size = pci_get_rom_size(dev, rom, size + 1);
|
|
+ image_size = pci_get_rom_size(rom, size + 1);
|
|
dev->resource[PCI_ROM_RESOURCE].end =
|
|
dev->resource[PCI_ROM_RESOURCE].start +
|
|
image_size - 1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/sn/pci/pcibr/pcibr_dma.c linux-2.6.29-rc3.owrt/arch/ia64/sn/pci/pcibr/pcibr_dma.c
|
|
--- linux-2.6.29.owrt/arch/ia64/sn/pci/pcibr/pcibr_dma.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/sn/pci/pcibr/pcibr_dma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -135,10 +135,11 @@
|
|
if (SN_DMA_ADDRTYPE(dma_flags) == SN_DMA_ADDR_PHYS)
|
|
pci_addr = IS_PIC_SOFT(pcibus_info) ?
|
|
PHYS_TO_DMA(paddr) :
|
|
- PHYS_TO_TIODMA(paddr);
|
|
+ PHYS_TO_TIODMA(paddr) | dma_attributes;
|
|
else
|
|
- pci_addr = paddr;
|
|
- pci_addr |= dma_attributes;
|
|
+ pci_addr = IS_PIC_SOFT(pcibus_info) ?
|
|
+ paddr :
|
|
+ paddr | dma_attributes;
|
|
|
|
/* Handle Bus mode */
|
|
if (IS_PCIX(pcibus_info))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/xen/Kconfig linux-2.6.29-rc3.owrt/arch/ia64/xen/Kconfig
|
|
--- linux-2.6.29.owrt/arch/ia64/xen/Kconfig 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/xen/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -8,7 +8,8 @@
|
|
depends on PARAVIRT && MCKINLEY && IA64_PAGE_SIZE_16KB && EXPERIMENTAL
|
|
select XEN_XENCOMM
|
|
select NO_IDLE_HZ
|
|
- # followings are required to save/restore.
|
|
+
|
|
+ # those are required to save/restore.
|
|
select ARCH_SUSPEND_POSSIBLE
|
|
select SUSPEND
|
|
select PM_SLEEP
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/ia64/xen/xen_pv_ops.c linux-2.6.29-rc3.owrt/arch/ia64/xen/xen_pv_ops.c
|
|
--- linux-2.6.29.owrt/arch/ia64/xen/xen_pv_ops.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/ia64/xen/xen_pv_ops.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -153,7 +153,7 @@
|
|
xen_setup_vcpu_info_placement();
|
|
}
|
|
|
|
-static const struct pv_init_ops xen_init_ops __initconst = {
|
|
+static const struct pv_init_ops xen_init_ops __initdata = {
|
|
.banner = xen_banner,
|
|
|
|
.reserve_memory = xen_reserve_memory,
|
|
@@ -337,7 +337,7 @@
|
|
HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
|
|
}
|
|
|
|
-static const struct pv_iosapic_ops xen_iosapic_ops __initconst = {
|
|
+static const struct pv_iosapic_ops xen_iosapic_ops __initdata = {
|
|
.pcat_compat_init = xen_pcat_compat_init,
|
|
.__get_irq_chip = xen_iosapic_get_irq_chip,
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/atari/ataints.c linux-2.6.29-rc3.owrt/arch/m68k/atari/ataints.c
|
|
--- linux-2.6.29.owrt/arch/m68k/atari/ataints.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/atari/ataints.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -187,8 +187,8 @@
|
|
" jbra ret_from_interrupt\n" \
|
|
: : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \
|
|
"n" (PT_OFF_SR), "n" (n), \
|
|
- "i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &st_mfp.int_mk_a) \
|
|
- : (n & 16 ? &tt_mfp.int_mk_b : &st_mfp.int_mk_b)), \
|
|
+ "i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &mfp.int_mk_a) \
|
|
+ : (n & 16 ? &tt_mfp.int_mk_b : &mfp.int_mk_b)), \
|
|
"m" (preempt_count()), "di" (HARDIRQ_OFFSET) \
|
|
); \
|
|
for (;;); /* fake noreturn */ \
|
|
@@ -366,14 +366,14 @@
|
|
/* Initialize the MFP(s) */
|
|
|
|
#ifdef ATARI_USE_SOFTWARE_EOI
|
|
- st_mfp.vec_adr = 0x48; /* Software EOI-Mode */
|
|
+ mfp.vec_adr = 0x48; /* Software EOI-Mode */
|
|
#else
|
|
- st_mfp.vec_adr = 0x40; /* Automatic EOI-Mode */
|
|
+ mfp.vec_adr = 0x40; /* Automatic EOI-Mode */
|
|
#endif
|
|
- st_mfp.int_en_a = 0x00; /* turn off MFP-Ints */
|
|
- st_mfp.int_en_b = 0x00;
|
|
- st_mfp.int_mk_a = 0xff; /* no Masking */
|
|
- st_mfp.int_mk_b = 0xff;
|
|
+ mfp.int_en_a = 0x00; /* turn off MFP-Ints */
|
|
+ mfp.int_en_b = 0x00;
|
|
+ mfp.int_mk_a = 0xff; /* no Masking */
|
|
+ mfp.int_mk_b = 0xff;
|
|
|
|
if (ATARIHW_PRESENT(TT_MFP)) {
|
|
#ifdef ATARI_USE_SOFTWARE_EOI
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/atari/atakeyb.c linux-2.6.29-rc3.owrt/arch/m68k/atari/atakeyb.c
|
|
--- linux-2.6.29.owrt/arch/m68k/atari/atakeyb.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/atari/atakeyb.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -609,10 +609,10 @@
|
|
ACIA_RHTID : 0);
|
|
|
|
/* make sure the interrupt line is up */
|
|
- } while ((st_mfp.par_dt_reg & 0x10) == 0);
|
|
+ } while ((mfp.par_dt_reg & 0x10) == 0);
|
|
|
|
/* enable ACIA Interrupts */
|
|
- st_mfp.active_edge &= ~0x10;
|
|
+ mfp.active_edge &= ~0x10;
|
|
atari_turnon_irq(IRQ_MFP_ACIA);
|
|
|
|
ikbd_self_test = 1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/atari/config.c linux-2.6.29-rc3.owrt/arch/m68k/atari/config.c
|
|
--- linux-2.6.29.owrt/arch/m68k/atari/config.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/atari/config.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -258,7 +258,7 @@
|
|
printk("STND_SHIFTER ");
|
|
}
|
|
}
|
|
- if (hwreg_present(&st_mfp.par_dt_reg)) {
|
|
+ if (hwreg_present(&mfp.par_dt_reg)) {
|
|
ATARIHW_SET(ST_MFP);
|
|
printk("ST_MFP ");
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/atari/debug.c linux-2.6.29-rc3.owrt/arch/m68k/atari/debug.c
|
|
--- linux-2.6.29.owrt/arch/m68k/atari/debug.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/atari/debug.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -34,9 +34,9 @@
|
|
|
|
static inline void ata_mfp_out(char c)
|
|
{
|
|
- while (!(st_mfp.trn_stat & 0x80)) /* wait for tx buf empty */
|
|
+ while (!(mfp.trn_stat & 0x80)) /* wait for tx buf empty */
|
|
barrier();
|
|
- st_mfp.usart_dta = c;
|
|
+ mfp.usart_dta = c;
|
|
}
|
|
|
|
static void atari_mfp_console_write(struct console *co, const char *str,
|
|
@@ -91,7 +91,7 @@
|
|
/* This a some-seconds timeout in case no printer is connected */
|
|
unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ;
|
|
|
|
- while ((st_mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */
|
|
+ while ((mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */
|
|
;
|
|
if (!i)
|
|
return 0;
|
|
@@ -131,9 +131,9 @@
|
|
#if 0
|
|
int atari_mfp_console_wait_key(struct console *co)
|
|
{
|
|
- while (!(st_mfp.rcv_stat & 0x80)) /* wait for rx buf filled */
|
|
+ while (!(mfp.rcv_stat & 0x80)) /* wait for rx buf filled */
|
|
barrier();
|
|
- return st_mfp.usart_dta;
|
|
+ return mfp.usart_dta;
|
|
}
|
|
|
|
int atari_scc_console_wait_key(struct console *co)
|
|
@@ -175,12 +175,12 @@
|
|
baud = B9600; /* use default 9600bps for non-implemented rates */
|
|
baud -= B1200; /* baud_table[] starts at 1200bps */
|
|
|
|
- st_mfp.trn_stat &= ~0x01; /* disable TX */
|
|
- st_mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
|
|
- st_mfp.tim_ct_cd &= 0x70; /* stop timer D */
|
|
- st_mfp.tim_dt_d = baud_table[baud];
|
|
- st_mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */
|
|
- st_mfp.trn_stat |= 0x01; /* enable TX */
|
|
+ mfp.trn_stat &= ~0x01; /* disable TX */
|
|
+ mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
|
|
+ mfp.tim_ct_cd &= 0x70; /* stop timer D */
|
|
+ mfp.tim_dt_d = baud_table[baud];
|
|
+ mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */
|
|
+ mfp.trn_stat |= 0x01; /* enable TX */
|
|
}
|
|
|
|
#define SCC_WRITE(reg, val) \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/atari/time.c linux-2.6.29-rc3.owrt/arch/m68k/atari/time.c
|
|
--- linux-2.6.29.owrt/arch/m68k/atari/time.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/atari/time.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -27,9 +27,9 @@
|
|
atari_sched_init(irq_handler_t timer_routine)
|
|
{
|
|
/* set Timer C data Register */
|
|
- st_mfp.tim_dt_c = INT_TICKS;
|
|
+ mfp.tim_dt_c = INT_TICKS;
|
|
/* start timer C, div = 1:100 */
|
|
- st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60;
|
|
+ mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60;
|
|
/* install interrupt service routine for MFP Timer C */
|
|
if (request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW,
|
|
"timer", timer_routine))
|
|
@@ -46,11 +46,11 @@
|
|
unsigned long ticks, offset = 0;
|
|
|
|
/* read MFP timer C current value */
|
|
- ticks = st_mfp.tim_dt_c;
|
|
+ ticks = mfp.tim_dt_c;
|
|
/* The probability of underflow is less than 2% */
|
|
if (ticks > INT_TICKS - INT_TICKS / 50)
|
|
/* Check for pending timer interrupt */
|
|
- if (st_mfp.int_pn_b & (1 << 5))
|
|
+ if (mfp.int_pn_b & (1 << 5))
|
|
offset = TICK_SIZE;
|
|
|
|
ticks = INT_TICKS - ticks;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/atarihw.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/atarihw.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/atarihw.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/atarihw.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -113,7 +113,7 @@
|
|
* of nops on various machines. Somebody claimed that the tstb takes 600 ns.
|
|
*/
|
|
#define MFPDELAY() \
|
|
- __asm__ __volatile__ ( "tstb %0" : : "m" (st_mfp.par_dt_reg) : "cc" );
|
|
+ __asm__ __volatile__ ( "tstb %0" : : "m" (mfp.par_dt_reg) : "cc" );
|
|
|
|
/* Do cache push/invalidate for DMA read/write. This function obeys the
|
|
* snooping on some machines (Medusa) and processors: The Medusa itself can
|
|
@@ -565,7 +565,7 @@
|
|
u_char char_dummy23;
|
|
u_char usart_dta;
|
|
};
|
|
-# define st_mfp ((*(volatile struct MFP*)MFP_BAS))
|
|
+# define mfp ((*(volatile struct MFP*)MFP_BAS))
|
|
|
|
/* TT's second MFP */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/atariints.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/atariints.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/atariints.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/atariints.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -113,7 +113,7 @@
|
|
{ unsigned char mask, *reg;
|
|
|
|
mask = 1 << (irq & 7);
|
|
- reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
|
|
+ reg = (unsigned char *)&mfp.int_en_a + type*4 +
|
|
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
|
return( *reg & mask );
|
|
}
|
|
@@ -123,7 +123,7 @@
|
|
{ unsigned char mask, *reg;
|
|
|
|
mask = 1 << (irq & 7);
|
|
- reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
|
|
+ reg = (unsigned char *)&mfp.int_en_a + type*4 +
|
|
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
|
__asm__ __volatile__ ( "orb %0,%1"
|
|
: : "di" (mask), "m" (*reg) : "memory" );
|
|
@@ -134,7 +134,7 @@
|
|
{ unsigned char mask, *reg;
|
|
|
|
mask = ~(1 << (irq & 7));
|
|
- reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
|
|
+ reg = (unsigned char *)&mfp.int_en_a + type*4 +
|
|
((irq & 8) >> 2) + (((irq-8) & 16) << 3);
|
|
if (type == MFP_PENDING || type == MFP_SERVICE)
|
|
__asm__ __volatile__ ( "moveb %0,%1"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/param.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/param.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,26 +1,5 @@
|
|
-#ifndef _M68K_PARAM_H
|
|
-#define _M68K_PARAM_H
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-# define HZ CONFIG_HZ /* Internal kernel timer frequency */
|
|
-# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
|
|
-# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
|
|
-#endif
|
|
-
|
|
-#ifndef HZ
|
|
-#define HZ 100
|
|
-#endif
|
|
-
|
|
#ifdef __uClinux__
|
|
-#define EXEC_PAGESIZE 4096
|
|
+#include "param_no.h"
|
|
#else
|
|
-#define EXEC_PAGESIZE 8192
|
|
-#endif
|
|
-
|
|
-#ifndef NOGROUP
|
|
-#define NOGROUP (-1)
|
|
+#include "param_mm.h"
|
|
#endif
|
|
-
|
|
-#define MAXHOSTNAMELEN 64 /* max length of hostname */
|
|
-
|
|
-#endif /* _M68K_PARAM_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/param_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param_mm.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/param_mm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param_mm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,22 @@
|
|
+#ifndef _M68K_PARAM_H
|
|
+#define _M68K_PARAM_H
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+# define HZ CONFIG_HZ /* Internal kernel timer frequency */
|
|
+# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
|
|
+# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
|
|
+#endif
|
|
+
|
|
+#ifndef HZ
|
|
+#define HZ 100
|
|
+#endif
|
|
+
|
|
+#define EXEC_PAGESIZE 8192
|
|
+
|
|
+#ifndef NOGROUP
|
|
+#define NOGROUP (-1)
|
|
+#endif
|
|
+
|
|
+#define MAXHOSTNAMELEN 64 /* max length of hostname */
|
|
+
|
|
+#endif /* _M68K_PARAM_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/param_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param_no.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/param_no.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param_no.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,22 @@
|
|
+#ifndef _M68KNOMMU_PARAM_H
|
|
+#define _M68KNOMMU_PARAM_H
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+#define HZ CONFIG_HZ
|
|
+#define USER_HZ HZ
|
|
+#define CLOCKS_PER_SEC (USER_HZ)
|
|
+#endif
|
|
+
|
|
+#ifndef HZ
|
|
+#define HZ 100
|
|
+#endif
|
|
+
|
|
+#define EXEC_PAGESIZE 4096
|
|
+
|
|
+#ifndef NOGROUP
|
|
+#define NOGROUP (-1)
|
|
+#endif
|
|
+
|
|
+#define MAXHOSTNAMELEN 64 /* max length of hostname */
|
|
+
|
|
+#endif /* _M68KNOMMU_PARAM_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/ptrace.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/ptrace.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,87 +1,5 @@
|
|
-#ifndef _M68K_PTRACE_H
|
|
-#define _M68K_PTRACE_H
|
|
-
|
|
-#define PT_D1 0
|
|
-#define PT_D2 1
|
|
-#define PT_D3 2
|
|
-#define PT_D4 3
|
|
-#define PT_D5 4
|
|
-#define PT_D6 5
|
|
-#define PT_D7 6
|
|
-#define PT_A0 7
|
|
-#define PT_A1 8
|
|
-#define PT_A2 9
|
|
-#define PT_A3 10
|
|
-#define PT_A4 11
|
|
-#define PT_A5 12
|
|
-#define PT_A6 13
|
|
-#define PT_D0 14
|
|
-#define PT_USP 15
|
|
-#define PT_ORIG_D0 16
|
|
-#define PT_SR 17
|
|
-#define PT_PC 18
|
|
-
|
|
-#ifndef __ASSEMBLY__
|
|
-
|
|
-/* this struct defines the way the registers are stored on the
|
|
- stack during a system call. */
|
|
-
|
|
-struct pt_regs {
|
|
- long d1;
|
|
- long d2;
|
|
- long d3;
|
|
- long d4;
|
|
- long d5;
|
|
- long a0;
|
|
- long a1;
|
|
- long a2;
|
|
- long d0;
|
|
- long orig_d0;
|
|
- long stkadj;
|
|
-#ifdef CONFIG_COLDFIRE
|
|
- unsigned format : 4; /* frame format specifier */
|
|
- unsigned vector : 12; /* vector offset */
|
|
- unsigned short sr;
|
|
- unsigned long pc;
|
|
+#ifdef __uClinux__
|
|
+#include "ptrace_no.h"
|
|
#else
|
|
- unsigned short sr;
|
|
- unsigned long pc;
|
|
- unsigned format : 4; /* frame format specifier */
|
|
- unsigned vector : 12; /* vector offset */
|
|
+#include "ptrace_mm.h"
|
|
#endif
|
|
-};
|
|
-
|
|
-/*
|
|
- * This is the extended stack used by signal handlers and the context
|
|
- * switcher: it's pushed after the normal "struct pt_regs".
|
|
- */
|
|
-struct switch_stack {
|
|
- unsigned long d6;
|
|
- unsigned long d7;
|
|
- unsigned long a3;
|
|
- unsigned long a4;
|
|
- unsigned long a5;
|
|
- unsigned long a6;
|
|
- unsigned long retpc;
|
|
-};
|
|
-
|
|
-/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
|
|
-#define PTRACE_GETREGS 12
|
|
-#define PTRACE_SETREGS 13
|
|
-#define PTRACE_GETFPREGS 14
|
|
-#define PTRACE_SETFPREGS 15
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-
|
|
-#ifndef PS_S
|
|
-#define PS_S (0x2000)
|
|
-#define PS_M (0x1000)
|
|
-#endif
|
|
-
|
|
-#define user_mode(regs) (!((regs)->sr & PS_S))
|
|
-#define instruction_pointer(regs) ((regs)->pc)
|
|
-#define profile_pc(regs) instruction_pointer(regs)
|
|
-extern void show_regs(struct pt_regs *);
|
|
-#endif /* __KERNEL__ */
|
|
-#endif /* __ASSEMBLY__ */
|
|
-#endif /* _M68K_PTRACE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/ptrace_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace_mm.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/ptrace_mm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace_mm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,80 @@
|
|
+#ifndef _M68K_PTRACE_H
|
|
+#define _M68K_PTRACE_H
|
|
+
|
|
+#define PT_D1 0
|
|
+#define PT_D2 1
|
|
+#define PT_D3 2
|
|
+#define PT_D4 3
|
|
+#define PT_D5 4
|
|
+#define PT_D6 5
|
|
+#define PT_D7 6
|
|
+#define PT_A0 7
|
|
+#define PT_A1 8
|
|
+#define PT_A2 9
|
|
+#define PT_A3 10
|
|
+#define PT_A4 11
|
|
+#define PT_A5 12
|
|
+#define PT_A6 13
|
|
+#define PT_D0 14
|
|
+#define PT_USP 15
|
|
+#define PT_ORIG_D0 16
|
|
+#define PT_SR 17
|
|
+#define PT_PC 18
|
|
+
|
|
+#ifndef __ASSEMBLY__
|
|
+
|
|
+/* this struct defines the way the registers are stored on the
|
|
+ stack during a system call. */
|
|
+
|
|
+struct pt_regs {
|
|
+ long d1;
|
|
+ long d2;
|
|
+ long d3;
|
|
+ long d4;
|
|
+ long d5;
|
|
+ long a0;
|
|
+ long a1;
|
|
+ long a2;
|
|
+ long d0;
|
|
+ long orig_d0;
|
|
+ long stkadj;
|
|
+ unsigned short sr;
|
|
+ unsigned long pc;
|
|
+ unsigned format : 4; /* frame format specifier */
|
|
+ unsigned vector : 12; /* vector offset */
|
|
+};
|
|
+
|
|
+/*
|
|
+ * This is the extended stack used by signal handlers and the context
|
|
+ * switcher: it's pushed after the normal "struct pt_regs".
|
|
+ */
|
|
+struct switch_stack {
|
|
+ unsigned long d6;
|
|
+ unsigned long d7;
|
|
+ unsigned long a3;
|
|
+ unsigned long a4;
|
|
+ unsigned long a5;
|
|
+ unsigned long a6;
|
|
+ unsigned long retpc;
|
|
+};
|
|
+
|
|
+/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
|
|
+#define PTRACE_GETREGS 12
|
|
+#define PTRACE_SETREGS 13
|
|
+#define PTRACE_GETFPREGS 14
|
|
+#define PTRACE_SETFPREGS 15
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#ifndef PS_S
|
|
+#define PS_S (0x2000)
|
|
+#define PS_M (0x1000)
|
|
+#endif
|
|
+
|
|
+#define user_mode(regs) (!((regs)->sr & PS_S))
|
|
+#define instruction_pointer(regs) ((regs)->pc)
|
|
+#define profile_pc(regs) instruction_pointer(regs)
|
|
+extern void show_regs(struct pt_regs *);
|
|
+#endif /* __KERNEL__ */
|
|
+#endif /* __ASSEMBLY__ */
|
|
+#endif /* _M68K_PTRACE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/ptrace_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace_no.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/ptrace_no.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace_no.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,87 @@
|
|
+#ifndef _M68K_PTRACE_H
|
|
+#define _M68K_PTRACE_H
|
|
+
|
|
+#define PT_D1 0
|
|
+#define PT_D2 1
|
|
+#define PT_D3 2
|
|
+#define PT_D4 3
|
|
+#define PT_D5 4
|
|
+#define PT_D6 5
|
|
+#define PT_D7 6
|
|
+#define PT_A0 7
|
|
+#define PT_A1 8
|
|
+#define PT_A2 9
|
|
+#define PT_A3 10
|
|
+#define PT_A4 11
|
|
+#define PT_A5 12
|
|
+#define PT_A6 13
|
|
+#define PT_D0 14
|
|
+#define PT_USP 15
|
|
+#define PT_ORIG_D0 16
|
|
+#define PT_SR 17
|
|
+#define PT_PC 18
|
|
+
|
|
+#ifndef __ASSEMBLY__
|
|
+
|
|
+/* this struct defines the way the registers are stored on the
|
|
+ stack during a system call. */
|
|
+
|
|
+struct pt_regs {
|
|
+ long d1;
|
|
+ long d2;
|
|
+ long d3;
|
|
+ long d4;
|
|
+ long d5;
|
|
+ long a0;
|
|
+ long a1;
|
|
+ long a2;
|
|
+ long d0;
|
|
+ long orig_d0;
|
|
+ long stkadj;
|
|
+#ifdef CONFIG_COLDFIRE
|
|
+ unsigned format : 4; /* frame format specifier */
|
|
+ unsigned vector : 12; /* vector offset */
|
|
+ unsigned short sr;
|
|
+ unsigned long pc;
|
|
+#else
|
|
+ unsigned short sr;
|
|
+ unsigned long pc;
|
|
+ unsigned format : 4; /* frame format specifier */
|
|
+ unsigned vector : 12; /* vector offset */
|
|
+#endif
|
|
+};
|
|
+
|
|
+/*
|
|
+ * This is the extended stack used by signal handlers and the context
|
|
+ * switcher: it's pushed after the normal "struct pt_regs".
|
|
+ */
|
|
+struct switch_stack {
|
|
+ unsigned long d6;
|
|
+ unsigned long d7;
|
|
+ unsigned long a3;
|
|
+ unsigned long a4;
|
|
+ unsigned long a5;
|
|
+ unsigned long a6;
|
|
+ unsigned long retpc;
|
|
+};
|
|
+
|
|
+/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
|
|
+#define PTRACE_GETREGS 12
|
|
+#define PTRACE_SETREGS 13
|
|
+#define PTRACE_GETFPREGS 14
|
|
+#define PTRACE_SETFPREGS 15
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#ifndef PS_S
|
|
+#define PS_S (0x2000)
|
|
+#define PS_M (0x1000)
|
|
+#endif
|
|
+
|
|
+#define user_mode(regs) (!((regs)->sr & PS_S))
|
|
+#define instruction_pointer(regs) ((regs)->pc)
|
|
+#define profile_pc(regs) instruction_pointer(regs)
|
|
+extern void show_regs(struct pt_regs *);
|
|
+#endif /* __KERNEL__ */
|
|
+#endif /* __ASSEMBLY__ */
|
|
+#endif /* _M68K_PTRACE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/setup.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/setup.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,376 +1,5 @@
|
|
-/*
|
|
-** asm/setup.h -- Definition of the Linux/m68k setup information
|
|
-**
|
|
-** Copyright 1992 by Greg Harp
|
|
-**
|
|
-** This file is subject to the terms and conditions of the GNU General Public
|
|
-** License. See the file COPYING in the main directory of this archive
|
|
-** for more details.
|
|
-**
|
|
-** Created 09/29/92 by Greg Harp
|
|
-**
|
|
-** 5/2/94 Roman Hodek:
|
|
-** Added bi_atari part of the machine dependent union bi_un; for now it
|
|
-** contains just a model field to distinguish between TT and Falcon.
|
|
-** 26/7/96 Roman Zippel:
|
|
-** Renamed to setup.h; added some useful macros to allow gcc some
|
|
-** optimizations if possible.
|
|
-** 5/10/96 Geert Uytterhoeven:
|
|
-** Redesign of the boot information structure; moved boot information
|
|
-** structure to bootinfo.h
|
|
-*/
|
|
-
|
|
-#ifndef _M68K_SETUP_H
|
|
-#define _M68K_SETUP_H
|
|
-
|
|
-
|
|
-
|
|
- /*
|
|
- * Linux/m68k Architectures
|
|
- */
|
|
-
|
|
-#define MACH_AMIGA 1
|
|
-#define MACH_ATARI 2
|
|
-#define MACH_MAC 3
|
|
-#define MACH_APOLLO 4
|
|
-#define MACH_SUN3 5
|
|
-#define MACH_MVME147 6
|
|
-#define MACH_MVME16x 7
|
|
-#define MACH_BVME6000 8
|
|
-#define MACH_HP300 9
|
|
-#define MACH_Q40 10
|
|
-#define MACH_SUN3X 11
|
|
-
|
|
-#define COMMAND_LINE_SIZE 256
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-
|
|
-#define CL_SIZE COMMAND_LINE_SIZE
|
|
-
|
|
-#ifndef __ASSEMBLY__
|
|
-extern unsigned long m68k_machtype;
|
|
-#endif /* !__ASSEMBLY__ */
|
|
-
|
|
-#if !defined(CONFIG_AMIGA)
|
|
-# define MACH_IS_AMIGA (0)
|
|
-#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
|
|
- || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
|
|
- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA)
|
|
+#ifdef __uClinux__
|
|
+#include "setup_no.h"
|
|
#else
|
|
-# define MACH_AMIGA_ONLY
|
|
-# define MACH_IS_AMIGA (1)
|
|
-# define MACH_TYPE (MACH_AMIGA)
|
|
+#include "setup_mm.h"
|
|
#endif
|
|
-
|
|
-#if !defined(CONFIG_ATARI)
|
|
-# define MACH_IS_ATARI (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
|
|
- || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
|
|
- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_ATARI (m68k_machtype == MACH_ATARI)
|
|
-#else
|
|
-# define MACH_ATARI_ONLY
|
|
-# define MACH_IS_ATARI (1)
|
|
-# define MACH_TYPE (MACH_ATARI)
|
|
-#endif
|
|
-
|
|
-#if !defined(CONFIG_MAC)
|
|
-# define MACH_IS_MAC (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \
|
|
- || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
|
|
- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_MAC (m68k_machtype == MACH_MAC)
|
|
-#else
|
|
-# define MACH_MAC_ONLY
|
|
-# define MACH_IS_MAC (1)
|
|
-# define MACH_TYPE (MACH_MAC)
|
|
-#endif
|
|
-
|
|
-#if defined(CONFIG_SUN3)
|
|
-#define MACH_IS_SUN3 (1)
|
|
-#define MACH_SUN3_ONLY (1)
|
|
-#define MACH_TYPE (MACH_SUN3)
|
|
-#else
|
|
-#define MACH_IS_SUN3 (0)
|
|
-#endif
|
|
-
|
|
-#if !defined (CONFIG_APOLLO)
|
|
-# define MACH_IS_APOLLO (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
- || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
|
|
- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO)
|
|
-#else
|
|
-# define MACH_APOLLO_ONLY
|
|
-# define MACH_IS_APOLLO (1)
|
|
-# define MACH_TYPE (MACH_APOLLO)
|
|
-#endif
|
|
-
|
|
-#if !defined (CONFIG_MVME147)
|
|
-# define MACH_IS_MVME147 (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
- || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
|
|
- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x)
|
|
-# define MACH_IS_MVME147 (m68k_machtype == MACH_MVME147)
|
|
-#else
|
|
-# define MACH_MVME147_ONLY
|
|
-# define MACH_IS_MVME147 (1)
|
|
-# define MACH_TYPE (MACH_MVME147)
|
|
-#endif
|
|
-
|
|
-#if !defined (CONFIG_MVME16x)
|
|
-# define MACH_IS_MVME16x (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
- || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
|
|
- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x)
|
|
-#else
|
|
-# define MACH_MVME16x_ONLY
|
|
-# define MACH_IS_MVME16x (1)
|
|
-# define MACH_TYPE (MACH_MVME16x)
|
|
-#endif
|
|
-
|
|
-#if !defined (CONFIG_BVME6000)
|
|
-# define MACH_IS_BVME6000 (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
- || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
|
|
- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000)
|
|
-#else
|
|
-# define MACH_BVME6000_ONLY
|
|
-# define MACH_IS_BVME6000 (1)
|
|
-# define MACH_TYPE (MACH_BVME6000)
|
|
-#endif
|
|
-
|
|
-#if !defined (CONFIG_HP300)
|
|
-# define MACH_IS_HP300 (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
- || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
|
|
- || defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_HP300 (m68k_machtype == MACH_HP300)
|
|
-#else
|
|
-# define MACH_HP300_ONLY
|
|
-# define MACH_IS_HP300 (1)
|
|
-# define MACH_TYPE (MACH_HP300)
|
|
-#endif
|
|
-
|
|
-#if !defined (CONFIG_Q40)
|
|
-# define MACH_IS_Q40 (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
- || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
|
|
- || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
|
|
- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_Q40 (m68k_machtype == MACH_Q40)
|
|
-#else
|
|
-# define MACH_Q40_ONLY
|
|
-# define MACH_IS_Q40 (1)
|
|
-# define MACH_TYPE (MACH_Q40)
|
|
-#endif
|
|
-
|
|
-#if !defined (CONFIG_SUN3X)
|
|
-# define MACH_IS_SUN3X (0)
|
|
-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
- || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
|
|
- || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
|
|
- || defined(CONFIG_Q40) || defined(CONFIG_MVME147)
|
|
-# define MACH_IS_SUN3X (m68k_machtype == MACH_SUN3X)
|
|
-#else
|
|
-# define CONFIG_SUN3X_ONLY
|
|
-# define MACH_IS_SUN3X (1)
|
|
-# define MACH_TYPE (MACH_SUN3X)
|
|
-#endif
|
|
-
|
|
-#ifndef MACH_TYPE
|
|
-# define MACH_TYPE (m68k_machtype)
|
|
-#endif
|
|
-
|
|
-#endif /* __KERNEL__ */
|
|
-
|
|
-
|
|
- /*
|
|
- * CPU, FPU and MMU types
|
|
- *
|
|
- * Note: we may rely on the following equalities:
|
|
- *
|
|
- * CPU_68020 == MMU_68851
|
|
- * CPU_68030 == MMU_68030
|
|
- * CPU_68040 == FPU_68040 == MMU_68040
|
|
- * CPU_68060 == FPU_68060 == MMU_68060
|
|
- */
|
|
-
|
|
-#define CPUB_68020 0
|
|
-#define CPUB_68030 1
|
|
-#define CPUB_68040 2
|
|
-#define CPUB_68060 3
|
|
-
|
|
-#define CPU_68020 (1<<CPUB_68020)
|
|
-#define CPU_68030 (1<<CPUB_68030)
|
|
-#define CPU_68040 (1<<CPUB_68040)
|
|
-#define CPU_68060 (1<<CPUB_68060)
|
|
-
|
|
-#define FPUB_68881 0
|
|
-#define FPUB_68882 1
|
|
-#define FPUB_68040 2 /* Internal FPU */
|
|
-#define FPUB_68060 3 /* Internal FPU */
|
|
-#define FPUB_SUNFPA 4 /* Sun-3 FPA */
|
|
-
|
|
-#define FPU_68881 (1<<FPUB_68881)
|
|
-#define FPU_68882 (1<<FPUB_68882)
|
|
-#define FPU_68040 (1<<FPUB_68040)
|
|
-#define FPU_68060 (1<<FPUB_68060)
|
|
-#define FPU_SUNFPA (1<<FPUB_SUNFPA)
|
|
-
|
|
-#define MMUB_68851 0
|
|
-#define MMUB_68030 1 /* Internal MMU */
|
|
-#define MMUB_68040 2 /* Internal MMU */
|
|
-#define MMUB_68060 3 /* Internal MMU */
|
|
-#define MMUB_APOLLO 4 /* Custom Apollo */
|
|
-#define MMUB_SUN3 5 /* Custom Sun-3 */
|
|
-
|
|
-#define MMU_68851 (1<<MMUB_68851)
|
|
-#define MMU_68030 (1<<MMUB_68030)
|
|
-#define MMU_68040 (1<<MMUB_68040)
|
|
-#define MMU_68060 (1<<MMUB_68060)
|
|
-#define MMU_SUN3 (1<<MMUB_SUN3)
|
|
-#define MMU_APOLLO (1<<MMUB_APOLLO)
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-
|
|
-#ifndef __ASSEMBLY__
|
|
-extern unsigned long m68k_cputype;
|
|
-extern unsigned long m68k_fputype;
|
|
-extern unsigned long m68k_mmutype;
|
|
-#ifdef CONFIG_VME
|
|
-extern unsigned long vme_brdtype;
|
|
-#endif
|
|
-
|
|
- /*
|
|
- * m68k_is040or060 is != 0 for a '040 or higher;
|
|
- * used numbers are 4 for 68040 and 6 for 68060.
|
|
- */
|
|
-
|
|
-extern int m68k_is040or060;
|
|
-#endif /* !__ASSEMBLY__ */
|
|
-
|
|
-#if !defined(CONFIG_M68020)
|
|
-# define CPU_IS_020 (0)
|
|
-# define MMU_IS_851 (0)
|
|
-# define MMU_IS_SUN3 (0)
|
|
-#elif defined(CONFIG_M68030) || defined(CONFIG_M68040) || defined(CONFIG_M68060)
|
|
-# define CPU_IS_020 (m68k_cputype & CPU_68020)
|
|
-# define MMU_IS_851 (m68k_mmutype & MMU_68851)
|
|
-# define MMU_IS_SUN3 (0) /* Sun3 not supported with other CPU enabled */
|
|
-#else
|
|
-# define CPU_M68020_ONLY
|
|
-# define CPU_IS_020 (1)
|
|
-#ifdef MACH_SUN3_ONLY
|
|
-# define MMU_IS_SUN3 (1)
|
|
-# define MMU_IS_851 (0)
|
|
-#else
|
|
-# define MMU_IS_SUN3 (0)
|
|
-# define MMU_IS_851 (1)
|
|
-#endif
|
|
-#endif
|
|
-
|
|
-#if !defined(CONFIG_M68030)
|
|
-# define CPU_IS_030 (0)
|
|
-# define MMU_IS_030 (0)
|
|
-#elif defined(CONFIG_M68020) || defined(CONFIG_M68040) || defined(CONFIG_M68060)
|
|
-# define CPU_IS_030 (m68k_cputype & CPU_68030)
|
|
-# define MMU_IS_030 (m68k_mmutype & MMU_68030)
|
|
-#else
|
|
-# define CPU_M68030_ONLY
|
|
-# define CPU_IS_030 (1)
|
|
-# define MMU_IS_030 (1)
|
|
-#endif
|
|
-
|
|
-#if !defined(CONFIG_M68040)
|
|
-# define CPU_IS_040 (0)
|
|
-# define MMU_IS_040 (0)
|
|
-#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68060)
|
|
-# define CPU_IS_040 (m68k_cputype & CPU_68040)
|
|
-# define MMU_IS_040 (m68k_mmutype & MMU_68040)
|
|
-#else
|
|
-# define CPU_M68040_ONLY
|
|
-# define CPU_IS_040 (1)
|
|
-# define MMU_IS_040 (1)
|
|
-#endif
|
|
-
|
|
-#if !defined(CONFIG_M68060)
|
|
-# define CPU_IS_060 (0)
|
|
-# define MMU_IS_060 (0)
|
|
-#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68040)
|
|
-# define CPU_IS_060 (m68k_cputype & CPU_68060)
|
|
-# define MMU_IS_060 (m68k_mmutype & MMU_68060)
|
|
-#else
|
|
-# define CPU_M68060_ONLY
|
|
-# define CPU_IS_060 (1)
|
|
-# define MMU_IS_060 (1)
|
|
-#endif
|
|
-
|
|
-#if !defined(CONFIG_M68020) && !defined(CONFIG_M68030)
|
|
-# define CPU_IS_020_OR_030 (0)
|
|
-#else
|
|
-# define CPU_M68020_OR_M68030
|
|
-# if defined(CONFIG_M68040) || defined(CONFIG_M68060)
|
|
-# define CPU_IS_020_OR_030 (!m68k_is040or060)
|
|
-# else
|
|
-# define CPU_M68020_OR_M68030_ONLY
|
|
-# define CPU_IS_020_OR_030 (1)
|
|
-# endif
|
|
-#endif
|
|
-
|
|
-#if !defined(CONFIG_M68040) && !defined(CONFIG_M68060)
|
|
-# define CPU_IS_040_OR_060 (0)
|
|
-#else
|
|
-# define CPU_M68040_OR_M68060
|
|
-# if defined(CONFIG_M68020) || defined(CONFIG_M68030)
|
|
-# define CPU_IS_040_OR_060 (m68k_is040or060)
|
|
-# else
|
|
-# define CPU_M68040_OR_M68060_ONLY
|
|
-# define CPU_IS_040_OR_060 (1)
|
|
-# endif
|
|
-#endif
|
|
-
|
|
-#define CPU_TYPE (m68k_cputype)
|
|
-
|
|
-#ifdef CONFIG_M68KFPU_EMU
|
|
-# ifdef CONFIG_M68KFPU_EMU_ONLY
|
|
-# define FPU_IS_EMU (1)
|
|
-# else
|
|
-# define FPU_IS_EMU (!m68k_fputype)
|
|
-# endif
|
|
-#else
|
|
-# define FPU_IS_EMU (0)
|
|
-#endif
|
|
-
|
|
-
|
|
- /*
|
|
- * Miscellaneous
|
|
- */
|
|
-
|
|
-#define NUM_MEMINFO 4
|
|
-
|
|
-#ifndef __ASSEMBLY__
|
|
-struct mem_info {
|
|
- unsigned long addr; /* physical address of memory chunk */
|
|
- unsigned long size; /* length of memory chunk (in bytes) */
|
|
-};
|
|
-
|
|
-extern int m68k_num_memory; /* # of memory blocks found (and used) */
|
|
-extern int m68k_realnum_memory; /* real # of memory blocks found */
|
|
-extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
|
|
-#endif
|
|
-
|
|
-#endif /* __KERNEL__ */
|
|
-
|
|
-#endif /* _M68K_SETUP_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/setup_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup_mm.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/setup_mm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup_mm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,376 @@
|
|
+/*
|
|
+** asm/setup.h -- Definition of the Linux/m68k setup information
|
|
+**
|
|
+** Copyright 1992 by Greg Harp
|
|
+**
|
|
+** This file is subject to the terms and conditions of the GNU General Public
|
|
+** License. See the file COPYING in the main directory of this archive
|
|
+** for more details.
|
|
+**
|
|
+** Created 09/29/92 by Greg Harp
|
|
+**
|
|
+** 5/2/94 Roman Hodek:
|
|
+** Added bi_atari part of the machine dependent union bi_un; for now it
|
|
+** contains just a model field to distinguish between TT and Falcon.
|
|
+** 26/7/96 Roman Zippel:
|
|
+** Renamed to setup.h; added some useful macros to allow gcc some
|
|
+** optimizations if possible.
|
|
+** 5/10/96 Geert Uytterhoeven:
|
|
+** Redesign of the boot information structure; moved boot information
|
|
+** structure to bootinfo.h
|
|
+*/
|
|
+
|
|
+#ifndef _M68K_SETUP_H
|
|
+#define _M68K_SETUP_H
|
|
+
|
|
+
|
|
+
|
|
+ /*
|
|
+ * Linux/m68k Architectures
|
|
+ */
|
|
+
|
|
+#define MACH_AMIGA 1
|
|
+#define MACH_ATARI 2
|
|
+#define MACH_MAC 3
|
|
+#define MACH_APOLLO 4
|
|
+#define MACH_SUN3 5
|
|
+#define MACH_MVME147 6
|
|
+#define MACH_MVME16x 7
|
|
+#define MACH_BVME6000 8
|
|
+#define MACH_HP300 9
|
|
+#define MACH_Q40 10
|
|
+#define MACH_SUN3X 11
|
|
+
|
|
+#define COMMAND_LINE_SIZE 256
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#define CL_SIZE COMMAND_LINE_SIZE
|
|
+
|
|
+#ifndef __ASSEMBLY__
|
|
+extern unsigned long m68k_machtype;
|
|
+#endif /* !__ASSEMBLY__ */
|
|
+
|
|
+#if !defined(CONFIG_AMIGA)
|
|
+# define MACH_IS_AMIGA (0)
|
|
+#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
|
|
+ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
|
|
+ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA)
|
|
+#else
|
|
+# define MACH_AMIGA_ONLY
|
|
+# define MACH_IS_AMIGA (1)
|
|
+# define MACH_TYPE (MACH_AMIGA)
|
|
+#endif
|
|
+
|
|
+#if !defined(CONFIG_ATARI)
|
|
+# define MACH_IS_ATARI (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
|
|
+ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
|
|
+ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_ATARI (m68k_machtype == MACH_ATARI)
|
|
+#else
|
|
+# define MACH_ATARI_ONLY
|
|
+# define MACH_IS_ATARI (1)
|
|
+# define MACH_TYPE (MACH_ATARI)
|
|
+#endif
|
|
+
|
|
+#if !defined(CONFIG_MAC)
|
|
+# define MACH_IS_MAC (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \
|
|
+ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
|
|
+ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_MAC (m68k_machtype == MACH_MAC)
|
|
+#else
|
|
+# define MACH_MAC_ONLY
|
|
+# define MACH_IS_MAC (1)
|
|
+# define MACH_TYPE (MACH_MAC)
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_SUN3)
|
|
+#define MACH_IS_SUN3 (1)
|
|
+#define MACH_SUN3_ONLY (1)
|
|
+#define MACH_TYPE (MACH_SUN3)
|
|
+#else
|
|
+#define MACH_IS_SUN3 (0)
|
|
+#endif
|
|
+
|
|
+#if !defined (CONFIG_APOLLO)
|
|
+# define MACH_IS_APOLLO (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
+ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
|
|
+ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO)
|
|
+#else
|
|
+# define MACH_APOLLO_ONLY
|
|
+# define MACH_IS_APOLLO (1)
|
|
+# define MACH_TYPE (MACH_APOLLO)
|
|
+#endif
|
|
+
|
|
+#if !defined (CONFIG_MVME147)
|
|
+# define MACH_IS_MVME147 (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
+ || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
|
|
+ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x)
|
|
+# define MACH_IS_MVME147 (m68k_machtype == MACH_MVME147)
|
|
+#else
|
|
+# define MACH_MVME147_ONLY
|
|
+# define MACH_IS_MVME147 (1)
|
|
+# define MACH_TYPE (MACH_MVME147)
|
|
+#endif
|
|
+
|
|
+#if !defined (CONFIG_MVME16x)
|
|
+# define MACH_IS_MVME16x (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
+ || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
|
|
+ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x)
|
|
+#else
|
|
+# define MACH_MVME16x_ONLY
|
|
+# define MACH_IS_MVME16x (1)
|
|
+# define MACH_TYPE (MACH_MVME16x)
|
|
+#endif
|
|
+
|
|
+#if !defined (CONFIG_BVME6000)
|
|
+# define MACH_IS_BVME6000 (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
+ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
|
|
+ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000)
|
|
+#else
|
|
+# define MACH_BVME6000_ONLY
|
|
+# define MACH_IS_BVME6000 (1)
|
|
+# define MACH_TYPE (MACH_BVME6000)
|
|
+#endif
|
|
+
|
|
+#if !defined (CONFIG_HP300)
|
|
+# define MACH_IS_HP300 (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
+ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
|
|
+ || defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_HP300 (m68k_machtype == MACH_HP300)
|
|
+#else
|
|
+# define MACH_HP300_ONLY
|
|
+# define MACH_IS_HP300 (1)
|
|
+# define MACH_TYPE (MACH_HP300)
|
|
+#endif
|
|
+
|
|
+#if !defined (CONFIG_Q40)
|
|
+# define MACH_IS_Q40 (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
+ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
|
|
+ || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
|
|
+ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_Q40 (m68k_machtype == MACH_Q40)
|
|
+#else
|
|
+# define MACH_Q40_ONLY
|
|
+# define MACH_IS_Q40 (1)
|
|
+# define MACH_TYPE (MACH_Q40)
|
|
+#endif
|
|
+
|
|
+#if !defined (CONFIG_SUN3X)
|
|
+# define MACH_IS_SUN3X (0)
|
|
+#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
|
|
+ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
|
|
+ || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
|
|
+ || defined(CONFIG_Q40) || defined(CONFIG_MVME147)
|
|
+# define MACH_IS_SUN3X (m68k_machtype == MACH_SUN3X)
|
|
+#else
|
|
+# define CONFIG_SUN3X_ONLY
|
|
+# define MACH_IS_SUN3X (1)
|
|
+# define MACH_TYPE (MACH_SUN3X)
|
|
+#endif
|
|
+
|
|
+#ifndef MACH_TYPE
|
|
+# define MACH_TYPE (m68k_machtype)
|
|
+#endif
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+
|
|
+ /*
|
|
+ * CPU, FPU and MMU types
|
|
+ *
|
|
+ * Note: we may rely on the following equalities:
|
|
+ *
|
|
+ * CPU_68020 == MMU_68851
|
|
+ * CPU_68030 == MMU_68030
|
|
+ * CPU_68040 == FPU_68040 == MMU_68040
|
|
+ * CPU_68060 == FPU_68060 == MMU_68060
|
|
+ */
|
|
+
|
|
+#define CPUB_68020 0
|
|
+#define CPUB_68030 1
|
|
+#define CPUB_68040 2
|
|
+#define CPUB_68060 3
|
|
+
|
|
+#define CPU_68020 (1<<CPUB_68020)
|
|
+#define CPU_68030 (1<<CPUB_68030)
|
|
+#define CPU_68040 (1<<CPUB_68040)
|
|
+#define CPU_68060 (1<<CPUB_68060)
|
|
+
|
|
+#define FPUB_68881 0
|
|
+#define FPUB_68882 1
|
|
+#define FPUB_68040 2 /* Internal FPU */
|
|
+#define FPUB_68060 3 /* Internal FPU */
|
|
+#define FPUB_SUNFPA 4 /* Sun-3 FPA */
|
|
+
|
|
+#define FPU_68881 (1<<FPUB_68881)
|
|
+#define FPU_68882 (1<<FPUB_68882)
|
|
+#define FPU_68040 (1<<FPUB_68040)
|
|
+#define FPU_68060 (1<<FPUB_68060)
|
|
+#define FPU_SUNFPA (1<<FPUB_SUNFPA)
|
|
+
|
|
+#define MMUB_68851 0
|
|
+#define MMUB_68030 1 /* Internal MMU */
|
|
+#define MMUB_68040 2 /* Internal MMU */
|
|
+#define MMUB_68060 3 /* Internal MMU */
|
|
+#define MMUB_APOLLO 4 /* Custom Apollo */
|
|
+#define MMUB_SUN3 5 /* Custom Sun-3 */
|
|
+
|
|
+#define MMU_68851 (1<<MMUB_68851)
|
|
+#define MMU_68030 (1<<MMUB_68030)
|
|
+#define MMU_68040 (1<<MMUB_68040)
|
|
+#define MMU_68060 (1<<MMUB_68060)
|
|
+#define MMU_SUN3 (1<<MMUB_SUN3)
|
|
+#define MMU_APOLLO (1<<MMUB_APOLLO)
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#ifndef __ASSEMBLY__
|
|
+extern unsigned long m68k_cputype;
|
|
+extern unsigned long m68k_fputype;
|
|
+extern unsigned long m68k_mmutype;
|
|
+#ifdef CONFIG_VME
|
|
+extern unsigned long vme_brdtype;
|
|
+#endif
|
|
+
|
|
+ /*
|
|
+ * m68k_is040or060 is != 0 for a '040 or higher;
|
|
+ * used numbers are 4 for 68040 and 6 for 68060.
|
|
+ */
|
|
+
|
|
+extern int m68k_is040or060;
|
|
+#endif /* !__ASSEMBLY__ */
|
|
+
|
|
+#if !defined(CONFIG_M68020)
|
|
+# define CPU_IS_020 (0)
|
|
+# define MMU_IS_851 (0)
|
|
+# define MMU_IS_SUN3 (0)
|
|
+#elif defined(CONFIG_M68030) || defined(CONFIG_M68040) || defined(CONFIG_M68060)
|
|
+# define CPU_IS_020 (m68k_cputype & CPU_68020)
|
|
+# define MMU_IS_851 (m68k_mmutype & MMU_68851)
|
|
+# define MMU_IS_SUN3 (0) /* Sun3 not supported with other CPU enabled */
|
|
+#else
|
|
+# define CPU_M68020_ONLY
|
|
+# define CPU_IS_020 (1)
|
|
+#ifdef MACH_SUN3_ONLY
|
|
+# define MMU_IS_SUN3 (1)
|
|
+# define MMU_IS_851 (0)
|
|
+#else
|
|
+# define MMU_IS_SUN3 (0)
|
|
+# define MMU_IS_851 (1)
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+#if !defined(CONFIG_M68030)
|
|
+# define CPU_IS_030 (0)
|
|
+# define MMU_IS_030 (0)
|
|
+#elif defined(CONFIG_M68020) || defined(CONFIG_M68040) || defined(CONFIG_M68060)
|
|
+# define CPU_IS_030 (m68k_cputype & CPU_68030)
|
|
+# define MMU_IS_030 (m68k_mmutype & MMU_68030)
|
|
+#else
|
|
+# define CPU_M68030_ONLY
|
|
+# define CPU_IS_030 (1)
|
|
+# define MMU_IS_030 (1)
|
|
+#endif
|
|
+
|
|
+#if !defined(CONFIG_M68040)
|
|
+# define CPU_IS_040 (0)
|
|
+# define MMU_IS_040 (0)
|
|
+#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68060)
|
|
+# define CPU_IS_040 (m68k_cputype & CPU_68040)
|
|
+# define MMU_IS_040 (m68k_mmutype & MMU_68040)
|
|
+#else
|
|
+# define CPU_M68040_ONLY
|
|
+# define CPU_IS_040 (1)
|
|
+# define MMU_IS_040 (1)
|
|
+#endif
|
|
+
|
|
+#if !defined(CONFIG_M68060)
|
|
+# define CPU_IS_060 (0)
|
|
+# define MMU_IS_060 (0)
|
|
+#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68040)
|
|
+# define CPU_IS_060 (m68k_cputype & CPU_68060)
|
|
+# define MMU_IS_060 (m68k_mmutype & MMU_68060)
|
|
+#else
|
|
+# define CPU_M68060_ONLY
|
|
+# define CPU_IS_060 (1)
|
|
+# define MMU_IS_060 (1)
|
|
+#endif
|
|
+
|
|
+#if !defined(CONFIG_M68020) && !defined(CONFIG_M68030)
|
|
+# define CPU_IS_020_OR_030 (0)
|
|
+#else
|
|
+# define CPU_M68020_OR_M68030
|
|
+# if defined(CONFIG_M68040) || defined(CONFIG_M68060)
|
|
+# define CPU_IS_020_OR_030 (!m68k_is040or060)
|
|
+# else
|
|
+# define CPU_M68020_OR_M68030_ONLY
|
|
+# define CPU_IS_020_OR_030 (1)
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+#if !defined(CONFIG_M68040) && !defined(CONFIG_M68060)
|
|
+# define CPU_IS_040_OR_060 (0)
|
|
+#else
|
|
+# define CPU_M68040_OR_M68060
|
|
+# if defined(CONFIG_M68020) || defined(CONFIG_M68030)
|
|
+# define CPU_IS_040_OR_060 (m68k_is040or060)
|
|
+# else
|
|
+# define CPU_M68040_OR_M68060_ONLY
|
|
+# define CPU_IS_040_OR_060 (1)
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+#define CPU_TYPE (m68k_cputype)
|
|
+
|
|
+#ifdef CONFIG_M68KFPU_EMU
|
|
+# ifdef CONFIG_M68KFPU_EMU_ONLY
|
|
+# define FPU_IS_EMU (1)
|
|
+# else
|
|
+# define FPU_IS_EMU (!m68k_fputype)
|
|
+# endif
|
|
+#else
|
|
+# define FPU_IS_EMU (0)
|
|
+#endif
|
|
+
|
|
+
|
|
+ /*
|
|
+ * Miscellaneous
|
|
+ */
|
|
+
|
|
+#define NUM_MEMINFO 4
|
|
+
|
|
+#ifndef __ASSEMBLY__
|
|
+struct mem_info {
|
|
+ unsigned long addr; /* physical address of memory chunk */
|
|
+ unsigned long size; /* length of memory chunk (in bytes) */
|
|
+};
|
|
+
|
|
+extern int m68k_num_memory; /* # of memory blocks found (and used) */
|
|
+extern int m68k_realnum_memory; /* real # of memory blocks found */
|
|
+extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
|
|
+#endif
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+#endif /* _M68K_SETUP_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/setup_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup_no.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/setup_no.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup_no.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,10 @@
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#include <asm/setup_mm.h>
|
|
+
|
|
+/* We have a bigger command line buffer. */
|
|
+#undef COMMAND_LINE_SIZE
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+#define COMMAND_LINE_SIZE 512
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,24 +1,5 @@
|
|
-#ifndef _ASM_M68k_SIGCONTEXT_H
|
|
-#define _ASM_M68k_SIGCONTEXT_H
|
|
-
|
|
-struct sigcontext {
|
|
- unsigned long sc_mask; /* old sigmask */
|
|
- unsigned long sc_usp; /* old user stack pointer */
|
|
- unsigned long sc_d0;
|
|
- unsigned long sc_d1;
|
|
- unsigned long sc_a0;
|
|
- unsigned long sc_a1;
|
|
#ifdef __uClinux__
|
|
- unsigned long sc_a5;
|
|
-#endif
|
|
- unsigned short sc_sr;
|
|
- unsigned long sc_pc;
|
|
- unsigned short sc_formatvec;
|
|
-#ifndef __uClinux__
|
|
- unsigned long sc_fpregs[2*3]; /* room for two fp registers */
|
|
- unsigned long sc_fpcntl[3];
|
|
- unsigned char sc_fpstate[216];
|
|
-#endif
|
|
-};
|
|
-
|
|
+#include "sigcontext_no.h"
|
|
+#else
|
|
+#include "sigcontext_mm.h"
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext_mm.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext_mm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext_mm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,19 @@
|
|
+#ifndef _ASM_M68k_SIGCONTEXT_H
|
|
+#define _ASM_M68k_SIGCONTEXT_H
|
|
+
|
|
+struct sigcontext {
|
|
+ unsigned long sc_mask; /* old sigmask */
|
|
+ unsigned long sc_usp; /* old user stack pointer */
|
|
+ unsigned long sc_d0;
|
|
+ unsigned long sc_d1;
|
|
+ unsigned long sc_a0;
|
|
+ unsigned long sc_a1;
|
|
+ unsigned short sc_sr;
|
|
+ unsigned long sc_pc;
|
|
+ unsigned short sc_formatvec;
|
|
+ unsigned long sc_fpregs[2*3]; /* room for two fp registers */
|
|
+ unsigned long sc_fpcntl[3];
|
|
+ unsigned char sc_fpstate[216];
|
|
+};
|
|
+
|
|
+#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext_no.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext_no.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext_no.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,17 @@
|
|
+#ifndef _ASM_M68KNOMMU_SIGCONTEXT_H
|
|
+#define _ASM_M68KNOMMU_SIGCONTEXT_H
|
|
+
|
|
+struct sigcontext {
|
|
+ unsigned long sc_mask; /* old sigmask */
|
|
+ unsigned long sc_usp; /* old user stack pointer */
|
|
+ unsigned long sc_d0;
|
|
+ unsigned long sc_d1;
|
|
+ unsigned long sc_a0;
|
|
+ unsigned long sc_a1;
|
|
+ unsigned long sc_a5;
|
|
+ unsigned short sc_sr;
|
|
+ unsigned long sc_pc;
|
|
+ unsigned short sc_formatvec;
|
|
+};
|
|
+
|
|
+#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/siginfo.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/siginfo.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,97 +1,5 @@
|
|
-#ifndef _M68K_SIGINFO_H
|
|
-#define _M68K_SIGINFO_H
|
|
-
|
|
-#ifndef __uClinux__
|
|
-#define HAVE_ARCH_SIGINFO_T
|
|
-#define HAVE_ARCH_COPY_SIGINFO
|
|
-#endif
|
|
-
|
|
-#include <asm-generic/siginfo.h>
|
|
-
|
|
-#ifndef __uClinux__
|
|
-
|
|
-typedef struct siginfo {
|
|
- int si_signo;
|
|
- int si_errno;
|
|
- int si_code;
|
|
-
|
|
- union {
|
|
- int _pad[SI_PAD_SIZE];
|
|
-
|
|
- /* kill() */
|
|
- struct {
|
|
- __kernel_pid_t _pid; /* sender's pid */
|
|
- __kernel_uid_t _uid; /* backwards compatibility */
|
|
- __kernel_uid32_t _uid32; /* sender's uid */
|
|
- } _kill;
|
|
-
|
|
- /* POSIX.1b timers */
|
|
- struct {
|
|
- timer_t _tid; /* timer id */
|
|
- int _overrun; /* overrun count */
|
|
- char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
|
|
- sigval_t _sigval; /* same as below */
|
|
- int _sys_private; /* not to be passed to user */
|
|
- } _timer;
|
|
-
|
|
- /* POSIX.1b signals */
|
|
- struct {
|
|
- __kernel_pid_t _pid; /* sender's pid */
|
|
- __kernel_uid_t _uid; /* backwards compatibility */
|
|
- sigval_t _sigval;
|
|
- __kernel_uid32_t _uid32; /* sender's uid */
|
|
- } _rt;
|
|
-
|
|
- /* SIGCHLD */
|
|
- struct {
|
|
- __kernel_pid_t _pid; /* which child */
|
|
- __kernel_uid_t _uid; /* backwards compatibility */
|
|
- int _status; /* exit code */
|
|
- clock_t _utime;
|
|
- clock_t _stime;
|
|
- __kernel_uid32_t _uid32; /* sender's uid */
|
|
- } _sigchld;
|
|
-
|
|
- /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
|
- struct {
|
|
- void *_addr; /* faulting insn/memory ref. */
|
|
- } _sigfault;
|
|
-
|
|
- /* SIGPOLL */
|
|
- struct {
|
|
- int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
|
- int _fd;
|
|
- } _sigpoll;
|
|
- } _sifields;
|
|
-} siginfo_t;
|
|
-
|
|
-#define UID16_SIGINFO_COMPAT_NEEDED
|
|
-
|
|
-/*
|
|
- * How these fields are to be accessed.
|
|
- */
|
|
-#undef si_uid
|
|
-#ifdef __KERNEL__
|
|
-#define si_uid _sifields._kill._uid32
|
|
-#define si_uid16 _sifields._kill._uid
|
|
+#ifdef __uClinux__
|
|
+#include "siginfo_no.h"
|
|
#else
|
|
-#define si_uid _sifields._kill._uid
|
|
-#endif
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-
|
|
-#include <linux/string.h>
|
|
-
|
|
-static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
|
|
-{
|
|
- if (from->si_code < 0)
|
|
- memcpy(to, from, sizeof(*to));
|
|
- else
|
|
- /* _sigchld is currently the largest know union member */
|
|
- memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
|
|
-}
|
|
-
|
|
-#endif /* __KERNEL__ */
|
|
-#endif /* !__uClinux__ */
|
|
-
|
|
+#include "siginfo_mm.h"
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/siginfo_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo_mm.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/siginfo_mm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo_mm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,92 @@
|
|
+#ifndef _M68K_SIGINFO_H
|
|
+#define _M68K_SIGINFO_H
|
|
+
|
|
+#define HAVE_ARCH_SIGINFO_T
|
|
+#define HAVE_ARCH_COPY_SIGINFO
|
|
+
|
|
+#include <asm-generic/siginfo.h>
|
|
+
|
|
+typedef struct siginfo {
|
|
+ int si_signo;
|
|
+ int si_errno;
|
|
+ int si_code;
|
|
+
|
|
+ union {
|
|
+ int _pad[SI_PAD_SIZE];
|
|
+
|
|
+ /* kill() */
|
|
+ struct {
|
|
+ __kernel_pid_t _pid; /* sender's pid */
|
|
+ __kernel_uid_t _uid; /* backwards compatibility */
|
|
+ __kernel_uid32_t _uid32; /* sender's uid */
|
|
+ } _kill;
|
|
+
|
|
+ /* POSIX.1b timers */
|
|
+ struct {
|
|
+ timer_t _tid; /* timer id */
|
|
+ int _overrun; /* overrun count */
|
|
+ char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
|
|
+ sigval_t _sigval; /* same as below */
|
|
+ int _sys_private; /* not to be passed to user */
|
|
+ } _timer;
|
|
+
|
|
+ /* POSIX.1b signals */
|
|
+ struct {
|
|
+ __kernel_pid_t _pid; /* sender's pid */
|
|
+ __kernel_uid_t _uid; /* backwards compatibility */
|
|
+ sigval_t _sigval;
|
|
+ __kernel_uid32_t _uid32; /* sender's uid */
|
|
+ } _rt;
|
|
+
|
|
+ /* SIGCHLD */
|
|
+ struct {
|
|
+ __kernel_pid_t _pid; /* which child */
|
|
+ __kernel_uid_t _uid; /* backwards compatibility */
|
|
+ int _status; /* exit code */
|
|
+ clock_t _utime;
|
|
+ clock_t _stime;
|
|
+ __kernel_uid32_t _uid32; /* sender's uid */
|
|
+ } _sigchld;
|
|
+
|
|
+ /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
|
+ struct {
|
|
+ void *_addr; /* faulting insn/memory ref. */
|
|
+ } _sigfault;
|
|
+
|
|
+ /* SIGPOLL */
|
|
+ struct {
|
|
+ int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
|
+ int _fd;
|
|
+ } _sigpoll;
|
|
+ } _sifields;
|
|
+} siginfo_t;
|
|
+
|
|
+#define UID16_SIGINFO_COMPAT_NEEDED
|
|
+
|
|
+/*
|
|
+ * How these fields are to be accessed.
|
|
+ */
|
|
+#undef si_uid
|
|
+#ifdef __KERNEL__
|
|
+#define si_uid _sifields._kill._uid32
|
|
+#define si_uid16 _sifields._kill._uid
|
|
+#else
|
|
+#define si_uid _sifields._kill._uid
|
|
+#endif
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#include <linux/string.h>
|
|
+
|
|
+static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
|
|
+{
|
|
+ if (from->si_code < 0)
|
|
+ memcpy(to, from, sizeof(*to));
|
|
+ else
|
|
+ /* _sigchld is currently the largest know union member */
|
|
+ memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
|
|
+}
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/siginfo_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo_no.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/siginfo_no.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo_no.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,6 @@
|
|
+#ifndef _M68KNOMMU_SIGINFO_H
|
|
+#define _M68KNOMMU_SIGINFO_H
|
|
+
|
|
+#include <asm-generic/siginfo.h>
|
|
+
|
|
+#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/signal.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/signal.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,213 +1,5 @@
|
|
-#ifndef _M68K_SIGNAL_H
|
|
-#define _M68K_SIGNAL_H
|
|
-
|
|
-#include <linux/types.h>
|
|
-
|
|
-/* Avoid too many header ordering problems. */
|
|
-struct siginfo;
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-/* Most things should be clean enough to redefine this at will, if care
|
|
- is taken to make libc match. */
|
|
-
|
|
-#define _NSIG 64
|
|
-#define _NSIG_BPW 32
|
|
-#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
|
-
|
|
-typedef unsigned long old_sigset_t; /* at least 32 bits */
|
|
-
|
|
-typedef struct {
|
|
- unsigned long sig[_NSIG_WORDS];
|
|
-} sigset_t;
|
|
-
|
|
+#ifdef __uClinux__
|
|
+#include "signal_no.h"
|
|
#else
|
|
-/* Here we must cater to libcs that poke about in kernel headers. */
|
|
-
|
|
-#define NSIG 32
|
|
-typedef unsigned long sigset_t;
|
|
-
|
|
-#endif /* __KERNEL__ */
|
|
-
|
|
-#define SIGHUP 1
|
|
-#define SIGINT 2
|
|
-#define SIGQUIT 3
|
|
-#define SIGILL 4
|
|
-#define SIGTRAP 5
|
|
-#define SIGABRT 6
|
|
-#define SIGIOT 6
|
|
-#define SIGBUS 7
|
|
-#define SIGFPE 8
|
|
-#define SIGKILL 9
|
|
-#define SIGUSR1 10
|
|
-#define SIGSEGV 11
|
|
-#define SIGUSR2 12
|
|
-#define SIGPIPE 13
|
|
-#define SIGALRM 14
|
|
-#define SIGTERM 15
|
|
-#define SIGSTKFLT 16
|
|
-#define SIGCHLD 17
|
|
-#define SIGCONT 18
|
|
-#define SIGSTOP 19
|
|
-#define SIGTSTP 20
|
|
-#define SIGTTIN 21
|
|
-#define SIGTTOU 22
|
|
-#define SIGURG 23
|
|
-#define SIGXCPU 24
|
|
-#define SIGXFSZ 25
|
|
-#define SIGVTALRM 26
|
|
-#define SIGPROF 27
|
|
-#define SIGWINCH 28
|
|
-#define SIGIO 29
|
|
-#define SIGPOLL SIGIO
|
|
-/*
|
|
-#define SIGLOST 29
|
|
-*/
|
|
-#define SIGPWR 30
|
|
-#define SIGSYS 31
|
|
-#define SIGUNUSED 31
|
|
-
|
|
-/* These should not be considered constants from userland. */
|
|
-#define SIGRTMIN 32
|
|
-#define SIGRTMAX _NSIG
|
|
-
|
|
-/*
|
|
- * SA_FLAGS values:
|
|
- *
|
|
- * SA_ONSTACK indicates that a registered stack_t will be used.
|
|
- * SA_RESTART flag to get restarting signals (which were the default long ago)
|
|
- * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
|
|
- * SA_RESETHAND clears the handler when the signal is delivered.
|
|
- * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
|
|
- * SA_NODEFER prevents the current signal from being masked in the handler.
|
|
- *
|
|
- * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
|
|
- * Unix names RESETHAND and NODEFER respectively.
|
|
- */
|
|
-#define SA_NOCLDSTOP 0x00000001
|
|
-#define SA_NOCLDWAIT 0x00000002
|
|
-#define SA_SIGINFO 0x00000004
|
|
-#define SA_ONSTACK 0x08000000
|
|
-#define SA_RESTART 0x10000000
|
|
-#define SA_NODEFER 0x40000000
|
|
-#define SA_RESETHAND 0x80000000
|
|
-
|
|
-#define SA_NOMASK SA_NODEFER
|
|
-#define SA_ONESHOT SA_RESETHAND
|
|
-
|
|
-/*
|
|
- * sigaltstack controls
|
|
- */
|
|
-#define SS_ONSTACK 1
|
|
-#define SS_DISABLE 2
|
|
-
|
|
-#define MINSIGSTKSZ 2048
|
|
-#define SIGSTKSZ 8192
|
|
-
|
|
-#include <asm-generic/signal.h>
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-struct old_sigaction {
|
|
- __sighandler_t sa_handler;
|
|
- old_sigset_t sa_mask;
|
|
- unsigned long sa_flags;
|
|
- __sigrestore_t sa_restorer;
|
|
-};
|
|
-
|
|
-struct sigaction {
|
|
- __sighandler_t sa_handler;
|
|
- unsigned long sa_flags;
|
|
- __sigrestore_t sa_restorer;
|
|
- sigset_t sa_mask; /* mask last for extensibility */
|
|
-};
|
|
-
|
|
-struct k_sigaction {
|
|
- struct sigaction sa;
|
|
-};
|
|
-#else
|
|
-/* Here we must cater to libcs that poke about in kernel headers. */
|
|
-
|
|
-struct sigaction {
|
|
- union {
|
|
- __sighandler_t _sa_handler;
|
|
- void (*_sa_sigaction)(int, struct siginfo *, void *);
|
|
- } _u;
|
|
- sigset_t sa_mask;
|
|
- unsigned long sa_flags;
|
|
- void (*sa_restorer)(void);
|
|
-};
|
|
-
|
|
-#define sa_handler _u._sa_handler
|
|
-#define sa_sigaction _u._sa_sigaction
|
|
-
|
|
-#endif /* __KERNEL__ */
|
|
-
|
|
-typedef struct sigaltstack {
|
|
- void __user *ss_sp;
|
|
- int ss_flags;
|
|
- size_t ss_size;
|
|
-} stack_t;
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-#include <asm/sigcontext.h>
|
|
-
|
|
-#ifndef __uClinux__
|
|
-#define __HAVE_ARCH_SIG_BITOPS
|
|
-
|
|
-static inline void sigaddset(sigset_t *set, int _sig)
|
|
-{
|
|
- asm ("bfset %0{%1,#1}"
|
|
- : "+od" (*set)
|
|
- : "id" ((_sig - 1) ^ 31)
|
|
- : "cc");
|
|
-}
|
|
-
|
|
-static inline void sigdelset(sigset_t *set, int _sig)
|
|
-{
|
|
- asm ("bfclr %0{%1,#1}"
|
|
- : "+od" (*set)
|
|
- : "id" ((_sig - 1) ^ 31)
|
|
- : "cc");
|
|
-}
|
|
-
|
|
-static inline int __const_sigismember(sigset_t *set, int _sig)
|
|
-{
|
|
- unsigned long sig = _sig - 1;
|
|
- return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
|
|
-}
|
|
-
|
|
-static inline int __gen_sigismember(sigset_t *set, int _sig)
|
|
-{
|
|
- int ret;
|
|
- asm ("bfextu %1{%2,#1},%0"
|
|
- : "=d" (ret)
|
|
- : "od" (*set), "id" ((_sig-1) ^ 31)
|
|
- : "cc");
|
|
- return ret;
|
|
-}
|
|
-
|
|
-#define sigismember(set,sig) \
|
|
- (__builtin_constant_p(sig) ? \
|
|
- __const_sigismember(set,sig) : \
|
|
- __gen_sigismember(set,sig))
|
|
-
|
|
-static inline int sigfindinword(unsigned long word)
|
|
-{
|
|
- asm ("bfffo %1{#0,#0},%0"
|
|
- : "=d" (word)
|
|
- : "d" (word & -word)
|
|
- : "cc");
|
|
- return word ^ 31;
|
|
-}
|
|
-
|
|
-struct pt_regs;
|
|
-extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
|
|
-
|
|
-#else
|
|
-
|
|
-#undef __HAVE_ARCH_SIG_BITOPS
|
|
-#define ptrace_signal_deliver(regs, cookie) do { } while (0)
|
|
-
|
|
-#endif /* __uClinux__ */
|
|
-#endif /* __KERNEL__ */
|
|
-
|
|
-#endif /* _M68K_SIGNAL_H */
|
|
+#include "signal_mm.h"
|
|
+#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/signal_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal_mm.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/signal_mm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal_mm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,206 @@
|
|
+#ifndef _M68K_SIGNAL_H
|
|
+#define _M68K_SIGNAL_H
|
|
+
|
|
+#include <linux/types.h>
|
|
+
|
|
+/* Avoid too many header ordering problems. */
|
|
+struct siginfo;
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+/* Most things should be clean enough to redefine this at will, if care
|
|
+ is taken to make libc match. */
|
|
+
|
|
+#define _NSIG 64
|
|
+#define _NSIG_BPW 32
|
|
+#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
|
+
|
|
+typedef unsigned long old_sigset_t; /* at least 32 bits */
|
|
+
|
|
+typedef struct {
|
|
+ unsigned long sig[_NSIG_WORDS];
|
|
+} sigset_t;
|
|
+
|
|
+#else
|
|
+/* Here we must cater to libcs that poke about in kernel headers. */
|
|
+
|
|
+#define NSIG 32
|
|
+typedef unsigned long sigset_t;
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+#define SIGHUP 1
|
|
+#define SIGINT 2
|
|
+#define SIGQUIT 3
|
|
+#define SIGILL 4
|
|
+#define SIGTRAP 5
|
|
+#define SIGABRT 6
|
|
+#define SIGIOT 6
|
|
+#define SIGBUS 7
|
|
+#define SIGFPE 8
|
|
+#define SIGKILL 9
|
|
+#define SIGUSR1 10
|
|
+#define SIGSEGV 11
|
|
+#define SIGUSR2 12
|
|
+#define SIGPIPE 13
|
|
+#define SIGALRM 14
|
|
+#define SIGTERM 15
|
|
+#define SIGSTKFLT 16
|
|
+#define SIGCHLD 17
|
|
+#define SIGCONT 18
|
|
+#define SIGSTOP 19
|
|
+#define SIGTSTP 20
|
|
+#define SIGTTIN 21
|
|
+#define SIGTTOU 22
|
|
+#define SIGURG 23
|
|
+#define SIGXCPU 24
|
|
+#define SIGXFSZ 25
|
|
+#define SIGVTALRM 26
|
|
+#define SIGPROF 27
|
|
+#define SIGWINCH 28
|
|
+#define SIGIO 29
|
|
+#define SIGPOLL SIGIO
|
|
+/*
|
|
+#define SIGLOST 29
|
|
+*/
|
|
+#define SIGPWR 30
|
|
+#define SIGSYS 31
|
|
+#define SIGUNUSED 31
|
|
+
|
|
+/* These should not be considered constants from userland. */
|
|
+#define SIGRTMIN 32
|
|
+#define SIGRTMAX _NSIG
|
|
+
|
|
+/*
|
|
+ * SA_FLAGS values:
|
|
+ *
|
|
+ * SA_ONSTACK indicates that a registered stack_t will be used.
|
|
+ * SA_RESTART flag to get restarting signals (which were the default long ago)
|
|
+ * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
|
|
+ * SA_RESETHAND clears the handler when the signal is delivered.
|
|
+ * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
|
|
+ * SA_NODEFER prevents the current signal from being masked in the handler.
|
|
+ *
|
|
+ * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
|
|
+ * Unix names RESETHAND and NODEFER respectively.
|
|
+ */
|
|
+#define SA_NOCLDSTOP 0x00000001
|
|
+#define SA_NOCLDWAIT 0x00000002
|
|
+#define SA_SIGINFO 0x00000004
|
|
+#define SA_ONSTACK 0x08000000
|
|
+#define SA_RESTART 0x10000000
|
|
+#define SA_NODEFER 0x40000000
|
|
+#define SA_RESETHAND 0x80000000
|
|
+
|
|
+#define SA_NOMASK SA_NODEFER
|
|
+#define SA_ONESHOT SA_RESETHAND
|
|
+
|
|
+/*
|
|
+ * sigaltstack controls
|
|
+ */
|
|
+#define SS_ONSTACK 1
|
|
+#define SS_DISABLE 2
|
|
+
|
|
+#define MINSIGSTKSZ 2048
|
|
+#define SIGSTKSZ 8192
|
|
+
|
|
+#include <asm-generic/signal.h>
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+struct old_sigaction {
|
|
+ __sighandler_t sa_handler;
|
|
+ old_sigset_t sa_mask;
|
|
+ unsigned long sa_flags;
|
|
+ __sigrestore_t sa_restorer;
|
|
+};
|
|
+
|
|
+struct sigaction {
|
|
+ __sighandler_t sa_handler;
|
|
+ unsigned long sa_flags;
|
|
+ __sigrestore_t sa_restorer;
|
|
+ sigset_t sa_mask; /* mask last for extensibility */
|
|
+};
|
|
+
|
|
+struct k_sigaction {
|
|
+ struct sigaction sa;
|
|
+};
|
|
+#else
|
|
+/* Here we must cater to libcs that poke about in kernel headers. */
|
|
+
|
|
+struct sigaction {
|
|
+ union {
|
|
+ __sighandler_t _sa_handler;
|
|
+ void (*_sa_sigaction)(int, struct siginfo *, void *);
|
|
+ } _u;
|
|
+ sigset_t sa_mask;
|
|
+ unsigned long sa_flags;
|
|
+ void (*sa_restorer)(void);
|
|
+};
|
|
+
|
|
+#define sa_handler _u._sa_handler
|
|
+#define sa_sigaction _u._sa_sigaction
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+typedef struct sigaltstack {
|
|
+ void __user *ss_sp;
|
|
+ int ss_flags;
|
|
+ size_t ss_size;
|
|
+} stack_t;
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+#include <asm/sigcontext.h>
|
|
+
|
|
+#define __HAVE_ARCH_SIG_BITOPS
|
|
+
|
|
+static inline void sigaddset(sigset_t *set, int _sig)
|
|
+{
|
|
+ asm ("bfset %0{%1,#1}"
|
|
+ : "+od" (*set)
|
|
+ : "id" ((_sig - 1) ^ 31)
|
|
+ : "cc");
|
|
+}
|
|
+
|
|
+static inline void sigdelset(sigset_t *set, int _sig)
|
|
+{
|
|
+ asm ("bfclr %0{%1,#1}"
|
|
+ : "+od" (*set)
|
|
+ : "id" ((_sig - 1) ^ 31)
|
|
+ : "cc");
|
|
+}
|
|
+
|
|
+static inline int __const_sigismember(sigset_t *set, int _sig)
|
|
+{
|
|
+ unsigned long sig = _sig - 1;
|
|
+ return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
|
|
+}
|
|
+
|
|
+static inline int __gen_sigismember(sigset_t *set, int _sig)
|
|
+{
|
|
+ int ret;
|
|
+ asm ("bfextu %1{%2,#1},%0"
|
|
+ : "=d" (ret)
|
|
+ : "od" (*set), "id" ((_sig-1) ^ 31)
|
|
+ : "cc");
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+#define sigismember(set,sig) \
|
|
+ (__builtin_constant_p(sig) ? \
|
|
+ __const_sigismember(set,sig) : \
|
|
+ __gen_sigismember(set,sig))
|
|
+
|
|
+static inline int sigfindinword(unsigned long word)
|
|
+{
|
|
+ asm ("bfffo %1{#0,#0},%0"
|
|
+ : "=d" (word)
|
|
+ : "d" (word & -word)
|
|
+ : "cc");
|
|
+ return word ^ 31;
|
|
+}
|
|
+
|
|
+struct pt_regs;
|
|
+extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+#endif /* _M68K_SIGNAL_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/signal_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal_no.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/signal_no.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal_no.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,159 @@
|
|
+#ifndef _M68KNOMMU_SIGNAL_H
|
|
+#define _M68KNOMMU_SIGNAL_H
|
|
+
|
|
+#include <linux/types.h>
|
|
+
|
|
+/* Avoid too many header ordering problems. */
|
|
+struct siginfo;
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+/* Most things should be clean enough to redefine this at will, if care
|
|
+ is taken to make libc match. */
|
|
+
|
|
+#define _NSIG 64
|
|
+#define _NSIG_BPW 32
|
|
+#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
|
+
|
|
+typedef unsigned long old_sigset_t; /* at least 32 bits */
|
|
+
|
|
+typedef struct {
|
|
+ unsigned long sig[_NSIG_WORDS];
|
|
+} sigset_t;
|
|
+
|
|
+#else
|
|
+/* Here we must cater to libcs that poke about in kernel headers. */
|
|
+
|
|
+#define NSIG 32
|
|
+typedef unsigned long sigset_t;
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+#define SIGHUP 1
|
|
+#define SIGINT 2
|
|
+#define SIGQUIT 3
|
|
+#define SIGILL 4
|
|
+#define SIGTRAP 5
|
|
+#define SIGABRT 6
|
|
+#define SIGIOT 6
|
|
+#define SIGBUS 7
|
|
+#define SIGFPE 8
|
|
+#define SIGKILL 9
|
|
+#define SIGUSR1 10
|
|
+#define SIGSEGV 11
|
|
+#define SIGUSR2 12
|
|
+#define SIGPIPE 13
|
|
+#define SIGALRM 14
|
|
+#define SIGTERM 15
|
|
+#define SIGSTKFLT 16
|
|
+#define SIGCHLD 17
|
|
+#define SIGCONT 18
|
|
+#define SIGSTOP 19
|
|
+#define SIGTSTP 20
|
|
+#define SIGTTIN 21
|
|
+#define SIGTTOU 22
|
|
+#define SIGURG 23
|
|
+#define SIGXCPU 24
|
|
+#define SIGXFSZ 25
|
|
+#define SIGVTALRM 26
|
|
+#define SIGPROF 27
|
|
+#define SIGWINCH 28
|
|
+#define SIGIO 29
|
|
+#define SIGPOLL SIGIO
|
|
+/*
|
|
+#define SIGLOST 29
|
|
+*/
|
|
+#define SIGPWR 30
|
|
+#define SIGSYS 31
|
|
+#define SIGUNUSED 31
|
|
+
|
|
+/* These should not be considered constants from userland. */
|
|
+#define SIGRTMIN 32
|
|
+#define SIGRTMAX _NSIG
|
|
+
|
|
+/*
|
|
+ * SA_FLAGS values:
|
|
+ *
|
|
+ * SA_ONSTACK indicates that a registered stack_t will be used.
|
|
+ * SA_RESTART flag to get restarting signals (which were the default long ago)
|
|
+ * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
|
|
+ * SA_RESETHAND clears the handler when the signal is delivered.
|
|
+ * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
|
|
+ * SA_NODEFER prevents the current signal from being masked in the handler.
|
|
+ *
|
|
+ * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
|
|
+ * Unix names RESETHAND and NODEFER respectively.
|
|
+ */
|
|
+#define SA_NOCLDSTOP 0x00000001
|
|
+#define SA_NOCLDWAIT 0x00000002
|
|
+#define SA_SIGINFO 0x00000004
|
|
+#define SA_ONSTACK 0x08000000
|
|
+#define SA_RESTART 0x10000000
|
|
+#define SA_NODEFER 0x40000000
|
|
+#define SA_RESETHAND 0x80000000
|
|
+
|
|
+#define SA_NOMASK SA_NODEFER
|
|
+#define SA_ONESHOT SA_RESETHAND
|
|
+
|
|
+/*
|
|
+ * sigaltstack controls
|
|
+ */
|
|
+#define SS_ONSTACK 1
|
|
+#define SS_DISABLE 2
|
|
+
|
|
+#define MINSIGSTKSZ 2048
|
|
+#define SIGSTKSZ 8192
|
|
+
|
|
+#include <asm-generic/signal.h>
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+struct old_sigaction {
|
|
+ __sighandler_t sa_handler;
|
|
+ old_sigset_t sa_mask;
|
|
+ unsigned long sa_flags;
|
|
+ void (*sa_restorer)(void);
|
|
+};
|
|
+
|
|
+struct sigaction {
|
|
+ __sighandler_t sa_handler;
|
|
+ unsigned long sa_flags;
|
|
+ void (*sa_restorer)(void);
|
|
+ sigset_t sa_mask; /* mask last for extensibility */
|
|
+};
|
|
+
|
|
+struct k_sigaction {
|
|
+ struct sigaction sa;
|
|
+};
|
|
+#else
|
|
+/* Here we must cater to libcs that poke about in kernel headers. */
|
|
+
|
|
+struct sigaction {
|
|
+ union {
|
|
+ __sighandler_t _sa_handler;
|
|
+ void (*_sa_sigaction)(int, struct siginfo *, void *);
|
|
+ } _u;
|
|
+ sigset_t sa_mask;
|
|
+ unsigned long sa_flags;
|
|
+ void (*sa_restorer)(void);
|
|
+};
|
|
+
|
|
+#define sa_handler _u._sa_handler
|
|
+#define sa_sigaction _u._sa_sigaction
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+typedef struct sigaltstack {
|
|
+ void *ss_sp;
|
|
+ int ss_flags;
|
|
+ size_t ss_size;
|
|
+} stack_t;
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#include <asm/sigcontext.h>
|
|
+#undef __HAVE_ARCH_SIG_BITOPS
|
|
+
|
|
+#define ptrace_signal_deliver(regs, cookie) do { } while (0)
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+
|
|
+#endif /* _M68KNOMMU_SIGNAL_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/swab.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/swab.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,27 +1,5 @@
|
|
-#ifndef _M68K_SWAB_H
|
|
-#define _M68K_SWAB_H
|
|
-
|
|
-#include <asm/types.h>
|
|
-#include <linux/compiler.h>
|
|
-
|
|
-#define __SWAB_64_THRU_32__
|
|
-
|
|
-#if defined (__mcfisaaplus__) || defined (__mcfisac__)
|
|
-static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
|
-{
|
|
- __asm__("byterev %0" : "=d" (val) : "0" (val));
|
|
- return val;
|
|
-}
|
|
-
|
|
-#define __arch_swab32 __arch_swab32
|
|
-#elif !defined(__uClinux__)
|
|
-
|
|
-static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
|
-{
|
|
- __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
|
|
- return val;
|
|
-}
|
|
-#define __arch_swab32 __arch_swab32
|
|
+#ifdef __uClinux__
|
|
+#include "swab_no.h"
|
|
+#else
|
|
+#include "swab_mm.h"
|
|
#endif
|
|
-
|
|
-#endif /* _M68K_SWAB_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/swab_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab_mm.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/swab_mm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab_mm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,16 @@
|
|
+#ifndef _M68K_SWAB_H
|
|
+#define _M68K_SWAB_H
|
|
+
|
|
+#include <asm/types.h>
|
|
+#include <linux/compiler.h>
|
|
+
|
|
+#define __SWAB_64_THRU_32__
|
|
+
|
|
+static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
|
+{
|
|
+ __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
|
|
+ return val;
|
|
+}
|
|
+#define __arch_swab32 __arch_swab32
|
|
+
|
|
+#endif /* _M68K_SWAB_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/swab_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab_no.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/swab_no.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab_no.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,24 @@
|
|
+#ifndef _M68KNOMMU_SWAB_H
|
|
+#define _M68KNOMMU_SWAB_H
|
|
+
|
|
+#include <linux/types.h>
|
|
+
|
|
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
|
|
+# define __SWAB_64_THRU_32__
|
|
+#endif
|
|
+
|
|
+#if defined (__mcfisaaplus__) || defined (__mcfisac__)
|
|
+static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
|
+{
|
|
+ asm(
|
|
+ "byterev %0"
|
|
+ : "=d" (val)
|
|
+ : "0" (val)
|
|
+ );
|
|
+ return val;
|
|
+}
|
|
+
|
|
+#define __arch_swab32 __arch_swab32
|
|
+#endif
|
|
+
|
|
+#endif /* _M68KNOMMU_SWAB_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/unistd.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/unistd.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,372 +1,5 @@
|
|
-#ifndef _ASM_M68K_UNISTD_H_
|
|
-#define _ASM_M68K_UNISTD_H_
|
|
-
|
|
-/*
|
|
- * This file contains the system call numbers.
|
|
- */
|
|
-
|
|
-#define __NR_restart_syscall 0
|
|
-#define __NR_exit 1
|
|
-#define __NR_fork 2
|
|
-#define __NR_read 3
|
|
-#define __NR_write 4
|
|
-#define __NR_open 5
|
|
-#define __NR_close 6
|
|
-#define __NR_waitpid 7
|
|
-#define __NR_creat 8
|
|
-#define __NR_link 9
|
|
-#define __NR_unlink 10
|
|
-#define __NR_execve 11
|
|
-#define __NR_chdir 12
|
|
-#define __NR_time 13
|
|
-#define __NR_mknod 14
|
|
-#define __NR_chmod 15
|
|
-#define __NR_chown 16
|
|
-#define __NR_break 17
|
|
-#define __NR_oldstat 18
|
|
-#define __NR_lseek 19
|
|
-#define __NR_getpid 20
|
|
-#define __NR_mount 21
|
|
-#define __NR_umount 22
|
|
-#define __NR_setuid 23
|
|
-#define __NR_getuid 24
|
|
-#define __NR_stime 25
|
|
-#define __NR_ptrace 26
|
|
-#define __NR_alarm 27
|
|
-#define __NR_oldfstat 28
|
|
-#define __NR_pause 29
|
|
-#define __NR_utime 30
|
|
-#define __NR_stty 31
|
|
-#define __NR_gtty 32
|
|
-#define __NR_access 33
|
|
-#define __NR_nice 34
|
|
-#define __NR_ftime 35
|
|
-#define __NR_sync 36
|
|
-#define __NR_kill 37
|
|
-#define __NR_rename 38
|
|
-#define __NR_mkdir 39
|
|
-#define __NR_rmdir 40
|
|
-#define __NR_dup 41
|
|
-#define __NR_pipe 42
|
|
-#define __NR_times 43
|
|
-#define __NR_prof 44
|
|
-#define __NR_brk 45
|
|
-#define __NR_setgid 46
|
|
-#define __NR_getgid 47
|
|
-#define __NR_signal 48
|
|
-#define __NR_geteuid 49
|
|
-#define __NR_getegid 50
|
|
-#define __NR_acct 51
|
|
-#define __NR_umount2 52
|
|
-#define __NR_lock 53
|
|
-#define __NR_ioctl 54
|
|
-#define __NR_fcntl 55
|
|
-#define __NR_mpx 56
|
|
-#define __NR_setpgid 57
|
|
-#define __NR_ulimit 58
|
|
-#define __NR_oldolduname 59
|
|
-#define __NR_umask 60
|
|
-#define __NR_chroot 61
|
|
-#define __NR_ustat 62
|
|
-#define __NR_dup2 63
|
|
-#define __NR_getppid 64
|
|
-#define __NR_getpgrp 65
|
|
-#define __NR_setsid 66
|
|
-#define __NR_sigaction 67
|
|
-#define __NR_sgetmask 68
|
|
-#define __NR_ssetmask 69
|
|
-#define __NR_setreuid 70
|
|
-#define __NR_setregid 71
|
|
-#define __NR_sigsuspend 72
|
|
-#define __NR_sigpending 73
|
|
-#define __NR_sethostname 74
|
|
-#define __NR_setrlimit 75
|
|
-#define __NR_getrlimit 76
|
|
-#define __NR_getrusage 77
|
|
-#define __NR_gettimeofday 78
|
|
-#define __NR_settimeofday 79
|
|
-#define __NR_getgroups 80
|
|
-#define __NR_setgroups 81
|
|
-#define __NR_select 82
|
|
-#define __NR_symlink 83
|
|
-#define __NR_oldlstat 84
|
|
-#define __NR_readlink 85
|
|
-#define __NR_uselib 86
|
|
-#define __NR_swapon 87
|
|
-#define __NR_reboot 88
|
|
-#define __NR_readdir 89
|
|
-#define __NR_mmap 90
|
|
-#define __NR_munmap 91
|
|
-#define __NR_truncate 92
|
|
-#define __NR_ftruncate 93
|
|
-#define __NR_fchmod 94
|
|
-#define __NR_fchown 95
|
|
-#define __NR_getpriority 96
|
|
-#define __NR_setpriority 97
|
|
-#define __NR_profil 98
|
|
-#define __NR_statfs 99
|
|
-#define __NR_fstatfs 100
|
|
-#define __NR_ioperm 101
|
|
-#define __NR_socketcall 102
|
|
-#define __NR_syslog 103
|
|
-#define __NR_setitimer 104
|
|
-#define __NR_getitimer 105
|
|
-#define __NR_stat 106
|
|
-#define __NR_lstat 107
|
|
-#define __NR_fstat 108
|
|
-#define __NR_olduname 109
|
|
-#define __NR_iopl /* 110 */ not supported
|
|
-#define __NR_vhangup 111
|
|
-#define __NR_idle /* 112 */ Obsolete
|
|
-#define __NR_vm86 /* 113 */ not supported
|
|
-#define __NR_wait4 114
|
|
-#define __NR_swapoff 115
|
|
-#define __NR_sysinfo 116
|
|
-#define __NR_ipc 117
|
|
-#define __NR_fsync 118
|
|
-#define __NR_sigreturn 119
|
|
-#define __NR_clone 120
|
|
-#define __NR_setdomainname 121
|
|
-#define __NR_uname 122
|
|
-#define __NR_cacheflush 123
|
|
-#define __NR_adjtimex 124
|
|
-#define __NR_mprotect 125
|
|
-#define __NR_sigprocmask 126
|
|
-#define __NR_create_module 127
|
|
-#define __NR_init_module 128
|
|
-#define __NR_delete_module 129
|
|
-#define __NR_get_kernel_syms 130
|
|
-#define __NR_quotactl 131
|
|
-#define __NR_getpgid 132
|
|
-#define __NR_fchdir 133
|
|
-#define __NR_bdflush 134
|
|
-#define __NR_sysfs 135
|
|
-#define __NR_personality 136
|
|
-#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
|
|
-#define __NR_setfsuid 138
|
|
-#define __NR_setfsgid 139
|
|
-#define __NR__llseek 140
|
|
-#define __NR_getdents 141
|
|
-#define __NR__newselect 142
|
|
-#define __NR_flock 143
|
|
-#define __NR_msync 144
|
|
-#define __NR_readv 145
|
|
-#define __NR_writev 146
|
|
-#define __NR_getsid 147
|
|
-#define __NR_fdatasync 148
|
|
-#define __NR__sysctl 149
|
|
-#define __NR_mlock 150
|
|
-#define __NR_munlock 151
|
|
-#define __NR_mlockall 152
|
|
-#define __NR_munlockall 153
|
|
-#define __NR_sched_setparam 154
|
|
-#define __NR_sched_getparam 155
|
|
-#define __NR_sched_setscheduler 156
|
|
-#define __NR_sched_getscheduler 157
|
|
-#define __NR_sched_yield 158
|
|
-#define __NR_sched_get_priority_max 159
|
|
-#define __NR_sched_get_priority_min 160
|
|
-#define __NR_sched_rr_get_interval 161
|
|
-#define __NR_nanosleep 162
|
|
-#define __NR_mremap 163
|
|
-#define __NR_setresuid 164
|
|
-#define __NR_getresuid 165
|
|
-#define __NR_getpagesize 166
|
|
-#define __NR_query_module 167
|
|
-#define __NR_poll 168
|
|
-#define __NR_nfsservctl 169
|
|
-#define __NR_setresgid 170
|
|
-#define __NR_getresgid 171
|
|
-#define __NR_prctl 172
|
|
-#define __NR_rt_sigreturn 173
|
|
-#define __NR_rt_sigaction 174
|
|
-#define __NR_rt_sigprocmask 175
|
|
-#define __NR_rt_sigpending 176
|
|
-#define __NR_rt_sigtimedwait 177
|
|
-#define __NR_rt_sigqueueinfo 178
|
|
-#define __NR_rt_sigsuspend 179
|
|
-#define __NR_pread64 180
|
|
-#define __NR_pwrite64 181
|
|
-#define __NR_lchown 182
|
|
-#define __NR_getcwd 183
|
|
-#define __NR_capget 184
|
|
-#define __NR_capset 185
|
|
-#define __NR_sigaltstack 186
|
|
-#define __NR_sendfile 187
|
|
-#define __NR_getpmsg 188 /* some people actually want streams */
|
|
-#define __NR_putpmsg 189 /* some people actually want streams */
|
|
-#define __NR_vfork 190
|
|
-#define __NR_ugetrlimit 191
|
|
-#define __NR_mmap2 192
|
|
-#define __NR_truncate64 193
|
|
-#define __NR_ftruncate64 194
|
|
-#define __NR_stat64 195
|
|
-#define __NR_lstat64 196
|
|
-#define __NR_fstat64 197
|
|
-#define __NR_chown32 198
|
|
-#define __NR_getuid32 199
|
|
-#define __NR_getgid32 200
|
|
-#define __NR_geteuid32 201
|
|
-#define __NR_getegid32 202
|
|
-#define __NR_setreuid32 203
|
|
-#define __NR_setregid32 204
|
|
-#define __NR_getgroups32 205
|
|
-#define __NR_setgroups32 206
|
|
-#define __NR_fchown32 207
|
|
-#define __NR_setresuid32 208
|
|
-#define __NR_getresuid32 209
|
|
-#define __NR_setresgid32 210
|
|
-#define __NR_getresgid32 211
|
|
-#define __NR_lchown32 212
|
|
-#define __NR_setuid32 213
|
|
-#define __NR_setgid32 214
|
|
-#define __NR_setfsuid32 215
|
|
-#define __NR_setfsgid32 216
|
|
-#define __NR_pivot_root 217
|
|
-#define __NR_getdents64 220
|
|
-#define __NR_gettid 221
|
|
-#define __NR_tkill 222
|
|
-#define __NR_setxattr 223
|
|
-#define __NR_lsetxattr 224
|
|
-#define __NR_fsetxattr 225
|
|
-#define __NR_getxattr 226
|
|
-#define __NR_lgetxattr 227
|
|
-#define __NR_fgetxattr 228
|
|
-#define __NR_listxattr 229
|
|
-#define __NR_llistxattr 230
|
|
-#define __NR_flistxattr 231
|
|
-#define __NR_removexattr 232
|
|
-#define __NR_lremovexattr 233
|
|
-#define __NR_fremovexattr 234
|
|
-#define __NR_futex 235
|
|
-#define __NR_sendfile64 236
|
|
-#define __NR_mincore 237
|
|
-#define __NR_madvise 238
|
|
-#define __NR_fcntl64 239
|
|
-#define __NR_readahead 240
|
|
-#define __NR_io_setup 241
|
|
-#define __NR_io_destroy 242
|
|
-#define __NR_io_getevents 243
|
|
-#define __NR_io_submit 244
|
|
-#define __NR_io_cancel 245
|
|
-#define __NR_fadvise64 246
|
|
-#define __NR_exit_group 247
|
|
-#define __NR_lookup_dcookie 248
|
|
-#define __NR_epoll_create 249
|
|
-#define __NR_epoll_ctl 250
|
|
-#define __NR_epoll_wait 251
|
|
-#define __NR_remap_file_pages 252
|
|
-#define __NR_set_tid_address 253
|
|
-#define __NR_timer_create 254
|
|
-#define __NR_timer_settime 255
|
|
-#define __NR_timer_gettime 256
|
|
-#define __NR_timer_getoverrun 257
|
|
-#define __NR_timer_delete 258
|
|
-#define __NR_clock_settime 259
|
|
-#define __NR_clock_gettime 260
|
|
-#define __NR_clock_getres 261
|
|
-#define __NR_clock_nanosleep 262
|
|
-#define __NR_statfs64 263
|
|
-#define __NR_fstatfs64 264
|
|
-#define __NR_tgkill 265
|
|
-#define __NR_utimes 266
|
|
-#define __NR_fadvise64_64 267
|
|
-#define __NR_mbind 268
|
|
-#define __NR_get_mempolicy 269
|
|
-#define __NR_set_mempolicy 270
|
|
-#define __NR_mq_open 271
|
|
-#define __NR_mq_unlink 272
|
|
-#define __NR_mq_timedsend 273
|
|
-#define __NR_mq_timedreceive 274
|
|
-#define __NR_mq_notify 275
|
|
-#define __NR_mq_getsetattr 276
|
|
-#define __NR_waitid 277
|
|
-#define __NR_vserver 278
|
|
-#define __NR_add_key 279
|
|
-#define __NR_request_key 280
|
|
-#define __NR_keyctl 281
|
|
-#define __NR_ioprio_set 282
|
|
-#define __NR_ioprio_get 283
|
|
-#define __NR_inotify_init 284
|
|
-#define __NR_inotify_add_watch 285
|
|
-#define __NR_inotify_rm_watch 286
|
|
-#define __NR_migrate_pages 287
|
|
-#define __NR_openat 288
|
|
-#define __NR_mkdirat 289
|
|
-#define __NR_mknodat 290
|
|
-#define __NR_fchownat 291
|
|
-#define __NR_futimesat 292
|
|
-#define __NR_fstatat64 293
|
|
-#define __NR_unlinkat 294
|
|
-#define __NR_renameat 295
|
|
-#define __NR_linkat 296
|
|
-#define __NR_symlinkat 297
|
|
-#define __NR_readlinkat 298
|
|
-#define __NR_fchmodat 299
|
|
-#define __NR_faccessat 300
|
|
-#define __NR_pselect6 301
|
|
-#define __NR_ppoll 302
|
|
-#define __NR_unshare 303
|
|
-#define __NR_set_robust_list 304
|
|
-#define __NR_get_robust_list 305
|
|
-#define __NR_splice 306
|
|
-#define __NR_sync_file_range 307
|
|
-#define __NR_tee 308
|
|
-#define __NR_vmsplice 309
|
|
-#define __NR_move_pages 310
|
|
-#define __NR_sched_setaffinity 311
|
|
-#define __NR_sched_getaffinity 312
|
|
-#define __NR_kexec_load 313
|
|
-#define __NR_getcpu 314
|
|
-#define __NR_epoll_pwait 315
|
|
-#define __NR_utimensat 316
|
|
-#define __NR_signalfd 317
|
|
-#define __NR_timerfd_create 318
|
|
-#define __NR_eventfd 319
|
|
-#define __NR_fallocate 320
|
|
-#define __NR_timerfd_settime 321
|
|
-#define __NR_timerfd_gettime 322
|
|
-#define __NR_signalfd4 323
|
|
-#define __NR_eventfd2 324
|
|
-#define __NR_epoll_create1 325
|
|
-#define __NR_dup3 326
|
|
-#define __NR_pipe2 327
|
|
-#define __NR_inotify_init1 328
|
|
-
|
|
-#ifdef __KERNEL__
|
|
-
|
|
-#define NR_syscalls 329
|
|
-
|
|
-#define __ARCH_WANT_IPC_PARSE_VERSION
|
|
-#define __ARCH_WANT_OLD_READDIR
|
|
-#define __ARCH_WANT_OLD_STAT
|
|
-#define __ARCH_WANT_STAT64
|
|
-#define __ARCH_WANT_SYS_ALARM
|
|
-#define __ARCH_WANT_SYS_GETHOSTNAME
|
|
-#define __ARCH_WANT_SYS_PAUSE
|
|
-#define __ARCH_WANT_SYS_SGETMASK
|
|
-#define __ARCH_WANT_SYS_SIGNAL
|
|
-#define __ARCH_WANT_SYS_TIME
|
|
-#define __ARCH_WANT_SYS_UTIME
|
|
-#define __ARCH_WANT_SYS_WAITPID
|
|
-#define __ARCH_WANT_SYS_SOCKETCALL
|
|
-#define __ARCH_WANT_SYS_FADVISE64
|
|
-#define __ARCH_WANT_SYS_GETPGRP
|
|
-#define __ARCH_WANT_SYS_LLSEEK
|
|
-#define __ARCH_WANT_SYS_NICE
|
|
-#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
|
-#define __ARCH_WANT_SYS_OLDUMOUNT
|
|
-#define __ARCH_WANT_SYS_SIGPENDING
|
|
-#define __ARCH_WANT_SYS_SIGPROCMASK
|
|
-#define __ARCH_WANT_SYS_RT_SIGACTION
|
|
-
|
|
-/*
|
|
- * "Conditional" syscalls
|
|
- *
|
|
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
|
|
- * but it doesn't work on all toolchains, so we just do it by hand
|
|
- */
|
|
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
|
|
-
|
|
-#endif /* __KERNEL__ */
|
|
-#endif /* _ASM_M68K_UNISTD_H_ */
|
|
+#ifdef __uClinux__
|
|
+#include "unistd_no.h"
|
|
+#else
|
|
+#include "unistd_mm.h"
|
|
+#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/unistd_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd_mm.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/unistd_mm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd_mm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,372 @@
|
|
+#ifndef _ASM_M68K_UNISTD_H_
|
|
+#define _ASM_M68K_UNISTD_H_
|
|
+
|
|
+/*
|
|
+ * This file contains the system call numbers.
|
|
+ */
|
|
+
|
|
+#define __NR_restart_syscall 0
|
|
+#define __NR_exit 1
|
|
+#define __NR_fork 2
|
|
+#define __NR_read 3
|
|
+#define __NR_write 4
|
|
+#define __NR_open 5
|
|
+#define __NR_close 6
|
|
+#define __NR_waitpid 7
|
|
+#define __NR_creat 8
|
|
+#define __NR_link 9
|
|
+#define __NR_unlink 10
|
|
+#define __NR_execve 11
|
|
+#define __NR_chdir 12
|
|
+#define __NR_time 13
|
|
+#define __NR_mknod 14
|
|
+#define __NR_chmod 15
|
|
+#define __NR_chown 16
|
|
+#define __NR_break 17
|
|
+#define __NR_oldstat 18
|
|
+#define __NR_lseek 19
|
|
+#define __NR_getpid 20
|
|
+#define __NR_mount 21
|
|
+#define __NR_umount 22
|
|
+#define __NR_setuid 23
|
|
+#define __NR_getuid 24
|
|
+#define __NR_stime 25
|
|
+#define __NR_ptrace 26
|
|
+#define __NR_alarm 27
|
|
+#define __NR_oldfstat 28
|
|
+#define __NR_pause 29
|
|
+#define __NR_utime 30
|
|
+#define __NR_stty 31
|
|
+#define __NR_gtty 32
|
|
+#define __NR_access 33
|
|
+#define __NR_nice 34
|
|
+#define __NR_ftime 35
|
|
+#define __NR_sync 36
|
|
+#define __NR_kill 37
|
|
+#define __NR_rename 38
|
|
+#define __NR_mkdir 39
|
|
+#define __NR_rmdir 40
|
|
+#define __NR_dup 41
|
|
+#define __NR_pipe 42
|
|
+#define __NR_times 43
|
|
+#define __NR_prof 44
|
|
+#define __NR_brk 45
|
|
+#define __NR_setgid 46
|
|
+#define __NR_getgid 47
|
|
+#define __NR_signal 48
|
|
+#define __NR_geteuid 49
|
|
+#define __NR_getegid 50
|
|
+#define __NR_acct 51
|
|
+#define __NR_umount2 52
|
|
+#define __NR_lock 53
|
|
+#define __NR_ioctl 54
|
|
+#define __NR_fcntl 55
|
|
+#define __NR_mpx 56
|
|
+#define __NR_setpgid 57
|
|
+#define __NR_ulimit 58
|
|
+#define __NR_oldolduname 59
|
|
+#define __NR_umask 60
|
|
+#define __NR_chroot 61
|
|
+#define __NR_ustat 62
|
|
+#define __NR_dup2 63
|
|
+#define __NR_getppid 64
|
|
+#define __NR_getpgrp 65
|
|
+#define __NR_setsid 66
|
|
+#define __NR_sigaction 67
|
|
+#define __NR_sgetmask 68
|
|
+#define __NR_ssetmask 69
|
|
+#define __NR_setreuid 70
|
|
+#define __NR_setregid 71
|
|
+#define __NR_sigsuspend 72
|
|
+#define __NR_sigpending 73
|
|
+#define __NR_sethostname 74
|
|
+#define __NR_setrlimit 75
|
|
+#define __NR_getrlimit 76
|
|
+#define __NR_getrusage 77
|
|
+#define __NR_gettimeofday 78
|
|
+#define __NR_settimeofday 79
|
|
+#define __NR_getgroups 80
|
|
+#define __NR_setgroups 81
|
|
+#define __NR_select 82
|
|
+#define __NR_symlink 83
|
|
+#define __NR_oldlstat 84
|
|
+#define __NR_readlink 85
|
|
+#define __NR_uselib 86
|
|
+#define __NR_swapon 87
|
|
+#define __NR_reboot 88
|
|
+#define __NR_readdir 89
|
|
+#define __NR_mmap 90
|
|
+#define __NR_munmap 91
|
|
+#define __NR_truncate 92
|
|
+#define __NR_ftruncate 93
|
|
+#define __NR_fchmod 94
|
|
+#define __NR_fchown 95
|
|
+#define __NR_getpriority 96
|
|
+#define __NR_setpriority 97
|
|
+#define __NR_profil 98
|
|
+#define __NR_statfs 99
|
|
+#define __NR_fstatfs 100
|
|
+#define __NR_ioperm 101
|
|
+#define __NR_socketcall 102
|
|
+#define __NR_syslog 103
|
|
+#define __NR_setitimer 104
|
|
+#define __NR_getitimer 105
|
|
+#define __NR_stat 106
|
|
+#define __NR_lstat 107
|
|
+#define __NR_fstat 108
|
|
+#define __NR_olduname 109
|
|
+#define __NR_iopl /* 110 */ not supported
|
|
+#define __NR_vhangup 111
|
|
+#define __NR_idle /* 112 */ Obsolete
|
|
+#define __NR_vm86 /* 113 */ not supported
|
|
+#define __NR_wait4 114
|
|
+#define __NR_swapoff 115
|
|
+#define __NR_sysinfo 116
|
|
+#define __NR_ipc 117
|
|
+#define __NR_fsync 118
|
|
+#define __NR_sigreturn 119
|
|
+#define __NR_clone 120
|
|
+#define __NR_setdomainname 121
|
|
+#define __NR_uname 122
|
|
+#define __NR_cacheflush 123
|
|
+#define __NR_adjtimex 124
|
|
+#define __NR_mprotect 125
|
|
+#define __NR_sigprocmask 126
|
|
+#define __NR_create_module 127
|
|
+#define __NR_init_module 128
|
|
+#define __NR_delete_module 129
|
|
+#define __NR_get_kernel_syms 130
|
|
+#define __NR_quotactl 131
|
|
+#define __NR_getpgid 132
|
|
+#define __NR_fchdir 133
|
|
+#define __NR_bdflush 134
|
|
+#define __NR_sysfs 135
|
|
+#define __NR_personality 136
|
|
+#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
|
|
+#define __NR_setfsuid 138
|
|
+#define __NR_setfsgid 139
|
|
+#define __NR__llseek 140
|
|
+#define __NR_getdents 141
|
|
+#define __NR__newselect 142
|
|
+#define __NR_flock 143
|
|
+#define __NR_msync 144
|
|
+#define __NR_readv 145
|
|
+#define __NR_writev 146
|
|
+#define __NR_getsid 147
|
|
+#define __NR_fdatasync 148
|
|
+#define __NR__sysctl 149
|
|
+#define __NR_mlock 150
|
|
+#define __NR_munlock 151
|
|
+#define __NR_mlockall 152
|
|
+#define __NR_munlockall 153
|
|
+#define __NR_sched_setparam 154
|
|
+#define __NR_sched_getparam 155
|
|
+#define __NR_sched_setscheduler 156
|
|
+#define __NR_sched_getscheduler 157
|
|
+#define __NR_sched_yield 158
|
|
+#define __NR_sched_get_priority_max 159
|
|
+#define __NR_sched_get_priority_min 160
|
|
+#define __NR_sched_rr_get_interval 161
|
|
+#define __NR_nanosleep 162
|
|
+#define __NR_mremap 163
|
|
+#define __NR_setresuid 164
|
|
+#define __NR_getresuid 165
|
|
+#define __NR_getpagesize 166
|
|
+#define __NR_query_module 167
|
|
+#define __NR_poll 168
|
|
+#define __NR_nfsservctl 169
|
|
+#define __NR_setresgid 170
|
|
+#define __NR_getresgid 171
|
|
+#define __NR_prctl 172
|
|
+#define __NR_rt_sigreturn 173
|
|
+#define __NR_rt_sigaction 174
|
|
+#define __NR_rt_sigprocmask 175
|
|
+#define __NR_rt_sigpending 176
|
|
+#define __NR_rt_sigtimedwait 177
|
|
+#define __NR_rt_sigqueueinfo 178
|
|
+#define __NR_rt_sigsuspend 179
|
|
+#define __NR_pread64 180
|
|
+#define __NR_pwrite64 181
|
|
+#define __NR_lchown 182
|
|
+#define __NR_getcwd 183
|
|
+#define __NR_capget 184
|
|
+#define __NR_capset 185
|
|
+#define __NR_sigaltstack 186
|
|
+#define __NR_sendfile 187
|
|
+#define __NR_getpmsg 188 /* some people actually want streams */
|
|
+#define __NR_putpmsg 189 /* some people actually want streams */
|
|
+#define __NR_vfork 190
|
|
+#define __NR_ugetrlimit 191
|
|
+#define __NR_mmap2 192
|
|
+#define __NR_truncate64 193
|
|
+#define __NR_ftruncate64 194
|
|
+#define __NR_stat64 195
|
|
+#define __NR_lstat64 196
|
|
+#define __NR_fstat64 197
|
|
+#define __NR_chown32 198
|
|
+#define __NR_getuid32 199
|
|
+#define __NR_getgid32 200
|
|
+#define __NR_geteuid32 201
|
|
+#define __NR_getegid32 202
|
|
+#define __NR_setreuid32 203
|
|
+#define __NR_setregid32 204
|
|
+#define __NR_getgroups32 205
|
|
+#define __NR_setgroups32 206
|
|
+#define __NR_fchown32 207
|
|
+#define __NR_setresuid32 208
|
|
+#define __NR_getresuid32 209
|
|
+#define __NR_setresgid32 210
|
|
+#define __NR_getresgid32 211
|
|
+#define __NR_lchown32 212
|
|
+#define __NR_setuid32 213
|
|
+#define __NR_setgid32 214
|
|
+#define __NR_setfsuid32 215
|
|
+#define __NR_setfsgid32 216
|
|
+#define __NR_pivot_root 217
|
|
+#define __NR_getdents64 220
|
|
+#define __NR_gettid 221
|
|
+#define __NR_tkill 222
|
|
+#define __NR_setxattr 223
|
|
+#define __NR_lsetxattr 224
|
|
+#define __NR_fsetxattr 225
|
|
+#define __NR_getxattr 226
|
|
+#define __NR_lgetxattr 227
|
|
+#define __NR_fgetxattr 228
|
|
+#define __NR_listxattr 229
|
|
+#define __NR_llistxattr 230
|
|
+#define __NR_flistxattr 231
|
|
+#define __NR_removexattr 232
|
|
+#define __NR_lremovexattr 233
|
|
+#define __NR_fremovexattr 234
|
|
+#define __NR_futex 235
|
|
+#define __NR_sendfile64 236
|
|
+#define __NR_mincore 237
|
|
+#define __NR_madvise 238
|
|
+#define __NR_fcntl64 239
|
|
+#define __NR_readahead 240
|
|
+#define __NR_io_setup 241
|
|
+#define __NR_io_destroy 242
|
|
+#define __NR_io_getevents 243
|
|
+#define __NR_io_submit 244
|
|
+#define __NR_io_cancel 245
|
|
+#define __NR_fadvise64 246
|
|
+#define __NR_exit_group 247
|
|
+#define __NR_lookup_dcookie 248
|
|
+#define __NR_epoll_create 249
|
|
+#define __NR_epoll_ctl 250
|
|
+#define __NR_epoll_wait 251
|
|
+#define __NR_remap_file_pages 252
|
|
+#define __NR_set_tid_address 253
|
|
+#define __NR_timer_create 254
|
|
+#define __NR_timer_settime 255
|
|
+#define __NR_timer_gettime 256
|
|
+#define __NR_timer_getoverrun 257
|
|
+#define __NR_timer_delete 258
|
|
+#define __NR_clock_settime 259
|
|
+#define __NR_clock_gettime 260
|
|
+#define __NR_clock_getres 261
|
|
+#define __NR_clock_nanosleep 262
|
|
+#define __NR_statfs64 263
|
|
+#define __NR_fstatfs64 264
|
|
+#define __NR_tgkill 265
|
|
+#define __NR_utimes 266
|
|
+#define __NR_fadvise64_64 267
|
|
+#define __NR_mbind 268
|
|
+#define __NR_get_mempolicy 269
|
|
+#define __NR_set_mempolicy 270
|
|
+#define __NR_mq_open 271
|
|
+#define __NR_mq_unlink 272
|
|
+#define __NR_mq_timedsend 273
|
|
+#define __NR_mq_timedreceive 274
|
|
+#define __NR_mq_notify 275
|
|
+#define __NR_mq_getsetattr 276
|
|
+#define __NR_waitid 277
|
|
+#define __NR_vserver 278
|
|
+#define __NR_add_key 279
|
|
+#define __NR_request_key 280
|
|
+#define __NR_keyctl 281
|
|
+#define __NR_ioprio_set 282
|
|
+#define __NR_ioprio_get 283
|
|
+#define __NR_inotify_init 284
|
|
+#define __NR_inotify_add_watch 285
|
|
+#define __NR_inotify_rm_watch 286
|
|
+#define __NR_migrate_pages 287
|
|
+#define __NR_openat 288
|
|
+#define __NR_mkdirat 289
|
|
+#define __NR_mknodat 290
|
|
+#define __NR_fchownat 291
|
|
+#define __NR_futimesat 292
|
|
+#define __NR_fstatat64 293
|
|
+#define __NR_unlinkat 294
|
|
+#define __NR_renameat 295
|
|
+#define __NR_linkat 296
|
|
+#define __NR_symlinkat 297
|
|
+#define __NR_readlinkat 298
|
|
+#define __NR_fchmodat 299
|
|
+#define __NR_faccessat 300
|
|
+#define __NR_pselect6 301
|
|
+#define __NR_ppoll 302
|
|
+#define __NR_unshare 303
|
|
+#define __NR_set_robust_list 304
|
|
+#define __NR_get_robust_list 305
|
|
+#define __NR_splice 306
|
|
+#define __NR_sync_file_range 307
|
|
+#define __NR_tee 308
|
|
+#define __NR_vmsplice 309
|
|
+#define __NR_move_pages 310
|
|
+#define __NR_sched_setaffinity 311
|
|
+#define __NR_sched_getaffinity 312
|
|
+#define __NR_kexec_load 313
|
|
+#define __NR_getcpu 314
|
|
+#define __NR_epoll_pwait 315
|
|
+#define __NR_utimensat 316
|
|
+#define __NR_signalfd 317
|
|
+#define __NR_timerfd_create 318
|
|
+#define __NR_eventfd 319
|
|
+#define __NR_fallocate 320
|
|
+#define __NR_timerfd_settime 321
|
|
+#define __NR_timerfd_gettime 322
|
|
+#define __NR_signalfd4 323
|
|
+#define __NR_eventfd2 324
|
|
+#define __NR_epoll_create1 325
|
|
+#define __NR_dup3 326
|
|
+#define __NR_pipe2 327
|
|
+#define __NR_inotify_init1 328
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#define NR_syscalls 329
|
|
+
|
|
+#define __ARCH_WANT_IPC_PARSE_VERSION
|
|
+#define __ARCH_WANT_OLD_READDIR
|
|
+#define __ARCH_WANT_OLD_STAT
|
|
+#define __ARCH_WANT_STAT64
|
|
+#define __ARCH_WANT_SYS_ALARM
|
|
+#define __ARCH_WANT_SYS_GETHOSTNAME
|
|
+#define __ARCH_WANT_SYS_PAUSE
|
|
+#define __ARCH_WANT_SYS_SGETMASK
|
|
+#define __ARCH_WANT_SYS_SIGNAL
|
|
+#define __ARCH_WANT_SYS_TIME
|
|
+#define __ARCH_WANT_SYS_UTIME
|
|
+#define __ARCH_WANT_SYS_WAITPID
|
|
+#define __ARCH_WANT_SYS_SOCKETCALL
|
|
+#define __ARCH_WANT_SYS_FADVISE64
|
|
+#define __ARCH_WANT_SYS_GETPGRP
|
|
+#define __ARCH_WANT_SYS_LLSEEK
|
|
+#define __ARCH_WANT_SYS_NICE
|
|
+#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
|
+#define __ARCH_WANT_SYS_OLDUMOUNT
|
|
+#define __ARCH_WANT_SYS_SIGPENDING
|
|
+#define __ARCH_WANT_SYS_SIGPROCMASK
|
|
+#define __ARCH_WANT_SYS_RT_SIGACTION
|
|
+
|
|
+/*
|
|
+ * "Conditional" syscalls
|
|
+ *
|
|
+ * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
|
|
+ * but it doesn't work on all toolchains, so we just do it by hand
|
|
+ */
|
|
+#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+#endif /* _ASM_M68K_UNISTD_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68k/include/asm/unistd_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd_no.h
|
|
--- linux-2.6.29.owrt/arch/m68k/include/asm/unistd_no.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd_no.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,372 @@
|
|
+#ifndef _ASM_M68K_UNISTD_H_
|
|
+#define _ASM_M68K_UNISTD_H_
|
|
+
|
|
+/*
|
|
+ * This file contains the system call numbers.
|
|
+ */
|
|
+
|
|
+#define __NR_restart_syscall 0
|
|
+#define __NR_exit 1
|
|
+#define __NR_fork 2
|
|
+#define __NR_read 3
|
|
+#define __NR_write 4
|
|
+#define __NR_open 5
|
|
+#define __NR_close 6
|
|
+#define __NR_waitpid 7
|
|
+#define __NR_creat 8
|
|
+#define __NR_link 9
|
|
+#define __NR_unlink 10
|
|
+#define __NR_execve 11
|
|
+#define __NR_chdir 12
|
|
+#define __NR_time 13
|
|
+#define __NR_mknod 14
|
|
+#define __NR_chmod 15
|
|
+#define __NR_chown 16
|
|
+#define __NR_break 17
|
|
+#define __NR_oldstat 18
|
|
+#define __NR_lseek 19
|
|
+#define __NR_getpid 20
|
|
+#define __NR_mount 21
|
|
+#define __NR_umount 22
|
|
+#define __NR_setuid 23
|
|
+#define __NR_getuid 24
|
|
+#define __NR_stime 25
|
|
+#define __NR_ptrace 26
|
|
+#define __NR_alarm 27
|
|
+#define __NR_oldfstat 28
|
|
+#define __NR_pause 29
|
|
+#define __NR_utime 30
|
|
+#define __NR_stty 31
|
|
+#define __NR_gtty 32
|
|
+#define __NR_access 33
|
|
+#define __NR_nice 34
|
|
+#define __NR_ftime 35
|
|
+#define __NR_sync 36
|
|
+#define __NR_kill 37
|
|
+#define __NR_rename 38
|
|
+#define __NR_mkdir 39
|
|
+#define __NR_rmdir 40
|
|
+#define __NR_dup 41
|
|
+#define __NR_pipe 42
|
|
+#define __NR_times 43
|
|
+#define __NR_prof 44
|
|
+#define __NR_brk 45
|
|
+#define __NR_setgid 46
|
|
+#define __NR_getgid 47
|
|
+#define __NR_signal 48
|
|
+#define __NR_geteuid 49
|
|
+#define __NR_getegid 50
|
|
+#define __NR_acct 51
|
|
+#define __NR_umount2 52
|
|
+#define __NR_lock 53
|
|
+#define __NR_ioctl 54
|
|
+#define __NR_fcntl 55
|
|
+#define __NR_mpx 56
|
|
+#define __NR_setpgid 57
|
|
+#define __NR_ulimit 58
|
|
+#define __NR_oldolduname 59
|
|
+#define __NR_umask 60
|
|
+#define __NR_chroot 61
|
|
+#define __NR_ustat 62
|
|
+#define __NR_dup2 63
|
|
+#define __NR_getppid 64
|
|
+#define __NR_getpgrp 65
|
|
+#define __NR_setsid 66
|
|
+#define __NR_sigaction 67
|
|
+#define __NR_sgetmask 68
|
|
+#define __NR_ssetmask 69
|
|
+#define __NR_setreuid 70
|
|
+#define __NR_setregid 71
|
|
+#define __NR_sigsuspend 72
|
|
+#define __NR_sigpending 73
|
|
+#define __NR_sethostname 74
|
|
+#define __NR_setrlimit 75
|
|
+#define __NR_getrlimit 76
|
|
+#define __NR_getrusage 77
|
|
+#define __NR_gettimeofday 78
|
|
+#define __NR_settimeofday 79
|
|
+#define __NR_getgroups 80
|
|
+#define __NR_setgroups 81
|
|
+#define __NR_select 82
|
|
+#define __NR_symlink 83
|
|
+#define __NR_oldlstat 84
|
|
+#define __NR_readlink 85
|
|
+#define __NR_uselib 86
|
|
+#define __NR_swapon 87
|
|
+#define __NR_reboot 88
|
|
+#define __NR_readdir 89
|
|
+#define __NR_mmap 90
|
|
+#define __NR_munmap 91
|
|
+#define __NR_truncate 92
|
|
+#define __NR_ftruncate 93
|
|
+#define __NR_fchmod 94
|
|
+#define __NR_fchown 95
|
|
+#define __NR_getpriority 96
|
|
+#define __NR_setpriority 97
|
|
+#define __NR_profil 98
|
|
+#define __NR_statfs 99
|
|
+#define __NR_fstatfs 100
|
|
+#define __NR_ioperm 101
|
|
+#define __NR_socketcall 102
|
|
+#define __NR_syslog 103
|
|
+#define __NR_setitimer 104
|
|
+#define __NR_getitimer 105
|
|
+#define __NR_stat 106
|
|
+#define __NR_lstat 107
|
|
+#define __NR_fstat 108
|
|
+#define __NR_olduname 109
|
|
+#define __NR_iopl /* 110 */ not supported
|
|
+#define __NR_vhangup 111
|
|
+#define __NR_idle /* 112 */ Obsolete
|
|
+#define __NR_vm86 /* 113 */ not supported
|
|
+#define __NR_wait4 114
|
|
+#define __NR_swapoff 115
|
|
+#define __NR_sysinfo 116
|
|
+#define __NR_ipc 117
|
|
+#define __NR_fsync 118
|
|
+#define __NR_sigreturn 119
|
|
+#define __NR_clone 120
|
|
+#define __NR_setdomainname 121
|
|
+#define __NR_uname 122
|
|
+#define __NR_cacheflush 123
|
|
+#define __NR_adjtimex 124
|
|
+#define __NR_mprotect 125
|
|
+#define __NR_sigprocmask 126
|
|
+#define __NR_create_module 127
|
|
+#define __NR_init_module 128
|
|
+#define __NR_delete_module 129
|
|
+#define __NR_get_kernel_syms 130
|
|
+#define __NR_quotactl 131
|
|
+#define __NR_getpgid 132
|
|
+#define __NR_fchdir 133
|
|
+#define __NR_bdflush 134
|
|
+#define __NR_sysfs 135
|
|
+#define __NR_personality 136
|
|
+#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
|
|
+#define __NR_setfsuid 138
|
|
+#define __NR_setfsgid 139
|
|
+#define __NR__llseek 140
|
|
+#define __NR_getdents 141
|
|
+#define __NR__newselect 142
|
|
+#define __NR_flock 143
|
|
+#define __NR_msync 144
|
|
+#define __NR_readv 145
|
|
+#define __NR_writev 146
|
|
+#define __NR_getsid 147
|
|
+#define __NR_fdatasync 148
|
|
+#define __NR__sysctl 149
|
|
+#define __NR_mlock 150
|
|
+#define __NR_munlock 151
|
|
+#define __NR_mlockall 152
|
|
+#define __NR_munlockall 153
|
|
+#define __NR_sched_setparam 154
|
|
+#define __NR_sched_getparam 155
|
|
+#define __NR_sched_setscheduler 156
|
|
+#define __NR_sched_getscheduler 157
|
|
+#define __NR_sched_yield 158
|
|
+#define __NR_sched_get_priority_max 159
|
|
+#define __NR_sched_get_priority_min 160
|
|
+#define __NR_sched_rr_get_interval 161
|
|
+#define __NR_nanosleep 162
|
|
+#define __NR_mremap 163
|
|
+#define __NR_setresuid 164
|
|
+#define __NR_getresuid 165
|
|
+#define __NR_getpagesize 166
|
|
+#define __NR_query_module 167
|
|
+#define __NR_poll 168
|
|
+#define __NR_nfsservctl 169
|
|
+#define __NR_setresgid 170
|
|
+#define __NR_getresgid 171
|
|
+#define __NR_prctl 172
|
|
+#define __NR_rt_sigreturn 173
|
|
+#define __NR_rt_sigaction 174
|
|
+#define __NR_rt_sigprocmask 175
|
|
+#define __NR_rt_sigpending 176
|
|
+#define __NR_rt_sigtimedwait 177
|
|
+#define __NR_rt_sigqueueinfo 178
|
|
+#define __NR_rt_sigsuspend 179
|
|
+#define __NR_pread64 180
|
|
+#define __NR_pwrite64 181
|
|
+#define __NR_lchown 182
|
|
+#define __NR_getcwd 183
|
|
+#define __NR_capget 184
|
|
+#define __NR_capset 185
|
|
+#define __NR_sigaltstack 186
|
|
+#define __NR_sendfile 187
|
|
+#define __NR_getpmsg 188 /* some people actually want streams */
|
|
+#define __NR_putpmsg 189 /* some people actually want streams */
|
|
+#define __NR_vfork 190
|
|
+#define __NR_ugetrlimit 191
|
|
+#define __NR_mmap2 192
|
|
+#define __NR_truncate64 193
|
|
+#define __NR_ftruncate64 194
|
|
+#define __NR_stat64 195
|
|
+#define __NR_lstat64 196
|
|
+#define __NR_fstat64 197
|
|
+#define __NR_chown32 198
|
|
+#define __NR_getuid32 199
|
|
+#define __NR_getgid32 200
|
|
+#define __NR_geteuid32 201
|
|
+#define __NR_getegid32 202
|
|
+#define __NR_setreuid32 203
|
|
+#define __NR_setregid32 204
|
|
+#define __NR_getgroups32 205
|
|
+#define __NR_setgroups32 206
|
|
+#define __NR_fchown32 207
|
|
+#define __NR_setresuid32 208
|
|
+#define __NR_getresuid32 209
|
|
+#define __NR_setresgid32 210
|
|
+#define __NR_getresgid32 211
|
|
+#define __NR_lchown32 212
|
|
+#define __NR_setuid32 213
|
|
+#define __NR_setgid32 214
|
|
+#define __NR_setfsuid32 215
|
|
+#define __NR_setfsgid32 216
|
|
+#define __NR_pivot_root 217
|
|
+#define __NR_getdents64 220
|
|
+#define __NR_gettid 221
|
|
+#define __NR_tkill 222
|
|
+#define __NR_setxattr 223
|
|
+#define __NR_lsetxattr 224
|
|
+#define __NR_fsetxattr 225
|
|
+#define __NR_getxattr 226
|
|
+#define __NR_lgetxattr 227
|
|
+#define __NR_fgetxattr 228
|
|
+#define __NR_listxattr 229
|
|
+#define __NR_llistxattr 230
|
|
+#define __NR_flistxattr 231
|
|
+#define __NR_removexattr 232
|
|
+#define __NR_lremovexattr 233
|
|
+#define __NR_fremovexattr 234
|
|
+#define __NR_futex 235
|
|
+#define __NR_sendfile64 236
|
|
+#define __NR_mincore 237
|
|
+#define __NR_madvise 238
|
|
+#define __NR_fcntl64 239
|
|
+#define __NR_readahead 240
|
|
+#define __NR_io_setup 241
|
|
+#define __NR_io_destroy 242
|
|
+#define __NR_io_getevents 243
|
|
+#define __NR_io_submit 244
|
|
+#define __NR_io_cancel 245
|
|
+#define __NR_fadvise64 246
|
|
+#define __NR_exit_group 247
|
|
+#define __NR_lookup_dcookie 248
|
|
+#define __NR_epoll_create 249
|
|
+#define __NR_epoll_ctl 250
|
|
+#define __NR_epoll_wait 251
|
|
+#define __NR_remap_file_pages 252
|
|
+#define __NR_set_tid_address 253
|
|
+#define __NR_timer_create 254
|
|
+#define __NR_timer_settime 255
|
|
+#define __NR_timer_gettime 256
|
|
+#define __NR_timer_getoverrun 257
|
|
+#define __NR_timer_delete 258
|
|
+#define __NR_clock_settime 259
|
|
+#define __NR_clock_gettime 260
|
|
+#define __NR_clock_getres 261
|
|
+#define __NR_clock_nanosleep 262
|
|
+#define __NR_statfs64 263
|
|
+#define __NR_fstatfs64 264
|
|
+#define __NR_tgkill 265
|
|
+#define __NR_utimes 266
|
|
+#define __NR_fadvise64_64 267
|
|
+#define __NR_mbind 268
|
|
+#define __NR_get_mempolicy 269
|
|
+#define __NR_set_mempolicy 270
|
|
+#define __NR_mq_open 271
|
|
+#define __NR_mq_unlink 272
|
|
+#define __NR_mq_timedsend 273
|
|
+#define __NR_mq_timedreceive 274
|
|
+#define __NR_mq_notify 275
|
|
+#define __NR_mq_getsetattr 276
|
|
+#define __NR_waitid 277
|
|
+#define __NR_vserver 278
|
|
+#define __NR_add_key 279
|
|
+#define __NR_request_key 280
|
|
+#define __NR_keyctl 281
|
|
+#define __NR_ioprio_set 282
|
|
+#define __NR_ioprio_get 283
|
|
+#define __NR_inotify_init 284
|
|
+#define __NR_inotify_add_watch 285
|
|
+#define __NR_inotify_rm_watch 286
|
|
+#define __NR_migrate_pages 287
|
|
+#define __NR_openat 288
|
|
+#define __NR_mkdirat 289
|
|
+#define __NR_mknodat 290
|
|
+#define __NR_fchownat 291
|
|
+#define __NR_futimesat 292
|
|
+#define __NR_fstatat64 293
|
|
+#define __NR_unlinkat 294
|
|
+#define __NR_renameat 295
|
|
+#define __NR_linkat 296
|
|
+#define __NR_symlinkat 297
|
|
+#define __NR_readlinkat 298
|
|
+#define __NR_fchmodat 299
|
|
+#define __NR_faccessat 300
|
|
+#define __NR_pselect6 301
|
|
+#define __NR_ppoll 302
|
|
+#define __NR_unshare 303
|
|
+#define __NR_set_robust_list 304
|
|
+#define __NR_get_robust_list 305
|
|
+#define __NR_splice 306
|
|
+#define __NR_sync_file_range 307
|
|
+#define __NR_tee 308
|
|
+#define __NR_vmsplice 309
|
|
+#define __NR_move_pages 310
|
|
+#define __NR_sched_setaffinity 311
|
|
+#define __NR_sched_getaffinity 312
|
|
+#define __NR_kexec_load 313
|
|
+#define __NR_getcpu 314
|
|
+#define __NR_epoll_pwait 315
|
|
+#define __NR_utimensat 316
|
|
+#define __NR_signalfd 317
|
|
+#define __NR_timerfd_create 318
|
|
+#define __NR_eventfd 319
|
|
+#define __NR_fallocate 320
|
|
+#define __NR_timerfd_settime 321
|
|
+#define __NR_timerfd_gettime 322
|
|
+#define __NR_signalfd4 323
|
|
+#define __NR_eventfd2 324
|
|
+#define __NR_epoll_create1 325
|
|
+#define __NR_dup3 326
|
|
+#define __NR_pipe2 327
|
|
+#define __NR_inotify_init1 328
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+
|
|
+#define NR_syscalls 329
|
|
+
|
|
+#define __ARCH_WANT_IPC_PARSE_VERSION
|
|
+#define __ARCH_WANT_OLD_READDIR
|
|
+#define __ARCH_WANT_OLD_STAT
|
|
+#define __ARCH_WANT_STAT64
|
|
+#define __ARCH_WANT_SYS_ALARM
|
|
+#define __ARCH_WANT_SYS_GETHOSTNAME
|
|
+#define __ARCH_WANT_SYS_PAUSE
|
|
+#define __ARCH_WANT_SYS_SGETMASK
|
|
+#define __ARCH_WANT_SYS_SIGNAL
|
|
+#define __ARCH_WANT_SYS_TIME
|
|
+#define __ARCH_WANT_SYS_UTIME
|
|
+#define __ARCH_WANT_SYS_WAITPID
|
|
+#define __ARCH_WANT_SYS_SOCKETCALL
|
|
+#define __ARCH_WANT_SYS_FADVISE64
|
|
+#define __ARCH_WANT_SYS_GETPGRP
|
|
+#define __ARCH_WANT_SYS_LLSEEK
|
|
+#define __ARCH_WANT_SYS_NICE
|
|
+#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
|
+#define __ARCH_WANT_SYS_OLDUMOUNT
|
|
+#define __ARCH_WANT_SYS_SIGPENDING
|
|
+#define __ARCH_WANT_SYS_SIGPROCMASK
|
|
+#define __ARCH_WANT_SYS_RT_SIGACTION
|
|
+
|
|
+/*
|
|
+ * "Conditional" syscalls
|
|
+ *
|
|
+ * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
|
|
+ * but it doesn't work on all toolchains, so we just do it by hand
|
|
+ */
|
|
+#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
|
|
+
|
|
+#endif /* __KERNEL__ */
|
|
+#endif /* _ASM_M68K_UNISTD_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68knommu/platform/5206e/config.c linux-2.6.29-rc3.owrt/arch/m68knommu/platform/5206e/config.c
|
|
--- linux-2.6.29.owrt/arch/m68knommu/platform/5206e/config.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68knommu/platform/5206e/config.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -17,7 +17,6 @@
|
|
#include <asm/coldfire.h>
|
|
#include <asm/mcfsim.h>
|
|
#include <asm/mcfdma.h>
|
|
-#include <asm/mcfuart.h>
|
|
|
|
/***************************************************************************/
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/m68knommu/platform/528x/config.c linux-2.6.29-rc3.owrt/arch/m68knommu/platform/528x/config.c
|
|
--- linux-2.6.29.owrt/arch/m68knommu/platform/528x/config.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/m68knommu/platform/528x/config.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -24,6 +24,7 @@
|
|
#include <asm/coldfire.h>
|
|
#include <asm/mcfsim.h>
|
|
#include <asm/mcfuart.h>
|
|
+#include <asm/mcfqspi.h>
|
|
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
#include <linux/mtd/partitions.h>
|
|
@@ -32,6 +33,233 @@
|
|
/***************************************************************************/
|
|
|
|
void coldfire_reset(void);
|
|
+static void coldfire_qspi_cs_control(u8 cs, u8 command);
|
|
+
|
|
+/***************************************************************************/
|
|
+
|
|
+#if defined(CONFIG_SPI)
|
|
+
|
|
+#if defined(CONFIG_WILDFIRE)
|
|
+#define SPI_NUM_CHIPSELECTS 0x02
|
|
+#define SPI_PAR_VAL 0x07 /* Enable DIN, DOUT, CLK */
|
|
+#define SPI_CS_MASK 0x18
|
|
+
|
|
+#define FLASH_BLOCKSIZE (1024*64)
|
|
+#define FLASH_NUMBLOCKS 16
|
|
+#define FLASH_TYPE "m25p80"
|
|
+
|
|
+#define M25P80_CS 0
|
|
+#define MMC_CS 1
|
|
+
|
|
+#ifdef CONFIG_MTD_PARTITIONS
|
|
+static struct mtd_partition stm25p_partitions[] = {
|
|
+ /* sflash */
|
|
+ [0] = {
|
|
+ .name = "stm25p80",
|
|
+ .offset = 0x00000000,
|
|
+ .size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS,
|
|
+ .mask_flags = 0
|
|
+ }
|
|
+};
|
|
+
|
|
+#endif
|
|
+
|
|
+#elif defined(CONFIG_WILDFIREMOD)
|
|
+
|
|
+#define SPI_NUM_CHIPSELECTS 0x08
|
|
+#define SPI_PAR_VAL 0x07 /* Enable DIN, DOUT, CLK */
|
|
+#define SPI_CS_MASK 0x78
|
|
+
|
|
+#define FLASH_BLOCKSIZE (1024*64)
|
|
+#define FLASH_NUMBLOCKS 64
|
|
+#define FLASH_TYPE "m25p32"
|
|
+/* Reserve 1M for the kernel parition */
|
|
+#define FLASH_KERNEL_SIZE (1024 * 1024)
|
|
+
|
|
+#define M25P80_CS 5
|
|
+#define MMC_CS 6
|
|
+
|
|
+#ifdef CONFIG_MTD_PARTITIONS
|
|
+static struct mtd_partition stm25p_partitions[] = {
|
|
+ /* sflash */
|
|
+ [0] = {
|
|
+ .name = "kernel",
|
|
+ .offset = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS - FLASH_KERNEL_SIZE,
|
|
+ .size = FLASH_KERNEL_SIZE,
|
|
+ .mask_flags = 0
|
|
+ },
|
|
+ [1] = {
|
|
+ .name = "image",
|
|
+ .offset = 0x00000000,
|
|
+ .size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS - FLASH_KERNEL_SIZE,
|
|
+ .mask_flags = 0
|
|
+ },
|
|
+ [2] = {
|
|
+ .name = "all",
|
|
+ .offset = 0x00000000,
|
|
+ .size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS,
|
|
+ .mask_flags = 0
|
|
+ }
|
|
+};
|
|
+#endif
|
|
+
|
|
+#else
|
|
+#define SPI_NUM_CHIPSELECTS 0x04
|
|
+#define SPI_PAR_VAL 0x7F /* Enable DIN, DOUT, CLK, CS0 - CS4 */
|
|
+#endif
|
|
+
|
|
+#ifdef MMC_CS
|
|
+static struct coldfire_spi_chip flash_chip_info = {
|
|
+ .mode = SPI_MODE_0,
|
|
+ .bits_per_word = 16,
|
|
+ .del_cs_to_clk = 17,
|
|
+ .del_after_trans = 1,
|
|
+ .void_write_data = 0
|
|
+};
|
|
+
|
|
+static struct coldfire_spi_chip mmc_chip_info = {
|
|
+ .mode = SPI_MODE_0,
|
|
+ .bits_per_word = 16,
|
|
+ .del_cs_to_clk = 17,
|
|
+ .del_after_trans = 1,
|
|
+ .void_write_data = 0xFFFF
|
|
+};
|
|
+#endif
|
|
+
|
|
+#ifdef M25P80_CS
|
|
+static struct flash_platform_data stm25p80_platform_data = {
|
|
+ .name = "ST M25P80 SPI Flash chip",
|
|
+#ifdef CONFIG_MTD_PARTITIONS
|
|
+ .parts = stm25p_partitions,
|
|
+ .nr_parts = sizeof(stm25p_partitions) / sizeof(*stm25p_partitions),
|
|
+#endif
|
|
+ .type = FLASH_TYPE
|
|
+};
|
|
+#endif
|
|
+
|
|
+static struct spi_board_info spi_board_info[] __initdata = {
|
|
+#ifdef M25P80_CS
|
|
+ {
|
|
+ .modalias = "m25p80",
|
|
+ .max_speed_hz = 16000000,
|
|
+ .bus_num = 1,
|
|
+ .chip_select = M25P80_CS,
|
|
+ .platform_data = &stm25p80_platform_data,
|
|
+ .controller_data = &flash_chip_info
|
|
+ },
|
|
+#endif
|
|
+#ifdef MMC_CS
|
|
+ {
|
|
+ .modalias = "mmc_spi",
|
|
+ .max_speed_hz = 16000000,
|
|
+ .bus_num = 1,
|
|
+ .chip_select = MMC_CS,
|
|
+ .controller_data = &mmc_chip_info
|
|
+ }
|
|
+#endif
|
|
+};
|
|
+
|
|
+static struct coldfire_spi_master coldfire_master_info = {
|
|
+ .bus_num = 1,
|
|
+ .num_chipselect = SPI_NUM_CHIPSELECTS,
|
|
+ .irq_source = MCF5282_QSPI_IRQ_SOURCE,
|
|
+ .irq_vector = MCF5282_QSPI_IRQ_VECTOR,
|
|
+ .irq_mask = ((0x01 << MCF5282_QSPI_IRQ_SOURCE) | 0x01),
|
|
+ .irq_lp = 0x2B, /* Level 5 and Priority 3 */
|
|
+ .par_val = SPI_PAR_VAL,
|
|
+ .cs_control = coldfire_qspi_cs_control,
|
|
+};
|
|
+
|
|
+static struct resource coldfire_spi_resources[] = {
|
|
+ [0] = {
|
|
+ .name = "qspi-par",
|
|
+ .start = MCF5282_QSPI_PAR,
|
|
+ .end = MCF5282_QSPI_PAR,
|
|
+ .flags = IORESOURCE_MEM
|
|
+ },
|
|
+
|
|
+ [1] = {
|
|
+ .name = "qspi-module",
|
|
+ .start = MCF5282_QSPI_QMR,
|
|
+ .end = MCF5282_QSPI_QMR + 0x18,
|
|
+ .flags = IORESOURCE_MEM
|
|
+ },
|
|
+
|
|
+ [2] = {
|
|
+ .name = "qspi-int-level",
|
|
+ .start = MCF5282_INTC0 + MCFINTC_ICR0 + MCF5282_QSPI_IRQ_SOURCE,
|
|
+ .end = MCF5282_INTC0 + MCFINTC_ICR0 + MCF5282_QSPI_IRQ_SOURCE,
|
|
+ .flags = IORESOURCE_MEM
|
|
+ },
|
|
+
|
|
+ [3] = {
|
|
+ .name = "qspi-int-mask",
|
|
+ .start = MCF5282_INTC0 + MCFINTC_IMRL,
|
|
+ .end = MCF5282_INTC0 + MCFINTC_IMRL,
|
|
+ .flags = IORESOURCE_MEM
|
|
+ }
|
|
+};
|
|
+
|
|
+static struct platform_device coldfire_spi = {
|
|
+ .name = "spi_coldfire",
|
|
+ .id = -1,
|
|
+ .resource = coldfire_spi_resources,
|
|
+ .num_resources = ARRAY_SIZE(coldfire_spi_resources),
|
|
+ .dev = {
|
|
+ .platform_data = &coldfire_master_info,
|
|
+ }
|
|
+};
|
|
+
|
|
+static void coldfire_qspi_cs_control(u8 cs, u8 command)
|
|
+{
|
|
+ u8 cs_bit = ((0x01 << cs) << 3) & SPI_CS_MASK;
|
|
+
|
|
+#if defined(CONFIG_WILDFIRE)
|
|
+ u8 cs_mask = ~(((0x01 << cs) << 3) & SPI_CS_MASK);
|
|
+#endif
|
|
+#if defined(CONFIG_WILDFIREMOD)
|
|
+ u8 cs_mask = (cs << 3) & SPI_CS_MASK;
|
|
+#endif
|
|
+
|
|
+ /*
|
|
+ * Don't do anything if the chip select is not
|
|
+ * one of the port qs pins.
|
|
+ */
|
|
+ if (command & QSPI_CS_INIT) {
|
|
+#if defined(CONFIG_WILDFIRE)
|
|
+ MCF5282_GPIO_DDRQS |= cs_bit;
|
|
+ MCF5282_GPIO_PQSPAR &= ~cs_bit;
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_WILDFIREMOD)
|
|
+ MCF5282_GPIO_DDRQS |= SPI_CS_MASK;
|
|
+ MCF5282_GPIO_PQSPAR &= ~SPI_CS_MASK;
|
|
+#endif
|
|
+ }
|
|
+
|
|
+ if (command & QSPI_CS_ASSERT) {
|
|
+ MCF5282_GPIO_PORTQS &= ~SPI_CS_MASK;
|
|
+ MCF5282_GPIO_PORTQS |= cs_mask;
|
|
+ } else if (command & QSPI_CS_DROP) {
|
|
+ MCF5282_GPIO_PORTQS |= SPI_CS_MASK;
|
|
+ }
|
|
+}
|
|
+
|
|
+static int __init spi_dev_init(void)
|
|
+{
|
|
+ int retval;
|
|
+
|
|
+ retval = platform_device_register(&coldfire_spi);
|
|
+ if (retval < 0)
|
|
+ return retval;
|
|
+
|
|
+ if (ARRAY_SIZE(spi_board_info))
|
|
+ retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
|
|
+
|
|
+ return retval;
|
|
+}
|
|
+
|
|
+#endif /* CONFIG_SPI */
|
|
|
|
/***************************************************************************/
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/alchemy/common/time.c linux-2.6.29-rc3.owrt/arch/mips/alchemy/common/time.c
|
|
--- linux-2.6.29.owrt/arch/mips/alchemy/common/time.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/alchemy/common/time.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -89,7 +89,7 @@
|
|
.irq = AU1000_RTC_MATCH2_INT,
|
|
.set_next_event = au1x_rtcmatch2_set_next_event,
|
|
.set_mode = au1x_rtcmatch2_set_mode,
|
|
- .cpumask = CPU_MASK_ALL_PTR,
|
|
+ .cpumask = CPU_MASK_ALL,
|
|
};
|
|
|
|
static struct irqaction au1x_rtcmatch2_irqaction = {
|
|
@@ -118,7 +118,7 @@
|
|
* setup counter 1 (RTC) to tick at full speed
|
|
*/
|
|
t = 0xffffff;
|
|
- while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T1S) && --t)
|
|
+ while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T1S) && t--)
|
|
asm volatile ("nop");
|
|
if (!t)
|
|
goto cntr_err;
|
|
@@ -127,7 +127,7 @@
|
|
au_sync();
|
|
|
|
t = 0xffffff;
|
|
- while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S) && --t)
|
|
+ while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S) && t--)
|
|
asm volatile ("nop");
|
|
if (!t)
|
|
goto cntr_err;
|
|
@@ -135,7 +135,7 @@
|
|
au_sync();
|
|
|
|
t = 0xffffff;
|
|
- while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S) && --t)
|
|
+ while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S) && t--)
|
|
asm volatile ("nop");
|
|
if (!t)
|
|
goto cntr_err;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/cavium-octeon/setup.c linux-2.6.29-rc3.owrt/arch/mips/cavium-octeon/setup.c
|
|
--- linux-2.6.29.owrt/arch/mips/cavium-octeon/setup.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/cavium-octeon/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -15,11 +15,13 @@
|
|
#include <linux/serial.h>
|
|
#include <linux/types.h>
|
|
#include <linux/string.h> /* for memset */
|
|
+#include <linux/serial.h>
|
|
#include <linux/tty.h>
|
|
#include <linux/time.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/serial_core.h>
|
|
#include <linux/serial_8250.h>
|
|
+#include <linux/string.h>
|
|
|
|
#include <asm/processor.h>
|
|
#include <asm/reboot.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/emma/Kconfig linux-2.6.29-rc3.owrt/arch/mips/emma/Kconfig
|
|
--- linux-2.6.29.owrt/arch/mips/emma/Kconfig 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/emma/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,29 @@
|
|
+choice
|
|
+ prompt "Machine type"
|
|
+ depends on MACH_EMMA
|
|
+ default NEC_MARKEINS
|
|
+
|
|
+config NEC_MARKEINS
|
|
+ bool "NEC EMMA2RH Mark-eins board"
|
|
+ select SOC_EMMA2RH
|
|
+ select HW_HAS_PCI
|
|
+ help
|
|
+ This enables support for the NEC Electronics Mark-eins boards.
|
|
+
|
|
+endchoice
|
|
+
|
|
+config SOC_EMMA2RH
|
|
+ bool
|
|
+ select SOC_EMMA
|
|
+ select SYS_HAS_CPU_R5500
|
|
+ select SYS_SUPPORTS_32BIT_KERNEL
|
|
+ select SYS_SUPPORTS_64BIT_KERNEL
|
|
+
|
|
+config SOC_EMMA
|
|
+ bool
|
|
+ select CEVT_R4K
|
|
+ select CSRC_R4K
|
|
+ select DMA_NONCOHERENT
|
|
+ select IRQ_CPU
|
|
+ select SWAP_IO_SPACE
|
|
+ select SYS_SUPPORTS_BIG_ENDIAN
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/emma/markeins/platform.c linux-2.6.29-rc3.owrt/arch/mips/emma/markeins/platform.c
|
|
--- linux-2.6.29.owrt/arch/mips/emma/markeins/platform.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/emma/markeins/platform.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -141,6 +141,13 @@
|
|
},
|
|
};
|
|
|
|
+static struct platform_device *devices[] = {
|
|
+ &i2c_emma_devices[0],
|
|
+ &i2c_emma_devices[1],
|
|
+ &i2c_emma_devices[2],
|
|
+ &serial_emma,
|
|
+};
|
|
+
|
|
static struct mtd_partition markeins_parts[] = {
|
|
[0] = {
|
|
.name = "RootFS",
|
|
@@ -174,39 +181,11 @@
|
|
},
|
|
};
|
|
|
|
-static struct physmap_flash_data markeins_flash_data = {
|
|
- .width = 2,
|
|
- .nr_parts = ARRAY_SIZE(markeins_parts),
|
|
- .parts = markeins_parts
|
|
-};
|
|
-
|
|
-static struct resource markeins_flash_resource = {
|
|
- .start = 0x1e000000,
|
|
- .end = 0x02000000,
|
|
- .flags = IORESOURCE_MEM
|
|
-};
|
|
-
|
|
-static struct platform_device markeins_flash_device = {
|
|
- .name = "physmap-flash",
|
|
- .id = 0,
|
|
- .dev = {
|
|
- .platform_data = &markeins_flash_data,
|
|
- },
|
|
- .num_resources = 1,
|
|
- .resource = &markeins_flash_resource,
|
|
-};
|
|
-
|
|
-static struct platform_device *devices[] = {
|
|
- i2c_emma_devices,
|
|
- i2c_emma_devices + 1,
|
|
- i2c_emma_devices + 2,
|
|
- &serial_emma,
|
|
- &markeins_flash_device,
|
|
-};
|
|
-
|
|
static int __init platform_devices_setup(void)
|
|
{
|
|
+ physmap_set_partitions(markeins_parts, ARRAY_SIZE(markeins_parts));
|
|
return platform_add_devices(devices, ARRAY_SIZE(devices));
|
|
}
|
|
|
|
arch_initcall(platform_devices_setup);
|
|
+
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/atomic.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/atomic.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/atomic.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/atomic.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -50,7 +50,7 @@
|
|
static __inline__ void atomic_add(int i, atomic_t * v)
|
|
{
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -62,7 +62,7 @@
|
|
: "=&r" (temp), "=m" (v->counter)
|
|
: "Ir" (i), "m" (v->counter));
|
|
} else if (cpu_has_llsc) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -95,7 +95,7 @@
|
|
static __inline__ void atomic_sub(int i, atomic_t * v)
|
|
{
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -107,7 +107,7 @@
|
|
: "=&r" (temp), "=m" (v->counter)
|
|
: "Ir" (i), "m" (v->counter));
|
|
} else if (cpu_has_llsc) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -135,12 +135,12 @@
|
|
*/
|
|
static __inline__ int atomic_add_return(int i, atomic_t * v)
|
|
{
|
|
- int result;
|
|
+ unsigned long result;
|
|
|
|
smp_llsc_mb();
|
|
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -154,7 +154,7 @@
|
|
: "Ir" (i), "m" (v->counter)
|
|
: "memory");
|
|
} else if (cpu_has_llsc) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -187,12 +187,12 @@
|
|
|
|
static __inline__ int atomic_sub_return(int i, atomic_t * v)
|
|
{
|
|
- int result;
|
|
+ unsigned long result;
|
|
|
|
smp_llsc_mb();
|
|
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -206,7 +206,7 @@
|
|
: "Ir" (i), "m" (v->counter)
|
|
: "memory");
|
|
} else if (cpu_has_llsc) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -247,12 +247,12 @@
|
|
*/
|
|
static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)
|
|
{
|
|
- int result;
|
|
+ unsigned long result;
|
|
|
|
smp_llsc_mb();
|
|
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -270,7 +270,7 @@
|
|
: "Ir" (i), "m" (v->counter)
|
|
: "memory");
|
|
} else if (cpu_has_llsc) {
|
|
- int temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -429,7 +429,7 @@
|
|
static __inline__ void atomic64_add(long i, atomic64_t * v)
|
|
{
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -441,7 +441,7 @@
|
|
: "=&r" (temp), "=m" (v->counter)
|
|
: "Ir" (i), "m" (v->counter));
|
|
} else if (cpu_has_llsc) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -474,7 +474,7 @@
|
|
static __inline__ void atomic64_sub(long i, atomic64_t * v)
|
|
{
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -486,7 +486,7 @@
|
|
: "=&r" (temp), "=m" (v->counter)
|
|
: "Ir" (i), "m" (v->counter));
|
|
} else if (cpu_has_llsc) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -514,12 +514,12 @@
|
|
*/
|
|
static __inline__ long atomic64_add_return(long i, atomic64_t * v)
|
|
{
|
|
- long result;
|
|
+ unsigned long result;
|
|
|
|
smp_llsc_mb();
|
|
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -533,7 +533,7 @@
|
|
: "Ir" (i), "m" (v->counter)
|
|
: "memory");
|
|
} else if (cpu_has_llsc) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -566,12 +566,12 @@
|
|
|
|
static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
|
|
{
|
|
- long result;
|
|
+ unsigned long result;
|
|
|
|
smp_llsc_mb();
|
|
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -585,7 +585,7 @@
|
|
: "Ir" (i), "m" (v->counter)
|
|
: "memory");
|
|
} else if (cpu_has_llsc) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -626,12 +626,12 @@
|
|
*/
|
|
static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v)
|
|
{
|
|
- long result;
|
|
+ unsigned long result;
|
|
|
|
smp_llsc_mb();
|
|
|
|
if (cpu_has_llsc && R10000_LLSC_WAR) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
@@ -649,7 +649,7 @@
|
|
: "Ir" (i), "m" (v->counter)
|
|
: "memory");
|
|
} else if (cpu_has_llsc) {
|
|
- long temp;
|
|
+ unsigned long temp;
|
|
|
|
__asm__ __volatile__(
|
|
" .set mips3 \n"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/compat.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/compat.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/compat.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/compat.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,8 +3,6 @@
|
|
/*
|
|
* Architecture specific compatibility types
|
|
*/
|
|
-#include <linux/seccomp.h>
|
|
-#include <linux/thread_info.h>
|
|
#include <linux/types.h>
|
|
#include <asm/page.h>
|
|
#include <asm/ptrace.h>
|
|
@@ -220,9 +218,4 @@
|
|
compat_ulong_t __unused2;
|
|
};
|
|
|
|
-static inline int is_compat_task(void)
|
|
-{
|
|
- return test_thread_flag(TIF_32BIT);
|
|
-}
|
|
-
|
|
#endif /* _ASM_COMPAT_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/hazards.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/hazards.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/hazards.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/hazards.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -138,8 +138,7 @@
|
|
__instruction_hazard(); \
|
|
} while (0)
|
|
|
|
-#elif defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_CAVIUM_OCTEON) || \
|
|
- defined(CONFIG_CPU_R5500)
|
|
+#elif defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_CAVIUM_OCTEON)
|
|
|
|
/*
|
|
* R10000 rocks - all hazards handled in hardware, so this becomes a nobrainer.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/gpio.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/gpio.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/gpio.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/gpio.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -80,8 +80,11 @@
|
|
/* Compact Flash GPIO pin */
|
|
#define CF_GPIO_NUM 13
|
|
|
|
+extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned val);
|
|
+extern unsigned get_434_reg(unsigned reg_offs);
|
|
+extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask);
|
|
+extern unsigned char get_latch_u5(void);
|
|
extern void rb532_gpio_set_ilevel(int bit, unsigned gpio);
|
|
extern void rb532_gpio_set_istat(int bit, unsigned gpio);
|
|
-extern void rb532_gpio_set_func(unsigned gpio);
|
|
|
|
#endif /* _RC32434_GPIO_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/irq.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/irq.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/irq.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/irq.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,7 +30,4 @@
|
|
#define ETH0_RX_OVR_IRQ (GROUP3_IRQ_BASE + 9)
|
|
#define ETH0_TX_UND_IRQ (GROUP3_IRQ_BASE + 10)
|
|
|
|
-#define GPIO_MAPPED_IRQ_BASE GROUP4_IRQ_BASE
|
|
-#define GPIO_MAPPED_IRQ_GROUP 4
|
|
-
|
|
#endif /* __ASM_RC32434_IRQ_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/rb.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/rb.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/rb.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/rb.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -83,7 +83,4 @@
|
|
void __iomem *base;
|
|
};
|
|
|
|
-extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask);
|
|
-extern unsigned char get_latch_u5(void);
|
|
-
|
|
#endif /* __ASM_RC32434_RB_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/prefetch.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/prefetch.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/prefetch.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/prefetch.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -26,7 +26,7 @@
|
|
* Pref_WriteBackInvalidate is a nop and Pref_PrepareForStore is broken in
|
|
* current versions due to erratum G105.
|
|
*
|
|
- * VR5500 (including VR5701 and VR7701) only implement load prefetch.
|
|
+ * VR7701 only implements the Load prefetch.
|
|
*
|
|
* Finally MIPS32 and MIPS64 implement all of the following hints.
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/ptrace.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/ptrace.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/ptrace.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/ptrace.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -105,7 +105,7 @@
|
|
enum pt_watch_style style;
|
|
union {
|
|
struct mips32_watch_regs mips32;
|
|
- struct mips64_watch_regs mips64;
|
|
+ struct mips32_watch_regs mips64;
|
|
};
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/seccomp.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/seccomp.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/seccomp.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/seccomp.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,5 +1,6 @@
|
|
#ifndef __ASM_SECCOMP_H
|
|
|
|
+#include <linux/thread_info.h>
|
|
#include <linux/unistd.h>
|
|
|
|
#define __NR_seccomp_read __NR_read
|
|
@@ -15,6 +16,8 @@
|
|
*/
|
|
#ifdef CONFIG_MIPS32_O32
|
|
|
|
+#define TIF_32BIT TIF_32BIT_REGS
|
|
+
|
|
#define __NR_seccomp_read_32 4003
|
|
#define __NR_seccomp_write_32 4004
|
|
#define __NR_seccomp_exit_32 4001
|
|
@@ -22,6 +25,8 @@
|
|
|
|
#elif defined(CONFIG_MIPS32_N32)
|
|
|
|
+#define TIF_32BIT _TIF_32BIT_ADDR
|
|
+
|
|
#define __NR_seccomp_read_32 6000
|
|
#define __NR_seccomp_write_32 6001
|
|
#define __NR_seccomp_exit_32 6058
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/spinlock.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/spinlock.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/spinlock.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/spinlock.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -51,7 +51,6 @@
|
|
|
|
return (((counters >> 14) - counters) & 0x1fff) > 1;
|
|
}
|
|
-#define __raw_spin_is_contended __raw_spin_is_contended
|
|
|
|
static inline void __raw_spin_lock(raw_spinlock_t *lock)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/termios.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/termios.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/termios.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/termios.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -9,7 +9,6 @@
|
|
#ifndef _ASM_TERMIOS_H
|
|
#define _ASM_TERMIOS_H
|
|
|
|
-#include <linux/errno.h>
|
|
#include <asm/termbits.h>
|
|
#include <asm/ioctls.h>
|
|
|
|
@@ -95,81 +94,38 @@
|
|
/*
|
|
* Translate a "termio" structure into a "termios". Ugh.
|
|
*/
|
|
-static inline int user_termio_to_kernel_termios(struct ktermios *termios,
|
|
- struct termio __user *termio)
|
|
-{
|
|
- unsigned short iflag, oflag, cflag, lflag;
|
|
- unsigned int err;
|
|
-
|
|
- if (!access_ok(VERIFY_READ, termio, sizeof(struct termio)))
|
|
- return -EFAULT;
|
|
-
|
|
- err = __get_user(iflag, &termio->c_iflag);
|
|
- termios->c_iflag = (termios->c_iflag & 0xffff0000) | iflag;
|
|
- err |=__get_user(oflag, &termio->c_oflag);
|
|
- termios->c_oflag = (termios->c_oflag & 0xffff0000) | oflag;
|
|
- err |=__get_user(cflag, &termio->c_cflag);
|
|
- termios->c_cflag = (termios->c_cflag & 0xffff0000) | cflag;
|
|
- err |=__get_user(lflag, &termio->c_lflag);
|
|
- termios->c_lflag = (termios->c_lflag & 0xffff0000) | lflag;
|
|
- err |=__get_user(termios->c_line, &termio->c_line);
|
|
- if (err)
|
|
- return -EFAULT;
|
|
-
|
|
- if (__copy_from_user(termios->c_cc, termio->c_cc, NCC))
|
|
- return -EFAULT;
|
|
-
|
|
- return 0;
|
|
-}
|
|
+#define user_termio_to_kernel_termios(termios, termio) \
|
|
+({ \
|
|
+ unsigned short tmp; \
|
|
+ get_user(tmp, &(termio)->c_iflag); \
|
|
+ (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
|
|
+ get_user(tmp, &(termio)->c_oflag); \
|
|
+ (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
|
|
+ get_user(tmp, &(termio)->c_cflag); \
|
|
+ (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
|
|
+ get_user(tmp, &(termio)->c_lflag); \
|
|
+ (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
|
|
+ get_user((termios)->c_line, &(termio)->c_line); \
|
|
+ copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
|
|
+})
|
|
|
|
/*
|
|
* Translate a "termios" structure into a "termio". Ugh.
|
|
*/
|
|
-static inline int kernel_termios_to_user_termio(struct termio __user *termio,
|
|
- struct ktermios *termios)
|
|
-{
|
|
- int err;
|
|
-
|
|
- if (!access_ok(VERIFY_WRITE, termio, sizeof(struct termio)))
|
|
- return -EFAULT;
|
|
-
|
|
- err = __put_user(termios->c_iflag, &termio->c_iflag);
|
|
- err |= __put_user(termios->c_oflag, &termio->c_oflag);
|
|
- err |= __put_user(termios->c_cflag, &termio->c_cflag);
|
|
- err |= __put_user(termios->c_lflag, &termio->c_lflag);
|
|
- err |= __put_user(termios->c_line, &termio->c_line);
|
|
- if (err)
|
|
- return -EFAULT;
|
|
-
|
|
- if (__copy_to_user(termio->c_cc, termios->c_cc, NCC))
|
|
- return -EFAULT;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static inline int user_termios_to_kernel_termios(struct ktermios __user *k,
|
|
- struct termios2 *u)
|
|
-{
|
|
- return copy_from_user(k, u, sizeof(struct termios2)) ? -EFAULT : 0;
|
|
-}
|
|
-
|
|
-static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
|
|
- struct ktermios *k)
|
|
-{
|
|
- return copy_to_user(u, k, sizeof(struct termios2)) ? -EFAULT : 0;
|
|
-}
|
|
-
|
|
-static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
|
|
- struct termios __user *u)
|
|
-{
|
|
- return copy_from_user(k, u, sizeof(struct termios)) ? -EFAULT : 0;
|
|
-}
|
|
-
|
|
-static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
|
|
- struct ktermios *k)
|
|
-{
|
|
- return copy_to_user(u, k, sizeof(struct termios)) ? -EFAULT : 0;
|
|
-}
|
|
+#define kernel_termios_to_user_termio(termio, termios) \
|
|
+({ \
|
|
+ put_user((termios)->c_iflag, &(termio)->c_iflag); \
|
|
+ put_user((termios)->c_oflag, &(termio)->c_oflag); \
|
|
+ put_user((termios)->c_cflag, &(termio)->c_cflag); \
|
|
+ put_user((termios)->c_lflag, &(termio)->c_lflag); \
|
|
+ put_user((termios)->c_line, &(termio)->c_line); \
|
|
+ copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
|
|
+})
|
|
+
|
|
+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
|
|
+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
|
|
+#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
|
|
+#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
|
|
|
|
#endif /* defined(__KERNEL__) */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/thread_info.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/thread_info.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/thread_info.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/thread_info.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -127,12 +127,6 @@
|
|
#define TIF_LOAD_WATCH 25 /* If set, load watch registers */
|
|
#define TIF_SYSCALL_TRACE 31 /* syscall trace active */
|
|
|
|
-#ifdef CONFIG_MIPS32_O32
|
|
-#define TIF_32BIT TIF_32BIT_REGS
|
|
-#elif defined(CONFIG_MIPS32_N32)
|
|
-#define TIF_32BIT _TIF_32BIT_ADDR
|
|
-#endif /* CONFIG_MIPS32_O32 */
|
|
-
|
|
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
|
|
#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
|
|
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/include/asm/txx9/tx4939.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/txx9/tx4939.h
|
|
--- linux-2.6.29.owrt/arch/mips/include/asm/txx9/tx4939.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/txx9/tx4939.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -541,6 +541,5 @@
|
|
int tx4939_irq(void);
|
|
void tx4939_mtd_init(int ch);
|
|
void tx4939_ata_init(void);
|
|
-void tx4939_rtc_init(void);
|
|
|
|
#endif /* __ASM_TXX9_TX4939_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/Kconfig linux-2.6.29-rc3.owrt/arch/mips/Kconfig
|
|
--- linux-2.6.29.owrt/arch/mips/Kconfig 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -238,12 +238,8 @@
|
|
This option enables support for MIPS Technologies MIPSsim software
|
|
emulator.
|
|
|
|
-config NEC_MARKEINS
|
|
- bool "NEC EMMA2RH Mark-eins board"
|
|
- select SOC_EMMA2RH
|
|
- select HW_HAS_PCI
|
|
- help
|
|
- This enables support for the NEC Electronics Mark-eins boards.
|
|
+config MACH_EMMA
|
|
+ bool "NEC EMMA series based machines"
|
|
|
|
config MACH_VR41XX
|
|
bool "NEC VR4100 series based machines"
|
|
@@ -355,7 +351,7 @@
|
|
select ARC64
|
|
select BOOT_ELF64
|
|
select DEFAULT_SGI_PARTITION
|
|
- select DMA_COHERENT
|
|
+ select DMA_IP27
|
|
select SYS_HAS_EARLY_PRINTK
|
|
select HW_HAS_PCI
|
|
select NR_CPUS_DEFAULT_64
|
|
@@ -607,7 +603,7 @@
|
|
select SYS_SUPPORTS_64BIT_KERNEL
|
|
select SYS_SUPPORTS_BIG_ENDIAN
|
|
select SYS_SUPPORTS_HIGHMEM
|
|
- select SYS_HAS_CPU_CAVIUM_OCTEON
|
|
+ select CPU_CAVIUM_OCTEON
|
|
help
|
|
The Octeon simulator is software performance model of the Cavium
|
|
Octeon Processor. It supports simulating Octeon processors on x86
|
|
@@ -622,7 +618,7 @@
|
|
select SYS_SUPPORTS_BIG_ENDIAN
|
|
select SYS_SUPPORTS_HIGHMEM
|
|
select SYS_HAS_EARLY_PRINTK
|
|
- select SYS_HAS_CPU_CAVIUM_OCTEON
|
|
+ select CPU_CAVIUM_OCTEON
|
|
select SWAP_IO_SPACE
|
|
help
|
|
This option supports all of the Octeon reference boards from Cavium
|
|
@@ -641,6 +637,7 @@
|
|
|
|
source "arch/mips/alchemy/Kconfig"
|
|
source "arch/mips/basler/excite/Kconfig"
|
|
+source "arch/mips/emma/Kconfig"
|
|
source "arch/mips/jazz/Kconfig"
|
|
source "arch/mips/lasat/Kconfig"
|
|
source "arch/mips/pmc-sierra/Kconfig"
|
|
@@ -764,6 +761,9 @@
|
|
config DMA_COHERENT
|
|
bool
|
|
|
|
+config DMA_IP27
|
|
+ bool
|
|
+
|
|
config DMA_NONCOHERENT
|
|
bool
|
|
select DMA_NEED_PCI_MAP_STATE
|
|
@@ -904,18 +904,6 @@
|
|
bool
|
|
select SERIAL_RM9000
|
|
|
|
-config SOC_EMMA2RH
|
|
- bool
|
|
- select CEVT_R4K
|
|
- select CSRC_R4K
|
|
- select DMA_NONCOHERENT
|
|
- select IRQ_CPU
|
|
- select SWAP_IO_SPACE
|
|
- select SYS_HAS_CPU_R5500
|
|
- select SYS_SUPPORTS_32BIT_KERNEL
|
|
- select SYS_SUPPORTS_64BIT_KERNEL
|
|
- select SYS_SUPPORTS_BIG_ENDIAN
|
|
-
|
|
config SOC_PNX833X
|
|
bool
|
|
select CEVT_R4K
|
|
@@ -951,6 +939,11 @@
|
|
config SWAP_IO_SPACE
|
|
bool
|
|
|
|
+config EMMA2RH
|
|
+ bool
|
|
+ depends on MARKEINS
|
|
+ default y
|
|
+
|
|
config SERIAL_RM9000
|
|
bool
|
|
|
|
@@ -1250,7 +1243,6 @@
|
|
|
|
config CPU_CAVIUM_OCTEON
|
|
bool "Cavium Octeon processor"
|
|
- depends on SYS_HAS_CPU_CAVIUM_OCTEON
|
|
select IRQ_CPU
|
|
select IRQ_CPU_OCTEON
|
|
select CPU_HAS_PREFETCH
|
|
@@ -1331,9 +1323,6 @@
|
|
config SYS_HAS_CPU_SB1
|
|
bool
|
|
|
|
-config SYS_HAS_CPU_CAVIUM_OCTEON
|
|
- bool
|
|
-
|
|
#
|
|
# CPU may reorder R->R, R->W, W->R, W->W
|
|
# Reordering beyond LL and SC is handled in WEAK_REORDERING_BEYOND_LLSC
|
|
@@ -1385,7 +1374,7 @@
|
|
#
|
|
config HARDWARE_WATCHPOINTS
|
|
bool
|
|
- default y if CPU_MIPSR1 || CPU_MIPSR2
|
|
+ default y if CPU_MIPS32 || CPU_MIPS64
|
|
|
|
menu "Kernel type"
|
|
|
|
@@ -1407,7 +1396,6 @@
|
|
config 64BIT
|
|
bool "64-bit kernel"
|
|
depends on CPU_SUPPORTS_64BIT_KERNEL && SYS_SUPPORTS_64BIT_KERNEL
|
|
- select HAVE_SYSCALL_WRAPPERS
|
|
help
|
|
Select this option if you want to build a 64-bit kernel.
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/cpu-probe.c linux-2.6.29-rc3.owrt/arch/mips/kernel/cpu-probe.c
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/cpu-probe.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/cpu-probe.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -149,7 +149,6 @@
|
|
case CPU_R4650:
|
|
case CPU_R4700:
|
|
case CPU_R5000:
|
|
- case CPU_R5500:
|
|
case CPU_NEVADA:
|
|
case CPU_4KC:
|
|
case CPU_4KEC:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/genex.S linux-2.6.29-rc3.owrt/arch/mips/kernel/genex.S
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/genex.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/genex.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -458,11 +458,7 @@
|
|
BUILD_HANDLER fpe fpe fpe silent /* #15 */
|
|
BUILD_HANDLER mdmx mdmx sti silent /* #22 */
|
|
#ifdef CONFIG_HARDWARE_WATCHPOINTS
|
|
- /*
|
|
- * For watch, interrupts will be enabled after the watch
|
|
- * registers are read.
|
|
- */
|
|
- BUILD_HANDLER watch watch cli silent /* #23 */
|
|
+ BUILD_HANDLER watch watch sti silent /* #23 */
|
|
#else
|
|
BUILD_HANDLER watch watch sti verbose /* #23 */
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/irq.c linux-2.6.29-rc3.owrt/arch/mips/kernel/irq.c
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/irq.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -111,6 +111,7 @@
|
|
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
|
|
#endif
|
|
seq_printf(p, " %14s", irq_desc[i].chip->name);
|
|
+ seq_printf(p, "-%-8s", irq_desc[i].name);
|
|
seq_printf(p, " %s", action->name);
|
|
|
|
for (action=action->next; action; action = action->next)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/linux32.c linux-2.6.29-rc3.owrt/arch/mips/kernel/linux32.c
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/linux32.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/linux32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -32,7 +32,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/binfmts.h>
|
|
#include <linux/security.h>
|
|
-#include <linux/syscalls.h>
|
|
#include <linux/compat.h>
|
|
#include <linux/vfs.h>
|
|
#include <linux/ipc.h>
|
|
@@ -64,9 +63,9 @@
|
|
#define merge_64(r1, r2) ((((r2) & 0xffffffffUL) << 32) + ((r1) & 0xffffffffUL))
|
|
#endif
|
|
|
|
-SYSCALL_DEFINE6(32_mmap2, unsigned long, addr, unsigned long, len,
|
|
- unsigned long, prot, unsigned long, flags, unsigned long, fd,
|
|
- unsigned long, pgoff)
|
|
+asmlinkage unsigned long
|
|
+sys32_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
|
|
+ unsigned long flags, unsigned long fd, unsigned long pgoff)
|
|
{
|
|
struct file * file = NULL;
|
|
unsigned long error;
|
|
@@ -122,21 +121,21 @@
|
|
int rlim_max;
|
|
};
|
|
|
|
-SYSCALL_DEFINE4(32_truncate64, const char __user *, path,
|
|
- unsigned long, __dummy, unsigned long, a2, unsigned long, a3)
|
|
+asmlinkage long sys32_truncate64(const char __user * path,
|
|
+ unsigned long __dummy, int a2, int a3)
|
|
{
|
|
return sys_truncate(path, merge_64(a2, a3));
|
|
}
|
|
|
|
-SYSCALL_DEFINE4(32_ftruncate64, unsigned long, fd, unsigned long, __dummy,
|
|
- unsigned long, a2, unsigned long, a3)
|
|
+asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long __dummy,
|
|
+ int a2, int a3)
|
|
{
|
|
return sys_ftruncate(fd, merge_64(a2, a3));
|
|
}
|
|
|
|
-SYSCALL_DEFINE5(32_llseek, unsigned long, fd, unsigned long, offset_high,
|
|
- unsigned long, offset_low, loff_t __user *, result,
|
|
- unsigned long, origin)
|
|
+asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high,
|
|
+ unsigned int offset_low, loff_t __user * result,
|
|
+ unsigned int origin)
|
|
{
|
|
return sys_llseek(fd, offset_high, offset_low, result, origin);
|
|
}
|
|
@@ -145,20 +144,20 @@
|
|
lseek back to original location. They fail just like lseek does on
|
|
non-seekable files. */
|
|
|
|
-SYSCALL_DEFINE6(32_pread, unsigned long, fd, char __user *, buf, size_t, count,
|
|
- unsigned long, unused, unsigned long, a4, unsigned long, a5)
|
|
+asmlinkage ssize_t sys32_pread(unsigned int fd, char __user * buf,
|
|
+ size_t count, u32 unused, u64 a4, u64 a5)
|
|
{
|
|
return sys_pread64(fd, buf, count, merge_64(a4, a5));
|
|
}
|
|
|
|
-SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,
|
|
- size_t, count, u32, unused, u64, a4, u64, a5)
|
|
+asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char __user * buf,
|
|
+ size_t count, u32 unused, u64 a4, u64 a5)
|
|
{
|
|
return sys_pwrite64(fd, buf, count, merge_64(a4, a5));
|
|
}
|
|
|
|
-SYSCALL_DEFINE2(32_sched_rr_get_interval, compat_pid_t, pid,
|
|
- struct compat_timespec __user *, interval)
|
|
+asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
|
|
+ struct compat_timespec __user *interval)
|
|
{
|
|
struct timespec t;
|
|
int ret;
|
|
@@ -175,8 +174,8 @@
|
|
|
|
#ifdef CONFIG_SYSVIPC
|
|
|
|
-SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third,
|
|
- unsigned long, ptr, unsigned long, fifth)
|
|
+asmlinkage long
|
|
+sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
|
|
{
|
|
int version, err;
|
|
|
|
@@ -234,8 +233,8 @@
|
|
|
|
#else
|
|
|
|
-SYSCALL_DEFINE6(32_ipc, u32, call, int, first, int, second, int, third,
|
|
- u32, ptr, u32, fifth)
|
|
+asmlinkage long
|
|
+sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
@@ -243,7 +242,7 @@
|
|
#endif /* CONFIG_SYSVIPC */
|
|
|
|
#ifdef CONFIG_MIPS32_N32
|
|
-SYSCALL_DEFINE4(n32_semctl, int, semid, int, semnum, int, cmd, u32, arg)
|
|
+asmlinkage long sysn32_semctl(int semid, int semnum, int cmd, u32 arg)
|
|
{
|
|
/* compat_sys_semctl expects a pointer to union semun */
|
|
u32 __user *uptr = compat_alloc_user_space(sizeof(u32));
|
|
@@ -252,14 +251,13 @@
|
|
return compat_sys_semctl(semid, semnum, cmd, uptr);
|
|
}
|
|
|
|
-SYSCALL_DEFINE4(n32_msgsnd, int, msqid, u32, msgp, unsigned int, msgsz,
|
|
- int, msgflg)
|
|
+asmlinkage long sysn32_msgsnd(int msqid, u32 msgp, unsigned msgsz, int msgflg)
|
|
{
|
|
return compat_sys_msgsnd(msqid, msgsz, msgflg, compat_ptr(msgp));
|
|
}
|
|
|
|
-SYSCALL_DEFINE5(n32_msgrcv, int, msqid, u32, msgp, size_t, msgsz,
|
|
- int, msgtyp, int, msgflg)
|
|
+asmlinkage long sysn32_msgrcv(int msqid, u32 msgp, size_t msgsz, int msgtyp,
|
|
+ int msgflg)
|
|
{
|
|
return compat_sys_msgrcv(msqid, msgsz, msgtyp, msgflg, IPC_64,
|
|
compat_ptr(msgp));
|
|
@@ -279,7 +277,7 @@
|
|
|
|
#ifdef CONFIG_SYSCTL_SYSCALL
|
|
|
|
-SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args)
|
|
+asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
|
|
{
|
|
struct sysctl_args32 tmp;
|
|
int error;
|
|
@@ -318,16 +316,9 @@
|
|
return error;
|
|
}
|
|
|
|
-#else
|
|
-
|
|
-SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args)
|
|
-{
|
|
- return -ENOSYS;
|
|
-}
|
|
-
|
|
#endif /* CONFIG_SYSCTL_SYSCALL */
|
|
|
|
-SYSCALL_DEFINE1(32_newuname, struct new_utsname __user *, name)
|
|
+asmlinkage long sys32_newuname(struct new_utsname __user * name)
|
|
{
|
|
int ret = 0;
|
|
|
|
@@ -343,7 +334,7 @@
|
|
return ret;
|
|
}
|
|
|
|
-SYSCALL_DEFINE1(32_personality, unsigned long, personality)
|
|
+asmlinkage int sys32_personality(unsigned long personality)
|
|
{
|
|
int ret;
|
|
personality &= 0xffffffff;
|
|
@@ -366,7 +357,7 @@
|
|
|
|
extern asmlinkage long sys_ustat(dev_t dev, struct ustat __user * ubuf);
|
|
|
|
-SYSCALL_DEFINE2(32_ustat, dev_t, dev, struct ustat32 __user *, ubuf32)
|
|
+asmlinkage int sys32_ustat(dev_t dev, struct ustat32 __user * ubuf32)
|
|
{
|
|
int err;
|
|
struct ustat tmp;
|
|
@@ -390,8 +381,8 @@
|
|
return err;
|
|
}
|
|
|
|
-SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd,
|
|
- compat_off_t __user *, offset, s32, count)
|
|
+asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset,
|
|
+ s32 count)
|
|
{
|
|
mm_segment_t old_fs = get_fs();
|
|
int ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/mips-mt-fpaff.c linux-2.6.29-rc3.owrt/arch/mips/kernel/mips-mt-fpaff.c
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/mips-mt-fpaff.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/mips-mt-fpaff.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -79,8 +79,7 @@
|
|
|
|
euid = current_euid();
|
|
retval = -EPERM;
|
|
- if (euid != p->cred->euid && euid != p->cred->uid &&
|
|
- !capable(CAP_SYS_NICE)) {
|
|
+ if (euid != p->euid && euid != p->uid && !capable(CAP_SYS_NICE)) {
|
|
read_unlock(&tasklist_lock);
|
|
goto out_unlock;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/scall32-o32.S linux-2.6.29-rc3.owrt/arch/mips/kernel/scall32-o32.S
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/scall32-o32.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/scall32-o32.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -399,7 +399,7 @@
|
|
sys sys_swapon 2
|
|
sys sys_reboot 3
|
|
sys sys_old_readdir 3
|
|
- sys sys_mips_mmap 6 /* 4090 */
|
|
+ sys old_mmap 6 /* 4090 */
|
|
sys sys_munmap 2
|
|
sys sys_truncate 2
|
|
sys sys_ftruncate 2
|
|
@@ -519,7 +519,7 @@
|
|
sys sys_sendfile 4
|
|
sys sys_ni_syscall 0
|
|
sys sys_ni_syscall 0
|
|
- sys sys_mips_mmap2 6 /* 4210 */
|
|
+ sys sys_mmap2 6 /* 4210 */
|
|
sys sys_truncate64 4
|
|
sys sys_ftruncate64 4
|
|
sys sys_stat64 2
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/scall64-64.S linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-64.S
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/scall64-64.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-64.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -207,7 +207,7 @@
|
|
PTR sys_newlstat
|
|
PTR sys_poll
|
|
PTR sys_lseek
|
|
- PTR sys_mips_mmap
|
|
+ PTR old_mmap
|
|
PTR sys_mprotect /* 5010 */
|
|
PTR sys_munmap
|
|
PTR sys_brk
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/scall64-n32.S linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-n32.S
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/scall64-n32.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-n32.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -129,12 +129,12 @@
|
|
PTR sys_newlstat
|
|
PTR sys_poll
|
|
PTR sys_lseek
|
|
- PTR sys_mips_mmap
|
|
+ PTR old_mmap
|
|
PTR sys_mprotect /* 6010 */
|
|
PTR sys_munmap
|
|
PTR sys_brk
|
|
- PTR sys_32_rt_sigaction
|
|
- PTR sys_32_rt_sigprocmask
|
|
+ PTR sys32_rt_sigaction
|
|
+ PTR sys32_rt_sigprocmask
|
|
PTR compat_sys_ioctl /* 6015 */
|
|
PTR sys_pread64
|
|
PTR sys_pwrite64
|
|
@@ -159,7 +159,7 @@
|
|
PTR compat_sys_setitimer
|
|
PTR sys_alarm
|
|
PTR sys_getpid
|
|
- PTR sys_32_sendfile
|
|
+ PTR sys32_sendfile
|
|
PTR sys_socket /* 6040 */
|
|
PTR sys_connect
|
|
PTR sys_accept
|
|
@@ -181,14 +181,14 @@
|
|
PTR sys_exit
|
|
PTR compat_sys_wait4
|
|
PTR sys_kill /* 6060 */
|
|
- PTR sys_32_newuname
|
|
+ PTR sys32_newuname
|
|
PTR sys_semget
|
|
PTR sys_semop
|
|
- PTR sys_n32_semctl
|
|
+ PTR sysn32_semctl
|
|
PTR sys_shmdt /* 6065 */
|
|
PTR sys_msgget
|
|
- PTR sys_n32_msgsnd
|
|
- PTR sys_n32_msgrcv
|
|
+ PTR sysn32_msgsnd
|
|
+ PTR sysn32_msgrcv
|
|
PTR compat_sys_msgctl
|
|
PTR compat_sys_fcntl /* 6070 */
|
|
PTR sys_flock
|
|
@@ -245,15 +245,15 @@
|
|
PTR sys_getsid
|
|
PTR sys_capget
|
|
PTR sys_capset
|
|
- PTR sys_32_rt_sigpending /* 6125 */
|
|
+ PTR sys32_rt_sigpending /* 6125 */
|
|
PTR compat_sys_rt_sigtimedwait
|
|
- PTR sys_32_rt_sigqueueinfo
|
|
+ PTR sys32_rt_sigqueueinfo
|
|
PTR sysn32_rt_sigsuspend
|
|
PTR sys32_sigaltstack
|
|
PTR compat_sys_utime /* 6130 */
|
|
PTR sys_mknod
|
|
- PTR sys_32_personality
|
|
- PTR sys_32_ustat
|
|
+ PTR sys32_personality
|
|
+ PTR sys32_ustat
|
|
PTR compat_sys_statfs
|
|
PTR compat_sys_fstatfs /* 6135 */
|
|
PTR sys_sysfs
|
|
@@ -265,14 +265,14 @@
|
|
PTR sys_sched_getscheduler
|
|
PTR sys_sched_get_priority_max
|
|
PTR sys_sched_get_priority_min
|
|
- PTR sys_32_sched_rr_get_interval /* 6145 */
|
|
+ PTR sys32_sched_rr_get_interval /* 6145 */
|
|
PTR sys_mlock
|
|
PTR sys_munlock
|
|
PTR sys_mlockall
|
|
PTR sys_munlockall
|
|
PTR sys_vhangup /* 6150 */
|
|
PTR sys_pivot_root
|
|
- PTR sys_32_sysctl
|
|
+ PTR sys32_sysctl
|
|
PTR sys_prctl
|
|
PTR compat_sys_adjtimex
|
|
PTR compat_sys_setrlimit /* 6155 */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/scall64-o32.S linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-o32.S
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/scall64-o32.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-o32.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -265,12 +265,12 @@
|
|
PTR sys_olduname
|
|
PTR sys_umask /* 4060 */
|
|
PTR sys_chroot
|
|
- PTR sys_32_ustat
|
|
+ PTR sys32_ustat
|
|
PTR sys_dup2
|
|
PTR sys_getppid
|
|
PTR sys_getpgrp /* 4065 */
|
|
PTR sys_setsid
|
|
- PTR sys_32_sigaction
|
|
+ PTR sys32_sigaction
|
|
PTR sys_sgetmask
|
|
PTR sys_ssetmask
|
|
PTR sys_setreuid /* 4070 */
|
|
@@ -293,7 +293,7 @@
|
|
PTR sys_swapon
|
|
PTR sys_reboot
|
|
PTR compat_sys_old_readdir
|
|
- PTR sys_mips_mmap /* 4090 */
|
|
+ PTR old_mmap /* 4090 */
|
|
PTR sys_munmap
|
|
PTR sys_truncate
|
|
PTR sys_ftruncate
|
|
@@ -320,12 +320,12 @@
|
|
PTR compat_sys_wait4
|
|
PTR sys_swapoff /* 4115 */
|
|
PTR compat_sys_sysinfo
|
|
- PTR sys_32_ipc
|
|
+ PTR sys32_ipc
|
|
PTR sys_fsync
|
|
PTR sys32_sigreturn
|
|
PTR sys32_clone /* 4120 */
|
|
PTR sys_setdomainname
|
|
- PTR sys_32_newuname
|
|
+ PTR sys32_newuname
|
|
PTR sys_ni_syscall /* sys_modify_ldt */
|
|
PTR compat_sys_adjtimex
|
|
PTR sys_mprotect /* 4125 */
|
|
@@ -339,11 +339,11 @@
|
|
PTR sys_fchdir
|
|
PTR sys_bdflush
|
|
PTR sys_sysfs /* 4135 */
|
|
- PTR sys_32_personality
|
|
+ PTR sys32_personality
|
|
PTR sys_ni_syscall /* for afs_syscall */
|
|
PTR sys_setfsuid
|
|
PTR sys_setfsgid
|
|
- PTR sys_32_llseek /* 4140 */
|
|
+ PTR sys32_llseek /* 4140 */
|
|
PTR compat_sys_getdents
|
|
PTR compat_sys_select
|
|
PTR sys_flock
|
|
@@ -356,7 +356,7 @@
|
|
PTR sys_ni_syscall /* 4150 */
|
|
PTR sys_getsid
|
|
PTR sys_fdatasync
|
|
- PTR sys_32_sysctl
|
|
+ PTR sys32_sysctl
|
|
PTR sys_mlock
|
|
PTR sys_munlock /* 4155 */
|
|
PTR sys_mlockall
|
|
@@ -368,7 +368,7 @@
|
|
PTR sys_sched_yield
|
|
PTR sys_sched_get_priority_max
|
|
PTR sys_sched_get_priority_min
|
|
- PTR sys_32_sched_rr_get_interval /* 4165 */
|
|
+ PTR sys32_sched_rr_get_interval /* 4165 */
|
|
PTR compat_sys_nanosleep
|
|
PTR sys_mremap
|
|
PTR sys_accept
|
|
@@ -397,25 +397,25 @@
|
|
PTR sys_getresgid
|
|
PTR sys_prctl
|
|
PTR sys32_rt_sigreturn
|
|
- PTR sys_32_rt_sigaction
|
|
- PTR sys_32_rt_sigprocmask /* 4195 */
|
|
- PTR sys_32_rt_sigpending
|
|
+ PTR sys32_rt_sigaction
|
|
+ PTR sys32_rt_sigprocmask /* 4195 */
|
|
+ PTR sys32_rt_sigpending
|
|
PTR compat_sys_rt_sigtimedwait
|
|
- PTR sys_32_rt_sigqueueinfo
|
|
+ PTR sys32_rt_sigqueueinfo
|
|
PTR sys32_rt_sigsuspend
|
|
- PTR sys_32_pread /* 4200 */
|
|
- PTR sys_32_pwrite
|
|
+ PTR sys32_pread /* 4200 */
|
|
+ PTR sys32_pwrite
|
|
PTR sys_chown
|
|
PTR sys_getcwd
|
|
PTR sys_capget
|
|
PTR sys_capset /* 4205 */
|
|
PTR sys32_sigaltstack
|
|
- PTR sys_32_sendfile
|
|
+ PTR sys32_sendfile
|
|
PTR sys_ni_syscall
|
|
PTR sys_ni_syscall
|
|
- PTR sys_mips_mmap2 /* 4210 */
|
|
- PTR sys_32_truncate64
|
|
- PTR sys_32_ftruncate64
|
|
+ PTR sys32_mmap2 /* 4210 */
|
|
+ PTR sys32_truncate64
|
|
+ PTR sys32_ftruncate64
|
|
PTR sys_newstat
|
|
PTR sys_newlstat
|
|
PTR sys_newfstat /* 4215 */
|
|
@@ -481,7 +481,7 @@
|
|
PTR compat_sys_mq_notify /* 4275 */
|
|
PTR compat_sys_mq_getsetattr
|
|
PTR sys_ni_syscall /* sys_vserver */
|
|
- PTR sys_32_waitid
|
|
+ PTR sys32_waitid
|
|
PTR sys_ni_syscall /* available, was setaltroot */
|
|
PTR sys_add_key /* 4280 */
|
|
PTR sys_request_key
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/signal32.c linux-2.6.29-rc3.owrt/arch/mips/kernel/signal32.c
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/signal32.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/signal32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -349,8 +349,8 @@
|
|
return -ERESTARTNOHAND;
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act,
|
|
- struct sigaction32 __user *, oact)
|
|
+asmlinkage int sys32_sigaction(int sig, const struct sigaction32 __user *act,
|
|
+ struct sigaction32 __user *oact)
|
|
{
|
|
struct k_sigaction new_ka, old_ka;
|
|
int ret;
|
|
@@ -704,9 +704,9 @@
|
|
.restart = __NR_O32_restart_syscall
|
|
};
|
|
|
|
-SYSCALL_DEFINE4(32_rt_sigaction, int, sig,
|
|
- const struct sigaction32 __user *, act,
|
|
- struct sigaction32 __user *, oact, unsigned int, sigsetsize)
|
|
+asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
|
|
+ struct sigaction32 __user *oact,
|
|
+ unsigned int sigsetsize)
|
|
{
|
|
struct k_sigaction new_sa, old_sa;
|
|
int ret = -EINVAL;
|
|
@@ -748,8 +748,8 @@
|
|
return ret;
|
|
}
|
|
|
|
-SYSCALL_DEFINE4(32_rt_sigprocmask, int, how, compat_sigset_t __user *, set,
|
|
- compat_sigset_t __user *, oset, unsigned int, sigsetsize)
|
|
+asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
|
|
+ compat_sigset_t __user *oset, unsigned int sigsetsize)
|
|
{
|
|
sigset_t old_set, new_set;
|
|
int ret;
|
|
@@ -770,8 +770,8 @@
|
|
return ret;
|
|
}
|
|
|
|
-SYSCALL_DEFINE2(32_rt_sigpending, compat_sigset_t __user *, uset,
|
|
- unsigned int, sigsetsize)
|
|
+asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
|
|
+ unsigned int sigsetsize)
|
|
{
|
|
int ret;
|
|
sigset_t set;
|
|
@@ -787,8 +787,7 @@
|
|
return ret;
|
|
}
|
|
|
|
-SYSCALL_DEFINE3(32_rt_sigqueueinfo, int, pid, int, sig,
|
|
- compat_siginfo_t __user *, uinfo)
|
|
+asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
|
|
{
|
|
siginfo_t info;
|
|
int ret;
|
|
@@ -803,9 +802,10 @@
|
|
return ret;
|
|
}
|
|
|
|
-SYSCALL_DEFINE5(32_waitid, int, which, compat_pid_t, pid,
|
|
- compat_siginfo_t __user *, uinfo, int, options,
|
|
- struct compat_rusage __user *, uru)
|
|
+asmlinkage long
|
|
+sys32_waitid(int which, compat_pid_t pid,
|
|
+ compat_siginfo_t __user *uinfo, int options,
|
|
+ struct compat_rusage __user *uru)
|
|
{
|
|
siginfo_t info;
|
|
struct rusage ru;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/signal.c linux-2.6.29-rc3.owrt/arch/mips/kernel/signal.c
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/signal.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/signal.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
#include <linux/ptrace.h>
|
|
#include <linux/unistd.h>
|
|
#include <linux/compiler.h>
|
|
-#include <linux/syscalls.h>
|
|
#include <linux/uaccess.h>
|
|
|
|
#include <asm/abi.h>
|
|
@@ -339,8 +338,8 @@
|
|
}
|
|
|
|
#ifdef CONFIG_TRAD_SIGNALS
|
|
-SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
|
|
- struct sigaction __user *, oact)
|
|
+asmlinkage int sys_sigaction(int sig, const struct sigaction __user *act,
|
|
+ struct sigaction __user *oact)
|
|
{
|
|
struct k_sigaction new_ka, old_ka;
|
|
int ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/syscall.c linux-2.6.29-rc3.owrt/arch/mips/kernel/syscall.c
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/syscall.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/syscall.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -152,9 +152,9 @@
|
|
return error;
|
|
}
|
|
|
|
-SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
|
|
- unsigned long, prot, unsigned long, flags, unsigned long,
|
|
- fd, off_t, offset)
|
|
+asmlinkage unsigned long
|
|
+old_mmap(unsigned long addr, unsigned long len, int prot,
|
|
+ int flags, int fd, off_t offset)
|
|
{
|
|
unsigned long result;
|
|
|
|
@@ -168,9 +168,9 @@
|
|
return result;
|
|
}
|
|
|
|
-SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
|
|
- unsigned long, prot, unsigned long, flags, unsigned long, fd,
|
|
- unsigned long, pgoff)
|
|
+asmlinkage unsigned long
|
|
+sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
|
|
+ unsigned long flags, unsigned long fd, unsigned long pgoff)
|
|
{
|
|
if (pgoff & (~PAGE_MASK >> 12))
|
|
return -EINVAL;
|
|
@@ -240,7 +240,7 @@
|
|
/*
|
|
* Compacrapability ...
|
|
*/
|
|
-SYSCALL_DEFINE1(uname, struct old_utsname __user *, name)
|
|
+asmlinkage int sys_uname(struct old_utsname __user * name)
|
|
{
|
|
if (name && !copy_to_user(name, utsname(), sizeof (*name)))
|
|
return 0;
|
|
@@ -250,7 +250,7 @@
|
|
/*
|
|
* Compacrapability ...
|
|
*/
|
|
-SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name)
|
|
+asmlinkage int sys_olduname(struct oldold_utsname __user * name)
|
|
{
|
|
int error;
|
|
|
|
@@ -279,7 +279,7 @@
|
|
return error;
|
|
}
|
|
|
|
-SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
|
|
+asmlinkage int sys_set_thread_area(unsigned long addr)
|
|
{
|
|
struct thread_info *ti = task_thread_info(current);
|
|
|
|
@@ -290,7 +290,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-asmlinkage int _sys_sysmips(long cmd, long arg1, long arg2, long arg3)
|
|
+asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
|
|
{
|
|
switch (cmd) {
|
|
case MIPS_ATOMIC_SET:
|
|
@@ -325,8 +325,8 @@
|
|
*
|
|
* This is really horribly ugly.
|
|
*/
|
|
-SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, int, second,
|
|
- unsigned long, third, void __user *, ptr, long, fifth)
|
|
+asmlinkage int sys_ipc(unsigned int call, int first, int second,
|
|
+ unsigned long third, void __user *ptr, long fifth)
|
|
{
|
|
int version, ret;
|
|
|
|
@@ -411,7 +411,7 @@
|
|
/*
|
|
* No implemented yet ...
|
|
*/
|
|
-SYSCALL_DEFINE3(cachectl, char *, addr, int, nbytes, int, op)
|
|
+asmlinkage int sys_cachectl(char *addr, int nbytes, int op)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/kernel/traps.c linux-2.6.29-rc3.owrt/arch/mips/kernel/traps.c
|
|
--- linux-2.6.29.owrt/arch/mips/kernel/traps.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/kernel/traps.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -944,9 +944,6 @@
|
|
force_sig(SIGILL, current);
|
|
}
|
|
|
|
-/*
|
|
- * Called with interrupts disabled.
|
|
- */
|
|
asmlinkage void do_watch(struct pt_regs *regs)
|
|
{
|
|
u32 cause;
|
|
@@ -966,12 +963,9 @@
|
|
*/
|
|
if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) {
|
|
mips_read_watch_registers();
|
|
- local_irq_enable();
|
|
force_sig(SIGTRAP, current);
|
|
- } else {
|
|
+ } else
|
|
mips_clear_watch_registers();
|
|
- local_irq_enable();
|
|
- }
|
|
}
|
|
|
|
asmlinkage void do_mcheck(struct pt_regs *regs)
|
|
@@ -1588,11 +1582,7 @@
|
|
static char panic_null_cerr[] __cpuinitdata =
|
|
"Trying to set NULL cache error exception handler";
|
|
|
|
-/*
|
|
- * Install uncached CPU exception handler.
|
|
- * This is suitable only for the cache error exception which is the only
|
|
- * exception handler that is being run uncached.
|
|
- */
|
|
+/* Install uncached CPU exception handler */
|
|
void __cpuinit set_uncached_handler(unsigned long offset, void *addr,
|
|
unsigned long size)
|
|
{
|
|
@@ -1603,7 +1593,7 @@
|
|
unsigned long uncached_ebase = TO_UNCAC(ebase);
|
|
#endif
|
|
if (cpu_has_mips_r2)
|
|
- uncached_ebase += (read_c0_ebase() & 0x3ffff000);
|
|
+ ebase += (read_c0_ebase() & 0x3ffff000);
|
|
|
|
if (!addr)
|
|
panic(panic_null_cerr);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/lib/memcpy-inatomic.S linux-2.6.29-rc3.owrt/arch/mips/lib/memcpy-inatomic.S
|
|
--- linux-2.6.29.owrt/arch/mips/lib/memcpy-inatomic.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/lib/memcpy-inatomic.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,7 +21,7 @@
|
|
* end of memory on some systems. It's also a seriously bad idea on non
|
|
* dma-coherent systems.
|
|
*/
|
|
-#ifdef CONFIG_DMA_NONCOHERENT
|
|
+#if !defined(CONFIG_DMA_COHERENT) || !defined(CONFIG_DMA_IP27)
|
|
#undef CONFIG_CPU_HAS_PREFETCH
|
|
#endif
|
|
#ifdef CONFIG_MIPS_MALTA
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/lib/memcpy.S linux-2.6.29-rc3.owrt/arch/mips/lib/memcpy.S
|
|
--- linux-2.6.29.owrt/arch/mips/lib/memcpy.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/lib/memcpy.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,7 +21,7 @@
|
|
* end of memory on some systems. It's also a seriously bad idea on non
|
|
* dma-coherent systems.
|
|
*/
|
|
-#ifdef CONFIG_DMA_NONCOHERENT
|
|
+#if !defined(CONFIG_DMA_COHERENT) || !defined(CONFIG_DMA_IP27)
|
|
#undef CONFIG_CPU_HAS_PREFETCH
|
|
#endif
|
|
#ifdef CONFIG_MIPS_MALTA
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/Makefile linux-2.6.29-rc3.owrt/arch/mips/Makefile
|
|
--- linux-2.6.29.owrt/arch/mips/Makefile 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -416,7 +416,7 @@
|
|
#
|
|
# Common NEC EMMAXXX
|
|
#
|
|
-core-$(CONFIG_SOC_EMMA2RH) += arch/mips/emma/common/
|
|
+core-$(CONFIG_SOC_EMMA) += arch/mips/emma/common/
|
|
cflags-$(CONFIG_SOC_EMMA2RH) += -I$(srctree)/arch/mips/include/asm/mach-emma2rh
|
|
|
|
#
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/mm/cache.c linux-2.6.29-rc3.owrt/arch/mips/mm/cache.c
|
|
--- linux-2.6.29.owrt/arch/mips/mm/cache.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/mm/cache.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -13,7 +13,6 @@
|
|
#include <linux/linkage.h>
|
|
#include <linux/module.h>
|
|
#include <linux/sched.h>
|
|
-#include <linux/syscalls.h>
|
|
#include <linux/mm.h>
|
|
|
|
#include <asm/cacheflush.h>
|
|
@@ -59,8 +58,8 @@
|
|
* We could optimize the case where the cache argument is not BCACHE but
|
|
* that seems very atypical use ...
|
|
*/
|
|
-SYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, bytes,
|
|
- unsigned int, cache)
|
|
+asmlinkage int sys_cacheflush(unsigned long addr,
|
|
+ unsigned long bytes, unsigned int cache)
|
|
{
|
|
if (bytes == 0)
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/mm/c-r4k.c linux-2.6.29-rc3.owrt/arch/mips/mm/c-r4k.c
|
|
--- linux-2.6.29.owrt/arch/mips/mm/c-r4k.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/mm/c-r4k.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -618,35 +618,15 @@
|
|
if (cpu_has_inclusive_pcaches) {
|
|
if (size >= scache_size)
|
|
r4k_blast_scache();
|
|
- else {
|
|
- unsigned long lsize = cpu_scache_line_size();
|
|
- unsigned long almask = ~(lsize - 1);
|
|
-
|
|
- /*
|
|
- * There is no clearly documented alignment requirement
|
|
- * for the cache instruction on MIPS processors and
|
|
- * some processors, among them the RM5200 and RM7000
|
|
- * QED processors will throw an address error for cache
|
|
- * hit ops with insufficient alignment. Solved by
|
|
- * aligning the address to cache line size.
|
|
- */
|
|
- cache_op(Hit_Writeback_Inv_SD, addr & almask);
|
|
- cache_op(Hit_Writeback_Inv_SD,
|
|
- (addr + size - 1) & almask);
|
|
+ else
|
|
blast_inv_scache_range(addr, addr + size);
|
|
- }
|
|
return;
|
|
}
|
|
|
|
if (cpu_has_safe_index_cacheops && size >= dcache_size) {
|
|
r4k_blast_dcache();
|
|
} else {
|
|
- unsigned long lsize = cpu_dcache_line_size();
|
|
- unsigned long almask = ~(lsize - 1);
|
|
-
|
|
R4600_HIT_CACHEOP_WAR_IMPL;
|
|
- cache_op(Hit_Writeback_Inv_D, addr & almask);
|
|
- cache_op(Hit_Writeback_Inv_D, (addr + size - 1) & almask);
|
|
blast_inv_dcache_range(addr, addr + size);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/mm/fault.c linux-2.6.29-rc3.owrt/arch/mips/mm/fault.c
|
|
--- linux-2.6.29.owrt/arch/mips/mm/fault.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/mm/fault.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -97,6 +97,7 @@
|
|
goto bad_area;
|
|
}
|
|
|
|
+survive:
|
|
/*
|
|
* If for any reason at all we couldn't handle the fault,
|
|
* make sure we exit gracefully rather than endlessly redo
|
|
@@ -166,13 +167,21 @@
|
|
field, regs->regs[31]);
|
|
die("Oops", regs);
|
|
|
|
+/*
|
|
+ * We ran out of memory, or some other thing happened to us that made
|
|
+ * us unable to handle the page fault gracefully.
|
|
+ */
|
|
out_of_memory:
|
|
- /*
|
|
- * We ran out of memory, call the OOM killer, and return the userspace
|
|
- * (which will retry the fault, or kill us if we got oom-killed).
|
|
- */
|
|
- pagefault_out_of_memory();
|
|
- return;
|
|
+ up_read(&mm->mmap_sem);
|
|
+ if (is_global_init(tsk)) {
|
|
+ yield();
|
|
+ down_read(&mm->mmap_sem);
|
|
+ goto survive;
|
|
+ }
|
|
+ printk("VM: killing process %s\n", tsk->comm);
|
|
+ if (user_mode(regs))
|
|
+ do_group_exit(SIGKILL);
|
|
+ goto no_context;
|
|
|
|
do_sigbus:
|
|
up_read(&mm->mmap_sem);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/mm/page.c linux-2.6.29-rc3.owrt/arch/mips/mm/page.c
|
|
--- linux-2.6.29.owrt/arch/mips/mm/page.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/mm/page.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -172,9 +172,8 @@
|
|
*/
|
|
cache_line_size = cpu_dcache_line_size();
|
|
switch (current_cpu_type()) {
|
|
- case CPU_R5500:
|
|
case CPU_TX49XX:
|
|
- /* These processors only support the Pref_Load. */
|
|
+ /* TX49 supports only Pref_Load */
|
|
pref_bias_copy_load = 256;
|
|
break;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/mm/tlbex.c linux-2.6.29-rc3.owrt/arch/mips/mm/tlbex.c
|
|
--- linux-2.6.29.owrt/arch/mips/mm/tlbex.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/mm/tlbex.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -318,7 +318,6 @@
|
|
case CPU_BCM4710:
|
|
case CPU_LOONGSON2:
|
|
case CPU_CAVIUM_OCTEON:
|
|
- case CPU_R5500:
|
|
if (m4kc_tlbp_war())
|
|
uasm_i_nop(p);
|
|
tlbw(p);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/pci/pci-rc32434.c linux-2.6.29-rc3.owrt/arch/mips/pci/pci-rc32434.c
|
|
--- linux-2.6.29.owrt/arch/mips/pci/pci-rc32434.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/pci/pci-rc32434.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -205,8 +205,6 @@
|
|
|
|
static int __init rc32434_pci_init(void)
|
|
{
|
|
- void __iomem *io_map_base;
|
|
-
|
|
pr_info("PCI: Initializing PCI\n");
|
|
|
|
ioport_resource.start = rc32434_res_pci_io1.start;
|
|
@@ -214,15 +212,6 @@
|
|
|
|
rc32434_pcibridge_init();
|
|
|
|
- io_map_base = ioremap(rc32434_res_pci_io1.start,
|
|
- rc32434_res_pci_io1.end - rc32434_res_pci_io1.start + 1);
|
|
-
|
|
- if (!io_map_base)
|
|
- return -ENOMEM;
|
|
-
|
|
- rc32434_controller.io_map_base =
|
|
- (unsigned long)io_map_base - rc32434_res_pci_io1.start;
|
|
-
|
|
register_pci_controller(&rc32434_controller);
|
|
rc32434_sync();
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/rb532/devices.c linux-2.6.29-rc3.owrt/arch/mips/rb532/devices.c
|
|
--- linux-2.6.29.owrt/arch/mips/rb532/devices.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/rb532/devices.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -24,7 +24,6 @@
|
|
#include <linux/mtd/partitions.h>
|
|
#include <linux/gpio_keys.h>
|
|
#include <linux/input.h>
|
|
-#include <linux/serial_8250.h>
|
|
|
|
#include <asm/bootinfo.h>
|
|
|
|
@@ -40,29 +39,6 @@
|
|
#define ETH0_RX_DMA_ADDR (DMA0_BASE_ADDR + 0 * DMA_CHAN_OFFSET)
|
|
#define ETH0_TX_DMA_ADDR (DMA0_BASE_ADDR + 1 * DMA_CHAN_OFFSET)
|
|
|
|
-extern unsigned int idt_cpu_freq;
|
|
-
|
|
-static struct mpmc_device dev3;
|
|
-
|
|
-void set_latch_u5(unsigned char or_mask, unsigned char nand_mask)
|
|
-{
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&dev3.lock, flags);
|
|
-
|
|
- dev3.state = (dev3.state | or_mask) & ~nand_mask;
|
|
- writeb(dev3.state, dev3.base);
|
|
-
|
|
- spin_unlock_irqrestore(&dev3.lock, flags);
|
|
-}
|
|
-EXPORT_SYMBOL(set_latch_u5);
|
|
-
|
|
-unsigned char get_latch_u5(void)
|
|
-{
|
|
- return dev3.state;
|
|
-}
|
|
-EXPORT_SYMBOL(get_latch_u5);
|
|
-
|
|
static struct resource korina_dev0_res[] = {
|
|
{
|
|
.name = "korina_regs",
|
|
@@ -110,7 +86,7 @@
|
|
static struct platform_device korina_dev0 = {
|
|
.id = -1,
|
|
.name = "korina",
|
|
- .dev.driver_data = &korina_dev0_data,
|
|
+ .dev.platform_data = &korina_dev0_data,
|
|
.resource = korina_dev0_res,
|
|
.num_resources = ARRAY_SIZE(korina_dev0_res),
|
|
};
|
|
@@ -238,32 +214,12 @@
|
|
.num_resources = ARRAY_SIZE(rb532_wdt_res),
|
|
};
|
|
|
|
-static struct plat_serial8250_port rb532_uart_res[] = {
|
|
- {
|
|
- .membase = (char *)KSEG1ADDR(REGBASE + UART0BASE),
|
|
- .irq = UART0_IRQ,
|
|
- .regshift = 2,
|
|
- .iotype = UPIO_MEM,
|
|
- .flags = UPF_BOOT_AUTOCONF,
|
|
- },
|
|
- {
|
|
- .flags = 0,
|
|
- }
|
|
-};
|
|
-
|
|
-static struct platform_device rb532_uart = {
|
|
- .name = "serial8250",
|
|
- .id = PLAT8250_DEV_PLATFORM,
|
|
- .dev.platform_data = &rb532_uart_res,
|
|
-};
|
|
-
|
|
static struct platform_device *rb532_devs[] = {
|
|
&korina_dev0,
|
|
&nand_slot0,
|
|
&cf_slot0,
|
|
&rb532_led,
|
|
&rb532_button,
|
|
- &rb532_uart,
|
|
&rb532_wdt
|
|
};
|
|
|
|
@@ -335,20 +291,9 @@
|
|
nand_slot0_res[0].start = readl(IDT434_REG_BASE + DEV2BASE);
|
|
nand_slot0_res[0].end = nand_slot0_res[0].start + 0x1000;
|
|
|
|
- /* Read and map device controller 3 */
|
|
- dev3.base = ioremap_nocache(readl(IDT434_REG_BASE + DEV3BASE), 1);
|
|
-
|
|
- if (!dev3.base) {
|
|
- printk(KERN_ERR "rb532: cannot remap device controller 3\n");
|
|
- return -ENXIO;
|
|
- }
|
|
-
|
|
/* Initialise the NAND device */
|
|
rb532_nand_setup();
|
|
|
|
- /* set the uart clock to the current cpu frequency */
|
|
- rb532_uart_res[0].uartclk = idt_cpu_freq;
|
|
-
|
|
return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs));
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/rb532/gpio.c linux-2.6.29-rc3.owrt/arch/mips/rb532/gpio.c
|
|
--- linux-2.6.29.owrt/arch/mips/rb532/gpio.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/rb532/gpio.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -41,6 +41,8 @@
|
|
void __iomem *regbase;
|
|
};
|
|
|
|
+struct mpmc_device dev3;
|
|
+
|
|
static struct resource rb532_gpio_reg0_res[] = {
|
|
{
|
|
.name = "gpio_reg0",
|
|
@@ -50,6 +52,61 @@
|
|
}
|
|
};
|
|
|
|
+static struct resource rb532_dev3_ctl_res[] = {
|
|
+ {
|
|
+ .name = "dev3_ctl",
|
|
+ .start = REGBASE + DEV3BASE,
|
|
+ .end = REGBASE + DEV3BASE + sizeof(struct dev_reg) - 1,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ }
|
|
+};
|
|
+
|
|
+void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned val)
|
|
+{
|
|
+ unsigned long flags;
|
|
+ unsigned data;
|
|
+ unsigned i = 0;
|
|
+
|
|
+ spin_lock_irqsave(&dev3.lock, flags);
|
|
+
|
|
+ data = readl(IDT434_REG_BASE + reg_offs);
|
|
+ for (i = 0; i != len; ++i) {
|
|
+ if (val & (1 << i))
|
|
+ data |= (1 << (i + bit));
|
|
+ else
|
|
+ data &= ~(1 << (i + bit));
|
|
+ }
|
|
+ writel(data, (IDT434_REG_BASE + reg_offs));
|
|
+
|
|
+ spin_unlock_irqrestore(&dev3.lock, flags);
|
|
+}
|
|
+EXPORT_SYMBOL(set_434_reg);
|
|
+
|
|
+unsigned get_434_reg(unsigned reg_offs)
|
|
+{
|
|
+ return readl(IDT434_REG_BASE + reg_offs);
|
|
+}
|
|
+EXPORT_SYMBOL(get_434_reg);
|
|
+
|
|
+void set_latch_u5(unsigned char or_mask, unsigned char nand_mask)
|
|
+{
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&dev3.lock, flags);
|
|
+
|
|
+ dev3.state = (dev3.state | or_mask) & ~nand_mask;
|
|
+ writel(dev3.state, &dev3.base);
|
|
+
|
|
+ spin_unlock_irqrestore(&dev3.lock, flags);
|
|
+}
|
|
+EXPORT_SYMBOL(set_latch_u5);
|
|
+
|
|
+unsigned char get_latch_u5(void)
|
|
+{
|
|
+ return dev3.state;
|
|
+}
|
|
+EXPORT_SYMBOL(get_latch_u5);
|
|
+
|
|
/* rb532_set_bit - sanely set a bit
|
|
*
|
|
* bitval: new value for the bit
|
|
@@ -62,11 +119,13 @@
|
|
unsigned long flags;
|
|
u32 val;
|
|
|
|
+ bitval = !!bitval; /* map parameter to {0,1} */
|
|
+
|
|
local_irq_save(flags);
|
|
|
|
val = readl(ioaddr);
|
|
- val &= ~(!bitval << offset); /* unset bit if bitval == 0 */
|
|
- val |= (!!bitval << offset); /* set bit if bitval == 1 */
|
|
+ val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */
|
|
+ val |= ( bitval << offset ); /* set bit if bitval == 1 */
|
|
writel(val, ioaddr);
|
|
|
|
local_irq_restore(flags);
|
|
@@ -112,8 +171,8 @@
|
|
|
|
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
|
|
|
- /* disable alternate function in case it's set */
|
|
- rb532_set_bit(0, offset, gpch->regbase + GPIOFUNC);
|
|
+ if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC))
|
|
+ return 1; /* alternate function, GPIOCFG is ignored */
|
|
|
|
rb532_set_bit(0, offset, gpch->regbase + GPIOCFG);
|
|
return 0;
|
|
@@ -129,8 +188,8 @@
|
|
|
|
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
|
|
|
- /* disable alternate function in case it's set */
|
|
- rb532_set_bit(0, offset, gpch->regbase + GPIOFUNC);
|
|
+ if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC))
|
|
+ return 1; /* alternate function, GPIOCFG is ignored */
|
|
|
|
/* set the initial output value */
|
|
rb532_set_bit(value, offset, gpch->regbase + GPIOD);
|
|
@@ -174,11 +233,10 @@
|
|
/*
|
|
* Configure GPIO alternate function
|
|
*/
|
|
-void rb532_gpio_set_func(unsigned gpio)
|
|
+static void rb532_gpio_set_func(int bit, unsigned gpio)
|
|
{
|
|
- rb532_set_bit(1, gpio, rb532_gpio_chip->regbase + GPIOFUNC);
|
|
+ rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC);
|
|
}
|
|
-EXPORT_SYMBOL(rb532_gpio_set_func);
|
|
|
|
int __init rb532_gpio_init(void)
|
|
{
|
|
@@ -195,6 +253,20 @@
|
|
/* Register our GPIO chip */
|
|
gpiochip_add(&rb532_gpio_chip->chip);
|
|
|
|
+ r = rb532_dev3_ctl_res;
|
|
+ dev3.base = ioremap_nocache(r->start, r->end - r->start);
|
|
+
|
|
+ if (!dev3.base) {
|
|
+ printk(KERN_ERR "rb532: cannot remap device controller 3\n");
|
|
+ return -ENXIO;
|
|
+ }
|
|
+
|
|
+ /* configure CF_GPIO_NUM as CFRDY IRQ source */
|
|
+ rb532_gpio_set_func(0, CF_GPIO_NUM);
|
|
+ rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM);
|
|
+ rb532_gpio_set_ilevel(1, CF_GPIO_NUM);
|
|
+ rb532_gpio_set_istat(0, CF_GPIO_NUM);
|
|
+
|
|
return 0;
|
|
}
|
|
arch_initcall(rb532_gpio_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/rb532/irq.c linux-2.6.29-rc3.owrt/arch/mips/rb532/irq.c
|
|
--- linux-2.6.29.owrt/arch/mips/rb532/irq.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/rb532/irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -46,7 +46,6 @@
|
|
#include <asm/system.h>
|
|
|
|
#include <asm/mach-rc32434/irq.h>
|
|
-#include <asm/mach-rc32434/gpio.h>
|
|
|
|
struct intr_group {
|
|
u32 mask; /* mask of valid bits in pending/mask registers */
|
|
@@ -151,9 +150,6 @@
|
|
mask |= intr_bit;
|
|
WRITE_MASK(addr, mask);
|
|
|
|
- if (group == GPIO_MAPPED_IRQ_GROUP)
|
|
- rb532_gpio_set_istat(0, irq_nr - GPIO_MAPPED_IRQ_BASE);
|
|
-
|
|
/*
|
|
* if there are no more interrupts enabled in this
|
|
* group, disable corresponding IP
|
|
@@ -169,35 +165,12 @@
|
|
ack_local_irq(group_to_ip(irq_to_group(irq_nr)));
|
|
}
|
|
|
|
-static int rb532_set_type(unsigned int irq_nr, unsigned type)
|
|
-{
|
|
- int gpio = irq_nr - GPIO_MAPPED_IRQ_BASE;
|
|
- int group = irq_to_group(irq_nr);
|
|
-
|
|
- if (group != GPIO_MAPPED_IRQ_GROUP)
|
|
- return (type == IRQ_TYPE_LEVEL_HIGH) ? 0 : -EINVAL;
|
|
-
|
|
- switch (type) {
|
|
- case IRQ_TYPE_LEVEL_HIGH:
|
|
- rb532_gpio_set_ilevel(1, gpio);
|
|
- break;
|
|
- case IRQ_TYPE_LEVEL_LOW:
|
|
- rb532_gpio_set_ilevel(0, gpio);
|
|
- break;
|
|
- default:
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
static struct irq_chip rc32434_irq_type = {
|
|
.name = "RB532",
|
|
.ack = rb532_disable_irq,
|
|
.mask = rb532_disable_irq,
|
|
.mask_ack = rb532_mask_and_ack_irq,
|
|
.unmask = rb532_enable_irq,
|
|
- .set_type = rb532_set_type,
|
|
};
|
|
|
|
void __init arch_init_irq(void)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/rb532/serial.c linux-2.6.29-rc3.owrt/arch/mips/rb532/serial.c
|
|
--- linux-2.6.29.owrt/arch/mips/rb532/serial.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/rb532/serial.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -36,7 +36,7 @@
|
|
extern unsigned int idt_cpu_freq;
|
|
|
|
static struct uart_port rb532_uart = {
|
|
- .flags = UPF_BOOT_AUTOCONF,
|
|
+ .type = PORT_16550A,
|
|
.line = 0,
|
|
.irq = UART0_IRQ,
|
|
.iotype = UPIO_MEM,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/txx9/generic/setup_tx4939.c linux-2.6.29-rc3.owrt/arch/mips/txx9/generic/setup_tx4939.c
|
|
--- linux-2.6.29.owrt/arch/mips/txx9/generic/setup_tx4939.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/txx9/generic/setup_tx4939.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -435,28 +435,6 @@
|
|
platform_device_register(&ata1_dev);
|
|
}
|
|
|
|
-void __init tx4939_rtc_init(void)
|
|
-{
|
|
- static struct resource res[] = {
|
|
- {
|
|
- .start = TX4939_RTC_REG & 0xfffffffffULL,
|
|
- .end = (TX4939_RTC_REG & 0xfffffffffULL) + 0x100 - 1,
|
|
- .flags = IORESOURCE_MEM,
|
|
- }, {
|
|
- .start = TXX9_IRQ_BASE + TX4939_IR_RTC,
|
|
- .flags = IORESOURCE_IRQ,
|
|
- },
|
|
- };
|
|
- static struct platform_device rtc_dev = {
|
|
- .name = "tx4939rtc",
|
|
- .id = -1,
|
|
- .num_resources = ARRAY_SIZE(res),
|
|
- .resource = res,
|
|
- };
|
|
-
|
|
- platform_device_register(&rtc_dev);
|
|
-}
|
|
-
|
|
static void __init tx4939_stop_unused_modules(void)
|
|
{
|
|
__u64 pcfg, rst = 0, ckd = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mips/txx9/rbtx4939/setup.c linux-2.6.29-rc3.owrt/arch/mips/txx9/rbtx4939/setup.c
|
|
--- linux-2.6.29.owrt/arch/mips/txx9/rbtx4939/setup.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mips/txx9/rbtx4939/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -336,7 +336,6 @@
|
|
rbtx4939_led_setup();
|
|
tx4939_wdt_init();
|
|
tx4939_ata_init();
|
|
- tx4939_rtc_init();
|
|
}
|
|
|
|
static void __init rbtx4939_setup(void)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mn10300/Kconfig linux-2.6.29-rc3.owrt/arch/mn10300/Kconfig
|
|
--- linux-2.6.29.owrt/arch/mn10300/Kconfig 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mn10300/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -7,7 +7,6 @@
|
|
|
|
config MN10300
|
|
def_bool y
|
|
- select HAVE_OPROFILE
|
|
|
|
config AM33
|
|
def_bool y
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/mn10300/unit-asb2305/pci.c linux-2.6.29-rc3.owrt/arch/mn10300/unit-asb2305/pci.c
|
|
--- linux-2.6.29.owrt/arch/mn10300/unit-asb2305/pci.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/mn10300/unit-asb2305/pci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -173,7 +173,7 @@
|
|
BRIDGEREGB(where) = value;
|
|
} else {
|
|
if (bus->number == 0 &&
|
|
- (devfn == PCI_DEVFN(2, 0) || devfn == PCI_DEVFN(3, 0))
|
|
+ (devfn == PCI_DEVFN(2, 0) && devfn == PCI_DEVFN(3, 0))
|
|
)
|
|
__pcidebug("<= %02x", bus, devfn, where, value);
|
|
CONFIG_ADDRESS = CONFIG_CMD(bus, devfn, where);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/hpux/fs.c linux-2.6.29-rc3.owrt/arch/parisc/hpux/fs.c
|
|
--- linux-2.6.29.owrt/arch/parisc/hpux/fs.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/hpux/fs.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -137,6 +137,7 @@
|
|
error = count - buf.count;
|
|
}
|
|
|
|
+out_putf:
|
|
fput(file);
|
|
out:
|
|
return error;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/include/asm/assembly.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/assembly.h
|
|
--- linux-2.6.29.owrt/arch/parisc/include/asm/assembly.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/assembly.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -79,7 +79,6 @@
|
|
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/page.h>
|
|
-#include <asm/types.h>
|
|
|
|
#include <asm/asmregs.h>
|
|
|
|
@@ -130,27 +129,27 @@
|
|
|
|
/* Shift Left - note the r and t can NOT be the same! */
|
|
.macro shl r, sa, t
|
|
- dep,z \r, 31-(\sa), 32-(\sa), \t
|
|
+ dep,z \r, 31-\sa, 32-\sa, \t
|
|
.endm
|
|
|
|
/* The PA 2.0 shift left */
|
|
.macro shlw r, sa, t
|
|
- depw,z \r, 31-(\sa), 32-(\sa), \t
|
|
+ depw,z \r, 31-\sa, 32-\sa, \t
|
|
.endm
|
|
|
|
/* And the PA 2.0W shift left */
|
|
.macro shld r, sa, t
|
|
- depd,z \r, 63-(\sa), 64-(\sa), \t
|
|
+ depd,z \r, 63-\sa, 64-\sa, \t
|
|
.endm
|
|
|
|
/* Shift Right - note the r and t can NOT be the same! */
|
|
.macro shr r, sa, t
|
|
- extru \r, 31-(\sa), 32-(\sa), \t
|
|
+ extru \r, 31-\sa, 32-\sa, \t
|
|
.endm
|
|
|
|
/* pa20w version of shift right */
|
|
.macro shrd r, sa, t
|
|
- extrd,u \r, 63-(\sa), 64-(\sa), \t
|
|
+ extrd,u \r, 63-\sa, 64-\sa, \t
|
|
.endm
|
|
|
|
/* load 32-bit 'value' into 'reg' compensating for the ldil
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/include/asm/dma-mapping.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/dma-mapping.h
|
|
--- linux-2.6.29.owrt/arch/parisc/include/asm/dma-mapping.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/dma-mapping.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,7 +5,7 @@
|
|
#include <asm/cacheflush.h>
|
|
#include <asm/scatterlist.h>
|
|
|
|
-/* See Documentation/PCI/PCI-DMA-mapping.txt */
|
|
+/* See Documentation/DMA-mapping.txt */
|
|
struct hppa_dma_ops {
|
|
int (*dma_supported)(struct device *dev, u64 mask);
|
|
void *(*alloc_consistent)(struct device *dev, size_t size, dma_addr_t *iova, gfp_t flag);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/include/asm/io.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/io.h
|
|
--- linux-2.6.29.owrt/arch/parisc/include/asm/io.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/io.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -174,48 +174,15 @@
|
|
*(volatile unsigned long long __force *) addr = b;
|
|
}
|
|
|
|
-static inline unsigned char readb(const volatile void __iomem *addr)
|
|
-{
|
|
- return __raw_readb(addr);
|
|
-}
|
|
-static inline unsigned short readw(const volatile void __iomem *addr)
|
|
-{
|
|
- return le16_to_cpu(__raw_readw(addr));
|
|
-}
|
|
-static inline unsigned int readl(const volatile void __iomem *addr)
|
|
-{
|
|
- return le32_to_cpu(__raw_readl(addr));
|
|
-}
|
|
-static inline unsigned long long readq(const volatile void __iomem *addr)
|
|
-{
|
|
- return le64_to_cpu(__raw_readq(addr));
|
|
-}
|
|
-
|
|
-static inline void writeb(unsigned char b, volatile void __iomem *addr)
|
|
-{
|
|
- __raw_writeb(b, addr);
|
|
-}
|
|
-static inline void writew(unsigned short w, volatile void __iomem *addr)
|
|
-{
|
|
- __raw_writew(cpu_to_le16(w), addr);
|
|
-}
|
|
-static inline void writel(unsigned int l, volatile void __iomem *addr)
|
|
-{
|
|
- __raw_writel(cpu_to_le32(l), addr);
|
|
-}
|
|
-static inline void writeq(unsigned long long q, volatile void __iomem *addr)
|
|
-{
|
|
- __raw_writeq(cpu_to_le64(q), addr);
|
|
-}
|
|
-
|
|
-#define readb readb
|
|
-#define readw readw
|
|
-#define readl readl
|
|
-#define readq readq
|
|
-#define writeb writeb
|
|
-#define writew writew
|
|
-#define writel writel
|
|
-#define writeq writeq
|
|
+/* readb can never be const, so use __fswab instead of le*_to_cpu */
|
|
+#define readb(addr) __raw_readb(addr)
|
|
+#define readw(addr) le16_to_cpu(__raw_readw(addr))
|
|
+#define readl(addr) le32_to_cpu(__raw_readl(addr))
|
|
+#define readq(addr) le64_to_cpu(__raw_readq(addr))
|
|
+#define writeb(b, addr) __raw_writeb(b, addr)
|
|
+#define writew(b, addr) __raw_writew(cpu_to_le16(b), addr)
|
|
+#define writel(b, addr) __raw_writel(cpu_to_le32(b), addr)
|
|
+#define writeq(b, addr) __raw_writeq(cpu_to_le64(b), addr)
|
|
|
|
#define readb_relaxed(addr) readb(addr)
|
|
#define readw_relaxed(addr) readw(addr)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/include/asm/irq.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/irq.h
|
|
--- linux-2.6.29.owrt/arch/parisc/include/asm/irq.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/irq.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -49,7 +49,7 @@
|
|
extern unsigned long txn_affinity_addr(unsigned int irq, int cpu);
|
|
|
|
extern int cpu_claim_irq(unsigned int irq, struct irq_chip *, void *);
|
|
-extern int cpu_check_affinity(unsigned int irq, const struct cpumask *dest);
|
|
+extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest);
|
|
|
|
/* soft power switch support (power.c) */
|
|
extern struct tasklet_struct power_tasklet;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/include/asm/uaccess.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/uaccess.h
|
|
--- linux-2.6.29.owrt/arch/parisc/include/asm/uaccess.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/uaccess.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -241,7 +241,6 @@
|
|
#define __copy_to_user_inatomic __copy_to_user
|
|
#define __copy_from_user_inatomic __copy_from_user
|
|
|
|
-struct pt_regs;
|
|
int fixup_exception(struct pt_regs *regs);
|
|
|
|
#endif /* __PARISC_UACCESS_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/kernel/cache.c linux-2.6.29-rc3.owrt/arch/parisc/kernel/cache.c
|
|
--- linux-2.6.29.owrt/arch/parisc/kernel/cache.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/cache.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -551,7 +551,10 @@
|
|
{
|
|
int sr3;
|
|
|
|
- BUG_ON(!vma->vm_mm->context);
|
|
+ if (!vma->vm_mm->context) {
|
|
+ BUG();
|
|
+ return;
|
|
+ }
|
|
|
|
sr3 = mfsp(3);
|
|
if (vma->vm_mm->context == sr3) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/kernel/entry.S linux-2.6.29-rc3.owrt/arch/parisc/kernel/entry.S
|
|
--- linux-2.6.29.owrt/arch/parisc/kernel/entry.S 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/entry.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -368,7 +368,7 @@
|
|
* abstractions for the macros */
|
|
.macro EXTR reg1,start,length,reg2
|
|
#ifdef CONFIG_64BIT
|
|
- extrd,u \reg1,32+(\start),\length,\reg2
|
|
+ extrd,u \reg1,32+\start,\length,\reg2
|
|
#else
|
|
extrw,u \reg1,\start,\length,\reg2
|
|
#endif
|
|
@@ -376,7 +376,7 @@
|
|
|
|
.macro DEP reg1,start,length,reg2
|
|
#ifdef CONFIG_64BIT
|
|
- depd \reg1,32+(\start),\length,\reg2
|
|
+ depd \reg1,32+\start,\length,\reg2
|
|
#else
|
|
depw \reg1,\start,\length,\reg2
|
|
#endif
|
|
@@ -384,7 +384,7 @@
|
|
|
|
.macro DEPI val,start,length,reg
|
|
#ifdef CONFIG_64BIT
|
|
- depdi \val,32+(\start),\length,\reg
|
|
+ depdi \val,32+\start,\length,\reg
|
|
#else
|
|
depwi \val,\start,\length,\reg
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/kernel/firmware.c linux-2.6.29-rc3.owrt/arch/parisc/kernel/firmware.c
|
|
--- linux-2.6.29.owrt/arch/parisc/kernel/firmware.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/firmware.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -151,7 +151,7 @@
|
|
}
|
|
|
|
#ifdef CONFIG_64BIT
|
|
-void __cpuinit set_firmware_width_unlocked(void)
|
|
+void __init set_firmware_width_unlocked(void)
|
|
{
|
|
int ret;
|
|
|
|
@@ -168,7 +168,7 @@
|
|
* This function must be called before any pdc_* function that uses the
|
|
* convert_to_wide function.
|
|
*/
|
|
-void __cpuinit set_firmware_width(void)
|
|
+void __init set_firmware_width(void)
|
|
{
|
|
unsigned long flags;
|
|
spin_lock_irqsave(&pdc_lock, flags);
|
|
@@ -176,11 +176,11 @@
|
|
spin_unlock_irqrestore(&pdc_lock, flags);
|
|
}
|
|
#else
|
|
-void __cpuinit set_firmware_width_unlocked(void) {
|
|
+void __init set_firmware_width_unlocked(void) {
|
|
return;
|
|
}
|
|
|
|
-void __cpuinit set_firmware_width(void) {
|
|
+void __init set_firmware_width(void) {
|
|
return;
|
|
}
|
|
#endif /*CONFIG_64BIT*/
|
|
@@ -302,7 +302,7 @@
|
|
return retval;
|
|
}
|
|
|
|
-int __cpuinit pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)
|
|
+int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)
|
|
{
|
|
int ret;
|
|
|
|
@@ -323,7 +323,7 @@
|
|
* This PDC call returns the presence and status of all the coprocessors
|
|
* attached to the processor.
|
|
*/
|
|
-int __cpuinit pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
|
|
+int __init pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
|
|
{
|
|
int ret;
|
|
unsigned long flags;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/kernel/irq.c linux-2.6.29-rc3.owrt/arch/parisc/kernel/irq.c
|
|
--- linux-2.6.29.owrt/arch/parisc/kernel/irq.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -112,7 +112,7 @@
|
|
}
|
|
|
|
#ifdef CONFIG_SMP
|
|
-int cpu_check_affinity(unsigned int irq, const struct cpumask *dest)
|
|
+int cpu_check_affinity(unsigned int irq, cpumask_t *dest)
|
|
{
|
|
int cpu_dest;
|
|
|
|
@@ -120,25 +120,23 @@
|
|
if (CHECK_IRQ_PER_CPU(irq)) {
|
|
/* Bad linux design decision. The mask has already
|
|
* been set; we must reset it */
|
|
- cpumask_setall(&irq_desc[irq].affinity);
|
|
+ irq_desc[irq].affinity = CPU_MASK_ALL;
|
|
return -EINVAL;
|
|
}
|
|
|
|
/* whatever mask they set, we just allow one CPU */
|
|
cpu_dest = first_cpu(*dest);
|
|
+ *dest = cpumask_of_cpu(cpu_dest);
|
|
|
|
- return cpu_dest;
|
|
+ return 0;
|
|
}
|
|
|
|
static void cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest)
|
|
{
|
|
- int cpu_dest;
|
|
-
|
|
- cpu_dest = cpu_check_affinity(irq, dest);
|
|
- if (cpu_dest < 0)
|
|
+ if (cpu_check_affinity(irq, dest))
|
|
return;
|
|
|
|
- cpumask_copy(&irq_desc[irq].affinity, &cpumask_of_cpu(cpu_dest));
|
|
+ irq_desc[irq].affinity = *dest;
|
|
}
|
|
#endif
|
|
|
|
@@ -297,7 +295,7 @@
|
|
unsigned long txn_affinity_addr(unsigned int irq, int cpu)
|
|
{
|
|
#ifdef CONFIG_SMP
|
|
- cpumask_copy(&irq_desc[irq].affinity, cpumask_of(cpu));
|
|
+ irq_desc[irq].affinity = cpumask_of_cpu(cpu);
|
|
#endif
|
|
|
|
return per_cpu(cpu_data, cpu).txn_addr;
|
|
@@ -354,7 +352,7 @@
|
|
irq = eirr_to_irq(eirr_val);
|
|
|
|
#ifdef CONFIG_SMP
|
|
- cpumask_copy(&dest, &irq_desc[irq].affinity);
|
|
+ dest = irq_desc[irq].affinity;
|
|
if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) &&
|
|
!cpu_isset(smp_processor_id(), dest)) {
|
|
int cpu = first_cpu(dest);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/kernel/pci-dma.c linux-2.6.29-rc3.owrt/arch/parisc/kernel/pci-dma.c
|
|
--- linux-2.6.29.owrt/arch/parisc/kernel/pci-dma.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/pci-dma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
** PARISC 1.1 Dynamic DMA mapping support.
|
|
** This implementation is for PA-RISC platforms that do not support
|
|
** I/O TLBs (aka DMA address translation hardware).
|
|
-** See Documentation/PCI/PCI-DMA-mapping.txt for interface definitions.
|
|
+** See Documentation/DMA-mapping.txt for interface definitions.
|
|
**
|
|
** (c) Copyright 1999,2000 Hewlett-Packard Company
|
|
** (c) Copyright 2000 Grant Grundler
|
|
@@ -447,7 +447,10 @@
|
|
|
|
static dma_addr_t pa11_dma_map_single(struct device *dev, void *addr, size_t size, enum dma_data_direction direction)
|
|
{
|
|
- BUG_ON(direction == DMA_NONE);
|
|
+ if (direction == DMA_NONE) {
|
|
+ printk(KERN_ERR "pa11_dma_map_single(PCI_DMA_NONE) called by %p\n", __builtin_return_address(0));
|
|
+ BUG();
|
|
+ }
|
|
|
|
flush_kernel_dcache_range((unsigned long) addr, size);
|
|
return virt_to_phys(addr);
|
|
@@ -455,7 +458,10 @@
|
|
|
|
static void pa11_dma_unmap_single(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
|
|
{
|
|
- BUG_ON(direction == DMA_NONE);
|
|
+ if (direction == DMA_NONE) {
|
|
+ printk(KERN_ERR "pa11_dma_unmap_single(PCI_DMA_NONE) called by %p\n", __builtin_return_address(0));
|
|
+ BUG();
|
|
+ }
|
|
|
|
if (direction == DMA_TO_DEVICE)
|
|
return;
|
|
@@ -474,7 +480,8 @@
|
|
{
|
|
int i;
|
|
|
|
- BUG_ON(direction == DMA_NONE);
|
|
+ if (direction == DMA_NONE)
|
|
+ BUG();
|
|
|
|
for (i = 0; i < nents; i++, sglist++ ) {
|
|
unsigned long vaddr = sg_virt_addr(sglist);
|
|
@@ -489,7 +496,8 @@
|
|
{
|
|
int i;
|
|
|
|
- BUG_ON(direction == DMA_NONE);
|
|
+ if (direction == DMA_NONE)
|
|
+ BUG();
|
|
|
|
if (direction == DMA_TO_DEVICE)
|
|
return;
|
|
@@ -503,14 +511,16 @@
|
|
|
|
static void pa11_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction)
|
|
{
|
|
- BUG_ON(direction == DMA_NONE);
|
|
+ if (direction == DMA_NONE)
|
|
+ BUG();
|
|
|
|
flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size);
|
|
}
|
|
|
|
static void pa11_dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction)
|
|
{
|
|
- BUG_ON(direction == DMA_NONE);
|
|
+ if (direction == DMA_NONE)
|
|
+ BUG();
|
|
|
|
flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/parisc/mm/init.c linux-2.6.29-rc3.owrt/arch/parisc/mm/init.c
|
|
--- linux-2.6.29.owrt/arch/parisc/mm/init.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/parisc/mm/init.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -304,8 +304,10 @@
|
|
*/
|
|
max_low_pfn = max_pfn;
|
|
|
|
- /* bootmap sizing messed up? */
|
|
- BUG_ON((bootmap_pfn - bootmap_start_pfn) != bootmap_pages);
|
|
+ if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) {
|
|
+ printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n");
|
|
+ BUG();
|
|
+ }
|
|
|
|
/* reserve PAGE0 pdc memory, kernel text/data/bss & bootmap */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/boot/dts/mpc8313erdb.dts linux-2.6.29-rc3.owrt/arch/powerpc/boot/dts/mpc8313erdb.dts
|
|
--- linux-2.6.29.owrt/arch/powerpc/boot/dts/mpc8313erdb.dts 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/boot/dts/mpc8313erdb.dts 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -191,8 +191,7 @@
|
|
interrupts = <37 0x8 36 0x8 35 0x8>;
|
|
interrupt-parent = <&ipic>;
|
|
tbi-handle = < &tbi0 >;
|
|
- /* Vitesse 7385 isn't on the MDIO bus */
|
|
- fixed-link = <1 1 1000 0 0>;
|
|
+ phy-handle = < &phy1 >;
|
|
fsl,magic-packet;
|
|
|
|
mdio@24520 {
|
|
@@ -200,6 +199,12 @@
|
|
#size-cells = <0>;
|
|
compatible = "fsl,gianfar-mdio";
|
|
reg = <0x24520 0x20>;
|
|
+ phy1: ethernet-phy@1 {
|
|
+ interrupt-parent = <&ipic>;
|
|
+ interrupts = <19 0x8>;
|
|
+ reg = <0x1>;
|
|
+ device_type = "ethernet-phy";
|
|
+ };
|
|
phy4: ethernet-phy@4 {
|
|
interrupt-parent = <&ipic>;
|
|
interrupts = <20 0x8>;
|
|
@@ -214,8 +219,6 @@
|
|
};
|
|
|
|
enet1: ethernet@25000 {
|
|
- #address-cells = <1>;
|
|
- #size-cells = <1>;
|
|
cell-index = <1>;
|
|
device_type = "network";
|
|
model = "eTSEC";
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/include/asm/compat.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/compat.h
|
|
--- linux-2.6.29.owrt/arch/powerpc/include/asm/compat.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/compat.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -210,10 +210,5 @@
|
|
compat_ulong_t __unused6;
|
|
};
|
|
|
|
-static inline int is_compat_task(void)
|
|
-{
|
|
- return test_thread_flag(TIF_32BIT);
|
|
-}
|
|
-
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _ASM_POWERPC_COMPAT_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/include/asm/cputable.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/cputable.h
|
|
--- linux-2.6.29.owrt/arch/powerpc/include/asm/cputable.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/cputable.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -241,11 +241,9 @@
|
|
/* We need to mark all pages as being coherent if we're SMP or we have a
|
|
* 74[45]x and an MPC107 host bridge. Also 83xx and PowerQUICC II
|
|
* require it for PCI "streaming/prefetch" to work properly.
|
|
- * This is also required by 52xx family.
|
|
*/
|
|
#if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE) \
|
|
- || defined(CONFIG_PPC_83xx) || defined(CONFIG_8260) \
|
|
- || defined(CONFIG_PPC_MPC52xx)
|
|
+ || defined(CONFIG_PPC_83xx) || defined(CONFIG_8260)
|
|
#define CPU_FTR_COMMON CPU_FTR_NEED_COHERENT
|
|
#else
|
|
#define CPU_FTR_COMMON 0
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-4k.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-4k.h
|
|
--- linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-4k.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-4k.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -60,7 +60,7 @@
|
|
/* It should be preserving the high 48 bits and then specifically */
|
|
/* preserving _PAGE_SECONDARY | _PAGE_GROUP_IX */
|
|
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
|
|
- _PAGE_HPTEFLAGS | _PAGE_SPECIAL)
|
|
+ _PAGE_HPTEFLAGS)
|
|
|
|
/* Bits to mask out from a PMD to get to the PTE page */
|
|
#define PMD_MASKED_BITS 0
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-64k.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-64k.h
|
|
--- linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-64k.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-64k.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -114,7 +114,7 @@
|
|
* pgprot changes
|
|
*/
|
|
#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \
|
|
- _PAGE_ACCESSED | _PAGE_SPECIAL)
|
|
+ _PAGE_ACCESSED)
|
|
|
|
/* Bits to mask out from a PMD to get to the PTE page */
|
|
#define PMD_MASKED_BITS 0x1ff
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-ppc32.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-ppc32.h
|
|
--- linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-ppc32.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-ppc32.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -429,8 +429,7 @@
|
|
#define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE()
|
|
#endif
|
|
|
|
-#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
|
|
- _PAGE_SPECIAL)
|
|
+#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
|
|
|
|
|
|
#define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/include/asm/seccomp.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/seccomp.h
|
|
--- linux-2.6.29.owrt/arch/powerpc/include/asm/seccomp.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/seccomp.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,6 +1,10 @@
|
|
#ifndef _ASM_POWERPC_SECCOMP_H
|
|
#define _ASM_POWERPC_SECCOMP_H
|
|
|
|
+#ifdef __KERNEL__
|
|
+#include <linux/thread_info.h>
|
|
+#endif
|
|
+
|
|
#include <linux/unistd.h>
|
|
|
|
#define __NR_seccomp_read __NR_read
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/kernel/align.c linux-2.6.29-rc3.owrt/arch/powerpc/kernel/align.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/kernel/align.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/kernel/align.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -367,24 +367,27 @@
|
|
static int emulate_fp_pair(unsigned char __user *addr, unsigned int reg,
|
|
unsigned int flags)
|
|
{
|
|
- char *ptr0 = (char *) ¤t->thread.TS_FPR(reg);
|
|
- char *ptr1 = (char *) ¤t->thread.TS_FPR(reg+1);
|
|
- int i, ret, sw = 0;
|
|
+ char *ptr = (char *) ¤t->thread.TS_FPR(reg);
|
|
+ int i, ret;
|
|
|
|
if (!(flags & F))
|
|
return 0;
|
|
if (reg & 1)
|
|
return 0; /* invalid form: FRS/FRT must be even */
|
|
- if (flags & SW)
|
|
- sw = 7;
|
|
- ret = 0;
|
|
- for (i = 0; i < 8; ++i) {
|
|
- if (!(flags & ST)) {
|
|
- ret |= __get_user(ptr0[i^sw], addr + i);
|
|
- ret |= __get_user(ptr1[i^sw], addr + i + 8);
|
|
- } else {
|
|
- ret |= __put_user(ptr0[i^sw], addr + i);
|
|
- ret |= __put_user(ptr1[i^sw], addr + i + 8);
|
|
+ if (!(flags & SW)) {
|
|
+ /* not byte-swapped - easy */
|
|
+ if (!(flags & ST))
|
|
+ ret = __copy_from_user(ptr, addr, 16);
|
|
+ else
|
|
+ ret = __copy_to_user(addr, ptr, 16);
|
|
+ } else {
|
|
+ /* each FPR value is byte-swapped separately */
|
|
+ ret = 0;
|
|
+ for (i = 0; i < 16; ++i) {
|
|
+ if (!(flags & ST))
|
|
+ ret |= __get_user(ptr[i^7], addr + i);
|
|
+ else
|
|
+ ret |= __put_user(ptr[i^7], addr + i);
|
|
}
|
|
}
|
|
if (ret)
|
|
@@ -643,16 +646,11 @@
|
|
unsigned int areg, struct pt_regs *regs,
|
|
unsigned int flags, unsigned int length)
|
|
{
|
|
- char *ptr;
|
|
+ char *ptr = (char *) ¤t->thread.TS_FPR(reg);
|
|
int ret = 0;
|
|
|
|
flush_vsx_to_thread(current);
|
|
|
|
- if (reg < 32)
|
|
- ptr = (char *) ¤t->thread.TS_FPR(reg);
|
|
- else
|
|
- ptr = (char *) ¤t->thread.vr[reg - 32];
|
|
-
|
|
if (flags & ST)
|
|
ret = __copy_to_user(addr, ptr, length);
|
|
else {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/kernel/ftrace.c linux-2.6.29-rc3.owrt/arch/powerpc/kernel/ftrace.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/kernel/ftrace.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/kernel/ftrace.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -195,9 +195,8 @@
|
|
return -EINVAL;
|
|
}
|
|
|
|
- /* The bottom half is signed extended */
|
|
- offset = ((unsigned)((unsigned short)jmp[0]) << 16) +
|
|
- (int)((short)jmp[1]);
|
|
+ offset = (unsigned)((unsigned short)jmp[0]) << 16 |
|
|
+ (unsigned)((unsigned short)jmp[1]);
|
|
|
|
DEBUGP(" %x ", offset);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/kernel/head_32.S linux-2.6.29-rc3.owrt/arch/powerpc/kernel/head_32.S
|
|
--- linux-2.6.29.owrt/arch/powerpc/kernel/head_32.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/kernel/head_32.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -511,11 +511,8 @@
|
|
and r1,r1,r2 /* writable if _RW and _DIRTY */
|
|
rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
|
|
rlwimi r3,r3,32-1,31,31 /* _PAGE_USER -> PP lsb */
|
|
- ori r1,r1,0xe04 /* clear out reserved bits */
|
|
+ ori r1,r1,0xe14 /* clear out reserved bits and M */
|
|
andc r1,r3,r1 /* PP = user? (rw&dirty? 2: 3): 0 */
|
|
-BEGIN_FTR_SECTION
|
|
- rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
|
|
-END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
|
|
mtspr SPRN_RPA,r1
|
|
mfspr r3,SPRN_IMISS
|
|
tlbli r3
|
|
@@ -588,11 +585,8 @@
|
|
and r1,r1,r2 /* writable if _RW and _DIRTY */
|
|
rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
|
|
rlwimi r3,r3,32-1,31,31 /* _PAGE_USER -> PP lsb */
|
|
- ori r1,r1,0xe04 /* clear out reserved bits */
|
|
+ ori r1,r1,0xe14 /* clear out reserved bits and M */
|
|
andc r1,r3,r1 /* PP = user? (rw&dirty? 2: 3): 0 */
|
|
-BEGIN_FTR_SECTION
|
|
- rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
|
|
-END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
|
|
mtspr SPRN_RPA,r1
|
|
mfspr r3,SPRN_DMISS
|
|
tlbld r3
|
|
@@ -659,11 +653,8 @@
|
|
stw r3,0(r2) /* update PTE (accessed/dirty bits) */
|
|
/* Convert linux-style PTE to low word of PPC-style PTE */
|
|
rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
|
|
- li r1,0xe05 /* clear out reserved bits & PP lsb */
|
|
+ li r1,0xe15 /* clear out reserved bits and M */
|
|
andc r1,r3,r1 /* PP = user? 2: 0 */
|
|
-BEGIN_FTR_SECTION
|
|
- rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
|
|
-END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
|
|
mtspr SPRN_RPA,r1
|
|
mfspr r3,SPRN_DMISS
|
|
tlbld r3
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/kernel/pci-common.c linux-2.6.29-rc3.owrt/arch/powerpc/kernel/pci-common.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/kernel/pci-common.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/kernel/pci-common.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -16,6 +16,8 @@
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
+#define DEBUG
|
|
+
|
|
#include <linux/kernel.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/string.h>
|
|
@@ -256,8 +258,7 @@
|
|
} else {
|
|
pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n",
|
|
oirq.size, oirq.specifier[0], oirq.specifier[1],
|
|
- oirq.controller ? oirq.controller->full_name :
|
|
- "<default>");
|
|
+ oirq.controller->full_name);
|
|
|
|
virq = irq_create_of_mapping(oirq.controller, oirq.specifier,
|
|
oirq.size);
|
|
@@ -561,21 +562,8 @@
|
|
(unsigned long long)(offset + size - 1));
|
|
|
|
if (mmap_state == pci_mmap_mem) {
|
|
- /* Hack alert !
|
|
- *
|
|
- * Because X is lame and can fail starting if it gets an error trying
|
|
- * to mmap legacy_mem (instead of just moving on without legacy memory
|
|
- * access) we fake it here by giving it anonymous memory, effectively
|
|
- * behaving just like /dev/zero
|
|
- */
|
|
- if ((offset + size) > hose->isa_mem_size) {
|
|
- printk(KERN_DEBUG
|
|
- "Process %s (pid:%d) mapped non-existing PCI legacy memory for 0%04x:%02x\n",
|
|
- current->comm, current->pid, pci_domain_nr(bus), bus->number);
|
|
- if (vma->vm_flags & VM_SHARED)
|
|
- return shmem_zero_setup(vma);
|
|
- return 0;
|
|
- }
|
|
+ if ((offset + size) > hose->isa_mem_size)
|
|
+ return -ENXIO;
|
|
offset += hose->isa_mem_phys;
|
|
} else {
|
|
unsigned long io_offset = (unsigned long)hose->io_base_virt - _IO_BASE;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/kvm/powerpc.c linux-2.6.29-rc3.owrt/arch/powerpc/kvm/powerpc.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/kvm/powerpc.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/kvm/powerpc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -125,10 +125,6 @@
|
|
}
|
|
}
|
|
|
|
-void kvm_arch_sync_events(struct kvm *kvm)
|
|
-{
|
|
-}
|
|
-
|
|
void kvm_arch_destroy_vm(struct kvm *kvm)
|
|
{
|
|
kvmppc_free_vcpus(kvm);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/lib/copyuser_64.S linux-2.6.29-rc3.owrt/arch/powerpc/lib/copyuser_64.S
|
|
--- linux-2.6.29.owrt/arch/powerpc/lib/copyuser_64.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/lib/copyuser_64.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -62,19 +62,18 @@
|
|
72: std r8,8(r3)
|
|
beq+ 3f
|
|
addi r3,r3,16
|
|
+23: ld r9,8(r4)
|
|
.Ldo_tail:
|
|
bf cr7*4+1,1f
|
|
-23: lwz r9,8(r4)
|
|
- addi r4,r4,4
|
|
+ rotldi r9,r9,32
|
|
73: stw r9,0(r3)
|
|
addi r3,r3,4
|
|
1: bf cr7*4+2,2f
|
|
-44: lhz r9,8(r4)
|
|
- addi r4,r4,2
|
|
+ rotldi r9,r9,16
|
|
74: sth r9,0(r3)
|
|
addi r3,r3,2
|
|
2: bf cr7*4+3,3f
|
|
-45: lbz r9,8(r4)
|
|
+ rotldi r9,r9,8
|
|
75: stb r9,0(r3)
|
|
3: li r3,0
|
|
blr
|
|
@@ -142,24 +141,11 @@
|
|
6: cmpwi cr1,r5,8
|
|
addi r3,r3,32
|
|
sld r9,r9,r10
|
|
- ble cr1,7f
|
|
+ ble cr1,.Ldo_tail
|
|
34: ld r0,8(r4)
|
|
srd r7,r0,r11
|
|
or r9,r7,r9
|
|
-7:
|
|
- bf cr7*4+1,1f
|
|
- rotldi r9,r9,32
|
|
-94: stw r9,0(r3)
|
|
- addi r3,r3,4
|
|
-1: bf cr7*4+2,2f
|
|
- rotldi r9,r9,16
|
|
-95: sth r9,0(r3)
|
|
- addi r3,r3,2
|
|
-2: bf cr7*4+3,3f
|
|
- rotldi r9,r9,8
|
|
-96: stb r9,0(r3)
|
|
-3: li r3,0
|
|
- blr
|
|
+ b .Ldo_tail
|
|
|
|
.Ldst_unaligned:
|
|
PPC_MTOCRF 0x01,r6 /* put #bytes to 8B bdry into cr7 */
|
|
@@ -232,6 +218,7 @@
|
|
121:
|
|
132:
|
|
addi r3,r3,8
|
|
+123:
|
|
134:
|
|
135:
|
|
138:
|
|
@@ -239,9 +226,6 @@
|
|
140:
|
|
141:
|
|
142:
|
|
-123:
|
|
-144:
|
|
-145:
|
|
|
|
/*
|
|
* here we have had a fault on a load and r3 points to the first
|
|
@@ -325,9 +309,6 @@
|
|
187:
|
|
188:
|
|
189:
|
|
-194:
|
|
-195:
|
|
-196:
|
|
1:
|
|
ld r6,-24(r1)
|
|
ld r5,-8(r1)
|
|
@@ -348,9 +329,7 @@
|
|
.llong 72b,172b
|
|
.llong 23b,123b
|
|
.llong 73b,173b
|
|
- .llong 44b,144b
|
|
.llong 74b,174b
|
|
- .llong 45b,145b
|
|
.llong 75b,175b
|
|
.llong 24b,124b
|
|
.llong 25b,125b
|
|
@@ -368,9 +347,6 @@
|
|
.llong 79b,179b
|
|
.llong 80b,180b
|
|
.llong 34b,134b
|
|
- .llong 94b,194b
|
|
- .llong 95b,195b
|
|
- .llong 96b,196b
|
|
.llong 35b,135b
|
|
.llong 81b,181b
|
|
.llong 36b,136b
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/lib/memcpy_64.S linux-2.6.29-rc3.owrt/arch/powerpc/lib/memcpy_64.S
|
|
--- linux-2.6.29.owrt/arch/powerpc/lib/memcpy_64.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/lib/memcpy_64.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -53,19 +53,18 @@
|
|
3: std r8,8(r3)
|
|
beq 3f
|
|
addi r3,r3,16
|
|
+ ld r9,8(r4)
|
|
.Ldo_tail:
|
|
bf cr7*4+1,1f
|
|
- lwz r9,8(r4)
|
|
- addi r4,r4,4
|
|
+ rotldi r9,r9,32
|
|
stw r9,0(r3)
|
|
addi r3,r3,4
|
|
1: bf cr7*4+2,2f
|
|
- lhz r9,8(r4)
|
|
- addi r4,r4,2
|
|
+ rotldi r9,r9,16
|
|
sth r9,0(r3)
|
|
addi r3,r3,2
|
|
2: bf cr7*4+3,3f
|
|
- lbz r9,8(r4)
|
|
+ rotldi r9,r9,8
|
|
stb r9,0(r3)
|
|
3: ld r3,48(r1) /* return dest pointer */
|
|
blr
|
|
@@ -134,24 +133,11 @@
|
|
cmpwi cr1,r5,8
|
|
addi r3,r3,32
|
|
sld r9,r9,r10
|
|
- ble cr1,6f
|
|
+ ble cr1,.Ldo_tail
|
|
ld r0,8(r4)
|
|
srd r7,r0,r11
|
|
or r9,r7,r9
|
|
-6:
|
|
- bf cr7*4+1,1f
|
|
- rotldi r9,r9,32
|
|
- stw r9,0(r3)
|
|
- addi r3,r3,4
|
|
-1: bf cr7*4+2,2f
|
|
- rotldi r9,r9,16
|
|
- sth r9,0(r3)
|
|
- addi r3,r3,2
|
|
-2: bf cr7*4+3,3f
|
|
- rotldi r9,r9,8
|
|
- stb r9,0(r3)
|
|
-3: ld r3,48(r1) /* return dest pointer */
|
|
- blr
|
|
+ b .Ldo_tail
|
|
|
|
.Ldst_unaligned:
|
|
PPC_MTOCRF 0x01,r6 # put #bytes to 8B bdry into cr7
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/lib/sstep.c linux-2.6.29-rc3.owrt/arch/powerpc/lib/sstep.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/lib/sstep.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/lib/sstep.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -172,8 +172,6 @@
|
|
}
|
|
break;
|
|
case 0x378: /* orx */
|
|
- if (instr & 1)
|
|
- break;
|
|
rs = (instr >> 21) & 0x1f;
|
|
rb = (instr >> 11) & 0x1f;
|
|
if (rs == rb) { /* mr */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/mm/fsl_booke_mmu.c linux-2.6.29-rc3.owrt/arch/powerpc/mm/fsl_booke_mmu.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/mm/fsl_booke_mmu.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/mm/fsl_booke_mmu.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -73,7 +73,7 @@
|
|
/*
|
|
* Return PA for this VA if it is mapped by a CAM, or 0
|
|
*/
|
|
-phys_addr_t v_mapped_by_tlbcam(unsigned long va)
|
|
+unsigned long v_mapped_by_tlbcam(unsigned long va)
|
|
{
|
|
int b;
|
|
for (b = 0; b < tlbcam_index; ++b)
|
|
@@ -85,7 +85,7 @@
|
|
/*
|
|
* Return VA for a given PA or 0 if not mapped
|
|
*/
|
|
-unsigned long p_mapped_by_tlbcam(phys_addr_t pa)
|
|
+unsigned long p_mapped_by_tlbcam(unsigned long pa)
|
|
{
|
|
int b;
|
|
for (b = 0; b < tlbcam_index; ++b)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/mm/hash_low_32.S linux-2.6.29-rc3.owrt/arch/powerpc/mm/hash_low_32.S
|
|
--- linux-2.6.29.owrt/arch/powerpc/mm/hash_low_32.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/mm/hash_low_32.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -320,7 +320,7 @@
|
|
and r8,r8,r0 /* writable if _RW & _DIRTY */
|
|
rlwimi r5,r5,32-1,30,30 /* _PAGE_USER -> PP msb */
|
|
rlwimi r5,r5,32-2,31,31 /* _PAGE_USER -> PP lsb */
|
|
- ori r8,r8,0xe04 /* clear out reserved bits */
|
|
+ ori r8,r8,0xe14 /* clear out reserved bits and M */
|
|
andc r8,r5,r8 /* PP = user? (rw&dirty? 2: 3): 0 */
|
|
BEGIN_FTR_SECTION
|
|
rlwinm r8,r8,0,~_PAGE_COHERENT /* clear M (coherence not required) */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/mm/numa.c linux-2.6.29-rc3.owrt/arch/powerpc/mm/numa.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/mm/numa.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/mm/numa.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
#include <linux/notifier.h>
|
|
#include <linux/lmb.h>
|
|
#include <linux/of.h>
|
|
-#include <linux/pfn.h>
|
|
#include <asm/sparsemem.h>
|
|
#include <asm/prom.h>
|
|
#include <asm/system.h>
|
|
@@ -883,7 +882,7 @@
|
|
unsigned long physbase = lmb.reserved.region[i].base;
|
|
unsigned long size = lmb.reserved.region[i].size;
|
|
unsigned long start_pfn = physbase >> PAGE_SHIFT;
|
|
- unsigned long end_pfn = PFN_UP(physbase + size);
|
|
+ unsigned long end_pfn = ((physbase + size) >> PAGE_SHIFT);
|
|
struct node_active_region node_ar;
|
|
unsigned long node_end_pfn = node->node_start_pfn +
|
|
node->node_spanned_pages;
|
|
@@ -909,7 +908,7 @@
|
|
*/
|
|
if (end_pfn > node_ar.end_pfn)
|
|
reserve_size = (node_ar.end_pfn << PAGE_SHIFT)
|
|
- - physbase;
|
|
+ - (start_pfn << PAGE_SHIFT);
|
|
/*
|
|
* Only worry about *this* node, others may not
|
|
* yet have valid NODE_DATA().
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/mm/pgtable_32.c linux-2.6.29-rc3.owrt/arch/powerpc/mm/pgtable_32.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/mm/pgtable_32.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/mm/pgtable_32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -61,8 +61,8 @@
|
|
|
|
#ifdef HAVE_TLBCAM
|
|
extern unsigned int tlbcam_index;
|
|
-extern phys_addr_t v_mapped_by_tlbcam(unsigned long va);
|
|
-extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa);
|
|
+extern unsigned long v_mapped_by_tlbcam(unsigned long va);
|
|
+extern unsigned long p_mapped_by_tlbcam(unsigned long pa);
|
|
#else /* !HAVE_TLBCAM */
|
|
#define v_mapped_by_tlbcam(x) (0UL)
|
|
#define p_mapped_by_tlbcam(x) (0UL)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/oprofile/cell/spu_profiler.c linux-2.6.29-rc3.owrt/arch/powerpc/oprofile/cell/spu_profiler.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/oprofile/cell/spu_profiler.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/oprofile/cell/spu_profiler.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -16,7 +16,6 @@
|
|
#include <linux/smp.h>
|
|
#include <linux/slab.h>
|
|
#include <asm/cell-pmu.h>
|
|
-#include <asm/time.h>
|
|
#include "pr_util.h"
|
|
|
|
#define SCALE_SHIFT 14
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/platforms/52xx/mpc52xx_pci.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/52xx/mpc52xx_pci.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/platforms/52xx/mpc52xx_pci.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/52xx/mpc52xx_pci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -20,6 +20,14 @@
|
|
|
|
|
|
/* ======================================================================== */
|
|
+/* PCI windows config */
|
|
+/* ======================================================================== */
|
|
+
|
|
+#define MPC52xx_PCI_TARGET_IO 0xf0000000
|
|
+#define MPC52xx_PCI_TARGET_MEM 0x00000000
|
|
+
|
|
+
|
|
+/* ======================================================================== */
|
|
/* Structures mapping & Defines for PCI Unit */
|
|
/* ======================================================================== */
|
|
|
|
@@ -236,7 +244,7 @@
|
|
|
|
static void __init
|
|
mpc52xx_pci_setup(struct pci_controller *hose,
|
|
- struct mpc52xx_pci __iomem *pci_regs, phys_addr_t pci_phys)
|
|
+ struct mpc52xx_pci __iomem *pci_regs)
|
|
{
|
|
struct resource *res;
|
|
u32 tmp;
|
|
@@ -306,14 +314,10 @@
|
|
/* Set all the IWCR fields at once; they're in the same reg */
|
|
out_be32(&pci_regs->iwcr, MPC52xx_PCI_IWCR_PACK(iwcr0, iwcr1, iwcr2));
|
|
|
|
- /* Map IMMR onto PCI bus */
|
|
- pci_phys &= 0xfffc0000; /* bar0 has only 14 significant bits */
|
|
- out_be32(&pci_regs->tbatr0, MPC52xx_PCI_TBATR_ENABLE | pci_phys);
|
|
- out_be32(&pci_regs->bar0, PCI_BASE_ADDRESS_MEM_PREFETCH | pci_phys);
|
|
-
|
|
- /* Map memory onto PCI bus */
|
|
- out_be32(&pci_regs->tbatr1, MPC52xx_PCI_TBATR_ENABLE);
|
|
- out_be32(&pci_regs->bar1, PCI_BASE_ADDRESS_MEM_PREFETCH);
|
|
+ out_be32(&pci_regs->tbatr0,
|
|
+ MPC52xx_PCI_TBATR_ENABLE | MPC52xx_PCI_TARGET_IO );
|
|
+ out_be32(&pci_regs->tbatr1,
|
|
+ MPC52xx_PCI_TBATR_ENABLE | MPC52xx_PCI_TARGET_MEM );
|
|
|
|
out_be32(&pci_regs->tcr, MPC52xx_PCI_TCR_LD | MPC52xx_PCI_TCR_WCT8);
|
|
|
|
@@ -410,7 +414,7 @@
|
|
|
|
/* Finish setting up PCI using values obtained by
|
|
* pci_proces_bridge_OF_ranges */
|
|
- mpc52xx_pci_setup(hose, pci_regs, rsrc.start);
|
|
+ mpc52xx_pci_setup(hose, pci_regs);
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -186,7 +186,7 @@
|
|
iounmap(priv->regs);
|
|
out_free_bootmem:
|
|
free_bootmem((unsigned long)priv,
|
|
- sizeof(struct pq2ads_pci_pic));
|
|
+ sizeof(sizeof(struct pq2ads_pci_pic)));
|
|
of_node_put(np);
|
|
out_unmap_irq:
|
|
irq_dispose_mapping(irq);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/platforms/86xx/gef_sbc610.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/86xx/gef_sbc610.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/platforms/86xx/gef_sbc610.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/86xx/gef_sbc610.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -142,10 +142,6 @@
|
|
{
|
|
unsigned int val;
|
|
|
|
- /* Do not do the fixup on other platforms! */
|
|
- if (!machine_is(gef_sbc610))
|
|
- return;
|
|
-
|
|
printk(KERN_INFO "Running NEC uPD720101 Fixup\n");
|
|
|
|
/* Ensure ports 1, 2, 3, 4 & 5 are enabled */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/platforms/embedded6xx/linkstation.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/embedded6xx/linkstation.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/platforms/embedded6xx/linkstation.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/embedded6xx/linkstation.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -12,6 +12,7 @@
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/initrd.h>
|
|
+#include <linux/mtd/physmap.h>
|
|
#include <linux/of_platform.h>
|
|
|
|
#include <asm/time.h>
|
|
@@ -21,6 +22,39 @@
|
|
|
|
#include "mpc10x.h"
|
|
|
|
+static struct mtd_partition linkstation_physmap_partitions[] = {
|
|
+ {
|
|
+ .name = "mtd_firmimg",
|
|
+ .offset = 0x000000,
|
|
+ .size = 0x300000,
|
|
+ },
|
|
+ {
|
|
+ .name = "mtd_bootcode",
|
|
+ .offset = 0x300000,
|
|
+ .size = 0x070000,
|
|
+ },
|
|
+ {
|
|
+ .name = "mtd_status",
|
|
+ .offset = 0x370000,
|
|
+ .size = 0x010000,
|
|
+ },
|
|
+ {
|
|
+ .name = "mtd_conf",
|
|
+ .offset = 0x380000,
|
|
+ .size = 0x080000,
|
|
+ },
|
|
+ {
|
|
+ .name = "mtd_allflash",
|
|
+ .offset = 0x000000,
|
|
+ .size = 0x400000,
|
|
+ },
|
|
+ {
|
|
+ .name = "mtd_data",
|
|
+ .offset = 0x310000,
|
|
+ .size = 0x0f0000,
|
|
+ },
|
|
+};
|
|
+
|
|
static __initdata struct of_device_id of_bus_ids[] = {
|
|
{ .type = "soc", },
|
|
{ .compatible = "simple-bus", },
|
|
@@ -65,6 +99,10 @@
|
|
static void __init linkstation_setup_arch(void)
|
|
{
|
|
struct device_node *np;
|
|
+#ifdef CONFIG_MTD_PHYSMAP
|
|
+ physmap_set_partitions(linkstation_physmap_partitions,
|
|
+ ARRAY_SIZE(linkstation_physmap_partitions));
|
|
+#endif
|
|
|
|
/* Lookup PCI host bridges */
|
|
for_each_compatible_node(np, "pci", "mpc10x-pci")
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/platforms/embedded6xx/storcenter.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/embedded6xx/storcenter.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/platforms/embedded6xx/storcenter.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/embedded6xx/storcenter.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -14,6 +14,7 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/initrd.h>
|
|
+#include <linux/mtd/physmap.h>
|
|
#include <linux/of_platform.h>
|
|
|
|
#include <asm/system.h>
|
|
@@ -25,6 +26,32 @@
|
|
#include "mpc10x.h"
|
|
|
|
|
|
+#ifdef CONFIG_MTD_PHYSMAP
|
|
+static struct mtd_partition storcenter_physmap_partitions[] = {
|
|
+ {
|
|
+ .name = "kernel",
|
|
+ .offset = 0x000000,
|
|
+ .size = 0x170000,
|
|
+ },
|
|
+ {
|
|
+ .name = "rootfs",
|
|
+ .offset = 0x170000,
|
|
+ .size = 0x590000,
|
|
+ },
|
|
+ {
|
|
+ .name = "uboot",
|
|
+ .offset = 0x700000,
|
|
+ .size = 0x040000,
|
|
+ },
|
|
+ {
|
|
+ .name = "config",
|
|
+ .offset = 0x740000,
|
|
+ .size = 0x0c0000,
|
|
+ },
|
|
+};
|
|
+#endif
|
|
+
|
|
+
|
|
static __initdata struct of_device_id storcenter_of_bus[] = {
|
|
{ .name = "soc", },
|
|
{},
|
|
@@ -69,6 +96,11 @@
|
|
{
|
|
struct device_node *np;
|
|
|
|
+#ifdef CONFIG_MTD_PHYSMAP
|
|
+ physmap_set_partitions(storcenter_physmap_partitions,
|
|
+ ARRAY_SIZE(storcenter_physmap_partitions));
|
|
+#endif
|
|
+
|
|
/* Lookup PCI host bridges */
|
|
for_each_compatible_node(np, "pci", "mpc10x-pci")
|
|
storcenter_add_bridge(np);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/platforms/ps3/Kconfig linux-2.6.29-rc3.owrt/arch/powerpc/platforms/ps3/Kconfig
|
|
--- linux-2.6.29.owrt/arch/powerpc/platforms/ps3/Kconfig 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/ps3/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -128,13 +128,6 @@
|
|
be disabled on the kernel command line using "ps3flash=off", to
|
|
not allocate this fixed buffer.
|
|
|
|
-config PS3_VRAM
|
|
- tristate "PS3 Video RAM Storage Driver"
|
|
- depends on FB_PS3=y && BLOCK && m
|
|
- help
|
|
- This driver allows you to use excess PS3 video RAM as volatile
|
|
- storage or system swap.
|
|
-
|
|
config PS3_LPM
|
|
tristate "PS3 Logical Performance Monitor support"
|
|
depends on PPC_PS3
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/platforms/ps3/mm.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/ps3/mm.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/platforms/ps3/mm.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/ps3/mm.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -328,7 +328,7 @@
|
|
return result;
|
|
}
|
|
|
|
-device_initcall(ps3_mm_add_memory);
|
|
+core_initcall(ps3_mm_add_memory);
|
|
|
|
/*============================================================================*/
|
|
/* dma routines */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/platforms/pseries/hotplug-memory.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/pseries/hotplug-memory.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/platforms/pseries/hotplug-memory.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/pseries/hotplug-memory.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -14,7 +14,6 @@
|
|
#include <asm/firmware.h>
|
|
#include <asm/machdep.h>
|
|
#include <asm/pSeries_reconfig.h>
|
|
-#include <asm/sparsemem.h>
|
|
|
|
static int pseries_remove_lmb(unsigned long base, unsigned int lmb_size)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/sysdev/cpm2_pic.c linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/cpm2_pic.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/sysdev/cpm2_pic.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/cpm2_pic.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -165,7 +165,7 @@
|
|
edibit = (14 - (src - CPM2_IRQ_EXT1));
|
|
else
|
|
if (src >= CPM2_IRQ_PORTC15 && src <= CPM2_IRQ_PORTC0)
|
|
- edibit = (31 - (CPM2_IRQ_PORTC0 - src));
|
|
+ edibit = (31 - (src - CPM2_IRQ_PORTC15));
|
|
else
|
|
return (flow_type & IRQ_TYPE_LEVEL_LOW) ? 0 : -EINVAL;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/sysdev/ipic.c linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/ipic.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/sysdev/ipic.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/ipic.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -890,7 +890,7 @@
|
|
return irq_linear_revmap(primary_ipic->irqhost, irq);
|
|
}
|
|
|
|
-#ifdef CONFIG_SUSPEND
|
|
+#ifdef CONFIG_PM
|
|
static struct {
|
|
u32 sicfr;
|
|
u32 siprr[2];
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/powerpc/sysdev/ppc4xx_pci.c linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/ppc4xx_pci.c
|
|
--- linux-2.6.29.owrt/arch/powerpc/sysdev/ppc4xx_pci.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/ppc4xx_pci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -204,23 +204,6 @@
|
|
{
|
|
u32 ma, pcila, pciha;
|
|
|
|
- /* Hack warning ! The "old" PCI 2.x cell only let us configure the low
|
|
- * 32-bit of incoming PLB addresses. The top 4 bits of the 36-bit
|
|
- * address are actually hard wired to a value that appears to depend
|
|
- * on the specific SoC. For example, it's 0 on 440EP and 1 on 440EPx.
|
|
- *
|
|
- * The trick here is we just crop those top bits and ignore them when
|
|
- * programming the chip. That means the device-tree has to be right
|
|
- * for the specific part used (we don't print a warning if it's wrong
|
|
- * but on the other hand, you'll crash quickly enough), but at least
|
|
- * this code should work whatever the hard coded value is
|
|
- */
|
|
- plb_addr &= 0xffffffffull;
|
|
-
|
|
- /* Note: Due to the above hack, the test below doesn't actually test
|
|
- * if you address is above 4G, but it tests that address and
|
|
- * (address + size) are both contained in the same 4G
|
|
- */
|
|
if ((plb_addr + size) > 0xffffffffull || !is_power_of_2(size) ||
|
|
size < 0x1000 || (plb_addr & (size - 1)) != 0) {
|
|
printk(KERN_WARNING "%s: Resource out of range\n",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/crypto/aes_s390.c linux-2.6.29-rc3.owrt/arch/s390/crypto/aes_s390.c
|
|
--- linux-2.6.29.owrt/arch/s390/crypto/aes_s390.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/crypto/aes_s390.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -556,7 +556,7 @@
|
|
module_init(aes_s390_init);
|
|
module_exit(aes_s390_fini);
|
|
|
|
-MODULE_ALIAS("aes-all");
|
|
+MODULE_ALIAS("aes");
|
|
|
|
MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
|
|
MODULE_LICENSE("GPL");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/defconfig linux-2.6.29-rc3.owrt/arch/s390/defconfig
|
|
--- linux-2.6.29.owrt/arch/s390/defconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/defconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
#
|
|
# Automatically generated make config: don't edit
|
|
-# Linux kernel version: 2.6.29-rc4
|
|
-# Wed Feb 11 10:07:16 2009
|
|
+# Linux kernel version: 2.6.28-rc6
|
|
+# Thu Nov 27 11:00:49 2008
|
|
#
|
|
CONFIG_SCHED_MC=y
|
|
CONFIG_MMU=y
|
|
@@ -14,14 +14,12 @@
|
|
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
|
CONFIG_GENERIC_HWEIGHT=y
|
|
CONFIG_GENERIC_TIME=y
|
|
-CONFIG_GENERIC_TIME_VSYSCALL=y
|
|
CONFIG_GENERIC_CLOCKEVENTS=y
|
|
CONFIG_GENERIC_BUG=y
|
|
CONFIG_NO_IOMEM=y
|
|
CONFIG_NO_DMA=y
|
|
CONFIG_GENERIC_LOCKBREAK=y
|
|
CONFIG_PGSTE=y
|
|
-CONFIG_VIRT_CPU_ACCOUNTING=y
|
|
CONFIG_S390=y
|
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
|
|
|
@@ -41,29 +39,20 @@
|
|
# CONFIG_TASKSTATS is not set
|
|
CONFIG_AUDIT=y
|
|
# CONFIG_AUDITSYSCALL is not set
|
|
-
|
|
-#
|
|
-# RCU Subsystem
|
|
-#
|
|
-CONFIG_CLASSIC_RCU=y
|
|
-# CONFIG_TREE_RCU is not set
|
|
-# CONFIG_PREEMPT_RCU is not set
|
|
-# CONFIG_TREE_RCU_TRACE is not set
|
|
-# CONFIG_PREEMPT_RCU_TRACE is not set
|
|
CONFIG_IKCONFIG=y
|
|
CONFIG_IKCONFIG_PROC=y
|
|
CONFIG_LOG_BUF_SHIFT=17
|
|
-CONFIG_GROUP_SCHED=y
|
|
-CONFIG_FAIR_GROUP_SCHED=y
|
|
-# CONFIG_RT_GROUP_SCHED is not set
|
|
-CONFIG_USER_SCHED=y
|
|
-# CONFIG_CGROUP_SCHED is not set
|
|
CONFIG_CGROUPS=y
|
|
# CONFIG_CGROUP_DEBUG is not set
|
|
CONFIG_CGROUP_NS=y
|
|
# CONFIG_CGROUP_FREEZER is not set
|
|
# CONFIG_CGROUP_DEVICE is not set
|
|
# CONFIG_CPUSETS is not set
|
|
+CONFIG_GROUP_SCHED=y
|
|
+CONFIG_FAIR_GROUP_SCHED=y
|
|
+# CONFIG_RT_GROUP_SCHED is not set
|
|
+CONFIG_USER_SCHED=y
|
|
+# CONFIG_CGROUP_SCHED is not set
|
|
# CONFIG_CGROUP_CPUACCT is not set
|
|
# CONFIG_RESOURCE_COUNTERS is not set
|
|
CONFIG_SYSFS_DEPRECATED=y
|
|
@@ -74,7 +63,6 @@
|
|
CONFIG_IPC_NS=y
|
|
# CONFIG_USER_NS is not set
|
|
# CONFIG_PID_NS is not set
|
|
-# CONFIG_NET_NS is not set
|
|
CONFIG_BLK_DEV_INITRD=y
|
|
CONFIG_INITRAMFS_SOURCE=""
|
|
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
|
@@ -103,17 +91,17 @@
|
|
# CONFIG_SLUB is not set
|
|
# CONFIG_SLOB is not set
|
|
# CONFIG_PROFILING is not set
|
|
+# CONFIG_MARKERS is not set
|
|
CONFIG_HAVE_OPROFILE=y
|
|
CONFIG_KPROBES=y
|
|
-CONFIG_HAVE_SYSCALL_WRAPPERS=y
|
|
CONFIG_KRETPROBES=y
|
|
CONFIG_HAVE_KPROBES=y
|
|
CONFIG_HAVE_KRETPROBES=y
|
|
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
|
-CONFIG_USE_GENERIC_SMP_HELPERS=y
|
|
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
|
CONFIG_SLABINFO=y
|
|
CONFIG_RT_MUTEXES=y
|
|
+# CONFIG_TINY_SHMEM is not set
|
|
CONFIG_BASE_SMALL=0
|
|
CONFIG_MODULES=y
|
|
# CONFIG_MODULE_FORCE_LOAD is not set
|
|
@@ -121,7 +109,7 @@
|
|
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
|
CONFIG_MODVERSIONS=y
|
|
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
|
-CONFIG_INIT_ALL_POSSIBLE=y
|
|
+CONFIG_KMOD=y
|
|
CONFIG_STOP_MACHINE=y
|
|
CONFIG_BLOCK=y
|
|
# CONFIG_BLK_DEV_IO_TRACE is not set
|
|
@@ -142,6 +130,7 @@
|
|
# CONFIG_DEFAULT_NOOP is not set
|
|
CONFIG_DEFAULT_IOSCHED="deadline"
|
|
CONFIG_PREEMPT_NOTIFIERS=y
|
|
+CONFIG_CLASSIC_RCU=y
|
|
# CONFIG_FREEZER is not set
|
|
|
|
#
|
|
@@ -172,7 +161,6 @@
|
|
CONFIG_MARCH_Z900=y
|
|
# CONFIG_MARCH_Z990 is not set
|
|
# CONFIG_MARCH_Z9_109 is not set
|
|
-# CONFIG_MARCH_Z10 is not set
|
|
CONFIG_PACK_STACK=y
|
|
# CONFIG_SMALL_STACK is not set
|
|
CONFIG_CHECK_STACK=y
|
|
@@ -186,6 +174,7 @@
|
|
# CONFIG_PREEMPT_NONE is not set
|
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
|
CONFIG_PREEMPT=y
|
|
+# CONFIG_PREEMPT_RCU is not set
|
|
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
|
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
|
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
|
@@ -206,6 +195,7 @@
|
|
CONFIG_PAGEFLAGS_EXTENDED=y
|
|
CONFIG_SPLIT_PTLOCK_CPUS=4
|
|
CONFIG_MIGRATION=y
|
|
+CONFIG_RESOURCES_64BIT=y
|
|
CONFIG_PHYS_ADDR_T_64BIT=y
|
|
CONFIG_ZONE_DMA_FLAG=1
|
|
CONFIG_BOUNCE=y
|
|
@@ -217,6 +207,7 @@
|
|
#
|
|
CONFIG_MACHCHK_WARNING=y
|
|
CONFIG_QDIO=y
|
|
+# CONFIG_QDIO_DEBUG is not set
|
|
CONFIG_CHSC_SCH=m
|
|
|
|
#
|
|
@@ -236,13 +227,15 @@
|
|
# CONFIG_SHARED_KERNEL is not set
|
|
# CONFIG_CMM is not set
|
|
# CONFIG_PAGE_STATES is not set
|
|
+CONFIG_VIRT_TIMER=y
|
|
+CONFIG_VIRT_CPU_ACCOUNTING=y
|
|
# CONFIG_APPLDATA_BASE is not set
|
|
CONFIG_HZ_100=y
|
|
# CONFIG_HZ_250 is not set
|
|
# CONFIG_HZ_300 is not set
|
|
# CONFIG_HZ_1000 is not set
|
|
CONFIG_HZ=100
|
|
-CONFIG_SCHED_HRTICK=y
|
|
+# CONFIG_SCHED_HRTICK is not set
|
|
CONFIG_S390_HYPFS_FS=y
|
|
CONFIG_KEXEC=y
|
|
# CONFIG_ZFCPDUMP is not set
|
|
@@ -252,7 +245,6 @@
|
|
#
|
|
# Networking options
|
|
#
|
|
-CONFIG_COMPAT_NET_DEV_OPS=y
|
|
CONFIG_PACKET=y
|
|
# CONFIG_PACKET_MMAP is not set
|
|
CONFIG_UNIX=y
|
|
@@ -391,7 +383,6 @@
|
|
CONFIG_NET_SCH_GRED=m
|
|
CONFIG_NET_SCH_DSMARK=m
|
|
# CONFIG_NET_SCH_NETEM is not set
|
|
-# CONFIG_NET_SCH_DRR is not set
|
|
# CONFIG_NET_SCH_INGRESS is not set
|
|
|
|
#
|
|
@@ -409,7 +400,6 @@
|
|
CONFIG_NET_CLS_RSVP=m
|
|
CONFIG_NET_CLS_RSVP6=m
|
|
CONFIG_NET_CLS_FLOW=m
|
|
-# CONFIG_NET_CLS_CGROUP is not set
|
|
# CONFIG_NET_EMATCH is not set
|
|
CONFIG_NET_CLS_ACT=y
|
|
CONFIG_NET_ACT_POLICE=y
|
|
@@ -421,7 +411,6 @@
|
|
# CONFIG_NET_ACT_SKBEDIT is not set
|
|
# CONFIG_NET_CLS_IND is not set
|
|
CONFIG_NET_SCH_FIFO=y
|
|
-# CONFIG_DCB is not set
|
|
|
|
#
|
|
# Network testing
|
|
@@ -439,7 +428,6 @@
|
|
# CONFIG_CAN_DEBUG_DEVICES is not set
|
|
# CONFIG_AF_RXRPC is not set
|
|
# CONFIG_PHONET is not set
|
|
-# CONFIG_WIMAX is not set
|
|
# CONFIG_RFKILL is not set
|
|
# CONFIG_NET_9P is not set
|
|
# CONFIG_PCMCIA is not set
|
|
@@ -487,15 +475,11 @@
|
|
CONFIG_DASD_EER=y
|
|
CONFIG_VIRTIO_BLK=m
|
|
CONFIG_MISC_DEVICES=y
|
|
+# CONFIG_EEPROM_93CX6 is not set
|
|
# CONFIG_ENCLOSURE_SERVICES is not set
|
|
# CONFIG_C2PORT is not set
|
|
|
|
#
|
|
-# EEPROM support
|
|
-#
|
|
-# CONFIG_EEPROM_93CX6 is not set
|
|
-
|
|
-#
|
|
# SCSI device support
|
|
#
|
|
# CONFIG_RAID_ATTRS is not set
|
|
@@ -536,7 +520,6 @@
|
|
# CONFIG_SCSI_SRP_ATTRS is not set
|
|
CONFIG_SCSI_LOWLEVEL=y
|
|
# CONFIG_ISCSI_TCP is not set
|
|
-# CONFIG_LIBFC is not set
|
|
# CONFIG_SCSI_DEBUG is not set
|
|
CONFIG_ZFCP=y
|
|
CONFIG_SCSI_DH=m
|
|
@@ -583,10 +566,6 @@
|
|
CONFIG_NETDEV_1000=y
|
|
CONFIG_NETDEV_10000=y
|
|
# CONFIG_TR is not set
|
|
-
|
|
-#
|
|
-# Enable WiMAX (Networking options) to see the WiMAX drivers
|
|
-#
|
|
# CONFIG_WAN is not set
|
|
|
|
#
|
|
@@ -614,11 +593,9 @@
|
|
#
|
|
CONFIG_DEVKMEM=y
|
|
CONFIG_UNIX98_PTYS=y
|
|
-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
|
CONFIG_LEGACY_PTYS=y
|
|
CONFIG_LEGACY_PTY_COUNT=256
|
|
CONFIG_HVC_DRIVER=y
|
|
-CONFIG_HVC_IUCV=y
|
|
CONFIG_VIRTIO_CONSOLE=y
|
|
CONFIG_HW_RANDOM=m
|
|
CONFIG_HW_RANDOM_VIRTIO=m
|
|
@@ -668,6 +645,7 @@
|
|
# CONFIG_NEW_LEDS is not set
|
|
CONFIG_ACCESSIBILITY=y
|
|
# CONFIG_STAGING is not set
|
|
+CONFIG_STAGING_EXCLUDE_BUILD=y
|
|
|
|
#
|
|
# File systems
|
|
@@ -690,7 +668,6 @@
|
|
# CONFIG_XFS_FS is not set
|
|
# CONFIG_GFS2_FS is not set
|
|
# CONFIG_OCFS2_FS is not set
|
|
-# CONFIG_BTRFS_FS is not set
|
|
CONFIG_DNOTIFY=y
|
|
CONFIG_INOTIFY=y
|
|
CONFIG_INOTIFY_USER=y
|
|
@@ -726,7 +703,10 @@
|
|
# CONFIG_HUGETLBFS is not set
|
|
# CONFIG_HUGETLB_PAGE is not set
|
|
CONFIG_CONFIGFS_FS=m
|
|
-CONFIG_MISC_FILESYSTEMS=y
|
|
+
|
|
+#
|
|
+# Miscellaneous filesystems
|
|
+#
|
|
# CONFIG_ADFS_FS is not set
|
|
# CONFIG_AFFS_FS is not set
|
|
# CONFIG_HFS_FS is not set
|
|
@@ -735,7 +715,6 @@
|
|
# CONFIG_BFS_FS is not set
|
|
# CONFIG_EFS_FS is not set
|
|
# CONFIG_CRAMFS is not set
|
|
-# CONFIG_SQUASHFS is not set
|
|
# CONFIG_VXFS_FS is not set
|
|
# CONFIG_MINIX_FS is not set
|
|
# CONFIG_OMFS_FS is not set
|
|
@@ -829,7 +808,6 @@
|
|
CONFIG_DEBUG_MEMORY_INIT=y
|
|
# CONFIG_DEBUG_LIST is not set
|
|
# CONFIG_DEBUG_SG is not set
|
|
-# CONFIG_DEBUG_NOTIFIERS is not set
|
|
# CONFIG_FRAME_POINTER is not set
|
|
# CONFIG_RCU_TORTURE_TEST is not set
|
|
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
|
@@ -840,19 +818,15 @@
|
|
# CONFIG_FAULT_INJECTION is not set
|
|
# CONFIG_LATENCYTOP is not set
|
|
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
|
-CONFIG_HAVE_FUNCTION_TRACER=y
|
|
|
|
#
|
|
# Tracers
|
|
#
|
|
-# CONFIG_FUNCTION_TRACER is not set
|
|
# CONFIG_IRQSOFF_TRACER is not set
|
|
# CONFIG_PREEMPT_TRACER is not set
|
|
# CONFIG_SCHED_TRACER is not set
|
|
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
|
# CONFIG_BOOT_TRACER is not set
|
|
-# CONFIG_TRACE_BRANCH_PROFILING is not set
|
|
-# CONFIG_STACK_TRACER is not set
|
|
# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
|
|
CONFIG_SAMPLES=y
|
|
# CONFIG_SAMPLE_KOBJECT is not set
|
|
@@ -873,17 +847,11 @@
|
|
#
|
|
CONFIG_CRYPTO_FIPS=y
|
|
CONFIG_CRYPTO_ALGAPI=y
|
|
-CONFIG_CRYPTO_ALGAPI2=y
|
|
-CONFIG_CRYPTO_AEAD=m
|
|
-CONFIG_CRYPTO_AEAD2=y
|
|
+CONFIG_CRYPTO_AEAD=y
|
|
CONFIG_CRYPTO_BLKCIPHER=y
|
|
-CONFIG_CRYPTO_BLKCIPHER2=y
|
|
-CONFIG_CRYPTO_HASH=m
|
|
-CONFIG_CRYPTO_HASH2=y
|
|
-CONFIG_CRYPTO_RNG=m
|
|
-CONFIG_CRYPTO_RNG2=y
|
|
+CONFIG_CRYPTO_HASH=y
|
|
+CONFIG_CRYPTO_RNG=y
|
|
CONFIG_CRYPTO_MANAGER=y
|
|
-CONFIG_CRYPTO_MANAGER2=y
|
|
CONFIG_CRYPTO_GF128MUL=m
|
|
# CONFIG_CRYPTO_NULL is not set
|
|
# CONFIG_CRYPTO_CRYPTD is not set
|
|
@@ -917,7 +885,7 @@
|
|
#
|
|
# Digest
|
|
#
|
|
-CONFIG_CRYPTO_CRC32C=m
|
|
+# CONFIG_CRYPTO_CRC32C is not set
|
|
# CONFIG_CRYPTO_MD4 is not set
|
|
CONFIG_CRYPTO_MD5=m
|
|
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
|
@@ -974,7 +942,6 @@
|
|
# Library routines
|
|
#
|
|
CONFIG_BITREVERSE=m
|
|
-CONFIG_GENERIC_FIND_LAST_BIT=y
|
|
# CONFIG_CRC_CCITT is not set
|
|
# CONFIG_CRC16 is not set
|
|
CONFIG_CRC_T10DIF=y
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/include/asm/cputime.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/cputime.h
|
|
--- linux-2.6.29.owrt/arch/s390/include/asm/cputime.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/cputime.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -145,7 +145,7 @@
|
|
value->tv_usec = rp.subreg.even / 4096;
|
|
value->tv_sec = rp.subreg.odd;
|
|
#else
|
|
- value->tv_usec = (cputime % 4096000000ULL) / 4096;
|
|
+ value->tv_usec = cputime % 4096000000ULL;
|
|
value->tv_sec = cputime / 4096000000ULL;
|
|
#endif
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/include/asm/lowcore.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/lowcore.h
|
|
--- linux-2.6.29.owrt/arch/s390/include/asm/lowcore.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/lowcore.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -384,8 +384,8 @@
|
|
__u32 panic_magic; /* 0xe00 */
|
|
|
|
/* Per cpu primary space access list */
|
|
- __u8 pad_0xe04[0xe38-0xe04]; /* 0xe04 */
|
|
- __u64 vdso_per_cpu_data; /* 0xe38 */
|
|
+ __u8 pad_0xe04[0xe3c-0xe04]; /* 0xe04 */
|
|
+ __u32 vdso_per_cpu_data; /* 0xe3c */
|
|
__u32 paste[16]; /* 0xe40 */
|
|
|
|
__u8 pad13[0x11b8-0xe80]; /* 0xe80 */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/include/asm/mman.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/mman.h
|
|
--- linux-2.6.29.owrt/arch/s390/include/asm/mman.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/mman.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -22,9 +22,4 @@
|
|
#define MCL_CURRENT 1 /* lock all current mappings */
|
|
#define MCL_FUTURE 2 /* lock all future mappings */
|
|
|
|
-#if defined(__KERNEL__) && !defined(__ASSEMBLY__) && defined(CONFIG_64BIT)
|
|
-int s390_mmap_check(unsigned long addr, unsigned long len);
|
|
-#define arch_mmap_check(addr,len,flags) s390_mmap_check(addr,len)
|
|
-#endif
|
|
-
|
|
#endif /* __S390_MMAN_H__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/include/asm/processor.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/processor.h
|
|
--- linux-2.6.29.owrt/arch/s390/include/asm/processor.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/processor.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -61,7 +61,7 @@
|
|
extern int get_cpu_capability(unsigned int *);
|
|
|
|
/*
|
|
- * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
|
|
+ * User space process size: 2GB for 31 bit, 4TB for 64 bit.
|
|
*/
|
|
#ifndef __s390x__
|
|
|
|
@@ -70,7 +70,8 @@
|
|
|
|
#else /* __s390x__ */
|
|
|
|
-#define TASK_SIZE_OF(tsk) ((tsk)->mm->context.asce_limit)
|
|
+#define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk,TIF_31BIT) ? \
|
|
+ (1UL << 31) : (1UL << 53))
|
|
#define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \
|
|
(1UL << 30) : (1UL << 41))
|
|
#define TASK_SIZE TASK_SIZE_OF(current)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/include/asm/setup.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/setup.h
|
|
--- linux-2.6.29.owrt/arch/s390/include/asm/setup.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/setup.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -43,8 +43,6 @@
|
|
|
|
extern struct mem_chunk memory_chunk[];
|
|
extern unsigned long real_memory_size;
|
|
-extern int memory_end_set;
|
|
-extern unsigned long memory_end;
|
|
|
|
void detect_memory_layout(struct mem_chunk chunk[]);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/include/asm/topology.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/topology.h
|
|
--- linux-2.6.29.owrt/arch/s390/include/asm/topology.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/topology.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,8 +30,6 @@
|
|
};
|
|
#endif
|
|
|
|
-#define SD_MC_INIT SD_CPU_INIT
|
|
-
|
|
#include <asm-generic/topology.h>
|
|
|
|
#endif /* _ASM_S390_TOPOLOGY_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/kernel/irq.c linux-2.6.29-rc3.owrt/arch/s390/kernel/irq.c
|
|
--- linux-2.6.29.owrt/arch/s390/kernel/irq.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/kernel/irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -95,7 +95,6 @@
|
|
local_irq_restore(flags);
|
|
}
|
|
|
|
-#ifdef CONFIG_PROC_FS
|
|
void init_irq_proc(void)
|
|
{
|
|
struct proc_dir_entry *root_irq_dir;
|
|
@@ -103,4 +102,3 @@
|
|
root_irq_dir = proc_mkdir("irq", NULL);
|
|
create_prof_cpu_mask(root_irq_dir);
|
|
}
|
|
-#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/kernel/mcount.S linux-2.6.29-rc3.owrt/arch/s390/kernel/mcount.S
|
|
--- linux-2.6.29.owrt/arch/s390/kernel/mcount.S 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/kernel/mcount.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,8 +5,6 @@
|
|
*
|
|
*/
|
|
|
|
-#include <asm/asm-offsets.h>
|
|
-
|
|
#ifndef CONFIG_64BIT
|
|
.globl _mcount
|
|
_mcount:
|
|
@@ -16,7 +14,7 @@
|
|
ahi %r15,-96
|
|
l %r3,100(%r15)
|
|
la %r2,0(%r14)
|
|
- st %r1,__SF_BACKCHAIN(%r15)
|
|
+ st %r1,0(%r15)
|
|
la %r3,0(%r3)
|
|
bras %r14,0f
|
|
.long ftrace_trace_function
|
|
@@ -40,7 +38,7 @@
|
|
stg %r14,112(%r15)
|
|
lgr %r1,%r15
|
|
aghi %r15,-160
|
|
- stg %r1,__SF_BACKCHAIN(%r15)
|
|
+ stg %r1,0(%r15)
|
|
lgr %r2,%r14
|
|
lg %r3,168(%r15)
|
|
larl %r14,ftrace_trace_function
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/kernel/setup.c linux-2.6.29-rc3.owrt/arch/s390/kernel/setup.c
|
|
--- linux-2.6.29.owrt/arch/s390/kernel/setup.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -82,9 +82,7 @@
|
|
|
|
struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];
|
|
volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
|
|
-
|
|
-int __initdata memory_end_set;
|
|
-unsigned long __initdata memory_end;
|
|
+static unsigned long __initdata memory_end;
|
|
|
|
/*
|
|
* This is set up by the setup-routine at boot-time
|
|
@@ -283,7 +281,6 @@
|
|
static int __init early_parse_mem(char *p)
|
|
{
|
|
memory_end = memparse(p, &p);
|
|
- memory_end_set = 1;
|
|
return 0;
|
|
}
|
|
early_param("mem", early_parse_mem);
|
|
@@ -511,10 +508,8 @@
|
|
int i;
|
|
|
|
#if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)
|
|
- if (ipl_info.type == IPL_TYPE_FCP_DUMP) {
|
|
+ if (ipl_info.type == IPL_TYPE_FCP_DUMP)
|
|
memory_end = ZFCPDUMP_HSA_SIZE;
|
|
- memory_end_set = 1;
|
|
- }
|
|
#endif
|
|
memory_size = 0;
|
|
memory_end &= PAGE_MASK;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/kvm/kvm-s390.c linux-2.6.29-rc3.owrt/arch/s390/kvm/kvm-s390.c
|
|
--- linux-2.6.29.owrt/arch/s390/kvm/kvm-s390.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/kvm/kvm-s390.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -212,10 +212,6 @@
|
|
}
|
|
}
|
|
|
|
-void kvm_arch_sync_events(struct kvm *kvm)
|
|
-{
|
|
-}
|
|
-
|
|
void kvm_arch_destroy_vm(struct kvm *kvm)
|
|
{
|
|
kvm_free_vcpus(kvm);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/lib/div64.c linux-2.6.29-rc3.owrt/arch/s390/lib/div64.c
|
|
--- linux-2.6.29.owrt/arch/s390/lib/div64.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/lib/div64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -61,7 +61,7 @@
|
|
" clr %0,%3\n"
|
|
" jl 0f\n"
|
|
" slr %0,%3\n"
|
|
- " ahi %1,1\n"
|
|
+ " alr %1,%2\n"
|
|
"0:\n"
|
|
: "+d" (reg2), "+d" (reg3), "=d" (tmp)
|
|
: "d" (base), "2" (1UL) : "cc" );
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/lib/uaccess_pt.c linux-2.6.29-rc3.owrt/arch/s390/lib/uaccess_pt.c
|
|
--- linux-2.6.29.owrt/arch/s390/lib/uaccess_pt.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/lib/uaccess_pt.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -119,6 +119,8 @@
|
|
goto fault;
|
|
|
|
pfn = pte_pfn(*pte);
|
|
+ if (!pfn_valid(pfn))
|
|
+ goto out;
|
|
|
|
offset = uaddr & (PAGE_SIZE - 1);
|
|
size = min(n - done, PAGE_SIZE - offset);
|
|
@@ -133,6 +135,7 @@
|
|
done += size;
|
|
uaddr += size;
|
|
} while (done < n);
|
|
+out:
|
|
spin_unlock(&mm->page_table_lock);
|
|
return n - done;
|
|
fault:
|
|
@@ -160,6 +163,9 @@
|
|
goto fault;
|
|
|
|
pfn = pte_pfn(*pte);
|
|
+ if (!pfn_valid(pfn))
|
|
+ goto out;
|
|
+
|
|
ret = (pfn << PAGE_SHIFT) + (uaddr & (PAGE_SIZE - 1));
|
|
out:
|
|
return ret;
|
|
@@ -238,6 +244,11 @@
|
|
goto fault;
|
|
|
|
pfn = pte_pfn(*pte);
|
|
+ if (!pfn_valid(pfn)) {
|
|
+ done = -1;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
offset = uaddr & (PAGE_SIZE-1);
|
|
addr = (char *)(pfn << PAGE_SHIFT) + offset;
|
|
len = min(count - done, PAGE_SIZE - offset);
|
|
@@ -245,6 +256,7 @@
|
|
done += len_str;
|
|
uaddr += len_str;
|
|
} while ((len_str == len) && (done < count));
|
|
+out:
|
|
spin_unlock(&mm->page_table_lock);
|
|
return done + 1;
|
|
fault:
|
|
@@ -313,7 +325,12 @@
|
|
}
|
|
|
|
pfn_from = pte_pfn(*pte_from);
|
|
+ if (!pfn_valid(pfn_from))
|
|
+ goto out;
|
|
pfn_to = pte_pfn(*pte_to);
|
|
+ if (!pfn_valid(pfn_to))
|
|
+ goto out;
|
|
+
|
|
offset_from = uaddr_from & (PAGE_SIZE-1);
|
|
offset_to = uaddr_from & (PAGE_SIZE-1);
|
|
offset_max = max(offset_from, offset_to);
|
|
@@ -325,6 +342,7 @@
|
|
uaddr_from += size;
|
|
uaddr_to += size;
|
|
} while (done < n);
|
|
+out:
|
|
spin_unlock(&mm->page_table_lock);
|
|
return n - done;
|
|
fault:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/mm/mmap.c linux-2.6.29-rc3.owrt/arch/s390/mm/mmap.c
|
|
--- linux-2.6.29.owrt/arch/s390/mm/mmap.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/mm/mmap.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -35,7 +35,7 @@
|
|
* Leave an at least ~128 MB hole.
|
|
*/
|
|
#define MIN_GAP (128*1024*1024)
|
|
-#define MAX_GAP (STACK_TOP/6*5)
|
|
+#define MAX_GAP (TASK_SIZE/6*5)
|
|
|
|
static inline unsigned long mmap_base(void)
|
|
{
|
|
@@ -46,7 +46,7 @@
|
|
else if (gap > MAX_GAP)
|
|
gap = MAX_GAP;
|
|
|
|
- return STACK_TOP - (gap & PAGE_MASK);
|
|
+ return TASK_SIZE - (gap & PAGE_MASK);
|
|
}
|
|
|
|
static inline int mmap_is_legacy(void)
|
|
@@ -89,58 +89,42 @@
|
|
|
|
#else
|
|
|
|
-int s390_mmap_check(unsigned long addr, unsigned long len)
|
|
-{
|
|
- if (!test_thread_flag(TIF_31BIT) &&
|
|
- len >= TASK_SIZE && TASK_SIZE < (1UL << 53))
|
|
- return crst_table_upgrade(current->mm, 1UL << 53);
|
|
- return 0;
|
|
-}
|
|
-
|
|
static unsigned long
|
|
s390_get_unmapped_area(struct file *filp, unsigned long addr,
|
|
unsigned long len, unsigned long pgoff, unsigned long flags)
|
|
{
|
|
struct mm_struct *mm = current->mm;
|
|
- unsigned long area;
|
|
int rc;
|
|
|
|
- area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
|
|
- if (!(area & ~PAGE_MASK))
|
|
- return area;
|
|
- if (area == -ENOMEM &&
|
|
- !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) {
|
|
- /* Upgrade the page table to 4 levels and retry. */
|
|
- rc = crst_table_upgrade(mm, 1UL << 53);
|
|
+ addr = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
|
|
+ if (addr & ~PAGE_MASK)
|
|
+ return addr;
|
|
+ if (unlikely(mm->context.asce_limit < addr + len)) {
|
|
+ rc = crst_table_upgrade(mm, addr + len);
|
|
if (rc)
|
|
return (unsigned long) rc;
|
|
- area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
|
|
}
|
|
- return area;
|
|
+ return addr;
|
|
}
|
|
|
|
static unsigned long
|
|
-s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr,
|
|
+s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
|
const unsigned long len, const unsigned long pgoff,
|
|
const unsigned long flags)
|
|
{
|
|
struct mm_struct *mm = current->mm;
|
|
- unsigned long area;
|
|
+ unsigned long addr = addr0;
|
|
int rc;
|
|
|
|
- area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags);
|
|
- if (!(area & ~PAGE_MASK))
|
|
- return area;
|
|
- if (area == -ENOMEM &&
|
|
- !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) {
|
|
- /* Upgrade the page table to 4 levels and retry. */
|
|
- rc = crst_table_upgrade(mm, 1UL << 53);
|
|
+ addr = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags);
|
|
+ if (addr & ~PAGE_MASK)
|
|
+ return addr;
|
|
+ if (unlikely(mm->context.asce_limit < addr + len)) {
|
|
+ rc = crst_table_upgrade(mm, addr + len);
|
|
if (rc)
|
|
return (unsigned long) rc;
|
|
- area = arch_get_unmapped_area_topdown(filp, addr, len,
|
|
- pgoff, flags);
|
|
}
|
|
- return area;
|
|
+ return addr;
|
|
}
|
|
/*
|
|
* This function, called very early during the creation of a new
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/s390/mm/pgtable.c linux-2.6.29-rc3.owrt/arch/s390/mm/pgtable.c
|
|
--- linux-2.6.29.owrt/arch/s390/mm/pgtable.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/s390/mm/pgtable.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -117,7 +117,6 @@
|
|
crst_table_init(table, entry);
|
|
pgd_populate(mm, (pgd_t *) table, (pud_t *) pgd);
|
|
mm->pgd = (pgd_t *) table;
|
|
- mm->task_size = mm->context.asce_limit;
|
|
table = NULL;
|
|
}
|
|
spin_unlock(&mm->page_table_lock);
|
|
@@ -155,7 +154,6 @@
|
|
BUG();
|
|
}
|
|
mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN);
|
|
- mm->task_size = mm->context.asce_limit;
|
|
crst_table_free(mm, (unsigned long *) pgd);
|
|
}
|
|
update_mm(mm, current);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/boards/board-ap325rxa.c linux-2.6.29-rc3.owrt/arch/sh/boards/board-ap325rxa.c
|
|
--- linux-2.6.29.owrt/arch/sh/boards/board-ap325rxa.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/boards/board-ap325rxa.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -22,7 +22,6 @@
|
|
#include <linux/gpio.h>
|
|
#include <linux/spi/spi.h>
|
|
#include <linux/spi/spi_gpio.h>
|
|
-#include <media/soc_camera.h>
|
|
#include <media/soc_camera_platform.h>
|
|
#include <media/sh_mobile_ceu.h>
|
|
#include <video/sh_mobile_lcdc.h>
|
|
@@ -217,12 +216,6 @@
|
|
},
|
|
};
|
|
|
|
-static void camera_power(int val)
|
|
-{
|
|
- gpio_set_value(GPIO_PTZ5, val); /* RST_CAM/RSTB */
|
|
- mdelay(10);
|
|
-}
|
|
-
|
|
#ifdef CONFIG_I2C
|
|
static unsigned char camera_ncm03j_magic[] =
|
|
{
|
|
@@ -252,11 +245,9 @@
|
|
int ret = 0;
|
|
int i;
|
|
|
|
- camera_power(0);
|
|
if (!enable)
|
|
return 0; /* no disable for now */
|
|
|
|
- camera_power(1);
|
|
for (i = 0; i < ARRAY_SIZE(camera_ncm03j_magic); i += 2) {
|
|
u_int8_t buf[8];
|
|
|
|
@@ -435,7 +426,7 @@
|
|
gpio_request(GPIO_PTZ6, NULL);
|
|
gpio_direction_output(GPIO_PTZ6, 0); /* STBY_CAM */
|
|
gpio_request(GPIO_PTZ5, NULL);
|
|
- gpio_direction_output(GPIO_PTZ5, 0); /* RST_CAM */
|
|
+ gpio_direction_output(GPIO_PTZ5, 1); /* RST_CAM */
|
|
gpio_request(GPIO_PTZ4, NULL);
|
|
gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/include/asm/mutex-llsc.h linux-2.6.29-rc3.owrt/arch/sh/include/asm/mutex-llsc.h
|
|
--- linux-2.6.29.owrt/arch/sh/include/asm/mutex-llsc.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/include/asm/mutex-llsc.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,36 +21,38 @@
|
|
static inline void
|
|
__mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *))
|
|
{
|
|
- int __done, __res;
|
|
+ int __ex_flag, __res;
|
|
|
|
__asm__ __volatile__ (
|
|
"movli.l @%2, %0 \n"
|
|
"add #-1, %0 \n"
|
|
"movco.l %0, @%2 \n"
|
|
"movt %1 \n"
|
|
- : "=&z" (__res), "=&r" (__done)
|
|
+ : "=&z" (__res), "=&r" (__ex_flag)
|
|
: "r" (&(count)->counter)
|
|
: "t");
|
|
|
|
- if (unlikely(!__done || __res != 0))
|
|
+ __res |= !__ex_flag;
|
|
+ if (unlikely(__res != 0))
|
|
fail_fn(count);
|
|
}
|
|
|
|
static inline int
|
|
__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
|
|
{
|
|
- int __done, __res;
|
|
+ int __ex_flag, __res;
|
|
|
|
__asm__ __volatile__ (
|
|
"movli.l @%2, %0 \n"
|
|
"add #-1, %0 \n"
|
|
"movco.l %0, @%2 \n"
|
|
"movt %1 \n"
|
|
- : "=&z" (__res), "=&r" (__done)
|
|
+ : "=&z" (__res), "=&r" (__ex_flag)
|
|
: "r" (&(count)->counter)
|
|
: "t");
|
|
|
|
- if (unlikely(!__done || __res != 0))
|
|
+ __res |= !__ex_flag;
|
|
+ if (unlikely(__res != 0))
|
|
__res = fail_fn(count);
|
|
|
|
return __res;
|
|
@@ -59,18 +61,19 @@
|
|
static inline void
|
|
__mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *))
|
|
{
|
|
- int __done, __res;
|
|
+ int __ex_flag, __res;
|
|
|
|
__asm__ __volatile__ (
|
|
"movli.l @%2, %0 \n\t"
|
|
"add #1, %0 \n\t"
|
|
"movco.l %0, @%2 \n\t"
|
|
"movt %1 \n\t"
|
|
- : "=&z" (__res), "=&r" (__done)
|
|
+ : "=&z" (__res), "=&r" (__ex_flag)
|
|
: "r" (&(count)->counter)
|
|
: "t");
|
|
|
|
- if (unlikely(!__done || __res <= 0))
|
|
+ __res |= !__ex_flag;
|
|
+ if (unlikely(__res <= 0))
|
|
fail_fn(count);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/include/asm/syscall_32.h linux-2.6.29-rc3.owrt/arch/sh/include/asm/syscall_32.h
|
|
--- linux-2.6.29.owrt/arch/sh/include/asm/syscall_32.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/include/asm/syscall_32.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,10 +21,23 @@
|
|
*/
|
|
}
|
|
|
|
+static inline bool syscall_has_error(struct pt_regs *regs)
|
|
+{
|
|
+ return (regs->sr & 0x1) ? true : false;
|
|
+}
|
|
+static inline void syscall_set_error(struct pt_regs *regs)
|
|
+{
|
|
+ regs->sr |= 0x1;
|
|
+}
|
|
+static inline void syscall_clear_error(struct pt_regs *regs)
|
|
+{
|
|
+ regs->sr &= ~0x1;
|
|
+}
|
|
+
|
|
static inline long syscall_get_error(struct task_struct *task,
|
|
struct pt_regs *regs)
|
|
{
|
|
- return IS_ERR_VALUE(regs->regs[0]) ? regs->regs[0] : 0;
|
|
+ return syscall_has_error(regs) ? regs->regs[0] : 0;
|
|
}
|
|
|
|
static inline long syscall_get_return_value(struct task_struct *task,
|
|
@@ -37,10 +50,13 @@
|
|
struct pt_regs *regs,
|
|
int error, long val)
|
|
{
|
|
- if (error)
|
|
+ if (error) {
|
|
+ syscall_set_error(regs);
|
|
regs->regs[0] = -error;
|
|
- else
|
|
+ } else {
|
|
+ syscall_clear_error(regs);
|
|
regs->regs[0] = val;
|
|
+ }
|
|
}
|
|
|
|
static inline void syscall_get_arguments(struct task_struct *task,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/include/asm/syscall_64.h linux-2.6.29-rc3.owrt/arch/sh/include/asm/syscall_64.h
|
|
--- linux-2.6.29.owrt/arch/sh/include/asm/syscall_64.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/include/asm/syscall_64.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,10 +21,23 @@
|
|
*/
|
|
}
|
|
|
|
+static inline bool syscall_has_error(struct pt_regs *regs)
|
|
+{
|
|
+ return (regs->sr & 0x1) ? true : false;
|
|
+}
|
|
+static inline void syscall_set_error(struct pt_regs *regs)
|
|
+{
|
|
+ regs->sr |= 0x1;
|
|
+}
|
|
+static inline void syscall_clear_error(struct pt_regs *regs)
|
|
+{
|
|
+ regs->sr &= ~0x1;
|
|
+}
|
|
+
|
|
static inline long syscall_get_error(struct task_struct *task,
|
|
struct pt_regs *regs)
|
|
{
|
|
- return IS_ERR_VALUE(regs->regs[9]) ? regs->regs[9] : 0;
|
|
+ return syscall_has_error(regs) ? regs->regs[9] : 0;
|
|
}
|
|
|
|
static inline long syscall_get_return_value(struct task_struct *task,
|
|
@@ -37,10 +50,13 @@
|
|
struct pt_regs *regs,
|
|
int error, long val)
|
|
{
|
|
- if (error)
|
|
+ if (error) {
|
|
+ syscall_set_error(regs);
|
|
regs->regs[9] = -error;
|
|
- else
|
|
+ } else {
|
|
+ syscall_clear_error(regs);
|
|
regs->regs[9] = val;
|
|
+ }
|
|
}
|
|
|
|
static inline void syscall_get_arguments(struct task_struct *task,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/kernel/cpu/sh2a/clock-sh7201.c linux-2.6.29-rc3.owrt/arch/sh/kernel/cpu/sh2a/clock-sh7201.c
|
|
--- linux-2.6.29.owrt/arch/sh/kernel/cpu/sh2a/clock-sh7201.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/kernel/cpu/sh2a/clock-sh7201.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -18,8 +18,8 @@
|
|
#include <asm/freq.h>
|
|
#include <asm/io.h>
|
|
|
|
-static const int pll1rate[]={1,2,3,4,6,8};
|
|
-static const int pfc_divisors[]={1,2,3,4,6,8,12};
|
|
+const static int pll1rate[]={1,2,3,4,6,8};
|
|
+const static int pfc_divisors[]={1,2,3,4,6,8,12};
|
|
#define ifc_divisors pfc_divisors
|
|
|
|
#if (CONFIG_SH_CLK_MD == 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/kernel/cpu/sh4/fpu.c linux-2.6.29-rc3.owrt/arch/sh/kernel/cpu/sh4/fpu.c
|
|
--- linux-2.6.29.owrt/arch/sh/kernel/cpu/sh4/fpu.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/kernel/cpu/sh4/fpu.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -423,7 +423,7 @@
|
|
int m;
|
|
unsigned int hx;
|
|
|
|
- m = (finsn >> 8) & 0x7;
|
|
+ m = (finsn >> 9) & 0x7;
|
|
hx = tsk->thread.fpu.hard.fp_regs[m];
|
|
|
|
if ((tsk->thread.fpu.hard.fpscr & FPSCR_CAUSE_ERROR)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/kernel/setup.c linux-2.6.29-rc3.owrt/arch/sh/kernel/setup.c
|
|
--- linux-2.6.29.owrt/arch/sh/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -262,11 +262,11 @@
|
|
BOOTMEM_DEFAULT);
|
|
|
|
/*
|
|
- * Reserve physical pages below CONFIG_ZERO_PAGE_OFFSET.
|
|
+ * reserve physical page 0 - it's a special BIOS page on many boxes,
|
|
+ * enabling clean reboots, SMP operation, laptop functions.
|
|
*/
|
|
- if (CONFIG_ZERO_PAGE_OFFSET != 0)
|
|
- reserve_bootmem(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET,
|
|
- BOOTMEM_DEFAULT);
|
|
+ reserve_bootmem(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET,
|
|
+ BOOTMEM_DEFAULT);
|
|
|
|
sparse_memory_present_with_active_regions(0);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/kernel/signal_32.c linux-2.6.29-rc3.owrt/arch/sh/kernel/signal_32.c
|
|
--- linux-2.6.29.owrt/arch/sh/kernel/signal_32.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/kernel/signal_32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -510,6 +510,7 @@
|
|
case -ERESTARTNOHAND:
|
|
no_system_call_restart:
|
|
regs->regs[0] = -EINTR;
|
|
+ regs->sr |= 1;
|
|
break;
|
|
|
|
case -ERESTARTSYS:
|
|
@@ -588,7 +589,8 @@
|
|
|
|
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
|
if (signr > 0) {
|
|
- handle_syscall_restart(save_r0, regs, &ka.sa);
|
|
+ if (regs->sr & 1)
|
|
+ handle_syscall_restart(save_r0, regs, &ka.sa);
|
|
|
|
/* Whee! Actually deliver the signal. */
|
|
if (handle_signal(signr, &ka, &info, oldset,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/kernel/signal_64.c linux-2.6.29-rc3.owrt/arch/sh/kernel/signal_64.c
|
|
--- linux-2.6.29.owrt/arch/sh/kernel/signal_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/kernel/signal_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -60,6 +60,7 @@
|
|
case -ERESTARTNOHAND:
|
|
no_system_call_restart:
|
|
regs->regs[REG_RET] = -EINTR;
|
|
+ regs->sr |= 1;
|
|
break;
|
|
|
|
case -ERESTARTSYS:
|
|
@@ -108,7 +109,8 @@
|
|
|
|
signr = get_signal_to_deliver(&info, &ka, regs, 0);
|
|
if (signr > 0) {
|
|
- handle_syscall_restart(regs, &ka.sa);
|
|
+ if (regs->sr & 1)
|
|
+ handle_syscall_restart(regs, &ka.sa);
|
|
|
|
/* Whee! Actually deliver the signal. */
|
|
if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sh/lib/checksum.S linux-2.6.29-rc3.owrt/arch/sh/lib/checksum.S
|
|
--- linux-2.6.29.owrt/arch/sh/lib/checksum.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sh/lib/checksum.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -36,7 +36,8 @@
|
|
*/
|
|
|
|
/*
|
|
- * asmlinkage __wsum csum_partial(const void *buf, int len, __wsum sum);
|
|
+ * unsigned int csum_partial(const unsigned char *buf, int len,
|
|
+ * unsigned int sum);
|
|
*/
|
|
|
|
.text
|
|
@@ -48,31 +49,11 @@
|
|
* Fortunately, it is easy to convert 2-byte alignment to 4-byte
|
|
* alignment for the unrolled loop.
|
|
*/
|
|
+ mov r5, r1
|
|
mov r4, r0
|
|
- tst #3, r0 ! Check alignment.
|
|
- bt/s 2f ! Jump if alignment is ok.
|
|
- mov r4, r7 ! Keep a copy to check for alignment
|
|
+ tst #2, r0 ! Check alignment.
|
|
+ bt 2f ! Jump if alignment is ok.
|
|
!
|
|
- tst #1, r0 ! Check alignment.
|
|
- bt 21f ! Jump if alignment is boundary of 2bytes.
|
|
-
|
|
- ! buf is odd
|
|
- tst r5, r5
|
|
- add #-1, r5
|
|
- bt 9f
|
|
- mov.b @r4+, r0
|
|
- extu.b r0, r0
|
|
- addc r0, r6 ! t=0 from previous tst
|
|
- mov r6, r0
|
|
- shll8 r6
|
|
- shlr16 r0
|
|
- shlr8 r0
|
|
- or r0, r6
|
|
- mov r4, r0
|
|
- tst #2, r0
|
|
- bt 2f
|
|
-21:
|
|
- ! buf is 2 byte aligned (len could be 0)
|
|
add #-2, r5 ! Alignment uses up two bytes.
|
|
cmp/pz r5 !
|
|
bt/s 1f ! Jump if we had at least two bytes.
|
|
@@ -80,17 +61,16 @@
|
|
bra 6f
|
|
add #2, r5 ! r5 was < 2. Deal with it.
|
|
1:
|
|
+ mov r5, r1 ! Save new len for later use.
|
|
mov.w @r4+, r0
|
|
extu.w r0, r0
|
|
addc r0, r6
|
|
bf 2f
|
|
add #1, r6
|
|
2:
|
|
- ! buf is 4 byte aligned (len could be 0)
|
|
- mov r5, r1
|
|
mov #-5, r0
|
|
- shld r0, r1
|
|
- tst r1, r1
|
|
+ shld r0, r5
|
|
+ tst r5, r5
|
|
bt/s 4f ! if it's =0, go to 4f
|
|
clrt
|
|
.align 2
|
|
@@ -112,31 +92,30 @@
|
|
addc r0, r6
|
|
addc r2, r6
|
|
movt r0
|
|
- dt r1
|
|
+ dt r5
|
|
bf/s 3b
|
|
cmp/eq #1, r0
|
|
- ! here, we know r1==0
|
|
- addc r1, r6 ! add carry to r6
|
|
+ ! here, we know r5==0
|
|
+ addc r5, r6 ! add carry to r6
|
|
4:
|
|
- mov r5, r0
|
|
+ mov r1, r0
|
|
and #0x1c, r0
|
|
tst r0, r0
|
|
- bt 6f
|
|
- ! 4 bytes or more remaining
|
|
- mov r0, r1
|
|
- shlr2 r1
|
|
+ bt/s 6f
|
|
+ mov r0, r5
|
|
+ shlr2 r5
|
|
mov #0, r2
|
|
5:
|
|
addc r2, r6
|
|
mov.l @r4+, r2
|
|
movt r0
|
|
- dt r1
|
|
+ dt r5
|
|
bf/s 5b
|
|
cmp/eq #1, r0
|
|
addc r2, r6
|
|
- addc r1, r6 ! r1==0 here, so it means add carry-bit
|
|
+ addc r5, r6 ! r5==0 here, so it means add carry-bit
|
|
6:
|
|
- ! 3 bytes or less remaining
|
|
+ mov r1, r5
|
|
mov #3, r0
|
|
and r0, r5
|
|
tst r5, r5
|
|
@@ -160,18 +139,8 @@
|
|
8:
|
|
addc r0, r6
|
|
mov #0, r0
|
|
- addc r0, r6
|
|
+ addc r0, r6
|
|
9:
|
|
- ! Check if the buffer was misaligned, if so realign sum
|
|
- mov r7, r0
|
|
- tst #1, r0
|
|
- bt 10f
|
|
- mov r6, r0
|
|
- shll8 r6
|
|
- shlr16 r0
|
|
- shlr8 r0
|
|
- or r0, r6
|
|
-10:
|
|
rts
|
|
mov r6, r0
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/include/asm/compat.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/compat.h
|
|
--- linux-2.6.29.owrt/arch/sparc/include/asm/compat.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/compat.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -240,9 +240,4 @@
|
|
unsigned int __unused2;
|
|
};
|
|
|
|
-static inline int is_compat_task(void)
|
|
-{
|
|
- return test_thread_flag(TIF_32BIT);
|
|
-}
|
|
-
|
|
#endif /* _ASM_SPARC64_COMPAT_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/include/asm/cpudata_64.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/cpudata_64.h
|
|
--- linux-2.6.29.owrt/arch/sparc/include/asm/cpudata_64.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/cpudata_64.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -17,7 +17,7 @@
|
|
typedef struct {
|
|
/* Dcache line 1 */
|
|
unsigned int __softirq_pending; /* must be 1st, see rtrap.S */
|
|
- unsigned int __nmi_count;
|
|
+ unsigned int __pad0;
|
|
unsigned long clock_tick; /* %tick's per second */
|
|
unsigned long __pad;
|
|
unsigned int __pad1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/include/asm/irq_64.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/irq_64.h
|
|
--- linux-2.6.29.owrt/arch/sparc/include/asm/irq_64.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/irq_64.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -66,6 +66,9 @@
|
|
extern void __init init_IRQ(void);
|
|
extern void fixup_irqs(void);
|
|
|
|
+extern int register_perfctr_intr(void (*handler)(struct pt_regs *));
|
|
+extern void release_perfctr_intr(void (*handler)(struct pt_regs *));
|
|
+
|
|
static inline void set_softint(unsigned long bits)
|
|
{
|
|
__asm__ __volatile__("wr %0, 0x0, %%set_softint"
|
|
@@ -95,6 +98,5 @@
|
|
extern void *hardirq_stack[NR_CPUS];
|
|
extern void *softirq_stack[NR_CPUS];
|
|
#define __ARCH_HAS_DO_SOFTIRQ
|
|
-#define ARCH_HAS_NMI_WATCHDOG
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/include/asm/kdebug_64.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/kdebug_64.h
|
|
--- linux-2.6.29.owrt/arch/sparc/include/asm/kdebug_64.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/kdebug_64.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -14,8 +14,6 @@
|
|
DIE_TRAP,
|
|
DIE_TRAP_TL1,
|
|
DIE_CALL,
|
|
- DIE_NMI,
|
|
- DIE_NMIWATCHDOG,
|
|
};
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/include/asm/nmi.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/nmi.h
|
|
--- linux-2.6.29.owrt/arch/sparc/include/asm/nmi.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/nmi.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,10 +0,0 @@
|
|
-#ifndef __NMI_H
|
|
-#define __NMI_H
|
|
-
|
|
-extern int __init nmi_init(void);
|
|
-extern void perfctr_irq(int irq, struct pt_regs *regs);
|
|
-extern void nmi_adjust_hz(unsigned int new_hz);
|
|
-
|
|
-extern int nmi_usable;
|
|
-
|
|
-#endif /* __NMI_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/include/asm/pcr.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/pcr.h
|
|
--- linux-2.6.29.owrt/arch/sparc/include/asm/pcr.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/pcr.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,46 +0,0 @@
|
|
-#ifndef __PCR_H
|
|
-#define __PCR_H
|
|
-
|
|
-struct pcr_ops {
|
|
- u64 (*read)(void);
|
|
- void (*write)(u64);
|
|
-};
|
|
-extern const struct pcr_ops *pcr_ops;
|
|
-
|
|
-extern void deferred_pcr_work_irq(int irq, struct pt_regs *regs);
|
|
-extern void schedule_deferred_pcr_work(void);
|
|
-
|
|
-#define PCR_PIC_PRIV 0x00000001 /* PIC access is privileged */
|
|
-#define PCR_STRACE 0x00000002 /* Trace supervisor events */
|
|
-#define PCR_UTRACE 0x00000004 /* Trace user events */
|
|
-#define PCR_N2_HTRACE 0x00000008 /* Trace hypervisor events */
|
|
-#define PCR_N2_TOE_OV0 0x00000010 /* Trap if PIC 0 overflows */
|
|
-#define PCR_N2_TOE_OV1 0x00000020 /* Trap if PIC 1 overflows */
|
|
-#define PCR_N2_MASK0 0x00003fc0
|
|
-#define PCR_N2_MASK0_SHIFT 6
|
|
-#define PCR_N2_SL0 0x0003c000
|
|
-#define PCR_N2_SL0_SHIFT 14
|
|
-#define PCR_N2_OV0 0x00040000
|
|
-#define PCR_N2_MASK1 0x07f80000
|
|
-#define PCR_N2_MASK1_SHIFT 19
|
|
-#define PCR_N2_SL1 0x78000000
|
|
-#define PCR_N2_SL1_SHIFT 27
|
|
-#define PCR_N2_OV1 0x80000000
|
|
-
|
|
-extern unsigned int picl_shift;
|
|
-
|
|
-/* In order to commonize as much of the implementation as
|
|
- * possible, we use PICH as our counter. Mostly this is
|
|
- * to accomodate Niagara-1 which can only count insn cycles
|
|
- * in PICH.
|
|
- */
|
|
-static inline u64 picl_value(unsigned int nmi_hz)
|
|
-{
|
|
- u32 delta = local_cpu_data().clock_tick / (nmi_hz << picl_shift);
|
|
-
|
|
- return ((u64)((0 - delta) & 0xffffffff)) << 32;
|
|
-}
|
|
-
|
|
-extern u64 pcr_enable;
|
|
-
|
|
-#endif /* __PCR_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/include/asm/pil.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/pil.h
|
|
--- linux-2.6.29.owrt/arch/sparc/include/asm/pil.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/pil.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -23,8 +23,6 @@
|
|
#define PIL_SMP_CTX_NEW_VERSION 4
|
|
#define PIL_DEVICE_IRQ 5
|
|
#define PIL_SMP_CALL_FUNC_SNGL 6
|
|
-#define PIL_DEFERRED_PCR_WORK 7
|
|
-#define PIL_KGDB_CAPTURE 8
|
|
#define PIL_NORMAL_MAX 14
|
|
#define PIL_NMI 15
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/include/asm/seccomp.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/seccomp.h
|
|
--- linux-2.6.29.owrt/arch/sparc/include/asm/seccomp.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/seccomp.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,5 +1,11 @@
|
|
#ifndef _ASM_SECCOMP_H
|
|
|
|
+#include <linux/thread_info.h> /* already defines TIF_32BIT */
|
|
+
|
|
+#ifndef TIF_32BIT
|
|
+#error "unexpected TIF_32BIT on sparc64"
|
|
+#endif
|
|
+
|
|
#include <linux/unistd.h>
|
|
|
|
#define __NR_seccomp_read __NR_read
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/chmc.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/chmc.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/chmc.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/chmc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -306,7 +306,6 @@
|
|
buf[1] = '?';
|
|
buf[2] = '?';
|
|
buf[3] = '\0';
|
|
- return 0;
|
|
}
|
|
p = dp->controller;
|
|
prop = &p->layout;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/cpu.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/cpu.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/cpu.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/cpu.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -26,7 +26,6 @@
|
|
struct cpu_info {
|
|
int psr_vers;
|
|
const char *name;
|
|
- const char *pmu_name;
|
|
};
|
|
|
|
struct fpu_info {
|
|
@@ -46,9 +45,6 @@
|
|
#define CPU(ver, _name) \
|
|
{ .psr_vers = ver, .name = _name }
|
|
|
|
-#define CPU_PMU(ver, _name, _pmu_name) \
|
|
-{ .psr_vers = ver, .name = _name, .pmu_name = _pmu_name }
|
|
-
|
|
#define FPU(ver, _name) \
|
|
{ .fp_vers = ver, .name = _name }
|
|
|
|
@@ -187,10 +183,10 @@
|
|
},{
|
|
0x17,
|
|
.cpu_info = {
|
|
- CPU_PMU(0x10, "TI UltraSparc I (SpitFire)", "ultra12"),
|
|
- CPU_PMU(0x11, "TI UltraSparc II (BlackBird)", "ultra12"),
|
|
- CPU_PMU(0x12, "TI UltraSparc IIi (Sabre)", "ultra12"),
|
|
- CPU_PMU(0x13, "TI UltraSparc IIe (Hummingbird)", "ultra12"),
|
|
+ CPU(0x10, "TI UltraSparc I (SpitFire)"),
|
|
+ CPU(0x11, "TI UltraSparc II (BlackBird)"),
|
|
+ CPU(0x12, "TI UltraSparc IIi (Sabre)"),
|
|
+ CPU(0x13, "TI UltraSparc IIe (Hummingbird)"),
|
|
CPU(-1, NULL)
|
|
},
|
|
.fpu_info = {
|
|
@@ -203,7 +199,7 @@
|
|
},{
|
|
0x22,
|
|
.cpu_info = {
|
|
- CPU_PMU(0x10, "TI UltraSparc I (SpitFire)", "ultra12"),
|
|
+ CPU(0x10, "TI UltraSparc I (SpitFire)"),
|
|
CPU(-1, NULL)
|
|
},
|
|
.fpu_info = {
|
|
@@ -213,12 +209,12 @@
|
|
},{
|
|
0x3e,
|
|
.cpu_info = {
|
|
- CPU_PMU(0x14, "TI UltraSparc III (Cheetah)", "ultra3"),
|
|
- CPU_PMU(0x15, "TI UltraSparc III+ (Cheetah+)", "ultra3+"),
|
|
- CPU_PMU(0x16, "TI UltraSparc IIIi (Jalapeno)", "ultra3i"),
|
|
- CPU_PMU(0x18, "TI UltraSparc IV (Jaguar)", "ultra3+"),
|
|
- CPU_PMU(0x19, "TI UltraSparc IV+ (Panther)", "ultra4+"),
|
|
- CPU_PMU(0x22, "TI UltraSparc IIIi+ (Serrano)", "ultra3i"),
|
|
+ CPU(0x14, "TI UltraSparc III (Cheetah)"),
|
|
+ CPU(0x15, "TI UltraSparc III+ (Cheetah+)"),
|
|
+ CPU(0x16, "TI UltraSparc IIIi (Jalapeno)"),
|
|
+ CPU(0x18, "TI UltraSparc IV (Jaguar)"),
|
|
+ CPU(0x19, "TI UltraSparc IV+ (Panther)"),
|
|
+ CPU(0x22, "TI UltraSparc IIIi+ (Serrano)"),
|
|
CPU(-1, NULL)
|
|
},
|
|
.fpu_info = {
|
|
@@ -238,7 +234,6 @@
|
|
|
|
const char *sparc_cpu_type;
|
|
const char *sparc_fpu_type;
|
|
-const char *sparc_pmu_type;
|
|
|
|
unsigned int fsr_storage;
|
|
|
|
@@ -249,7 +244,6 @@
|
|
|
|
sparc_cpu_type = NULL;
|
|
sparc_fpu_type = NULL;
|
|
- sparc_pmu_type = NULL;
|
|
manuf = NULL;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(manufacturer_info); i++)
|
|
@@ -269,7 +263,6 @@
|
|
{
|
|
if (cpu->psr_vers == psr_vers) {
|
|
sparc_cpu_type = cpu->name;
|
|
- sparc_pmu_type = cpu->pmu_name;
|
|
sparc_fpu_type = "No FPU";
|
|
break;
|
|
}
|
|
@@ -297,8 +290,6 @@
|
|
psr_impl, fpu_vers);
|
|
sparc_fpu_type = "Unknown FPU";
|
|
}
|
|
- if (sparc_pmu_type == NULL)
|
|
- sparc_pmu_type = "Unknown PMU";
|
|
}
|
|
|
|
#ifdef CONFIG_SPARC32
|
|
@@ -324,13 +315,11 @@
|
|
case SUN4V_CHIP_NIAGARA1:
|
|
sparc_cpu_type = "UltraSparc T1 (Niagara)";
|
|
sparc_fpu_type = "UltraSparc T1 integrated FPU";
|
|
- sparc_pmu_type = "niagara";
|
|
break;
|
|
|
|
case SUN4V_CHIP_NIAGARA2:
|
|
sparc_cpu_type = "UltraSparc T2 (Niagara2)";
|
|
sparc_fpu_type = "UltraSparc T2 integrated FPU";
|
|
- sparc_pmu_type = "niagara2";
|
|
break;
|
|
|
|
default:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/head_64.S linux-2.6.29-rc3.owrt/arch/sparc/kernel/head_64.S
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/head_64.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/head_64.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -891,35 +891,10 @@
|
|
tlb_type: .word 0 /* Must NOT end up in BSS */
|
|
.section ".fixup",#alloc,#execinstr
|
|
|
|
- .globl __ret_efault, __retl_efault, __ret_one, __retl_one
|
|
-ENTRY(__ret_efault)
|
|
+ .globl __ret_efault, __retl_efault
|
|
+__ret_efault:
|
|
ret
|
|
restore %g0, -EFAULT, %o0
|
|
-ENDPROC(__ret_efault)
|
|
-
|
|
-ENTRY(__retl_efault)
|
|
+__retl_efault:
|
|
retl
|
|
mov -EFAULT, %o0
|
|
-ENDPROC(__retl_efault)
|
|
-
|
|
-ENTRY(__retl_one)
|
|
- retl
|
|
- mov 1, %o0
|
|
-ENDPROC(__retl_one)
|
|
-
|
|
-ENTRY(__ret_one_asi)
|
|
- wr %g0, ASI_AIUS, %asi
|
|
- ret
|
|
- restore %g0, 1, %o0
|
|
-ENDPROC(__ret_one_asi)
|
|
-
|
|
-ENTRY(__retl_one_asi)
|
|
- wr %g0, ASI_AIUS, %asi
|
|
- retl
|
|
- mov 1, %o0
|
|
-ENDPROC(__retl_one_asi)
|
|
-
|
|
-ENTRY(__retl_o1)
|
|
- retl
|
|
- mov %o1, %o0
|
|
-ENDPROC(__retl_o1)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/irq_64.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/irq_64.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/irq_64.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/irq_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -196,11 +196,6 @@
|
|
seq_putc(p, '\n');
|
|
skip:
|
|
spin_unlock_irqrestore(&irq_desc[i].lock, flags);
|
|
- } else if (i == NR_IRQS) {
|
|
- seq_printf(p, "NMI: ");
|
|
- for_each_online_cpu(j)
|
|
- seq_printf(p, "%10u ", cpu_data(j).__nmi_count);
|
|
- seq_printf(p, " Non-maskable interrupts\n");
|
|
}
|
|
return 0;
|
|
}
|
|
@@ -323,25 +318,17 @@
|
|
sun4u_irq_enable(virt_irq);
|
|
}
|
|
|
|
-/* Don't do anything. The desc->status check for IRQ_DISABLED in
|
|
- * handler_irq() will skip the handler call and that will leave the
|
|
- * interrupt in the sent state. The next ->enable() call will hit the
|
|
- * ICLR register to reset the state machine.
|
|
- *
|
|
- * This scheme is necessary, instead of clearing the Valid bit in the
|
|
- * IMAP register, to handle the case of IMAP registers being shared by
|
|
- * multiple INOs (and thus ICLR registers). Since we use a different
|
|
- * virtual IRQ for each shared IMAP instance, the generic code thinks
|
|
- * there is only one user so it prematurely calls ->disable() on
|
|
- * free_irq().
|
|
- *
|
|
- * We have to provide an explicit ->disable() method instead of using
|
|
- * NULL to get the default. The reason is that if the generic code
|
|
- * sees that, it also hooks up a default ->shutdown method which
|
|
- * invokes ->mask() which we do not want. See irq_chip_set_defaults().
|
|
- */
|
|
static void sun4u_irq_disable(unsigned int virt_irq)
|
|
{
|
|
+ struct irq_handler_data *data = get_irq_chip_data(virt_irq);
|
|
+
|
|
+ if (likely(data)) {
|
|
+ unsigned long imap = data->imap;
|
|
+ unsigned long tmp = upa_readq(imap);
|
|
+
|
|
+ tmp &= ~IMAP_VALID;
|
|
+ upa_writeq(tmp, imap);
|
|
+ }
|
|
}
|
|
|
|
static void sun4u_irq_eoi(unsigned int virt_irq)
|
|
@@ -754,8 +741,7 @@
|
|
|
|
desc = irq_desc + virt_irq;
|
|
|
|
- if (!(desc->status & IRQ_DISABLED))
|
|
- desc->handle_irq(virt_irq, desc);
|
|
+ desc->handle_irq(virt_irq, desc);
|
|
|
|
bucket_pa = next_pa;
|
|
}
|
|
@@ -792,6 +778,69 @@
|
|
local_irq_restore(flags);
|
|
}
|
|
|
|
+static void unhandled_perf_irq(struct pt_regs *regs)
|
|
+{
|
|
+ unsigned long pcr, pic;
|
|
+
|
|
+ read_pcr(pcr);
|
|
+ read_pic(pic);
|
|
+
|
|
+ write_pcr(0);
|
|
+
|
|
+ printk(KERN_EMERG "CPU %d: Got unexpected perf counter IRQ.\n",
|
|
+ smp_processor_id());
|
|
+ printk(KERN_EMERG "CPU %d: PCR[%016lx] PIC[%016lx]\n",
|
|
+ smp_processor_id(), pcr, pic);
|
|
+}
|
|
+
|
|
+/* Almost a direct copy of the powerpc PMC code. */
|
|
+static DEFINE_SPINLOCK(perf_irq_lock);
|
|
+static void *perf_irq_owner_caller; /* mostly for debugging */
|
|
+static void (*perf_irq)(struct pt_regs *regs) = unhandled_perf_irq;
|
|
+
|
|
+/* Invoked from level 15 PIL handler in trap table. */
|
|
+void perfctr_irq(int irq, struct pt_regs *regs)
|
|
+{
|
|
+ clear_softint(1 << irq);
|
|
+ perf_irq(regs);
|
|
+}
|
|
+
|
|
+int register_perfctr_intr(void (*handler)(struct pt_regs *))
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ if (!handler)
|
|
+ return -EINVAL;
|
|
+
|
|
+ spin_lock(&perf_irq_lock);
|
|
+ if (perf_irq != unhandled_perf_irq) {
|
|
+ printk(KERN_WARNING "register_perfctr_intr: "
|
|
+ "perf IRQ busy (reserved by caller %p)\n",
|
|
+ perf_irq_owner_caller);
|
|
+ ret = -EBUSY;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ perf_irq_owner_caller = __builtin_return_address(0);
|
|
+ perf_irq = handler;
|
|
+
|
|
+ ret = 0;
|
|
+out:
|
|
+ spin_unlock(&perf_irq_lock);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(register_perfctr_intr);
|
|
+
|
|
+void release_perfctr_intr(void (*handler)(struct pt_regs *))
|
|
+{
|
|
+ spin_lock(&perf_irq_lock);
|
|
+ perf_irq_owner_caller = NULL;
|
|
+ perf_irq = unhandled_perf_irq;
|
|
+ spin_unlock(&perf_irq_lock);
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(release_perfctr_intr);
|
|
+
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
void fixup_irqs(void)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/kernel.h linux-2.6.29-rc3.owrt/arch/sparc/kernel/kernel.h
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/kernel.h 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/kernel.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,7 +5,6 @@
|
|
|
|
/* cpu.c */
|
|
extern const char *sparc_cpu_type;
|
|
-extern const char *sparc_pmu_type;
|
|
extern const char *sparc_fpu_type;
|
|
|
|
extern unsigned int fsr_storage;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/kgdb_64.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/kgdb_64.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/kgdb_64.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/kgdb_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -108,7 +108,7 @@
|
|
}
|
|
|
|
#ifdef CONFIG_SMP
|
|
-void smp_kgdb_capture_client(int irq, struct pt_regs *regs)
|
|
+void smp_kgdb_capture_client(struct pt_regs *regs)
|
|
{
|
|
unsigned long flags;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/Makefile linux-2.6.29-rc3.owrt/arch/sparc/kernel/Makefile
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/Makefile 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -52,8 +52,6 @@
|
|
obj-$(CONFIG_SPARC64) += hvapi.o
|
|
obj-$(CONFIG_SPARC64) += sstate.o
|
|
obj-$(CONFIG_SPARC64) += mdesc.o
|
|
-obj-$(CONFIG_SPARC64) += pcr.o
|
|
-obj-$(CONFIG_SPARC64) += nmi.o
|
|
|
|
# sparc32 do not use GENERIC_HARDIRQS but uses the generic devres implementation
|
|
obj-$(CONFIG_SPARC32) += devres.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/nmi.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/nmi.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/nmi.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/nmi.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,225 +0,0 @@
|
|
-/* Pseudo NMI support on sparc64 systems.
|
|
- *
|
|
- * Copyright (C) 2009 David S. Miller <davem@davemloft.net>
|
|
- *
|
|
- * The NMI watchdog support and infrastructure is based almost
|
|
- * entirely upon the x86 NMI support code.
|
|
- */
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/param.h>
|
|
-#include <linux/init.h>
|
|
-#include <linux/percpu.h>
|
|
-#include <linux/nmi.h>
|
|
-#include <linux/module.h>
|
|
-#include <linux/kprobes.h>
|
|
-#include <linux/kernel_stat.h>
|
|
-#include <linux/slab.h>
|
|
-#include <linux/kdebug.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/smp.h>
|
|
-
|
|
-#include <asm/ptrace.h>
|
|
-#include <asm/local.h>
|
|
-#include <asm/pcr.h>
|
|
-
|
|
-/* We don't have a real NMI on sparc64, but we can fake one
|
|
- * up using profiling counter overflow interrupts and interrupt
|
|
- * levels.
|
|
- *
|
|
- * The profile overflow interrupts at level 15, so we use
|
|
- * level 14 as our IRQ off level.
|
|
- */
|
|
-
|
|
-static int nmi_watchdog_active;
|
|
-static int panic_on_timeout;
|
|
-
|
|
-int nmi_usable;
|
|
-EXPORT_SYMBOL_GPL(nmi_usable);
|
|
-
|
|
-static unsigned int nmi_hz = HZ;
|
|
-
|
|
-static DEFINE_PER_CPU(unsigned int, last_irq_sum);
|
|
-static DEFINE_PER_CPU(local_t, alert_counter);
|
|
-static DEFINE_PER_CPU(int, nmi_touch);
|
|
-
|
|
-void touch_nmi_watchdog(void)
|
|
-{
|
|
- if (nmi_watchdog_active) {
|
|
- int cpu;
|
|
-
|
|
- for_each_present_cpu(cpu) {
|
|
- if (per_cpu(nmi_touch, cpu) != 1)
|
|
- per_cpu(nmi_touch, cpu) = 1;
|
|
- }
|
|
- }
|
|
-
|
|
- touch_softlockup_watchdog();
|
|
-}
|
|
-EXPORT_SYMBOL(touch_nmi_watchdog);
|
|
-
|
|
-static void die_nmi(const char *str, struct pt_regs *regs, int do_panic)
|
|
-{
|
|
- if (notify_die(DIE_NMIWATCHDOG, str, regs, 0,
|
|
- pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP)
|
|
- return;
|
|
-
|
|
- console_verbose();
|
|
- bust_spinlocks(1);
|
|
-
|
|
- printk(KERN_EMERG "%s", str);
|
|
- printk(" on CPU%d, ip %08lx, registers:\n",
|
|
- smp_processor_id(), regs->tpc);
|
|
- show_regs(regs);
|
|
- dump_stack();
|
|
-
|
|
- bust_spinlocks(0);
|
|
-
|
|
- if (do_panic || panic_on_oops)
|
|
- panic("Non maskable interrupt");
|
|
-
|
|
- local_irq_enable();
|
|
- do_exit(SIGBUS);
|
|
-}
|
|
-
|
|
-notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs)
|
|
-{
|
|
- unsigned int sum, touched = 0;
|
|
- int cpu = smp_processor_id();
|
|
-
|
|
- clear_softint(1 << irq);
|
|
- pcr_ops->write(PCR_PIC_PRIV);
|
|
-
|
|
- local_cpu_data().__nmi_count++;
|
|
-
|
|
- if (notify_die(DIE_NMI, "nmi", regs, 0,
|
|
- pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP)
|
|
- touched = 1;
|
|
-
|
|
- sum = kstat_irqs_cpu(0, cpu);
|
|
- if (__get_cpu_var(nmi_touch)) {
|
|
- __get_cpu_var(nmi_touch) = 0;
|
|
- touched = 1;
|
|
- }
|
|
- if (!touched && __get_cpu_var(last_irq_sum) == sum) {
|
|
- local_inc(&__get_cpu_var(alert_counter));
|
|
- if (local_read(&__get_cpu_var(alert_counter)) == 5 * nmi_hz)
|
|
- die_nmi("BUG: NMI Watchdog detected LOCKUP",
|
|
- regs, panic_on_timeout);
|
|
- } else {
|
|
- __get_cpu_var(last_irq_sum) = sum;
|
|
- local_set(&__get_cpu_var(alert_counter), 0);
|
|
- }
|
|
- if (nmi_usable) {
|
|
- write_pic(picl_value(nmi_hz));
|
|
- pcr_ops->write(pcr_enable);
|
|
- }
|
|
-}
|
|
-
|
|
-static inline unsigned int get_nmi_count(int cpu)
|
|
-{
|
|
- return cpu_data(cpu).__nmi_count;
|
|
-}
|
|
-
|
|
-static int endflag __initdata;
|
|
-
|
|
-static __init void nmi_cpu_busy(void *data)
|
|
-{
|
|
- local_irq_enable_in_hardirq();
|
|
- while (endflag == 0)
|
|
- mb();
|
|
-}
|
|
-
|
|
-static void report_broken_nmi(int cpu, int *prev_nmi_count)
|
|
-{
|
|
- printk(KERN_CONT "\n");
|
|
-
|
|
- printk(KERN_WARNING
|
|
- "WARNING: CPU#%d: NMI appears to be stuck (%d->%d)!\n",
|
|
- cpu, prev_nmi_count[cpu], get_nmi_count(cpu));
|
|
-
|
|
- printk(KERN_WARNING
|
|
- "Please report this to bugzilla.kernel.org,\n");
|
|
- printk(KERN_WARNING
|
|
- "and attach the output of the 'dmesg' command.\n");
|
|
-
|
|
- nmi_usable = 0;
|
|
-}
|
|
-
|
|
-static void stop_watchdog(void *unused)
|
|
-{
|
|
- pcr_ops->write(PCR_PIC_PRIV);
|
|
-}
|
|
-
|
|
-static int __init check_nmi_watchdog(void)
|
|
-{
|
|
- unsigned int *prev_nmi_count;
|
|
- int cpu, err;
|
|
-
|
|
- prev_nmi_count = kmalloc(nr_cpu_ids * sizeof(unsigned int), GFP_KERNEL);
|
|
- if (!prev_nmi_count) {
|
|
- err = -ENOMEM;
|
|
- goto error;
|
|
- }
|
|
-
|
|
- printk(KERN_INFO "Testing NMI watchdog ... ");
|
|
-
|
|
- smp_call_function(nmi_cpu_busy, (void *)&endflag, 0);
|
|
-
|
|
- for_each_possible_cpu(cpu)
|
|
- prev_nmi_count[cpu] = get_nmi_count(cpu);
|
|
- local_irq_enable();
|
|
- mdelay((20 * 1000) / nmi_hz); /* wait 20 ticks */
|
|
-
|
|
- for_each_online_cpu(cpu) {
|
|
- if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5)
|
|
- report_broken_nmi(cpu, prev_nmi_count);
|
|
- }
|
|
- endflag = 1;
|
|
- if (!nmi_usable) {
|
|
- kfree(prev_nmi_count);
|
|
- err = -ENODEV;
|
|
- goto error;
|
|
- }
|
|
- printk("OK.\n");
|
|
-
|
|
- nmi_hz = 1;
|
|
-
|
|
- kfree(prev_nmi_count);
|
|
- return 0;
|
|
-error:
|
|
- on_each_cpu(stop_watchdog, NULL, 1);
|
|
- return err;
|
|
-}
|
|
-
|
|
-static void start_watchdog(void *unused)
|
|
-{
|
|
- pcr_ops->write(PCR_PIC_PRIV);
|
|
- write_pic(picl_value(nmi_hz));
|
|
-
|
|
- pcr_ops->write(pcr_enable);
|
|
-}
|
|
-
|
|
-void nmi_adjust_hz(unsigned int new_hz)
|
|
-{
|
|
- nmi_hz = new_hz;
|
|
- on_each_cpu(start_watchdog, NULL, 1);
|
|
-}
|
|
-EXPORT_SYMBOL_GPL(nmi_adjust_hz);
|
|
-
|
|
-int __init nmi_init(void)
|
|
-{
|
|
- nmi_usable = 1;
|
|
-
|
|
- on_each_cpu(start_watchdog, NULL, 1);
|
|
-
|
|
- return check_nmi_watchdog();
|
|
-}
|
|
-
|
|
-static int __init setup_nmi_watchdog(char *str)
|
|
-{
|
|
- if (!strncmp(str, "panic", 5))
|
|
- panic_on_timeout = 1;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-__setup("nmi_watchdog=", setup_nmi_watchdog);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/pci_common.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/pci_common.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/pci_common.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/pci_common.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -368,7 +368,7 @@
|
|
const u32 *vdma = of_get_property(pbm->op->node, "virtual-dma", NULL);
|
|
|
|
if (vdma) {
|
|
- struct resource *rp = kzalloc(sizeof(*rp), GFP_KERNEL);
|
|
+ struct resource *rp = kmalloc(sizeof(*rp), GFP_KERNEL);
|
|
|
|
if (!rp) {
|
|
prom_printf("Cannot allocate IOMMU resource.\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/pcr.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/pcr.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/pcr.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/pcr.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,158 +0,0 @@
|
|
-/* pcr.c: Generic sparc64 performance counter infrastructure.
|
|
- *
|
|
- * Copyright (C) 2009 David S. Miller (davem@davemloft.net)
|
|
- */
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/module.h>
|
|
-#include <linux/init.h>
|
|
-#include <linux/irq.h>
|
|
-
|
|
-#include <asm/pil.h>
|
|
-#include <asm/pcr.h>
|
|
-#include <asm/nmi.h>
|
|
-
|
|
-/* This code is shared between various users of the performance
|
|
- * counters. Users will be oprofile, pseudo-NMI watchdog, and the
|
|
- * perf_counter support layer.
|
|
- */
|
|
-
|
|
-#define PCR_SUN4U_ENABLE (PCR_PIC_PRIV | PCR_STRACE | PCR_UTRACE)
|
|
-#define PCR_N2_ENABLE (PCR_PIC_PRIV | PCR_STRACE | PCR_UTRACE | \
|
|
- PCR_N2_TOE_OV1 | \
|
|
- (2 << PCR_N2_SL1_SHIFT) | \
|
|
- (0xff << PCR_N2_MASK1_SHIFT))
|
|
-
|
|
-u64 pcr_enable;
|
|
-unsigned int picl_shift;
|
|
-
|
|
-/* Performance counter interrupts run unmasked at PIL level 15.
|
|
- * Therefore we can't do things like wakeups and other work
|
|
- * that expects IRQ disabling to be adhered to in locking etc.
|
|
- *
|
|
- * Therefore in such situations we defer the work by signalling
|
|
- * a lower level cpu IRQ.
|
|
- */
|
|
-void deferred_pcr_work_irq(int irq, struct pt_regs *regs)
|
|
-{
|
|
- clear_softint(1 << PIL_DEFERRED_PCR_WORK);
|
|
-}
|
|
-
|
|
-void schedule_deferred_pcr_work(void)
|
|
-{
|
|
- set_softint(1 << PIL_DEFERRED_PCR_WORK);
|
|
-}
|
|
-
|
|
-const struct pcr_ops *pcr_ops;
|
|
-EXPORT_SYMBOL_GPL(pcr_ops);
|
|
-
|
|
-static u64 direct_pcr_read(void)
|
|
-{
|
|
- u64 val;
|
|
-
|
|
- read_pcr(val);
|
|
- return val;
|
|
-}
|
|
-
|
|
-static void direct_pcr_write(u64 val)
|
|
-{
|
|
- write_pcr(val);
|
|
-}
|
|
-
|
|
-static const struct pcr_ops direct_pcr_ops = {
|
|
- .read = direct_pcr_read,
|
|
- .write = direct_pcr_write,
|
|
-};
|
|
-
|
|
-static void n2_pcr_write(u64 val)
|
|
-{
|
|
- unsigned long ret;
|
|
-
|
|
- ret = sun4v_niagara2_setperf(HV_N2_PERF_SPARC_CTL, val);
|
|
- if (val != HV_EOK)
|
|
- write_pcr(val);
|
|
-}
|
|
-
|
|
-static const struct pcr_ops n2_pcr_ops = {
|
|
- .read = direct_pcr_read,
|
|
- .write = n2_pcr_write,
|
|
-};
|
|
-
|
|
-static unsigned long perf_hsvc_group;
|
|
-static unsigned long perf_hsvc_major;
|
|
-static unsigned long perf_hsvc_minor;
|
|
-
|
|
-static int __init register_perf_hsvc(void)
|
|
-{
|
|
- if (tlb_type == hypervisor) {
|
|
- switch (sun4v_chip_type) {
|
|
- case SUN4V_CHIP_NIAGARA1:
|
|
- perf_hsvc_group = HV_GRP_NIAG_PERF;
|
|
- break;
|
|
-
|
|
- case SUN4V_CHIP_NIAGARA2:
|
|
- perf_hsvc_group = HV_GRP_N2_CPU;
|
|
- break;
|
|
-
|
|
- default:
|
|
- return -ENODEV;
|
|
- }
|
|
-
|
|
-
|
|
- perf_hsvc_major = 1;
|
|
- perf_hsvc_minor = 0;
|
|
- if (sun4v_hvapi_register(perf_hsvc_group,
|
|
- perf_hsvc_major,
|
|
- &perf_hsvc_minor)) {
|
|
- printk("perfmon: Could not register hvapi.\n");
|
|
- return -ENODEV;
|
|
- }
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void __init unregister_perf_hsvc(void)
|
|
-{
|
|
- if (tlb_type != hypervisor)
|
|
- return;
|
|
- sun4v_hvapi_unregister(perf_hsvc_group);
|
|
-}
|
|
-
|
|
-int __init pcr_arch_init(void)
|
|
-{
|
|
- int err = register_perf_hsvc();
|
|
-
|
|
- if (err)
|
|
- return err;
|
|
-
|
|
- switch (tlb_type) {
|
|
- case hypervisor:
|
|
- pcr_ops = &n2_pcr_ops;
|
|
- pcr_enable = PCR_N2_ENABLE;
|
|
- picl_shift = 2;
|
|
- break;
|
|
-
|
|
- case cheetah:
|
|
- case cheetah_plus:
|
|
- pcr_ops = &direct_pcr_ops;
|
|
- pcr_enable = PCR_SUN4U_ENABLE;
|
|
- break;
|
|
-
|
|
- case spitfire:
|
|
- /* UltraSPARC-I/II and derivatives lack a profile
|
|
- * counter overflow interrupt so we can't make use of
|
|
- * their hardware currently.
|
|
- */
|
|
- /* fallthrough */
|
|
- default:
|
|
- err = -ENODEV;
|
|
- goto out_unregister;
|
|
- }
|
|
-
|
|
- return nmi_init();
|
|
-
|
|
-out_unregister:
|
|
- unregister_perf_hsvc();
|
|
- return err;
|
|
-}
|
|
-
|
|
-arch_initcall(pcr_arch_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/process_64.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/process_64.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/process_64.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/process_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -29,7 +29,6 @@
|
|
#include <linux/cpu.h>
|
|
#include <linux/elfcore.h>
|
|
#include <linux/sysrq.h>
|
|
-#include <linux/nmi.h>
|
|
|
|
#include <asm/uaccess.h>
|
|
#include <asm/system.h>
|
|
@@ -53,10 +52,8 @@
|
|
|
|
static void sparc64_yield(int cpu)
|
|
{
|
|
- if (tlb_type != hypervisor) {
|
|
- touch_nmi_watchdog();
|
|
+ if (tlb_type != hypervisor)
|
|
return;
|
|
- }
|
|
|
|
clear_thread_flag(TIF_POLLING_NRFLAG);
|
|
smp_mb__after_clear_bit();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/setup_64.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/setup_64.c
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/setup_64.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/setup_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -354,7 +354,6 @@
|
|
seq_printf(m,
|
|
"cpu\t\t: %s\n"
|
|
"fpu\t\t: %s\n"
|
|
- "pmu\t\t: %s\n"
|
|
"prom\t\t: %s\n"
|
|
"type\t\t: %s\n"
|
|
"ncpus probed\t: %d\n"
|
|
@@ -367,7 +366,6 @@
|
|
,
|
|
sparc_cpu_type,
|
|
sparc_fpu_type,
|
|
- sparc_pmu_type,
|
|
prom_version,
|
|
((tlb_type == hypervisor) ?
|
|
"sun4v" :
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/kernel/ttable.S linux-2.6.29-rc3.owrt/arch/sparc/kernel/ttable.S
|
|
--- linux-2.6.29.owrt/arch/sparc/kernel/ttable.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/ttable.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -63,13 +63,7 @@
|
|
#else
|
|
tl0_irq6: BTRAP(0x46)
|
|
#endif
|
|
-tl0_irq7: TRAP_IRQ(deferred_pcr_work_irq, 7)
|
|
-#ifdef CONFIG_KGDB
|
|
-tl0_irq8: TRAP_IRQ(smp_kgdb_capture_client, 8)
|
|
-#else
|
|
-tl0_irq8: BTRAP(0x48)
|
|
-#endif
|
|
-tl0_irq9: BTRAP(0x49)
|
|
+tl0_irq7: BTRAP(0x47) BTRAP(0x48) BTRAP(0x49)
|
|
tl0_irq10: BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d)
|
|
tl0_irq14: TRAP_IRQ(timer_interrupt, 14)
|
|
tl0_irq15: TRAP_NMI_IRQ(perfctr_irq, 15)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/bzero.S linux-2.6.29-rc3.owrt/arch/sparc/lib/bzero.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/bzero.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/bzero.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -88,9 +88,13 @@
|
|
|
|
#define EX_ST(x,y) \
|
|
98: x,y; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov %o1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_o1; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/copy_in_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/copy_in_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/copy_in_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/copy_in_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,16 +3,19 @@
|
|
* Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
|
|
*/
|
|
|
|
-#include <linux/linkage.h>
|
|
#include <asm/asi.h>
|
|
|
|
#define XCC xcc
|
|
|
|
#define EX(x,y) \
|
|
98: x,y; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -28,7 +31,18 @@
|
|
* to copy register windows around during thread cloning.
|
|
*/
|
|
|
|
-ENTRY(___copy_in_user) /* %o0=dst, %o1=src, %o2=len */
|
|
+ .globl ___copy_in_user
|
|
+ .type ___copy_in_user,#function
|
|
+___copy_in_user: /* %o0=dst, %o1=src, %o2=len */
|
|
+ /* Writing to %asi is _expensive_ so we hardcode it.
|
|
+ * Reading %asi to check for KERNEL_DS is comparatively
|
|
+ * cheap.
|
|
+ */
|
|
+ rd %asi, %g1
|
|
+ cmp %g1, ASI_AIUS
|
|
+ bne,pn %icc, memcpy_user_stub
|
|
+ nop
|
|
+
|
|
cmp %o2, 0
|
|
be,pn %XCC, 85f
|
|
or %o0, %o1, %o3
|
|
@@ -39,24 +53,22 @@
|
|
/* 16 < len <= 64 */
|
|
andcc %o3, 0x7, %g0
|
|
bne,pn %XCC, 90f
|
|
- nop
|
|
+ sub %o0, %o1, %o3
|
|
|
|
andn %o2, 0x7, %o4
|
|
and %o2, 0x7, %o2
|
|
1: subcc %o4, 0x8, %o4
|
|
EX(ldxa [%o1] %asi, %o5)
|
|
- EX(stxa %o5, [%o0] %asi)
|
|
- add %o1, 0x8, %o1
|
|
+ EX(stxa %o5, [%o1 + %o3] ASI_AIUS)
|
|
bgu,pt %XCC, 1b
|
|
- add %o0, 0x8, %o0
|
|
+ add %o1, 0x8, %o1
|
|
andcc %o2, 0x4, %g0
|
|
be,pt %XCC, 1f
|
|
nop
|
|
sub %o2, 0x4, %o2
|
|
EX(lduwa [%o1] %asi, %o5)
|
|
- EX(stwa %o5, [%o0] %asi)
|
|
+ EX(stwa %o5, [%o1 + %o3] ASI_AIUS)
|
|
add %o1, 0x4, %o1
|
|
- add %o0, 0x4, %o0
|
|
1: cmp %o2, 0
|
|
be,pt %XCC, 85f
|
|
nop
|
|
@@ -66,15 +78,14 @@
|
|
80: /* 0 < len <= 16 */
|
|
andcc %o3, 0x3, %g0
|
|
bne,pn %XCC, 90f
|
|
- nop
|
|
+ sub %o0, %o1, %o3
|
|
|
|
82:
|
|
subcc %o2, 4, %o2
|
|
EX(lduwa [%o1] %asi, %g1)
|
|
- EX(stwa %g1, [%o0] %asi)
|
|
- add %o1, 4, %o1
|
|
+ EX(stwa %g1, [%o1 + %o3] ASI_AIUS)
|
|
bgu,pt %XCC, 82b
|
|
- add %o0, 4, %o0
|
|
+ add %o1, 4, %o1
|
|
|
|
85: retl
|
|
clr %o0
|
|
@@ -83,10 +94,26 @@
|
|
90:
|
|
subcc %o2, 1, %o2
|
|
EX(lduba [%o1] %asi, %g1)
|
|
- EX(stba %g1, [%o0] %asi)
|
|
- add %o1, 1, %o1
|
|
+ EX(stba %g1, [%o1 + %o3] ASI_AIUS)
|
|
bgu,pt %XCC, 90b
|
|
- add %o0, 1, %o0
|
|
+ add %o1, 1, %o1
|
|
retl
|
|
clr %o0
|
|
-ENDPROC(___copy_in_user)
|
|
+
|
|
+ .size ___copy_in_user, .-___copy_in_user
|
|
+
|
|
+ /* Act like copy_{to,in}_user(), ie. return zero instead
|
|
+ * of original destination pointer. This is invoked when
|
|
+ * copy_{to,in}_user() finds that %asi is kernel space.
|
|
+ */
|
|
+ .globl memcpy_user_stub
|
|
+ .type memcpy_user_stub,#function
|
|
+memcpy_user_stub:
|
|
+ save %sp, -192, %sp
|
|
+ mov %i0, %o0
|
|
+ mov %i1, %o1
|
|
+ call memcpy
|
|
+ mov %i2, %o2
|
|
+ ret
|
|
+ restore %g0, %g0, %o0
|
|
+ .size memcpy_user_stub, .-memcpy_user_stub
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/GENbzero.S linux-2.6.29-rc3.owrt/arch/sparc/lib/GENbzero.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/GENbzero.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/GENbzero.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -6,9 +6,13 @@
|
|
|
|
#define EX_ST(x,y) \
|
|
98: x,y; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov %o1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_o1; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/GENcopy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/GENcopy_from_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/GENcopy_from_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/GENcopy_from_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,13 @@
|
|
|
|
#define EX_LD(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -23,7 +27,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/GENcopy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/GENcopy_to_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/GENcopy_to_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/GENcopy_to_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,13 @@
|
|
|
|
#define EX_ST(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -27,7 +31,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/NG2copy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NG2copy_from_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/NG2copy_from_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NG2copy_from_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,14 @@
|
|
|
|
#define EX_LD(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: wr %g0, ASI_AIUS, %asi;\
|
|
+ retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one_asi;\
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -28,7 +33,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/NG2copy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NG2copy_to_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/NG2copy_to_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NG2copy_to_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,14 @@
|
|
|
|
#define EX_ST(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: wr %g0, ASI_AIUS, %asi;\
|
|
+ retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one_asi;\
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -37,7 +42,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/NGbzero.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NGbzero.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/NGbzero.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NGbzero.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -6,9 +6,13 @@
|
|
|
|
#define EX_ST(x,y) \
|
|
98: x,y; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov %o1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_o1; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/NGcopy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NGcopy_from_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/NGcopy_from_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NGcopy_from_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,14 @@
|
|
|
|
#define EX_LD(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: wr %g0, ASI_AIUS, %asi;\
|
|
+ ret; \
|
|
+ restore %g0, 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __ret_one_asi;\
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -25,7 +30,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/NGcopy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NGcopy_to_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/NGcopy_to_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NGcopy_to_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,14 @@
|
|
|
|
#define EX_ST(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: wr %g0, ASI_AIUS, %asi;\
|
|
+ ret; \
|
|
+ restore %g0, 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __ret_one_asi;\
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -28,7 +33,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/U1copy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/U1copy_from_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/U1copy_from_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/U1copy_from_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,13 @@
|
|
|
|
#define EX_LD(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -23,7 +27,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop; \
|
|
|
|
#include "U1memcpy.S"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/U1copy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/U1copy_to_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/U1copy_to_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/U1copy_to_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,13 @@
|
|
|
|
#define EX_ST(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -23,7 +27,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop; \
|
|
|
|
#include "U1memcpy.S"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/U3copy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/U3copy_from_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/U3copy_from_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/U3copy_from_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,13 @@
|
|
|
|
#define EX_LD(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/lib/U3copy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/U3copy_to_user.S
|
|
--- linux-2.6.29.owrt/arch/sparc/lib/U3copy_to_user.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/lib/U3copy_to_user.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,9 +5,13 @@
|
|
|
|
#define EX_ST(x) \
|
|
98: x; \
|
|
+ .section .fixup; \
|
|
+ .align 4; \
|
|
+99: retl; \
|
|
+ mov 1, %o0; \
|
|
.section __ex_table,"a";\
|
|
.align 4; \
|
|
- .word 98b, __retl_one; \
|
|
+ .word 98b, 99b; \
|
|
.text; \
|
|
.align 4;
|
|
|
|
@@ -23,7 +27,7 @@
|
|
#define PREAMBLE \
|
|
rd %asi, %g1; \
|
|
cmp %g1, ASI_AIUS; \
|
|
- bne,pn %icc, ___copy_in_user; \
|
|
+ bne,pn %icc, memcpy_user_stub; \
|
|
nop; \
|
|
|
|
#include "U3memcpy.S"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/mm/fault_64.c linux-2.6.29-rc3.owrt/arch/sparc/mm/fault_64.c
|
|
--- linux-2.6.29.owrt/arch/sparc/mm/fault_64.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/mm/fault_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
#include <linux/interrupt.h>
|
|
#include <linux/kprobes.h>
|
|
#include <linux/kdebug.h>
|
|
-#include <linux/percpu.h>
|
|
|
|
#include <asm/page.h>
|
|
#include <asm/pgtable.h>
|
|
@@ -225,30 +224,6 @@
|
|
unhandled_fault (address, current, regs);
|
|
}
|
|
|
|
-static void noinline bogus_32bit_fault_tpc(struct pt_regs *regs)
|
|
-{
|
|
- static int times;
|
|
-
|
|
- if (times++ < 10)
|
|
- printk(KERN_ERR "FAULT[%s:%d]: 32-bit process reports "
|
|
- "64-bit TPC [%lx]\n",
|
|
- current->comm, current->pid,
|
|
- regs->tpc);
|
|
- show_regs(regs);
|
|
-}
|
|
-
|
|
-static void noinline bogus_32bit_fault_address(struct pt_regs *regs,
|
|
- unsigned long addr)
|
|
-{
|
|
- static int times;
|
|
-
|
|
- if (times++ < 10)
|
|
- printk(KERN_ERR "FAULT[%s:%d]: 32-bit process "
|
|
- "reports 64-bit fault address [%lx]\n",
|
|
- current->comm, current->pid, addr);
|
|
- show_regs(regs);
|
|
-}
|
|
-
|
|
asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
|
|
{
|
|
struct mm_struct *mm = current->mm;
|
|
@@ -269,19 +244,6 @@
|
|
(fault_code & FAULT_CODE_DTLB))
|
|
BUG();
|
|
|
|
- if (test_thread_flag(TIF_32BIT)) {
|
|
- if (!(regs->tstate & TSTATE_PRIV)) {
|
|
- if (unlikely((regs->tpc >> 32) != 0)) {
|
|
- bogus_32bit_fault_tpc(regs);
|
|
- goto intr_or_no_mm;
|
|
- }
|
|
- }
|
|
- if (unlikely((address >> 32) != 0)) {
|
|
- bogus_32bit_fault_address(regs, address);
|
|
- goto intr_or_no_mm;
|
|
- }
|
|
- }
|
|
-
|
|
if (regs->tstate & TSTATE_PRIV) {
|
|
unsigned long tpc = regs->tpc;
|
|
|
|
@@ -302,6 +264,12 @@
|
|
if (in_atomic() || !mm)
|
|
goto intr_or_no_mm;
|
|
|
|
+ if (test_thread_flag(TIF_32BIT)) {
|
|
+ if (!(regs->tstate & TSTATE_PRIV))
|
|
+ regs->tpc &= 0xffffffff;
|
|
+ address &= 0xffffffff;
|
|
+ }
|
|
+
|
|
if (!down_read_trylock(&mm->mmap_sem)) {
|
|
if ((regs->tstate & TSTATE_PRIV) &&
|
|
!search_exception_tables(regs->tpc)) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/mm/ultra.S linux-2.6.29-rc3.owrt/arch/sparc/mm/ultra.S
|
|
--- linux-2.6.29.owrt/arch/sparc/mm/ultra.S 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/mm/ultra.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -679,8 +679,28 @@
|
|
#ifdef CONFIG_KGDB
|
|
.globl xcall_kgdb_capture
|
|
xcall_kgdb_capture:
|
|
- wr %g0, (1 << PIL_KGDB_CAPTURE), %set_softint
|
|
- retry
|
|
+661: rdpr %pstate, %g2
|
|
+ wrpr %g2, PSTATE_IG | PSTATE_AG, %pstate
|
|
+ .section .sun4v_2insn_patch, "ax"
|
|
+ .word 661b
|
|
+ nop
|
|
+ nop
|
|
+ .previous
|
|
+
|
|
+ rdpr %pil, %g2
|
|
+ wrpr %g0, PIL_NORMAL_MAX, %pil
|
|
+ sethi %hi(109f), %g7
|
|
+ ba,pt %xcc, etrap_irq
|
|
+109: or %g7, %lo(109b), %g7
|
|
+#ifdef CONFIG_TRACE_IRQFLAGS
|
|
+ call trace_hardirqs_off
|
|
+ nop
|
|
+#endif
|
|
+ call smp_kgdb_capture_client
|
|
+ add %sp, PTREGS_OFF, %o0
|
|
+ /* Has to be a non-v9 branch due to the large distance. */
|
|
+ ba rtrap_xcall
|
|
+ ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
|
#endif
|
|
|
|
#endif /* CONFIG_SMP */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/sparc/oprofile/init.c linux-2.6.29-rc3.owrt/arch/sparc/oprofile/init.c
|
|
--- linux-2.6.29.owrt/arch/sparc/oprofile/init.c 2009-05-10 22:04:40.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/sparc/oprofile/init.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -13,57 +13,217 @@
|
|
#include <linux/init.h>
|
|
|
|
#ifdef CONFIG_SPARC64
|
|
-#include <linux/notifier.h>
|
|
-#include <linux/rcupdate.h>
|
|
-#include <linux/kdebug.h>
|
|
-#include <asm/nmi.h>
|
|
-
|
|
-static int profile_timer_exceptions_notify(struct notifier_block *self,
|
|
- unsigned long val, void *data)
|
|
-{
|
|
- struct die_args *args = (struct die_args *)data;
|
|
- int ret = NOTIFY_DONE;
|
|
-
|
|
- switch (val) {
|
|
- case DIE_NMI:
|
|
- oprofile_add_sample(args->regs, 0);
|
|
- ret = NOTIFY_STOP;
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
- return ret;
|
|
+#include <asm/hypervisor.h>
|
|
+#include <asm/spitfire.h>
|
|
+#include <asm/cpudata.h>
|
|
+#include <asm/irq.h>
|
|
+
|
|
+static int nmi_enabled;
|
|
+
|
|
+struct pcr_ops {
|
|
+ u64 (*read)(void);
|
|
+ void (*write)(u64);
|
|
+};
|
|
+static const struct pcr_ops *pcr_ops;
|
|
+
|
|
+static u64 direct_pcr_read(void)
|
|
+{
|
|
+ u64 val;
|
|
+
|
|
+ read_pcr(val);
|
|
+ return val;
|
|
+}
|
|
+
|
|
+static void direct_pcr_write(u64 val)
|
|
+{
|
|
+ write_pcr(val);
|
|
}
|
|
|
|
-static struct notifier_block profile_timer_exceptions_nb = {
|
|
- .notifier_call = profile_timer_exceptions_notify,
|
|
+static const struct pcr_ops direct_pcr_ops = {
|
|
+ .read = direct_pcr_read,
|
|
+ .write = direct_pcr_write,
|
|
};
|
|
|
|
-static int timer_start(void)
|
|
+static void n2_pcr_write(u64 val)
|
|
{
|
|
- if (register_die_notifier(&profile_timer_exceptions_nb))
|
|
- return 1;
|
|
- nmi_adjust_hz(HZ);
|
|
- return 0;
|
|
+ unsigned long ret;
|
|
+
|
|
+ ret = sun4v_niagara2_setperf(HV_N2_PERF_SPARC_CTL, val);
|
|
+ if (val != HV_EOK)
|
|
+ write_pcr(val);
|
|
}
|
|
|
|
+static const struct pcr_ops n2_pcr_ops = {
|
|
+ .read = direct_pcr_read,
|
|
+ .write = n2_pcr_write,
|
|
+};
|
|
|
|
-static void timer_stop(void)
|
|
+/* In order to commonize as much of the implementation as
|
|
+ * possible, we use PICH as our counter. Mostly this is
|
|
+ * to accomodate Niagara-1 which can only count insn cycles
|
|
+ * in PICH.
|
|
+ */
|
|
+static u64 picl_value(void)
|
|
+{
|
|
+ u32 delta = local_cpu_data().clock_tick / HZ;
|
|
+
|
|
+ return ((u64)((0 - delta) & 0xffffffff)) << 32;
|
|
+}
|
|
+
|
|
+#define PCR_PIC_PRIV 0x00000001 /* PIC access is privileged */
|
|
+#define PCR_STRACE 0x00000002 /* Trace supervisor events */
|
|
+#define PCR_UTRACE 0x00000004 /* Trace user events */
|
|
+#define PCR_N2_HTRACE 0x00000008 /* Trace hypervisor events */
|
|
+#define PCR_N2_TOE_OV0 0x00000010 /* Trap if PIC 0 overflows */
|
|
+#define PCR_N2_TOE_OV1 0x00000020 /* Trap if PIC 1 overflows */
|
|
+#define PCR_N2_MASK0 0x00003fc0
|
|
+#define PCR_N2_MASK0_SHIFT 6
|
|
+#define PCR_N2_SL0 0x0003c000
|
|
+#define PCR_N2_SL0_SHIFT 14
|
|
+#define PCR_N2_OV0 0x00040000
|
|
+#define PCR_N2_MASK1 0x07f80000
|
|
+#define PCR_N2_MASK1_SHIFT 19
|
|
+#define PCR_N2_SL1 0x78000000
|
|
+#define PCR_N2_SL1_SHIFT 27
|
|
+#define PCR_N2_OV1 0x80000000
|
|
+
|
|
+#define PCR_SUN4U_ENABLE (PCR_PIC_PRIV | PCR_STRACE | PCR_UTRACE)
|
|
+#define PCR_N2_ENABLE (PCR_PIC_PRIV | PCR_STRACE | PCR_UTRACE | \
|
|
+ PCR_N2_TOE_OV1 | \
|
|
+ (2 << PCR_N2_SL1_SHIFT) | \
|
|
+ (0xff << PCR_N2_MASK1_SHIFT))
|
|
+
|
|
+static u64 pcr_enable = PCR_SUN4U_ENABLE;
|
|
+
|
|
+static void nmi_handler(struct pt_regs *regs)
|
|
{
|
|
- nmi_adjust_hz(1);
|
|
- unregister_die_notifier(&profile_timer_exceptions_nb);
|
|
- synchronize_sched(); /* Allow already-started NMIs to complete. */
|
|
+ pcr_ops->write(PCR_PIC_PRIV);
|
|
+
|
|
+ if (nmi_enabled) {
|
|
+ oprofile_add_sample(regs, 0);
|
|
+
|
|
+ write_pic(picl_value());
|
|
+ pcr_ops->write(pcr_enable);
|
|
+ }
|
|
+}
|
|
+
|
|
+/* We count "clock cycle" events in the lower 32-bit PIC.
|
|
+ * Then configure it such that it overflows every HZ, and thus
|
|
+ * generates a level 15 interrupt at that frequency.
|
|
+ */
|
|
+static void cpu_nmi_start(void *_unused)
|
|
+{
|
|
+ pcr_ops->write(PCR_PIC_PRIV);
|
|
+ write_pic(picl_value());
|
|
+
|
|
+ pcr_ops->write(pcr_enable);
|
|
+}
|
|
+
|
|
+static void cpu_nmi_stop(void *_unused)
|
|
+{
|
|
+ pcr_ops->write(PCR_PIC_PRIV);
|
|
+}
|
|
+
|
|
+static int nmi_start(void)
|
|
+{
|
|
+ int err = register_perfctr_intr(nmi_handler);
|
|
+
|
|
+ if (!err) {
|
|
+ nmi_enabled = 1;
|
|
+ wmb();
|
|
+ err = on_each_cpu(cpu_nmi_start, NULL, 1);
|
|
+ if (err) {
|
|
+ nmi_enabled = 0;
|
|
+ wmb();
|
|
+ on_each_cpu(cpu_nmi_stop, NULL, 1);
|
|
+ release_perfctr_intr(nmi_handler);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return err;
|
|
}
|
|
|
|
-static int op_nmi_timer_init(struct oprofile_operations *ops)
|
|
+static void nmi_stop(void)
|
|
{
|
|
- if (!nmi_usable)
|
|
+ nmi_enabled = 0;
|
|
+ wmb();
|
|
+
|
|
+ on_each_cpu(cpu_nmi_stop, NULL, 1);
|
|
+ release_perfctr_intr(nmi_handler);
|
|
+ synchronize_sched();
|
|
+}
|
|
+
|
|
+static unsigned long perf_hsvc_group;
|
|
+static unsigned long perf_hsvc_major;
|
|
+static unsigned long perf_hsvc_minor;
|
|
+
|
|
+static int __init register_perf_hsvc(void)
|
|
+{
|
|
+ if (tlb_type == hypervisor) {
|
|
+ switch (sun4v_chip_type) {
|
|
+ case SUN4V_CHIP_NIAGARA1:
|
|
+ perf_hsvc_group = HV_GRP_NIAG_PERF;
|
|
+ break;
|
|
+
|
|
+ case SUN4V_CHIP_NIAGARA2:
|
|
+ perf_hsvc_group = HV_GRP_N2_CPU;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+
|
|
+ perf_hsvc_major = 1;
|
|
+ perf_hsvc_minor = 0;
|
|
+ if (sun4v_hvapi_register(perf_hsvc_group,
|
|
+ perf_hsvc_major,
|
|
+ &perf_hsvc_minor)) {
|
|
+ printk("perfmon: Could not register N2 hvapi.\n");
|
|
+ return -ENODEV;
|
|
+ }
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void unregister_perf_hsvc(void)
|
|
+{
|
|
+ if (tlb_type != hypervisor)
|
|
+ return;
|
|
+ sun4v_hvapi_unregister(perf_hsvc_group);
|
|
+}
|
|
+
|
|
+static int oprofile_nmi_init(struct oprofile_operations *ops)
|
|
+{
|
|
+ int err = register_perf_hsvc();
|
|
+
|
|
+ if (err)
|
|
+ return err;
|
|
+
|
|
+ switch (tlb_type) {
|
|
+ case hypervisor:
|
|
+ pcr_ops = &n2_pcr_ops;
|
|
+ pcr_enable = PCR_N2_ENABLE;
|
|
+ break;
|
|
+
|
|
+ case cheetah:
|
|
+ case cheetah_plus:
|
|
+ pcr_ops = &direct_pcr_ops;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
return -ENODEV;
|
|
+ }
|
|
|
|
- ops->start = timer_start;
|
|
- ops->stop = timer_stop;
|
|
+ ops->create_files = NULL;
|
|
+ ops->setup = NULL;
|
|
+ ops->shutdown = NULL;
|
|
+ ops->start = nmi_start;
|
|
+ ops->stop = nmi_stop;
|
|
ops->cpu_type = "timer";
|
|
- printk(KERN_INFO "oprofile: Using perfctr NMI timer interrupt.\n");
|
|
+
|
|
+ printk(KERN_INFO "oprofile: Using perfctr based NMI timer interrupt.\n");
|
|
+
|
|
return 0;
|
|
}
|
|
#endif
|
|
@@ -73,7 +233,7 @@
|
|
int ret = -ENODEV;
|
|
|
|
#ifdef CONFIG_SPARC64
|
|
- ret = op_nmi_timer_init(ops);
|
|
+ ret = oprofile_nmi_init(ops);
|
|
if (!ret)
|
|
return ret;
|
|
#endif
|
|
@@ -81,6 +241,10 @@
|
|
return ret;
|
|
}
|
|
|
|
+
|
|
void oprofile_arch_exit(void)
|
|
{
|
|
+#ifdef CONFIG_SPARC64
|
|
+ unregister_perf_hsvc();
|
|
+#endif
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/um/drivers/vde_user.c linux-2.6.29-rc3.owrt/arch/um/drivers/vde_user.c
|
|
--- linux-2.6.29.owrt/arch/um/drivers/vde_user.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/um/drivers/vde_user.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -78,7 +78,7 @@
|
|
{
|
|
struct vde_open_args *args;
|
|
|
|
- vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
|
|
+ vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
|
|
if (vpri->args == NULL) {
|
|
printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args "
|
|
"allocation failed");
|
|
@@ -91,8 +91,8 @@
|
|
args->group = init->group;
|
|
args->mode = init->mode ? init->mode : 0700;
|
|
|
|
- args->port ? printk("port %d", args->port) :
|
|
- printk("undefined port");
|
|
+ args->port ? printk(UM_KERN_INFO "port %d", args->port) :
|
|
+ printk(UM_KERN_INFO "undefined port");
|
|
}
|
|
|
|
int vde_user_read(void *conn, void *buf, int len)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/um/kernel/ptrace.c linux-2.6.29-rc3.owrt/arch/um/kernel/ptrace.c
|
|
--- linux-2.6.29.owrt/arch/um/kernel/ptrace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/um/kernel/ptrace.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -64,11 +64,6 @@
|
|
ret = poke_user(child, addr, data);
|
|
break;
|
|
|
|
- case PTRACE_SYSEMU:
|
|
- case PTRACE_SYSEMU_SINGLESTEP:
|
|
- ret = -EIO;
|
|
- break;
|
|
-
|
|
/* continue and stop at next (return from) syscall */
|
|
case PTRACE_SYSCALL:
|
|
/* restart after signal. */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/um/os-Linux/user_syms.c linux-2.6.29-rc3.owrt/arch/um/os-Linux/user_syms.c
|
|
--- linux-2.6.29.owrt/arch/um/os-Linux/user_syms.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/um/os-Linux/user_syms.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -14,6 +14,7 @@
|
|
#undef memset
|
|
|
|
extern size_t strlen(const char *);
|
|
+extern void *memcpy(void *, const void *, size_t);
|
|
extern void *memmove(void *, const void *, size_t);
|
|
extern void *memset(void *, int, size_t);
|
|
extern int printf(const char *, ...);
|
|
@@ -23,11 +24,7 @@
|
|
EXPORT_SYMBOL(strstr);
|
|
#endif
|
|
|
|
-#ifndef __x86_64__
|
|
-extern void *memcpy(void *, const void *, size_t);
|
|
EXPORT_SYMBOL(memcpy);
|
|
-#endif
|
|
-
|
|
EXPORT_SYMBOL(memmove);
|
|
EXPORT_SYMBOL(memset);
|
|
EXPORT_SYMBOL(printf);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/boot/video-vesa.c linux-2.6.29-rc3.owrt/arch/x86/boot/video-vesa.c
|
|
--- linux-2.6.29.owrt/arch/x86/boot/video-vesa.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/boot/video-vesa.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -269,8 +269,9 @@
|
|
we genuinely have to assume all registers are destroyed here. */
|
|
|
|
asm("pushw %%es; movw %2,%%es; "INT10"; popw %%es"
|
|
- : "+a" (ax), "+b" (bx), "+c" (cx), "+D" (di)
|
|
- : : "esi", "edx");
|
|
+ : "+a" (ax), "+b" (bx)
|
|
+ : "c" (cx), "D" (di)
|
|
+ : "esi");
|
|
|
|
if (ax != 0x004f)
|
|
return; /* No EDID */
|
|
@@ -284,9 +285,9 @@
|
|
dx = 0; /* EDID block number */
|
|
di =(size_t) &boot_params.edid_info; /* (ES:)Pointer to block */
|
|
asm(INT10
|
|
- : "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info),
|
|
- "+c" (cx), "+D" (di)
|
|
- : : "esi");
|
|
+ : "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info)
|
|
+ : "c" (cx), "D" (di)
|
|
+ : "esi");
|
|
#endif /* CONFIG_FIRMWARE_EDID */
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/ia32/ia32entry.S linux-2.6.29-rc3.owrt/arch/x86/ia32/ia32entry.S
|
|
--- linux-2.6.29.owrt/arch/x86/ia32/ia32entry.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/ia32/ia32entry.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -418,9 +418,9 @@
|
|
orl $TS_COMPAT,TI_status(%r10)
|
|
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
|
|
jnz ia32_tracesys
|
|
+ia32_do_syscall:
|
|
cmpl $(IA32_NR_syscalls-1),%eax
|
|
- ja ia32_badsys
|
|
-ia32_do_call:
|
|
+ ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */
|
|
IA32_ARG_FIXUP
|
|
call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
|
|
ia32_sysret:
|
|
@@ -435,9 +435,7 @@
|
|
call syscall_trace_enter
|
|
LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */
|
|
RESTORE_REST
|
|
- cmpl $(IA32_NR_syscalls-1),%eax
|
|
- ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */
|
|
- jmp ia32_do_call
|
|
+ jmp ia32_do_syscall
|
|
END(ia32_syscall)
|
|
|
|
ia32_badsys:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/a.out-core.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/a.out-core.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/a.out-core.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/a.out-core.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -23,6 +23,8 @@
|
|
*/
|
|
static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
|
|
{
|
|
+ u16 gs;
|
|
+
|
|
/* changed the size calculations - should hopefully work better. lbt */
|
|
dump->magic = CMAGIC;
|
|
dump->start_code = 0;
|
|
@@ -55,7 +57,7 @@
|
|
dump->regs.ds = (u16)regs->ds;
|
|
dump->regs.es = (u16)regs->es;
|
|
dump->regs.fs = (u16)regs->fs;
|
|
- savesegment(gs, dump->regs.gs);
|
|
+ savesegment(gs, gs);
|
|
dump->regs.orig_ax = regs->orig_ax;
|
|
dump->regs.ip = regs->ip;
|
|
dump->regs.cs = (u16)regs->cs;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/cpufeature.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/cpufeature.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/cpufeature.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/cpufeature.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -93,7 +93,6 @@
|
|
#define X86_FEATURE_XTOPOLOGY (3*32+22) /* cpu topology enum extensions */
|
|
#define X86_FEATURE_TSC_RELIABLE (3*32+23) /* TSC is known to be reliable */
|
|
#define X86_FEATURE_NONSTOP_TSC (3*32+24) /* TSC does not stop in C states */
|
|
-#define X86_FEATURE_CLFLUSH_MONITOR (3*32+25) /* "" clflush reqd with monitor */
|
|
|
|
/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
|
|
#define X86_FEATURE_XMM3 (4*32+ 0) /* "pni" SSE-3 */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/dma-mapping.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/dma-mapping.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/dma-mapping.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/dma-mapping.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,8 +2,8 @@
|
|
#define _ASM_X86_DMA_MAPPING_H
|
|
|
|
/*
|
|
- * IOMMU interface. See Documentation/PCI/PCI-DMA-mapping.txt and
|
|
- * Documentation/DMA-API.txt for documentation.
|
|
+ * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for
|
|
+ * documentation.
|
|
*/
|
|
|
|
#include <linux/scatterlist.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/e820.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/e820.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/e820.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/e820.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -49,7 +49,6 @@
|
|
#define E820_RESERVED_KERN 128
|
|
|
|
#ifndef __ASSEMBLY__
|
|
-#include <linux/types.h>
|
|
struct e820entry {
|
|
__u64 addr; /* start of memory segment */
|
|
__u64 size; /* size of memory segment */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/efi.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/efi.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/efi.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/efi.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -37,6 +37,8 @@
|
|
|
|
#else /* !CONFIG_X86_32 */
|
|
|
|
+#define MAX_EFI_IO_PAGES 100
|
|
+
|
|
extern u64 efi_call0(void *fp);
|
|
extern u64 efi_call1(void *fp, u64 arg1);
|
|
extern u64 efi_call2(void *fp, u64 arg1, u64 arg2);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/fixmap_64.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/fixmap_64.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/fixmap_64.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/fixmap_64.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -16,6 +16,7 @@
|
|
#include <asm/apicdef.h>
|
|
#include <asm/page.h>
|
|
#include <asm/vsyscall.h>
|
|
+#include <asm/efi.h>
|
|
|
|
/*
|
|
* Here we define all the compile-time 'special' virtual
|
|
@@ -42,6 +43,9 @@
|
|
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
|
|
FIX_IO_APIC_BASE_0,
|
|
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
|
|
+ FIX_EFI_IO_MAP_LAST_PAGE,
|
|
+ FIX_EFI_IO_MAP_FIRST_PAGE = FIX_EFI_IO_MAP_LAST_PAGE
|
|
+ + MAX_EFI_IO_PAGES - 1,
|
|
#ifdef CONFIG_PARAVIRT
|
|
FIX_PARAVIRT_BOOTMAP,
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/i387.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/i387.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/i387.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/i387.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -172,13 +172,7 @@
|
|
|
|
#else /* CONFIG_X86_32 */
|
|
|
|
-#ifdef CONFIG_MATH_EMULATION
|
|
-extern void finit_task(struct task_struct *tsk);
|
|
-#else
|
|
-static inline void finit_task(struct task_struct *tsk)
|
|
-{
|
|
-}
|
|
-#endif
|
|
+extern void finit(void);
|
|
|
|
static inline void tolerant_fwait(void)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/iomap.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/iomap.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/iomap.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/iomap.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -23,9 +23,6 @@
|
|
#include <asm/pgtable.h>
|
|
#include <asm/tlbflush.h>
|
|
|
|
-int
|
|
-is_io_mapping_possible(resource_size_t base, unsigned long size);
|
|
-
|
|
void *
|
|
iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/kvm.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/kvm.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/kvm.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/kvm.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -6,16 +6,9 @@
|
|
*
|
|
*/
|
|
|
|
-#include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
#include <linux/ioctl.h>
|
|
|
|
-/* Select x86 specific features in <linux/kvm.h> */
|
|
-#define __KVM_HAVE_PIT
|
|
-#define __KVM_HAVE_IOAPIC
|
|
-#define __KVM_HAVE_DEVICE_ASSIGNMENT
|
|
-#define __KVM_HAVE_MSI
|
|
-#define __KVM_HAVE_USER_NMI
|
|
-
|
|
/* Architectural interrupt line count. */
|
|
#define KVM_NR_INTERRUPTS 256
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/math_emu.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/math_emu.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/math_emu.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/math_emu.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,18 +1,31 @@
|
|
#ifndef _ASM_X86_MATH_EMU_H
|
|
#define _ASM_X86_MATH_EMU_H
|
|
|
|
-#include <asm/ptrace.h>
|
|
-#include <asm/vm86.h>
|
|
-
|
|
/* This structure matches the layout of the data saved to the stack
|
|
following a device-not-present interrupt, part of it saved
|
|
automatically by the 80386/80486.
|
|
*/
|
|
-struct math_emu_info {
|
|
+struct info {
|
|
long ___orig_eip;
|
|
- union {
|
|
- struct pt_regs *regs;
|
|
- struct kernel_vm86_regs *vm86;
|
|
- };
|
|
+ long ___ebx;
|
|
+ long ___ecx;
|
|
+ long ___edx;
|
|
+ long ___esi;
|
|
+ long ___edi;
|
|
+ long ___ebp;
|
|
+ long ___eax;
|
|
+ long ___ds;
|
|
+ long ___es;
|
|
+ long ___fs;
|
|
+ long ___orig_eax;
|
|
+ long ___eip;
|
|
+ long ___cs;
|
|
+ long ___eflags;
|
|
+ long ___esp;
|
|
+ long ___ss;
|
|
+ long ___vm86_es; /* This and the following only in vm86 mode */
|
|
+ long ___vm86_ds;
|
|
+ long ___vm86_fs;
|
|
+ long ___vm86_gs;
|
|
};
|
|
#endif /* _ASM_X86_MATH_EMU_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/mce.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mce.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/mce.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mce.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,8 +3,8 @@
|
|
|
|
#ifdef __x86_64__
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/ioctls.h>
|
|
+#include <asm/types.h>
|
|
|
|
/*
|
|
* Machine Check support for x86
|
|
@@ -115,6 +115,8 @@
|
|
|
|
#endif /* !CONFIG_X86_32 */
|
|
|
|
+
|
|
+
|
|
#ifdef CONFIG_X86_MCE
|
|
extern void mcheck_init(struct cpuinfo_x86 *c);
|
|
#else
|
|
@@ -124,4 +126,5 @@
|
|
extern void restart_mce(void);
|
|
|
|
#endif /* __KERNEL__ */
|
|
+
|
|
#endif /* _ASM_X86_MCE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/mmzone_32.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mmzone_32.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/mmzone_32.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mmzone_32.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -32,6 +32,8 @@
|
|
get_memcfg_numa_flat();
|
|
}
|
|
|
|
+extern int early_pfn_to_nid(unsigned long pfn);
|
|
+
|
|
extern void resume_map_numa_kva(pgd_t *pgd);
|
|
|
|
#else /* !CONFIG_NUMA */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/mmzone_64.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mmzone_64.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/mmzone_64.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mmzone_64.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -40,6 +40,8 @@
|
|
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
|
|
NODE_DATA(nid)->node_spanned_pages)
|
|
|
|
+extern int early_pfn_to_nid(unsigned long pfn);
|
|
+
|
|
#ifdef CONFIG_NUMA_EMU
|
|
#define FAKE_NODE_MIN_SIZE (64 * 1024 * 1024)
|
|
#define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1UL))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/mpspec.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mpspec.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/mpspec.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mpspec.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -60,7 +60,6 @@
|
|
u32 gsi);
|
|
extern void mp_config_acpi_legacy_irqs(void);
|
|
extern int mp_register_gsi(u32 gsi, int edge_level, int active_high_low);
|
|
-extern int acpi_probe_gsi(void);
|
|
#ifdef CONFIG_X86_IO_APIC
|
|
extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
|
|
u32 gsi, int triggering, int polarity);
|
|
@@ -72,11 +71,6 @@
|
|
return 0;
|
|
}
|
|
#endif
|
|
-#else /* !CONFIG_ACPI: */
|
|
-static inline int acpi_probe_gsi(void)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
#endif /* CONFIG_ACPI */
|
|
|
|
#define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/mtrr.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mtrr.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/mtrr.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mtrr.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -23,7 +23,6 @@
|
|
#ifndef _ASM_X86_MTRR_H
|
|
#define _ASM_X86_MTRR_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/ioctl.h>
|
|
#include <linux/errno.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/page.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/page.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/page.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/page.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -57,6 +57,7 @@
|
|
typedef struct { pgprotval_t pgprot; } pgprot_t;
|
|
|
|
extern int page_is_ram(unsigned long pagenr);
|
|
+extern int pagerange_is_ram(unsigned long start, unsigned long end);
|
|
extern int devmem_is_allowed(unsigned long pagenr);
|
|
extern void map_devmem(unsigned long pfn, unsigned long size,
|
|
pgprot_t vma_prot);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/paravirt.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/paravirt.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/paravirt.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/paravirt.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1352,7 +1352,14 @@
|
|
PVOP_VCALL0(pv_cpu_ops.lazy_mode.leave);
|
|
}
|
|
|
|
-void arch_flush_lazy_cpu_mode(void);
|
|
+static inline void arch_flush_lazy_cpu_mode(void)
|
|
+{
|
|
+ if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU)) {
|
|
+ arch_leave_lazy_cpu_mode();
|
|
+ arch_enter_lazy_cpu_mode();
|
|
+ }
|
|
+}
|
|
+
|
|
|
|
#define __HAVE_ARCH_ENTER_LAZY_MMU_MODE
|
|
static inline void arch_enter_lazy_mmu_mode(void)
|
|
@@ -1365,7 +1372,13 @@
|
|
PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave);
|
|
}
|
|
|
|
-void arch_flush_lazy_mmu_mode(void);
|
|
+static inline void arch_flush_lazy_mmu_mode(void)
|
|
+{
|
|
+ if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU)) {
|
|
+ arch_leave_lazy_mmu_mode();
|
|
+ arch_enter_lazy_mmu_mode();
|
|
+ }
|
|
+}
|
|
|
|
static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
|
|
unsigned long phys, pgprot_t flags)
|
|
@@ -1389,7 +1402,6 @@
|
|
{
|
|
return PVOP_CALL1(int, pv_lock_ops.spin_is_contended, lock);
|
|
}
|
|
-#define __raw_spin_is_contended __raw_spin_is_contended
|
|
|
|
static __always_inline void __raw_spin_lock(struct raw_spinlock *lock)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/pgtable.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/pgtable.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/pgtable.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/pgtable.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -302,30 +302,16 @@
|
|
|
|
extern pteval_t __supported_pte_mask;
|
|
|
|
-/*
|
|
- * Mask out unsupported bits in a present pgprot. Non-present pgprots
|
|
- * can use those bits for other purposes, so leave them be.
|
|
- */
|
|
-static inline pgprotval_t massage_pgprot(pgprot_t pgprot)
|
|
-{
|
|
- pgprotval_t protval = pgprot_val(pgprot);
|
|
-
|
|
- if (protval & _PAGE_PRESENT)
|
|
- protval &= __supported_pte_mask;
|
|
-
|
|
- return protval;
|
|
-}
|
|
-
|
|
static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
|
|
{
|
|
- return __pte(((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
- massage_pgprot(pgprot));
|
|
+ return __pte((((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
+ pgprot_val(pgprot)) & __supported_pte_mask);
|
|
}
|
|
|
|
static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
|
|
{
|
|
- return __pmd(((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
- massage_pgprot(pgprot));
|
|
+ return __pmd((((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
+ pgprot_val(pgprot)) & __supported_pte_mask);
|
|
}
|
|
|
|
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|
@@ -337,7 +323,7 @@
|
|
* the newprot (if present):
|
|
*/
|
|
val &= _PAGE_CHG_MASK;
|
|
- val |= massage_pgprot(newprot) & ~_PAGE_CHG_MASK;
|
|
+ val |= pgprot_val(newprot) & (~_PAGE_CHG_MASK) & __supported_pte_mask;
|
|
|
|
return __pte(val);
|
|
}
|
|
@@ -353,7 +339,7 @@
|
|
|
|
#define pte_pgprot(x) __pgprot(pte_flags(x) & PTE_FLAGS_MASK)
|
|
|
|
-#define canon_pgprot(p) __pgprot(massage_pgprot(p))
|
|
+#define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)
|
|
|
|
static inline int is_new_memtype_allowed(unsigned long flags,
|
|
unsigned long new_flags)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/processor.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/processor.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/processor.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/processor.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -353,7 +353,7 @@
|
|
u8 no_update;
|
|
u8 rm;
|
|
u8 alimit;
|
|
- struct math_emu_info *info;
|
|
+ struct info *info;
|
|
u32 entry_eip;
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/ptrace-abi.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/ptrace-abi.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/ptrace-abi.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/ptrace-abi.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -83,7 +83,7 @@
|
|
#ifdef CONFIG_X86_PTRACE_BTS
|
|
|
|
#ifndef __ASSEMBLY__
|
|
-#include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
|
|
/* configuration/status structure used in PTRACE_BTS_CONFIG and
|
|
PTRACE_BTS_STATUS commands.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/seccomp_32.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/seccomp_32.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/seccomp_32.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/seccomp_32.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,6 +1,12 @@
|
|
#ifndef _ASM_X86_SECCOMP_32_H
|
|
#define _ASM_X86_SECCOMP_32_H
|
|
|
|
+#include <linux/thread_info.h>
|
|
+
|
|
+#ifdef TIF_32BIT
|
|
+#error "unexpected TIF_32BIT on i386"
|
|
+#endif
|
|
+
|
|
#include <linux/unistd.h>
|
|
|
|
#define __NR_seccomp_read __NR_read
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/seccomp_64.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/seccomp_64.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/seccomp_64.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/seccomp_64.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,6 +1,14 @@
|
|
#ifndef _ASM_X86_SECCOMP_64_H
|
|
#define _ASM_X86_SECCOMP_64_H
|
|
|
|
+#include <linux/thread_info.h>
|
|
+
|
|
+#ifdef TIF_32BIT
|
|
+#error "unexpected TIF_32BIT on x86_64"
|
|
+#else
|
|
+#define TIF_32BIT TIF_IA32
|
|
+#endif
|
|
+
|
|
#include <linux/unistd.h>
|
|
#include <asm/ia32_unistd.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/sigcontext32.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/sigcontext32.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/sigcontext32.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/sigcontext32.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef _ASM_X86_SIGCONTEXT32_H
|
|
#define _ASM_X86_SIGCONTEXT32_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/* signal context for 32bit programs. */
|
|
|
|
#define X86_FXSR_MAGIC 0x0000
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/sigcontext.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/sigcontext.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/sigcontext.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/sigcontext.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
#define _ASM_X86_SIGCONTEXT_H
|
|
|
|
#include <linux/compiler.h>
|
|
-#include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
|
|
#define FP_XSTATE_MAGIC1 0x46505853U
|
|
#define FP_XSTATE_MAGIC2 0x46505845U
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/spinlock.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/spinlock.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/spinlock.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/spinlock.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -245,7 +245,6 @@
|
|
{
|
|
return __ticket_spin_is_contended(lock);
|
|
}
|
|
-#define __raw_spin_is_contended __raw_spin_is_contended
|
|
|
|
static __always_inline void __raw_spin_lock(raw_spinlock_t *lock)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/swab.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/swab.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/swab.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/swab.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
#ifndef _ASM_X86_SWAB_H
|
|
#define _ASM_X86_SWAB_H
|
|
|
|
-#include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
#include <linux/compiler.h>
|
|
|
|
static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/traps.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/traps.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/traps.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/traps.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -41,7 +41,7 @@
|
|
dotraplinkage void do_overflow(struct pt_regs *, long);
|
|
dotraplinkage void do_bounds(struct pt_regs *, long);
|
|
dotraplinkage void do_invalid_op(struct pt_regs *, long);
|
|
-dotraplinkage void do_device_not_available(struct pt_regs);
|
|
+dotraplinkage void do_device_not_available(struct pt_regs *, long);
|
|
dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long);
|
|
dotraplinkage void do_invalid_TSS(struct pt_regs *, long);
|
|
dotraplinkage void do_segment_not_present(struct pt_regs *, long);
|
|
@@ -77,7 +77,7 @@
|
|
extern int kstack_depth_to_print;
|
|
|
|
void math_error(void __user *);
|
|
-void math_emulate(struct math_emu_info *);
|
|
+asmlinkage void math_emulate(long);
|
|
#ifdef CONFIG_X86_32
|
|
unsigned long patch_espfix_desc(unsigned long, unsigned long);
|
|
#else
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/include/asm/xen/page.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/xen/page.h
|
|
--- linux-2.6.29.owrt/arch/x86/include/asm/xen/page.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/xen/page.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -137,7 +137,7 @@
|
|
pte_t pte;
|
|
|
|
pte.pte = ((phys_addr_t)page_nr << PAGE_SHIFT) |
|
|
- massage_pgprot(pgprot);
|
|
+ (pgprot_val(pgprot) & __supported_pte_mask);
|
|
|
|
return pte;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/Kconfig linux-2.6.29-rc3.owrt/arch/x86/Kconfig
|
|
--- linux-2.6.29.owrt/arch/x86/Kconfig 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1802,17 +1802,6 @@
|
|
and include PCI device scope covered by these DMA
|
|
remapping devices.
|
|
|
|
-config DMAR_DEFAULT_ON
|
|
- def_bool y
|
|
- prompt "Enable DMA Remapping Devices by default"
|
|
- depends on DMAR
|
|
- help
|
|
- Selecting this option will enable a DMAR device at boot time if
|
|
- one is found. If this option is not selected, DMAR support can
|
|
- be enabled by passing intel_iommu=on to the kernel. It is
|
|
- recommended you say N here while the DMAR code remains
|
|
- experimental.
|
|
-
|
|
config DMAR_GFX_WA
|
|
def_bool y
|
|
prompt "Support for Graphics workaround"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/Kconfig.cpu linux-2.6.29-rc3.owrt/arch/x86/Kconfig.cpu
|
|
--- linux-2.6.29.owrt/arch/x86/Kconfig.cpu 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/Kconfig.cpu 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -167,9 +167,9 @@
|
|
config MK8
|
|
bool "Opteron/Athlon64/Hammer/K8"
|
|
help
|
|
- Select this for an AMD Opteron or Athlon64 Hammer-family processor.
|
|
- Enables use of some extended instructions, and passes appropriate
|
|
- optimization flags to GCC.
|
|
+ Select this for an AMD Opteron or Athlon64 Hammer-family processor. Enables
|
|
+ use of some extended instructions, and passes appropriate optimization
|
|
+ flags to GCC.
|
|
|
|
config MCRUSOE
|
|
bool "Crusoe"
|
|
@@ -256,11 +256,9 @@
|
|
config MCORE2
|
|
bool "Core 2/newer Xeon"
|
|
help
|
|
-
|
|
- Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and
|
|
- 53xx) CPUs. You can distinguish newer from older Xeons by the CPU
|
|
- family in /proc/cpuinfo. Newer ones have 6 and older ones 15
|
|
- (not a typo)
|
|
+ Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and 53xx)
|
|
+ CPUs. You can distinguish newer from older Xeons by the CPU family
|
|
+ in /proc/cpuinfo. Newer ones have 6 and older ones 15 (not a typo)
|
|
|
|
config GENERIC_CPU
|
|
bool "Generic-x86-64"
|
|
@@ -322,14 +320,14 @@
|
|
bool "PentiumPro memory ordering errata workaround"
|
|
depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1
|
|
help
|
|
- Old PentiumPro multiprocessor systems had errata that could cause
|
|
- memory operations to violate the x86 ordering standard in rare cases.
|
|
- Enabling this option will attempt to work around some (but not all)
|
|
- occurances of this problem, at the cost of much heavier spinlock and
|
|
- memory barrier operations.
|
|
+ Old PentiumPro multiprocessor systems had errata that could cause memory
|
|
+ operations to violate the x86 ordering standard in rare cases. Enabling this
|
|
+ option will attempt to work around some (but not all) occurances of
|
|
+ this problem, at the cost of much heavier spinlock and memory barrier
|
|
+ operations.
|
|
|
|
- If unsure, say n here. Even distro kernels should think twice before
|
|
- enabling this: there are few systems, and an unlikely bug.
|
|
+ If unsure, say n here. Even distro kernels should think twice before enabling
|
|
+ this: there are few systems, and an unlikely bug.
|
|
|
|
config X86_F00F_BUG
|
|
def_bool y
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/Kconfig.debug linux-2.6.29-rc3.owrt/arch/x86/Kconfig.debug
|
|
--- linux-2.6.29.owrt/arch/x86/Kconfig.debug 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/Kconfig.debug 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -174,8 +174,28 @@
|
|
Add a simple leak tracer to the IOMMU code. This is useful when you
|
|
are debugging a buggy device driver that leaks IOMMU mappings.
|
|
|
|
-config HAVE_MMIOTRACE_SUPPORT
|
|
- def_bool y
|
|
+config MMIOTRACE
|
|
+ bool "Memory mapped IO tracing"
|
|
+ depends on DEBUG_KERNEL && PCI
|
|
+ select TRACING
|
|
+ help
|
|
+ Mmiotrace traces Memory Mapped I/O access and is meant for
|
|
+ debugging and reverse engineering. It is called from the ioremap
|
|
+ implementation and works via page faults. Tracing is disabled by
|
|
+ default and can be enabled at run-time.
|
|
+
|
|
+ See Documentation/tracers/mmiotrace.txt.
|
|
+ If you are not helping to develop drivers, say N.
|
|
+
|
|
+config MMIOTRACE_TEST
|
|
+ tristate "Test module for mmiotrace"
|
|
+ depends on MMIOTRACE && m
|
|
+ help
|
|
+ This is a dumb module for testing mmiotrace. It is very dangerous
|
|
+ as it will write garbage to IO memory starting at a given address.
|
|
+ However, it should be safe to use on e.g. unused portion of VRAM.
|
|
+
|
|
+ Say N, unless you absolutely know what you are doing.
|
|
|
|
#
|
|
# IO delay types:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/acpi/boot.c linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/boot.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/acpi/boot.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/boot.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -973,29 +973,6 @@
|
|
nr_ioapics++;
|
|
}
|
|
|
|
-int __init acpi_probe_gsi(void)
|
|
-{
|
|
- int idx;
|
|
- int gsi;
|
|
- int max_gsi = 0;
|
|
-
|
|
- if (acpi_disabled)
|
|
- return 0;
|
|
-
|
|
- if (!acpi_ioapic)
|
|
- return 0;
|
|
-
|
|
- max_gsi = 0;
|
|
- for (idx = 0; idx < nr_ioapics; idx++) {
|
|
- gsi = mp_ioapic_routing[idx].gsi_end;
|
|
-
|
|
- if (gsi > max_gsi)
|
|
- max_gsi = gsi;
|
|
- }
|
|
-
|
|
- return max_gsi + 1;
|
|
-}
|
|
-
|
|
static void assign_to_mp_irq(struct mp_config_intsrc *m,
|
|
struct mp_config_intsrc *mp_irq)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/acpi/sleep.c linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/sleep.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/acpi/sleep.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/sleep.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -156,11 +156,11 @@
|
|
#ifdef CONFIG_HIBERNATION
|
|
if (strncmp(str, "s4_nohwsig", 10) == 0)
|
|
acpi_no_s4_hw_signature();
|
|
- if (strncmp(str, "s4_nonvs", 8) == 0)
|
|
- acpi_s4_no_nvs();
|
|
#endif
|
|
if (strncmp(str, "old_ordering", 12) == 0)
|
|
acpi_old_suspend_ordering();
|
|
+ if (strncmp(str, "s4_nonvs", 8) == 0)
|
|
+ acpi_s4_no_nvs();
|
|
str = strchr(str, ',');
|
|
if (str != NULL)
|
|
str += strspn(str, ", \t");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/acpi/wakeup_64.S linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/wakeup_64.S
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/acpi/wakeup_64.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/wakeup_64.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -13,6 +13,7 @@
|
|
* Hooray, we are in Long 64-bit mode (but still running in low memory)
|
|
*/
|
|
ENTRY(wakeup_long64)
|
|
+wakeup_long64:
|
|
movq saved_magic, %rax
|
|
movq $0x123456789abcdef0, %rdx
|
|
cmpq %rdx, %rax
|
|
@@ -33,12 +34,16 @@
|
|
|
|
movq saved_rip, %rax
|
|
jmp *%rax
|
|
-ENDPROC(wakeup_long64)
|
|
|
|
bogus_64_magic:
|
|
jmp bogus_64_magic
|
|
|
|
-ENTRY(do_suspend_lowlevel)
|
|
+ .align 2
|
|
+ .p2align 4,,15
|
|
+.globl do_suspend_lowlevel
|
|
+ .type do_suspend_lowlevel,@function
|
|
+do_suspend_lowlevel:
|
|
+.LFB5:
|
|
subq $8, %rsp
|
|
xorl %eax, %eax
|
|
call save_processor_state
|
|
@@ -62,7 +67,7 @@
|
|
pushfq
|
|
popq pt_regs_flags(%rax)
|
|
|
|
- movq $resume_point, saved_rip(%rip)
|
|
+ movq $.L97, saved_rip(%rip)
|
|
|
|
movq %rsp, saved_rsp
|
|
movq %rbp, saved_rbp
|
|
@@ -73,12 +78,14 @@
|
|
addq $8, %rsp
|
|
movl $3, %edi
|
|
xorl %eax, %eax
|
|
- call acpi_enter_sleep_state
|
|
- /* in case something went wrong, restore the machine status and go on */
|
|
- jmp resume_point
|
|
-
|
|
+ jmp acpi_enter_sleep_state
|
|
+.L97:
|
|
+ .p2align 4,,7
|
|
+.L99:
|
|
.align 4
|
|
-resume_point:
|
|
+ movl $24, %eax
|
|
+ movw %ax, %ds
|
|
+
|
|
/* We don't restore %rax, it must be 0 anyway */
|
|
movq $saved_context, %rax
|
|
movq saved_context_cr4(%rax), %rbx
|
|
@@ -110,9 +117,12 @@
|
|
xorl %eax, %eax
|
|
addq $8, %rsp
|
|
jmp restore_processor_state
|
|
-ENDPROC(do_suspend_lowlevel)
|
|
-
|
|
+.LFE5:
|
|
+.Lfe5:
|
|
+ .size do_suspend_lowlevel, .Lfe5-do_suspend_lowlevel
|
|
+
|
|
.data
|
|
+ALIGN
|
|
ENTRY(saved_rbp) .quad 0
|
|
ENTRY(saved_rsi) .quad 0
|
|
ENTRY(saved_rdi) .quad 0
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/apic.c linux-2.6.29-rc3.owrt/arch/x86/kernel/apic.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/apic.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/apic.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -862,7 +862,7 @@
|
|
}
|
|
|
|
/* lets not touch this if we didn't frob it */
|
|
-#if defined(CONFIG_X86_MCE_P4THERMAL) || defined(CONFIG_X86_MCE_INTEL)
|
|
+#if defined(CONFIG_X86_MCE_P4THERMAL) || defined(X86_MCE_INTEL)
|
|
if (maxlvt >= 5) {
|
|
v = apic_read(APIC_LVTTHMR);
|
|
apic_write(APIC_LVTTHMR, v | APIC_LVT_MASKED);
|
|
@@ -1436,7 +1436,7 @@
|
|
switch (boot_cpu_data.x86_vendor) {
|
|
case X86_VENDOR_AMD:
|
|
if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) ||
|
|
- (boot_cpu_data.x86 >= 15))
|
|
+ (boot_cpu_data.x86 == 15))
|
|
break;
|
|
goto no_apic;
|
|
case X86_VENDOR_INTEL:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/apm_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/apm_32.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/apm_32.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/apm_32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1192,7 +1192,6 @@
|
|
device_suspend(PMSG_SUSPEND);
|
|
local_irq_disable();
|
|
device_power_down(PMSG_SUSPEND);
|
|
- sysdev_suspend(PMSG_SUSPEND);
|
|
|
|
local_irq_enable();
|
|
|
|
@@ -1209,7 +1208,6 @@
|
|
if (err != APM_SUCCESS)
|
|
apm_error("suspend", err);
|
|
err = (err == APM_SUCCESS) ? 0 : -EIO;
|
|
- sysdev_resume();
|
|
device_power_up(PMSG_RESUME);
|
|
local_irq_enable();
|
|
device_resume(PMSG_RESUME);
|
|
@@ -1230,7 +1228,6 @@
|
|
|
|
local_irq_disable();
|
|
device_power_down(PMSG_SUSPEND);
|
|
- sysdev_suspend(PMSG_SUSPEND);
|
|
local_irq_enable();
|
|
|
|
err = set_system_power_state(APM_STATE_STANDBY);
|
|
@@ -1238,7 +1235,6 @@
|
|
apm_error("standby", err);
|
|
|
|
local_irq_disable();
|
|
- sysdev_resume();
|
|
device_power_up(PMSG_RESUME);
|
|
local_irq_enable();
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/Kconfig linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/Kconfig
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/Kconfig 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -245,6 +245,17 @@
|
|
|
|
comment "shared options"
|
|
|
|
+config X86_ACPI_CPUFREQ_PROC_INTF
|
|
+ bool "/proc/acpi/processor/../performance interface (deprecated)"
|
|
+ depends on PROC_FS
|
|
+ depends on X86_ACPI_CPUFREQ || X86_POWERNOW_K7_ACPI || X86_POWERNOW_K8_ACPI
|
|
+ help
|
|
+ This enables the deprecated /proc/acpi/processor/../performance
|
|
+ interface. While it is helpful for debugging, the generic,
|
|
+ cross-architecture cpufreq interfaces should be used.
|
|
+
|
|
+ If in doubt, say N.
|
|
+
|
|
config X86_SPEEDSTEP_LIB
|
|
tristate
|
|
default (X86_SPEEDSTEP_ICH || X86_SPEEDSTEP_SMI || X86_P4_CLOCKMOD)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -277,6 +277,7 @@
|
|
.name = "p4-clockmod",
|
|
.owner = THIS_MODULE,
|
|
.attr = p4clockmod_attr,
|
|
+ .hide_interface = 1,
|
|
};
|
|
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/powernow-k8.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/powernow-k8.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/powernow-k8.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -939,25 +939,10 @@
|
|
free_cpumask_var(data->acpi_data.shared_cpu_map);
|
|
}
|
|
|
|
-static int get_transition_latency(struct powernow_k8_data *data)
|
|
-{
|
|
- int max_latency = 0;
|
|
- int i;
|
|
- for (i = 0; i < data->acpi_data.state_count; i++) {
|
|
- int cur_latency = data->acpi_data.states[i].transition_latency
|
|
- + data->acpi_data.states[i].bus_master_latency;
|
|
- if (cur_latency > max_latency)
|
|
- max_latency = cur_latency;
|
|
- }
|
|
- /* value in usecs, needs to be in nanoseconds */
|
|
- return 1000 * max_latency;
|
|
-}
|
|
-
|
|
#else
|
|
static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; }
|
|
static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; }
|
|
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; }
|
|
-static int get_transition_latency(struct powernow_k8_data *data) { return 0; }
|
|
#endif /* CONFIG_X86_POWERNOW_K8_ACPI */
|
|
|
|
/* Take a frequency, and issue the fid/vid transition command */
|
|
@@ -1157,7 +1142,8 @@
|
|
data->cpu = pol->cpu;
|
|
data->currpstate = HW_PSTATE_INVALID;
|
|
|
|
- if (powernow_k8_cpu_init_acpi(data)) {
|
|
+ rc = powernow_k8_cpu_init_acpi(data);
|
|
+ if (rc) {
|
|
/*
|
|
* Use the PSB BIOS structure. This is only availabe on
|
|
* an UP version, and is deprecated by AMD.
|
|
@@ -1175,28 +1161,19 @@
|
|
"ACPI maintainers and complain to your BIOS "
|
|
"vendor.\n");
|
|
#endif
|
|
- kfree(data);
|
|
- return -ENODEV;
|
|
+ goto err_out;
|
|
}
|
|
if (pol->cpu != 0) {
|
|
printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for "
|
|
"CPU other than CPU0. Complain to your BIOS "
|
|
"vendor.\n");
|
|
- kfree(data);
|
|
- return -ENODEV;
|
|
+ goto err_out;
|
|
}
|
|
rc = find_psb_table(data);
|
|
if (rc) {
|
|
- kfree(data);
|
|
- return -ENODEV;
|
|
+ goto err_out;
|
|
}
|
|
- /* Take a crude guess here.
|
|
- * That guess was in microseconds, so multiply with 1000 */
|
|
- pol->cpuinfo.transition_latency = (
|
|
- ((data->rvo + 8) * data->vstable * VST_UNITS_20US) +
|
|
- ((1 << data->irt) * 30)) * 1000;
|
|
- } else /* ACPI _PSS objects available */
|
|
- pol->cpuinfo.transition_latency = get_transition_latency(data);
|
|
+ }
|
|
|
|
/* only run on specific CPU from here on */
|
|
oldmask = current->cpus_allowed;
|
|
@@ -1227,6 +1204,11 @@
|
|
cpumask_copy(pol->cpus, &per_cpu(cpu_core_map, pol->cpu));
|
|
data->available_cores = pol->cpus;
|
|
|
|
+ /* Take a crude guess here.
|
|
+ * That guess was in microseconds, so multiply with 1000 */
|
|
+ pol->cpuinfo.transition_latency = (((data->rvo + 8) * data->vstable * VST_UNITS_20US)
|
|
+ + (3 * (1 << data->irt) * 10)) * 1000;
|
|
+
|
|
if (cpu_family == CPU_HW_PSTATE)
|
|
pol->cur = find_khz_freq_from_pstate(data->powernow_table, data->currpstate);
|
|
else
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/intel.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/intel.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/intel.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/intel.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,7 +30,7 @@
|
|
static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
|
|
{
|
|
/* Unmask CPUID levels if masked: */
|
|
- if (c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xd)) {
|
|
+ if (c->x86 == 6 && c->x86_model >= 15) {
|
|
u64 misc_enable;
|
|
|
|
rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
|
|
@@ -291,9 +291,6 @@
|
|
ds_init_intel(c);
|
|
}
|
|
|
|
- if (c->x86 == 6 && c->x86_model == 29 && cpu_has_clflush)
|
|
- set_cpu_cap(c, X86_FEATURE_CLFLUSH_MONITOR);
|
|
-
|
|
#ifdef CONFIG_X86_64
|
|
if (c->x86 == 15)
|
|
c->x86_cache_alignment = c->x86_clflush_size * 2;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/intel_cacheinfo.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/intel_cacheinfo.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/intel_cacheinfo.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/intel_cacheinfo.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -36,11 +36,8 @@
|
|
{
|
|
{ 0x06, LVL_1_INST, 8 }, /* 4-way set assoc, 32 byte line size */
|
|
{ 0x08, LVL_1_INST, 16 }, /* 4-way set assoc, 32 byte line size */
|
|
- { 0x09, LVL_1_INST, 32 }, /* 4-way set assoc, 64 byte line size */
|
|
{ 0x0a, LVL_1_DATA, 8 }, /* 2 way set assoc, 32 byte line size */
|
|
{ 0x0c, LVL_1_DATA, 16 }, /* 4-way set assoc, 32 byte line size */
|
|
- { 0x0d, LVL_1_DATA, 16 }, /* 4-way set assoc, 64 byte line size */
|
|
- { 0x21, LVL_2, 256 }, /* 8-way set assoc, 64 byte line size */
|
|
{ 0x22, LVL_3, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
|
{ 0x23, LVL_3, 1024 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
|
{ 0x25, LVL_3, 2048 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
|
@@ -88,18 +85,6 @@
|
|
{ 0x85, LVL_2, 2048 }, /* 8-way set assoc, 32 byte line size */
|
|
{ 0x86, LVL_2, 512 }, /* 4-way set assoc, 64 byte line size */
|
|
{ 0x87, LVL_2, 1024 }, /* 8-way set assoc, 64 byte line size */
|
|
- { 0xd0, LVL_3, 512 }, /* 4-way set assoc, 64 byte line size */
|
|
- { 0xd1, LVL_3, 1024 }, /* 4-way set assoc, 64 byte line size */
|
|
- { 0xd2, LVL_3, 2048 }, /* 4-way set assoc, 64 byte line size */
|
|
- { 0xd6, LVL_3, 1024 }, /* 8-way set assoc, 64 byte line size */
|
|
- { 0xd7, LVL_3, 2038 }, /* 8-way set assoc, 64 byte line size */
|
|
- { 0xd8, LVL_3, 4096 }, /* 12-way set assoc, 64 byte line size */
|
|
- { 0xdc, LVL_3, 2048 }, /* 12-way set assoc, 64 byte line size */
|
|
- { 0xdd, LVL_3, 4096 }, /* 12-way set assoc, 64 byte line size */
|
|
- { 0xde, LVL_3, 8192 }, /* 12-way set assoc, 64 byte line size */
|
|
- { 0xe2, LVL_3, 2048 }, /* 16-way set assoc, 64 byte line size */
|
|
- { 0xe3, LVL_3, 4096 }, /* 16-way set assoc, 64 byte line size */
|
|
- { 0xe4, LVL_3, 8192 }, /* 16-way set assoc, 64 byte line size */
|
|
{ 0x00, 0, 0}
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -295,11 +295,11 @@
|
|
* If we know that the error was in user space, send a
|
|
* SIGBUS. Otherwise, panic if tolerance is low.
|
|
*
|
|
- * force_sig() takes an awful lot of locks and has a slight
|
|
+ * do_exit() takes an awful lot of locks and has a slight
|
|
* risk of deadlocking.
|
|
*/
|
|
if (user_space) {
|
|
- force_sig(SIGBUS, current);
|
|
+ do_exit(SIGBUS);
|
|
} else if (panic_on_oops || tolerant < 2) {
|
|
mce_panic("Uncorrected machine check",
|
|
&panicm, mcestart);
|
|
@@ -490,7 +490,7 @@
|
|
|
|
}
|
|
|
|
-static void mce_cpu_features(struct cpuinfo_x86 *c)
|
|
+static void __cpuinit mce_cpu_features(struct cpuinfo_x86 *c)
|
|
{
|
|
switch (c->x86_vendor) {
|
|
case X86_VENDOR_INTEL:
|
|
@@ -734,7 +734,6 @@
|
|
static int mce_resume(struct sys_device *dev)
|
|
{
|
|
mce_init(NULL);
|
|
- mce_cpu_features(¤t_cpu_data);
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_amd_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_amd_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_amd_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_amd_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -121,7 +121,7 @@
|
|
}
|
|
|
|
/* cpu init entry point, called from mce.c with preempt off */
|
|
-void mce_amd_feature_init(struct cpuinfo_x86 *c)
|
|
+void __cpuinit mce_amd_feature_init(struct cpuinfo_x86 *c)
|
|
{
|
|
unsigned int bank, block;
|
|
unsigned int cpu = smp_processor_id();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_intel_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_intel_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_intel_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_intel_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,7 +30,7 @@
|
|
irq_exit();
|
|
}
|
|
|
|
-static void intel_init_thermal(struct cpuinfo_x86 *c)
|
|
+static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c)
|
|
{
|
|
u32 l, h;
|
|
int tm2 = 0;
|
|
@@ -84,7 +84,7 @@
|
|
return;
|
|
}
|
|
|
|
-void mce_intel_feature_init(struct cpuinfo_x86 *c)
|
|
+void __cpuinit mce_intel_feature_init(struct cpuinfo_x86 *c)
|
|
{
|
|
intel_init_thermal(c);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/cpu/mtrr/main.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mtrr/main.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/cpu/mtrr/main.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mtrr/main.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1594,7 +1594,8 @@
|
|
|
|
/* kvm/qemu doesn't have mtrr set right, don't trim them all */
|
|
if (!highest_pfn) {
|
|
- printk(KERN_INFO "CPU MTRRs all blank - virtualized system.\n");
|
|
+ WARN(!kvm_para_available(), KERN_WARNING
|
|
+ "WARNING: strange, CPU MTRRs all blank?\n");
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/ds.c linux-2.6.29-rc3.owrt/arch/x86/kernel/ds.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/ds.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/ds.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -15,8 +15,8 @@
|
|
* - buffer allocation (memory accounting)
|
|
*
|
|
*
|
|
- * Copyright (C) 2007-2009 Intel Corporation.
|
|
- * Markus Metzger <markus.t.metzger@intel.com>, 2007-2009
|
|
+ * Copyright (C) 2007-2008 Intel Corporation.
|
|
+ * Markus Metzger <markus.t.metzger@intel.com>, 2007-2008
|
|
*/
|
|
|
|
|
|
@@ -729,7 +729,7 @@
|
|
|
|
spin_unlock_irqrestore(&ds_lock, irq);
|
|
|
|
- ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_pebs);
|
|
+ ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_bts);
|
|
ds_resume_pebs(tracer);
|
|
|
|
return tracer;
|
|
@@ -890,7 +890,7 @@
|
|
}
|
|
|
|
static const struct ds_configuration ds_cfg_netburst = {
|
|
- .name = "Netburst",
|
|
+ .name = "netburst",
|
|
.ctl[dsf_bts] = (1 << 2) | (1 << 3),
|
|
.ctl[dsf_bts_kernel] = (1 << 5),
|
|
.ctl[dsf_bts_user] = (1 << 6),
|
|
@@ -904,7 +904,7 @@
|
|
#endif
|
|
};
|
|
static const struct ds_configuration ds_cfg_pentium_m = {
|
|
- .name = "Pentium M",
|
|
+ .name = "pentium m",
|
|
.ctl[dsf_bts] = (1 << 6) | (1 << 7),
|
|
|
|
.sizeof_field = sizeof(long),
|
|
@@ -915,8 +915,8 @@
|
|
.sizeof_rec[ds_pebs] = sizeof(long) * 18,
|
|
#endif
|
|
};
|
|
-static const struct ds_configuration ds_cfg_core2_atom = {
|
|
- .name = "Core 2/Atom",
|
|
+static const struct ds_configuration ds_cfg_core2 = {
|
|
+ .name = "core 2",
|
|
.ctl[dsf_bts] = (1 << 6) | (1 << 7),
|
|
.ctl[dsf_bts_kernel] = (1 << 9),
|
|
.ctl[dsf_bts_user] = (1 << 10),
|
|
@@ -949,22 +949,19 @@
|
|
switch (c->x86) {
|
|
case 0x6:
|
|
switch (c->x86_model) {
|
|
- case 0x9:
|
|
- case 0xd: /* Pentium M */
|
|
- ds_configure(&ds_cfg_pentium_m);
|
|
+ case 0 ... 0xC:
|
|
+ /* sorry, don't know about them */
|
|
break;
|
|
- case 0xf:
|
|
- case 0x17: /* Core2 */
|
|
- case 0x1c: /* Atom */
|
|
- ds_configure(&ds_cfg_core2_atom);
|
|
+ case 0xD:
|
|
+ case 0xE: /* Pentium M */
|
|
+ ds_configure(&ds_cfg_pentium_m);
|
|
break;
|
|
- case 0x1a: /* i7 */
|
|
- default:
|
|
- /* sorry, don't know about them */
|
|
+ default: /* Core2, Atom, ... */
|
|
+ ds_configure(&ds_cfg_core2);
|
|
break;
|
|
}
|
|
break;
|
|
- case 0xf:
|
|
+ case 0xF:
|
|
switch (c->x86_model) {
|
|
case 0x0:
|
|
case 0x1:
|
|
@@ -1029,4 +1026,5 @@
|
|
|
|
void ds_exit_thread(struct task_struct *tsk)
|
|
{
|
|
+ WARN_ON(tsk->thread.ds_ctx);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/efi_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/efi_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/efi_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/efi_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -99,11 +99,24 @@
|
|
|
|
void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size)
|
|
{
|
|
- unsigned long last_map_pfn;
|
|
+ static unsigned pages_mapped __initdata;
|
|
+ unsigned i, pages;
|
|
+ unsigned long offset;
|
|
|
|
- last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size);
|
|
- if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size)
|
|
+ pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr);
|
|
+ offset = phys_addr & ~PAGE_MASK;
|
|
+ phys_addr &= PAGE_MASK;
|
|
+
|
|
+ if (pages_mapped + pages > MAX_EFI_IO_PAGES)
|
|
return NULL;
|
|
|
|
- return (void __iomem *)__va(phys_addr);
|
|
+ for (i = 0; i < pages; i++) {
|
|
+ __set_fixmap(FIX_EFI_IO_MAP_FIRST_PAGE - pages_mapped,
|
|
+ phys_addr, PAGE_KERNEL);
|
|
+ phys_addr += PAGE_SIZE;
|
|
+ pages_mapped++;
|
|
+ }
|
|
+
|
|
+ return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \
|
|
+ (pages_mapped - pages)) + offset;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/efi.c linux-2.6.29-rc3.owrt/arch/x86/kernel/efi.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/efi.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/efi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -467,7 +467,7 @@
|
|
efi_memory_desc_t *md;
|
|
efi_status_t status;
|
|
unsigned long size;
|
|
- u64 end, systab, addr, npages, end_pfn;
|
|
+ u64 end, systab, addr, npages;
|
|
void *p, *va;
|
|
|
|
efi.systab = NULL;
|
|
@@ -479,10 +479,7 @@
|
|
size = md->num_pages << EFI_PAGE_SHIFT;
|
|
end = md->phys_addr + size;
|
|
|
|
- end_pfn = PFN_UP(end);
|
|
- if (end_pfn <= max_low_pfn_mapped
|
|
- || (end_pfn > (1UL << (32 - PAGE_SHIFT))
|
|
- && end_pfn <= max_pfn_mapped))
|
|
+ if (PFN_UP(end) <= max_low_pfn_mapped)
|
|
va = __va(md->phys_addr);
|
|
else
|
|
va = efi_ioremap(md->phys_addr, size);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/entry_64.S linux-2.6.29-rc3.owrt/arch/x86/kernel/entry_64.S
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/entry_64.S 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/entry_64.S 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -346,7 +346,6 @@
|
|
popq_cfi %rax /* move return address... */
|
|
mov %gs:pda_irqstackptr,%rsp
|
|
EMPTY_FRAME 0
|
|
- pushq_cfi %rbp /* backlink for unwinder */
|
|
pushq_cfi %rax /* ... to the new stack */
|
|
/*
|
|
* We entered an interrupt context - irqs are off:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/ftrace.c linux-2.6.29-rc3.owrt/arch/x86/kernel/ftrace.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/ftrace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/ftrace.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -488,21 +488,20 @@
|
|
* ignore such a protection.
|
|
*/
|
|
asm volatile(
|
|
- "1: " _ASM_MOV " (%[parent]), %[old]\n"
|
|
- "2: " _ASM_MOV " %[return_hooker], (%[parent])\n"
|
|
+ "1: " _ASM_MOV " (%[parent_old]), %[old]\n"
|
|
+ "2: " _ASM_MOV " %[return_hooker], (%[parent_replaced])\n"
|
|
" movl $0, %[faulted]\n"
|
|
- "3:\n"
|
|
|
|
".section .fixup, \"ax\"\n"
|
|
- "4: movl $1, %[faulted]\n"
|
|
- " jmp 3b\n"
|
|
+ "3: movl $1, %[faulted]\n"
|
|
".previous\n"
|
|
|
|
- _ASM_EXTABLE(1b, 4b)
|
|
- _ASM_EXTABLE(2b, 4b)
|
|
+ _ASM_EXTABLE(1b, 3b)
|
|
+ _ASM_EXTABLE(2b, 3b)
|
|
|
|
- : [old] "=r" (old), [faulted] "=r" (faulted)
|
|
- : [parent] "r" (parent), [return_hooker] "r" (return_hooker)
|
|
+ : [parent_replaced] "=r" (parent), [old] "=r" (old),
|
|
+ [faulted] "=r" (faulted)
|
|
+ : [parent_old] "0" (parent), [return_hooker] "r" (return_hooker)
|
|
: "memory"
|
|
);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/hpet.c linux-2.6.29-rc3.owrt/arch/x86/kernel/hpet.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/hpet.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/hpet.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -269,8 +269,6 @@
|
|
now = hpet_readl(HPET_COUNTER);
|
|
cmp = now + (unsigned long) delta;
|
|
cfg = hpet_readl(HPET_Tn_CFG(timer));
|
|
- /* Make sure we use edge triggered interrupts */
|
|
- cfg &= ~HPET_TN_LEVEL;
|
|
cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
|
|
HPET_TN_SETVAL | HPET_TN_32BIT;
|
|
hpet_writel(cfg, HPET_Tn_CFG(timer));
|
|
@@ -899,7 +897,7 @@
|
|
static int hpet_prev_update_sec;
|
|
static struct rtc_time hpet_alarm_time;
|
|
static unsigned long hpet_pie_count;
|
|
-static u32 hpet_t1_cmp;
|
|
+static unsigned long hpet_t1_cmp;
|
|
static unsigned long hpet_default_delta;
|
|
static unsigned long hpet_pie_delta;
|
|
static unsigned long hpet_pie_limit;
|
|
@@ -907,14 +905,6 @@
|
|
static rtc_irq_handler irq_handler;
|
|
|
|
/*
|
|
- * Check that the hpet counter c1 is ahead of the c2
|
|
- */
|
|
-static inline int hpet_cnt_ahead(u32 c1, u32 c2)
|
|
-{
|
|
- return (s32)(c2 - c1) < 0;
|
|
-}
|
|
-
|
|
-/*
|
|
* Registers a IRQ handler.
|
|
*/
|
|
int hpet_register_irq_handler(rtc_irq_handler handler)
|
|
@@ -1085,7 +1075,7 @@
|
|
hpet_t1_cmp += delta;
|
|
hpet_writel(hpet_t1_cmp, HPET_T1_CMP);
|
|
lost_ints++;
|
|
- } while (!hpet_cnt_ahead(hpet_t1_cmp, hpet_readl(HPET_COUNTER)));
|
|
+ } while ((long)(hpet_readl(HPET_COUNTER) - hpet_t1_cmp) > 0);
|
|
|
|
if (lost_ints) {
|
|
if (hpet_rtc_flags & RTC_PIE)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/i387.c linux-2.6.29-rc3.owrt/arch/x86/kernel/i387.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/i387.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/i387.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -136,7 +136,7 @@
|
|
#ifdef CONFIG_X86_32
|
|
if (!HAVE_HWFP) {
|
|
memset(tsk->thread.xstate, 0, xstate_size);
|
|
- finit_task(tsk);
|
|
+ finit();
|
|
set_stopped_child_used_math(tsk);
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/i8237.c linux-2.6.29-rc3.owrt/arch/x86/kernel/i8237.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/i8237.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/i8237.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -28,10 +28,10 @@
|
|
|
|
flags = claim_dma_lock();
|
|
|
|
- dma_outb(0, DMA1_RESET_REG);
|
|
- dma_outb(0, DMA2_RESET_REG);
|
|
+ dma_outb(DMA1_RESET_REG, 0);
|
|
+ dma_outb(DMA2_RESET_REG, 0);
|
|
|
|
- for (i = 0; i < 8; i++) {
|
|
+ for (i = 0;i < 8;i++) {
|
|
set_dma_addr(i, 0x000000);
|
|
/* DMA count is a bit weird so this is not 0 */
|
|
set_dma_count(i, 1);
|
|
@@ -51,14 +51,14 @@
|
|
}
|
|
|
|
static struct sysdev_class i8237_sysdev_class = {
|
|
- .name = "i8237",
|
|
- .suspend = i8237A_suspend,
|
|
- .resume = i8237A_resume,
|
|
+ .name = "i8237",
|
|
+ .suspend = i8237A_suspend,
|
|
+ .resume = i8237A_resume,
|
|
};
|
|
|
|
static struct sys_device device_i8237A = {
|
|
- .id = 0,
|
|
- .cls = &i8237_sysdev_class,
|
|
+ .id = 0,
|
|
+ .cls = &i8237_sysdev_class,
|
|
};
|
|
|
|
static int __init i8237A_init_sysfs(void)
|
|
@@ -68,4 +68,5 @@
|
|
error = sysdev_register(&device_i8237A);
|
|
return error;
|
|
}
|
|
+
|
|
device_initcall(i8237A_init_sysfs);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/io_apic.c linux-2.6.29-rc3.owrt/arch/x86/kernel/io_apic.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/io_apic.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/io_apic.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2528,15 +2528,14 @@
|
|
|
|
vector = ~get_irq_regs()->orig_ax;
|
|
me = smp_processor_id();
|
|
-
|
|
- if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) {
|
|
#ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC
|
|
*descp = desc = move_irq_desc(desc, me);
|
|
/* get the new one */
|
|
cfg = desc->chip_data;
|
|
#endif
|
|
+
|
|
+ if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
|
|
send_cleanup_vector(cfg);
|
|
- }
|
|
}
|
|
#else
|
|
static inline void irq_complete_move(struct irq_desc **descp) {}
|
|
@@ -3841,24 +3840,14 @@
|
|
|
|
void __init probe_nr_irqs_gsi(void)
|
|
{
|
|
+ int idx;
|
|
int nr = 0;
|
|
|
|
- nr = acpi_probe_gsi();
|
|
- if (nr > nr_irqs_gsi) {
|
|
- nr_irqs_gsi = nr;
|
|
- } else {
|
|
- /* for acpi=off or acpi is not compiled in */
|
|
- int idx;
|
|
-
|
|
- nr = 0;
|
|
- for (idx = 0; idx < nr_ioapics; idx++)
|
|
- nr += io_apic_get_redir_entries(idx) + 1;
|
|
-
|
|
- if (nr > nr_irqs_gsi)
|
|
- nr_irqs_gsi = nr;
|
|
- }
|
|
+ for (idx = 0; idx < nr_ioapics; idx++)
|
|
+ nr += io_apic_get_redir_entries(idx) + 1;
|
|
|
|
- printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi);
|
|
+ if (nr > nr_irqs_gsi)
|
|
+ nr_irqs_gsi = nr;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/irqinit_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/irqinit_32.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/irqinit_32.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/irqinit_32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -78,6 +78,15 @@
|
|
}
|
|
}
|
|
|
|
+/*
|
|
+ * IRQ2 is cascade interrupt to second interrupt controller
|
|
+ */
|
|
+static struct irqaction irq2 = {
|
|
+ .handler = no_action,
|
|
+ .mask = CPU_MASK_NONE,
|
|
+ .name = "cascade",
|
|
+};
|
|
+
|
|
DEFINE_PER_CPU(vector_irq_t, vector_irq) = {
|
|
[0 ... IRQ0_VECTOR - 1] = -1,
|
|
[IRQ0_VECTOR] = 0,
|
|
@@ -169,6 +178,9 @@
|
|
alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
|
|
#endif
|
|
|
|
+ if (!acpi_ioapic)
|
|
+ setup_irq(2, &irq2);
|
|
+
|
|
/* setup after call gates are initialised (usually add in
|
|
* the architecture specific gates)
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/kprobes.c linux-2.6.29-rc3.owrt/arch/x86/kernel/kprobes.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/kprobes.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/kprobes.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -193,9 +193,6 @@
|
|
kprobe_opcode_t opcode;
|
|
kprobe_opcode_t *orig_opcodes = opcodes;
|
|
|
|
- if (search_exception_tables(opcodes))
|
|
- return 0; /* Page fault may occur on this address. */
|
|
-
|
|
retry:
|
|
if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1)
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/olpc.c linux-2.6.29-rc3.owrt/arch/x86/kernel/olpc.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/olpc.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/olpc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -203,7 +203,7 @@
|
|
static void __init platform_detect(void)
|
|
{
|
|
/* stopgap until OFW support is added to the kernel */
|
|
- olpc_platform_info.boardrev = olpc_board(0xc2);
|
|
+ olpc_platform_info.boardrev = 0xc2;
|
|
}
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/paravirt.c linux-2.6.29-rc3.owrt/arch/x86/kernel/paravirt.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/paravirt.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/paravirt.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -268,32 +268,6 @@
|
|
return __get_cpu_var(paravirt_lazy_mode);
|
|
}
|
|
|
|
-void arch_flush_lazy_mmu_mode(void)
|
|
-{
|
|
- preempt_disable();
|
|
-
|
|
- if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) {
|
|
- WARN_ON(preempt_count() == 1);
|
|
- arch_leave_lazy_mmu_mode();
|
|
- arch_enter_lazy_mmu_mode();
|
|
- }
|
|
-
|
|
- preempt_enable();
|
|
-}
|
|
-
|
|
-void arch_flush_lazy_cpu_mode(void)
|
|
-{
|
|
- preempt_disable();
|
|
-
|
|
- if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU) {
|
|
- WARN_ON(preempt_count() == 1);
|
|
- arch_leave_lazy_cpu_mode();
|
|
- arch_enter_lazy_cpu_mode();
|
|
- }
|
|
-
|
|
- preempt_enable();
|
|
-}
|
|
-
|
|
struct pv_info pv_info = {
|
|
.name = "bare hardware",
|
|
.paravirt_enabled = 0,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/pci-gart_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/pci-gart_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/pci-gart_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/pci-gart_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,7 +5,7 @@
|
|
* This allows to use PCI devices that only support 32bit addresses on systems
|
|
* with more than 4GB.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt for the interface specification.
|
|
+ * See Documentation/DMA-mapping.txt for the interface specification.
|
|
*
|
|
* Copyright 2002 Andi Kleen, SuSE Labs.
|
|
* Subject to the GNU General Public License v2 only.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/process_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/process_32.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/process_32.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/process_32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -104,6 +104,9 @@
|
|
check_pgt_cache();
|
|
rmb();
|
|
|
|
+ if (rcu_pending(cpu))
|
|
+ rcu_check_callbacks(cpu, 0);
|
|
+
|
|
if (cpu_is_offline(cpu))
|
|
play_dead();
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/process_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/process_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/process_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/process_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -40,7 +40,6 @@
|
|
#include <linux/uaccess.h>
|
|
#include <linux/io.h>
|
|
#include <linux/ftrace.h>
|
|
-#include <linux/dmi.h>
|
|
|
|
#include <asm/pgtable.h>
|
|
#include <asm/system.h>
|
|
@@ -152,18 +151,14 @@
|
|
unsigned long d0, d1, d2, d3, d6, d7;
|
|
unsigned int fsindex, gsindex;
|
|
unsigned int ds, cs, es;
|
|
- const char *board;
|
|
|
|
printk("\n");
|
|
print_modules();
|
|
- board = dmi_get_system_info(DMI_PRODUCT_NAME);
|
|
- if (!board)
|
|
- board = "";
|
|
- printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s %s\n",
|
|
+ printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s\n",
|
|
current->pid, current->comm, print_tainted(),
|
|
init_utsname()->release,
|
|
(int)strcspn(init_utsname()->version, " "),
|
|
- init_utsname()->version, board);
|
|
+ init_utsname()->version);
|
|
printk(KERN_INFO "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
|
|
printk_address(regs->ip, 1);
|
|
printk(KERN_INFO "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/process.c linux-2.6.29-rc3.owrt/arch/x86/kernel/process.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/process.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/process.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -180,9 +180,6 @@
|
|
|
|
trace_power_start(&it, POWER_CSTATE, (ax>>4)+1);
|
|
if (!need_resched()) {
|
|
- if (cpu_has(¤t_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
|
|
- clflush((void *)¤t_thread_info()->flags);
|
|
-
|
|
__monitor((void *)¤t_thread_info()->flags, 0, 0);
|
|
smp_mb();
|
|
if (!need_resched())
|
|
@@ -197,9 +194,6 @@
|
|
struct power_trace it;
|
|
if (!need_resched()) {
|
|
trace_power_start(&it, POWER_CSTATE, 1);
|
|
- if (cpu_has(¤t_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
|
|
- clflush((void *)¤t_thread_info()->flags);
|
|
-
|
|
__monitor((void *)¤t_thread_info()->flags, 0, 0);
|
|
smp_mb();
|
|
if (!need_resched())
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/ptrace.c linux-2.6.29-rc3.owrt/arch/x86/kernel/ptrace.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/ptrace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/ptrace.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -810,16 +810,12 @@
|
|
|
|
static void ptrace_bts_detach(struct task_struct *child)
|
|
{
|
|
- /*
|
|
- * Ptrace_detach() races with ptrace_untrace() in case
|
|
- * the child dies and is reaped by another thread.
|
|
- *
|
|
- * We only do the memory accounting at this point and
|
|
- * leave the buffer deallocation and the bts tracer
|
|
- * release to ptrace_bts_untrace() which will be called
|
|
- * later on with tasklist_lock held.
|
|
- */
|
|
- release_locked_buffer(child->bts_buffer, child->bts_size);
|
|
+ if (unlikely(child->bts)) {
|
|
+ ds_release_bts(child->bts);
|
|
+ child->bts = NULL;
|
|
+
|
|
+ ptrace_bts_free_buffer(child);
|
|
+ }
|
|
}
|
|
#else
|
|
static inline void ptrace_bts_fork(struct task_struct *tsk) {}
|
|
@@ -1388,7 +1384,7 @@
|
|
#ifdef CONFIG_X86_32
|
|
# define IS_IA32 1
|
|
#elif defined CONFIG_IA32_EMULATION
|
|
-# define IS_IA32 is_compat_task()
|
|
+# define IS_IA32 test_thread_flag(TIF_IA32)
|
|
#else
|
|
# define IS_IA32 0
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/reboot.c linux-2.6.29-rc3.owrt/arch/x86/kernel/reboot.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/reboot.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/reboot.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -217,14 +217,6 @@
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),
|
|
},
|
|
},
|
|
- { /* Handle problems with rebooting on Dell XPS710 */
|
|
- .callback = set_bios_reboot,
|
|
- .ident = "Dell XPS710",
|
|
- .matches = {
|
|
- DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
|
- DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"),
|
|
- },
|
|
- },
|
|
{ }
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/setup.c linux-2.6.29-rc3.owrt/arch/x86/kernel/setup.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -607,7 +607,7 @@
|
|
static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
|
|
{
|
|
printk(KERN_NOTICE
|
|
- "%s detected: BIOS may corrupt low RAM, working around it.\n",
|
|
+ "%s detected: BIOS may corrupt low RAM, working it around.\n",
|
|
d->ident);
|
|
|
|
e820_update_range(0, 0x10000, E820_RAM, E820_RESERVED);
|
|
@@ -770,9 +770,6 @@
|
|
|
|
finish_e820_parsing();
|
|
|
|
- if (efi_enabled)
|
|
- efi_init();
|
|
-
|
|
dmi_scan_machine();
|
|
|
|
dmi_check_system(bad_bios_dmi_table);
|
|
@@ -792,6 +789,8 @@
|
|
insert_resource(&iomem_resource, &data_resource);
|
|
insert_resource(&iomem_resource, &bss_resource);
|
|
|
|
+ if (efi_enabled)
|
|
+ efi_init();
|
|
|
|
#ifdef CONFIG_X86_32
|
|
if (ppro_with_ram_bug()) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/time_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/time_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/time_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/time_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -115,7 +115,7 @@
|
|
|
|
static struct irqaction irq0 = {
|
|
.handler = timer_interrupt,
|
|
- .flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING | IRQF_TIMER,
|
|
+ .flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING,
|
|
.mask = CPU_MASK_NONE,
|
|
.name = "timer"
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/traps.c linux-2.6.29-rc3.owrt/arch/x86/kernel/traps.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/traps.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/traps.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -99,12 +99,6 @@
|
|
local_irq_enable();
|
|
}
|
|
|
|
-static inline void conditional_cli(struct pt_regs *regs)
|
|
-{
|
|
- if (regs->flags & X86_EFLAGS_IF)
|
|
- local_irq_disable();
|
|
-}
|
|
-
|
|
static inline void preempt_conditional_cli(struct pt_regs *regs)
|
|
{
|
|
if (regs->flags & X86_EFLAGS_IF)
|
|
@@ -632,10 +626,8 @@
|
|
|
|
#ifdef CONFIG_X86_32
|
|
debug_vm86:
|
|
- /* reenable preemption: handle_vm86_trap() might sleep */
|
|
- dec_preempt_count();
|
|
handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
|
|
- conditional_cli(regs);
|
|
+ preempt_conditional_cli(regs);
|
|
return;
|
|
#endif
|
|
|
|
@@ -904,7 +896,7 @@
|
|
EXPORT_SYMBOL_GPL(math_state_restore);
|
|
|
|
#ifndef CONFIG_MATH_EMULATION
|
|
-void math_emulate(struct math_emu_info *info)
|
|
+asmlinkage void math_emulate(long arg)
|
|
{
|
|
printk(KERN_EMERG
|
|
"math-emulation not enabled and no coprocessor found.\n");
|
|
@@ -914,19 +906,16 @@
|
|
}
|
|
#endif /* CONFIG_MATH_EMULATION */
|
|
|
|
-dotraplinkage void __kprobes do_device_not_available(struct pt_regs regs)
|
|
+dotraplinkage void __kprobes
|
|
+do_device_not_available(struct pt_regs *regs, long error)
|
|
{
|
|
#ifdef CONFIG_X86_32
|
|
if (read_cr0() & X86_CR0_EM) {
|
|
- struct math_emu_info info = { };
|
|
-
|
|
- conditional_sti(®s);
|
|
-
|
|
- info.regs = ®s;
|
|
- math_emulate(&info);
|
|
+ conditional_sti(regs);
|
|
+ math_emulate(0);
|
|
} else {
|
|
math_state_restore(); /* interrupts still off */
|
|
- conditional_sti(®s);
|
|
+ conditional_sti(regs);
|
|
}
|
|
#else
|
|
math_state_restore();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/tsc.c linux-2.6.29-rc3.owrt/arch/x86/kernel/tsc.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/tsc.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/tsc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -273,43 +273,30 @@
|
|
* use the TSC value at the transitions to calculate a pretty
|
|
* good value for the TSC frequencty.
|
|
*/
|
|
-static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap)
|
|
+static inline int pit_expect_msb(unsigned char val)
|
|
{
|
|
- int count;
|
|
- u64 tsc = 0;
|
|
+ int count = 0;
|
|
|
|
for (count = 0; count < 50000; count++) {
|
|
/* Ignore LSB */
|
|
inb(0x42);
|
|
if (inb(0x42) != val)
|
|
break;
|
|
- tsc = get_cycles();
|
|
}
|
|
- *deltap = get_cycles() - tsc;
|
|
- *tscp = tsc;
|
|
-
|
|
- /*
|
|
- * We require _some_ success, but the quality control
|
|
- * will be based on the error terms on the TSC values.
|
|
- */
|
|
- return count > 5;
|
|
+ return count > 50;
|
|
}
|
|
|
|
/*
|
|
- * How many MSB values do we want to see? We aim for
|
|
- * a maximum error rate of 500ppm (in practice the
|
|
- * real error is much smaller), but refuse to spend
|
|
- * more than 25ms on it.
|
|
+ * How many MSB values do we want to see? We aim for a
|
|
+ * 15ms calibration, which assuming a 2us counter read
|
|
+ * error should give us roughly 150 ppm precision for
|
|
+ * the calibration.
|
|
*/
|
|
-#define MAX_QUICK_PIT_MS 25
|
|
-#define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
|
|
+#define QUICK_PIT_MS 15
|
|
+#define QUICK_PIT_ITERATIONS (QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
|
|
|
|
static unsigned long quick_pit_calibrate(void)
|
|
{
|
|
- int i;
|
|
- u64 tsc, delta;
|
|
- unsigned long d1, d2;
|
|
-
|
|
/* Set the Gate high, disable speaker */
|
|
outb((inb(0x61) & ~0x02) | 0x01, 0x61);
|
|
|
|
@@ -328,52 +315,45 @@
|
|
outb(0xff, 0x42);
|
|
outb(0xff, 0x42);
|
|
|
|
- /*
|
|
- * The PIT starts counting at the next edge, so we
|
|
- * need to delay for a microsecond. The easiest way
|
|
- * to do that is to just read back the 16-bit counter
|
|
- * once from the PIT.
|
|
- */
|
|
- inb(0x42);
|
|
- inb(0x42);
|
|
-
|
|
- if (pit_expect_msb(0xff, &tsc, &d1)) {
|
|
- for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) {
|
|
- if (!pit_expect_msb(0xff-i, &delta, &d2))
|
|
- break;
|
|
-
|
|
- /*
|
|
- * Iterate until the error is less than 500 ppm
|
|
- */
|
|
- delta -= tsc;
|
|
- if (d1+d2 < delta >> 11)
|
|
- goto success;
|
|
+ if (pit_expect_msb(0xff)) {
|
|
+ int i;
|
|
+ u64 t1, t2, delta;
|
|
+ unsigned char expect = 0xfe;
|
|
+
|
|
+ t1 = get_cycles();
|
|
+ for (i = 0; i < QUICK_PIT_ITERATIONS; i++, expect--) {
|
|
+ if (!pit_expect_msb(expect))
|
|
+ goto failed;
|
|
}
|
|
+ t2 = get_cycles();
|
|
+
|
|
+ /*
|
|
+ * Make sure we can rely on the second TSC timestamp:
|
|
+ */
|
|
+ if (!pit_expect_msb(expect))
|
|
+ goto failed;
|
|
+
|
|
+ /*
|
|
+ * Ok, if we get here, then we've seen the
|
|
+ * MSB of the PIT decrement QUICK_PIT_ITERATIONS
|
|
+ * times, and each MSB had many hits, so we never
|
|
+ * had any sudden jumps.
|
|
+ *
|
|
+ * As a result, we can depend on there not being
|
|
+ * any odd delays anywhere, and the TSC reads are
|
|
+ * reliable.
|
|
+ *
|
|
+ * kHz = ticks / time-in-seconds / 1000;
|
|
+ * kHz = (t2 - t1) / (QPI * 256 / PIT_TICK_RATE) / 1000
|
|
+ * kHz = ((t2 - t1) * PIT_TICK_RATE) / (QPI * 256 * 1000)
|
|
+ */
|
|
+ delta = (t2 - t1)*PIT_TICK_RATE;
|
|
+ do_div(delta, QUICK_PIT_ITERATIONS*256*1000);
|
|
+ printk("Fast TSC calibration using PIT\n");
|
|
+ return delta;
|
|
}
|
|
- printk("Fast TSC calibration failed\n");
|
|
+failed:
|
|
return 0;
|
|
-
|
|
-success:
|
|
- /*
|
|
- * Ok, if we get here, then we've seen the
|
|
- * MSB of the PIT decrement 'i' times, and the
|
|
- * error has shrunk to less than 500 ppm.
|
|
- *
|
|
- * As a result, we can depend on there not being
|
|
- * any odd delays anywhere, and the TSC reads are
|
|
- * reliable (within the error). We also adjust the
|
|
- * delta to the middle of the error bars, just
|
|
- * because it looks nicer.
|
|
- *
|
|
- * kHz = ticks / time-in-seconds / 1000;
|
|
- * kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000
|
|
- * kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000)
|
|
- */
|
|
- delta += (long)(d2 - d1)/2;
|
|
- delta *= PIT_TICK_RATE;
|
|
- do_div(delta, i*256*1000);
|
|
- printk("Fast TSC calibration using PIT\n");
|
|
- return delta;
|
|
}
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/vmi_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/vmi_32.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/vmi_32.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/vmi_32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -321,16 +321,6 @@
|
|
}
|
|
|
|
/*
|
|
- * We use the pgd_free hook for releasing the pgd page:
|
|
- */
|
|
-static void vmi_pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
|
-{
|
|
- unsigned long pfn = __pa(pgd) >> PAGE_SHIFT;
|
|
-
|
|
- vmi_ops.release_page(pfn, VMI_PAGE_L2);
|
|
-}
|
|
-
|
|
-/*
|
|
* Helper macros for MMU update flags. We can defer updates until a flush
|
|
* or page invalidation only if the update is to the current address space
|
|
* (otherwise, there is no flush). We must check against init_mm, since
|
|
@@ -772,7 +762,6 @@
|
|
if (vmi_ops.release_page) {
|
|
pv_mmu_ops.release_pte = vmi_release_pte;
|
|
pv_mmu_ops.release_pmd = vmi_release_pmd;
|
|
- pv_mmu_ops.pgd_free = vmi_pgd_free;
|
|
}
|
|
|
|
/* Set linear is needed in all cases */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kernel/vmiclock_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/vmiclock_32.c
|
|
--- linux-2.6.29.owrt/arch/x86/kernel/vmiclock_32.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kernel/vmiclock_32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -202,7 +202,7 @@
|
|
static struct irqaction vmi_clock_action = {
|
|
.name = "vmi-timer",
|
|
.handler = vmi_timer_interrupt,
|
|
- .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER,
|
|
+ .flags = IRQF_DISABLED | IRQF_NOBALANCING,
|
|
.mask = CPU_MASK_ALL,
|
|
};
|
|
|
|
@@ -283,13 +283,10 @@
|
|
#endif
|
|
|
|
/** vmi clocksource */
|
|
-static struct clocksource clocksource_vmi;
|
|
|
|
static cycle_t read_real_cycles(void)
|
|
{
|
|
- cycle_t ret = (cycle_t)vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
|
|
- return ret >= clocksource_vmi.cycle_last ?
|
|
- ret : clocksource_vmi.cycle_last;
|
|
+ return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
|
|
}
|
|
|
|
static struct clocksource clocksource_vmi = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/i8254.c linux-2.6.29-rc3.owrt/arch/x86/kvm/i8254.c
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/i8254.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/i8254.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -207,7 +207,7 @@
|
|
hrtimer_add_expires_ns(&pt->timer, pt->period);
|
|
pt->scheduled = hrtimer_get_expires_ns(&pt->timer);
|
|
if (pt->period)
|
|
- ps->channels[0].count_load_time = ktime_get();
|
|
+ ps->channels[0].count_load_time = hrtimer_get_expires(&pt->timer);
|
|
|
|
return (pt->period == 0 ? 0 : 1);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/irq.c linux-2.6.29-rc3.owrt/arch/x86/kvm/irq.c
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/irq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -87,6 +87,13 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs);
|
|
|
|
+void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
|
|
+{
|
|
+ kvm_apic_timer_intr_post(vcpu, vec);
|
|
+ /* TODO: PIT, RTC etc. */
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(kvm_timer_intr_post);
|
|
+
|
|
void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
|
|
{
|
|
__kvm_migrate_apic_timer(vcpu);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/irq.h linux-2.6.29-rc3.owrt/arch/x86/kvm/irq.h
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/irq.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/irq.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -89,6 +89,7 @@
|
|
|
|
void kvm_pic_reset(struct kvm_kpic_state *s);
|
|
|
|
+void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
|
|
void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
|
|
void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
|
|
void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/lapic.c linux-2.6.29-rc3.owrt/arch/x86/kvm/lapic.c
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/lapic.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/lapic.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -35,12 +35,6 @@
|
|
#include "kvm_cache_regs.h"
|
|
#include "irq.h"
|
|
|
|
-#ifndef CONFIG_X86_64
|
|
-#define mod_64(x, y) ((x) - (y) * div64_u64(x, y))
|
|
-#else
|
|
-#define mod_64(x, y) ((x) % (y))
|
|
-#endif
|
|
-
|
|
#define PRId64 "d"
|
|
#define PRIx64 "llx"
|
|
#define PRIu64 "u"
|
|
@@ -517,22 +511,52 @@
|
|
|
|
static u32 apic_get_tmcct(struct kvm_lapic *apic)
|
|
{
|
|
- ktime_t remaining;
|
|
- s64 ns;
|
|
+ u64 counter_passed;
|
|
+ ktime_t passed, now;
|
|
u32 tmcct;
|
|
|
|
ASSERT(apic != NULL);
|
|
|
|
+ now = apic->timer.dev.base->get_time();
|
|
+ tmcct = apic_get_reg(apic, APIC_TMICT);
|
|
+
|
|
/* if initial count is 0, current count should also be 0 */
|
|
- if (apic_get_reg(apic, APIC_TMICT) == 0)
|
|
+ if (tmcct == 0)
|
|
return 0;
|
|
|
|
- remaining = hrtimer_expires_remaining(&apic->timer.dev);
|
|
- if (ktime_to_ns(remaining) < 0)
|
|
- remaining = ktime_set(0, 0);
|
|
-
|
|
- ns = mod_64(ktime_to_ns(remaining), apic->timer.period);
|
|
- tmcct = div64_u64(ns, (APIC_BUS_CYCLE_NS * apic->timer.divide_count));
|
|
+ if (unlikely(ktime_to_ns(now) <=
|
|
+ ktime_to_ns(apic->timer.last_update))) {
|
|
+ /* Wrap around */
|
|
+ passed = ktime_add(( {
|
|
+ (ktime_t) {
|
|
+ .tv64 = KTIME_MAX -
|
|
+ (apic->timer.last_update).tv64}; }
|
|
+ ), now);
|
|
+ apic_debug("time elapsed\n");
|
|
+ } else
|
|
+ passed = ktime_sub(now, apic->timer.last_update);
|
|
+
|
|
+ counter_passed = div64_u64(ktime_to_ns(passed),
|
|
+ (APIC_BUS_CYCLE_NS * apic->timer.divide_count));
|
|
+
|
|
+ if (counter_passed > tmcct) {
|
|
+ if (unlikely(!apic_lvtt_period(apic))) {
|
|
+ /* one-shot timers stick at 0 until reset */
|
|
+ tmcct = 0;
|
|
+ } else {
|
|
+ /*
|
|
+ * periodic timers reset to APIC_TMICT when they
|
|
+ * hit 0. The while loop simulates this happening N
|
|
+ * times. (counter_passed %= tmcct) would also work,
|
|
+ * but might be slower or not work on 32-bit??
|
|
+ */
|
|
+ while (counter_passed > tmcct)
|
|
+ counter_passed -= tmcct;
|
|
+ tmcct -= counter_passed;
|
|
+ }
|
|
+ } else {
|
|
+ tmcct -= counter_passed;
|
|
+ }
|
|
|
|
return tmcct;
|
|
}
|
|
@@ -629,6 +653,8 @@
|
|
{
|
|
ktime_t now = apic->timer.dev.base->get_time();
|
|
|
|
+ apic->timer.last_update = now;
|
|
+
|
|
apic->timer.period = apic_get_reg(apic, APIC_TMICT) *
|
|
APIC_BUS_CYCLE_NS * apic->timer.divide_count;
|
|
atomic_set(&apic->timer.pending, 0);
|
|
@@ -1084,6 +1110,16 @@
|
|
}
|
|
}
|
|
|
|
+void kvm_apic_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
|
|
+{
|
|
+ struct kvm_lapic *apic = vcpu->arch.apic;
|
|
+
|
|
+ if (apic && apic_lvt_vector(apic, APIC_LVTT) == vec)
|
|
+ apic->timer.last_update = ktime_add_ns(
|
|
+ apic->timer.last_update,
|
|
+ apic->timer.period);
|
|
+}
|
|
+
|
|
int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu)
|
|
{
|
|
int vector = kvm_apic_has_interrupt(vcpu);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/lapic.h linux-2.6.29-rc3.owrt/arch/x86/kvm/lapic.h
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/lapic.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/lapic.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -12,6 +12,7 @@
|
|
atomic_t pending;
|
|
s64 period; /* unit: ns */
|
|
u32 divide_count;
|
|
+ ktime_t last_update;
|
|
struct hrtimer dev;
|
|
} timer;
|
|
struct kvm_vcpu *vcpu;
|
|
@@ -41,6 +42,7 @@
|
|
void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu);
|
|
int kvm_lapic_enabled(struct kvm_vcpu *vcpu);
|
|
int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu);
|
|
+void kvm_apic_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
|
|
|
|
void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr);
|
|
void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/mmu.c linux-2.6.29-rc3.owrt/arch/x86/kvm/mmu.c
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/mmu.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/mmu.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1698,13 +1698,8 @@
|
|
if (largepage)
|
|
spte |= PT_PAGE_SIZE_MASK;
|
|
if (mt_mask) {
|
|
- if (!kvm_is_mmio_pfn(pfn)) {
|
|
- mt_mask = get_memory_type(vcpu, gfn) <<
|
|
- kvm_x86_ops->get_mt_mask_shift();
|
|
- mt_mask |= VMX_EPT_IGMT_BIT;
|
|
- } else
|
|
- mt_mask = MTRR_TYPE_UNCACHABLE <<
|
|
- kvm_x86_ops->get_mt_mask_shift();
|
|
+ mt_mask = get_memory_type(vcpu, gfn) <<
|
|
+ kvm_x86_ops->get_mt_mask_shift();
|
|
spte |= mt_mask;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/svm.c linux-2.6.29-rc3.owrt/arch/x86/kvm/svm.c
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/svm.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/svm.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1600,6 +1600,7 @@
|
|
/* Okay, we can deliver the interrupt: grab it and update PIC state. */
|
|
intr_vector = kvm_cpu_get_interrupt(vcpu);
|
|
svm_inject_irq(svm, intr_vector);
|
|
+ kvm_timer_intr_post(vcpu, intr_vector);
|
|
out:
|
|
update_cr8_intercept(vcpu);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/vmx.c linux-2.6.29-rc3.owrt/arch/x86/kvm/vmx.c
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/vmx.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/vmx.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -903,7 +903,6 @@
|
|
data = vmcs_readl(GUEST_SYSENTER_ESP);
|
|
break;
|
|
default:
|
|
- vmx_load_host_state(to_vmx(vcpu));
|
|
msr = find_msr_entry(to_vmx(vcpu), msr_index);
|
|
if (msr) {
|
|
data = msr->data;
|
|
@@ -3286,6 +3285,7 @@
|
|
}
|
|
if (vcpu->arch.interrupt.pending) {
|
|
vmx_inject_irq(vcpu, vcpu->arch.interrupt.nr);
|
|
+ kvm_timer_intr_post(vcpu, vcpu->arch.interrupt.nr);
|
|
if (kvm_cpu_has_interrupt(vcpu))
|
|
enable_irq_window(vcpu);
|
|
}
|
|
@@ -3687,7 +3687,8 @@
|
|
if (vm_need_ept()) {
|
|
bypass_guest_pf = 0;
|
|
kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK |
|
|
- VMX_EPT_WRITABLE_MASK);
|
|
+ VMX_EPT_WRITABLE_MASK |
|
|
+ VMX_EPT_IGMT_BIT);
|
|
kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
|
|
VMX_EPT_EXECUTABLE_MASK,
|
|
VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/kvm/x86.c linux-2.6.29-rc3.owrt/arch/x86/kvm/x86.c
|
|
--- linux-2.6.29.owrt/arch/x86/kvm/x86.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/kvm/x86.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -967,6 +967,7 @@
|
|
case KVM_CAP_MMU_SHADOW_CACHE_CONTROL:
|
|
case KVM_CAP_SET_TSS_ADDR:
|
|
case KVM_CAP_EXT_CPUID:
|
|
+ case KVM_CAP_CLOCKSOURCE:
|
|
case KVM_CAP_PIT:
|
|
case KVM_CAP_NOP_IO_DELAY:
|
|
case KVM_CAP_MP_STATE:
|
|
@@ -991,9 +992,6 @@
|
|
case KVM_CAP_IOMMU:
|
|
r = iommu_found();
|
|
break;
|
|
- case KVM_CAP_CLOCKSOURCE:
|
|
- r = boot_cpu_has(X86_FEATURE_CONSTANT_TSC);
|
|
- break;
|
|
default:
|
|
r = 0;
|
|
break;
|
|
@@ -4129,13 +4127,9 @@
|
|
|
|
}
|
|
|
|
-void kvm_arch_sync_events(struct kvm *kvm)
|
|
-{
|
|
- kvm_free_all_assigned_devices(kvm);
|
|
-}
|
|
-
|
|
void kvm_arch_destroy_vm(struct kvm *kvm)
|
|
{
|
|
+ kvm_free_all_assigned_devices(kvm);
|
|
kvm_iommu_unmap_guest(kvm);
|
|
kvm_free_pit(kvm);
|
|
kfree(kvm->arch.vpic);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/lguest/boot.c linux-2.6.29-rc3.owrt/arch/x86/lguest/boot.c
|
|
--- linux-2.6.29.owrt/arch/x86/lguest/boot.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/lguest/boot.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -343,11 +343,6 @@
|
|
* flush_tlb_user() for both user and kernel mappings unless
|
|
* the Page Global Enable (PGE) feature bit is set. */
|
|
*dx |= 0x00002000;
|
|
- /* We also lie, and say we're family id 5. 6 or greater
|
|
- * leads to a rdmsr in early_init_intel which we can't handle.
|
|
- * Family ID is returned as bits 8-12 in ax. */
|
|
- *ax &= 0xFFFFF0FF;
|
|
- *ax |= 0x00000500;
|
|
break;
|
|
case 0x80000000:
|
|
/* Futureproof this a little: if they ask how much extended
|
|
@@ -594,21 +589,19 @@
|
|
/* Some systems map "vectors" to interrupts weirdly. Lguest has
|
|
* a straightforward 1 to 1 mapping, so force that here. */
|
|
__get_cpu_var(vector_irq)[vector] = i;
|
|
- if (vector != SYSCALL_VECTOR)
|
|
- set_intr_gate(vector, interrupt[i]);
|
|
+ if (vector != SYSCALL_VECTOR) {
|
|
+ set_intr_gate(vector,
|
|
+ interrupt[vector-FIRST_EXTERNAL_VECTOR]);
|
|
+ set_irq_chip_and_handler_name(i, &lguest_irq_controller,
|
|
+ handle_level_irq,
|
|
+ "level");
|
|
+ }
|
|
}
|
|
/* This call is required to set up for 4k stacks, where we have
|
|
* separate stacks for hard and soft interrupts. */
|
|
irq_ctx_init(smp_processor_id());
|
|
}
|
|
|
|
-void lguest_setup_irq(unsigned int irq)
|
|
-{
|
|
- irq_to_desc_alloc_cpu(irq, 0);
|
|
- set_irq_chip_and_handler_name(irq, &lguest_irq_controller,
|
|
- handle_level_irq, "level");
|
|
-}
|
|
-
|
|
/*
|
|
* Time.
|
|
*
|
|
@@ -938,7 +931,7 @@
|
|
* that we can fit comfortably.
|
|
*
|
|
* First we need assembly templates of each of the patchable Guest operations,
|
|
- * and these are in i386_head.S. */
|
|
+ * and these are in lguest_asm.S. */
|
|
|
|
/*G:060 We construct a table from the assembler templates: */
|
|
static const struct lguest_insns
|
|
@@ -1100,7 +1093,7 @@
|
|
acpi_ht = 0;
|
|
#endif
|
|
|
|
- /* We set the preferred console to "hvc". This is the "hypervisor
|
|
+ /* We set the perferred console to "hvc". This is the "hypervisor
|
|
* virtual console" driver written by the PowerPC people, which we also
|
|
* adapted for lguest's use. */
|
|
add_preferred_console("hvc", 0, NULL);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mach-default/setup.c linux-2.6.29-rc3.owrt/arch/x86/mach-default/setup.c
|
|
--- linux-2.6.29.owrt/arch/x86/mach-default/setup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mach-default/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -38,15 +38,6 @@
|
|
init_ISA_irqs();
|
|
}
|
|
|
|
-/*
|
|
- * IRQ2 is cascade interrupt to second interrupt controller
|
|
- */
|
|
-static struct irqaction irq2 = {
|
|
- .handler = no_action,
|
|
- .mask = CPU_MASK_NONE,
|
|
- .name = "cascade",
|
|
-};
|
|
-
|
|
/**
|
|
* intr_init_hook - post gate setup interrupt initialisation
|
|
*
|
|
@@ -62,9 +53,6 @@
|
|
if (x86_quirks->arch_intr_init())
|
|
return;
|
|
}
|
|
- if (!acpi_ioapic)
|
|
- setup_irq(2, &irq2);
|
|
-
|
|
}
|
|
|
|
/**
|
|
@@ -96,7 +84,7 @@
|
|
|
|
static struct irqaction irq0 = {
|
|
.handler = timer_interrupt,
|
|
- .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
|
|
+ .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL,
|
|
.mask = CPU_MASK_NONE,
|
|
.name = "timer"
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mach-voyager/setup.c linux-2.6.29-rc3.owrt/arch/x86/mach-voyager/setup.c
|
|
--- linux-2.6.29.owrt/arch/x86/mach-voyager/setup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mach-voyager/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -33,30 +33,20 @@
|
|
setup_irq(2, &irq2);
|
|
}
|
|
|
|
-static void voyager_disable_tsc(void)
|
|
+void __init pre_setup_arch_hook(void)
|
|
{
|
|
/* Voyagers run their CPUs from independent clocks, so disable
|
|
* the TSC code because we can't sync them */
|
|
setup_clear_cpu_cap(X86_FEATURE_TSC);
|
|
}
|
|
|
|
-void __init pre_setup_arch_hook(void)
|
|
-{
|
|
- voyager_disable_tsc();
|
|
-}
|
|
-
|
|
-void __init pre_time_init_hook(void)
|
|
-{
|
|
- voyager_disable_tsc();
|
|
-}
|
|
-
|
|
void __init trap_init_hook(void)
|
|
{
|
|
}
|
|
|
|
static struct irqaction irq0 = {
|
|
.handler = timer_interrupt,
|
|
- .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
|
|
+ .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL,
|
|
.mask = CPU_MASK_NONE,
|
|
.name = "timer"
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mach-voyager/voyager_smp.c linux-2.6.29-rc3.owrt/arch/x86/mach-voyager/voyager_smp.c
|
|
--- linux-2.6.29.owrt/arch/x86/mach-voyager/voyager_smp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mach-voyager/voyager_smp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -65,7 +65,7 @@
|
|
|
|
/* Bitmask of CPUs present in the system - exported by i386_syms.c, used
|
|
* by scheduler but indexed physically */
|
|
-static cpumask_t voyager_phys_cpu_present_map = CPU_MASK_NONE;
|
|
+cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
|
|
|
|
/* The internal functions */
|
|
static void send_CPI(__u32 cpuset, __u8 cpi);
|
|
@@ -81,7 +81,7 @@
|
|
static void disable_local_vic_irq(unsigned int irq);
|
|
static void before_handle_vic_irq(unsigned int irq);
|
|
static void after_handle_vic_irq(unsigned int irq);
|
|
-static void set_vic_irq_affinity(unsigned int irq, const struct cpumask *mask);
|
|
+static void set_vic_irq_affinity(unsigned int irq, cpumask_t mask);
|
|
static void ack_vic_irq(unsigned int irq);
|
|
static void vic_enable_cpi(void);
|
|
static void do_boot_cpu(__u8 cpuid);
|
|
@@ -211,6 +211,8 @@
|
|
static cpumask_t smp_commenced_mask = CPU_MASK_NONE;
|
|
|
|
/* This is for the new dynamic CPU boot code */
|
|
+cpumask_t cpu_callin_map = CPU_MASK_NONE;
|
|
+cpumask_t cpu_callout_map = CPU_MASK_NONE;
|
|
|
|
/* The per processor IRQ masks (these are usually kept in sync) */
|
|
static __u16 vic_irq_mask[NR_CPUS] __cacheline_aligned;
|
|
@@ -366,19 +368,19 @@
|
|
/* set up everything for just this CPU, we can alter
|
|
* this as we start the other CPUs later */
|
|
/* now get the CPU disposition from the extended CMOS */
|
|
- cpus_addr(voyager_phys_cpu_present_map)[0] =
|
|
+ cpus_addr(phys_cpu_present_map)[0] =
|
|
voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK);
|
|
- cpus_addr(voyager_phys_cpu_present_map)[0] |=
|
|
+ cpus_addr(phys_cpu_present_map)[0] |=
|
|
voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 1) << 8;
|
|
- cpus_addr(voyager_phys_cpu_present_map)[0] |=
|
|
+ cpus_addr(phys_cpu_present_map)[0] |=
|
|
voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK +
|
|
2) << 16;
|
|
- cpus_addr(voyager_phys_cpu_present_map)[0] |=
|
|
+ cpus_addr(phys_cpu_present_map)[0] |=
|
|
voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK +
|
|
3) << 24;
|
|
- init_cpu_possible(&voyager_phys_cpu_present_map);
|
|
- printk("VOYAGER SMP: voyager_phys_cpu_present_map = 0x%lx\n",
|
|
- cpus_addr(voyager_phys_cpu_present_map)[0]);
|
|
+ cpu_possible_map = phys_cpu_present_map;
|
|
+ printk("VOYAGER SMP: phys_cpu_present_map = 0x%lx\n",
|
|
+ cpus_addr(phys_cpu_present_map)[0]);
|
|
/* Here we set up the VIC to enable SMP */
|
|
/* enable the CPIs by writing the base vector to their register */
|
|
outb(VIC_DEFAULT_CPI_BASE, VIC_CPI_BASE_REGISTER);
|
|
@@ -628,15 +630,15 @@
|
|
/* now that the cat has probed the Voyager System Bus, sanity
|
|
* check the cpu map */
|
|
if (((voyager_quad_processors | voyager_extended_vic_processors)
|
|
- & cpus_addr(voyager_phys_cpu_present_map)[0]) !=
|
|
- cpus_addr(voyager_phys_cpu_present_map)[0]) {
|
|
+ & cpus_addr(phys_cpu_present_map)[0]) !=
|
|
+ cpus_addr(phys_cpu_present_map)[0]) {
|
|
/* should panic */
|
|
printk("\n\n***WARNING*** "
|
|
"Sanity check of CPU present map FAILED\n");
|
|
}
|
|
} else if (voyager_level == 4)
|
|
voyager_extended_vic_processors =
|
|
- cpus_addr(voyager_phys_cpu_present_map)[0];
|
|
+ cpus_addr(phys_cpu_present_map)[0];
|
|
|
|
/* this sets up the idle task to run on the current cpu */
|
|
voyager_extended_cpus = 1;
|
|
@@ -670,7 +672,7 @@
|
|
/* loop over all the extended VIC CPUs and boot them. The
|
|
* Quad CPUs must be bootstrapped by their extended VIC cpu */
|
|
for (i = 0; i < nr_cpu_ids; i++) {
|
|
- if (i == boot_cpu_id || !cpu_isset(i, voyager_phys_cpu_present_map))
|
|
+ if (i == boot_cpu_id || !cpu_isset(i, phys_cpu_present_map))
|
|
continue;
|
|
do_boot_cpu(i);
|
|
/* This udelay seems to be needed for the Quad boots
|
|
@@ -1597,16 +1599,16 @@
|
|
* change the mask and then do an interrupt enable CPI to re-enable on
|
|
* the selected processors */
|
|
|
|
-void set_vic_irq_affinity(unsigned int irq, const struct cpumask *mask)
|
|
+void set_vic_irq_affinity(unsigned int irq, cpumask_t mask)
|
|
{
|
|
/* Only extended processors handle interrupts */
|
|
unsigned long real_mask;
|
|
unsigned long irq_mask = 1 << irq;
|
|
int cpu;
|
|
|
|
- real_mask = cpus_addr(*mask)[0] & voyager_extended_vic_processors;
|
|
+ real_mask = cpus_addr(mask)[0] & voyager_extended_vic_processors;
|
|
|
|
- if (cpus_addr(*mask)[0] == 0)
|
|
+ if (cpus_addr(mask)[0] == 0)
|
|
/* can't have no CPUs to accept the interrupt -- extremely
|
|
* bad things will happen */
|
|
return;
|
|
@@ -1748,11 +1750,10 @@
|
|
init_gdt(smp_processor_id());
|
|
switch_to_new_gdt();
|
|
|
|
- cpu_online_map = cpumask_of_cpu(smp_processor_id());
|
|
- cpu_callout_map = cpumask_of_cpu(smp_processor_id());
|
|
- cpu_callin_map = CPU_MASK_NONE;
|
|
- cpu_present_map = cpumask_of_cpu(smp_processor_id());
|
|
-
|
|
+ cpu_set(smp_processor_id(), cpu_online_map);
|
|
+ cpu_set(smp_processor_id(), cpu_callout_map);
|
|
+ cpu_set(smp_processor_id(), cpu_possible_map);
|
|
+ cpu_set(smp_processor_id(), cpu_present_map);
|
|
}
|
|
|
|
static int __cpuinit voyager_cpu_up(unsigned int cpu)
|
|
@@ -1782,9 +1783,9 @@
|
|
x86_write_percpu(cpu_number, hard_smp_processor_id());
|
|
}
|
|
|
|
-static void voyager_send_call_func(const struct cpumask *callmask)
|
|
+static void voyager_send_call_func(cpumask_t callmask)
|
|
{
|
|
- __u32 mask = cpus_addr(*callmask)[0] & ~(1 << smp_processor_id());
|
|
+ __u32 mask = cpus_addr(callmask)[0] & ~(1 << smp_processor_id());
|
|
send_CPI(mask, VIC_CALL_FUNCTION_CPI);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/math-emu/fpu_aux.c linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_aux.c
|
|
--- linux-2.6.29.owrt/arch/x86/math-emu/fpu_aux.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_aux.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,29 +30,20 @@
|
|
}
|
|
|
|
/* Needs to be externally visible */
|
|
-void finit_task(struct task_struct *tsk)
|
|
+void finit(void)
|
|
{
|
|
- struct i387_soft_struct *soft = &tsk->thread.xstate->soft;
|
|
- struct address *oaddr, *iaddr;
|
|
- soft->cwd = 0x037f;
|
|
- soft->swd = 0;
|
|
- soft->ftop = 0; /* We don't keep top in the status word internally. */
|
|
- soft->twd = 0xffff;
|
|
+ control_word = 0x037f;
|
|
+ partial_status = 0;
|
|
+ top = 0; /* We don't keep top in the status word internally. */
|
|
+ fpu_tag_word = 0xffff;
|
|
/* The behaviour is different from that detailed in
|
|
Section 15.1.6 of the Intel manual */
|
|
- oaddr = (struct address *)&soft->foo;
|
|
- oaddr->offset = 0;
|
|
- oaddr->selector = 0;
|
|
- iaddr = (struct address *)&soft->fip;
|
|
- iaddr->offset = 0;
|
|
- iaddr->selector = 0;
|
|
- iaddr->opcode = 0;
|
|
- soft->no_update = 1;
|
|
-}
|
|
-
|
|
-void finit(void)
|
|
-{
|
|
- finit_task(current);
|
|
+ operand_address.offset = 0;
|
|
+ operand_address.selector = 0;
|
|
+ instruction_address.offset = 0;
|
|
+ instruction_address.selector = 0;
|
|
+ instruction_address.opcode = 0;
|
|
+ no_ip_update = 1;
|
|
}
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/math-emu/fpu_entry.c linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_entry.c
|
|
--- linux-2.6.29.owrt/arch/x86/math-emu/fpu_entry.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_entry.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -131,7 +131,7 @@
|
|
static int valid_prefix(u_char *Byte, u_char __user ** fpu_eip,
|
|
overrides * override);
|
|
|
|
-void math_emulate(struct math_emu_info *info)
|
|
+asmlinkage void math_emulate(long arg)
|
|
{
|
|
u_char FPU_modrm, byte1;
|
|
unsigned short code;
|
|
@@ -161,7 +161,7 @@
|
|
RE_ENTRANT_CHECK_ON;
|
|
#endif /* RE_ENTRANT_CHECKING */
|
|
|
|
- FPU_info = info;
|
|
+ SETUP_DATA_AREA(arg);
|
|
|
|
FPU_ORIG_EIP = FPU_EIP;
|
|
|
|
@@ -659,7 +659,7 @@
|
|
}
|
|
}
|
|
|
|
-void math_abort(struct math_emu_info *info, unsigned int signal)
|
|
+void math_abort(struct info *info, unsigned int signal)
|
|
{
|
|
FPU_EIP = FPU_ORIG_EIP;
|
|
current->thread.trap_no = 16;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/math-emu/fpu_proto.h linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_proto.h
|
|
--- linux-2.6.29.owrt/arch/x86/math-emu/fpu_proto.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_proto.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -51,8 +51,8 @@
|
|
extern void fst_i_(void);
|
|
extern void fstp_i(void);
|
|
/* fpu_entry.c */
|
|
-extern void math_emulate(struct math_emu_info *info);
|
|
-extern void math_abort(struct math_emu_info *info, unsigned int signal);
|
|
+asmlinkage extern void math_emulate(long arg);
|
|
+extern void math_abort(struct info *info, unsigned int signal);
|
|
/* fpu_etc.c */
|
|
extern void FPU_etc(void);
|
|
/* fpu_tags.c */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/math-emu/fpu_system.h linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_system.h
|
|
--- linux-2.6.29.owrt/arch/x86/math-emu/fpu_system.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_system.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -16,6 +16,10 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/mm.h>
|
|
|
|
+/* This sets the pointer FPU_info to point to the argument part
|
|
+ of the stack frame of math_emulate() */
|
|
+#define SETUP_DATA_AREA(arg) FPU_info = (struct info *) &arg
|
|
+
|
|
/* s is always from a cpu register, and the cpu does bounds checking
|
|
* during register load --> no further bounds checks needed */
|
|
#define LDT_DESCRIPTOR(s) (((struct desc_struct *)current->mm->context.ldt)[(s) >> 3])
|
|
@@ -34,12 +38,12 @@
|
|
#define I387 (current->thread.xstate)
|
|
#define FPU_info (I387->soft.info)
|
|
|
|
-#define FPU_CS (*(unsigned short *) &(FPU_info->regs->cs))
|
|
-#define FPU_SS (*(unsigned short *) &(FPU_info->regs->ss))
|
|
-#define FPU_DS (*(unsigned short *) &(FPU_info->regs->ds))
|
|
-#define FPU_EAX (FPU_info->regs->ax)
|
|
-#define FPU_EFLAGS (FPU_info->regs->flags)
|
|
-#define FPU_EIP (FPU_info->regs->ip)
|
|
+#define FPU_CS (*(unsigned short *) &(FPU_info->___cs))
|
|
+#define FPU_SS (*(unsigned short *) &(FPU_info->___ss))
|
|
+#define FPU_DS (*(unsigned short *) &(FPU_info->___ds))
|
|
+#define FPU_EAX (FPU_info->___eax)
|
|
+#define FPU_EFLAGS (FPU_info->___eflags)
|
|
+#define FPU_EIP (FPU_info->___eip)
|
|
#define FPU_ORIG_EIP (FPU_info->___orig_eip)
|
|
|
|
#define FPU_lookahead (I387->soft.lookahead)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/math-emu/get_address.c linux-2.6.29-rc3.owrt/arch/x86/math-emu/get_address.c
|
|
--- linux-2.6.29.owrt/arch/x86/math-emu/get_address.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/get_address.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -29,43 +29,46 @@
|
|
#define FPU_WRITE_BIT 0x10
|
|
|
|
static int reg_offset[] = {
|
|
- offsetof(struct pt_regs, ax),
|
|
- offsetof(struct pt_regs, cx),
|
|
- offsetof(struct pt_regs, dx),
|
|
- offsetof(struct pt_regs, bx),
|
|
- offsetof(struct pt_regs, sp),
|
|
- offsetof(struct pt_regs, bp),
|
|
- offsetof(struct pt_regs, si),
|
|
- offsetof(struct pt_regs, di)
|
|
+ offsetof(struct info, ___eax),
|
|
+ offsetof(struct info, ___ecx),
|
|
+ offsetof(struct info, ___edx),
|
|
+ offsetof(struct info, ___ebx),
|
|
+ offsetof(struct info, ___esp),
|
|
+ offsetof(struct info, ___ebp),
|
|
+ offsetof(struct info, ___esi),
|
|
+ offsetof(struct info, ___edi)
|
|
};
|
|
|
|
-#define REG_(x) (*(long *)(reg_offset[(x)] + (u_char *)FPU_info->regs))
|
|
+#define REG_(x) (*(long *)(reg_offset[(x)]+(u_char *) FPU_info))
|
|
|
|
static int reg_offset_vm86[] = {
|
|
- offsetof(struct pt_regs, cs),
|
|
- offsetof(struct kernel_vm86_regs, ds),
|
|
- offsetof(struct kernel_vm86_regs, es),
|
|
- offsetof(struct kernel_vm86_regs, fs),
|
|
- offsetof(struct kernel_vm86_regs, gs),
|
|
- offsetof(struct pt_regs, ss),
|
|
- offsetof(struct kernel_vm86_regs, ds)
|
|
+ offsetof(struct info, ___cs),
|
|
+ offsetof(struct info, ___vm86_ds),
|
|
+ offsetof(struct info, ___vm86_es),
|
|
+ offsetof(struct info, ___vm86_fs),
|
|
+ offsetof(struct info, ___vm86_gs),
|
|
+ offsetof(struct info, ___ss),
|
|
+ offsetof(struct info, ___vm86_ds)
|
|
};
|
|
|
|
#define VM86_REG_(x) (*(unsigned short *) \
|
|
- (reg_offset_vm86[((unsigned)x)] + (u_char *)FPU_info->regs))
|
|
+ (reg_offset_vm86[((unsigned)x)]+(u_char *) FPU_info))
|
|
+
|
|
+/* This dummy, gs is not saved on the stack. */
|
|
+#define ___GS ___ds
|
|
|
|
static int reg_offset_pm[] = {
|
|
- offsetof(struct pt_regs, cs),
|
|
- offsetof(struct pt_regs, ds),
|
|
- offsetof(struct pt_regs, es),
|
|
- offsetof(struct pt_regs, fs),
|
|
- offsetof(struct pt_regs, ds), /* dummy, not saved on stack */
|
|
- offsetof(struct pt_regs, ss),
|
|
- offsetof(struct pt_regs, ds)
|
|
+ offsetof(struct info, ___cs),
|
|
+ offsetof(struct info, ___ds),
|
|
+ offsetof(struct info, ___es),
|
|
+ offsetof(struct info, ___fs),
|
|
+ offsetof(struct info, ___GS),
|
|
+ offsetof(struct info, ___ss),
|
|
+ offsetof(struct info, ___ds)
|
|
};
|
|
|
|
#define PM_REG_(x) (*(unsigned short *) \
|
|
- (reg_offset_pm[((unsigned)x)] + (u_char *)FPU_info->regs))
|
|
+ (reg_offset_pm[((unsigned)x)]+(u_char *) FPU_info))
|
|
|
|
/* Decode the SIB byte. This function assumes mod != 0 */
|
|
static int sib(int mod, unsigned long *fpu_eip)
|
|
@@ -346,34 +349,34 @@
|
|
}
|
|
switch (rm) {
|
|
case 0:
|
|
- address += FPU_info->regs->bx + FPU_info->regs->si;
|
|
+ address += FPU_info->___ebx + FPU_info->___esi;
|
|
break;
|
|
case 1:
|
|
- address += FPU_info->regs->bx + FPU_info->regs->di;
|
|
+ address += FPU_info->___ebx + FPU_info->___edi;
|
|
break;
|
|
case 2:
|
|
- address += FPU_info->regs->bp + FPU_info->regs->si;
|
|
+ address += FPU_info->___ebp + FPU_info->___esi;
|
|
if (addr_modes.override.segment == PREFIX_DEFAULT)
|
|
addr_modes.override.segment = PREFIX_SS_;
|
|
break;
|
|
case 3:
|
|
- address += FPU_info->regs->bp + FPU_info->regs->di;
|
|
+ address += FPU_info->___ebp + FPU_info->___edi;
|
|
if (addr_modes.override.segment == PREFIX_DEFAULT)
|
|
addr_modes.override.segment = PREFIX_SS_;
|
|
break;
|
|
case 4:
|
|
- address += FPU_info->regs->si;
|
|
+ address += FPU_info->___esi;
|
|
break;
|
|
case 5:
|
|
- address += FPU_info->regs->di;
|
|
+ address += FPU_info->___edi;
|
|
break;
|
|
case 6:
|
|
- address += FPU_info->regs->bp;
|
|
+ address += FPU_info->___ebp;
|
|
if (addr_modes.override.segment == PREFIX_DEFAULT)
|
|
addr_modes.override.segment = PREFIX_SS_;
|
|
break;
|
|
case 7:
|
|
- address += FPU_info->regs->bx;
|
|
+ address += FPU_info->___ebx;
|
|
break;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/fault.c linux-2.6.29-rc3.owrt/arch/x86/mm/fault.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/fault.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/fault.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -603,6 +603,8 @@
|
|
|
|
si_code = SEGV_MAPERR;
|
|
|
|
+ if (notify_page_fault(regs))
|
|
+ return;
|
|
if (unlikely(kmmio_fault(regs, address)))
|
|
return;
|
|
|
|
@@ -632,9 +634,6 @@
|
|
if (spurious_fault(address, error_code))
|
|
return;
|
|
|
|
- /* kprobes don't want to hook the spurious faults. */
|
|
- if (notify_page_fault(regs))
|
|
- return;
|
|
/*
|
|
* Don't take the mm semaphore here. If we fixup a prefetch
|
|
* fault we could otherwise deadlock.
|
|
@@ -642,9 +641,6 @@
|
|
goto bad_area_nosemaphore;
|
|
}
|
|
|
|
- /* kprobes don't want to hook the spurious faults. */
|
|
- if (notify_page_fault(regs))
|
|
- return;
|
|
|
|
/*
|
|
* It's safe to allow irq's after cr2 has been saved and the
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/init_64.c linux-2.6.29-rc3.owrt/arch/x86/mm/init_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/init_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/init_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -714,8 +714,6 @@
|
|
pos = start_pfn << PAGE_SHIFT;
|
|
end_pfn = ((pos + (PMD_SIZE - 1)) >> PMD_SHIFT)
|
|
<< (PMD_SHIFT - PAGE_SHIFT);
|
|
- if (end_pfn > (end >> PAGE_SHIFT))
|
|
- end_pfn = end >> PAGE_SHIFT;
|
|
if (start_pfn < end_pfn) {
|
|
nr_range = save_mr(mr, nr_range, start_pfn, end_pfn, 0);
|
|
pos = end_pfn << PAGE_SHIFT;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/iomap_32.c linux-2.6.29-rc3.owrt/arch/x86/mm/iomap_32.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/iomap_32.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/iomap_32.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -20,17 +20,6 @@
|
|
#include <asm/pat.h>
|
|
#include <linux/module.h>
|
|
|
|
-int is_io_mapping_possible(resource_size_t base, unsigned long size)
|
|
-{
|
|
-#ifndef CONFIG_X86_PAE
|
|
- /* There is no way to map greater than 1 << 32 address without PAE */
|
|
- if (base + size > 0x100000000ULL)
|
|
- return 0;
|
|
-#endif
|
|
- return 1;
|
|
-}
|
|
-EXPORT_SYMBOL_GPL(is_io_mapping_possible);
|
|
-
|
|
/* Map 'pfn' using fixed map 'type' and protections 'prot'
|
|
*/
|
|
void *
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/ioremap.c linux-2.6.29-rc3.owrt/arch/x86/mm/ioremap.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/ioremap.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/ioremap.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -134,6 +134,25 @@
|
|
return 0;
|
|
}
|
|
|
|
+int pagerange_is_ram(unsigned long start, unsigned long end)
|
|
+{
|
|
+ int ram_page = 0, not_rampage = 0;
|
|
+ unsigned long page_nr;
|
|
+
|
|
+ for (page_nr = (start >> PAGE_SHIFT); page_nr < (end >> PAGE_SHIFT);
|
|
+ ++page_nr) {
|
|
+ if (page_is_ram(page_nr))
|
|
+ ram_page = 1;
|
|
+ else
|
|
+ not_rampage = 1;
|
|
+
|
|
+ if (ram_page == not_rampage)
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ return ram_page;
|
|
+}
|
|
+
|
|
/*
|
|
* Fix up the linear direct mapping of the kernel to avoid cache attribute
|
|
* conflicts.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/kmmio.c linux-2.6.29-rc3.owrt/arch/x86/mm/kmmio.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/kmmio.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/kmmio.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -32,14 +32,11 @@
|
|
struct list_head list;
|
|
struct kmmio_fault_page *release_next;
|
|
unsigned long page; /* location of the fault page */
|
|
- bool old_presence; /* page presence prior to arming */
|
|
- bool armed;
|
|
|
|
/*
|
|
* Number of times this page has been registered as a part
|
|
* of a probe. If zero, page is disarmed and this may be freed.
|
|
- * Used only by writers (RCU) and post_kmmio_handler().
|
|
- * Protected by kmmio_lock, when linked into kmmio_page_table.
|
|
+ * Used only by writers (RCU).
|
|
*/
|
|
int count;
|
|
};
|
|
@@ -108,85 +105,57 @@
|
|
return NULL;
|
|
}
|
|
|
|
-static void set_pmd_presence(pmd_t *pmd, bool present, bool *old)
|
|
-{
|
|
- pmdval_t v = pmd_val(*pmd);
|
|
- *old = !!(v & _PAGE_PRESENT);
|
|
- v &= ~_PAGE_PRESENT;
|
|
- if (present)
|
|
- v |= _PAGE_PRESENT;
|
|
- set_pmd(pmd, __pmd(v));
|
|
-}
|
|
-
|
|
-static void set_pte_presence(pte_t *pte, bool present, bool *old)
|
|
-{
|
|
- pteval_t v = pte_val(*pte);
|
|
- *old = !!(v & _PAGE_PRESENT);
|
|
- v &= ~_PAGE_PRESENT;
|
|
- if (present)
|
|
- v |= _PAGE_PRESENT;
|
|
- set_pte_atomic(pte, __pte(v));
|
|
-}
|
|
-
|
|
-static int set_page_presence(unsigned long addr, bool present, bool *old)
|
|
+static void set_page_present(unsigned long addr, bool present,
|
|
+ unsigned int *pglevel)
|
|
{
|
|
+ pteval_t pteval;
|
|
+ pmdval_t pmdval;
|
|
unsigned int level;
|
|
+ pmd_t *pmd;
|
|
pte_t *pte = lookup_address(addr, &level);
|
|
|
|
if (!pte) {
|
|
pr_err("kmmio: no pte for page 0x%08lx\n", addr);
|
|
- return -1;
|
|
+ return;
|
|
}
|
|
|
|
+ if (pglevel)
|
|
+ *pglevel = level;
|
|
+
|
|
switch (level) {
|
|
case PG_LEVEL_2M:
|
|
- set_pmd_presence((pmd_t *)pte, present, old);
|
|
+ pmd = (pmd_t *)pte;
|
|
+ pmdval = pmd_val(*pmd) & ~_PAGE_PRESENT;
|
|
+ if (present)
|
|
+ pmdval |= _PAGE_PRESENT;
|
|
+ set_pmd(pmd, __pmd(pmdval));
|
|
break;
|
|
+
|
|
case PG_LEVEL_4K:
|
|
- set_pte_presence(pte, present, old);
|
|
+ pteval = pte_val(*pte) & ~_PAGE_PRESENT;
|
|
+ if (present)
|
|
+ pteval |= _PAGE_PRESENT;
|
|
+ set_pte_atomic(pte, __pte(pteval));
|
|
break;
|
|
+
|
|
default:
|
|
pr_err("kmmio: unexpected page level 0x%x.\n", level);
|
|
- return -1;
|
|
+ return;
|
|
}
|
|
|
|
__flush_tlb_one(addr);
|
|
- return 0;
|
|
}
|
|
|
|
-/*
|
|
- * Mark the given page as not present. Access to it will trigger a fault.
|
|
- *
|
|
- * Struct kmmio_fault_page is protected by RCU and kmmio_lock, but the
|
|
- * protection is ignored here. RCU read lock is assumed held, so the struct
|
|
- * will not disappear unexpectedly. Furthermore, the caller must guarantee,
|
|
- * that double arming the same virtual address (page) cannot occur.
|
|
- *
|
|
- * Double disarming on the other hand is allowed, and may occur when a fault
|
|
- * and mmiotrace shutdown happen simultaneously.
|
|
- */
|
|
-static int arm_kmmio_fault_page(struct kmmio_fault_page *f)
|
|
+/** Mark the given page as not present. Access to it will trigger a fault. */
|
|
+static void arm_kmmio_fault_page(unsigned long page, unsigned int *pglevel)
|
|
{
|
|
- int ret;
|
|
- WARN_ONCE(f->armed, KERN_ERR "kmmio page already armed.\n");
|
|
- if (f->armed) {
|
|
- pr_warning("kmmio double-arm: page 0x%08lx, ref %d, old %d\n",
|
|
- f->page, f->count, f->old_presence);
|
|
- }
|
|
- ret = set_page_presence(f->page, false, &f->old_presence);
|
|
- WARN_ONCE(ret < 0, KERN_ERR "kmmio arming 0x%08lx failed.\n", f->page);
|
|
- f->armed = true;
|
|
- return ret;
|
|
+ set_page_present(page & PAGE_MASK, false, pglevel);
|
|
}
|
|
|
|
-/** Restore the given page to saved presence state. */
|
|
-static void disarm_kmmio_fault_page(struct kmmio_fault_page *f)
|
|
+/** Mark the given page as present. */
|
|
+static void disarm_kmmio_fault_page(unsigned long page, unsigned int *pglevel)
|
|
{
|
|
- bool tmp;
|
|
- int ret = set_page_presence(f->page, f->old_presence, &tmp);
|
|
- WARN_ONCE(ret < 0,
|
|
- KERN_ERR "kmmio disarming 0x%08lx failed.\n", f->page);
|
|
- f->armed = false;
|
|
+ set_page_present(page & PAGE_MASK, true, pglevel);
|
|
}
|
|
|
|
/*
|
|
@@ -233,32 +202,28 @@
|
|
|
|
ctx = &get_cpu_var(kmmio_ctx);
|
|
if (ctx->active) {
|
|
+ disarm_kmmio_fault_page(faultpage->page, NULL);
|
|
if (addr == ctx->addr) {
|
|
/*
|
|
- * A second fault on the same page means some other
|
|
- * condition needs handling by do_page_fault(), the
|
|
- * page really not being present is the most common.
|
|
+ * On SMP we sometimes get recursive probe hits on the
|
|
+ * same address. Context is already saved, fall out.
|
|
*/
|
|
- pr_debug("kmmio: secondary hit for 0x%08lx CPU %d.\n",
|
|
- addr, smp_processor_id());
|
|
-
|
|
- if (!faultpage->old_presence)
|
|
- pr_info("kmmio: unexpected secondary hit for "
|
|
- "address 0x%08lx on CPU %d.\n", addr,
|
|
- smp_processor_id());
|
|
- } else {
|
|
- /*
|
|
- * Prevent overwriting already in-flight context.
|
|
- * This should not happen, let's hope disarming at
|
|
- * least prevents a panic.
|
|
- */
|
|
- pr_emerg("kmmio: recursive probe hit on CPU %d, "
|
|
+ pr_debug("kmmio: duplicate probe hit on CPU %d, for "
|
|
+ "address 0x%08lx.\n",
|
|
+ smp_processor_id(), addr);
|
|
+ ret = 1;
|
|
+ goto no_kmmio_ctx;
|
|
+ }
|
|
+ /*
|
|
+ * Prevent overwriting already in-flight context.
|
|
+ * This should not happen, let's hope disarming at least
|
|
+ * prevents a panic.
|
|
+ */
|
|
+ pr_emerg("kmmio: recursive probe hit on CPU %d, "
|
|
"for address 0x%08lx. Ignoring.\n",
|
|
smp_processor_id(), addr);
|
|
- pr_emerg("kmmio: previous hit was at 0x%08lx.\n",
|
|
- ctx->addr);
|
|
- disarm_kmmio_fault_page(faultpage);
|
|
- }
|
|
+ pr_emerg("kmmio: previous hit was at 0x%08lx.\n",
|
|
+ ctx->addr);
|
|
goto no_kmmio_ctx;
|
|
}
|
|
ctx->active++;
|
|
@@ -279,7 +244,7 @@
|
|
regs->flags &= ~X86_EFLAGS_IF;
|
|
|
|
/* Now we set present bit in PTE and single step. */
|
|
- disarm_kmmio_fault_page(ctx->fpage);
|
|
+ disarm_kmmio_fault_page(ctx->fpage->page, NULL);
|
|
|
|
/*
|
|
* If another cpu accesses the same page while we are stepping,
|
|
@@ -310,7 +275,7 @@
|
|
struct kmmio_context *ctx = &get_cpu_var(kmmio_ctx);
|
|
|
|
if (!ctx->active) {
|
|
- pr_warning("kmmio: spurious debug trap on CPU %d.\n",
|
|
+ pr_debug("kmmio: spurious debug trap on CPU %d.\n",
|
|
smp_processor_id());
|
|
goto out;
|
|
}
|
|
@@ -318,11 +283,7 @@
|
|
if (ctx->probe && ctx->probe->post_handler)
|
|
ctx->probe->post_handler(ctx->probe, condition, regs);
|
|
|
|
- /* Prevent racing against release_kmmio_fault_page(). */
|
|
- spin_lock(&kmmio_lock);
|
|
- if (ctx->fpage->count)
|
|
- arm_kmmio_fault_page(ctx->fpage);
|
|
- spin_unlock(&kmmio_lock);
|
|
+ arm_kmmio_fault_page(ctx->fpage->page, NULL);
|
|
|
|
regs->flags &= ~X86_EFLAGS_TF;
|
|
regs->flags |= ctx->saved_flags;
|
|
@@ -354,25 +315,21 @@
|
|
f = get_kmmio_fault_page(page);
|
|
if (f) {
|
|
if (!f->count)
|
|
- arm_kmmio_fault_page(f);
|
|
+ arm_kmmio_fault_page(f->page, NULL);
|
|
f->count++;
|
|
return 0;
|
|
}
|
|
|
|
- f = kzalloc(sizeof(*f), GFP_ATOMIC);
|
|
+ f = kmalloc(sizeof(*f), GFP_ATOMIC);
|
|
if (!f)
|
|
return -1;
|
|
|
|
f->count = 1;
|
|
f->page = page;
|
|
-
|
|
- if (arm_kmmio_fault_page(f)) {
|
|
- kfree(f);
|
|
- return -1;
|
|
- }
|
|
-
|
|
list_add_rcu(&f->list, kmmio_page_list(f->page));
|
|
|
|
+ arm_kmmio_fault_page(f->page, NULL);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -390,7 +347,7 @@
|
|
f->count--;
|
|
BUG_ON(f->count < 0);
|
|
if (!f->count) {
|
|
- disarm_kmmio_fault_page(f);
|
|
+ disarm_kmmio_fault_page(f->page, NULL);
|
|
f->release_next = *release_list;
|
|
*release_list = f;
|
|
}
|
|
@@ -451,24 +408,23 @@
|
|
|
|
static void remove_kmmio_fault_pages(struct rcu_head *head)
|
|
{
|
|
- struct kmmio_delayed_release *dr =
|
|
- container_of(head, struct kmmio_delayed_release, rcu);
|
|
+ struct kmmio_delayed_release *dr = container_of(
|
|
+ head,
|
|
+ struct kmmio_delayed_release,
|
|
+ rcu);
|
|
struct kmmio_fault_page *p = dr->release_list;
|
|
struct kmmio_fault_page **prevp = &dr->release_list;
|
|
unsigned long flags;
|
|
-
|
|
spin_lock_irqsave(&kmmio_lock, flags);
|
|
while (p) {
|
|
- if (!p->count) {
|
|
+ if (!p->count)
|
|
list_del_rcu(&p->list);
|
|
- prevp = &p->release_next;
|
|
- } else {
|
|
+ else
|
|
*prevp = p->release_next;
|
|
- }
|
|
+ prevp = &p->release_next;
|
|
p = p->release_next;
|
|
}
|
|
spin_unlock_irqrestore(&kmmio_lock, flags);
|
|
-
|
|
/* This is the real RCU destroy call. */
|
|
call_rcu(&dr->rcu, rcu_free_kmmio_fault_pages);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/numa_64.c linux-2.6.29-rc3.owrt/arch/x86/mm/numa_64.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/numa_64.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/numa_64.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -145,7 +145,7 @@
|
|
return shift;
|
|
}
|
|
|
|
-int __meminit __early_pfn_to_nid(unsigned long pfn)
|
|
+int early_pfn_to_nid(unsigned long pfn)
|
|
{
|
|
return phys_to_nid(pfn << PAGE_SHIFT);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/pageattr.c linux-2.6.29-rc3.owrt/arch/x86/mm/pageattr.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/pageattr.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/pageattr.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -508,24 +508,18 @@
|
|
#endif
|
|
|
|
/*
|
|
- * Install the new, split up pagetable.
|
|
+ * Install the new, split up pagetable. Important details here:
|
|
*
|
|
- * We use the standard kernel pagetable protections for the new
|
|
- * pagetable protections, the actual ptes set above control the
|
|
- * primary protection behavior:
|
|
- */
|
|
- __set_pmd_pte(kpte, address, mk_pte(base, __pgprot(_KERNPG_TABLE)));
|
|
-
|
|
- /*
|
|
- * Intel Atom errata AAH41 workaround.
|
|
+ * On Intel the NX bit of all levels must be cleared to make a
|
|
+ * page executable. See section 4.13.2 of Intel 64 and IA-32
|
|
+ * Architectures Software Developer's Manual).
|
|
*
|
|
- * The real fix should be in hw or in a microcode update, but
|
|
- * we also probabilistically try to reduce the window of having
|
|
- * a large TLB mixed with 4K TLBs while instruction fetches are
|
|
- * going on.
|
|
+ * Mark the entry present. The current mapping might be
|
|
+ * set to not present, which we preserved above.
|
|
*/
|
|
- __flush_tlb_all();
|
|
-
|
|
+ ref_prot = pte_pgprot(pte_mkexec(pte_clrhuge(*kpte)));
|
|
+ pgprot_val(ref_prot) |= _PAGE_PRESENT;
|
|
+ __set_pmd_pte(kpte, address, mk_pte(base, ref_prot));
|
|
base = NULL;
|
|
|
|
out_unlock:
|
|
@@ -581,6 +575,7 @@
|
|
address = cpa->vaddr[cpa->curpage];
|
|
else
|
|
address = *cpa->vaddr;
|
|
+
|
|
repeat:
|
|
kpte = lookup_address(address, &level);
|
|
if (!kpte)
|
|
@@ -817,13 +812,6 @@
|
|
|
|
vm_unmap_aliases();
|
|
|
|
- /*
|
|
- * If we're called with lazy mmu updates enabled, the
|
|
- * in-memory pte state may be stale. Flush pending updates to
|
|
- * bring them up to date.
|
|
- */
|
|
- arch_flush_lazy_mmu_mode();
|
|
-
|
|
cpa.vaddr = addr;
|
|
cpa.numpages = numpages;
|
|
cpa.mask_set = mask_set;
|
|
@@ -866,13 +854,6 @@
|
|
} else
|
|
cpa_flush_all(cache);
|
|
|
|
- /*
|
|
- * If we've been called with lazy mmu updates enabled, then
|
|
- * make sure that everything gets flushed out before we
|
|
- * return.
|
|
- */
|
|
- arch_flush_lazy_mmu_mode();
|
|
-
|
|
out:
|
|
return ret;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/pat.c linux-2.6.29-rc3.owrt/arch/x86/mm/pat.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/pat.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/pat.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -11,7 +11,6 @@
|
|
#include <linux/bootmem.h>
|
|
#include <linux/debugfs.h>
|
|
#include <linux/kernel.h>
|
|
-#include <linux/module.h>
|
|
#include <linux/gfp.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/fs.h>
|
|
@@ -212,33 +211,6 @@
|
|
static struct memtype *cached_entry;
|
|
static u64 cached_start;
|
|
|
|
-static int pat_pagerange_is_ram(unsigned long start, unsigned long end)
|
|
-{
|
|
- int ram_page = 0, not_rampage = 0;
|
|
- unsigned long page_nr;
|
|
-
|
|
- for (page_nr = (start >> PAGE_SHIFT); page_nr < (end >> PAGE_SHIFT);
|
|
- ++page_nr) {
|
|
- /*
|
|
- * For legacy reasons, physical address range in the legacy ISA
|
|
- * region is tracked as non-RAM. This will allow users of
|
|
- * /dev/mem to map portions of legacy ISA region, even when
|
|
- * some of those portions are listed(or not even listed) with
|
|
- * different e820 types(RAM/reserved/..)
|
|
- */
|
|
- if (page_nr >= (ISA_END_ADDRESS >> PAGE_SHIFT) &&
|
|
- page_is_ram(page_nr))
|
|
- ram_page = 1;
|
|
- else
|
|
- not_rampage = 1;
|
|
-
|
|
- if (ram_page == not_rampage)
|
|
- return -1;
|
|
- }
|
|
-
|
|
- return ram_page;
|
|
-}
|
|
-
|
|
/*
|
|
* For RAM pages, mark the pages as non WB memory type using
|
|
* PageNonWB (PG_arch_1). We allow only one set_memory_uc() or
|
|
@@ -364,12 +336,20 @@
|
|
if (new_type)
|
|
*new_type = actual_type;
|
|
|
|
- is_range_ram = pat_pagerange_is_ram(start, end);
|
|
- if (is_range_ram == 1)
|
|
- return reserve_ram_pages_type(start, end, req_type,
|
|
- new_type);
|
|
- else if (is_range_ram < 0)
|
|
- return -EINVAL;
|
|
+ /*
|
|
+ * For legacy reasons, some parts of the physical address range in the
|
|
+ * legacy 1MB region is treated as non-RAM (even when listed as RAM in
|
|
+ * the e820 tables). So we will track the memory attributes of this
|
|
+ * legacy 1MB region using the linear memtype_list always.
|
|
+ */
|
|
+ if (end >= ISA_END_ADDRESS) {
|
|
+ is_range_ram = pagerange_is_ram(start, end);
|
|
+ if (is_range_ram == 1)
|
|
+ return reserve_ram_pages_type(start, end, req_type,
|
|
+ new_type);
|
|
+ else if (is_range_ram < 0)
|
|
+ return -EINVAL;
|
|
+ }
|
|
|
|
new = kmalloc(sizeof(struct memtype), GFP_KERNEL);
|
|
if (!new)
|
|
@@ -466,11 +446,19 @@
|
|
if (is_ISA_range(start, end - 1))
|
|
return 0;
|
|
|
|
- is_range_ram = pat_pagerange_is_ram(start, end);
|
|
- if (is_range_ram == 1)
|
|
- return free_ram_pages_type(start, end);
|
|
- else if (is_range_ram < 0)
|
|
- return -EINVAL;
|
|
+ /*
|
|
+ * For legacy reasons, some parts of the physical address range in the
|
|
+ * legacy 1MB region is treated as non-RAM (even when listed as RAM in
|
|
+ * the e820 tables). So we will track the memory attributes of this
|
|
+ * legacy 1MB region using the linear memtype_list always.
|
|
+ */
|
|
+ if (end >= ISA_END_ADDRESS) {
|
|
+ is_range_ram = pagerange_is_ram(start, end);
|
|
+ if (is_range_ram == 1)
|
|
+ return free_ram_pages_type(start, end);
|
|
+ else if (is_range_ram < 0)
|
|
+ return -EINVAL;
|
|
+ }
|
|
|
|
spin_lock(&memtype_lock);
|
|
list_for_each_entry(entry, &memtype_list, nd) {
|
|
@@ -638,13 +626,17 @@
|
|
unsigned long flags;
|
|
unsigned long want_flags = (pgprot_val(*vma_prot) & _PAGE_CACHE_MASK);
|
|
|
|
- is_ram = pat_pagerange_is_ram(paddr, paddr + size);
|
|
+ is_ram = pagerange_is_ram(paddr, paddr + size);
|
|
|
|
- /*
|
|
- * reserve_pfn_range() doesn't support RAM pages.
|
|
- */
|
|
- if (is_ram != 0)
|
|
- return -EINVAL;
|
|
+ if (is_ram != 0) {
|
|
+ /*
|
|
+ * For mapping RAM pages, drivers need to call
|
|
+ * set_memory_[uc|wc|wb] directly, for reserve and free, before
|
|
+ * setting up the PTE.
|
|
+ */
|
|
+ WARN_ON_ONCE(1);
|
|
+ return 0;
|
|
+ }
|
|
|
|
ret = reserve_memtype(paddr, paddr + size, want_flags, &flags);
|
|
if (ret)
|
|
@@ -701,7 +693,7 @@
|
|
{
|
|
int is_ram;
|
|
|
|
- is_ram = pat_pagerange_is_ram(paddr, paddr + size);
|
|
+ is_ram = pagerange_is_ram(paddr, paddr + size);
|
|
if (is_ram == 0)
|
|
free_memtype(paddr, paddr + size);
|
|
}
|
|
@@ -869,7 +861,6 @@
|
|
else
|
|
return pgprot_noncached(prot);
|
|
}
|
|
-EXPORT_SYMBOL_GPL(pgprot_writecombine);
|
|
|
|
#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_X86_PAT)
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/mm/testmmiotrace.c linux-2.6.29-rc3.owrt/arch/x86/mm/testmmiotrace.c
|
|
--- linux-2.6.29.owrt/arch/x86/mm/testmmiotrace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/mm/testmmiotrace.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Written by Pekka Paalanen, 2008-2009 <pq@iki.fi>
|
|
+ * Written by Pekka Paalanen, 2008 <pq@iki.fi>
|
|
*/
|
|
#include <linux/module.h>
|
|
#include <linux/io.h>
|
|
@@ -9,74 +9,35 @@
|
|
|
|
static unsigned long mmio_address;
|
|
module_param(mmio_address, ulong, 0);
|
|
-MODULE_PARM_DESC(mmio_address, " Start address of the mapping of 16 kB "
|
|
- "(or 8 MB if read_far is non-zero).");
|
|
-
|
|
-static unsigned long read_far = 0x400100;
|
|
-module_param(read_far, ulong, 0);
|
|
-MODULE_PARM_DESC(read_far, " Offset of a 32-bit read within 8 MB "
|
|
- "(default: 0x400100).");
|
|
-
|
|
-static unsigned v16(unsigned i)
|
|
-{
|
|
- return i * 12 + 7;
|
|
-}
|
|
-
|
|
-static unsigned v32(unsigned i)
|
|
-{
|
|
- return i * 212371 + 13;
|
|
-}
|
|
+MODULE_PARM_DESC(mmio_address, "Start address of the mapping of 16 kB.");
|
|
|
|
static void do_write_test(void __iomem *p)
|
|
{
|
|
unsigned int i;
|
|
- pr_info(MODULE_NAME ": write test.\n");
|
|
mmiotrace_printk("Write test.\n");
|
|
-
|
|
for (i = 0; i < 256; i++)
|
|
iowrite8(i, p + i);
|
|
-
|
|
for (i = 1024; i < (5 * 1024); i += 2)
|
|
- iowrite16(v16(i), p + i);
|
|
-
|
|
+ iowrite16(i * 12 + 7, p + i);
|
|
for (i = (5 * 1024); i < (16 * 1024); i += 4)
|
|
- iowrite32(v32(i), p + i);
|
|
+ iowrite32(i * 212371 + 13, p + i);
|
|
}
|
|
|
|
static void do_read_test(void __iomem *p)
|
|
{
|
|
unsigned int i;
|
|
- unsigned errs[3] = { 0 };
|
|
- pr_info(MODULE_NAME ": read test.\n");
|
|
mmiotrace_printk("Read test.\n");
|
|
-
|
|
for (i = 0; i < 256; i++)
|
|
- if (ioread8(p + i) != i)
|
|
- ++errs[0];
|
|
-
|
|
+ ioread8(p + i);
|
|
for (i = 1024; i < (5 * 1024); i += 2)
|
|
- if (ioread16(p + i) != v16(i))
|
|
- ++errs[1];
|
|
-
|
|
+ ioread16(p + i);
|
|
for (i = (5 * 1024); i < (16 * 1024); i += 4)
|
|
- if (ioread32(p + i) != v32(i))
|
|
- ++errs[2];
|
|
-
|
|
- mmiotrace_printk("Read errors: 8-bit %d, 16-bit %d, 32-bit %d.\n",
|
|
- errs[0], errs[1], errs[2]);
|
|
+ ioread32(p + i);
|
|
}
|
|
|
|
-static void do_read_far_test(void __iomem *p)
|
|
+static void do_test(void)
|
|
{
|
|
- pr_info(MODULE_NAME ": read far test.\n");
|
|
- mmiotrace_printk("Read far test.\n");
|
|
-
|
|
- ioread32(p + read_far);
|
|
-}
|
|
-
|
|
-static void do_test(unsigned long size)
|
|
-{
|
|
- void __iomem *p = ioremap_nocache(mmio_address, size);
|
|
+ void __iomem *p = ioremap_nocache(mmio_address, 0x4000);
|
|
if (!p) {
|
|
pr_err(MODULE_NAME ": could not ioremap, aborting.\n");
|
|
return;
|
|
@@ -84,15 +45,11 @@
|
|
mmiotrace_printk("ioremap returned %p.\n", p);
|
|
do_write_test(p);
|
|
do_read_test(p);
|
|
- if (read_far && read_far < size - 4)
|
|
- do_read_far_test(p);
|
|
iounmap(p);
|
|
}
|
|
|
|
static int __init init(void)
|
|
{
|
|
- unsigned long size = (read_far) ? (8 << 20) : (16 << 10);
|
|
-
|
|
if (mmio_address == 0) {
|
|
pr_err(MODULE_NAME ": you have to use the module argument "
|
|
"mmio_address.\n");
|
|
@@ -101,11 +58,10 @@
|
|
return -ENXIO;
|
|
}
|
|
|
|
- pr_warning(MODULE_NAME ": WARNING: mapping %lu kB @ 0x%08lx in PCI "
|
|
- "address space, and writing 16 kB of rubbish in there.\n",
|
|
- size >> 10, mmio_address);
|
|
- do_test(size);
|
|
- pr_info(MODULE_NAME ": All done.\n");
|
|
+ pr_warning(MODULE_NAME ": WARNING: mapping 16 kB @ 0x%08lx "
|
|
+ "in PCI address space, and writing "
|
|
+ "rubbish in there.\n", mmio_address);
|
|
+ do_test();
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/oprofile/op_model_ppro.c linux-2.6.29-rc3.owrt/arch/x86/oprofile/op_model_ppro.c
|
|
--- linux-2.6.29.owrt/arch/x86/oprofile/op_model_ppro.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/oprofile/op_model_ppro.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -78,18 +78,8 @@
|
|
if (cpu_has_arch_perfmon) {
|
|
union cpuid10_eax eax;
|
|
eax.full = cpuid_eax(0xa);
|
|
-
|
|
- /*
|
|
- * For Core2 (family 6, model 15), don't reset the
|
|
- * counter width:
|
|
- */
|
|
- if (!(eax.split.version_id == 0 &&
|
|
- current_cpu_data.x86 == 6 &&
|
|
- current_cpu_data.x86_model == 15)) {
|
|
-
|
|
- if (counter_width < eax.split.bit_width)
|
|
- counter_width = eax.split.bit_width;
|
|
- }
|
|
+ if (counter_width < eax.split.bit_width)
|
|
+ counter_width = eax.split.bit_width;
|
|
}
|
|
|
|
/* clear all counters */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/pci/irq.c linux-2.6.29-rc3.owrt/arch/x86/pci/irq.c
|
|
--- linux-2.6.29.owrt/arch/x86/pci/irq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/pci/irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -572,7 +572,6 @@
|
|
case PCI_DEVICE_ID_INTEL_ICH7_1:
|
|
case PCI_DEVICE_ID_INTEL_ICH7_30:
|
|
case PCI_DEVICE_ID_INTEL_ICH7_31:
|
|
- case PCI_DEVICE_ID_INTEL_TGP_LPC:
|
|
case PCI_DEVICE_ID_INTEL_ESB2_0:
|
|
case PCI_DEVICE_ID_INTEL_ICH8_0:
|
|
case PCI_DEVICE_ID_INTEL_ICH8_1:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/xen/enlighten.c linux-2.6.29-rc3.owrt/arch/x86/xen/enlighten.c
|
|
--- linux-2.6.29.owrt/arch/x86/xen/enlighten.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/xen/enlighten.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1672,9 +1672,6 @@
|
|
possible map and a non-dummy shared_info. */
|
|
per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0];
|
|
|
|
- local_irq_disable();
|
|
- early_boot_irqs_off();
|
|
-
|
|
xen_raw_console_write("mapping kernel into physical memory\n");
|
|
pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/x86/xen/multicalls.h linux-2.6.29-rc3.owrt/arch/x86/xen/multicalls.h
|
|
--- linux-2.6.29.owrt/arch/x86/xen/multicalls.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/x86/xen/multicalls.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -19,10 +19,8 @@
|
|
paired with xen_mc_issue() */
|
|
static inline void xen_mc_batch(void)
|
|
{
|
|
- unsigned long flags;
|
|
/* need to disable interrupts until this entry is complete */
|
|
- local_irq_save(flags);
|
|
- __get_cpu_var(xen_mc_irq_flags) = flags;
|
|
+ local_irq_save(__get_cpu_var(xen_mc_irq_flags));
|
|
}
|
|
|
|
static inline struct multicall_space xen_mc_entry(size_t args)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/xtensa/Kconfig linux-2.6.29-rc3.owrt/arch/xtensa/Kconfig
|
|
--- linux-2.6.29.owrt/arch/xtensa/Kconfig 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/xtensa/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -103,6 +103,9 @@
|
|
help
|
|
Can we use information of configuration file?
|
|
|
|
+config HIGHMEM
|
|
+ bool "High memory support"
|
|
+
|
|
endmenu
|
|
|
|
menu "Platform options"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/xtensa/kernel/setup.c linux-2.6.29-rc3.owrt/arch/xtensa/kernel/setup.c
|
|
--- linux-2.6.29.owrt/arch/xtensa/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/xtensa/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -44,8 +44,6 @@
|
|
#include <asm/setup.h>
|
|
#include <asm/param.h>
|
|
|
|
-#include <platform/hardware.h>
|
|
-
|
|
#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
|
|
struct screen_info screen_info = { 0, 24, 0, 0, 0, 80, 0, 0, 0, 24, 1, 16};
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/xtensa/kernel/traps.c linux-2.6.29-rc3.owrt/arch/xtensa/kernel/traps.c
|
|
--- linux-2.6.29.owrt/arch/xtensa/kernel/traps.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/xtensa/kernel/traps.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,7 +30,6 @@
|
|
#include <linux/stringify.h>
|
|
#include <linux/kallsyms.h>
|
|
#include <linux/delay.h>
|
|
-#include <linux/hardirq.h>
|
|
|
|
#include <asm/ptrace.h>
|
|
#include <asm/timex.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/xtensa/mm/fault.c linux-2.6.29-rc3.owrt/arch/xtensa/mm/fault.c
|
|
--- linux-2.6.29.owrt/arch/xtensa/mm/fault.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/xtensa/mm/fault.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -14,7 +14,6 @@
|
|
|
|
#include <linux/mm.h>
|
|
#include <linux/module.h>
|
|
-#include <linux/hardirq.h>
|
|
#include <asm/mmu_context.h>
|
|
#include <asm/cacheflush.h>
|
|
#include <asm/hardirq.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/arch/xtensa/platforms/iss/console.c linux-2.6.29-rc3.owrt/arch/xtensa/platforms/iss/console.c
|
|
--- linux-2.6.29.owrt/arch/xtensa/platforms/iss/console.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/arch/xtensa/platforms/iss/console.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -140,14 +140,16 @@
|
|
}
|
|
|
|
|
|
-static int rs_put_char(struct tty_struct *tty, unsigned char ch)
|
|
+static void rs_put_char(struct tty_struct *tty, unsigned char ch)
|
|
{
|
|
char buf[2];
|
|
|
|
+ if (!tty)
|
|
+ return;
|
|
+
|
|
buf[0] = ch;
|
|
buf[1] = '\0'; /* Is this NULL necessary? */
|
|
__simc (SYS_write, 1, (unsigned long) buf, 1, 0, 0);
|
|
- return 1;
|
|
}
|
|
|
|
static void rs_flush_chars(struct tty_struct *tty)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/blk-barrier.c linux-2.6.29-rc3.owrt/block/blk-barrier.c
|
|
--- linux-2.6.29.owrt/block/blk-barrier.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/blk-barrier.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -302,7 +302,7 @@
|
|
* Description:
|
|
* Issue a flush for the block device in question. Caller can supply
|
|
* room for storing the error offset in case of a flush error, if they
|
|
- * wish to.
|
|
+ * wish to. Caller must run wait_for_completion() on its own.
|
|
*/
|
|
int blkdev_issue_flush(struct block_device *bdev, sector_t *error_sector)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/blk-core.c linux-2.6.29-rc3.owrt/block/blk-core.c
|
|
--- linux-2.6.29.owrt/block/blk-core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/blk-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -64,12 +64,11 @@
|
|
|
|
static void drive_stat_acct(struct request *rq, int new_io)
|
|
{
|
|
- struct gendisk *disk = rq->rq_disk;
|
|
struct hd_struct *part;
|
|
int rw = rq_data_dir(rq);
|
|
int cpu;
|
|
|
|
- if (!blk_fs_request(rq) || !disk || !blk_do_io_stat(disk->queue))
|
|
+ if (!blk_fs_request(rq) || !rq->rq_disk)
|
|
return;
|
|
|
|
cpu = part_stat_lock();
|
|
@@ -600,7 +599,8 @@
|
|
q->request_fn = rfn;
|
|
q->prep_rq_fn = NULL;
|
|
q->unplug_fn = generic_unplug_device;
|
|
- q->queue_flags = QUEUE_FLAG_DEFAULT;
|
|
+ q->queue_flags = (1 << QUEUE_FLAG_CLUSTER |
|
|
+ 1 << QUEUE_FLAG_STACKABLE);
|
|
q->queue_lock = lock;
|
|
|
|
blk_queue_segment_boundary(q, BLK_SEG_BOUNDARY_MASK);
|
|
@@ -1125,8 +1125,6 @@
|
|
|
|
if (bio_sync(bio))
|
|
req->cmd_flags |= REQ_RW_SYNC;
|
|
- if (bio_unplug(bio))
|
|
- req->cmd_flags |= REQ_UNPLUG;
|
|
if (bio_rw_meta(bio))
|
|
req->cmd_flags |= REQ_RW_META;
|
|
|
|
@@ -1143,7 +1141,6 @@
|
|
int el_ret, nr_sectors;
|
|
const unsigned short prio = bio_prio(bio);
|
|
const int sync = bio_sync(bio);
|
|
- const int unplug = bio_unplug(bio);
|
|
int rw_flags;
|
|
|
|
nr_sectors = bio_sectors(bio);
|
|
@@ -1247,7 +1244,7 @@
|
|
blk_plug_device(q);
|
|
add_request(q, req);
|
|
out:
|
|
- if (unplug || blk_queue_nonrot(q))
|
|
+ if (sync || blk_queue_nonrot(q))
|
|
__generic_unplug_device(q);
|
|
spin_unlock_irq(q->queue_lock);
|
|
return 0;
|
|
@@ -1451,11 +1448,6 @@
|
|
err = -EOPNOTSUPP;
|
|
goto end_io;
|
|
}
|
|
- if (bio_barrier(bio) && bio_has_data(bio) &&
|
|
- (q->next_ordered == QUEUE_ORDERED_NONE)) {
|
|
- err = -EOPNOTSUPP;
|
|
- goto end_io;
|
|
- }
|
|
|
|
ret = q->make_request_fn(q, bio);
|
|
} while (ret);
|
|
@@ -1663,55 +1655,6 @@
|
|
}
|
|
EXPORT_SYMBOL(blkdev_dequeue_request);
|
|
|
|
-static void blk_account_io_completion(struct request *req, unsigned int bytes)
|
|
-{
|
|
- struct gendisk *disk = req->rq_disk;
|
|
-
|
|
- if (!disk || !blk_do_io_stat(disk->queue))
|
|
- return;
|
|
-
|
|
- if (blk_fs_request(req)) {
|
|
- const int rw = rq_data_dir(req);
|
|
- struct hd_struct *part;
|
|
- int cpu;
|
|
-
|
|
- cpu = part_stat_lock();
|
|
- part = disk_map_sector_rcu(req->rq_disk, req->sector);
|
|
- part_stat_add(cpu, part, sectors[rw], bytes >> 9);
|
|
- part_stat_unlock();
|
|
- }
|
|
-}
|
|
-
|
|
-static void blk_account_io_done(struct request *req)
|
|
-{
|
|
- struct gendisk *disk = req->rq_disk;
|
|
-
|
|
- if (!disk || !blk_do_io_stat(disk->queue))
|
|
- return;
|
|
-
|
|
- /*
|
|
- * Account IO completion. bar_rq isn't accounted as a normal
|
|
- * IO on queueing nor completion. Accounting the containing
|
|
- * request is enough.
|
|
- */
|
|
- if (blk_fs_request(req) && req != &req->q->bar_rq) {
|
|
- unsigned long duration = jiffies - req->start_time;
|
|
- const int rw = rq_data_dir(req);
|
|
- struct hd_struct *part;
|
|
- int cpu;
|
|
-
|
|
- cpu = part_stat_lock();
|
|
- part = disk_map_sector_rcu(disk, req->sector);
|
|
-
|
|
- part_stat_inc(cpu, part, ios[rw]);
|
|
- part_stat_add(cpu, part, ticks[rw], duration);
|
|
- part_round_stats(cpu, part);
|
|
- part_dec_in_flight(part);
|
|
-
|
|
- part_stat_unlock();
|
|
- }
|
|
-}
|
|
-
|
|
/**
|
|
* __end_that_request_first - end I/O on a request
|
|
* @req: the request being processed
|
|
@@ -1747,7 +1690,16 @@
|
|
(unsigned long long)req->sector);
|
|
}
|
|
|
|
- blk_account_io_completion(req, nr_bytes);
|
|
+ if (blk_fs_request(req) && req->rq_disk) {
|
|
+ const int rw = rq_data_dir(req);
|
|
+ struct hd_struct *part;
|
|
+ int cpu;
|
|
+
|
|
+ cpu = part_stat_lock();
|
|
+ part = disk_map_sector_rcu(req->rq_disk, req->sector);
|
|
+ part_stat_add(cpu, part, sectors[rw], nr_bytes >> 9);
|
|
+ part_stat_unlock();
|
|
+ }
|
|
|
|
total_bytes = bio_nbytes = 0;
|
|
while ((bio = req->bio) != NULL) {
|
|
@@ -1827,6 +1779,8 @@
|
|
*/
|
|
static void end_that_request_last(struct request *req, int error)
|
|
{
|
|
+ struct gendisk *disk = req->rq_disk;
|
|
+
|
|
if (blk_rq_tagged(req))
|
|
blk_queue_end_tag(req->q, req);
|
|
|
|
@@ -1838,7 +1792,27 @@
|
|
|
|
blk_delete_timer(req);
|
|
|
|
- blk_account_io_done(req);
|
|
+ /*
|
|
+ * Account IO completion. bar_rq isn't accounted as a normal
|
|
+ * IO on queueing nor completion. Accounting the containing
|
|
+ * request is enough.
|
|
+ */
|
|
+ if (disk && blk_fs_request(req) && req != &req->q->bar_rq) {
|
|
+ unsigned long duration = jiffies - req->start_time;
|
|
+ const int rw = rq_data_dir(req);
|
|
+ struct hd_struct *part;
|
|
+ int cpu;
|
|
+
|
|
+ cpu = part_stat_lock();
|
|
+ part = disk_map_sector_rcu(disk, req->sector);
|
|
+
|
|
+ part_stat_inc(cpu, part, ios[rw]);
|
|
+ part_stat_add(cpu, part, ticks[rw], duration);
|
|
+ part_round_stats(cpu, part);
|
|
+ part_dec_in_flight(part);
|
|
+
|
|
+ part_stat_unlock();
|
|
+ }
|
|
|
|
if (req->end_io)
|
|
req->end_io(req, error);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/blk.h linux-2.6.29-rc3.owrt/block/blk.h
|
|
--- linux-2.6.29.owrt/block/blk.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/blk.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -108,12 +108,4 @@
|
|
#endif
|
|
}
|
|
|
|
-static inline int blk_do_io_stat(struct request_queue *q)
|
|
-{
|
|
- if (q)
|
|
- return blk_queue_io_stat(q);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/blk-integrity.c linux-2.6.29-rc3.owrt/block/blk-integrity.c
|
|
--- linux-2.6.29.owrt/block/blk-integrity.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/blk-integrity.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -309,24 +309,24 @@
|
|
/**
|
|
* blk_integrity_register - Register a gendisk as being integrity-capable
|
|
* @disk: struct gendisk pointer to make integrity-aware
|
|
- * @template: optional integrity profile to register
|
|
+ * @template: integrity profile
|
|
*
|
|
* Description: When a device needs to advertise itself as being able
|
|
* to send/receive integrity metadata it must use this function to
|
|
* register the capability with the block layer. The template is a
|
|
* blk_integrity struct with values appropriate for the underlying
|
|
- * hardware. If template is NULL the new profile is allocated but
|
|
- * not filled out. See Documentation/block/data-integrity.txt.
|
|
+ * hardware. See Documentation/block/data-integrity.txt.
|
|
*/
|
|
int blk_integrity_register(struct gendisk *disk, struct blk_integrity *template)
|
|
{
|
|
struct blk_integrity *bi;
|
|
|
|
BUG_ON(disk == NULL);
|
|
+ BUG_ON(template == NULL);
|
|
|
|
if (disk->integrity == NULL) {
|
|
bi = kmem_cache_alloc(integrity_cachep,
|
|
- GFP_KERNEL | __GFP_ZERO);
|
|
+ GFP_KERNEL | __GFP_ZERO);
|
|
if (!bi)
|
|
return -1;
|
|
|
|
@@ -346,16 +346,13 @@
|
|
bi = disk->integrity;
|
|
|
|
/* Use the provided profile as template */
|
|
- if (template != NULL) {
|
|
- bi->name = template->name;
|
|
- bi->generate_fn = template->generate_fn;
|
|
- bi->verify_fn = template->verify_fn;
|
|
- bi->tuple_size = template->tuple_size;
|
|
- bi->set_tag_fn = template->set_tag_fn;
|
|
- bi->get_tag_fn = template->get_tag_fn;
|
|
- bi->tag_size = template->tag_size;
|
|
- } else
|
|
- bi->name = "unsupported";
|
|
+ bi->name = template->name;
|
|
+ bi->generate_fn = template->generate_fn;
|
|
+ bi->verify_fn = template->verify_fn;
|
|
+ bi->tuple_size = template->tuple_size;
|
|
+ bi->set_tag_fn = template->set_tag_fn;
|
|
+ bi->get_tag_fn = template->get_tag_fn;
|
|
+ bi->tag_size = template->tag_size;
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/blk-merge.c linux-2.6.29-rc3.owrt/block/blk-merge.c
|
|
--- linux-2.6.29.owrt/block/blk-merge.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/blk-merge.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -38,77 +38,72 @@
|
|
}
|
|
}
|
|
|
|
-static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
|
|
- struct bio *bio)
|
|
+void blk_recalc_rq_segments(struct request *rq)
|
|
{
|
|
+ int nr_phys_segs;
|
|
unsigned int phys_size;
|
|
struct bio_vec *bv, *bvprv = NULL;
|
|
- int cluster, i, high, highprv = 1;
|
|
- unsigned int seg_size, nr_phys_segs;
|
|
- struct bio *fbio, *bbio;
|
|
+ int seg_size;
|
|
+ int cluster;
|
|
+ struct req_iterator iter;
|
|
+ int high, highprv = 1;
|
|
+ struct request_queue *q = rq->q;
|
|
|
|
- if (!bio)
|
|
- return 0;
|
|
+ if (!rq->bio)
|
|
+ return;
|
|
|
|
- fbio = bio;
|
|
cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
|
|
seg_size = 0;
|
|
phys_size = nr_phys_segs = 0;
|
|
- for_each_bio(bio) {
|
|
- bio_for_each_segment(bv, bio, i) {
|
|
- /*
|
|
- * the trick here is making sure that a high page is
|
|
- * never considered part of another segment, since that
|
|
- * might change with the bounce page.
|
|
- */
|
|
- high = page_to_pfn(bv->bv_page) > q->bounce_pfn;
|
|
- if (high || highprv)
|
|
+ rq_for_each_segment(bv, rq, iter) {
|
|
+ /*
|
|
+ * the trick here is making sure that a high page is never
|
|
+ * considered part of another segment, since that might
|
|
+ * change with the bounce page.
|
|
+ */
|
|
+ high = page_to_pfn(bv->bv_page) > q->bounce_pfn;
|
|
+ if (high || highprv)
|
|
+ goto new_segment;
|
|
+ if (cluster) {
|
|
+ if (seg_size + bv->bv_len > q->max_segment_size)
|
|
+ goto new_segment;
|
|
+ if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv))
|
|
+ goto new_segment;
|
|
+ if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv))
|
|
goto new_segment;
|
|
- if (cluster) {
|
|
- if (seg_size + bv->bv_len > q->max_segment_size)
|
|
- goto new_segment;
|
|
- if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv))
|
|
- goto new_segment;
|
|
- if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv))
|
|
- goto new_segment;
|
|
-
|
|
- seg_size += bv->bv_len;
|
|
- bvprv = bv;
|
|
- continue;
|
|
- }
|
|
-new_segment:
|
|
- if (nr_phys_segs == 1 && seg_size >
|
|
- fbio->bi_seg_front_size)
|
|
- fbio->bi_seg_front_size = seg_size;
|
|
|
|
- nr_phys_segs++;
|
|
+ seg_size += bv->bv_len;
|
|
bvprv = bv;
|
|
- seg_size = bv->bv_len;
|
|
- highprv = high;
|
|
+ continue;
|
|
}
|
|
- bbio = bio;
|
|
+new_segment:
|
|
+ if (nr_phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size)
|
|
+ rq->bio->bi_seg_front_size = seg_size;
|
|
+
|
|
+ nr_phys_segs++;
|
|
+ bvprv = bv;
|
|
+ seg_size = bv->bv_len;
|
|
+ highprv = high;
|
|
}
|
|
|
|
- if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size)
|
|
- fbio->bi_seg_front_size = seg_size;
|
|
- if (seg_size > bbio->bi_seg_back_size)
|
|
- bbio->bi_seg_back_size = seg_size;
|
|
+ if (nr_phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size)
|
|
+ rq->bio->bi_seg_front_size = seg_size;
|
|
+ if (seg_size > rq->biotail->bi_seg_back_size)
|
|
+ rq->biotail->bi_seg_back_size = seg_size;
|
|
|
|
- return nr_phys_segs;
|
|
-}
|
|
-
|
|
-void blk_recalc_rq_segments(struct request *rq)
|
|
-{
|
|
- rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio);
|
|
+ rq->nr_phys_segments = nr_phys_segs;
|
|
}
|
|
|
|
void blk_recount_segments(struct request_queue *q, struct bio *bio)
|
|
{
|
|
+ struct request rq;
|
|
struct bio *nxt = bio->bi_next;
|
|
-
|
|
+ rq.q = q;
|
|
+ rq.bio = rq.biotail = bio;
|
|
bio->bi_next = NULL;
|
|
- bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio);
|
|
+ blk_recalc_rq_segments(&rq);
|
|
bio->bi_next = nxt;
|
|
+ bio->bi_phys_segments = rq.nr_phys_segments;
|
|
bio->bi_flags |= (1 << BIO_SEG_VALID);
|
|
}
|
|
EXPORT_SYMBOL(blk_recount_segments);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/blk-sysfs.c linux-2.6.29-rc3.owrt/block/blk-sysfs.c
|
|
--- linux-2.6.29.owrt/block/blk-sysfs.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/blk-sysfs.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -130,27 +130,6 @@
|
|
return queue_var_show(max_hw_sectors_kb, (page));
|
|
}
|
|
|
|
-static ssize_t queue_nonrot_show(struct request_queue *q, char *page)
|
|
-{
|
|
- return queue_var_show(!blk_queue_nonrot(q), page);
|
|
-}
|
|
-
|
|
-static ssize_t queue_nonrot_store(struct request_queue *q, const char *page,
|
|
- size_t count)
|
|
-{
|
|
- unsigned long nm;
|
|
- ssize_t ret = queue_var_store(&nm, page, count);
|
|
-
|
|
- spin_lock_irq(q->queue_lock);
|
|
- if (nm)
|
|
- queue_flag_clear(QUEUE_FLAG_NONROT, q);
|
|
- else
|
|
- queue_flag_set(QUEUE_FLAG_NONROT, q);
|
|
- spin_unlock_irq(q->queue_lock);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
static ssize_t queue_nomerges_show(struct request_queue *q, char *page)
|
|
{
|
|
return queue_var_show(blk_queue_nomerges(q), page);
|
|
@@ -167,8 +146,8 @@
|
|
queue_flag_set(QUEUE_FLAG_NOMERGES, q);
|
|
else
|
|
queue_flag_clear(QUEUE_FLAG_NOMERGES, q);
|
|
- spin_unlock_irq(q->queue_lock);
|
|
|
|
+ spin_unlock_irq(q->queue_lock);
|
|
return ret;
|
|
}
|
|
|
|
@@ -197,27 +176,6 @@
|
|
return ret;
|
|
}
|
|
|
|
-static ssize_t queue_iostats_show(struct request_queue *q, char *page)
|
|
-{
|
|
- return queue_var_show(blk_queue_io_stat(q), page);
|
|
-}
|
|
-
|
|
-static ssize_t queue_iostats_store(struct request_queue *q, const char *page,
|
|
- size_t count)
|
|
-{
|
|
- unsigned long stats;
|
|
- ssize_t ret = queue_var_store(&stats, page, count);
|
|
-
|
|
- spin_lock_irq(q->queue_lock);
|
|
- if (stats)
|
|
- queue_flag_set(QUEUE_FLAG_IO_STAT, q);
|
|
- else
|
|
- queue_flag_clear(QUEUE_FLAG_IO_STAT, q);
|
|
- spin_unlock_irq(q->queue_lock);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
static struct queue_sysfs_entry queue_requests_entry = {
|
|
.attr = {.name = "nr_requests", .mode = S_IRUGO | S_IWUSR },
|
|
.show = queue_requests_show,
|
|
@@ -252,12 +210,6 @@
|
|
.show = queue_hw_sector_size_show,
|
|
};
|
|
|
|
-static struct queue_sysfs_entry queue_nonrot_entry = {
|
|
- .attr = {.name = "rotational", .mode = S_IRUGO | S_IWUSR },
|
|
- .show = queue_nonrot_show,
|
|
- .store = queue_nonrot_store,
|
|
-};
|
|
-
|
|
static struct queue_sysfs_entry queue_nomerges_entry = {
|
|
.attr = {.name = "nomerges", .mode = S_IRUGO | S_IWUSR },
|
|
.show = queue_nomerges_show,
|
|
@@ -270,12 +222,6 @@
|
|
.store = queue_rq_affinity_store,
|
|
};
|
|
|
|
-static struct queue_sysfs_entry queue_iostats_entry = {
|
|
- .attr = {.name = "iostats", .mode = S_IRUGO | S_IWUSR },
|
|
- .show = queue_iostats_show,
|
|
- .store = queue_iostats_store,
|
|
-};
|
|
-
|
|
static struct attribute *default_attrs[] = {
|
|
&queue_requests_entry.attr,
|
|
&queue_ra_entry.attr,
|
|
@@ -283,10 +229,8 @@
|
|
&queue_max_sectors_entry.attr,
|
|
&queue_iosched_entry.attr,
|
|
&queue_hw_sector_size_entry.attr,
|
|
- &queue_nonrot_entry.attr,
|
|
&queue_nomerges_entry.attr,
|
|
&queue_rq_affinity_entry.attr,
|
|
- &queue_iostats_entry.attr,
|
|
NULL,
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/blk-timeout.c linux-2.6.29-rc3.owrt/block/blk-timeout.c
|
|
--- linux-2.6.29.owrt/block/blk-timeout.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/blk-timeout.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -209,19 +209,12 @@
|
|
{
|
|
unsigned long flags;
|
|
struct request *rq, *tmp;
|
|
- LIST_HEAD(list);
|
|
|
|
spin_lock_irqsave(q->queue_lock, flags);
|
|
|
|
elv_abort_queue(q);
|
|
|
|
- /*
|
|
- * Splice entries to local list, to avoid deadlocking if entries
|
|
- * get readded to the timeout list by error handling
|
|
- */
|
|
- list_splice_init(&q->timeout_list, &list);
|
|
-
|
|
- list_for_each_entry_safe(rq, tmp, &list, timeout_list)
|
|
+ list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list)
|
|
blk_abort_request(rq);
|
|
|
|
spin_unlock_irqrestore(q->queue_lock, flags);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/blktrace.c linux-2.6.29-rc3.owrt/block/blktrace.c
|
|
--- linux-2.6.29.owrt/block/blktrace.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/blktrace.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -142,7 +142,7 @@
|
|
|
|
what |= ddir_act[rw & WRITE];
|
|
what |= MASK_TC_BIT(rw, BARRIER);
|
|
- what |= MASK_TC_BIT(rw, SYNCIO);
|
|
+ what |= MASK_TC_BIT(rw, SYNC);
|
|
what |= MASK_TC_BIT(rw, AHEAD);
|
|
what |= MASK_TC_BIT(rw, META);
|
|
what |= MASK_TC_BIT(rw, DISCARD);
|
|
@@ -187,12 +187,59 @@
|
|
|
|
static struct dentry *blk_tree_root;
|
|
static DEFINE_MUTEX(blk_tree_mutex);
|
|
+static unsigned int root_users;
|
|
+
|
|
+static inline void blk_remove_root(void)
|
|
+{
|
|
+ if (blk_tree_root) {
|
|
+ debugfs_remove(blk_tree_root);
|
|
+ blk_tree_root = NULL;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void blk_remove_tree(struct dentry *dir)
|
|
+{
|
|
+ mutex_lock(&blk_tree_mutex);
|
|
+ debugfs_remove(dir);
|
|
+ if (--root_users == 0)
|
|
+ blk_remove_root();
|
|
+ mutex_unlock(&blk_tree_mutex);
|
|
+}
|
|
+
|
|
+static struct dentry *blk_create_tree(const char *blk_name)
|
|
+{
|
|
+ struct dentry *dir = NULL;
|
|
+ int created = 0;
|
|
+
|
|
+ mutex_lock(&blk_tree_mutex);
|
|
+
|
|
+ if (!blk_tree_root) {
|
|
+ blk_tree_root = debugfs_create_dir("block", NULL);
|
|
+ if (!blk_tree_root)
|
|
+ goto err;
|
|
+ created = 1;
|
|
+ }
|
|
+
|
|
+ dir = debugfs_create_dir(blk_name, blk_tree_root);
|
|
+ if (dir)
|
|
+ root_users++;
|
|
+ else {
|
|
+ /* Delete root only if we created it */
|
|
+ if (created)
|
|
+ blk_remove_root();
|
|
+ }
|
|
+
|
|
+err:
|
|
+ mutex_unlock(&blk_tree_mutex);
|
|
+ return dir;
|
|
+}
|
|
|
|
static void blk_trace_cleanup(struct blk_trace *bt)
|
|
{
|
|
+ relay_close(bt->rchan);
|
|
debugfs_remove(bt->msg_file);
|
|
debugfs_remove(bt->dropped_file);
|
|
- relay_close(bt->rchan);
|
|
+ blk_remove_tree(bt->dir);
|
|
free_percpu(bt->sequence);
|
|
free_percpu(bt->msg_data);
|
|
kfree(bt);
|
|
@@ -299,18 +346,7 @@
|
|
|
|
static int blk_remove_buf_file_callback(struct dentry *dentry)
|
|
{
|
|
- struct dentry *parent = dentry->d_parent;
|
|
debugfs_remove(dentry);
|
|
-
|
|
- /*
|
|
- * this will fail for all but the last file, but that is ok. what we
|
|
- * care about is the top level buts->name directory going away, when
|
|
- * the last trace file is gone. Then we don't have to rmdir() that
|
|
- * manually on trace stop, so it nicely solves the issue with
|
|
- * force killing of running traces.
|
|
- */
|
|
-
|
|
- debugfs_remove(parent);
|
|
return 0;
|
|
}
|
|
|
|
@@ -368,15 +404,7 @@
|
|
goto err;
|
|
|
|
ret = -ENOENT;
|
|
-
|
|
- if (!blk_tree_root) {
|
|
- blk_tree_root = debugfs_create_dir("block", NULL);
|
|
- if (!blk_tree_root)
|
|
- return -ENOMEM;
|
|
- }
|
|
-
|
|
- dir = debugfs_create_dir(buts->name, blk_tree_root);
|
|
-
|
|
+ dir = blk_create_tree(buts->name);
|
|
if (!dir)
|
|
goto err;
|
|
|
|
@@ -430,6 +458,8 @@
|
|
atomic_dec(&blk_probes_ref);
|
|
mutex_unlock(&blk_probe_mutex);
|
|
err:
|
|
+ if (dir)
|
|
+ blk_remove_tree(dir);
|
|
if (bt) {
|
|
if (bt->msg_file)
|
|
debugfs_remove(bt->msg_file);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/bsg.c linux-2.6.29-rc3.owrt/block/bsg.c
|
|
--- linux-2.6.29.owrt/block/bsg.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/bsg.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -244,8 +244,7 @@
|
|
* map sg_io_v4 to a request.
|
|
*/
|
|
static struct request *
|
|
-bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm,
|
|
- u8 *sense)
|
|
+bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm)
|
|
{
|
|
struct request_queue *q = bd->queue;
|
|
struct request *rq, *next_rq = NULL;
|
|
@@ -307,10 +306,6 @@
|
|
if (ret)
|
|
goto out;
|
|
}
|
|
-
|
|
- rq->sense = sense;
|
|
- rq->sense_len = 0;
|
|
-
|
|
return rq;
|
|
out:
|
|
if (rq->cmd != rq->__cmd)
|
|
@@ -353,6 +348,9 @@
|
|
static void bsg_add_command(struct bsg_device *bd, struct request_queue *q,
|
|
struct bsg_command *bc, struct request *rq)
|
|
{
|
|
+ rq->sense = bc->sense;
|
|
+ rq->sense_len = 0;
|
|
+
|
|
/*
|
|
* add bc command to busy queue and submit rq for io
|
|
*/
|
|
@@ -421,7 +419,7 @@
|
|
{
|
|
int ret = 0;
|
|
|
|
- dprintk("rq %p bio %p 0x%x\n", rq, bio, rq->errors);
|
|
+ dprintk("rq %p bio %p %u\n", rq, bio, rq->errors);
|
|
/*
|
|
* fill in all the output members
|
|
*/
|
|
@@ -637,7 +635,7 @@
|
|
/*
|
|
* get a request, fill in the blanks, and add to request queue
|
|
*/
|
|
- rq = bsg_map_hdr(bd, &bc->hdr, has_write_perm, bc->sense);
|
|
+ rq = bsg_map_hdr(bd, &bc->hdr, has_write_perm);
|
|
if (IS_ERR(rq)) {
|
|
ret = PTR_ERR(rq);
|
|
rq = NULL;
|
|
@@ -924,12 +922,11 @@
|
|
struct request *rq;
|
|
struct bio *bio, *bidi_bio = NULL;
|
|
struct sg_io_v4 hdr;
|
|
- u8 sense[SCSI_SENSE_BUFFERSIZE];
|
|
|
|
if (copy_from_user(&hdr, uarg, sizeof(hdr)))
|
|
return -EFAULT;
|
|
|
|
- rq = bsg_map_hdr(bd, &hdr, file->f_mode & FMODE_WRITE, sense);
|
|
+ rq = bsg_map_hdr(bd, &hdr, file->f_mode & FMODE_WRITE);
|
|
if (IS_ERR(rq))
|
|
return PTR_ERR(rq);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/cfq-iosched.c linux-2.6.29-rc3.owrt/block/cfq-iosched.c
|
|
--- linux-2.6.29.owrt/block/cfq-iosched.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/cfq-iosched.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -84,11 +84,6 @@
|
|
*/
|
|
struct cfq_rb_root service_tree;
|
|
unsigned int busy_queues;
|
|
- /*
|
|
- * Used to track any pending rt requests so we can pre-empt current
|
|
- * non-RT cfqq in service when this value is non-zero.
|
|
- */
|
|
- unsigned int busy_rt_queues;
|
|
|
|
int rq_in_driver;
|
|
int sync_flight;
|
|
@@ -567,8 +562,6 @@
|
|
BUG_ON(cfq_cfqq_on_rr(cfqq));
|
|
cfq_mark_cfqq_on_rr(cfqq);
|
|
cfqd->busy_queues++;
|
|
- if (cfq_class_rt(cfqq))
|
|
- cfqd->busy_rt_queues++;
|
|
|
|
cfq_resort_rr_list(cfqd, cfqq);
|
|
}
|
|
@@ -588,8 +581,6 @@
|
|
|
|
BUG_ON(!cfqd->busy_queues);
|
|
cfqd->busy_queues--;
|
|
- if (cfq_class_rt(cfqq))
|
|
- cfqd->busy_rt_queues--;
|
|
}
|
|
|
|
/*
|
|
@@ -1014,20 +1005,6 @@
|
|
goto expire;
|
|
|
|
/*
|
|
- * If we have a RT cfqq waiting, then we pre-empt the current non-rt
|
|
- * cfqq.
|
|
- */
|
|
- if (!cfq_class_rt(cfqq) && cfqd->busy_rt_queues) {
|
|
- /*
|
|
- * We simulate this as cfqq timed out so that it gets to bank
|
|
- * the remaining of its time slice.
|
|
- */
|
|
- cfq_log_cfqq(cfqd, cfqq, "preempt");
|
|
- cfq_slice_expired(cfqd, 1);
|
|
- goto new_queue;
|
|
- }
|
|
-
|
|
- /*
|
|
* The active queue has requests and isn't expired, allow it to
|
|
* dispatch.
|
|
*/
|
|
@@ -1090,13 +1067,6 @@
|
|
if (RB_EMPTY_ROOT(&cfqq->sort_list))
|
|
break;
|
|
|
|
- /*
|
|
- * If there is a non-empty RT cfqq waiting for current
|
|
- * cfqq's timeslice to complete, pre-empt this cfqq
|
|
- */
|
|
- if (!cfq_class_rt(cfqq) && cfqd->busy_rt_queues)
|
|
- break;
|
|
-
|
|
} while (dispatched < max_dispatch);
|
|
|
|
/*
|
|
@@ -1831,12 +1801,6 @@
|
|
if (rq_is_meta(rq) && !cfqq->meta_pending)
|
|
return 1;
|
|
|
|
- /*
|
|
- * Allow an RT request to pre-empt an ongoing non-RT cfqq timeslice.
|
|
- */
|
|
- if (cfq_class_rt(new_cfqq) && !cfq_class_rt(cfqq))
|
|
- return 1;
|
|
-
|
|
if (!cfqd->active_cic || !cfq_cfqq_wait_request(cfqq))
|
|
return 0;
|
|
|
|
@@ -1906,8 +1870,7 @@
|
|
/*
|
|
* not the active queue - expire current slice if it is
|
|
* idle and has expired it's mean thinktime or this new queue
|
|
- * has some old slice time left and is of higher priority or
|
|
- * this new queue is RT and the current one is BE
|
|
+ * has some old slice time left and is of higher priority
|
|
*/
|
|
cfq_preempt_queue(cfqd, cfqq);
|
|
cfq_mark_cfqq_must_dispatch(cfqq);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/block/genhd.c linux-2.6.29-rc3.owrt/block/genhd.c
|
|
--- linux-2.6.29.owrt/block/genhd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/block/genhd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -256,22 +256,6 @@
|
|
}
|
|
#endif /* CONFIG_PROC_FS */
|
|
|
|
-/**
|
|
- * register_blkdev - register a new block device
|
|
- *
|
|
- * @major: the requested major device number [1..255]. If @major=0, try to
|
|
- * allocate any unused major number.
|
|
- * @name: the name of the new block device as a zero terminated string
|
|
- *
|
|
- * The @name must be unique within the system.
|
|
- *
|
|
- * The return value depends on the @major input parameter.
|
|
- * - if a major device number was requested in range [1..255] then the
|
|
- * function returns zero on success, or a negative error code
|
|
- * - if any unused major number was requested with @major=0 parameter
|
|
- * then the return value is the allocated major number in range
|
|
- * [1..255] or a negative error code otherwise
|
|
- */
|
|
int register_blkdev(unsigned int major, const char *name)
|
|
{
|
|
struct blk_major_name **n, *p;
|
|
@@ -1103,14 +1087,6 @@
|
|
if (strcmp(dev_name(dev), name))
|
|
continue;
|
|
|
|
- if (partno < disk->minors) {
|
|
- /* We need to return the right devno, even
|
|
- * if the partition doesn't exist yet.
|
|
- */
|
|
- devt = MKDEV(MAJOR(dev->devt),
|
|
- MINOR(dev->devt) + partno);
|
|
- break;
|
|
- }
|
|
part = disk_get_part(disk, partno);
|
|
if (part) {
|
|
devt = part_devt(part);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/CREDITS linux-2.6.29-rc3.owrt/CREDITS
|
|
--- linux-2.6.29.owrt/CREDITS 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/CREDITS 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2166,6 +2166,7 @@
|
|
|
|
N: Pavel Machek
|
|
E: pavel@ucw.cz
|
|
+E: pavel@suse.cz
|
|
D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
|
|
D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
|
|
D: work on suspend-to-ram/disk, killing duplicates from ioctl32
|
|
@@ -3738,7 +3739,7 @@
|
|
S: Germany
|
|
|
|
N: Gertjan van Wingerde
|
|
-E: gwingerde@gmail.com
|
|
+E: gwingerde@home.nl
|
|
D: Ralink rt2x00 WLAN driver
|
|
D: Minix V2 file-system
|
|
D: Misc fixes
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/crypto/ahash.c linux-2.6.29-rc3.owrt/crypto/ahash.c
|
|
--- linux-2.6.29.owrt/crypto/ahash.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/crypto/ahash.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -214,7 +214,7 @@
|
|
seq_printf(m, "async : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ?
|
|
"yes" : "no");
|
|
seq_printf(m, "blocksize : %u\n", alg->cra_blocksize);
|
|
- seq_printf(m, "digestsize : %u\n", alg->cra_ahash.digestsize);
|
|
+ seq_printf(m, "digestsize : %u\n", alg->cra_hash.digestsize);
|
|
}
|
|
|
|
const struct crypto_type crypto_ahash_type = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/crypto/algapi.c linux-2.6.29-rc3.owrt/crypto/algapi.c
|
|
--- linux-2.6.29.owrt/crypto/algapi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/crypto/algapi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -149,9 +149,6 @@
|
|
if (q == alg)
|
|
goto err;
|
|
|
|
- if (crypto_is_moribund(q))
|
|
- continue;
|
|
-
|
|
if (crypto_is_larval(q)) {
|
|
if (!strcmp(alg->cra_driver_name, q->cra_driver_name))
|
|
goto err;
|
|
@@ -200,7 +197,7 @@
|
|
|
|
down_write(&crypto_alg_sem);
|
|
list_for_each_entry(q, &crypto_alg_list, cra_list) {
|
|
- if (crypto_is_moribund(q) || !crypto_is_larval(q))
|
|
+ if (!crypto_is_larval(q))
|
|
continue;
|
|
|
|
test = (struct crypto_larval *)q;
|
|
@@ -213,7 +210,6 @@
|
|
goto unlock;
|
|
|
|
found:
|
|
- q->cra_flags |= CRYPTO_ALG_DEAD;
|
|
alg = test->adult;
|
|
if (err || list_empty(&alg->cra_list))
|
|
goto complete;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/crypto/api.c linux-2.6.29-rc3.owrt/crypto/api.c
|
|
--- linux-2.6.29.owrt/crypto/api.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/crypto/api.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -215,19 +215,8 @@
|
|
mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD);
|
|
type &= mask;
|
|
|
|
- alg = crypto_alg_lookup(name, type, mask);
|
|
- if (!alg) {
|
|
- char tmp[CRYPTO_MAX_ALG_NAME];
|
|
-
|
|
- request_module(name);
|
|
-
|
|
- if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask) &&
|
|
- snprintf(tmp, sizeof(tmp), "%s-all", name) < sizeof(tmp))
|
|
- request_module(tmp);
|
|
-
|
|
- alg = crypto_alg_lookup(name, type, mask);
|
|
- }
|
|
-
|
|
+ alg = try_then_request_module(crypto_alg_lookup(name, type, mask),
|
|
+ name);
|
|
if (alg)
|
|
return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg;
|
|
|
|
@@ -568,34 +557,34 @@
|
|
return ERR_PTR(err);
|
|
}
|
|
EXPORT_SYMBOL_GPL(crypto_alloc_tfm);
|
|
-
|
|
+
|
|
/*
|
|
- * crypto_destroy_tfm - Free crypto transform
|
|
- * @mem: Start of tfm slab
|
|
+ * crypto_free_tfm - Free crypto transform
|
|
* @tfm: Transform to free
|
|
*
|
|
- * This function frees up the transform and any associated resources,
|
|
+ * crypto_free_tfm() frees up the transform and any associated resources,
|
|
* then drops the refcount on the associated algorithm.
|
|
*/
|
|
-void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm)
|
|
+void crypto_free_tfm(struct crypto_tfm *tfm)
|
|
{
|
|
struct crypto_alg *alg;
|
|
int size;
|
|
|
|
- if (unlikely(!mem))
|
|
+ if (unlikely(!tfm))
|
|
return;
|
|
|
|
alg = tfm->__crt_alg;
|
|
- size = ksize(mem);
|
|
+ size = sizeof(*tfm) + alg->cra_ctxsize;
|
|
|
|
if (!tfm->exit && alg->cra_exit)
|
|
alg->cra_exit(tfm);
|
|
crypto_exit_ops(tfm);
|
|
crypto_mod_put(alg);
|
|
- memset(mem, 0, size);
|
|
- kfree(mem);
|
|
+ memset(tfm, 0, size);
|
|
+ kfree(tfm);
|
|
}
|
|
-EXPORT_SYMBOL_GPL(crypto_destroy_tfm);
|
|
+
|
|
+EXPORT_SYMBOL_GPL(crypto_free_tfm);
|
|
|
|
int crypto_has_alg(const char *name, u32 type, u32 mask)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/crypto/lrw.c linux-2.6.29-rc3.owrt/crypto/lrw.c
|
|
--- linux-2.6.29.owrt/crypto/lrw.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/crypto/lrw.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -45,13 +45,7 @@
|
|
|
|
static inline void setbit128_bbe(void *b, int bit)
|
|
{
|
|
- __set_bit(bit ^ (0x80 -
|
|
-#ifdef __BIG_ENDIAN
|
|
- BITS_PER_LONG
|
|
-#else
|
|
- BITS_PER_BYTE
|
|
-#endif
|
|
- ), b);
|
|
+ __set_bit(bit ^ 0x78, b);
|
|
}
|
|
|
|
static int setkey(struct crypto_tfm *parent, const u8 *key,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/crypto/scatterwalk.c linux-2.6.29-rc3.owrt/crypto/scatterwalk.c
|
|
--- linux-2.6.29.owrt/crypto/scatterwalk.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/crypto/scatterwalk.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -54,8 +54,7 @@
|
|
struct page *page;
|
|
|
|
page = sg_page(walk->sg) + ((walk->offset - 1) >> PAGE_SHIFT);
|
|
- if (!PageSlab(page))
|
|
- flush_dcache_page(page);
|
|
+ flush_dcache_page(page);
|
|
}
|
|
|
|
if (more) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/crypto/shash.c linux-2.6.29-rc3.owrt/crypto/shash.c
|
|
--- linux-2.6.29.owrt/crypto/shash.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/crypto/shash.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -388,15 +388,10 @@
|
|
struct shash_desc *desc = crypto_tfm_ctx(tfm);
|
|
struct crypto_shash *shash;
|
|
|
|
- if (!crypto_mod_get(calg))
|
|
- return -EAGAIN;
|
|
-
|
|
shash = __crypto_shash_cast(crypto_create_tfm(
|
|
calg, &crypto_shash_type));
|
|
- if (IS_ERR(shash)) {
|
|
- crypto_mod_put(calg);
|
|
+ if (IS_ERR(shash))
|
|
return PTR_ERR(shash);
|
|
- }
|
|
|
|
desc->tfm = shash;
|
|
tfm->exit = crypto_exit_shash_ops_compat;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/acpica/tbutils.c linux-2.6.29-rc3.owrt/drivers/acpi/acpica/tbutils.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/acpica/tbutils.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/acpica/tbutils.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -538,9 +538,10 @@
|
|
if (ACPI_FAILURE(status)) {
|
|
ACPI_WARNING((AE_INFO,
|
|
"Truncating %u table entries!",
|
|
- (unsigned) (table_count -
|
|
- (acpi_gbl_root_table_list.
|
|
- count - 2))));
|
|
+ (unsigned)
|
|
+ (acpi_gbl_root_table_list.size -
|
|
+ acpi_gbl_root_table_list.
|
|
+ count)));
|
|
break;
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/acpica/uteval.c linux-2.6.29-rc3.owrt/drivers/acpi/acpica/uteval.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/acpica/uteval.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/acpica/uteval.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -116,9 +116,9 @@
|
|
return_ACPI_STATUS(AE_NO_MEMORY);
|
|
}
|
|
|
|
- /* Default return value is 0, NOT-SUPPORTED */
|
|
+ /* Default return value is SUPPORTED */
|
|
|
|
- return_desc->integer.value = 0;
|
|
+ return_desc->integer.value = ACPI_UINT32_MAX;
|
|
walk_state->return_desc = return_desc;
|
|
|
|
/* Compare input string to static table of supported interfaces */
|
|
@@ -127,8 +127,10 @@
|
|
if (!ACPI_STRCMP
|
|
(string_desc->string.pointer,
|
|
acpi_interfaces_supported[i])) {
|
|
- return_desc->integer.value = ACPI_UINT32_MAX;
|
|
- goto done;
|
|
+
|
|
+ /* The interface is supported */
|
|
+
|
|
+ return_ACPI_STATUS(AE_OK);
|
|
}
|
|
}
|
|
|
|
@@ -139,14 +141,15 @@
|
|
*/
|
|
status = acpi_os_validate_interface(string_desc->string.pointer);
|
|
if (ACPI_SUCCESS(status)) {
|
|
- return_desc->integer.value = ACPI_UINT32_MAX;
|
|
+
|
|
+ /* The interface is supported */
|
|
+
|
|
+ return_ACPI_STATUS(AE_OK);
|
|
}
|
|
|
|
-done:
|
|
- ACPI_DEBUG_PRINT_RAW((ACPI_DB_INFO, "ACPI: BIOS _OSI(%s) %ssupported\n",
|
|
- string_desc->string.pointer,
|
|
- return_desc->integer.value == 0 ? "not-" : ""));
|
|
+ /* The interface is not supported */
|
|
|
|
+ return_desc->integer.value = 0;
|
|
return_ACPI_STATUS(AE_OK);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/battery.c linux-2.6.29-rc3.owrt/drivers/acpi/battery.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/battery.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/battery.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -138,29 +138,6 @@
|
|
|
|
static int acpi_battery_get_state(struct acpi_battery *battery);
|
|
|
|
-static int acpi_battery_is_charged(struct acpi_battery *battery)
|
|
-{
|
|
- /* either charging or discharging */
|
|
- if (battery->state != 0)
|
|
- return 0;
|
|
-
|
|
- /* battery not reporting charge */
|
|
- if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN ||
|
|
- battery->capacity_now == 0)
|
|
- return 0;
|
|
-
|
|
- /* good batteries update full_charge as the batteries degrade */
|
|
- if (battery->full_charge_capacity == battery->capacity_now)
|
|
- return 1;
|
|
-
|
|
- /* fallback to using design values for broken batteries */
|
|
- if (battery->design_capacity == battery->capacity_now)
|
|
- return 1;
|
|
-
|
|
- /* we don't do any sort of metric based on percentages */
|
|
- return 0;
|
|
-}
|
|
-
|
|
static int acpi_battery_get_property(struct power_supply *psy,
|
|
enum power_supply_property psp,
|
|
union power_supply_propval *val)
|
|
@@ -178,7 +155,7 @@
|
|
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
|
|
else if (battery->state & 0x02)
|
|
val->intval = POWER_SUPPLY_STATUS_CHARGING;
|
|
- else if (acpi_battery_is_charged(battery))
|
|
+ else if (battery->state == 0)
|
|
val->intval = POWER_SUPPLY_STATUS_FULL;
|
|
else
|
|
val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/bus.c linux-2.6.29-rc3.owrt/drivers/acpi/bus.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/bus.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/bus.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -758,7 +758,8 @@
|
|
acpi_status status = AE_OK;
|
|
extern acpi_status acpi_os_initialize1(void);
|
|
|
|
- acpi_os_initialize1();
|
|
+
|
|
+ status = acpi_os_initialize1();
|
|
|
|
status =
|
|
acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE);
|
|
@@ -768,6 +769,12 @@
|
|
goto error1;
|
|
}
|
|
|
|
+ if (ACPI_FAILURE(status)) {
|
|
+ printk(KERN_ERR PREFIX
|
|
+ "Unable to initialize ACPI OS objects\n");
|
|
+ goto error1;
|
|
+ }
|
|
+
|
|
/*
|
|
* ACPI 2.0 requires the EC driver to be loaded and work before
|
|
* the EC device is found in the namespace (i.e. before acpi_initialize_objects()
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/container.c linux-2.6.29-rc3.owrt/drivers/acpi/container.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/container.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/container.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -163,7 +163,7 @@
|
|
case ACPI_NOTIFY_BUS_CHECK:
|
|
/* Fall through */
|
|
case ACPI_NOTIFY_DEVICE_CHECK:
|
|
- printk(KERN_WARNING "Container driver received %s event\n",
|
|
+ printk("Container driver received %s event\n",
|
|
(type == ACPI_NOTIFY_BUS_CHECK) ?
|
|
"ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK");
|
|
status = acpi_bus_get_device(handle, &device);
|
|
@@ -174,8 +174,7 @@
|
|
kobject_uevent(&device->dev.kobj,
|
|
KOBJ_ONLINE);
|
|
else
|
|
- printk(KERN_WARNING
|
|
- "Failed to add container\n");
|
|
+ printk("Failed to add container\n");
|
|
}
|
|
} else {
|
|
if (ACPI_SUCCESS(status)) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/dock.c linux-2.6.29-rc3.owrt/drivers/acpi/dock.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/dock.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/dock.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -855,14 +855,10 @@
|
|
static ssize_t show_docked(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
- struct acpi_device *tmp;
|
|
-
|
|
struct dock_station *dock_station = *((struct dock_station **)
|
|
dev->platform_data);
|
|
+ return snprintf(buf, PAGE_SIZE, "%d\n", dock_present(dock_station));
|
|
|
|
- if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp)))
|
|
- return snprintf(buf, PAGE_SIZE, "1\n");
|
|
- return snprintf(buf, PAGE_SIZE, "0\n");
|
|
}
|
|
static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);
|
|
|
|
@@ -988,7 +984,7 @@
|
|
|
|
ret = device_create_file(&dock_device->dev, &dev_attr_docked);
|
|
if (ret) {
|
|
- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
|
|
+ printk("Error %d adding sysfs file\n", ret);
|
|
platform_device_unregister(dock_device);
|
|
kfree(dock_station);
|
|
dock_station = NULL;
|
|
@@ -996,7 +992,7 @@
|
|
}
|
|
ret = device_create_file(&dock_device->dev, &dev_attr_undock);
|
|
if (ret) {
|
|
- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
|
|
+ printk("Error %d adding sysfs file\n", ret);
|
|
device_remove_file(&dock_device->dev, &dev_attr_docked);
|
|
platform_device_unregister(dock_device);
|
|
kfree(dock_station);
|
|
@@ -1005,7 +1001,7 @@
|
|
}
|
|
ret = device_create_file(&dock_device->dev, &dev_attr_uid);
|
|
if (ret) {
|
|
- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
|
|
+ printk("Error %d adding sysfs file\n", ret);
|
|
device_remove_file(&dock_device->dev, &dev_attr_docked);
|
|
device_remove_file(&dock_device->dev, &dev_attr_undock);
|
|
platform_device_unregister(dock_device);
|
|
@@ -1015,7 +1011,7 @@
|
|
}
|
|
ret = device_create_file(&dock_device->dev, &dev_attr_flags);
|
|
if (ret) {
|
|
- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
|
|
+ printk("Error %d adding sysfs file\n", ret);
|
|
device_remove_file(&dock_device->dev, &dev_attr_docked);
|
|
device_remove_file(&dock_device->dev, &dev_attr_undock);
|
|
device_remove_file(&dock_device->dev, &dev_attr_uid);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/ec.c linux-2.6.29-rc3.owrt/drivers/acpi/ec.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/ec.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/ec.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -120,8 +120,6 @@
|
|
spinlock_t curr_lock;
|
|
} *boot_ec, *first_ec;
|
|
|
|
-static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */
|
|
-
|
|
/* --------------------------------------------------------------------------
|
|
Transaction Management
|
|
-------------------------------------------------------------------------- */
|
|
@@ -261,8 +259,6 @@
|
|
clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
|
|
acpi_disable_gpe(NULL, ec->gpe);
|
|
}
|
|
- if (EC_FLAGS_MSI)
|
|
- udelay(ACPI_EC_DELAY);
|
|
/* start transaction */
|
|
spin_lock_irqsave(&ec->curr_lock, tmp);
|
|
/* following two actions should be kept atomic */
|
|
@@ -971,11 +967,6 @@
|
|
/*
|
|
* Generate a boot ec context
|
|
*/
|
|
- if (dmi_name_in_vendors("Micro-Star") ||
|
|
- dmi_name_in_vendors("Notebook")) {
|
|
- pr_info(PREFIX "Enabling special treatment for EC from MSI.\n");
|
|
- EC_FLAGS_MSI = 1;
|
|
- }
|
|
status = acpi_get_table(ACPI_SIG_ECDT, 1,
|
|
(struct acpi_table_header **)&ecdt_ptr);
|
|
if (ACPI_SUCCESS(status)) {
|
|
@@ -991,7 +982,7 @@
|
|
saved_ec = kmalloc(sizeof(struct acpi_ec), GFP_KERNEL);
|
|
if (!saved_ec)
|
|
return -ENOMEM;
|
|
- memcpy(saved_ec, boot_ec, sizeof(*saved_ec));
|
|
+ memcpy(&saved_ec, boot_ec, sizeof(saved_ec));
|
|
/* fall through */
|
|
}
|
|
/* This workaround is needed only on some broken machines,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/glue.c linux-2.6.29-rc3.owrt/drivers/acpi/glue.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/glue.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/glue.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -255,12 +255,12 @@
|
|
}
|
|
type = acpi_get_bus_type(dev->bus);
|
|
if (!type) {
|
|
- DBG("No ACPI bus support for %s\n", dev_name(dev));
|
|
+ DBG("No ACPI bus support for %s\n", dev->bus_id);
|
|
ret = -EINVAL;
|
|
goto end;
|
|
}
|
|
if ((ret = type->find_device(dev, &handle)) != 0)
|
|
- DBG("Can't get handler for %s\n", dev_name(dev));
|
|
+ DBG("Can't get handler for %s\n", dev->bus_id);
|
|
end:
|
|
if (!ret)
|
|
acpi_bind_one(dev, handle);
|
|
@@ -271,10 +271,10 @@
|
|
|
|
acpi_get_name(dev->archdata.acpi_handle,
|
|
ACPI_FULL_PATHNAME, &buffer);
|
|
- DBG("Device %s -> %s\n", dev_name(dev), (char *)buffer.pointer);
|
|
+ DBG("Device %s -> %s\n", dev->bus_id, (char *)buffer.pointer);
|
|
kfree(buffer.pointer);
|
|
} else
|
|
- DBG("Device %s -> No ACPI support\n", dev_name(dev));
|
|
+ DBG("Device %s -> No ACPI support\n", dev->bus_id);
|
|
#endif
|
|
|
|
return ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/Kconfig linux-2.6.29-rc3.owrt/drivers/acpi/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/acpi/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -9,7 +9,6 @@
|
|
depends on PCI
|
|
depends on PM
|
|
select PNP
|
|
- select CPU_IDLE
|
|
default y
|
|
---help---
|
|
Advanced Configuration and Power Interface (ACPI) support for
|
|
@@ -254,6 +253,13 @@
|
|
help you correlate PCI bus addresses with the physical geography
|
|
of your slots. If you are unsure, say N.
|
|
|
|
+config ACPI_SYSTEM
|
|
+ bool
|
|
+ default y
|
|
+ help
|
|
+ This driver will enable your system to shut down using ACPI, and
|
|
+ dump your ACPI DSDT table using /proc/acpi/dsdt.
|
|
+
|
|
config X86_PM_TIMER
|
|
bool "Power Management Timer Support" if EMBEDDED
|
|
depends on X86
|
|
@@ -281,7 +287,7 @@
|
|
support physical cpu/memory hot-plug.
|
|
|
|
If one selects "m", this driver can be loaded with
|
|
- "modprobe container".
|
|
+ "modprobe acpi_container".
|
|
|
|
config ACPI_HOTPLUG_MEMORY
|
|
tristate "Memory Hotplug"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/Makefile linux-2.6.29-rc3.owrt/drivers/acpi/Makefile
|
|
--- linux-2.6.29.owrt/drivers/acpi/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -52,7 +52,7 @@
|
|
obj-$(CONFIG_ACPI_CONTAINER) += container.o
|
|
obj-$(CONFIG_ACPI_THERMAL) += thermal.o
|
|
obj-y += power.o
|
|
-obj-y += system.o event.o
|
|
+obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o
|
|
obj-$(CONFIG_ACPI_DEBUG) += debug.o
|
|
obj-$(CONFIG_ACPI_NUMA) += numa.o
|
|
obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/numa.c linux-2.6.29-rc3.owrt/drivers/acpi/numa.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/numa.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/numa.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -277,7 +277,7 @@
|
|
int pxm, node = -1;
|
|
|
|
pxm = acpi_get_pxm(handle);
|
|
- if (pxm >= 0 && pxm < MAX_PXM_DOMAINS)
|
|
+ if (pxm >= 0)
|
|
node = acpi_map_pxm_to_node(pxm);
|
|
|
|
return node;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/osl.c linux-2.6.29-rc3.owrt/drivers/acpi/osl.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/osl.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/osl.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -228,10 +228,10 @@
|
|
if (acpi_in_debugger) {
|
|
kdb_printf("%s", buffer);
|
|
} else {
|
|
- printk(KERN_CONT "%s", buffer);
|
|
+ printk("%s", buffer);
|
|
}
|
|
#else
|
|
- printk(KERN_CONT "%s", buffer);
|
|
+ printk("%s", buffer);
|
|
#endif
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/pci_link.c linux-2.6.29-rc3.owrt/drivers/acpi/pci_link.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/pci_link.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/pci_link.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -593,7 +593,7 @@
|
|
return -ENODEV;
|
|
} else {
|
|
acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
|
|
- printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
|
|
+ printk(PREFIX "%s [%s] enabled at IRQ %d\n",
|
|
acpi_device_name(link->device),
|
|
acpi_device_bid(link->device), link->irq.active);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/processor_idle.c linux-2.6.29-rc3.owrt/drivers/acpi/processor_idle.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/processor_idle.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/processor_idle.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -66,17 +66,43 @@
|
|
#define ACPI_PROCESSOR_FILE_POWER "power"
|
|
#define US_TO_PM_TIMER_TICKS(t) ((t * (PM_TIMER_FREQUENCY/1000)) / 1000)
|
|
#define PM_TIMER_TICK_NS (1000000000ULL/PM_TIMER_FREQUENCY)
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+#define C2_OVERHEAD 4 /* 1us (3.579 ticks per us) */
|
|
+#define C3_OVERHEAD 4 /* 1us (3.579 ticks per us) */
|
|
+static void (*pm_idle_save) (void) __read_mostly;
|
|
+#else
|
|
#define C2_OVERHEAD 1 /* 1us */
|
|
#define C3_OVERHEAD 1 /* 1us */
|
|
+#endif
|
|
#define PM_TIMER_TICKS_TO_US(p) (((p) * 1000)/(PM_TIMER_FREQUENCY/1000))
|
|
|
|
static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
|
|
+#ifdef CONFIG_CPU_IDLE
|
|
module_param(max_cstate, uint, 0000);
|
|
+#else
|
|
+module_param(max_cstate, uint, 0644);
|
|
+#endif
|
|
static unsigned int nocst __read_mostly;
|
|
module_param(nocst, uint, 0000);
|
|
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+/*
|
|
+ * bm_history -- bit-mask with a bit per jiffy of bus-master activity
|
|
+ * 1000 HZ: 0xFFFFFFFF: 32 jiffies = 32ms
|
|
+ * 800 HZ: 0xFFFFFFFF: 32 jiffies = 40ms
|
|
+ * 100 HZ: 0x0000000F: 4 jiffies = 40ms
|
|
+ * reduce history for more aggressive entry into C3
|
|
+ */
|
|
+static unsigned int bm_history __read_mostly =
|
|
+ (HZ >= 800 ? 0xFFFFFFFF : ((1U << (HZ / 25)) - 1));
|
|
+module_param(bm_history, uint, 0644);
|
|
+
|
|
+static int acpi_processor_set_power_policy(struct acpi_processor *pr);
|
|
+
|
|
+#else /* CONFIG_CPU_IDLE */
|
|
static unsigned int latency_factor __read_mostly = 2;
|
|
module_param(latency_factor, uint, 0644);
|
|
+#endif
|
|
|
|
/*
|
|
* IBM ThinkPad R40e crashes mysteriously when going into C2 or C3.
|
|
@@ -198,6 +224,71 @@
|
|
current_thread_info()->status |= TS_POLLING;
|
|
}
|
|
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+
|
|
+static void
|
|
+acpi_processor_power_activate(struct acpi_processor *pr,
|
|
+ struct acpi_processor_cx *new)
|
|
+{
|
|
+ struct acpi_processor_cx *old;
|
|
+
|
|
+ if (!pr || !new)
|
|
+ return;
|
|
+
|
|
+ old = pr->power.state;
|
|
+
|
|
+ if (old)
|
|
+ old->promotion.count = 0;
|
|
+ new->demotion.count = 0;
|
|
+
|
|
+ /* Cleanup from old state. */
|
|
+ if (old) {
|
|
+ switch (old->type) {
|
|
+ case ACPI_STATE_C3:
|
|
+ /* Disable bus master reload */
|
|
+ if (new->type != ACPI_STATE_C3 && pr->flags.bm_check)
|
|
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Prepare to use new state. */
|
|
+ switch (new->type) {
|
|
+ case ACPI_STATE_C3:
|
|
+ /* Enable bus master reload */
|
|
+ if (old->type != ACPI_STATE_C3 && pr->flags.bm_check)
|
|
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ pr->power.state = new;
|
|
+
|
|
+ return;
|
|
+}
|
|
+
|
|
+static atomic_t c3_cpu_count;
|
|
+
|
|
+/* Common C-state entry for C2, C3, .. */
|
|
+static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
|
|
+{
|
|
+ /* Don't trace irqs off for idle */
|
|
+ stop_critical_timings();
|
|
+ if (cstate->entry_method == ACPI_CSTATE_FFH) {
|
|
+ /* Call into architectural FFH based C-state */
|
|
+ acpi_processor_ffh_cstate_enter(cstate);
|
|
+ } else {
|
|
+ int unused;
|
|
+ /* IO port based C-state */
|
|
+ inb(cstate->address);
|
|
+ /* Dummy wait op - must do something useless after P_LVL2 read
|
|
+ because chipsets cannot guarantee that STPCLK# signal
|
|
+ gets asserted in time to freeze execution properly. */
|
|
+ unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
|
+ }
|
|
+ start_critical_timings();
|
|
+}
|
|
+#endif /* !CONFIG_CPU_IDLE */
|
|
+
|
|
#ifdef ARCH_APICTIMER_STOPS_ON_C3
|
|
|
|
/*
|
|
@@ -299,6 +390,421 @@
|
|
}
|
|
#endif
|
|
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+static void acpi_processor_idle(void)
|
|
+{
|
|
+ struct acpi_processor *pr = NULL;
|
|
+ struct acpi_processor_cx *cx = NULL;
|
|
+ struct acpi_processor_cx *next_state = NULL;
|
|
+ int sleep_ticks = 0;
|
|
+ u32 t1, t2 = 0;
|
|
+
|
|
+ /*
|
|
+ * Interrupts must be disabled during bus mastering calculations and
|
|
+ * for C2/C3 transitions.
|
|
+ */
|
|
+ local_irq_disable();
|
|
+
|
|
+ pr = __get_cpu_var(processors);
|
|
+ if (!pr) {
|
|
+ local_irq_enable();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Check whether we truly need to go idle, or should
|
|
+ * reschedule:
|
|
+ */
|
|
+ if (unlikely(need_resched())) {
|
|
+ local_irq_enable();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ cx = pr->power.state;
|
|
+ if (!cx || acpi_idle_suspend) {
|
|
+ if (pm_idle_save) {
|
|
+ pm_idle_save(); /* enables IRQs */
|
|
+ } else {
|
|
+ acpi_safe_halt();
|
|
+ local_irq_enable();
|
|
+ }
|
|
+
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Check BM Activity
|
|
+ * -----------------
|
|
+ * Check for bus mastering activity (if required), record, and check
|
|
+ * for demotion.
|
|
+ */
|
|
+ if (pr->flags.bm_check) {
|
|
+ u32 bm_status = 0;
|
|
+ unsigned long diff = jiffies - pr->power.bm_check_timestamp;
|
|
+
|
|
+ if (diff > 31)
|
|
+ diff = 31;
|
|
+
|
|
+ pr->power.bm_activity <<= diff;
|
|
+
|
|
+ acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
|
|
+ if (bm_status) {
|
|
+ pr->power.bm_activity |= 0x1;
|
|
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
|
|
+ }
|
|
+ /*
|
|
+ * PIIX4 Erratum #18: Note that BM_STS doesn't always reflect
|
|
+ * the true state of bus mastering activity; forcing us to
|
|
+ * manually check the BMIDEA bit of each IDE channel.
|
|
+ */
|
|
+ else if (errata.piix4.bmisx) {
|
|
+ if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01)
|
|
+ || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01))
|
|
+ pr->power.bm_activity |= 0x1;
|
|
+ }
|
|
+
|
|
+ pr->power.bm_check_timestamp = jiffies;
|
|
+
|
|
+ /*
|
|
+ * If bus mastering is or was active this jiffy, demote
|
|
+ * to avoid a faulty transition. Note that the processor
|
|
+ * won't enter a low-power state during this call (to this
|
|
+ * function) but should upon the next.
|
|
+ *
|
|
+ * TBD: A better policy might be to fallback to the demotion
|
|
+ * state (use it for this quantum only) istead of
|
|
+ * demoting -- and rely on duration as our sole demotion
|
|
+ * qualification. This may, however, introduce DMA
|
|
+ * issues (e.g. floppy DMA transfer overrun/underrun).
|
|
+ */
|
|
+ if ((pr->power.bm_activity & 0x1) &&
|
|
+ cx->demotion.threshold.bm) {
|
|
+ local_irq_enable();
|
|
+ next_state = cx->demotion.state;
|
|
+ goto end;
|
|
+ }
|
|
+ }
|
|
+
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
+ /*
|
|
+ * Check for P_LVL2_UP flag before entering C2 and above on
|
|
+ * an SMP system. We do it here instead of doing it at _CST/P_LVL
|
|
+ * detection phase, to work cleanly with logical CPU hotplug.
|
|
+ */
|
|
+ if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) &&
|
|
+ !pr->flags.has_cst && !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
|
|
+ cx = &pr->power.states[ACPI_STATE_C1];
|
|
+#endif
|
|
+
|
|
+ /*
|
|
+ * Sleep:
|
|
+ * ------
|
|
+ * Invoke the current Cx state to put the processor to sleep.
|
|
+ */
|
|
+ if (cx->type == ACPI_STATE_C2 || cx->type == ACPI_STATE_C3) {
|
|
+ current_thread_info()->status &= ~TS_POLLING;
|
|
+ /*
|
|
+ * TS_POLLING-cleared state must be visible before we
|
|
+ * test NEED_RESCHED:
|
|
+ */
|
|
+ smp_mb();
|
|
+ if (need_resched()) {
|
|
+ current_thread_info()->status |= TS_POLLING;
|
|
+ local_irq_enable();
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ switch (cx->type) {
|
|
+
|
|
+ case ACPI_STATE_C1:
|
|
+ /*
|
|
+ * Invoke C1.
|
|
+ * Use the appropriate idle routine, the one that would
|
|
+ * be used without acpi C-states.
|
|
+ */
|
|
+ if (pm_idle_save) {
|
|
+ pm_idle_save(); /* enables IRQs */
|
|
+ } else {
|
|
+ acpi_safe_halt();
|
|
+ local_irq_enable();
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * TBD: Can't get time duration while in C1, as resumes
|
|
+ * go to an ISR rather than here. Need to instrument
|
|
+ * base interrupt handler.
|
|
+ *
|
|
+ * Note: the TSC better not stop in C1, sched_clock() will
|
|
+ * skew otherwise.
|
|
+ */
|
|
+ sleep_ticks = 0xFFFFFFFF;
|
|
+
|
|
+ break;
|
|
+
|
|
+ case ACPI_STATE_C2:
|
|
+ /* Get start time (ticks) */
|
|
+ t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
|
+ /* Tell the scheduler that we are going deep-idle: */
|
|
+ sched_clock_idle_sleep_event();
|
|
+ /* Invoke C2 */
|
|
+ acpi_state_timer_broadcast(pr, cx, 1);
|
|
+ acpi_cstate_enter(cx);
|
|
+ /* Get end time (ticks) */
|
|
+ t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
|
+
|
|
+#if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86)
|
|
+ /* TSC halts in C2, so notify users */
|
|
+ if (tsc_halts_in_c(ACPI_STATE_C2))
|
|
+ mark_tsc_unstable("possible TSC halt in C2");
|
|
+#endif
|
|
+ /* Compute time (ticks) that we were actually asleep */
|
|
+ sleep_ticks = ticks_elapsed(t1, t2);
|
|
+
|
|
+ /* Tell the scheduler how much we idled: */
|
|
+ sched_clock_idle_wakeup_event(sleep_ticks*PM_TIMER_TICK_NS);
|
|
+
|
|
+ /* Re-enable interrupts */
|
|
+ local_irq_enable();
|
|
+ /* Do not account our idle-switching overhead: */
|
|
+ sleep_ticks -= cx->latency_ticks + C2_OVERHEAD;
|
|
+
|
|
+ current_thread_info()->status |= TS_POLLING;
|
|
+ acpi_state_timer_broadcast(pr, cx, 0);
|
|
+ break;
|
|
+
|
|
+ case ACPI_STATE_C3:
|
|
+ acpi_unlazy_tlb(smp_processor_id());
|
|
+ /*
|
|
+ * Must be done before busmaster disable as we might
|
|
+ * need to access HPET !
|
|
+ */
|
|
+ acpi_state_timer_broadcast(pr, cx, 1);
|
|
+ /*
|
|
+ * disable bus master
|
|
+ * bm_check implies we need ARB_DIS
|
|
+ * !bm_check implies we need cache flush
|
|
+ * bm_control implies whether we can do ARB_DIS
|
|
+ *
|
|
+ * That leaves a case where bm_check is set and bm_control is
|
|
+ * not set. In that case we cannot do much, we enter C3
|
|
+ * without doing anything.
|
|
+ */
|
|
+ if (pr->flags.bm_check && pr->flags.bm_control) {
|
|
+ if (atomic_inc_return(&c3_cpu_count) ==
|
|
+ num_online_cpus()) {
|
|
+ /*
|
|
+ * All CPUs are trying to go to C3
|
|
+ * Disable bus master arbitration
|
|
+ */
|
|
+ acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1);
|
|
+ }
|
|
+ } else if (!pr->flags.bm_check) {
|
|
+ /* SMP with no shared cache... Invalidate cache */
|
|
+ ACPI_FLUSH_CPU_CACHE();
|
|
+ }
|
|
+
|
|
+ /* Get start time (ticks) */
|
|
+ t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
|
+ /* Invoke C3 */
|
|
+ /* Tell the scheduler that we are going deep-idle: */
|
|
+ sched_clock_idle_sleep_event();
|
|
+ acpi_cstate_enter(cx);
|
|
+ /* Get end time (ticks) */
|
|
+ t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
|
+ if (pr->flags.bm_check && pr->flags.bm_control) {
|
|
+ /* Enable bus master arbitration */
|
|
+ atomic_dec(&c3_cpu_count);
|
|
+ acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
|
|
+ }
|
|
+
|
|
+#if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86)
|
|
+ /* TSC halts in C3, so notify users */
|
|
+ if (tsc_halts_in_c(ACPI_STATE_C3))
|
|
+ mark_tsc_unstable("TSC halts in C3");
|
|
+#endif
|
|
+ /* Compute time (ticks) that we were actually asleep */
|
|
+ sleep_ticks = ticks_elapsed(t1, t2);
|
|
+ /* Tell the scheduler how much we idled: */
|
|
+ sched_clock_idle_wakeup_event(sleep_ticks*PM_TIMER_TICK_NS);
|
|
+
|
|
+ /* Re-enable interrupts */
|
|
+ local_irq_enable();
|
|
+ /* Do not account our idle-switching overhead: */
|
|
+ sleep_ticks -= cx->latency_ticks + C3_OVERHEAD;
|
|
+
|
|
+ current_thread_info()->status |= TS_POLLING;
|
|
+ acpi_state_timer_broadcast(pr, cx, 0);
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ local_irq_enable();
|
|
+ return;
|
|
+ }
|
|
+ cx->usage++;
|
|
+ if ((cx->type != ACPI_STATE_C1) && (sleep_ticks > 0))
|
|
+ cx->time += sleep_ticks;
|
|
+
|
|
+ next_state = pr->power.state;
|
|
+
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
+ /* Don't do promotion/demotion */
|
|
+ if ((cx->type == ACPI_STATE_C1) && (num_online_cpus() > 1) &&
|
|
+ !pr->flags.has_cst && !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED)) {
|
|
+ next_state = cx;
|
|
+ goto end;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ /*
|
|
+ * Promotion?
|
|
+ * ----------
|
|
+ * Track the number of longs (time asleep is greater than threshold)
|
|
+ * and promote when the count threshold is reached. Note that bus
|
|
+ * mastering activity may prevent promotions.
|
|
+ * Do not promote above max_cstate.
|
|
+ */
|
|
+ if (cx->promotion.state &&
|
|
+ ((cx->promotion.state - pr->power.states) <= max_cstate)) {
|
|
+ if (sleep_ticks > cx->promotion.threshold.ticks &&
|
|
+ cx->promotion.state->latency <=
|
|
+ pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) {
|
|
+ cx->promotion.count++;
|
|
+ cx->demotion.count = 0;
|
|
+ if (cx->promotion.count >=
|
|
+ cx->promotion.threshold.count) {
|
|
+ if (pr->flags.bm_check) {
|
|
+ if (!
|
|
+ (pr->power.bm_activity & cx->
|
|
+ promotion.threshold.bm)) {
|
|
+ next_state =
|
|
+ cx->promotion.state;
|
|
+ goto end;
|
|
+ }
|
|
+ } else {
|
|
+ next_state = cx->promotion.state;
|
|
+ goto end;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Demotion?
|
|
+ * ---------
|
|
+ * Track the number of shorts (time asleep is less than time threshold)
|
|
+ * and demote when the usage threshold is reached.
|
|
+ */
|
|
+ if (cx->demotion.state) {
|
|
+ if (sleep_ticks < cx->demotion.threshold.ticks) {
|
|
+ cx->demotion.count++;
|
|
+ cx->promotion.count = 0;
|
|
+ if (cx->demotion.count >= cx->demotion.threshold.count) {
|
|
+ next_state = cx->demotion.state;
|
|
+ goto end;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ end:
|
|
+ /*
|
|
+ * Demote if current state exceeds max_cstate
|
|
+ * or if the latency of the current state is unacceptable
|
|
+ */
|
|
+ if ((pr->power.state - pr->power.states) > max_cstate ||
|
|
+ pr->power.state->latency >
|
|
+ pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) {
|
|
+ if (cx->demotion.state)
|
|
+ next_state = cx->demotion.state;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * New Cx State?
|
|
+ * -------------
|
|
+ * If we're going to start using a new Cx state we must clean up
|
|
+ * from the previous and prepare to use the new.
|
|
+ */
|
|
+ if (next_state != pr->power.state)
|
|
+ acpi_processor_power_activate(pr, next_state);
|
|
+}
|
|
+
|
|
+static int acpi_processor_set_power_policy(struct acpi_processor *pr)
|
|
+{
|
|
+ unsigned int i;
|
|
+ unsigned int state_is_set = 0;
|
|
+ struct acpi_processor_cx *lower = NULL;
|
|
+ struct acpi_processor_cx *higher = NULL;
|
|
+ struct acpi_processor_cx *cx;
|
|
+
|
|
+
|
|
+ if (!pr)
|
|
+ return -EINVAL;
|
|
+
|
|
+ /*
|
|
+ * This function sets the default Cx state policy (OS idle handler).
|
|
+ * Our scheme is to promote quickly to C2 but more conservatively
|
|
+ * to C3. We're favoring C2 for its characteristics of low latency
|
|
+ * (quick response), good power savings, and ability to allow bus
|
|
+ * mastering activity. Note that the Cx state policy is completely
|
|
+ * customizable and can be altered dynamically.
|
|
+ */
|
|
+
|
|
+ /* startup state */
|
|
+ for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
|
|
+ cx = &pr->power.states[i];
|
|
+ if (!cx->valid)
|
|
+ continue;
|
|
+
|
|
+ if (!state_is_set)
|
|
+ pr->power.state = cx;
|
|
+ state_is_set++;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (!state_is_set)
|
|
+ return -ENODEV;
|
|
+
|
|
+ /* demotion */
|
|
+ for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
|
|
+ cx = &pr->power.states[i];
|
|
+ if (!cx->valid)
|
|
+ continue;
|
|
+
|
|
+ if (lower) {
|
|
+ cx->demotion.state = lower;
|
|
+ cx->demotion.threshold.ticks = cx->latency_ticks;
|
|
+ cx->demotion.threshold.count = 1;
|
|
+ if (cx->type == ACPI_STATE_C3)
|
|
+ cx->demotion.threshold.bm = bm_history;
|
|
+ }
|
|
+
|
|
+ lower = cx;
|
|
+ }
|
|
+
|
|
+ /* promotion */
|
|
+ for (i = (ACPI_PROCESSOR_MAX_POWER - 1); i > 0; i--) {
|
|
+ cx = &pr->power.states[i];
|
|
+ if (!cx->valid)
|
|
+ continue;
|
|
+
|
|
+ if (higher) {
|
|
+ cx->promotion.state = higher;
|
|
+ cx->promotion.threshold.ticks = cx->latency_ticks;
|
|
+ if (cx->type >= ACPI_STATE_C2)
|
|
+ cx->promotion.threshold.count = 4;
|
|
+ else
|
|
+ cx->promotion.threshold.count = 10;
|
|
+ if (higher->type == ACPI_STATE_C3)
|
|
+ cx->promotion.threshold.bm = bm_history;
|
|
+ }
|
|
+
|
|
+ higher = cx;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif /* !CONFIG_CPU_IDLE */
|
|
+
|
|
static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
|
|
{
|
|
|
|
@@ -541,7 +1047,11 @@
|
|
*/
|
|
cx->valid = 1;
|
|
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+ cx->latency_ticks = US_TO_PM_TIMER_TICKS(cx->latency);
|
|
+#else
|
|
cx->latency_ticks = cx->latency;
|
|
+#endif
|
|
|
|
return;
|
|
}
|
|
@@ -611,6 +1121,7 @@
|
|
" for C3 to be enabled on SMP systems\n"));
|
|
return;
|
|
}
|
|
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
|
|
}
|
|
|
|
/*
|
|
@@ -621,16 +1132,11 @@
|
|
*/
|
|
cx->valid = 1;
|
|
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+ cx->latency_ticks = US_TO_PM_TIMER_TICKS(cx->latency);
|
|
+#else
|
|
cx->latency_ticks = cx->latency;
|
|
- /*
|
|
- * On older chipsets, BM_RLD needs to be set
|
|
- * in order for Bus Master activity to wake the
|
|
- * system from C3. Newer chipsets handle DMA
|
|
- * during C3 automatically and BM_RLD is a NOP.
|
|
- * In either case, the proper way to
|
|
- * handle BM_RLD is to set it and leave it set.
|
|
- */
|
|
- acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1);
|
|
+#endif
|
|
|
|
return;
|
|
}
|
|
@@ -695,6 +1201,20 @@
|
|
|
|
pr->power.count = acpi_processor_power_verify(pr);
|
|
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+ /*
|
|
+ * Set Default Policy
|
|
+ * ------------------
|
|
+ * Now that we know which states are supported, set the default
|
|
+ * policy. Note that this policy can be changed dynamically
|
|
+ * (e.g. encourage deeper sleeps to conserve battery life when
|
|
+ * not on AC).
|
|
+ */
|
|
+ result = acpi_processor_set_power_policy(pr);
|
|
+ if (result)
|
|
+ return result;
|
|
+#endif
|
|
+
|
|
/*
|
|
* if one state of type C2 or C3 is available, mark this
|
|
* CPU as being "idle manageable"
|
|
@@ -792,6 +1312,69 @@
|
|
.release = single_release,
|
|
};
|
|
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+
|
|
+int acpi_processor_cst_has_changed(struct acpi_processor *pr)
|
|
+{
|
|
+ int result = 0;
|
|
+
|
|
+ if (boot_option_idle_override)
|
|
+ return 0;
|
|
+
|
|
+ if (!pr)
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (nocst) {
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ if (!pr->flags.power_setup_done)
|
|
+ return -ENODEV;
|
|
+
|
|
+ /*
|
|
+ * Fall back to the default idle loop, when pm_idle_save had
|
|
+ * been initialized.
|
|
+ */
|
|
+ if (pm_idle_save) {
|
|
+ pm_idle = pm_idle_save;
|
|
+ /* Relies on interrupts forcing exit from idle. */
|
|
+ synchronize_sched();
|
|
+ }
|
|
+
|
|
+ pr->flags.power = 0;
|
|
+ result = acpi_processor_get_power_info(pr);
|
|
+ if ((pr->flags.power == 1) && (pr->flags.power_setup_done))
|
|
+ pm_idle = acpi_processor_idle;
|
|
+
|
|
+ return result;
|
|
+}
|
|
+
|
|
+#ifdef CONFIG_SMP
|
|
+static void smp_callback(void *v)
|
|
+{
|
|
+ /* we already woke the CPU up, nothing more to do */
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This function gets called when a part of the kernel has a new latency
|
|
+ * requirement. This means we need to get all processors out of their C-state,
|
|
+ * and then recalculate a new suitable C-state. Just do a cross-cpu IPI; that
|
|
+ * wakes them all right up.
|
|
+ */
|
|
+static int acpi_processor_latency_notify(struct notifier_block *b,
|
|
+ unsigned long l, void *v)
|
|
+{
|
|
+ smp_call_function(smp_callback, NULL, 1);
|
|
+ return NOTIFY_OK;
|
|
+}
|
|
+
|
|
+static struct notifier_block acpi_processor_latency_notifier = {
|
|
+ .notifier_call = acpi_processor_latency_notify,
|
|
+};
|
|
+
|
|
+#endif
|
|
+
|
|
+#else /* CONFIG_CPU_IDLE */
|
|
|
|
/**
|
|
* acpi_idle_bm_check - checks if bus master activity was detected
|
|
@@ -800,7 +1383,7 @@
|
|
{
|
|
u32 bm_status = 0;
|
|
|
|
- acpi_get_register_unlocked(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
|
|
+ acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
|
|
if (bm_status)
|
|
acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
|
|
/*
|
|
@@ -817,6 +1400,25 @@
|
|
}
|
|
|
|
/**
|
|
+ * acpi_idle_update_bm_rld - updates the BM_RLD bit depending on target state
|
|
+ * @pr: the processor
|
|
+ * @target: the new target state
|
|
+ */
|
|
+static inline void acpi_idle_update_bm_rld(struct acpi_processor *pr,
|
|
+ struct acpi_processor_cx *target)
|
|
+{
|
|
+ if (pr->flags.bm_rld_set && target->type != ACPI_STATE_C3) {
|
|
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
|
|
+ pr->flags.bm_rld_set = 0;
|
|
+ }
|
|
+
|
|
+ if (!pr->flags.bm_rld_set && target->type == ACPI_STATE_C3) {
|
|
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1);
|
|
+ pr->flags.bm_rld_set = 1;
|
|
+ }
|
|
+}
|
|
+
|
|
+/**
|
|
* acpi_idle_do_entry - a helper function that does C2 and C3 type entry
|
|
* @cx: cstate data
|
|
*
|
|
@@ -871,6 +1473,9 @@
|
|
return 0;
|
|
}
|
|
|
|
+ if (pr->flags.bm_check)
|
|
+ acpi_idle_update_bm_rld(pr, cx);
|
|
+
|
|
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
|
acpi_idle_do_entry(cx);
|
|
t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
|
@@ -922,6 +1527,9 @@
|
|
*/
|
|
acpi_state_timer_broadcast(pr, cx, 1);
|
|
|
|
+ if (pr->flags.bm_check)
|
|
+ acpi_idle_update_bm_rld(pr, cx);
|
|
+
|
|
if (cx->type == ACPI_STATE_C3)
|
|
ACPI_FLUSH_CPU_CACHE();
|
|
|
|
@@ -1013,6 +1621,8 @@
|
|
*/
|
|
acpi_state_timer_broadcast(pr, cx, 1);
|
|
|
|
+ acpi_idle_update_bm_rld(pr, cx);
|
|
+
|
|
/*
|
|
* disable bus master
|
|
* bm_check implies we need ARB_DIS
|
|
@@ -1185,6 +1795,8 @@
|
|
return ret;
|
|
}
|
|
|
|
+#endif /* CONFIG_CPU_IDLE */
|
|
+
|
|
int __cpuinit acpi_processor_power_init(struct acpi_processor *pr,
|
|
struct acpi_device *device)
|
|
{
|
|
@@ -1213,6 +1825,10 @@
|
|
"ACPI: processor limited to max C-state %d\n",
|
|
max_cstate);
|
|
first_run++;
|
|
+#if !defined(CONFIG_CPU_IDLE) && defined(CONFIG_SMP)
|
|
+ pm_qos_add_notifier(PM_QOS_CPU_DMA_LATENCY,
|
|
+ &acpi_processor_latency_notifier);
|
|
+#endif
|
|
}
|
|
|
|
if (!pr)
|
|
@@ -1236,9 +1852,11 @@
|
|
* platforms that only support C1.
|
|
*/
|
|
if (pr->flags.power) {
|
|
+#ifdef CONFIG_CPU_IDLE
|
|
acpi_processor_setup_cpuidle(pr);
|
|
if (cpuidle_register_device(&pr->power.dev))
|
|
return -EIO;
|
|
+#endif
|
|
|
|
printk(KERN_INFO PREFIX "CPU%d (power states:", pr->id);
|
|
for (i = 1; i <= pr->power.count; i++)
|
|
@@ -1246,6 +1864,13 @@
|
|
printk(" C%d[C%d]", i,
|
|
pr->power.states[i].type);
|
|
printk(")\n");
|
|
+
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+ if (pr->id == 0) {
|
|
+ pm_idle_save = pm_idle;
|
|
+ pm_idle = acpi_processor_idle;
|
|
+ }
|
|
+#endif
|
|
}
|
|
|
|
/* 'power' [R] */
|
|
@@ -1264,12 +1889,34 @@
|
|
if (boot_option_idle_override)
|
|
return 0;
|
|
|
|
+#ifdef CONFIG_CPU_IDLE
|
|
cpuidle_unregister_device(&pr->power.dev);
|
|
+#endif
|
|
pr->flags.power_setup_done = 0;
|
|
|
|
if (acpi_device_dir(device))
|
|
remove_proc_entry(ACPI_PROCESSOR_FILE_POWER,
|
|
acpi_device_dir(device));
|
|
|
|
+#ifndef CONFIG_CPU_IDLE
|
|
+
|
|
+ /* Unregister the idle handler when processor #0 is removed. */
|
|
+ if (pr->id == 0) {
|
|
+ if (pm_idle_save)
|
|
+ pm_idle = pm_idle_save;
|
|
+
|
|
+ /*
|
|
+ * We are about to unload the current idle thread pm callback
|
|
+ * (pm_idle), Wait for all processors to update cached/local
|
|
+ * copies of pm_idle before proceeding.
|
|
+ */
|
|
+ cpu_idle_wait();
|
|
+#ifdef CONFIG_SMP
|
|
+ pm_qos_remove_notifier(PM_QOS_CPU_DMA_LATENCY,
|
|
+ &acpi_processor_latency_notifier);
|
|
+#endif
|
|
+ }
|
|
+#endif
|
|
+
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/processor_perflib.c linux-2.6.29-rc3.owrt/drivers/acpi/processor_perflib.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/processor_perflib.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/processor_perflib.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -31,6 +31,14 @@
|
|
#include <linux/init.h>
|
|
#include <linux/cpufreq.h>
|
|
|
|
+#ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF
|
|
+#include <linux/proc_fs.h>
|
|
+#include <linux/seq_file.h>
|
|
+#include <linux/mutex.h>
|
|
+
|
|
+#include <asm/uaccess.h>
|
|
+#endif
|
|
+
|
|
#ifdef CONFIG_X86
|
|
#include <asm/cpufeature.h>
|
|
#endif
|
|
@@ -426,6 +434,96 @@
|
|
|
|
EXPORT_SYMBOL(acpi_processor_notify_smm);
|
|
|
|
+#ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF
|
|
+/* /proc/acpi/processor/../performance interface (DEPRECATED) */
|
|
+
|
|
+static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file);
|
|
+static struct file_operations acpi_processor_perf_fops = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .open = acpi_processor_perf_open_fs,
|
|
+ .read = seq_read,
|
|
+ .llseek = seq_lseek,
|
|
+ .release = single_release,
|
|
+};
|
|
+
|
|
+static int acpi_processor_perf_seq_show(struct seq_file *seq, void *offset)
|
|
+{
|
|
+ struct acpi_processor *pr = seq->private;
|
|
+ int i;
|
|
+
|
|
+
|
|
+ if (!pr)
|
|
+ goto end;
|
|
+
|
|
+ if (!pr->performance) {
|
|
+ seq_puts(seq, "<not supported>\n");
|
|
+ goto end;
|
|
+ }
|
|
+
|
|
+ seq_printf(seq, "state count: %d\n"
|
|
+ "active state: P%d\n",
|
|
+ pr->performance->state_count, pr->performance->state);
|
|
+
|
|
+ seq_puts(seq, "states:\n");
|
|
+ for (i = 0; i < pr->performance->state_count; i++)
|
|
+ seq_printf(seq,
|
|
+ " %cP%d: %d MHz, %d mW, %d uS\n",
|
|
+ (i == pr->performance->state ? '*' : ' '), i,
|
|
+ (u32) pr->performance->states[i].core_frequency,
|
|
+ (u32) pr->performance->states[i].power,
|
|
+ (u32) pr->performance->states[i].transition_latency);
|
|
+
|
|
+ end:
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file)
|
|
+{
|
|
+ return single_open(file, acpi_processor_perf_seq_show,
|
|
+ PDE(inode)->data);
|
|
+}
|
|
+
|
|
+static void acpi_cpufreq_add_file(struct acpi_processor *pr)
|
|
+{
|
|
+ struct acpi_device *device = NULL;
|
|
+
|
|
+
|
|
+ if (acpi_bus_get_device(pr->handle, &device))
|
|
+ return;
|
|
+
|
|
+ /* add file 'performance' [R/W] */
|
|
+ proc_create_data(ACPI_PROCESSOR_FILE_PERFORMANCE, S_IFREG | S_IRUGO,
|
|
+ acpi_device_dir(device),
|
|
+ &acpi_processor_perf_fops, acpi_driver_data(device));
|
|
+ return;
|
|
+}
|
|
+
|
|
+static void acpi_cpufreq_remove_file(struct acpi_processor *pr)
|
|
+{
|
|
+ struct acpi_device *device = NULL;
|
|
+
|
|
+
|
|
+ if (acpi_bus_get_device(pr->handle, &device))
|
|
+ return;
|
|
+
|
|
+ /* remove file 'performance' */
|
|
+ remove_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE,
|
|
+ acpi_device_dir(device));
|
|
+
|
|
+ return;
|
|
+}
|
|
+
|
|
+#else
|
|
+static void acpi_cpufreq_add_file(struct acpi_processor *pr)
|
|
+{
|
|
+ return;
|
|
+}
|
|
+static void acpi_cpufreq_remove_file(struct acpi_processor *pr)
|
|
+{
|
|
+ return;
|
|
+}
|
|
+#endif /* CONFIG_X86_ACPI_CPUFREQ_PROC_INTF */
|
|
+
|
|
static int acpi_processor_get_psd(struct acpi_processor *pr)
|
|
{
|
|
int result = 0;
|
|
@@ -649,12 +747,14 @@
|
|
}
|
|
EXPORT_SYMBOL(acpi_processor_preregister_performance);
|
|
|
|
+
|
|
int
|
|
acpi_processor_register_performance(struct acpi_processor_performance
|
|
*performance, unsigned int cpu)
|
|
{
|
|
struct acpi_processor *pr;
|
|
|
|
+
|
|
if (!(acpi_processor_ppc_status & PPC_REGISTERED))
|
|
return -EINVAL;
|
|
|
|
@@ -681,6 +781,8 @@
|
|
return -EIO;
|
|
}
|
|
|
|
+ acpi_cpufreq_add_file(pr);
|
|
+
|
|
mutex_unlock(&performance_mutex);
|
|
return 0;
|
|
}
|
|
@@ -693,6 +795,7 @@
|
|
{
|
|
struct acpi_processor *pr;
|
|
|
|
+
|
|
mutex_lock(&performance_mutex);
|
|
|
|
pr = per_cpu(processors, cpu);
|
|
@@ -705,6 +808,8 @@
|
|
kfree(pr->performance->states);
|
|
pr->performance = NULL;
|
|
|
|
+ acpi_cpufreq_remove_file(pr);
|
|
+
|
|
mutex_unlock(&performance_mutex);
|
|
|
|
return;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/sleep.c linux-2.6.29-rc3.owrt/drivers/acpi/sleep.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/sleep.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/sleep.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -90,6 +90,31 @@
|
|
old_suspend_ordering = true;
|
|
}
|
|
|
|
+/*
|
|
+ * According to the ACPI specification the BIOS should make sure that ACPI is
|
|
+ * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still,
|
|
+ * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
|
|
+ * on such systems during resume. Unfortunately that doesn't help in
|
|
+ * particularly pathological cases in which SCI_EN has to be set directly on
|
|
+ * resume, although the specification states very clearly that this flag is
|
|
+ * owned by the hardware. The set_sci_en_on_resume variable will be set in such
|
|
+ * cases.
|
|
+ */
|
|
+static bool set_sci_en_on_resume;
|
|
+/*
|
|
+ * The ACPI specification wants us to save NVS memory regions during hibernation
|
|
+ * and to restore them during the subsequent resume. However, it is not certain
|
|
+ * if this mechanism is going to work on all machines, so we allow the user to
|
|
+ * disable this mechanism using the 'acpi_sleep=s4_nonvs' kernel command line
|
|
+ * option.
|
|
+ */
|
|
+static bool s4_no_nvs;
|
|
+
|
|
+void __init acpi_s4_no_nvs(void)
|
|
+{
|
|
+ s4_no_nvs = true;
|
|
+}
|
|
+
|
|
/**
|
|
* acpi_pm_disable_gpes - Disable the GPEs.
|
|
*/
|
|
@@ -168,18 +193,6 @@
|
|
#endif /* CONFIG_ACPI_SLEEP */
|
|
|
|
#ifdef CONFIG_SUSPEND
|
|
-/*
|
|
- * According to the ACPI specification the BIOS should make sure that ACPI is
|
|
- * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still,
|
|
- * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
|
|
- * on such systems during resume. Unfortunately that doesn't help in
|
|
- * particularly pathological cases in which SCI_EN has to be set directly on
|
|
- * resume, although the specification states very clearly that this flag is
|
|
- * owned by the hardware. The set_sci_en_on_resume variable will be set in such
|
|
- * cases.
|
|
- */
|
|
-static bool set_sci_en_on_resume;
|
|
-
|
|
extern void do_suspend_lowlevel(void);
|
|
|
|
static u32 acpi_suspend_states[] = {
|
|
@@ -378,41 +391,11 @@
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
|
|
},
|
|
},
|
|
- {
|
|
- .callback = init_old_suspend_ordering,
|
|
- .ident = "Asus Pundit P1-AH2 (M2N8L motherboard)",
|
|
- .matches = {
|
|
- DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek Computer INC."),
|
|
- DMI_MATCH(DMI_BOARD_NAME, "M2N8L"),
|
|
- },
|
|
- },
|
|
- {
|
|
- .callback = init_set_sci_en_on_resume,
|
|
- .ident = "Toshiba Satellite L300",
|
|
- .matches = {
|
|
- DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
|
|
- DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L300"),
|
|
- },
|
|
- },
|
|
{},
|
|
};
|
|
#endif /* CONFIG_SUSPEND */
|
|
|
|
#ifdef CONFIG_HIBERNATION
|
|
-/*
|
|
- * The ACPI specification wants us to save NVS memory regions during hibernation
|
|
- * and to restore them during the subsequent resume. However, it is not certain
|
|
- * if this mechanism is going to work on all machines, so we allow the user to
|
|
- * disable this mechanism using the 'acpi_sleep=s4_nonvs' kernel command line
|
|
- * option.
|
|
- */
|
|
-static bool s4_no_nvs;
|
|
-
|
|
-void __init acpi_s4_no_nvs(void)
|
|
-{
|
|
- s4_no_nvs = true;
|
|
-}
|
|
-
|
|
static unsigned long s4_hardware_signature;
|
|
static struct acpi_table_facs *facs;
|
|
static bool nosigcheck;
|
|
@@ -696,7 +679,7 @@
|
|
static void acpi_power_off(void)
|
|
{
|
|
/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
|
|
- printk(KERN_DEBUG "%s called\n", __func__);
|
|
+ printk("%s called\n", __func__);
|
|
local_irq_disable();
|
|
acpi_enable_wakeup_device(ACPI_STATE_S5);
|
|
acpi_enter_sleep_state(ACPI_STATE_S5);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/tables.c linux-2.6.29-rc3.owrt/drivers/acpi/tables.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/tables.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/tables.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -293,12 +293,7 @@
|
|
|
|
int __init acpi_table_init(void)
|
|
{
|
|
- acpi_status status;
|
|
-
|
|
- status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
|
|
- if (ACPI_FAILURE(status))
|
|
- return 1;
|
|
-
|
|
+ acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
|
|
check_multiple_madt();
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/acpi/video.c linux-2.6.29-rc3.owrt/drivers/acpi/video.c
|
|
--- linux-2.6.29.owrt/drivers/acpi/video.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/acpi/video.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1020,7 +1020,7 @@
|
|
}
|
|
|
|
seq_printf(seq, "levels: ");
|
|
- for (i = 2; i < dev->brightness->count; i++)
|
|
+ for (i = 0; i < dev->brightness->count; i++)
|
|
seq_printf(seq, " %d", dev->brightness->levels[i]);
|
|
seq_printf(seq, "\ncurrent: %d\n", dev->brightness->curr);
|
|
|
|
@@ -1059,7 +1059,7 @@
|
|
return -EFAULT;
|
|
|
|
/* validate through the list of available levels */
|
|
- for (i = 2; i < dev->brightness->count; i++)
|
|
+ for (i = 0; i < dev->brightness->count; i++)
|
|
if (level == dev->brightness->levels[i]) {
|
|
if (ACPI_SUCCESS
|
|
(acpi_video_device_lcd_set_level(dev, level)))
|
|
@@ -1260,7 +1260,7 @@
|
|
printk(KERN_WARNING PREFIX
|
|
"This indicates a BIOS bug. Please contact the manufacturer.\n");
|
|
}
|
|
- printk(KERN_WARNING "%llx\n", options);
|
|
+ printk("%llx\n", options);
|
|
seq_printf(seq, "can POST: <integrated video>");
|
|
if (options & 2)
|
|
seq_printf(seq, " <PCI video>");
|
|
@@ -1712,7 +1712,7 @@
|
|
max = max_below = 0;
|
|
min = min_above = 255;
|
|
/* Find closest level to level_current */
|
|
- for (i = 2; i < device->brightness->count; i++) {
|
|
+ for (i = 0; i < device->brightness->count; i++) {
|
|
l = device->brightness->levels[i];
|
|
if (abs(l - level_current) < abs(delta)) {
|
|
delta = l - level_current;
|
|
@@ -1722,7 +1722,7 @@
|
|
}
|
|
/* Ajust level_current to closest available level */
|
|
level_current += delta;
|
|
- for (i = 2; i < device->brightness->count; i++) {
|
|
+ for (i = 0; i < device->brightness->count; i++) {
|
|
l = device->brightness->levels[i];
|
|
if (l < min)
|
|
min = l;
|
|
@@ -2006,12 +2006,6 @@
|
|
device->pnp.bus_id[3] = '0' + instance;
|
|
instance ++;
|
|
}
|
|
- /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
|
|
- if (!strcmp(device->pnp.bus_id, "VGA")) {
|
|
- if (instance)
|
|
- device->pnp.bus_id[3] = '0' + instance;
|
|
- instance++;
|
|
- }
|
|
|
|
video->device = device;
|
|
strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/ahci.c linux-2.6.29-rc3.owrt/drivers/ata/ahci.c
|
|
--- linux-2.6.29.owrt/drivers/ata/ahci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/ahci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -61,14 +61,9 @@
|
|
#define EM_MSG_LED_VALUE_ON 0x00010000
|
|
|
|
static int ahci_skip_host_reset;
|
|
-static int ahci_ignore_sss;
|
|
-
|
|
module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444);
|
|
MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)");
|
|
|
|
-module_param_named(ignore_sss, ahci_ignore_sss, int, 0444);
|
|
-MODULE_PARM_DESC(ignore_sss, "Ignore staggered spinup flag (0=don't ignore, 1=ignore)");
|
|
-
|
|
static int ahci_enable_alpm(struct ata_port *ap,
|
|
enum link_pm policy);
|
|
static void ahci_disable_alpm(struct ata_port *ap);
|
|
@@ -582,18 +577,18 @@
|
|
{ PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci }, /* MCP79 */
|
|
{ PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci }, /* MCP79 */
|
|
{ PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci }, /* MCP79 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d84), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d85), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d86), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d87), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d88), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d89), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d8a), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d8b), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d8c), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d8d), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d8e), board_ahci }, /* MCP89 */
|
|
- { PCI_VDEVICE(NVIDIA, 0x0d8f), board_ahci }, /* MCP89 */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bc8), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bc9), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bca), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bcb), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bcc), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bcd), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bce), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bcf), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bc4), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bc5), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bc6), board_ahci }, /* MCP7B */
|
|
+ { PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */
|
|
|
|
/* SiS */
|
|
{ PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */
|
|
@@ -2697,10 +2692,8 @@
|
|
host->iomap = pcim_iomap_table(pdev);
|
|
host->private_data = hpriv;
|
|
|
|
- if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss)
|
|
+ if (!(hpriv->cap & HOST_CAP_SSS))
|
|
host->flags |= ATA_HOST_PARALLEL_SCAN;
|
|
- else
|
|
- printk(KERN_INFO "ahci: SSS flag set, parallel bus scan disabled\n");
|
|
|
|
if (pi.flags & ATA_FLAG_EM)
|
|
ahci_reset_em(host);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/ata_piix.c linux-2.6.29-rc3.owrt/drivers/ata/ata_piix.c
|
|
--- linux-2.6.29.owrt/drivers/ata/ata_piix.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/ata_piix.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1289,39 +1289,6 @@
|
|
return map;
|
|
}
|
|
|
|
-static bool piix_no_sidpr(struct ata_host *host)
|
|
-{
|
|
- struct pci_dev *pdev = to_pci_dev(host->dev);
|
|
-
|
|
- /*
|
|
- * Samsung DB-P70 only has three ATA ports exposed and
|
|
- * curiously the unconnected first port reports link online
|
|
- * while not responding to SRST protocol causing excessive
|
|
- * detection delay.
|
|
- *
|
|
- * Unfortunately, the system doesn't carry enough DMI
|
|
- * information to identify the machine but does have subsystem
|
|
- * vendor and device set. As it's unclear whether the
|
|
- * subsystem vendor/device is used only for this specific
|
|
- * board, the port can't be disabled solely with the
|
|
- * information; however, turning off SIDPR access works around
|
|
- * the problem. Turn it off.
|
|
- *
|
|
- * This problem is reported in bnc#441240.
|
|
- *
|
|
- * https://bugzilla.novell.com/show_bug.cgi?id=441420
|
|
- */
|
|
- if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == 0x2920 &&
|
|
- pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG &&
|
|
- pdev->subsystem_device == 0xb049) {
|
|
- dev_printk(KERN_WARNING, host->dev,
|
|
- "Samsung DB-P70 detected, disabling SIDPR\n");
|
|
- return true;
|
|
- }
|
|
-
|
|
- return false;
|
|
-}
|
|
-
|
|
static int __devinit piix_init_sidpr(struct ata_host *host)
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(host->dev);
|
|
@@ -1335,10 +1302,6 @@
|
|
if (hpriv->map[i] == IDE)
|
|
return 0;
|
|
|
|
- /* is it blacklisted? */
|
|
- if (piix_no_sidpr(host))
|
|
- return 0;
|
|
-
|
|
if (!(host->ports[0]->flags & PIIX_FLAG_SIDPR))
|
|
return 0;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/libata-core.c linux-2.6.29-rc3.owrt/drivers/ata/libata-core.c
|
|
--- linux-2.6.29.owrt/drivers/ata/libata-core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/libata-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -164,11 +164,6 @@
|
|
MODULE_VERSION(DRV_VERSION);
|
|
|
|
|
|
-static bool ata_sstatus_online(u32 sstatus)
|
|
-{
|
|
- return (sstatus & 0xf) == 0x3;
|
|
-}
|
|
-
|
|
/**
|
|
* ata_link_next - link iteration helper
|
|
* @link: the previous link, NULL to start
|
|
@@ -1020,6 +1015,18 @@
|
|
return spd_str[spd - 1];
|
|
}
|
|
|
|
+void ata_dev_disable(struct ata_device *dev)
|
|
+{
|
|
+ if (ata_dev_enabled(dev)) {
|
|
+ if (ata_msg_drv(dev->link->ap))
|
|
+ ata_dev_printk(dev, KERN_WARNING, "disabled\n");
|
|
+ ata_acpi_on_disable(dev);
|
|
+ ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 |
|
|
+ ATA_DNXFER_QUIET);
|
|
+ dev->class++;
|
|
+ }
|
|
+}
|
|
+
|
|
static int ata_dev_set_dipm(struct ata_device *dev, enum link_pm policy)
|
|
{
|
|
struct ata_link *link = dev->link;
|
|
@@ -1322,16 +1329,14 @@
|
|
{
|
|
if (ata_id_has_lba(id)) {
|
|
if (ata_id_has_lba48(id))
|
|
- return ata_id_u64(id, ATA_ID_LBA_CAPACITY_2);
|
|
+ return ata_id_u64(id, 100);
|
|
else
|
|
- return ata_id_u32(id, ATA_ID_LBA_CAPACITY);
|
|
+ return ata_id_u32(id, 60);
|
|
} else {
|
|
if (ata_id_current_chs_valid(id))
|
|
- return id[ATA_ID_CUR_CYLS] * id[ATA_ID_CUR_HEADS] *
|
|
- id[ATA_ID_CUR_SECTORS];
|
|
+ return ata_id_u32(id, 57);
|
|
else
|
|
- return id[ATA_ID_CYLS] * id[ATA_ID_HEADS] *
|
|
- id[ATA_ID_SECTORS];
|
|
+ return id[1] * id[3] * id[6];
|
|
}
|
|
}
|
|
|
|
@@ -2234,40 +2239,6 @@
|
|
return rc;
|
|
}
|
|
|
|
-static int ata_do_link_spd_horkage(struct ata_device *dev)
|
|
-{
|
|
- struct ata_link *plink = ata_dev_phys_link(dev);
|
|
- u32 target, target_limit;
|
|
-
|
|
- if (!sata_scr_valid(plink))
|
|
- return 0;
|
|
-
|
|
- if (dev->horkage & ATA_HORKAGE_1_5_GBPS)
|
|
- target = 1;
|
|
- else
|
|
- return 0;
|
|
-
|
|
- target_limit = (1 << target) - 1;
|
|
-
|
|
- /* if already on stricter limit, no need to push further */
|
|
- if (plink->sata_spd_limit <= target_limit)
|
|
- return 0;
|
|
-
|
|
- plink->sata_spd_limit = target_limit;
|
|
-
|
|
- /* Request another EH round by returning -EAGAIN if link is
|
|
- * going faster than the target speed. Forward progress is
|
|
- * guaranteed by setting sata_spd_limit to target_limit above.
|
|
- */
|
|
- if (plink->sata_spd > target) {
|
|
- ata_dev_printk(dev, KERN_INFO,
|
|
- "applying link speed limit horkage to %s\n",
|
|
- sata_spd_string(target));
|
|
- return -EAGAIN;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
static inline u8 ata_dev_knobble(struct ata_device *dev)
|
|
{
|
|
struct ata_port *ap = dev->link->ap;
|
|
@@ -2358,10 +2329,6 @@
|
|
return 0;
|
|
}
|
|
|
|
- rc = ata_do_link_spd_horkage(dev);
|
|
- if (rc)
|
|
- return rc;
|
|
-
|
|
/* let ACPI work its magic */
|
|
rc = ata_acpi_on_devcfg(dev);
|
|
if (rc)
|
|
@@ -2817,7 +2784,7 @@
|
|
/* This is the last chance, better to slow
|
|
* down than lose it.
|
|
*/
|
|
- sata_down_spd_limit(&ap->link, 0);
|
|
+ sata_down_spd_limit(&ap->link);
|
|
ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
|
|
}
|
|
}
|
|
@@ -2913,27 +2880,21 @@
|
|
/**
|
|
* sata_down_spd_limit - adjust SATA spd limit downward
|
|
* @link: Link to adjust SATA spd limit for
|
|
- * @spd_limit: Additional limit
|
|
*
|
|
* Adjust SATA spd limit of @link downward. Note that this
|
|
* function only adjusts the limit. The change must be applied
|
|
* using sata_set_spd().
|
|
*
|
|
- * If @spd_limit is non-zero, the speed is limited to equal to or
|
|
- * lower than @spd_limit if such speed is supported. If
|
|
- * @spd_limit is slower than any supported speed, only the lowest
|
|
- * supported speed is allowed.
|
|
- *
|
|
* LOCKING:
|
|
* Inherited from caller.
|
|
*
|
|
* RETURNS:
|
|
* 0 on success, negative errno on failure
|
|
*/
|
|
-int sata_down_spd_limit(struct ata_link *link, u32 spd_limit)
|
|
+int sata_down_spd_limit(struct ata_link *link)
|
|
{
|
|
u32 sstatus, spd, mask;
|
|
- int rc, bit;
|
|
+ int rc, highbit;
|
|
|
|
if (!sata_scr_valid(link))
|
|
return -EOPNOTSUPP;
|
|
@@ -2942,7 +2903,7 @@
|
|
* If not, use cached value in link->sata_spd.
|
|
*/
|
|
rc = sata_scr_read(link, SCR_STATUS, &sstatus);
|
|
- if (rc == 0 && ata_sstatus_online(sstatus))
|
|
+ if (rc == 0)
|
|
spd = (sstatus >> 4) & 0xf;
|
|
else
|
|
spd = link->sata_spd;
|
|
@@ -2952,8 +2913,8 @@
|
|
return -EINVAL;
|
|
|
|
/* unconditionally mask off the highest bit */
|
|
- bit = fls(mask) - 1;
|
|
- mask &= ~(1 << bit);
|
|
+ highbit = fls(mask) - 1;
|
|
+ mask &= ~(1 << highbit);
|
|
|
|
/* Mask off all speeds higher than or equal to the current
|
|
* one. Force 1.5Gbps if current SPD is not available.
|
|
@@ -2967,15 +2928,6 @@
|
|
if (!mask)
|
|
return -EINVAL;
|
|
|
|
- if (spd_limit) {
|
|
- if (mask & ((1 << spd_limit) - 1))
|
|
- mask &= (1 << spd_limit) - 1;
|
|
- else {
|
|
- bit = ffs(mask) - 1;
|
|
- mask = 1 << bit;
|
|
- }
|
|
- }
|
|
-
|
|
link->sata_spd_limit = mask;
|
|
|
|
ata_link_printk(link, KERN_WARNING, "limiting SATA link speed to %s\n",
|
|
@@ -4263,9 +4215,6 @@
|
|
/* Devices that do not need bridging limits applied */
|
|
{ "MTRON MSP-SATA*", NULL, ATA_HORKAGE_BRIDGE_OK, },
|
|
|
|
- /* Devices which aren't very happy with higher link speeds */
|
|
- { "WD My Book", NULL, ATA_HORKAGE_1_5_GBPS, },
|
|
-
|
|
/* End Marker */
|
|
{ }
|
|
};
|
|
@@ -4614,7 +4563,7 @@
|
|
VPRINTK("unmapping %u sg elements\n", qc->n_elem);
|
|
|
|
if (qc->n_elem)
|
|
- dma_unmap_sg(ap->dev, sg, qc->orig_n_elem, dir);
|
|
+ dma_unmap_sg(ap->dev, sg, qc->n_elem, dir);
|
|
|
|
qc->flags &= ~ATA_QCFLAG_DMAMAP;
|
|
qc->sg = NULL;
|
|
@@ -4729,7 +4678,7 @@
|
|
return -1;
|
|
|
|
DPRINTK("%d sg elements mapped\n", n_elem);
|
|
- qc->orig_n_elem = qc->n_elem;
|
|
+
|
|
qc->n_elem = n_elem;
|
|
qc->flags |= ATA_QCFLAG_DMAMAP;
|
|
|
|
@@ -4760,7 +4709,8 @@
|
|
|
|
/**
|
|
* ata_qc_new - Request an available ATA command, for queueing
|
|
- * @ap: target port
|
|
+ * @ap: Port associated with device @dev
|
|
+ * @dev: Device from whom we request an available command structure
|
|
*
|
|
* LOCKING:
|
|
* None.
|
|
@@ -5225,7 +5175,7 @@
|
|
u32 sstatus;
|
|
|
|
if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 &&
|
|
- ata_sstatus_online(sstatus))
|
|
+ (sstatus & 0xf) == 0x3)
|
|
return true;
|
|
return false;
|
|
}
|
|
@@ -5249,7 +5199,7 @@
|
|
u32 sstatus;
|
|
|
|
if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 &&
|
|
- !ata_sstatus_online(sstatus))
|
|
+ (sstatus & 0xf) != 0x3)
|
|
return true;
|
|
return false;
|
|
}
|
|
@@ -5462,8 +5412,8 @@
|
|
dev->horkage = 0;
|
|
spin_unlock_irqrestore(ap->lock, flags);
|
|
|
|
- memset((void *)dev + ATA_DEVICE_CLEAR_BEGIN, 0,
|
|
- ATA_DEVICE_CLEAR_END - ATA_DEVICE_CLEAR_BEGIN);
|
|
+ memset((void *)dev + ATA_DEVICE_CLEAR_OFFSET, 0,
|
|
+ sizeof(*dev) - ATA_DEVICE_CLEAR_OFFSET);
|
|
dev->pio_mask = UINT_MAX;
|
|
dev->mwdma_mask = UINT_MAX;
|
|
dev->udma_mask = UINT_MAX;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/libata-eh.c linux-2.6.29-rc3.owrt/drivers/ata/libata-eh.c
|
|
--- linux-2.6.29.owrt/drivers/ata/libata-eh.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/libata-eh.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -82,10 +82,6 @@
|
|
ATA_EH_FASTDRAIN_INTERVAL = 3000,
|
|
|
|
ATA_EH_UA_TRIES = 5,
|
|
-
|
|
- /* probe speed down parameters, see ata_eh_schedule_probe() */
|
|
- ATA_EH_PROBE_TRIAL_INTERVAL = 60000, /* 1 min */
|
|
- ATA_EH_PROBE_TRIALS = 2,
|
|
};
|
|
|
|
/* The following table determines how we sequence resets. Each entry
|
|
@@ -1180,32 +1176,6 @@
|
|
}
|
|
|
|
/**
|
|
- * ata_dev_disable - disable ATA device
|
|
- * @dev: ATA device to disable
|
|
- *
|
|
- * Disable @dev.
|
|
- *
|
|
- * Locking:
|
|
- * EH context.
|
|
- */
|
|
-void ata_dev_disable(struct ata_device *dev)
|
|
-{
|
|
- if (!ata_dev_enabled(dev))
|
|
- return;
|
|
-
|
|
- if (ata_msg_drv(dev->link->ap))
|
|
- ata_dev_printk(dev, KERN_WARNING, "disabled\n");
|
|
- ata_acpi_on_disable(dev);
|
|
- ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 | ATA_DNXFER_QUIET);
|
|
- dev->class++;
|
|
-
|
|
- /* From now till the next successful probe, ering is used to
|
|
- * track probe failures. Clear accumulated device error info.
|
|
- */
|
|
- ata_ering_clear(&dev->ering);
|
|
-}
|
|
-
|
|
-/**
|
|
* ata_eh_detach_dev - detach ATA device
|
|
* @dev: ATA device to detach
|
|
*
|
|
@@ -1879,7 +1849,7 @@
|
|
/* speed down? */
|
|
if (verdict & ATA_EH_SPDN_SPEED_DOWN) {
|
|
/* speed down SATA link speed if possible */
|
|
- if (sata_down_spd_limit(link, 0) == 0) {
|
|
+ if (sata_down_spd_limit(link) == 0) {
|
|
action |= ATA_EH_RESET;
|
|
goto done;
|
|
}
|
|
@@ -2423,14 +2393,11 @@
|
|
}
|
|
|
|
/* prereset() might have cleared ATA_EH_RESET. If so,
|
|
- * bang classes, thaw and return.
|
|
+ * bang classes and return.
|
|
*/
|
|
if (reset && !(ehc->i.action & ATA_EH_RESET)) {
|
|
ata_for_each_dev(dev, link, ALL)
|
|
classes[dev->devno] = ATA_DEV_NONE;
|
|
- if ((ap->pflags & ATA_PFLAG_FROZEN) &&
|
|
- ata_is_host_link(link))
|
|
- ata_eh_thaw_port(ap);
|
|
rc = 0;
|
|
goto out;
|
|
}
|
|
@@ -2634,11 +2601,11 @@
|
|
}
|
|
|
|
if (try == max_tries - 1) {
|
|
- sata_down_spd_limit(link, 0);
|
|
+ sata_down_spd_limit(link);
|
|
if (slave)
|
|
- sata_down_spd_limit(slave, 0);
|
|
+ sata_down_spd_limit(slave);
|
|
} else if (rc == -EPIPE)
|
|
- sata_down_spd_limit(failed_link, 0);
|
|
+ sata_down_spd_limit(failed_link);
|
|
|
|
if (hardreset)
|
|
reset = hardreset;
|
|
@@ -2777,8 +2744,6 @@
|
|
readid_flags, dev->id);
|
|
switch (rc) {
|
|
case 0:
|
|
- /* clear error info accumulated during probe */
|
|
- ata_ering_clear(&dev->ering);
|
|
new_mask |= 1 << dev->devno;
|
|
break;
|
|
case -ENOENT:
|
|
@@ -2904,7 +2869,7 @@
|
|
int i;
|
|
|
|
for (i = 0; i < ATA_EH_UA_TRIES; i++) {
|
|
- u8 *sense_buffer = dev->link->ap->sector_buf;
|
|
+ u8 sense_buffer[SCSI_SENSE_BUFFERSIZE];
|
|
u8 sense_key = 0;
|
|
unsigned int err_mask;
|
|
|
|
@@ -2982,24 +2947,9 @@
|
|
return 1;
|
|
}
|
|
|
|
-static int ata_count_probe_trials_cb(struct ata_ering_entry *ent, void *void_arg)
|
|
-{
|
|
- u64 interval = msecs_to_jiffies(ATA_EH_PROBE_TRIAL_INTERVAL);
|
|
- u64 now = get_jiffies_64();
|
|
- int *trials = void_arg;
|
|
-
|
|
- if (ent->timestamp < now - min(now, interval))
|
|
- return -1;
|
|
-
|
|
- (*trials)++;
|
|
- return 0;
|
|
-}
|
|
-
|
|
static int ata_eh_schedule_probe(struct ata_device *dev)
|
|
{
|
|
struct ata_eh_context *ehc = &dev->link->eh_context;
|
|
- struct ata_link *link = ata_dev_phys_link(dev);
|
|
- int trials = 0;
|
|
|
|
if (!(ehc->i.probe_mask & (1 << dev->devno)) ||
|
|
(ehc->did_probe_mask & (1 << dev->devno)))
|
|
@@ -3012,25 +2962,6 @@
|
|
ehc->saved_xfer_mode[dev->devno] = 0;
|
|
ehc->saved_ncq_enabled &= ~(1 << dev->devno);
|
|
|
|
- /* Record and count probe trials on the ering. The specific
|
|
- * error mask used is irrelevant. Because a successful device
|
|
- * detection clears the ering, this count accumulates only if
|
|
- * there are consecutive failed probes.
|
|
- *
|
|
- * If the count is equal to or higher than ATA_EH_PROBE_TRIALS
|
|
- * in the last ATA_EH_PROBE_TRIAL_INTERVAL, link speed is
|
|
- * forced to 1.5Gbps.
|
|
- *
|
|
- * This is to work around cases where failed link speed
|
|
- * negotiation results in device misdetection leading to
|
|
- * infinite DEVXCHG or PHRDY CHG events.
|
|
- */
|
|
- ata_ering_record(&dev->ering, 0, AC_ERR_OTHER);
|
|
- ata_ering_map(&dev->ering, ata_count_probe_trials_cb, &trials);
|
|
-
|
|
- if (trials > ATA_EH_PROBE_TRIALS)
|
|
- sata_down_spd_limit(link, 1);
|
|
-
|
|
return 1;
|
|
}
|
|
|
|
@@ -3038,11 +2969,7 @@
|
|
{
|
|
struct ata_eh_context *ehc = &dev->link->eh_context;
|
|
|
|
- /* -EAGAIN from EH routine indicates retry without prejudice.
|
|
- * The requester is responsible for ensuring forward progress.
|
|
- */
|
|
- if (err != -EAGAIN)
|
|
- ehc->tries[dev->devno]--;
|
|
+ ehc->tries[dev->devno]--;
|
|
|
|
switch (err) {
|
|
case -ENODEV:
|
|
@@ -3052,13 +2979,12 @@
|
|
/* give it just one more chance */
|
|
ehc->tries[dev->devno] = min(ehc->tries[dev->devno], 1);
|
|
case -EIO:
|
|
- if (ehc->tries[dev->devno] == 1) {
|
|
+ if (ehc->tries[dev->devno] == 1 && dev->pio_mode > XFER_PIO_0) {
|
|
/* This is the last chance, better to slow
|
|
* down than lose it.
|
|
*/
|
|
- sata_down_spd_limit(ata_dev_phys_link(dev), 0);
|
|
- if (dev->pio_mode > XFER_PIO_0)
|
|
- ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
|
|
+ sata_down_spd_limit(ata_dev_phys_link(dev));
|
|
+ ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/libata.h linux-2.6.29-rc3.owrt/drivers/ata/libata.h
|
|
--- linux-2.6.29.owrt/drivers/ata/libata.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/libata.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -79,6 +79,7 @@
|
|
u64 block, u32 n_block, unsigned int tf_flags,
|
|
unsigned int tag);
|
|
extern u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev);
|
|
+extern void ata_dev_disable(struct ata_device *dev);
|
|
extern void ata_pio_queue_task(struct ata_port *ap, void *data,
|
|
unsigned long delay);
|
|
extern void ata_port_flush_task(struct ata_port *ap);
|
|
@@ -99,7 +100,7 @@
|
|
extern int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
|
|
unsigned int readid_flags);
|
|
extern int ata_dev_configure(struct ata_device *dev);
|
|
-extern int sata_down_spd_limit(struct ata_link *link, u32 spd_limit);
|
|
+extern int sata_down_spd_limit(struct ata_link *link);
|
|
extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel);
|
|
extern void ata_sg_clean(struct ata_queued_cmd *qc);
|
|
extern void ata_qc_free(struct ata_queued_cmd *qc);
|
|
@@ -159,7 +160,6 @@
|
|
extern void ata_port_wait_eh(struct ata_port *ap);
|
|
extern void ata_eh_fastdrain_timerfn(unsigned long arg);
|
|
extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
|
|
-extern void ata_dev_disable(struct ata_device *dev);
|
|
extern void ata_eh_detach_dev(struct ata_device *dev);
|
|
extern void ata_eh_about_to_do(struct ata_link *link, struct ata_device *dev,
|
|
unsigned int action);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/libata-pmp.c linux-2.6.29-rc3.owrt/drivers/ata/libata-pmp.c
|
|
--- linux-2.6.29.owrt/drivers/ata/libata-pmp.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/libata-pmp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -729,7 +729,7 @@
|
|
if (tries) {
|
|
/* consecutive revalidation failures? speed down */
|
|
if (reval_failed)
|
|
- sata_down_spd_limit(link, 0);
|
|
+ sata_down_spd_limit(link);
|
|
else
|
|
reval_failed = 1;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/libata-scsi.c linux-2.6.29-rc3.owrt/drivers/ata/libata-scsi.c
|
|
--- linux-2.6.29.owrt/drivers/ata/libata-scsi.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/libata-scsi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -415,7 +415,6 @@
|
|
|
|
/**
|
|
* ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl
|
|
- * @ap: target port
|
|
* @sdev: SCSI device to get identify data for
|
|
* @arg: User buffer area for identify data
|
|
*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/libata-sff.c linux-2.6.29-rc3.owrt/drivers/ata/libata-sff.c
|
|
--- linux-2.6.29.owrt/drivers/ata/libata-sff.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/libata-sff.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -773,32 +773,18 @@
|
|
else
|
|
iowrite32_rep(data_addr, buf, words);
|
|
|
|
- /* Transfer trailing bytes, if any */
|
|
if (unlikely(slop)) {
|
|
- unsigned char pad[4];
|
|
-
|
|
- /* Point buf to the tail of buffer */
|
|
- buf += buflen - slop;
|
|
-
|
|
- /*
|
|
- * Use io*_rep() accessors here as well to avoid pointlessly
|
|
- * swapping bytes to and fro on the big endian machines...
|
|
- */
|
|
+ __le32 pad;
|
|
if (rw == READ) {
|
|
- if (slop < 3)
|
|
- ioread16_rep(data_addr, pad, 1);
|
|
- else
|
|
- ioread32_rep(data_addr, pad, 1);
|
|
- memcpy(buf, pad, slop);
|
|
+ pad = cpu_to_le32(ioread32(ap->ioaddr.data_addr));
|
|
+ memcpy(buf + buflen - slop, &pad, slop);
|
|
} else {
|
|
- memcpy(pad, buf, slop);
|
|
- if (slop < 3)
|
|
- iowrite16_rep(data_addr, pad, 1);
|
|
- else
|
|
- iowrite32_rep(data_addr, pad, 1);
|
|
+ memcpy(&pad, buf + buflen - slop, slop);
|
|
+ iowrite32(le32_to_cpu(pad), ap->ioaddr.data_addr);
|
|
}
|
|
+ words++;
|
|
}
|
|
- return (buflen + 1) & ~1;
|
|
+ return words << 2;
|
|
}
|
|
EXPORT_SYMBOL_GPL(ata_sff_data_xfer32);
|
|
|
|
@@ -2066,7 +2052,6 @@
|
|
iowrite8(ap->ctl | ATA_SRST, ioaddr->ctl_addr);
|
|
udelay(20); /* FIXME: flush */
|
|
iowrite8(ap->ctl, ioaddr->ctl_addr);
|
|
- ap->last_ctl = ap->ctl;
|
|
|
|
/* wait the port to become ready */
|
|
return ata_sff_wait_after_reset(&ap->link, devmask, deadline);
|
|
@@ -2191,10 +2176,8 @@
|
|
}
|
|
|
|
/* set up device control */
|
|
- if (ap->ioaddr.ctl_addr) {
|
|
+ if (ap->ioaddr.ctl_addr)
|
|
iowrite8(ap->ctl, ap->ioaddr.ctl_addr);
|
|
- ap->last_ctl = ap->ctl;
|
|
- }
|
|
}
|
|
EXPORT_SYMBOL_GPL(ata_sff_postreset);
|
|
|
|
@@ -2537,7 +2520,6 @@
|
|
if (ap->flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST)) {
|
|
/* set up device control for ATA_FLAG_SATA_RESET */
|
|
iowrite8(ap->ctl, ioaddr->ctl_addr);
|
|
- ap->last_ctl = ap->ctl;
|
|
}
|
|
|
|
DPRINTK("EXIT\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/pata_amd.c linux-2.6.29-rc3.owrt/drivers/ata/pata_amd.c
|
|
--- linux-2.6.29.owrt/drivers/ata/pata_amd.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/pata_amd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -24,7 +24,7 @@
|
|
#include <linux/libata.h>
|
|
|
|
#define DRV_NAME "pata_amd"
|
|
-#define DRV_VERSION "0.4.1"
|
|
+#define DRV_VERSION "0.3.11"
|
|
|
|
/**
|
|
* timing_setup - shared timing computation and load
|
|
@@ -145,13 +145,6 @@
|
|
return ata_sff_prereset(link, deadline);
|
|
}
|
|
|
|
-/**
|
|
- * amd_cable_detect - report cable type
|
|
- * @ap: port
|
|
- *
|
|
- * AMD controller/BIOS setups record the cable type in word 0x42
|
|
- */
|
|
-
|
|
static int amd_cable_detect(struct ata_port *ap)
|
|
{
|
|
static const u32 bitmask[2] = {0x03, 0x0C};
|
|
@@ -165,40 +158,6 @@
|
|
}
|
|
|
|
/**
|
|
- * amd_fifo_setup - set the PIO FIFO for ATA/ATAPI
|
|
- * @ap: ATA interface
|
|
- * @adev: ATA device
|
|
- *
|
|
- * Set the PCI fifo for this device according to the devices present
|
|
- * on the bus at this point in time. We need to turn the post write buffer
|
|
- * off for ATAPI devices as we may need to issue a word sized write to the
|
|
- * device as the final I/O
|
|
- */
|
|
-
|
|
-static void amd_fifo_setup(struct ata_port *ap)
|
|
-{
|
|
- struct ata_device *adev;
|
|
- struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
- static const u8 fifobit[2] = { 0xC0, 0x30};
|
|
- u8 fifo = fifobit[ap->port_no];
|
|
- u8 r;
|
|
-
|
|
-
|
|
- ata_for_each_dev(adev, &ap->link, ENABLED) {
|
|
- if (adev->class == ATA_DEV_ATAPI)
|
|
- fifo = 0;
|
|
- }
|
|
- if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7411) /* FIFO is broken */
|
|
- fifo = 0;
|
|
-
|
|
- /* On the later chips the read prefetch bits become no-op bits */
|
|
- pci_read_config_byte(pdev, 0x41, &r);
|
|
- r &= ~fifobit[ap->port_no];
|
|
- r |= fifo;
|
|
- pci_write_config_byte(pdev, 0x41, r);
|
|
-}
|
|
-
|
|
-/**
|
|
* amd33_set_piomode - set initial PIO mode data
|
|
* @ap: ATA interface
|
|
* @adev: ATA device
|
|
@@ -208,25 +167,21 @@
|
|
|
|
static void amd33_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
|
{
|
|
- amd_fifo_setup(ap);
|
|
timing_setup(ap, adev, 0x40, adev->pio_mode, 1);
|
|
}
|
|
|
|
static void amd66_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
|
{
|
|
- amd_fifo_setup(ap);
|
|
timing_setup(ap, adev, 0x40, adev->pio_mode, 2);
|
|
}
|
|
|
|
static void amd100_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
|
{
|
|
- amd_fifo_setup(ap);
|
|
timing_setup(ap, adev, 0x40, adev->pio_mode, 3);
|
|
}
|
|
|
|
static void amd133_set_piomode(struct ata_port *ap, struct ata_device *adev)
|
|
{
|
|
- amd_fifo_setup(ap);
|
|
timing_setup(ap, adev, 0x40, adev->pio_mode, 4);
|
|
}
|
|
|
|
@@ -442,16 +397,6 @@
|
|
.set_dmamode = nv133_set_dmamode,
|
|
};
|
|
|
|
-static void amd_clear_fifo(struct pci_dev *pdev)
|
|
-{
|
|
- u8 fifo;
|
|
- /* Disable the FIFO, the FIFO logic will re-enable it as
|
|
- appropriate */
|
|
- pci_read_config_byte(pdev, 0x41, &fifo);
|
|
- fifo &= 0x0F;
|
|
- pci_write_config_byte(pdev, 0x41, fifo);
|
|
-}
|
|
-
|
|
static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
{
|
|
static const struct ata_port_info info[10] = {
|
|
@@ -558,8 +503,14 @@
|
|
|
|
if (type < 3)
|
|
ata_pci_bmdma_clear_simplex(pdev);
|
|
- if (pdev->vendor == PCI_VENDOR_ID_AMD)
|
|
- amd_clear_fifo(pdev);
|
|
+
|
|
+ /* Check for AMD7411 */
|
|
+ if (type == 3)
|
|
+ /* FIFO is broken */
|
|
+ pci_write_config_byte(pdev, 0x41, fifo & 0x0F);
|
|
+ else
|
|
+ pci_write_config_byte(pdev, 0x41, fifo | 0xF0);
|
|
+
|
|
/* Cable detection on Nvidia chips doesn't work too well,
|
|
* cache BIOS programmed UDMA mode.
|
|
*/
|
|
@@ -585,11 +536,18 @@
|
|
return rc;
|
|
|
|
if (pdev->vendor == PCI_VENDOR_ID_AMD) {
|
|
- amd_clear_fifo(pdev);
|
|
+ u8 fifo;
|
|
+ pci_read_config_byte(pdev, 0x41, &fifo);
|
|
+ if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7411)
|
|
+ /* FIFO is broken */
|
|
+ pci_write_config_byte(pdev, 0x41, fifo & 0x0F);
|
|
+ else
|
|
+ pci_write_config_byte(pdev, 0x41, fifo | 0xF0);
|
|
if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7409 ||
|
|
pdev->device == PCI_DEVICE_ID_AMD_COBRA_7401)
|
|
ata_pci_bmdma_clear_simplex(pdev);
|
|
}
|
|
+
|
|
ata_host_resume(host);
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/pata_it821x.c linux-2.6.29-rc3.owrt/drivers/ata/pata_it821x.c
|
|
--- linux-2.6.29.owrt/drivers/ata/pata_it821x.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/pata_it821x.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -557,9 +557,6 @@
|
|
id[83] |= 0x4400; /* Word 83 is valid and LBA48 */
|
|
id[86] |= 0x0400; /* LBA48 on */
|
|
id[ATA_ID_MAJOR_VER] |= 0x1F;
|
|
- /* Clear the serial number because it's different each boot
|
|
- which breaks validation on resume */
|
|
- memset(&id[ATA_ID_SERNO], 0x20, ATA_ID_SERNO_LEN);
|
|
}
|
|
return err_mask;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/pata_legacy.c linux-2.6.29-rc3.owrt/drivers/ata/pata_legacy.c
|
|
--- linux-2.6.29.owrt/drivers/ata/pata_legacy.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/pata_legacy.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -283,10 +283,9 @@
|
|
static unsigned int pdc_data_xfer_vlb(struct ata_device *dev,
|
|
unsigned char *buf, unsigned int buflen, int rw)
|
|
{
|
|
- int slop = buflen & 3;
|
|
- /* 32bit I/O capable *and* we need to write a whole number of dwords */
|
|
- if (ata_id_has_dword_io(dev->id) && (slop == 0 || slop == 3)) {
|
|
+ if (ata_id_has_dword_io(dev->id)) {
|
|
struct ata_port *ap = dev->link->ap;
|
|
+ int slop = buflen & 3;
|
|
unsigned long flags;
|
|
|
|
local_irq_save(flags);
|
|
@@ -736,7 +735,7 @@
|
|
struct ata_port *ap = adev->link->ap;
|
|
int slop = buflen & 3;
|
|
|
|
- if (ata_id_has_dword_io(adev->id) && (slop == 0 || slop == 3)) {
|
|
+ if (ata_id_has_dword_io(adev->id)) {
|
|
if (rw == WRITE)
|
|
iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
|
|
else
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/pata_qdi.c linux-2.6.29-rc3.owrt/drivers/ata/pata_qdi.c
|
|
--- linux-2.6.29.owrt/drivers/ata/pata_qdi.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/pata_qdi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -12,7 +12,7 @@
|
|
*
|
|
* Probe code based on drivers/ide/legacy/qd65xx.c
|
|
* Rewritten from the work of Colten Edwards <pje120@cs.usask.ca> by
|
|
- * Samuel Thibault <samuel.thibault@ens-lyon.org>
|
|
+ * Samuel Thibault <samuel.thibault@fnac.net>
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/pata_via.c linux-2.6.29-rc3.owrt/drivers/ata/pata_via.c
|
|
--- linux-2.6.29.owrt/drivers/ata/pata_via.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/pata_via.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -110,8 +110,7 @@
|
|
{ "vt8237s", PCI_DEVICE_ID_VIA_8237S, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
|
{ "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
|
{ "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA },
|
|
- { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
|
|
- { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
|
|
+ { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES},
|
|
{ "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
|
{ "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
|
{ "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
|
|
@@ -594,7 +593,6 @@
|
|
#endif
|
|
|
|
static const struct pci_device_id via[] = {
|
|
- { PCI_VDEVICE(VIA, 0x0415), },
|
|
{ PCI_VDEVICE(VIA, 0x0571), },
|
|
{ PCI_VDEVICE(VIA, 0x0581), },
|
|
{ PCI_VDEVICE(VIA, 0x1571), },
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/sata_mv.c linux-2.6.29-rc3.owrt/drivers/ata/sata_mv.c
|
|
--- linux-2.6.29.owrt/drivers/ata/sata_mv.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/sata_mv.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -663,8 +663,8 @@
|
|
{ PCI_VDEVICE(MARVELL, 0x5081), chip_508x },
|
|
/* RocketRAID 1720/174x have different identifiers */
|
|
{ PCI_VDEVICE(TTI, 0x1720), chip_6042 },
|
|
- { PCI_VDEVICE(TTI, 0x1740), chip_6042 },
|
|
- { PCI_VDEVICE(TTI, 0x1742), chip_6042 },
|
|
+ { PCI_VDEVICE(TTI, 0x1740), chip_508x },
|
|
+ { PCI_VDEVICE(TTI, 0x1742), chip_508x },
|
|
|
|
{ PCI_VDEVICE(MARVELL, 0x6040), chip_604x },
|
|
{ PCI_VDEVICE(MARVELL, 0x6041), chip_604x },
|
|
@@ -2218,13 +2218,12 @@
|
|
else
|
|
handled = mv_host_intr(host, pending_irqs);
|
|
}
|
|
+ spin_unlock(&host->lock);
|
|
|
|
/* for MSI: unmask; interrupt cause bits will retrigger now */
|
|
if (using_msi)
|
|
writel(hpriv->main_irq_mask, hpriv->main_irq_mask_addr);
|
|
|
|
- spin_unlock(&host->lock);
|
|
-
|
|
return IRQ_RETVAL(handled);
|
|
}
|
|
|
|
@@ -3115,17 +3114,19 @@
|
|
writelfl(0, hc_mmio + HC_IRQ_CAUSE_OFS);
|
|
}
|
|
|
|
- /* Clear any currently outstanding host interrupt conditions */
|
|
- writelfl(0, mmio + hpriv->irq_cause_ofs);
|
|
+ if (!IS_SOC(hpriv)) {
|
|
+ /* Clear any currently outstanding host interrupt conditions */
|
|
+ writelfl(0, mmio + hpriv->irq_cause_ofs);
|
|
|
|
- /* and unmask interrupt generation for host regs */
|
|
- writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
|
|
+ /* and unmask interrupt generation for host regs */
|
|
+ writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
|
|
|
|
- /*
|
|
- * enable only global host interrupts for now.
|
|
- * The per-port interrupts get done later as ports are set up.
|
|
- */
|
|
- mv_set_main_irq_mask(host, 0, PCI_ERR);
|
|
+ /*
|
|
+ * enable only global host interrupts for now.
|
|
+ * The per-port interrupts get done later as ports are set up.
|
|
+ */
|
|
+ mv_set_main_irq_mask(host, 0, PCI_ERR);
|
|
+ }
|
|
done:
|
|
return rc;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/sata_nv.c linux-2.6.29-rc3.owrt/drivers/ata/sata_nv.c
|
|
--- linux-2.6.29.owrt/drivers/ata/sata_nv.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/sata_nv.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -421,33 +421,26 @@
|
|
.hardreset = ATA_OP_NULL,
|
|
};
|
|
|
|
-/* nf2 is ripe with hardreset related problems.
|
|
- *
|
|
- * kernel bz#3352 reports nf2/3 controllers can't determine device
|
|
- * signature reliably. The following thread reports detection failure
|
|
- * on cold boot with the standard debouncing timing.
|
|
+/* OSDL bz3352 reports that nf2/3 controllers can't determine device
|
|
+ * signature reliably. Also, the following thread reports detection
|
|
+ * failure on cold boot with the standard debouncing timing.
|
|
*
|
|
* http://thread.gmane.org/gmane.linux.ide/34098
|
|
*
|
|
- * And bz#12176 reports that hardreset simply doesn't work on nf2.
|
|
- * Give up on it and just don't do hardreset.
|
|
+ * Debounce with hotplug timing and request follow-up SRST.
|
|
*/
|
|
static struct ata_port_operations nv_nf2_ops = {
|
|
- .inherits = &nv_generic_ops,
|
|
+ .inherits = &nv_common_ops,
|
|
.freeze = nv_nf2_freeze,
|
|
.thaw = nv_nf2_thaw,
|
|
+ .hardreset = nv_noclassify_hardreset,
|
|
};
|
|
|
|
-/* For initial probing after boot and hot plugging, hardreset mostly
|
|
- * works fine on CK804 but curiously, reprobing on the initial port by
|
|
- * rescanning or rmmod/insmod fails to acquire the initial D2H Reg FIS
|
|
- * in somewhat undeterministic way. Use noclassify hardreset.
|
|
- */
|
|
+/* CK804 finally gets hardreset right */
|
|
static struct ata_port_operations nv_ck804_ops = {
|
|
.inherits = &nv_common_ops,
|
|
.freeze = nv_ck804_freeze,
|
|
.thaw = nv_ck804_thaw,
|
|
- .hardreset = nv_noclassify_hardreset,
|
|
.host_stop = nv_ck804_host_stop,
|
|
};
|
|
|
|
@@ -2523,7 +2516,7 @@
|
|
module_init(nv_init);
|
|
module_exit(nv_exit);
|
|
module_param_named(adma, adma_enabled, bool, 0444);
|
|
-MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)");
|
|
+MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: true)");
|
|
module_param_named(swncq, swncq_enabled, bool, 0444);
|
|
MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)");
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ata/sata_sil.c linux-2.6.29-rc3.owrt/drivers/ata/sata_sil.c
|
|
--- linux-2.6.29.owrt/drivers/ata/sata_sil.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ata/sata_sil.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -44,7 +44,6 @@
|
|
#include <linux/device.h>
|
|
#include <scsi/scsi_host.h>
|
|
#include <linux/libata.h>
|
|
-#include <linux/dmi.h>
|
|
|
|
#define DRV_NAME "sata_sil"
|
|
#define DRV_VERSION "2.4"
|
|
@@ -324,7 +323,7 @@
|
|
|
|
prd->addr = cpu_to_le32(addr);
|
|
prd->flags_len = cpu_to_le32(sg_len);
|
|
- VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", si, addr, sg_len);
|
|
+ VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", pi, addr, sg_len);
|
|
|
|
last_prd = prd;
|
|
prd++;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/atm/fore200e.c linux-2.6.29-rc3.owrt/drivers/atm/fore200e.c
|
|
--- linux-2.6.29.owrt/drivers/atm/fore200e.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/atm/fore200e.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2519,8 +2519,8 @@
|
|
return err;
|
|
|
|
sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT);
|
|
- if ((err = request_firmware(&firmware, buf, device)) < 0) {
|
|
- printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name);
|
|
+ if (request_firmware(&firmware, buf, device) == 1) {
|
|
+ printk(FORE200E "missing %s firmware image\n", fore200e->bus->model_name);
|
|
return err;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/atm/lanai.c linux-2.6.29-rc3.owrt/drivers/atm/lanai.c
|
|
--- linux-2.6.29.owrt/drivers/atm/lanai.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/atm/lanai.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -901,7 +901,7 @@
|
|
clock_l(); udelay(5);
|
|
for (i = 128; i != 0; i >>= 1) { /* write command out */
|
|
tmp = (lanai->conf1 & ~CONFIG1_PROMDATA) |
|
|
- ((data & i) ? CONFIG1_PROMDATA : 0);
|
|
+ (data & i) ? CONFIG1_PROMDATA : 0;
|
|
if (lanai->conf1 != tmp) {
|
|
set_config1(tmp);
|
|
udelay(5); /* Let new data settle */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/atm/solos-pci.c linux-2.6.29-rc3.owrt/drivers/atm/solos-pci.c
|
|
--- linux-2.6.29.owrt/drivers/atm/solos-pci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/atm/solos-pci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -685,7 +685,6 @@
|
|
out_release_regions:
|
|
pci_release_regions(dev);
|
|
out:
|
|
- kfree(card);
|
|
return err;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/base/base.h linux-2.6.29-rc3.owrt/drivers/base/base.h
|
|
--- linux-2.6.29.owrt/drivers/base/base.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/base/base.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -88,6 +88,8 @@
|
|
extern int driver_probe_device(struct device_driver *drv, struct device *dev);
|
|
|
|
extern void sysdev_shutdown(void);
|
|
+extern int sysdev_suspend(pm_message_t state);
|
|
+extern int sysdev_resume(void);
|
|
|
|
extern char *make_class_name(const char *name, struct kobject *kobj);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/base/core.c linux-2.6.29-rc3.owrt/drivers/base/core.c
|
|
--- linux-2.6.29.owrt/drivers/base/core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/base/core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1280,7 +1280,7 @@
|
|
|
|
/**
|
|
* root_device_unregister - unregister and free a root device
|
|
- * @dev: device going away
|
|
+ * @root: device going away.
|
|
*
|
|
* This function unregisters and cleans up a device that was created by
|
|
* root_device_register().
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/base/dd.c linux-2.6.29-rc3.owrt/drivers/base/dd.c
|
|
--- linux-2.6.29.owrt/drivers/base/dd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/base/dd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -18,11 +18,9 @@
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
-#include <linux/delay.h>
|
|
#include <linux/module.h>
|
|
#include <linux/kthread.h>
|
|
#include <linux/wait.h>
|
|
-#include <linux/async.h>
|
|
|
|
#include "base.h"
|
|
#include "power/power.h"
|
|
@@ -170,21 +168,6 @@
|
|
}
|
|
|
|
/**
|
|
- * wait_for_device_probe
|
|
- * Wait for device probing to be completed.
|
|
- *
|
|
- * Note: this function polls at 100 msec intervals.
|
|
- */
|
|
-int wait_for_device_probe(void)
|
|
-{
|
|
- /* wait for the known devices to complete their probing */
|
|
- while (driver_probe_done() != 0)
|
|
- msleep(100);
|
|
- async_synchronize_full();
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/**
|
|
* driver_probe_device - attempt to bind device & driver together
|
|
* @drv: driver to bind a device to
|
|
* @dev: device to try to bind to the driver
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/base/node.c linux-2.6.29-rc3.owrt/drivers/base/node.c
|
|
--- linux-2.6.29.owrt/drivers/base/node.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/base/node.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -303,7 +303,7 @@
|
|
sect_start_pfn = section_nr_to_pfn(mem_blk->phys_index);
|
|
sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1;
|
|
for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
|
|
- int nid;
|
|
+ unsigned int nid;
|
|
|
|
nid = get_nid_for_pfn(pfn);
|
|
if (nid < 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/base/power/main.c linux-2.6.29-rc3.owrt/drivers/base/power/main.c
|
|
--- linux-2.6.29.owrt/drivers/base/power/main.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/base/power/main.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -333,6 +333,7 @@
|
|
*/
|
|
void device_power_up(pm_message_t state)
|
|
{
|
|
+ sysdev_resume();
|
|
dpm_power_up(state);
|
|
}
|
|
EXPORT_SYMBOL_GPL(device_power_up);
|
|
@@ -576,6 +577,8 @@
|
|
}
|
|
dev->power.status = DPM_OFF_IRQ;
|
|
}
|
|
+ if (!error)
|
|
+ error = sysdev_suspend(state);
|
|
if (error)
|
|
dpm_power_up(resume_event(state));
|
|
return error;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/base/sys.c linux-2.6.29-rc3.owrt/drivers/base/sys.c
|
|
--- linux-2.6.29.owrt/drivers/base/sys.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/base/sys.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -303,6 +303,7 @@
|
|
* is guaranteed by virtue of the fact that child devices are registered
|
|
* after their parents.
|
|
*/
|
|
+
|
|
void sysdev_shutdown(void)
|
|
{
|
|
struct sysdev_class * cls;
|
|
@@ -362,6 +363,7 @@
|
|
* This is only called by the device PM core, so we let them handle
|
|
* all synchronization.
|
|
*/
|
|
+
|
|
int sysdev_suspend(pm_message_t state)
|
|
{
|
|
struct sysdev_class * cls;
|
|
@@ -430,7 +432,7 @@
|
|
}
|
|
return ret;
|
|
}
|
|
-EXPORT_SYMBOL_GPL(sysdev_suspend);
|
|
+
|
|
|
|
/**
|
|
* sysdev_resume - Bring system devices back to life.
|
|
@@ -440,6 +442,7 @@
|
|
*
|
|
* Note: Interrupts are disabled when called.
|
|
*/
|
|
+
|
|
int sysdev_resume(void)
|
|
{
|
|
struct sysdev_class * cls;
|
|
@@ -460,7 +463,7 @@
|
|
}
|
|
return 0;
|
|
}
|
|
-EXPORT_SYMBOL_GPL(sysdev_resume);
|
|
+
|
|
|
|
int __init system_bus_init(void)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/aoe/aoedev.c linux-2.6.29-rc3.owrt/drivers/block/aoe/aoedev.c
|
|
--- linux-2.6.29.owrt/drivers/block/aoe/aoedev.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/aoe/aoedev.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -173,7 +173,7 @@
|
|
return;
|
|
while (atomic_read(&skb_shinfo(skb)->dataref) != 1 && i-- > 0)
|
|
msleep(Sms);
|
|
- if (i < 0) {
|
|
+ if (i <= 0) {
|
|
printk(KERN_ERR
|
|
"aoe: %s holds ref: %s\n",
|
|
skb->dev ? skb->dev->name : "netif",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/aoe/aoe.h linux-2.6.29-rc3.owrt/drivers/block/aoe/aoe.h
|
|
--- linux-2.6.29.owrt/drivers/block/aoe/aoe.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/aoe/aoe.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -18,7 +18,6 @@
|
|
enum {
|
|
AOECMD_ATA,
|
|
AOECMD_CFG,
|
|
- AOECMD_VEND_MIN = 0xf0,
|
|
|
|
AOEFL_RSP = (1<<3),
|
|
AOEFL_ERR = (1<<2),
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/aoe/aoenet.c linux-2.6.29-rc3.owrt/drivers/block/aoe/aoenet.c
|
|
--- linux-2.6.29.owrt/drivers/block/aoe/aoenet.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/aoe/aoenet.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -142,8 +142,6 @@
|
|
aoecmd_cfg_rsp(skb);
|
|
break;
|
|
default:
|
|
- if (h->cmd >= AOECMD_VEND_MIN)
|
|
- break; /* don't complain about vendor commands */
|
|
printk(KERN_INFO "aoe: unknown cmd %d\n", h->cmd);
|
|
}
|
|
exit:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/ataflop.c linux-2.6.29-rc3.owrt/drivers/block/ataflop.c
|
|
--- linux-2.6.29.owrt/drivers/block/ataflop.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/ataflop.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1730,7 +1730,7 @@
|
|
|
|
timeout = jiffies + 2*HZ+HZ/2;
|
|
while (time_before(jiffies, timeout))
|
|
- if (!(st_mfp.par_dt_reg & 0x20))
|
|
+ if (!(mfp.par_dt_reg & 0x20))
|
|
break;
|
|
|
|
status = FDC_READ( FDCREG_STATUS );
|
|
@@ -1747,7 +1747,7 @@
|
|
/* dummy seek command to make WP bit accessible */
|
|
FDC_WRITE( FDCREG_DATA, 0 );
|
|
FDC_WRITE( FDCREG_CMD, FDCCMD_SEEK );
|
|
- while( st_mfp.par_dt_reg & 0x20 )
|
|
+ while( mfp.par_dt_reg & 0x20 )
|
|
;
|
|
status = FDC_READ( FDCREG_STATUS );
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/cciss.c linux-2.6.29-rc3.owrt/drivers/block/cciss.c
|
|
--- linux-2.6.29.owrt/drivers/block/cciss.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/cciss.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3390,203 +3390,6 @@
|
|
kfree(p);
|
|
}
|
|
|
|
-/* Send a message CDB to the firmware. */
|
|
-static __devinit int cciss_message(struct pci_dev *pdev, unsigned char opcode, unsigned char type)
|
|
-{
|
|
- typedef struct {
|
|
- CommandListHeader_struct CommandHeader;
|
|
- RequestBlock_struct Request;
|
|
- ErrDescriptor_struct ErrorDescriptor;
|
|
- } Command;
|
|
- static const size_t cmd_sz = sizeof(Command) + sizeof(ErrorInfo_struct);
|
|
- Command *cmd;
|
|
- dma_addr_t paddr64;
|
|
- uint32_t paddr32, tag;
|
|
- void __iomem *vaddr;
|
|
- int i, err;
|
|
-
|
|
- vaddr = ioremap_nocache(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
|
|
- if (vaddr == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
- /* The Inbound Post Queue only accepts 32-bit physical addresses for the
|
|
- CCISS commands, so they must be allocated from the lower 4GiB of
|
|
- memory. */
|
|
- err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
|
|
- if (err) {
|
|
- iounmap(vaddr);
|
|
- return -ENOMEM;
|
|
- }
|
|
-
|
|
- cmd = pci_alloc_consistent(pdev, cmd_sz, &paddr64);
|
|
- if (cmd == NULL) {
|
|
- iounmap(vaddr);
|
|
- return -ENOMEM;
|
|
- }
|
|
-
|
|
- /* This must fit, because of the 32-bit consistent DMA mask. Also,
|
|
- although there's no guarantee, we assume that the address is at
|
|
- least 4-byte aligned (most likely, it's page-aligned). */
|
|
- paddr32 = paddr64;
|
|
-
|
|
- cmd->CommandHeader.ReplyQueue = 0;
|
|
- cmd->CommandHeader.SGList = 0;
|
|
- cmd->CommandHeader.SGTotal = 0;
|
|
- cmd->CommandHeader.Tag.lower = paddr32;
|
|
- cmd->CommandHeader.Tag.upper = 0;
|
|
- memset(&cmd->CommandHeader.LUN.LunAddrBytes, 0, 8);
|
|
-
|
|
- cmd->Request.CDBLen = 16;
|
|
- cmd->Request.Type.Type = TYPE_MSG;
|
|
- cmd->Request.Type.Attribute = ATTR_HEADOFQUEUE;
|
|
- cmd->Request.Type.Direction = XFER_NONE;
|
|
- cmd->Request.Timeout = 0; /* Don't time out */
|
|
- cmd->Request.CDB[0] = opcode;
|
|
- cmd->Request.CDB[1] = type;
|
|
- memset(&cmd->Request.CDB[2], 0, 14); /* the rest of the CDB is reserved */
|
|
-
|
|
- cmd->ErrorDescriptor.Addr.lower = paddr32 + sizeof(Command);
|
|
- cmd->ErrorDescriptor.Addr.upper = 0;
|
|
- cmd->ErrorDescriptor.Len = sizeof(ErrorInfo_struct);
|
|
-
|
|
- writel(paddr32, vaddr + SA5_REQUEST_PORT_OFFSET);
|
|
-
|
|
- for (i = 0; i < 10; i++) {
|
|
- tag = readl(vaddr + SA5_REPLY_PORT_OFFSET);
|
|
- if ((tag & ~3) == paddr32)
|
|
- break;
|
|
- schedule_timeout_uninterruptible(HZ);
|
|
- }
|
|
-
|
|
- iounmap(vaddr);
|
|
-
|
|
- /* we leak the DMA buffer here ... no choice since the controller could
|
|
- still complete the command. */
|
|
- if (i == 10) {
|
|
- printk(KERN_ERR "cciss: controller message %02x:%02x timed out\n",
|
|
- opcode, type);
|
|
- return -ETIMEDOUT;
|
|
- }
|
|
-
|
|
- pci_free_consistent(pdev, cmd_sz, cmd, paddr64);
|
|
-
|
|
- if (tag & 2) {
|
|
- printk(KERN_ERR "cciss: controller message %02x:%02x failed\n",
|
|
- opcode, type);
|
|
- return -EIO;
|
|
- }
|
|
-
|
|
- printk(KERN_INFO "cciss: controller message %02x:%02x succeeded\n",
|
|
- opcode, type);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-#define cciss_soft_reset_controller(p) cciss_message(p, 1, 0)
|
|
-#define cciss_noop(p) cciss_message(p, 3, 0)
|
|
-
|
|
-static __devinit int cciss_reset_msi(struct pci_dev *pdev)
|
|
-{
|
|
-/* the #defines are stolen from drivers/pci/msi.h. */
|
|
-#define msi_control_reg(base) (base + PCI_MSI_FLAGS)
|
|
-#define PCI_MSIX_FLAGS_ENABLE (1 << 15)
|
|
-
|
|
- int pos;
|
|
- u16 control = 0;
|
|
-
|
|
- pos = pci_find_capability(pdev, PCI_CAP_ID_MSI);
|
|
- if (pos) {
|
|
- pci_read_config_word(pdev, msi_control_reg(pos), &control);
|
|
- if (control & PCI_MSI_FLAGS_ENABLE) {
|
|
- printk(KERN_INFO "cciss: resetting MSI\n");
|
|
- pci_write_config_word(pdev, msi_control_reg(pos), control & ~PCI_MSI_FLAGS_ENABLE);
|
|
- }
|
|
- }
|
|
-
|
|
- pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
|
|
- if (pos) {
|
|
- pci_read_config_word(pdev, msi_control_reg(pos), &control);
|
|
- if (control & PCI_MSIX_FLAGS_ENABLE) {
|
|
- printk(KERN_INFO "cciss: resetting MSI-X\n");
|
|
- pci_write_config_word(pdev, msi_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE);
|
|
- }
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/* This does a hard reset of the controller using PCI power management
|
|
- * states. */
|
|
-static __devinit int cciss_hard_reset_controller(struct pci_dev *pdev)
|
|
-{
|
|
- u16 pmcsr, saved_config_space[32];
|
|
- int i, pos;
|
|
-
|
|
- printk(KERN_INFO "cciss: using PCI PM to reset controller\n");
|
|
-
|
|
- /* This is very nearly the same thing as
|
|
-
|
|
- pci_save_state(pci_dev);
|
|
- pci_set_power_state(pci_dev, PCI_D3hot);
|
|
- pci_set_power_state(pci_dev, PCI_D0);
|
|
- pci_restore_state(pci_dev);
|
|
-
|
|
- but we can't use these nice canned kernel routines on
|
|
- kexec, because they also check the MSI/MSI-X state in PCI
|
|
- configuration space and do the wrong thing when it is
|
|
- set/cleared. Also, the pci_save/restore_state functions
|
|
- violate the ordering requirements for restoring the
|
|
- configuration space from the CCISS document (see the
|
|
- comment below). So we roll our own .... */
|
|
-
|
|
- for (i = 0; i < 32; i++)
|
|
- pci_read_config_word(pdev, 2*i, &saved_config_space[i]);
|
|
-
|
|
- pos = pci_find_capability(pdev, PCI_CAP_ID_PM);
|
|
- if (pos == 0) {
|
|
- printk(KERN_ERR "cciss_reset_controller: PCI PM not supported\n");
|
|
- return -ENODEV;
|
|
- }
|
|
-
|
|
- /* Quoting from the Open CISS Specification: "The Power
|
|
- * Management Control/Status Register (CSR) controls the power
|
|
- * state of the device. The normal operating state is D0,
|
|
- * CSR=00h. The software off state is D3, CSR=03h. To reset
|
|
- * the controller, place the interface device in D3 then to
|
|
- * D0, this causes a secondary PCI reset which will reset the
|
|
- * controller." */
|
|
-
|
|
- /* enter the D3hot power management state */
|
|
- pci_read_config_word(pdev, pos + PCI_PM_CTRL, &pmcsr);
|
|
- pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
|
|
- pmcsr |= PCI_D3hot;
|
|
- pci_write_config_word(pdev, pos + PCI_PM_CTRL, pmcsr);
|
|
-
|
|
- schedule_timeout_uninterruptible(HZ >> 1);
|
|
-
|
|
- /* enter the D0 power management state */
|
|
- pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
|
|
- pmcsr |= PCI_D0;
|
|
- pci_write_config_word(pdev, pos + PCI_PM_CTRL, pmcsr);
|
|
-
|
|
- schedule_timeout_uninterruptible(HZ >> 1);
|
|
-
|
|
- /* Restore the PCI configuration space. The Open CISS
|
|
- * Specification says, "Restore the PCI Configuration
|
|
- * Registers, offsets 00h through 60h. It is important to
|
|
- * restore the command register, 16-bits at offset 04h,
|
|
- * last. Do not restore the configuration status register,
|
|
- * 16-bits at offset 06h." Note that the offset is 2*i. */
|
|
- for (i = 0; i < 32; i++) {
|
|
- if (i == 2 || i == 3)
|
|
- continue;
|
|
- pci_write_config_word(pdev, 2*i, saved_config_space[i]);
|
|
- }
|
|
- wmb();
|
|
- pci_write_config_word(pdev, 4, saved_config_space[2]);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
/*
|
|
* This is it. Find all the controllers and register them. I really hate
|
|
* stealing all these major device numbers.
|
|
@@ -3601,26 +3404,6 @@
|
|
int dac, return_code;
|
|
InquiryData_struct *inq_buff = NULL;
|
|
|
|
- if (reset_devices) {
|
|
- /* Reset the controller with a PCI power-cycle */
|
|
- if (cciss_hard_reset_controller(pdev) || cciss_reset_msi(pdev))
|
|
- return -ENODEV;
|
|
-
|
|
- /* Now try to get the controller to respond to a no-op. Some
|
|
- devices (notably the HP Smart Array 5i Controller) need
|
|
- up to 30 seconds to respond. */
|
|
- for (i=0; i<30; i++) {
|
|
- if (cciss_noop(pdev) == 0)
|
|
- break;
|
|
-
|
|
- schedule_timeout_uninterruptible(HZ);
|
|
- }
|
|
- if (i == 30) {
|
|
- printk(KERN_ERR "cciss: controller seems dead\n");
|
|
- return -EBUSY;
|
|
- }
|
|
- }
|
|
-
|
|
i = alloc_cciss_hba();
|
|
if (i < 0)
|
|
return -1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/floppy.c linux-2.6.29-rc3.owrt/drivers/block/floppy.c
|
|
--- linux-2.6.29.owrt/drivers/block/floppy.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/floppy.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -558,8 +558,6 @@
|
|
static void recalibrate_floppy(void);
|
|
static void floppy_shutdown(unsigned long);
|
|
|
|
-static int floppy_request_regions(int);
|
|
-static void floppy_release_regions(int);
|
|
static int floppy_grab_irq_and_dma(void);
|
|
static void floppy_release_irq_and_dma(void);
|
|
|
|
@@ -4276,7 +4274,8 @@
|
|
FDCS->rawcmd = 2;
|
|
if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
|
|
/* free ioports reserved by floppy_grab_irq_and_dma() */
|
|
- floppy_release_regions(fdc);
|
|
+ release_region(FDCS->address + 2, 4);
|
|
+ release_region(FDCS->address + 7, 1);
|
|
FDCS->address = -1;
|
|
FDCS->version = FDC_NONE;
|
|
continue;
|
|
@@ -4285,7 +4284,8 @@
|
|
FDCS->version = get_fdc_version();
|
|
if (FDCS->version == FDC_NONE) {
|
|
/* free ioports reserved by floppy_grab_irq_and_dma() */
|
|
- floppy_release_regions(fdc);
|
|
+ release_region(FDCS->address + 2, 4);
|
|
+ release_region(FDCS->address + 7, 1);
|
|
FDCS->address = -1;
|
|
continue;
|
|
}
|
|
@@ -4358,47 +4358,6 @@
|
|
|
|
static DEFINE_SPINLOCK(floppy_usage_lock);
|
|
|
|
-static const struct io_region {
|
|
- int offset;
|
|
- int size;
|
|
-} io_regions[] = {
|
|
- { 2, 1 },
|
|
- /* address + 3 is sometimes reserved by pnp bios for motherboard */
|
|
- { 4, 2 },
|
|
- /* address + 6 is reserved, and may be taken by IDE.
|
|
- * Unfortunately, Adaptec doesn't know this :-(, */
|
|
- { 7, 1 },
|
|
-};
|
|
-
|
|
-static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
|
|
-{
|
|
- while (p != io_regions) {
|
|
- p--;
|
|
- release_region(FDCS->address + p->offset, p->size);
|
|
- }
|
|
-}
|
|
-
|
|
-#define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
|
|
-
|
|
-static int floppy_request_regions(int fdc)
|
|
-{
|
|
- const struct io_region *p;
|
|
-
|
|
- for (p = io_regions; p < ARRAY_END(io_regions); p++) {
|
|
- if (!request_region(FDCS->address + p->offset, p->size, "floppy")) {
|
|
- DPRINT("Floppy io-port 0x%04lx in use\n", FDCS->address + p->offset);
|
|
- floppy_release_allocated_regions(fdc, p);
|
|
- return -EBUSY;
|
|
- }
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void floppy_release_regions(int fdc)
|
|
-{
|
|
- floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
|
|
-}
|
|
-
|
|
static int floppy_grab_irq_and_dma(void)
|
|
{
|
|
unsigned long flags;
|
|
@@ -4440,8 +4399,18 @@
|
|
|
|
for (fdc = 0; fdc < N_FDC; fdc++) {
|
|
if (FDCS->address != -1) {
|
|
- if (floppy_request_regions(fdc))
|
|
- goto cleanup;
|
|
+ if (!request_region(FDCS->address + 2, 4, "floppy")) {
|
|
+ DPRINT("Floppy io-port 0x%04lx in use\n",
|
|
+ FDCS->address + 2);
|
|
+ goto cleanup1;
|
|
+ }
|
|
+ if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
|
|
+ DPRINT("Floppy io-port 0x%04lx in use\n",
|
|
+ FDCS->address + 7);
|
|
+ goto cleanup2;
|
|
+ }
|
|
+ /* address + 6 is reserved, and may be taken by IDE.
|
|
+ * Unfortunately, Adaptec doesn't know this :-(, */
|
|
}
|
|
}
|
|
for (fdc = 0; fdc < N_FDC; fdc++) {
|
|
@@ -4463,11 +4432,15 @@
|
|
fdc = 0;
|
|
irqdma_allocated = 1;
|
|
return 0;
|
|
-cleanup:
|
|
+cleanup2:
|
|
+ release_region(FDCS->address + 2, 4);
|
|
+cleanup1:
|
|
fd_free_irq();
|
|
fd_free_dma();
|
|
- while (--fdc >= 0)
|
|
- floppy_release_regions(fdc);
|
|
+ while (--fdc >= 0) {
|
|
+ release_region(FDCS->address + 2, 4);
|
|
+ release_region(FDCS->address + 7, 1);
|
|
+ }
|
|
spin_lock_irqsave(&floppy_usage_lock, flags);
|
|
usage_count--;
|
|
spin_unlock_irqrestore(&floppy_usage_lock, flags);
|
|
@@ -4528,8 +4501,10 @@
|
|
#endif
|
|
old_fdc = fdc;
|
|
for (fdc = 0; fdc < N_FDC; fdc++)
|
|
- if (FDCS->address != -1)
|
|
- floppy_release_regions(fdc);
|
|
+ if (FDCS->address != -1) {
|
|
+ release_region(FDCS->address + 2, 4);
|
|
+ release_region(FDCS->address + 7, 1);
|
|
+ }
|
|
fdc = old_fdc;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/loop.c linux-2.6.29-rc3.owrt/drivers/block/loop.c
|
|
--- linux-2.6.29.owrt/drivers/block/loop.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/loop.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -392,7 +392,8 @@
|
|
struct loop_device *lo = p->lo;
|
|
struct page *page = buf->page;
|
|
sector_t IV;
|
|
- int size, ret;
|
|
+ size_t size;
|
|
+ int ret;
|
|
|
|
ret = buf->ops->confirm(pipe, buf);
|
|
if (unlikely(ret))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/Makefile linux-2.6.29-rc3.owrt/drivers/block/Makefile
|
|
--- linux-2.6.29.owrt/drivers/block/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -9,7 +9,6 @@
|
|
obj-$(CONFIG_BLK_DEV_FD) += floppy.o
|
|
obj-$(CONFIG_AMIGA_FLOPPY) += amiflop.o
|
|
obj-$(CONFIG_PS3_DISK) += ps3disk.o
|
|
-obj-$(CONFIG_PS3_VRAM) += ps3vram.o
|
|
obj-$(CONFIG_ATARI_FLOPPY) += ataflop.o
|
|
obj-$(CONFIG_AMIGA_Z2RAM) += z2ram.o
|
|
obj-$(CONFIG_BLK_DEV_RAM) += brd.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/nbd.c linux-2.6.29-rc3.owrt/drivers/block/nbd.c
|
|
--- linux-2.6.29.owrt/drivers/block/nbd.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/nbd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -549,15 +549,6 @@
|
|
|
|
BUG_ON(lo->magic != LO_MAGIC);
|
|
|
|
- if (unlikely(!lo->sock)) {
|
|
- printk(KERN_ERR "%s: Attempted send on closed socket\n",
|
|
- lo->disk->disk_name);
|
|
- req->errors++;
|
|
- nbd_end_request(req);
|
|
- spin_lock_irq(q->queue_lock);
|
|
- continue;
|
|
- }
|
|
-
|
|
spin_lock_irq(&lo->queue_lock);
|
|
list_add_tail(&req->queuelist, &lo->waiting_queue);
|
|
spin_unlock_irq(&lo->queue_lock);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/paride/pg.c linux-2.6.29-rc3.owrt/drivers/block/paride/pg.c
|
|
--- linux-2.6.29.owrt/drivers/block/paride/pg.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/paride/pg.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -422,7 +422,7 @@
|
|
|
|
for (k = 0; k < len; k++) {
|
|
char c = *buf++;
|
|
- if (c != ' ' && c != l)
|
|
+ if (c != ' ' || c != l)
|
|
l = *targ++ = c;
|
|
}
|
|
if (l == ' ')
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/ps3vram.c linux-2.6.29-rc3.owrt/drivers/block/ps3vram.c
|
|
--- linux-2.6.29.owrt/drivers/block/ps3vram.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/ps3vram.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,865 +0,0 @@
|
|
-/*
|
|
- * ps3vram - Use extra PS3 video ram as MTD block device.
|
|
- *
|
|
- * Copyright 2009 Sony Corporation
|
|
- *
|
|
- * Based on the MTD ps3vram driver, which is
|
|
- * Copyright (c) 2007-2008 Jim Paris <jim@jtan.com>
|
|
- * Added support RSX DMA Vivien Chappelier <vivien.chappelier@free.fr>
|
|
- */
|
|
-
|
|
-#include <linux/blkdev.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/proc_fs.h>
|
|
-#include <linux/seq_file.h>
|
|
-
|
|
-#include <asm/firmware.h>
|
|
-#include <asm/lv1call.h>
|
|
-#include <asm/ps3.h>
|
|
-
|
|
-
|
|
-#define DEVICE_NAME "ps3vram"
|
|
-
|
|
-
|
|
-#define XDR_BUF_SIZE (2 * 1024 * 1024) /* XDR buffer (must be 1MiB aligned) */
|
|
-#define XDR_IOIF 0x0c000000
|
|
-
|
|
-#define FIFO_BASE XDR_IOIF
|
|
-#define FIFO_SIZE (64 * 1024)
|
|
-
|
|
-#define DMA_PAGE_SIZE (4 * 1024)
|
|
-
|
|
-#define CACHE_PAGE_SIZE (256 * 1024)
|
|
-#define CACHE_PAGE_COUNT ((XDR_BUF_SIZE - FIFO_SIZE) / CACHE_PAGE_SIZE)
|
|
-
|
|
-#define CACHE_OFFSET CACHE_PAGE_SIZE
|
|
-#define FIFO_OFFSET 0
|
|
-
|
|
-#define CTRL_PUT 0x10
|
|
-#define CTRL_GET 0x11
|
|
-#define CTRL_TOP 0x15
|
|
-
|
|
-#define UPLOAD_SUBCH 1
|
|
-#define DOWNLOAD_SUBCH 2
|
|
-
|
|
-#define NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN 0x0000030c
|
|
-#define NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY 0x00000104
|
|
-
|
|
-#define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT 0x601
|
|
-
|
|
-#define CACHE_PAGE_PRESENT 1
|
|
-#define CACHE_PAGE_DIRTY 2
|
|
-
|
|
-struct ps3vram_tag {
|
|
- unsigned int address;
|
|
- unsigned int flags;
|
|
-};
|
|
-
|
|
-struct ps3vram_cache {
|
|
- unsigned int page_count;
|
|
- unsigned int page_size;
|
|
- struct ps3vram_tag *tags;
|
|
- unsigned int hit;
|
|
- unsigned int miss;
|
|
-};
|
|
-
|
|
-struct ps3vram_priv {
|
|
- struct request_queue *queue;
|
|
- struct gendisk *gendisk;
|
|
-
|
|
- u64 size;
|
|
-
|
|
- u64 memory_handle;
|
|
- u64 context_handle;
|
|
- u32 *ctrl;
|
|
- u32 *reports;
|
|
- u8 __iomem *ddr_base;
|
|
- u8 *xdr_buf;
|
|
-
|
|
- u32 *fifo_base;
|
|
- u32 *fifo_ptr;
|
|
-
|
|
- struct ps3vram_cache cache;
|
|
-
|
|
- /* Used to serialize cache/DMA operations */
|
|
- struct mutex lock;
|
|
-};
|
|
-
|
|
-
|
|
-static int ps3vram_major;
|
|
-
|
|
-
|
|
-static struct block_device_operations ps3vram_fops = {
|
|
- .owner = THIS_MODULE,
|
|
-};
|
|
-
|
|
-
|
|
-#define DMA_NOTIFIER_HANDLE_BASE 0x66604200 /* first DMA notifier handle */
|
|
-#define DMA_NOTIFIER_OFFSET_BASE 0x1000 /* first DMA notifier offset */
|
|
-#define DMA_NOTIFIER_SIZE 0x40
|
|
-#define NOTIFIER 7 /* notifier used for completion report */
|
|
-
|
|
-static char *size = "256M";
|
|
-module_param(size, charp, 0);
|
|
-MODULE_PARM_DESC(size, "memory size");
|
|
-
|
|
-static u32 *ps3vram_get_notifier(u32 *reports, int notifier)
|
|
-{
|
|
- return (void *)reports + DMA_NOTIFIER_OFFSET_BASE +
|
|
- DMA_NOTIFIER_SIZE * notifier;
|
|
-}
|
|
-
|
|
-static void ps3vram_notifier_reset(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < 4; i++)
|
|
- notify[i] = 0xffffffff;
|
|
-}
|
|
-
|
|
-static int ps3vram_notifier_wait(struct ps3_system_bus_device *dev,
|
|
- unsigned int timeout_ms)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
|
|
- unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
|
|
-
|
|
- do {
|
|
- if (!notify[3])
|
|
- return 0;
|
|
- msleep(1);
|
|
- } while (time_before(jiffies, timeout));
|
|
-
|
|
- return -ETIMEDOUT;
|
|
-}
|
|
-
|
|
-static void ps3vram_init_ring(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
-
|
|
- priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET;
|
|
- priv->ctrl[CTRL_GET] = FIFO_BASE + FIFO_OFFSET;
|
|
-}
|
|
-
|
|
-static int ps3vram_wait_ring(struct ps3_system_bus_device *dev,
|
|
- unsigned int timeout_ms)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
|
|
-
|
|
- do {
|
|
- if (priv->ctrl[CTRL_PUT] == priv->ctrl[CTRL_GET])
|
|
- return 0;
|
|
- msleep(1);
|
|
- } while (time_before(jiffies, timeout));
|
|
-
|
|
- dev_warn(&dev->core, "FIFO timeout (%08x/%08x/%08x)\n",
|
|
- priv->ctrl[CTRL_PUT], priv->ctrl[CTRL_GET],
|
|
- priv->ctrl[CTRL_TOP]);
|
|
-
|
|
- return -ETIMEDOUT;
|
|
-}
|
|
-
|
|
-static void ps3vram_out_ring(struct ps3vram_priv *priv, u32 data)
|
|
-{
|
|
- *(priv->fifo_ptr)++ = data;
|
|
-}
|
|
-
|
|
-static void ps3vram_begin_ring(struct ps3vram_priv *priv, u32 chan, u32 tag,
|
|
- u32 size)
|
|
-{
|
|
- ps3vram_out_ring(priv, (size << 18) | (chan << 13) | tag);
|
|
-}
|
|
-
|
|
-static void ps3vram_rewind_ring(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- int status;
|
|
-
|
|
- ps3vram_out_ring(priv, 0x20000000 | (FIFO_BASE + FIFO_OFFSET));
|
|
-
|
|
- priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET;
|
|
-
|
|
- /* asking the HV for a blit will kick the FIFO */
|
|
- status = lv1_gpu_context_attribute(priv->context_handle,
|
|
- L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, 0,
|
|
- 0, 0, 0);
|
|
- if (status)
|
|
- dev_err(&dev->core,
|
|
- "%s: lv1_gpu_context_attribute failed %d\n", __func__,
|
|
- status);
|
|
-
|
|
- priv->fifo_ptr = priv->fifo_base;
|
|
-}
|
|
-
|
|
-static void ps3vram_fire_ring(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- int status;
|
|
-
|
|
- mutex_lock(&ps3_gpu_mutex);
|
|
-
|
|
- priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET +
|
|
- (priv->fifo_ptr - priv->fifo_base) * sizeof(u32);
|
|
-
|
|
- /* asking the HV for a blit will kick the FIFO */
|
|
- status = lv1_gpu_context_attribute(priv->context_handle,
|
|
- L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, 0,
|
|
- 0, 0, 0);
|
|
- if (status)
|
|
- dev_err(&dev->core,
|
|
- "%s: lv1_gpu_context_attribute failed %d\n", __func__,
|
|
- status);
|
|
-
|
|
- if ((priv->fifo_ptr - priv->fifo_base) * sizeof(u32) >
|
|
- FIFO_SIZE - 1024) {
|
|
- dev_dbg(&dev->core, "FIFO full, rewinding\n");
|
|
- ps3vram_wait_ring(dev, 200);
|
|
- ps3vram_rewind_ring(dev);
|
|
- }
|
|
-
|
|
- mutex_unlock(&ps3_gpu_mutex);
|
|
-}
|
|
-
|
|
-static void ps3vram_bind(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
-
|
|
- ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0, 1);
|
|
- ps3vram_out_ring(priv, 0x31337303);
|
|
- ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x180, 3);
|
|
- ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER);
|
|
- ps3vram_out_ring(priv, 0xfeed0001); /* DMA system RAM instance */
|
|
- ps3vram_out_ring(priv, 0xfeed0000); /* DMA video RAM instance */
|
|
-
|
|
- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0, 1);
|
|
- ps3vram_out_ring(priv, 0x3137c0de);
|
|
- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x180, 3);
|
|
- ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER);
|
|
- ps3vram_out_ring(priv, 0xfeed0000); /* DMA video RAM instance */
|
|
- ps3vram_out_ring(priv, 0xfeed0001); /* DMA system RAM instance */
|
|
-
|
|
- ps3vram_fire_ring(dev);
|
|
-}
|
|
-
|
|
-static int ps3vram_upload(struct ps3_system_bus_device *dev,
|
|
- unsigned int src_offset, unsigned int dst_offset,
|
|
- int len, int count)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
-
|
|
- ps3vram_begin_ring(priv, UPLOAD_SUBCH,
|
|
- NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
|
|
- ps3vram_out_ring(priv, XDR_IOIF + src_offset);
|
|
- ps3vram_out_ring(priv, dst_offset);
|
|
- ps3vram_out_ring(priv, len);
|
|
- ps3vram_out_ring(priv, len);
|
|
- ps3vram_out_ring(priv, len);
|
|
- ps3vram_out_ring(priv, count);
|
|
- ps3vram_out_ring(priv, (1 << 8) | 1);
|
|
- ps3vram_out_ring(priv, 0);
|
|
-
|
|
- ps3vram_notifier_reset(dev);
|
|
- ps3vram_begin_ring(priv, UPLOAD_SUBCH,
|
|
- NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1);
|
|
- ps3vram_out_ring(priv, 0);
|
|
- ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x100, 1);
|
|
- ps3vram_out_ring(priv, 0);
|
|
- ps3vram_fire_ring(dev);
|
|
- if (ps3vram_notifier_wait(dev, 200) < 0) {
|
|
- dev_warn(&dev->core, "%s: Notifier timeout\n", __func__);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int ps3vram_download(struct ps3_system_bus_device *dev,
|
|
- unsigned int src_offset, unsigned int dst_offset,
|
|
- int len, int count)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
-
|
|
- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH,
|
|
- NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
|
|
- ps3vram_out_ring(priv, src_offset);
|
|
- ps3vram_out_ring(priv, XDR_IOIF + dst_offset);
|
|
- ps3vram_out_ring(priv, len);
|
|
- ps3vram_out_ring(priv, len);
|
|
- ps3vram_out_ring(priv, len);
|
|
- ps3vram_out_ring(priv, count);
|
|
- ps3vram_out_ring(priv, (1 << 8) | 1);
|
|
- ps3vram_out_ring(priv, 0);
|
|
-
|
|
- ps3vram_notifier_reset(dev);
|
|
- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH,
|
|
- NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1);
|
|
- ps3vram_out_ring(priv, 0);
|
|
- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x100, 1);
|
|
- ps3vram_out_ring(priv, 0);
|
|
- ps3vram_fire_ring(dev);
|
|
- if (ps3vram_notifier_wait(dev, 200) < 0) {
|
|
- dev_warn(&dev->core, "%s: Notifier timeout\n", __func__);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void ps3vram_cache_evict(struct ps3_system_bus_device *dev, int entry)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- struct ps3vram_cache *cache = &priv->cache;
|
|
-
|
|
- if (!(cache->tags[entry].flags & CACHE_PAGE_DIRTY))
|
|
- return;
|
|
-
|
|
- dev_dbg(&dev->core, "Flushing %d: 0x%08x\n", entry,
|
|
- cache->tags[entry].address);
|
|
- if (ps3vram_upload(dev, CACHE_OFFSET + entry * cache->page_size,
|
|
- cache->tags[entry].address, DMA_PAGE_SIZE,
|
|
- cache->page_size / DMA_PAGE_SIZE) < 0) {
|
|
- dev_err(&dev->core,
|
|
- "Failed to upload from 0x%x to " "0x%x size 0x%x\n",
|
|
- entry * cache->page_size, cache->tags[entry].address,
|
|
- cache->page_size);
|
|
- }
|
|
- cache->tags[entry].flags &= ~CACHE_PAGE_DIRTY;
|
|
-}
|
|
-
|
|
-static void ps3vram_cache_load(struct ps3_system_bus_device *dev, int entry,
|
|
- unsigned int address)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- struct ps3vram_cache *cache = &priv->cache;
|
|
-
|
|
- dev_dbg(&dev->core, "Fetching %d: 0x%08x\n", entry, address);
|
|
- if (ps3vram_download(dev, address,
|
|
- CACHE_OFFSET + entry * cache->page_size,
|
|
- DMA_PAGE_SIZE,
|
|
- cache->page_size / DMA_PAGE_SIZE) < 0) {
|
|
- dev_err(&dev->core,
|
|
- "Failed to download from 0x%x to 0x%x size 0x%x\n",
|
|
- address, entry * cache->page_size, cache->page_size);
|
|
- }
|
|
-
|
|
- cache->tags[entry].address = address;
|
|
- cache->tags[entry].flags |= CACHE_PAGE_PRESENT;
|
|
-}
|
|
-
|
|
-
|
|
-static void ps3vram_cache_flush(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- struct ps3vram_cache *cache = &priv->cache;
|
|
- int i;
|
|
-
|
|
- dev_dbg(&dev->core, "FLUSH\n");
|
|
- for (i = 0; i < cache->page_count; i++) {
|
|
- ps3vram_cache_evict(dev, i);
|
|
- cache->tags[i].flags = 0;
|
|
- }
|
|
-}
|
|
-
|
|
-static unsigned int ps3vram_cache_match(struct ps3_system_bus_device *dev,
|
|
- loff_t address)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- struct ps3vram_cache *cache = &priv->cache;
|
|
- unsigned int base;
|
|
- unsigned int offset;
|
|
- int i;
|
|
- static int counter;
|
|
-
|
|
- offset = (unsigned int) (address & (cache->page_size - 1));
|
|
- base = (unsigned int) (address - offset);
|
|
-
|
|
- /* fully associative check */
|
|
- for (i = 0; i < cache->page_count; i++) {
|
|
- if ((cache->tags[i].flags & CACHE_PAGE_PRESENT) &&
|
|
- cache->tags[i].address == base) {
|
|
- cache->hit++;
|
|
- dev_dbg(&dev->core, "Found entry %d: 0x%08x\n", i,
|
|
- cache->tags[i].address);
|
|
- return i;
|
|
- }
|
|
- }
|
|
-
|
|
- /* choose a random entry */
|
|
- i = (jiffies + (counter++)) % cache->page_count;
|
|
- dev_dbg(&dev->core, "Using entry %d\n", i);
|
|
-
|
|
- ps3vram_cache_evict(dev, i);
|
|
- ps3vram_cache_load(dev, i, base);
|
|
-
|
|
- cache->miss++;
|
|
- return i;
|
|
-}
|
|
-
|
|
-static int ps3vram_cache_init(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
-
|
|
- priv->cache.page_count = CACHE_PAGE_COUNT;
|
|
- priv->cache.page_size = CACHE_PAGE_SIZE;
|
|
- priv->cache.tags = kzalloc(sizeof(struct ps3vram_tag) *
|
|
- CACHE_PAGE_COUNT, GFP_KERNEL);
|
|
- if (priv->cache.tags == NULL) {
|
|
- dev_err(&dev->core, "Could not allocate cache tags\n");
|
|
- return -ENOMEM;
|
|
- }
|
|
-
|
|
- dev_info(&dev->core, "Created ram cache: %d entries, %d KiB each\n",
|
|
- CACHE_PAGE_COUNT, CACHE_PAGE_SIZE / 1024);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void ps3vram_cache_cleanup(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
-
|
|
- ps3vram_cache_flush(dev);
|
|
- kfree(priv->cache.tags);
|
|
-}
|
|
-
|
|
-static int ps3vram_read(struct ps3_system_bus_device *dev, loff_t from,
|
|
- size_t len, size_t *retlen, u_char *buf)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- unsigned int cached, count;
|
|
-
|
|
- dev_dbg(&dev->core, "%s: from=0x%08x len=0x%zx\n", __func__,
|
|
- (unsigned int)from, len);
|
|
-
|
|
- if (from >= priv->size)
|
|
- return -EIO;
|
|
-
|
|
- if (len > priv->size - from)
|
|
- len = priv->size - from;
|
|
-
|
|
- /* Copy from vram to buf */
|
|
- count = len;
|
|
- while (count) {
|
|
- unsigned int offset, avail;
|
|
- unsigned int entry;
|
|
-
|
|
- offset = (unsigned int) (from & (priv->cache.page_size - 1));
|
|
- avail = priv->cache.page_size - offset;
|
|
-
|
|
- mutex_lock(&priv->lock);
|
|
-
|
|
- entry = ps3vram_cache_match(dev, from);
|
|
- cached = CACHE_OFFSET + entry * priv->cache.page_size + offset;
|
|
-
|
|
- dev_dbg(&dev->core, "%s: from=%08x cached=%08x offset=%08x "
|
|
- "avail=%08x count=%08x\n", __func__,
|
|
- (unsigned int)from, cached, offset, avail, count);
|
|
-
|
|
- if (avail > count)
|
|
- avail = count;
|
|
- memcpy(buf, priv->xdr_buf + cached, avail);
|
|
-
|
|
- mutex_unlock(&priv->lock);
|
|
-
|
|
- buf += avail;
|
|
- count -= avail;
|
|
- from += avail;
|
|
- }
|
|
-
|
|
- *retlen = len;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int ps3vram_write(struct ps3_system_bus_device *dev, loff_t to,
|
|
- size_t len, size_t *retlen, const u_char *buf)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- unsigned int cached, count;
|
|
-
|
|
- if (to >= priv->size)
|
|
- return -EIO;
|
|
-
|
|
- if (len > priv->size - to)
|
|
- len = priv->size - to;
|
|
-
|
|
- /* Copy from buf to vram */
|
|
- count = len;
|
|
- while (count) {
|
|
- unsigned int offset, avail;
|
|
- unsigned int entry;
|
|
-
|
|
- offset = (unsigned int) (to & (priv->cache.page_size - 1));
|
|
- avail = priv->cache.page_size - offset;
|
|
-
|
|
- mutex_lock(&priv->lock);
|
|
-
|
|
- entry = ps3vram_cache_match(dev, to);
|
|
- cached = CACHE_OFFSET + entry * priv->cache.page_size + offset;
|
|
-
|
|
- dev_dbg(&dev->core, "%s: to=%08x cached=%08x offset=%08x "
|
|
- "avail=%08x count=%08x\n", __func__, (unsigned int)to,
|
|
- cached, offset, avail, count);
|
|
-
|
|
- if (avail > count)
|
|
- avail = count;
|
|
- memcpy(priv->xdr_buf + cached, buf, avail);
|
|
-
|
|
- priv->cache.tags[entry].flags |= CACHE_PAGE_DIRTY;
|
|
-
|
|
- mutex_unlock(&priv->lock);
|
|
-
|
|
- buf += avail;
|
|
- count -= avail;
|
|
- to += avail;
|
|
- }
|
|
-
|
|
- *retlen = len;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int ps3vram_proc_show(struct seq_file *m, void *v)
|
|
-{
|
|
- struct ps3vram_priv *priv = m->private;
|
|
-
|
|
- seq_printf(m, "hit:%u\nmiss:%u\n", priv->cache.hit, priv->cache.miss);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int ps3vram_proc_open(struct inode *inode, struct file *file)
|
|
-{
|
|
- return single_open(file, ps3vram_proc_show, PDE(inode)->data);
|
|
-}
|
|
-
|
|
-static const struct file_operations ps3vram_proc_fops = {
|
|
- .owner = THIS_MODULE,
|
|
- .open = ps3vram_proc_open,
|
|
- .read = seq_read,
|
|
- .llseek = seq_lseek,
|
|
- .release = single_release,
|
|
-};
|
|
-
|
|
-static void __devinit ps3vram_proc_init(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
- struct proc_dir_entry *pde;
|
|
-
|
|
- pde = proc_create(DEVICE_NAME, 0444, NULL, &ps3vram_proc_fops);
|
|
- if (!pde) {
|
|
- dev_warn(&dev->core, "failed to create /proc entry\n");
|
|
- return;
|
|
- }
|
|
-
|
|
- pde->owner = THIS_MODULE;
|
|
- pde->data = priv;
|
|
-}
|
|
-
|
|
-static int ps3vram_make_request(struct request_queue *q, struct bio *bio)
|
|
-{
|
|
- struct ps3_system_bus_device *dev = q->queuedata;
|
|
- int write = bio_data_dir(bio) == WRITE;
|
|
- const char *op = write ? "write" : "read";
|
|
- loff_t offset = bio->bi_sector << 9;
|
|
- int error = 0;
|
|
- struct bio_vec *bvec;
|
|
- unsigned int i;
|
|
-
|
|
- dev_dbg(&dev->core, "%s\n", __func__);
|
|
-
|
|
- bio_for_each_segment(bvec, bio, i) {
|
|
- /* PS3 is ppc64, so we don't handle highmem */
|
|
- char *ptr = page_address(bvec->bv_page) + bvec->bv_offset;
|
|
- size_t len = bvec->bv_len, retlen;
|
|
-
|
|
- dev_dbg(&dev->core, " %s %zu bytes at offset %llu\n", op,
|
|
- len, offset);
|
|
- if (write)
|
|
- error = ps3vram_write(dev, offset, len, &retlen, ptr);
|
|
- else
|
|
- error = ps3vram_read(dev, offset, len, &retlen, ptr);
|
|
-
|
|
- if (error) {
|
|
- dev_err(&dev->core, "%s failed\n", op);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- if (retlen != len) {
|
|
- dev_err(&dev->core, "Short %s\n", op);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- offset += len;
|
|
- }
|
|
-
|
|
- dev_dbg(&dev->core, "%s completed\n", op);
|
|
-
|
|
-out:
|
|
- bio_endio(bio, error);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int __devinit ps3vram_probe(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv;
|
|
- int error, status;
|
|
- struct request_queue *queue;
|
|
- struct gendisk *gendisk;
|
|
- u64 ddr_lpar, ctrl_lpar, info_lpar, reports_lpar, ddr_size,
|
|
- reports_size;
|
|
- char *rest;
|
|
-
|
|
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
|
- if (!priv) {
|
|
- error = -ENOMEM;
|
|
- goto fail;
|
|
- }
|
|
-
|
|
- mutex_init(&priv->lock);
|
|
- dev->core.driver_data = priv;
|
|
-
|
|
- priv = dev->core.driver_data;
|
|
-
|
|
- /* Allocate XDR buffer (1MiB aligned) */
|
|
- priv->xdr_buf = (void *)__get_free_pages(GFP_KERNEL,
|
|
- get_order(XDR_BUF_SIZE));
|
|
- if (priv->xdr_buf == NULL) {
|
|
- dev_err(&dev->core, "Could not allocate XDR buffer\n");
|
|
- error = -ENOMEM;
|
|
- goto fail_free_priv;
|
|
- }
|
|
-
|
|
- /* Put FIFO at begginning of XDR buffer */
|
|
- priv->fifo_base = (u32 *) (priv->xdr_buf + FIFO_OFFSET);
|
|
- priv->fifo_ptr = priv->fifo_base;
|
|
-
|
|
- /* XXX: Need to open GPU, in case ps3fb or snd_ps3 aren't loaded */
|
|
- if (ps3_open_hv_device(dev)) {
|
|
- dev_err(&dev->core, "ps3_open_hv_device failed\n");
|
|
- error = -EAGAIN;
|
|
- goto out_close_gpu;
|
|
- }
|
|
-
|
|
- /* Request memory */
|
|
- status = -1;
|
|
- ddr_size = ALIGN(memparse(size, &rest), 1024*1024);
|
|
- if (!ddr_size) {
|
|
- dev_err(&dev->core, "Specified size is too small\n");
|
|
- error = -EINVAL;
|
|
- goto out_close_gpu;
|
|
- }
|
|
-
|
|
- while (ddr_size > 0) {
|
|
- status = lv1_gpu_memory_allocate(ddr_size, 0, 0, 0, 0,
|
|
- &priv->memory_handle,
|
|
- &ddr_lpar);
|
|
- if (!status)
|
|
- break;
|
|
- ddr_size -= 1024*1024;
|
|
- }
|
|
- if (status) {
|
|
- dev_err(&dev->core, "lv1_gpu_memory_allocate failed %d\n",
|
|
- status);
|
|
- error = -ENOMEM;
|
|
- goto out_free_xdr_buf;
|
|
- }
|
|
-
|
|
- /* Request context */
|
|
- status = lv1_gpu_context_allocate(priv->memory_handle, 0,
|
|
- &priv->context_handle, &ctrl_lpar,
|
|
- &info_lpar, &reports_lpar,
|
|
- &reports_size);
|
|
- if (status) {
|
|
- dev_err(&dev->core, "lv1_gpu_context_allocate failed %d\n",
|
|
- status);
|
|
- error = -ENOMEM;
|
|
- goto out_free_memory;
|
|
- }
|
|
-
|
|
- /* Map XDR buffer to RSX */
|
|
- status = lv1_gpu_context_iomap(priv->context_handle, XDR_IOIF,
|
|
- ps3_mm_phys_to_lpar(__pa(priv->xdr_buf)),
|
|
- XDR_BUF_SIZE, 0);
|
|
- if (status) {
|
|
- dev_err(&dev->core, "lv1_gpu_context_iomap failed %d\n",
|
|
- status);
|
|
- error = -ENOMEM;
|
|
- goto out_free_context;
|
|
- }
|
|
-
|
|
- priv->ddr_base = ioremap_flags(ddr_lpar, ddr_size, _PAGE_NO_CACHE);
|
|
-
|
|
- if (!priv->ddr_base) {
|
|
- dev_err(&dev->core, "ioremap DDR failed\n");
|
|
- error = -ENOMEM;
|
|
- goto out_free_context;
|
|
- }
|
|
-
|
|
- priv->ctrl = ioremap(ctrl_lpar, 64 * 1024);
|
|
- if (!priv->ctrl) {
|
|
- dev_err(&dev->core, "ioremap CTRL failed\n");
|
|
- error = -ENOMEM;
|
|
- goto out_unmap_vram;
|
|
- }
|
|
-
|
|
- priv->reports = ioremap(reports_lpar, reports_size);
|
|
- if (!priv->reports) {
|
|
- dev_err(&dev->core, "ioremap REPORTS failed\n");
|
|
- error = -ENOMEM;
|
|
- goto out_unmap_ctrl;
|
|
- }
|
|
-
|
|
- mutex_lock(&ps3_gpu_mutex);
|
|
- ps3vram_init_ring(dev);
|
|
- mutex_unlock(&ps3_gpu_mutex);
|
|
-
|
|
- priv->size = ddr_size;
|
|
-
|
|
- ps3vram_bind(dev);
|
|
-
|
|
- mutex_lock(&ps3_gpu_mutex);
|
|
- error = ps3vram_wait_ring(dev, 100);
|
|
- mutex_unlock(&ps3_gpu_mutex);
|
|
- if (error < 0) {
|
|
- dev_err(&dev->core, "Failed to initialize channels\n");
|
|
- error = -ETIMEDOUT;
|
|
- goto out_unmap_reports;
|
|
- }
|
|
-
|
|
- ps3vram_cache_init(dev);
|
|
- ps3vram_proc_init(dev);
|
|
-
|
|
- queue = blk_alloc_queue(GFP_KERNEL);
|
|
- if (!queue) {
|
|
- dev_err(&dev->core, "blk_alloc_queue failed\n");
|
|
- error = -ENOMEM;
|
|
- goto out_cache_cleanup;
|
|
- }
|
|
-
|
|
- priv->queue = queue;
|
|
- queue->queuedata = dev;
|
|
- blk_queue_make_request(queue, ps3vram_make_request);
|
|
- blk_queue_max_phys_segments(queue, MAX_PHYS_SEGMENTS);
|
|
- blk_queue_max_hw_segments(queue, MAX_HW_SEGMENTS);
|
|
- blk_queue_max_segment_size(queue, MAX_SEGMENT_SIZE);
|
|
- blk_queue_max_sectors(queue, SAFE_MAX_SECTORS);
|
|
-
|
|
- gendisk = alloc_disk(1);
|
|
- if (!gendisk) {
|
|
- dev_err(&dev->core, "alloc_disk failed\n");
|
|
- error = -ENOMEM;
|
|
- goto fail_cleanup_queue;
|
|
- }
|
|
-
|
|
- priv->gendisk = gendisk;
|
|
- gendisk->major = ps3vram_major;
|
|
- gendisk->first_minor = 0;
|
|
- gendisk->fops = &ps3vram_fops;
|
|
- gendisk->queue = queue;
|
|
- gendisk->private_data = dev;
|
|
- gendisk->driverfs_dev = &dev->core;
|
|
- strlcpy(gendisk->disk_name, DEVICE_NAME, sizeof(gendisk->disk_name));
|
|
- set_capacity(gendisk, priv->size >> 9);
|
|
-
|
|
- dev_info(&dev->core, "%s: Using %lu MiB of GPU memory\n",
|
|
- gendisk->disk_name, get_capacity(gendisk) >> 11);
|
|
-
|
|
- add_disk(gendisk);
|
|
- return 0;
|
|
-
|
|
-fail_cleanup_queue:
|
|
- blk_cleanup_queue(queue);
|
|
-out_cache_cleanup:
|
|
- remove_proc_entry(DEVICE_NAME, NULL);
|
|
- ps3vram_cache_cleanup(dev);
|
|
-out_unmap_reports:
|
|
- iounmap(priv->reports);
|
|
-out_unmap_ctrl:
|
|
- iounmap(priv->ctrl);
|
|
-out_unmap_vram:
|
|
- iounmap(priv->ddr_base);
|
|
-out_free_context:
|
|
- lv1_gpu_context_free(priv->context_handle);
|
|
-out_free_memory:
|
|
- lv1_gpu_memory_free(priv->memory_handle);
|
|
-out_close_gpu:
|
|
- ps3_close_hv_device(dev);
|
|
-out_free_xdr_buf:
|
|
- free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE));
|
|
-fail_free_priv:
|
|
- kfree(priv);
|
|
- dev->core.driver_data = NULL;
|
|
-fail:
|
|
- return error;
|
|
-}
|
|
-
|
|
-static int ps3vram_remove(struct ps3_system_bus_device *dev)
|
|
-{
|
|
- struct ps3vram_priv *priv = dev->core.driver_data;
|
|
-
|
|
- del_gendisk(priv->gendisk);
|
|
- put_disk(priv->gendisk);
|
|
- blk_cleanup_queue(priv->queue);
|
|
- remove_proc_entry(DEVICE_NAME, NULL);
|
|
- ps3vram_cache_cleanup(dev);
|
|
- iounmap(priv->reports);
|
|
- iounmap(priv->ctrl);
|
|
- iounmap(priv->ddr_base);
|
|
- lv1_gpu_context_free(priv->context_handle);
|
|
- lv1_gpu_memory_free(priv->memory_handle);
|
|
- ps3_close_hv_device(dev);
|
|
- free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE));
|
|
- kfree(priv);
|
|
- dev->core.driver_data = NULL;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static struct ps3_system_bus_driver ps3vram = {
|
|
- .match_id = PS3_MATCH_ID_GPU,
|
|
- .match_sub_id = PS3_MATCH_SUB_ID_GPU_RAMDISK,
|
|
- .core.name = DEVICE_NAME,
|
|
- .core.owner = THIS_MODULE,
|
|
- .probe = ps3vram_probe,
|
|
- .remove = ps3vram_remove,
|
|
- .shutdown = ps3vram_remove,
|
|
-};
|
|
-
|
|
-
|
|
-static int __init ps3vram_init(void)
|
|
-{
|
|
- int error;
|
|
-
|
|
- if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
|
|
- return -ENODEV;
|
|
-
|
|
- error = register_blkdev(0, DEVICE_NAME);
|
|
- if (error <= 0) {
|
|
- pr_err("%s: register_blkdev failed %d\n", DEVICE_NAME, error);
|
|
- return error;
|
|
- }
|
|
- ps3vram_major = error;
|
|
-
|
|
- pr_info("%s: registered block device major %d\n", DEVICE_NAME,
|
|
- ps3vram_major);
|
|
-
|
|
- error = ps3_system_bus_driver_register(&ps3vram);
|
|
- if (error)
|
|
- unregister_blkdev(ps3vram_major, DEVICE_NAME);
|
|
-
|
|
- return error;
|
|
-}
|
|
-
|
|
-static void __exit ps3vram_exit(void)
|
|
-{
|
|
- ps3_system_bus_driver_unregister(&ps3vram);
|
|
- unregister_blkdev(ps3vram_major, DEVICE_NAME);
|
|
-}
|
|
-
|
|
-module_init(ps3vram_init);
|
|
-module_exit(ps3vram_exit);
|
|
-
|
|
-MODULE_LICENSE("GPL");
|
|
-MODULE_DESCRIPTION("PS3 Video RAM Storage Driver");
|
|
-MODULE_AUTHOR("Sony Corporation");
|
|
-MODULE_ALIAS(PS3_MODULE_ALIAS_GPU_RAMDISK);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/xen-blkfront.c linux-2.6.29-rc3.owrt/drivers/block/xen-blkfront.c
|
|
--- linux-2.6.29.owrt/drivers/block/xen-blkfront.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/xen-blkfront.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -40,7 +40,6 @@
|
|
#include <linux/hdreg.h>
|
|
#include <linux/cdrom.h>
|
|
#include <linux/module.h>
|
|
-#include <linux/scatterlist.h>
|
|
|
|
#include <xen/xenbus.h>
|
|
#include <xen/grant_table.h>
|
|
@@ -83,7 +82,6 @@
|
|
enum blkif_state connected;
|
|
int ring_ref;
|
|
struct blkif_front_ring ring;
|
|
- struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
|
|
unsigned int evtchn, irq;
|
|
struct request_queue *rq;
|
|
struct work_struct work;
|
|
@@ -206,11 +204,12 @@
|
|
struct blkfront_info *info = req->rq_disk->private_data;
|
|
unsigned long buffer_mfn;
|
|
struct blkif_request *ring_req;
|
|
+ struct req_iterator iter;
|
|
+ struct bio_vec *bvec;
|
|
unsigned long id;
|
|
unsigned int fsect, lsect;
|
|
- int i, ref;
|
|
+ int ref;
|
|
grant_ref_t gref_head;
|
|
- struct scatterlist *sg;
|
|
|
|
if (unlikely(info->connected != BLKIF_STATE_CONNECTED))
|
|
return 1;
|
|
@@ -239,13 +238,12 @@
|
|
if (blk_barrier_rq(req))
|
|
ring_req->operation = BLKIF_OP_WRITE_BARRIER;
|
|
|
|
- ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg);
|
|
- BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST);
|
|
-
|
|
- for_each_sg(info->sg, sg, ring_req->nr_segments, i) {
|
|
- buffer_mfn = pfn_to_mfn(page_to_pfn(sg_page(sg)));
|
|
- fsect = sg->offset >> 9;
|
|
- lsect = fsect + (sg->length >> 9) - 1;
|
|
+ ring_req->nr_segments = 0;
|
|
+ rq_for_each_segment(bvec, req, iter) {
|
|
+ BUG_ON(ring_req->nr_segments == BLKIF_MAX_SEGMENTS_PER_REQUEST);
|
|
+ buffer_mfn = pfn_to_mfn(page_to_pfn(bvec->bv_page));
|
|
+ fsect = bvec->bv_offset >> 9;
|
|
+ lsect = fsect + (bvec->bv_len >> 9) - 1;
|
|
/* install a grant reference. */
|
|
ref = gnttab_claim_grant_reference(&gref_head);
|
|
BUG_ON(ref == -ENOSPC);
|
|
@@ -256,12 +254,16 @@
|
|
buffer_mfn,
|
|
rq_data_dir(req) );
|
|
|
|
- info->shadow[id].frame[i] = mfn_to_pfn(buffer_mfn);
|
|
- ring_req->seg[i] =
|
|
+ info->shadow[id].frame[ring_req->nr_segments] =
|
|
+ mfn_to_pfn(buffer_mfn);
|
|
+
|
|
+ ring_req->seg[ring_req->nr_segments] =
|
|
(struct blkif_request_segment) {
|
|
.gref = ref,
|
|
.first_sect = fsect,
|
|
.last_sect = lsect };
|
|
+
|
|
+ ring_req->nr_segments++;
|
|
}
|
|
|
|
info->ring.req_prod_pvt++;
|
|
@@ -620,8 +622,6 @@
|
|
SHARED_RING_INIT(sring);
|
|
FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
|
|
|
|
- sg_init_table(info->sg, BLKIF_MAX_SEGMENTS_PER_REQUEST);
|
|
-
|
|
err = xenbus_grant_ring(dev, virt_to_mfn(info->ring.sring));
|
|
if (err < 0) {
|
|
free_page((unsigned long)sring);
|
|
@@ -977,8 +977,6 @@
|
|
break;
|
|
|
|
case XenbusStateClosing:
|
|
- if (info->gd == NULL)
|
|
- xenbus_dev_fatal(dev, -ENODEV, "gd is NULL");
|
|
bd = bdget_disk(info->gd, 0);
|
|
if (bd == NULL)
|
|
xenbus_dev_fatal(dev, -ENODEV, "bdget failed");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/block/xsysace.c linux-2.6.29-rc3.owrt/drivers/block/xsysace.c
|
|
--- linux-2.6.29.owrt/drivers/block/xsysace.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/block/xsysace.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -489,28 +489,6 @@
|
|
ace->fsm_state, ace->id_req_count);
|
|
#endif
|
|
|
|
- /* Verify that there is actually a CF in the slot. If not, then
|
|
- * bail out back to the idle state and wake up all the waiters */
|
|
- status = ace_in32(ace, ACE_STATUS);
|
|
- if ((status & ACE_STATUS_CFDETECT) == 0) {
|
|
- ace->fsm_state = ACE_FSM_STATE_IDLE;
|
|
- ace->media_change = 1;
|
|
- set_capacity(ace->gd, 0);
|
|
- dev_info(ace->dev, "No CF in slot\n");
|
|
-
|
|
- /* Drop all pending requests */
|
|
- while ((req = elv_next_request(ace->queue)) != NULL)
|
|
- end_request(req, 0);
|
|
-
|
|
- /* Drop back to IDLE state and notify waiters */
|
|
- ace->fsm_state = ACE_FSM_STATE_IDLE;
|
|
- ace->id_result = -EIO;
|
|
- while (ace->id_req_count) {
|
|
- complete(&ace->id_completion);
|
|
- ace->id_req_count--;
|
|
- }
|
|
- }
|
|
-
|
|
switch (ace->fsm_state) {
|
|
case ACE_FSM_STATE_IDLE:
|
|
/* See if there is anything to do */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/agp/amd64-agp.c linux-2.6.29-rc3.owrt/drivers/char/agp/amd64-agp.c
|
|
--- linux-2.6.29.owrt/drivers/char/agp/amd64-agp.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/agp/amd64-agp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -271,15 +271,15 @@
|
|
nb_order = (nb_order >> 1) & 7;
|
|
pci_read_config_dword(nb, AMD64_GARTAPERTUREBASE, &nb_base);
|
|
nb_aper = nb_base << 25;
|
|
+ if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order)) {
|
|
+ return 0;
|
|
+ }
|
|
|
|
/* Northbridge seems to contain crap. Try the AGP bridge. */
|
|
|
|
pci_read_config_word(agp, cap+0x14, &apsize);
|
|
- if (apsize == 0xffff) {
|
|
- if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order))
|
|
- return 0;
|
|
+ if (apsize == 0xffff)
|
|
return -1;
|
|
- }
|
|
|
|
apsize &= 0xfff;
|
|
/* Some BIOS use weird encodings not in the AGPv3 table. */
|
|
@@ -301,11 +301,6 @@
|
|
order = nb_order;
|
|
}
|
|
|
|
- if (nb_order >= order) {
|
|
- if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order))
|
|
- return 0;
|
|
- }
|
|
-
|
|
dev_info(&agp->dev, "aperture from AGP @ %Lx size %u MB\n",
|
|
aper, 32 << order);
|
|
if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/agp/intel-agp.c linux-2.6.29-rc3.owrt/drivers/char/agp/intel-agp.c
|
|
--- linux-2.6.29.owrt/drivers/char/agp/intel-agp.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/agp/intel-agp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -633,15 +633,13 @@
|
|
break;
|
|
}
|
|
}
|
|
- if (gtt_entries > 0) {
|
|
+ if (gtt_entries > 0)
|
|
dev_info(&agp_bridge->dev->dev, "detected %dK %s memory\n",
|
|
gtt_entries / KB(1), local ? "local" : "stolen");
|
|
- gtt_entries /= KB(4);
|
|
- } else {
|
|
+ else
|
|
dev_info(&agp_bridge->dev->dev,
|
|
"no pre-allocated video memory detected\n");
|
|
- gtt_entries = 0;
|
|
- }
|
|
+ gtt_entries /= KB(4);
|
|
|
|
intel_private.gtt_entries = gtt_entries;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/agp/parisc-agp.c linux-2.6.29-rc3.owrt/drivers/char/agp/parisc-agp.c
|
|
--- linux-2.6.29.owrt/drivers/char/agp/parisc-agp.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/agp/parisc-agp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -359,16 +359,9 @@
|
|
return error;
|
|
}
|
|
|
|
-static int
|
|
-find_quicksilver(struct device *dev, void *data)
|
|
-{
|
|
- struct parisc_device **lba = data;
|
|
- struct parisc_device *padev = to_parisc_device(dev);
|
|
-
|
|
- if (IS_QUICKSILVER(padev))
|
|
- *lba = padev;
|
|
-
|
|
- return 0;
|
|
+static struct device *next_device(struct klist_iter *i) {
|
|
+ struct klist_node * n = klist_next(i);
|
|
+ return n ? container_of(n, struct device, knode_parent) : NULL;
|
|
}
|
|
|
|
static int
|
|
@@ -379,6 +372,8 @@
|
|
int err = -1;
|
|
struct parisc_device *sba = NULL, *lba = NULL;
|
|
struct lba_device *lbadev = NULL;
|
|
+ struct device *dev = NULL;
|
|
+ struct klist_iter i;
|
|
|
|
if (!sba_list)
|
|
goto out;
|
|
@@ -391,7 +386,13 @@
|
|
}
|
|
|
|
/* Now search our Pluto for our precious AGP device... */
|
|
- device_for_each_child(&sba->dev, &lba, find_quicksilver);
|
|
+ klist_iter_init(&sba->dev.klist_children, &i);
|
|
+ while ((dev = next_device(&i))) {
|
|
+ struct parisc_device *padev = to_parisc_device(dev);
|
|
+ if (IS_QUICKSILVER(padev))
|
|
+ lba = padev;
|
|
+ }
|
|
+ klist_iter_exit(&i);
|
|
|
|
if (!lba) {
|
|
printk(KERN_INFO DRVPFX "No AGP devices found.\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/hvcs.c linux-2.6.29-rc3.owrt/drivers/char/hvcs.c
|
|
--- linux-2.6.29.owrt/drivers/char/hvcs.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/hvcs.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1139,6 +1139,15 @@
|
|
hvcsd->tty = tty;
|
|
tty->driver_data = hvcsd;
|
|
|
|
+ /*
|
|
+ * Set this driver to low latency so that we actually have a chance at
|
|
+ * catching a throttled TTY after we flip_buffer_push. Otherwise the
|
|
+ * flush_to_async may not execute until after the kernel_thread has
|
|
+ * yielded and resumed the next flip_buffer_push resulting in data
|
|
+ * loss.
|
|
+ */
|
|
+ tty->low_latency = 1;
|
|
+
|
|
memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/hvsi.c linux-2.6.29-rc3.owrt/drivers/char/hvsi.c
|
|
--- linux-2.6.29.owrt/drivers/char/hvsi.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/hvsi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -810,6 +810,7 @@
|
|
hp = &hvsi_ports[line];
|
|
|
|
tty->driver_data = hp;
|
|
+ tty->low_latency = 1; /* avoid throttle/tty_flip_buffer_push race */
|
|
|
|
mb();
|
|
if (hp->state == HVSI_FSP_DIED)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/Kconfig linux-2.6.29-rc3.owrt/drivers/char/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/char/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -761,7 +761,7 @@
|
|
|
|
config NVRAM
|
|
tristate "/dev/nvram support"
|
|
- depends on ATARI || X86 || (ARM && RTC_DRV_CMOS) || GENERIC_NVRAM
|
|
+ depends on ATARI || X86 || ARM || GENERIC_NVRAM
|
|
---help---
|
|
If you say Y here and create a character special file /dev/nvram
|
|
with major number 10 and minor number 144 using mknod ("man mknod"),
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/scc.h linux-2.6.29-rc3.owrt/drivers/char/scc.h
|
|
--- linux-2.6.29.owrt/drivers/char/scc.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/scc.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -387,7 +387,7 @@
|
|
/* The SCC needs 3.5 PCLK cycles recovery time between to register
|
|
* accesses. PCLK runs with 8 MHz on an Atari, so this delay is 3.5 *
|
|
* 125 ns = 437.5 ns. This is too short for udelay().
|
|
- * 10/16/95: A tstb st_mfp.par_dt_reg takes 600ns (sure?) and thus should be
|
|
+ * 10/16/95: A tstb mfp.par_dt_reg takes 600ns (sure?) and thus should be
|
|
* quite right
|
|
*/
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/selection.c linux-2.6.29-rc3.owrt/drivers/char/selection.c
|
|
--- linux-2.6.29.owrt/drivers/char/selection.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/selection.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -268,7 +268,7 @@
|
|
|
|
/* Allocate a new buffer before freeing the old one ... */
|
|
multiplier = use_unicode ? 3 : 1; /* chars can take up to 3 bytes */
|
|
- bp = kmalloc(((sel_end-sel_start)/2+1)*multiplier, GFP_KERNEL);
|
|
+ bp = kmalloc((sel_end-sel_start)/2*multiplier+1, GFP_KERNEL);
|
|
if (!bp) {
|
|
printk(KERN_WARNING "selection: kmalloc() failed\n");
|
|
clear_selection();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/sx.c linux-2.6.29-rc3.owrt/drivers/char/sx.c
|
|
--- linux-2.6.29.owrt/drivers/char/sx.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/sx.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1713,8 +1713,8 @@
|
|
for (i = 0; i < SX_NBOARDS; i++)
|
|
sx_dprintk(SX_DEBUG_FIRMWARE, "<%x> ", boards[i].flags);
|
|
sx_dprintk(SX_DEBUG_FIRMWARE, "\n");
|
|
- rc = -EIO;
|
|
- goto out;
|
|
+ unlock_kernel();
|
|
+ return -EIO;
|
|
}
|
|
|
|
switch (cmd) {
|
|
@@ -1746,10 +1746,8 @@
|
|
sx_dprintk(SX_DEBUG_FIRMWARE, "returning type= %ld\n", rc);
|
|
break;
|
|
case SXIO_DO_RAMTEST:
|
|
- if (sx_initialized) { /* Already initialized: better not ramtest the board. */
|
|
- rc = -EPERM;
|
|
- break;
|
|
- }
|
|
+ if (sx_initialized) /* Already initialized: better not ramtest the board. */
|
|
+ return -EPERM;
|
|
if (IS_SX_BOARD(board)) {
|
|
rc = do_memtest(board, 0, 0x7000);
|
|
if (!rc)
|
|
@@ -1789,7 +1787,7 @@
|
|
nbytes - i : SX_CHUNK_SIZE)) {
|
|
kfree(tmp);
|
|
rc = -EFAULT;
|
|
- goto out;
|
|
+ break;
|
|
}
|
|
memcpy_toio(board->base2 + offset + i, tmp,
|
|
(i + SX_CHUNK_SIZE > nbytes) ?
|
|
@@ -1846,7 +1844,6 @@
|
|
rc = -ENOTTY;
|
|
break;
|
|
}
|
|
-out:
|
|
unlock_kernel();
|
|
func_exit();
|
|
return rc;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/char/tpm/tpm_infineon.c linux-2.6.29-rc3.owrt/drivers/char/tpm/tpm_infineon.c
|
|
--- linux-2.6.29.owrt/drivers/char/tpm/tpm_infineon.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/char/tpm/tpm_infineon.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -4,7 +4,7 @@
|
|
* SLD 9630 TT 1.1 and SLB 9635 TT 1.2 Trusted Platform Module
|
|
* Specifications at www.trustedcomputinggroup.org
|
|
*
|
|
- * Copyright (C) 2005, Marcel Selhorst <m.selhorst@sirrix.com>
|
|
+ * Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
|
|
* Sirrix AG - security technologies, http://www.sirrix.com and
|
|
* Applied Data Security Group, Ruhr-University Bochum, Germany
|
|
* Project-Homepage: http://www.prosec.rub.de/tpm
|
|
@@ -636,7 +636,7 @@
|
|
module_init(init_inf);
|
|
module_exit(cleanup_inf);
|
|
|
|
-MODULE_AUTHOR("Marcel Selhorst <m.selhorst@sirrix.com>");
|
|
+MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
|
|
MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
|
|
MODULE_VERSION("1.9");
|
|
MODULE_LICENSE("GPL");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/cpufreq/cpufreq.c linux-2.6.29-rc3.owrt/drivers/cpufreq/cpufreq.c
|
|
--- linux-2.6.29.owrt/drivers/cpufreq/cpufreq.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/cpufreq/cpufreq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -754,6 +754,11 @@
|
|
.release = cpufreq_sysfs_release,
|
|
};
|
|
|
|
+static struct kobj_type ktype_empty_cpufreq = {
|
|
+ .sysfs_ops = &sysfs_ops,
|
|
+ .release = cpufreq_sysfs_release,
|
|
+};
|
|
+
|
|
|
|
/**
|
|
* cpufreq_add_dev - add a CPU device
|
|
@@ -887,26 +892,36 @@
|
|
memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
|
|
|
|
/* prepare interface data */
|
|
- ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, &sys_dev->kobj,
|
|
- "cpufreq");
|
|
- if (ret)
|
|
- goto err_out_driver_exit;
|
|
-
|
|
- /* set up files for this cpu device */
|
|
- drv_attr = cpufreq_driver->attr;
|
|
- while ((drv_attr) && (*drv_attr)) {
|
|
- ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
|
|
+ if (!cpufreq_driver->hide_interface) {
|
|
+ ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
|
|
+ &sys_dev->kobj, "cpufreq");
|
|
if (ret)
|
|
goto err_out_driver_exit;
|
|
- drv_attr++;
|
|
- }
|
|
- if (cpufreq_driver->get) {
|
|
- ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
|
|
- if (ret)
|
|
- goto err_out_driver_exit;
|
|
- }
|
|
- if (cpufreq_driver->target) {
|
|
- ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
|
|
+
|
|
+ /* set up files for this cpu device */
|
|
+ drv_attr = cpufreq_driver->attr;
|
|
+ while ((drv_attr) && (*drv_attr)) {
|
|
+ ret = sysfs_create_file(&policy->kobj,
|
|
+ &((*drv_attr)->attr));
|
|
+ if (ret)
|
|
+ goto err_out_driver_exit;
|
|
+ drv_attr++;
|
|
+ }
|
|
+ if (cpufreq_driver->get) {
|
|
+ ret = sysfs_create_file(&policy->kobj,
|
|
+ &cpuinfo_cur_freq.attr);
|
|
+ if (ret)
|
|
+ goto err_out_driver_exit;
|
|
+ }
|
|
+ if (cpufreq_driver->target) {
|
|
+ ret = sysfs_create_file(&policy->kobj,
|
|
+ &scaling_cur_freq.attr);
|
|
+ if (ret)
|
|
+ goto err_out_driver_exit;
|
|
+ }
|
|
+ } else {
|
|
+ ret = kobject_init_and_add(&policy->kobj, &ktype_empty_cpufreq,
|
|
+ &sys_dev->kobj, "cpufreq");
|
|
if (ret)
|
|
goto err_out_driver_exit;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/cpufreq/cpufreq_ondemand.c linux-2.6.29-rc3.owrt/drivers/cpufreq/cpufreq_ondemand.c
|
|
--- linux-2.6.29.owrt/drivers/cpufreq/cpufreq_ondemand.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/cpufreq/cpufreq_ondemand.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -117,7 +117,11 @@
|
|
busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.irq);
|
|
busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.softirq);
|
|
busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.steal);
|
|
- busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.nice);
|
|
+
|
|
+ if (!dbs_tuners_ins.ignore_nice) {
|
|
+ busy_time = cputime64_add(busy_time,
|
|
+ kstat_cpu(cpu).cpustat.nice);
|
|
+ }
|
|
|
|
idle_time = cputime64_sub(cur_wall_time, busy_time);
|
|
if (wall)
|
|
@@ -133,6 +137,23 @@
|
|
if (idle_time == -1ULL)
|
|
return get_cpu_idle_time_jiffy(cpu, wall);
|
|
|
|
+ if (dbs_tuners_ins.ignore_nice) {
|
|
+ cputime64_t cur_nice;
|
|
+ unsigned long cur_nice_jiffies;
|
|
+ struct cpu_dbs_info_s *dbs_info;
|
|
+
|
|
+ dbs_info = &per_cpu(cpu_dbs_info, cpu);
|
|
+ cur_nice = cputime64_sub(kstat_cpu(cpu).cpustat.nice,
|
|
+ dbs_info->prev_cpu_nice);
|
|
+ /*
|
|
+ * Assumption: nice time between sampling periods will be
|
|
+ * less than 2^32 jiffies for 32 bit sys
|
|
+ */
|
|
+ cur_nice_jiffies = (unsigned long)
|
|
+ cputime64_to_jiffies64(cur_nice);
|
|
+ dbs_info->prev_cpu_nice = kstat_cpu(cpu).cpustat.nice;
|
|
+ return idle_time + jiffies_to_usecs(cur_nice_jiffies);
|
|
+ }
|
|
return idle_time;
|
|
}
|
|
|
|
@@ -298,9 +319,6 @@
|
|
dbs_info = &per_cpu(cpu_dbs_info, j);
|
|
dbs_info->prev_cpu_idle = get_cpu_idle_time(j,
|
|
&dbs_info->prev_cpu_wall);
|
|
- if (dbs_tuners_ins.ignore_nice)
|
|
- dbs_info->prev_cpu_nice = kstat_cpu(j).cpustat.nice;
|
|
-
|
|
}
|
|
mutex_unlock(&dbs_mutex);
|
|
|
|
@@ -401,23 +419,6 @@
|
|
j_dbs_info->prev_cpu_idle);
|
|
j_dbs_info->prev_cpu_idle = cur_idle_time;
|
|
|
|
- if (dbs_tuners_ins.ignore_nice) {
|
|
- cputime64_t cur_nice;
|
|
- unsigned long cur_nice_jiffies;
|
|
-
|
|
- cur_nice = cputime64_sub(kstat_cpu(j).cpustat.nice,
|
|
- j_dbs_info->prev_cpu_nice);
|
|
- /*
|
|
- * Assumption: nice time between sampling periods will
|
|
- * be less than 2^32 jiffies for 32 bit sys
|
|
- */
|
|
- cur_nice_jiffies = (unsigned long)
|
|
- cputime64_to_jiffies64(cur_nice);
|
|
-
|
|
- j_dbs_info->prev_cpu_nice = kstat_cpu(j).cpustat.nice;
|
|
- idle_time += jiffies_to_usecs(cur_nice_jiffies);
|
|
- }
|
|
-
|
|
if (unlikely(!wall_time || wall_time < idle_time))
|
|
continue;
|
|
|
|
@@ -574,10 +575,6 @@
|
|
|
|
j_dbs_info->prev_cpu_idle = get_cpu_idle_time(j,
|
|
&j_dbs_info->prev_cpu_wall);
|
|
- if (dbs_tuners_ins.ignore_nice) {
|
|
- j_dbs_info->prev_cpu_nice =
|
|
- kstat_cpu(j).cpustat.nice;
|
|
- }
|
|
}
|
|
this_dbs_info->cpu = cpu;
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/crypto/ixp4xx_crypto.c linux-2.6.29-rc3.owrt/drivers/crypto/ixp4xx_crypto.c
|
|
--- linux-2.6.29.owrt/drivers/crypto/ixp4xx_crypto.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/crypto/ixp4xx_crypto.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -457,12 +457,10 @@
|
|
if (!ctx_pool) {
|
|
goto err;
|
|
}
|
|
- ret = qmgr_request_queue(SEND_QID, NPE_QLEN_TOTAL, 0, 0,
|
|
- "ixp_crypto:out", NULL);
|
|
+ ret = qmgr_request_queue(SEND_QID, NPE_QLEN_TOTAL, 0, 0);
|
|
if (ret)
|
|
goto err;
|
|
- ret = qmgr_request_queue(RECV_QID, NPE_QLEN, 0, 0,
|
|
- "ixp_crypto:in", NULL);
|
|
+ ret = qmgr_request_queue(RECV_QID, NPE_QLEN, 0, 0);
|
|
if (ret) {
|
|
qmgr_release_queue(SEND_QID);
|
|
goto err;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/crypto/padlock-aes.c linux-2.6.29-rc3.owrt/drivers/crypto/padlock-aes.c
|
|
--- linux-2.6.29.owrt/drivers/crypto/padlock-aes.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/crypto/padlock-aes.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -489,4 +489,4 @@
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_AUTHOR("Michal Ludvig");
|
|
|
|
-MODULE_ALIAS("aes-all");
|
|
+MODULE_ALIAS("aes");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/crypto/padlock-sha.c linux-2.6.29-rc3.owrt/drivers/crypto/padlock-sha.c
|
|
--- linux-2.6.29.owrt/drivers/crypto/padlock-sha.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/crypto/padlock-sha.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -304,7 +304,7 @@
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_AUTHOR("Michal Ludvig");
|
|
|
|
-MODULE_ALIAS("sha1-all");
|
|
-MODULE_ALIAS("sha256-all");
|
|
+MODULE_ALIAS("sha1");
|
|
+MODULE_ALIAS("sha256");
|
|
MODULE_ALIAS("sha1-padlock");
|
|
MODULE_ALIAS("sha256-padlock");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dca/dca-core.c linux-2.6.29-rc3.owrt/drivers/dca/dca-core.c
|
|
--- linux-2.6.29.owrt/drivers/dca/dca-core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dca/dca-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
|
+ * Copyright(c) 2007 Intel Corporation. All rights reserved.
|
|
*
|
|
* 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
|
|
@@ -28,7 +28,7 @@
|
|
#include <linux/device.h>
|
|
#include <linux/dca.h>
|
|
|
|
-#define DCA_VERSION "1.8"
|
|
+#define DCA_VERSION "1.4"
|
|
|
|
MODULE_VERSION(DCA_VERSION);
|
|
MODULE_LICENSE("GPL");
|
|
@@ -60,17 +60,16 @@
|
|
{
|
|
struct dca_provider *dca;
|
|
int err, slot = -ENODEV;
|
|
- unsigned long flags;
|
|
|
|
if (!dev)
|
|
return -EFAULT;
|
|
|
|
- spin_lock_irqsave(&dca_lock, flags);
|
|
+ spin_lock(&dca_lock);
|
|
|
|
/* check if the requester has not been added already */
|
|
dca = dca_find_provider_by_dev(dev);
|
|
if (dca) {
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
+ spin_unlock(&dca_lock);
|
|
return -EEXIST;
|
|
}
|
|
|
|
@@ -79,21 +78,19 @@
|
|
if (slot >= 0)
|
|
break;
|
|
}
|
|
-
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
-
|
|
- if (slot < 0)
|
|
+ if (slot < 0) {
|
|
+ spin_unlock(&dca_lock);
|
|
return slot;
|
|
+ }
|
|
|
|
err = dca_sysfs_add_req(dca, dev, slot);
|
|
if (err) {
|
|
- spin_lock_irqsave(&dca_lock, flags);
|
|
- if (dca == dca_find_provider_by_dev(dev))
|
|
- dca->ops->remove_requester(dca, dev);
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
+ dca->ops->remove_requester(dca, dev);
|
|
+ spin_unlock(&dca_lock);
|
|
return err;
|
|
}
|
|
|
|
+ spin_unlock(&dca_lock);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(dca_add_requester);
|
|
@@ -106,25 +103,25 @@
|
|
{
|
|
struct dca_provider *dca;
|
|
int slot;
|
|
- unsigned long flags;
|
|
|
|
if (!dev)
|
|
return -EFAULT;
|
|
|
|
- spin_lock_irqsave(&dca_lock, flags);
|
|
+ spin_lock(&dca_lock);
|
|
dca = dca_find_provider_by_dev(dev);
|
|
if (!dca) {
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
+ spin_unlock(&dca_lock);
|
|
return -ENODEV;
|
|
}
|
|
slot = dca->ops->remove_requester(dca, dev);
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
-
|
|
- if (slot < 0)
|
|
+ if (slot < 0) {
|
|
+ spin_unlock(&dca_lock);
|
|
return slot;
|
|
+ }
|
|
|
|
dca_sysfs_remove_req(dca, slot);
|
|
|
|
+ spin_unlock(&dca_lock);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(dca_remove_requester);
|
|
@@ -138,18 +135,17 @@
|
|
{
|
|
struct dca_provider *dca;
|
|
u8 tag;
|
|
- unsigned long flags;
|
|
|
|
- spin_lock_irqsave(&dca_lock, flags);
|
|
+ spin_lock(&dca_lock);
|
|
|
|
dca = dca_find_provider_by_dev(dev);
|
|
if (!dca) {
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
+ spin_unlock(&dca_lock);
|
|
return -ENODEV;
|
|
}
|
|
tag = dca->ops->get_tag(dca, dev, cpu);
|
|
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
+ spin_unlock(&dca_lock);
|
|
return tag;
|
|
}
|
|
|
|
@@ -221,16 +217,11 @@
|
|
int register_dca_provider(struct dca_provider *dca, struct device *dev)
|
|
{
|
|
int err;
|
|
- unsigned long flags;
|
|
|
|
err = dca_sysfs_add_provider(dca, dev);
|
|
if (err)
|
|
return err;
|
|
-
|
|
- spin_lock_irqsave(&dca_lock, flags);
|
|
list_add(&dca->node, &dca_providers);
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
-
|
|
blocking_notifier_call_chain(&dca_provider_chain,
|
|
DCA_PROVIDER_ADD, NULL);
|
|
return 0;
|
|
@@ -243,15 +234,9 @@
|
|
*/
|
|
void unregister_dca_provider(struct dca_provider *dca)
|
|
{
|
|
- unsigned long flags;
|
|
-
|
|
blocking_notifier_call_chain(&dca_provider_chain,
|
|
DCA_PROVIDER_REMOVE, NULL);
|
|
-
|
|
- spin_lock_irqsave(&dca_lock, flags);
|
|
list_del(&dca->node);
|
|
- spin_unlock_irqrestore(&dca_lock, flags);
|
|
-
|
|
dca_sysfs_remove_provider(dca);
|
|
}
|
|
EXPORT_SYMBOL_GPL(unregister_dca_provider);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dca/dca-sysfs.c linux-2.6.29-rc3.owrt/drivers/dca/dca-sysfs.c
|
|
--- linux-2.6.29.owrt/drivers/dca/dca-sysfs.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dca/dca-sysfs.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,24 +1,3 @@
|
|
-/*
|
|
- * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the Free
|
|
- * Software Foundation; either version 2 of the License, or (at your option)
|
|
- * any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but WITHOUT
|
|
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
- * more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
- * this program; if not, write to the Free Software Foundation, Inc., 59
|
|
- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
- *
|
|
- * The full GNU General Public License is included in this distribution in the
|
|
- * file called COPYING.
|
|
- */
|
|
-
|
|
#include <linux/kernel.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/device.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/dmaengine.c linux-2.6.29-rc3.owrt/drivers/dma/dmaengine.c
|
|
--- linux-2.6.29.owrt/drivers/dma/dmaengine.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/dmaengine.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -518,7 +518,6 @@
|
|
dma_chan_name(chan), err);
|
|
else
|
|
break;
|
|
- chan->private = NULL;
|
|
chan = NULL;
|
|
}
|
|
}
|
|
@@ -537,7 +536,6 @@
|
|
WARN_ONCE(chan->client_count != 1,
|
|
"chan reference count %d != 1\n", chan->client_count);
|
|
dma_chan_put(chan);
|
|
- chan->private = NULL;
|
|
mutex_unlock(&dma_list_mutex);
|
|
}
|
|
EXPORT_SYMBOL_GPL(dma_release_channel);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/dmatest.c linux-2.6.29-rc3.owrt/drivers/dma/dmatest.c
|
|
--- linux-2.6.29.owrt/drivers/dma/dmatest.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/dmatest.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -430,15 +430,13 @@
|
|
static void __exit dmatest_exit(void)
|
|
{
|
|
struct dmatest_chan *dtc, *_dtc;
|
|
- struct dma_chan *chan;
|
|
|
|
list_for_each_entry_safe(dtc, _dtc, &dmatest_channels, node) {
|
|
list_del(&dtc->node);
|
|
- chan = dtc->chan;
|
|
dmatest_cleanup_channel(dtc);
|
|
pr_debug("dmatest: dropped channel %s\n",
|
|
- dma_chan_name(chan));
|
|
- dma_release_channel(chan);
|
|
+ dma_chan_name(dtc->chan));
|
|
+ dma_release_channel(dtc->chan);
|
|
}
|
|
}
|
|
module_exit(dmatest_exit);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/dw_dmac.c linux-2.6.29-rc3.owrt/drivers/dma/dw_dmac.c
|
|
--- linux-2.6.29.owrt/drivers/dma/dw_dmac.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/dw_dmac.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -560,7 +560,7 @@
|
|
unsigned long flags)
|
|
{
|
|
struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
|
|
- struct dw_dma_slave *dws = chan->private;
|
|
+ struct dw_dma_slave *dws = dwc->dws;
|
|
struct dw_desc *prev;
|
|
struct dw_desc *first;
|
|
u32 ctllo;
|
|
@@ -790,7 +790,7 @@
|
|
cfghi = DWC_CFGH_FIFO_MODE;
|
|
cfglo = 0;
|
|
|
|
- dws = chan->private;
|
|
+ dws = dwc->dws;
|
|
if (dws) {
|
|
/*
|
|
* We need controller-specific data to set up slave
|
|
@@ -866,6 +866,7 @@
|
|
spin_lock_bh(&dwc->lock);
|
|
list_splice_init(&dwc->free_list, &list);
|
|
dwc->descs_allocated = 0;
|
|
+ dwc->dws = NULL;
|
|
|
|
/* Disable interrupts */
|
|
channel_clear_bit(dw, MASK.XFER, dwc->mask);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/dw_dmac_regs.h linux-2.6.29-rc3.owrt/drivers/dma/dw_dmac_regs.h
|
|
--- linux-2.6.29.owrt/drivers/dma/dw_dmac_regs.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/dw_dmac_regs.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -139,6 +139,8 @@
|
|
struct list_head queue;
|
|
struct list_head free_list;
|
|
|
|
+ struct dw_dma_slave *dws;
|
|
+
|
|
unsigned int descs_allocated;
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/fsldma.c linux-2.6.29-rc3.owrt/drivers/dma/fsldma.c
|
|
--- linux-2.6.29.owrt/drivers/dma/fsldma.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/fsldma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -158,8 +158,7 @@
|
|
|
|
static void dma_halt(struct fsl_dma_chan *fsl_chan)
|
|
{
|
|
- int i;
|
|
-
|
|
+ int i = 0;
|
|
DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr,
|
|
DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | FSL_DMA_MR_CA,
|
|
32);
|
|
@@ -167,11 +166,8 @@
|
|
DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) & ~(FSL_DMA_MR_CS
|
|
| FSL_DMA_MR_EMS_EN | FSL_DMA_MR_CA), 32);
|
|
|
|
- for (i = 0; i < 100; i++) {
|
|
- if (dma_is_idle(fsl_chan))
|
|
- break;
|
|
+ while (!dma_is_idle(fsl_chan) && (i++ < 100))
|
|
udelay(10);
|
|
- }
|
|
if (i >= 100 && !dma_is_idle(fsl_chan))
|
|
dev_err(fsl_chan->dev, "DMA halt timeout!\n");
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/ioat.c linux-2.6.29-rc3.owrt/drivers/dma/ioat.c
|
|
--- linux-2.6.29.owrt/drivers/dma/ioat.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/ioat.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,6 +1,6 @@
|
|
/*
|
|
* Intel I/OAT DMA Linux driver
|
|
- * Copyright(c) 2007 - 2009 Intel Corporation.
|
|
+ * Copyright(c) 2007 Intel Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/ioat_dca.c linux-2.6.29-rc3.owrt/drivers/dma/ioat_dca.c
|
|
--- linux-2.6.29.owrt/drivers/dma/ioat_dca.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/ioat_dca.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,6 +1,6 @@
|
|
/*
|
|
* Intel I/OAT DMA Linux driver
|
|
- * Copyright(c) 2007 - 2009 Intel Corporation.
|
|
+ * Copyright(c) 2007 Intel Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
@@ -49,23 +49,6 @@
|
|
|
|
#define DCA_TAG_MAP_MASK 0xDF
|
|
|
|
-/* expected tag map bytes for I/OAT ver.2 */
|
|
-#define DCA2_TAG_MAP_BYTE0 0x80
|
|
-#define DCA2_TAG_MAP_BYTE1 0x0
|
|
-#define DCA2_TAG_MAP_BYTE2 0x81
|
|
-#define DCA2_TAG_MAP_BYTE3 0x82
|
|
-#define DCA2_TAG_MAP_BYTE4 0x82
|
|
-
|
|
-/* verify if tag map matches expected values */
|
|
-static inline int dca2_tag_map_valid(u8 *tag_map)
|
|
-{
|
|
- return ((tag_map[0] == DCA2_TAG_MAP_BYTE0) &&
|
|
- (tag_map[1] == DCA2_TAG_MAP_BYTE1) &&
|
|
- (tag_map[2] == DCA2_TAG_MAP_BYTE2) &&
|
|
- (tag_map[3] == DCA2_TAG_MAP_BYTE3) &&
|
|
- (tag_map[4] == DCA2_TAG_MAP_BYTE4));
|
|
-}
|
|
-
|
|
/*
|
|
* "Legacy" DCA systems do not implement the DCA register set in the
|
|
* I/OAT device. Software needs direct support for their tag mappings.
|
|
@@ -469,13 +452,6 @@
|
|
ioatdca->tag_map[i] = 0;
|
|
}
|
|
|
|
- if (!dca2_tag_map_valid(ioatdca->tag_map)) {
|
|
- dev_err(&pdev->dev, "APICID_TAG_MAP set incorrectly by BIOS, "
|
|
- "disabling DCA\n");
|
|
- free_dca_provider(dca);
|
|
- return NULL;
|
|
- }
|
|
-
|
|
err = register_dca_provider(dca, &pdev->dev);
|
|
if (err) {
|
|
free_dca_provider(dca);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/ioat_dma.c linux-2.6.29-rc3.owrt/drivers/dma/ioat_dma.c
|
|
--- linux-2.6.29.owrt/drivers/dma/ioat_dma.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/ioat_dma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,6 +1,6 @@
|
|
/*
|
|
* Intel I/OAT DMA Linux driver
|
|
- * Copyright(c) 2004 - 2009 Intel Corporation.
|
|
+ * Copyright(c) 2004 - 2007 Intel Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
@@ -189,13 +189,11 @@
|
|
ioat_chan->xfercap = xfercap;
|
|
ioat_chan->desccount = 0;
|
|
INIT_DELAYED_WORK(&ioat_chan->work, ioat_dma_chan_reset_part2);
|
|
- if (ioat_chan->device->version == IOAT_VER_2_0)
|
|
- writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE |
|
|
- IOAT_DMA_DCA_ANY_CPU,
|
|
- ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
|
|
- else if (ioat_chan->device->version == IOAT_VER_3_0)
|
|
- writel(IOAT_DMA_DCA_ANY_CPU,
|
|
- ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
|
|
+ if (ioat_chan->device->version != IOAT_VER_1_2) {
|
|
+ writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE
|
|
+ | IOAT_DMA_DCA_ANY_CPU,
|
|
+ ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
|
|
+ }
|
|
spin_lock_init(&ioat_chan->cleanup_lock);
|
|
spin_lock_init(&ioat_chan->desc_lock);
|
|
INIT_LIST_HEAD(&ioat_chan->free_desc);
|
|
@@ -1171,8 +1169,9 @@
|
|
* up if the client is done with the descriptor
|
|
*/
|
|
if (async_tx_test_ack(&desc->async_tx)) {
|
|
- list_move_tail(&desc->node,
|
|
- &ioat_chan->free_desc);
|
|
+ list_del(&desc->node);
|
|
+ list_add_tail(&desc->node,
|
|
+ &ioat_chan->free_desc);
|
|
} else
|
|
desc->async_tx.cookie = 0;
|
|
} else {
|
|
@@ -1363,7 +1362,6 @@
|
|
dma_cookie_t cookie;
|
|
int err = 0;
|
|
struct completion cmp;
|
|
- unsigned long tmo;
|
|
|
|
src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);
|
|
if (!src)
|
|
@@ -1415,10 +1413,9 @@
|
|
}
|
|
device->common.device_issue_pending(dma_chan);
|
|
|
|
- tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000));
|
|
+ wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000));
|
|
|
|
- if (tmo == 0 ||
|
|
- device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL)
|
|
+ if (device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL)
|
|
!= DMA_SUCCESS) {
|
|
dev_err(&device->pdev->dev,
|
|
"Self-test copy timed out, disabling\n");
|
|
@@ -1660,13 +1657,6 @@
|
|
" %d channels, device version 0x%02x, driver version %s\n",
|
|
device->common.chancnt, device->version, IOAT_DMA_VERSION);
|
|
|
|
- if (!device->common.chancnt) {
|
|
- dev_err(&device->pdev->dev,
|
|
- "Intel(R) I/OAT DMA Engine problem found: "
|
|
- "zero channels detected\n");
|
|
- goto err_setup_interrupts;
|
|
- }
|
|
-
|
|
err = ioat_dma_setup_interrupts(device);
|
|
if (err)
|
|
goto err_setup_interrupts;
|
|
@@ -1706,9 +1696,6 @@
|
|
struct dma_chan *chan, *_chan;
|
|
struct ioat_dma_chan *ioat_chan;
|
|
|
|
- if (device->version != IOAT_VER_3_0)
|
|
- cancel_delayed_work(&device->work);
|
|
-
|
|
ioat_dma_remove_interrupts(device);
|
|
|
|
dma_async_device_unregister(&device->common);
|
|
@@ -1720,6 +1707,10 @@
|
|
pci_release_regions(device->pdev);
|
|
pci_disable_device(device->pdev);
|
|
|
|
+ if (device->version != IOAT_VER_3_0) {
|
|
+ cancel_delayed_work(&device->work);
|
|
+ }
|
|
+
|
|
list_for_each_entry_safe(chan, _chan,
|
|
&device->common.channels, device_node) {
|
|
ioat_chan = to_ioat_chan(chan);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/ioatdma.h linux-2.6.29-rc3.owrt/drivers/dma/ioatdma.h
|
|
--- linux-2.6.29.owrt/drivers/dma/ioatdma.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/ioatdma.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.
|
|
+ * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved.
|
|
*
|
|
* 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
|
|
@@ -29,7 +29,7 @@
|
|
#include <linux/pci_ids.h>
|
|
#include <net/tcp.h>
|
|
|
|
-#define IOAT_DMA_VERSION "3.64"
|
|
+#define IOAT_DMA_VERSION "3.30"
|
|
|
|
enum ioat_interrupt {
|
|
none = 0,
|
|
@@ -135,14 +135,12 @@
|
|
#ifdef CONFIG_NET_DMA
|
|
switch (dev->version) {
|
|
case IOAT_VER_1_2:
|
|
+ case IOAT_VER_3_0:
|
|
sysctl_tcp_dma_copybreak = 4096;
|
|
break;
|
|
case IOAT_VER_2_0:
|
|
sysctl_tcp_dma_copybreak = 2048;
|
|
break;
|
|
- case IOAT_VER_3_0:
|
|
- sysctl_tcp_dma_copybreak = 262144;
|
|
- break;
|
|
}
|
|
#endif
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/ioatdma_hw.h linux-2.6.29-rc3.owrt/drivers/dma/ioatdma_hw.h
|
|
--- linux-2.6.29.owrt/drivers/dma/ioatdma_hw.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/ioatdma_hw.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.
|
|
+ * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved.
|
|
*
|
|
* 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
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/ioatdma_registers.h linux-2.6.29-rc3.owrt/drivers/dma/ioatdma_registers.h
|
|
--- linux-2.6.29.owrt/drivers/dma/ioatdma_registers.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/ioatdma_registers.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.
|
|
+ * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved.
|
|
*
|
|
* 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
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/iop-adma.c linux-2.6.29-rc3.owrt/drivers/dma/iop-adma.c
|
|
--- linux-2.6.29.owrt/drivers/dma/iop-adma.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/iop-adma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -928,19 +928,19 @@
|
|
|
|
for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {
|
|
xor_srcs[src_idx] = alloc_page(GFP_KERNEL);
|
|
- if (!xor_srcs[src_idx]) {
|
|
- while (src_idx--)
|
|
+ if (!xor_srcs[src_idx])
|
|
+ while (src_idx--) {
|
|
__free_page(xor_srcs[src_idx]);
|
|
- return -ENOMEM;
|
|
- }
|
|
+ return -ENOMEM;
|
|
+ }
|
|
}
|
|
|
|
dest = alloc_page(GFP_KERNEL);
|
|
- if (!dest) {
|
|
- while (src_idx--)
|
|
+ if (!dest)
|
|
+ while (src_idx--) {
|
|
__free_page(xor_srcs[src_idx]);
|
|
- return -ENOMEM;
|
|
- }
|
|
+ return -ENOMEM;
|
|
+ }
|
|
|
|
/* Fill in src buffers */
|
|
for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {
|
|
@@ -1401,7 +1401,7 @@
|
|
|
|
static struct platform_driver iop_adma_driver = {
|
|
.probe = iop_adma_probe,
|
|
- .remove = __devexit_p(iop_adma_remove),
|
|
+ .remove = iop_adma_remove,
|
|
.driver = {
|
|
.owner = THIS_MODULE,
|
|
.name = "iop-adma",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/ipu/ipu_idmac.c linux-2.6.29-rc3.owrt/drivers/dma/ipu/ipu_idmac.c
|
|
--- linux-2.6.29.owrt/drivers/dma/ipu/ipu_idmac.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/ipu/ipu_idmac.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -729,7 +729,7 @@
|
|
|
|
ichan->status = IPU_CHANNEL_READY;
|
|
|
|
- spin_unlock_irqrestore(&ipu->lock, flags);
|
|
+ spin_unlock_irqrestore(ipu->lock, flags);
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/dma/mv_xor.c linux-2.6.29-rc3.owrt/drivers/dma/mv_xor.c
|
|
--- linux-2.6.29.owrt/drivers/dma/mv_xor.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/dma/mv_xor.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1019,19 +1019,19 @@
|
|
|
|
for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) {
|
|
xor_srcs[src_idx] = alloc_page(GFP_KERNEL);
|
|
- if (!xor_srcs[src_idx]) {
|
|
- while (src_idx--)
|
|
+ if (!xor_srcs[src_idx])
|
|
+ while (src_idx--) {
|
|
__free_page(xor_srcs[src_idx]);
|
|
- return -ENOMEM;
|
|
- }
|
|
+ return -ENOMEM;
|
|
+ }
|
|
}
|
|
|
|
dest = alloc_page(GFP_KERNEL);
|
|
- if (!dest) {
|
|
- while (src_idx--)
|
|
+ if (!dest)
|
|
+ while (src_idx--) {
|
|
__free_page(xor_srcs[src_idx]);
|
|
- return -ENOMEM;
|
|
- }
|
|
+ return -ENOMEM;
|
|
+ }
|
|
|
|
/* Fill in src buffers */
|
|
for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) {
|
|
@@ -1287,7 +1287,7 @@
|
|
|
|
static struct platform_driver mv_xor_driver = {
|
|
.probe = mv_xor_probe,
|
|
- .remove = __devexit_p(mv_xor_remove),
|
|
+ .remove = mv_xor_remove,
|
|
.driver = {
|
|
.owner = THIS_MODULE,
|
|
.name = MV_XOR_NAME,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/firewire/fw-card.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-card.c
|
|
--- linux-2.6.29.owrt/drivers/firewire/fw-card.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-card.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -232,7 +232,7 @@
|
|
root_id = root_node->node_id;
|
|
grace = time_after(jiffies, card->reset_jiffies + DIV_ROUND_UP(HZ, 10));
|
|
|
|
- if (is_next_generation(generation, card->bm_generation) ||
|
|
+ if (card->bm_generation + 1 == generation ||
|
|
(card->bm_generation != generation && grace)) {
|
|
/*
|
|
* This first step is to figure out who is IRM and
|
|
@@ -412,7 +412,6 @@
|
|
{
|
|
u32 *config_rom;
|
|
size_t length;
|
|
- int err;
|
|
|
|
card->max_receive = max_receive;
|
|
card->link_speed = link_speed;
|
|
@@ -423,13 +422,7 @@
|
|
list_add_tail(&card->link, &card_list);
|
|
mutex_unlock(&card_mutex);
|
|
|
|
- err = card->driver->enable(card, config_rom, length);
|
|
- if (err < 0) {
|
|
- mutex_lock(&card_mutex);
|
|
- list_del(&card->link);
|
|
- mutex_unlock(&card_mutex);
|
|
- }
|
|
- return err;
|
|
+ return card->driver->enable(card, config_rom, length);
|
|
}
|
|
EXPORT_SYMBOL(fw_card_add);
|
|
|
|
@@ -519,7 +512,7 @@
|
|
fw_core_initiate_bus_reset(card, 1);
|
|
|
|
mutex_lock(&card_mutex);
|
|
- list_del_init(&card->link);
|
|
+ list_del(&card->link);
|
|
mutex_unlock(&card_mutex);
|
|
|
|
/* Set up the dummy driver. */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/firewire/fw-device.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-device.c
|
|
--- linux-2.6.29.owrt/drivers/firewire/fw-device.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-device.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -25,7 +25,6 @@
|
|
#include <linux/device.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/idr.h>
|
|
-#include <linux/jiffies.h>
|
|
#include <linux/string.h>
|
|
#include <linux/rwsem.h>
|
|
#include <linux/semaphore.h>
|
|
@@ -635,39 +634,12 @@
|
|
return device;
|
|
}
|
|
|
|
-/*
|
|
- * These defines control the retry behavior for reading the config
|
|
- * rom. It shouldn't be necessary to tweak these; if the device
|
|
- * doesn't respond to a config rom read within 10 seconds, it's not
|
|
- * going to respond at all. As for the initial delay, a lot of
|
|
- * devices will be able to respond within half a second after bus
|
|
- * reset. On the other hand, it's not really worth being more
|
|
- * aggressive than that, since it scales pretty well; if 10 devices
|
|
- * are plugged in, they're all getting read within one second.
|
|
- */
|
|
-
|
|
-#define MAX_RETRIES 10
|
|
-#define RETRY_DELAY (3 * HZ)
|
|
-#define INITIAL_DELAY (HZ / 2)
|
|
-#define SHUTDOWN_DELAY (2 * HZ)
|
|
-
|
|
static void fw_device_shutdown(struct work_struct *work)
|
|
{
|
|
struct fw_device *device =
|
|
container_of(work, struct fw_device, work.work);
|
|
int minor = MINOR(device->device.devt);
|
|
|
|
- if (time_is_after_jiffies(device->card->reset_jiffies + SHUTDOWN_DELAY)
|
|
- && !list_empty(&device->card->link)) {
|
|
- schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
|
|
- return;
|
|
- }
|
|
-
|
|
- if (atomic_cmpxchg(&device->state,
|
|
- FW_DEVICE_GONE,
|
|
- FW_DEVICE_SHUTDOWN) != FW_DEVICE_GONE)
|
|
- return;
|
|
-
|
|
fw_device_cdev_remove(device);
|
|
device_for_each_child(&device->device, NULL, shutdown_unit);
|
|
device_unregister(&device->device);
|
|
@@ -675,7 +647,6 @@
|
|
down_write(&fw_device_rwsem);
|
|
idr_remove(&fw_device_idr, minor);
|
|
up_write(&fw_device_rwsem);
|
|
-
|
|
fw_device_put(device);
|
|
}
|
|
|
|
@@ -683,63 +654,25 @@
|
|
.release = fw_device_release,
|
|
};
|
|
|
|
-static void fw_device_update(struct work_struct *work);
|
|
-
|
|
/*
|
|
- * If a device was pending for deletion because its node went away but its
|
|
- * bus info block and root directory header matches that of a newly discovered
|
|
- * device, revive the existing fw_device.
|
|
- * The newly allocated fw_device becomes obsolete instead.
|
|
+ * These defines control the retry behavior for reading the config
|
|
+ * rom. It shouldn't be necessary to tweak these; if the device
|
|
+ * doesn't respond to a config rom read within 10 seconds, it's not
|
|
+ * going to respond at all. As for the initial delay, a lot of
|
|
+ * devices will be able to respond within half a second after bus
|
|
+ * reset. On the other hand, it's not really worth being more
|
|
+ * aggressive than that, since it scales pretty well; if 10 devices
|
|
+ * are plugged in, they're all getting read within one second.
|
|
*/
|
|
-static int lookup_existing_device(struct device *dev, void *data)
|
|
-{
|
|
- struct fw_device *old = fw_device(dev);
|
|
- struct fw_device *new = data;
|
|
- struct fw_card *card = new->card;
|
|
- int match = 0;
|
|
-
|
|
- down_read(&fw_device_rwsem); /* serialize config_rom access */
|
|
- spin_lock_irq(&card->lock); /* serialize node access */
|
|
-
|
|
- if (memcmp(old->config_rom, new->config_rom, 6 * 4) == 0 &&
|
|
- atomic_cmpxchg(&old->state,
|
|
- FW_DEVICE_GONE,
|
|
- FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
|
|
- struct fw_node *current_node = new->node;
|
|
- struct fw_node *obsolete_node = old->node;
|
|
-
|
|
- new->node = obsolete_node;
|
|
- new->node->data = new;
|
|
- old->node = current_node;
|
|
- old->node->data = old;
|
|
-
|
|
- old->max_speed = new->max_speed;
|
|
- old->node_id = current_node->node_id;
|
|
- smp_wmb(); /* update node_id before generation */
|
|
- old->generation = card->generation;
|
|
- old->config_rom_retries = 0;
|
|
- fw_notify("rediscovered device %s\n", dev_name(dev));
|
|
-
|
|
- PREPARE_DELAYED_WORK(&old->work, fw_device_update);
|
|
- schedule_delayed_work(&old->work, 0);
|
|
-
|
|
- if (current_node == card->root_node)
|
|
- fw_schedule_bm_work(card, 0);
|
|
-
|
|
- match = 1;
|
|
- }
|
|
|
|
- spin_unlock_irq(&card->lock);
|
|
- up_read(&fw_device_rwsem);
|
|
-
|
|
- return match;
|
|
-}
|
|
+#define MAX_RETRIES 10
|
|
+#define RETRY_DELAY (3 * HZ)
|
|
+#define INITIAL_DELAY (HZ / 2)
|
|
|
|
static void fw_device_init(struct work_struct *work)
|
|
{
|
|
struct fw_device *device =
|
|
container_of(work, struct fw_device, work.work);
|
|
- struct device *revived_dev;
|
|
int minor, err;
|
|
|
|
/*
|
|
@@ -763,15 +696,6 @@
|
|
return;
|
|
}
|
|
|
|
- revived_dev = device_find_child(device->card->device,
|
|
- device, lookup_existing_device);
|
|
- if (revived_dev) {
|
|
- put_device(revived_dev);
|
|
- fw_device_release(&device->device);
|
|
-
|
|
- return;
|
|
- }
|
|
-
|
|
device_initialize(&device->device);
|
|
|
|
fw_device_get(device);
|
|
@@ -810,10 +734,9 @@
|
|
* fw_node_event().
|
|
*/
|
|
if (atomic_cmpxchg(&device->state,
|
|
- FW_DEVICE_INITIALIZING,
|
|
- FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
|
|
- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
|
|
- schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
|
|
+ FW_DEVICE_INITIALIZING,
|
|
+ FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) {
|
|
+ fw_device_shutdown(work);
|
|
} else {
|
|
if (device->config_rom_retries)
|
|
fw_notify("created device %s: GUID %08x%08x, S%d00, "
|
|
@@ -924,8 +847,8 @@
|
|
|
|
case REREAD_BIB_UNCHANGED:
|
|
if (atomic_cmpxchg(&device->state,
|
|
- FW_DEVICE_INITIALIZING,
|
|
- FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
|
|
+ FW_DEVICE_INITIALIZING,
|
|
+ FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN)
|
|
goto gone;
|
|
|
|
fw_device_update(work);
|
|
@@ -956,8 +879,8 @@
|
|
create_units(device);
|
|
|
|
if (atomic_cmpxchg(&device->state,
|
|
- FW_DEVICE_INITIALIZING,
|
|
- FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
|
|
+ FW_DEVICE_INITIALIZING,
|
|
+ FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN)
|
|
goto gone;
|
|
|
|
fw_notify("refreshed device %s\n", dev_name(&device->device));
|
|
@@ -967,9 +890,8 @@
|
|
give_up:
|
|
fw_notify("giving up on refresh of device %s\n", dev_name(&device->device));
|
|
gone:
|
|
- atomic_set(&device->state, FW_DEVICE_GONE);
|
|
- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
|
|
- schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
|
|
+ atomic_set(&device->state, FW_DEVICE_SHUTDOWN);
|
|
+ fw_device_shutdown(work);
|
|
out:
|
|
if (node_id == card->root_node->node_id)
|
|
fw_schedule_bm_work(card, 0);
|
|
@@ -1073,10 +995,9 @@
|
|
*/
|
|
device = node->data;
|
|
if (atomic_xchg(&device->state,
|
|
- FW_DEVICE_GONE) == FW_DEVICE_RUNNING) {
|
|
+ FW_DEVICE_SHUTDOWN) == FW_DEVICE_RUNNING) {
|
|
PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
|
|
- schedule_delayed_work(&device->work,
|
|
- list_empty(&card->link) ? 0 : SHUTDOWN_DELAY);
|
|
+ schedule_delayed_work(&device->work, 0);
|
|
}
|
|
break;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/firewire/fw-device.h linux-2.6.29-rc3.owrt/drivers/firewire/fw-device.h
|
|
--- linux-2.6.29.owrt/drivers/firewire/fw-device.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-device.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -28,7 +28,6 @@
|
|
enum fw_device_state {
|
|
FW_DEVICE_INITIALIZING,
|
|
FW_DEVICE_RUNNING,
|
|
- FW_DEVICE_GONE,
|
|
FW_DEVICE_SHUTDOWN,
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/firewire/fw-ohci.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-ohci.c
|
|
--- linux-2.6.29.owrt/drivers/firewire/fw-ohci.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-ohci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -226,7 +226,7 @@
|
|
#define CONTEXT_DEAD 0x0800
|
|
#define CONTEXT_ACTIVE 0x0400
|
|
|
|
-#define OHCI1394_MAX_AT_REQ_RETRIES 0xf
|
|
+#define OHCI1394_MAX_AT_REQ_RETRIES 0x2
|
|
#define OHCI1394_MAX_AT_RESP_RETRIES 0x2
|
|
#define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8
|
|
|
|
@@ -896,11 +896,11 @@
|
|
for (i = 0; i < 10; i++) {
|
|
reg = reg_read(ctx->ohci, CONTROL_SET(ctx->regs));
|
|
if ((reg & CONTEXT_ACTIVE) == 0)
|
|
- return;
|
|
+ break;
|
|
|
|
+ fw_notify("context_stop: still active (0x%08x)\n", reg);
|
|
mdelay(1);
|
|
}
|
|
- fw_error("Error: DMA context still active (0x%08x)\n", reg);
|
|
}
|
|
|
|
struct driver_data {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/firewire/fw-sbp2.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-sbp2.c
|
|
--- linux-2.6.29.owrt/drivers/firewire/fw-sbp2.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-sbp2.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -168,7 +168,6 @@
|
|
int address_high;
|
|
unsigned int workarounds;
|
|
unsigned int mgt_orb_timeout;
|
|
- unsigned int max_payload;
|
|
|
|
int dont_block; /* counter for each logical unit */
|
|
int blocked; /* ditto */
|
|
@@ -311,16 +310,14 @@
|
|
dma_addr_t page_table_bus;
|
|
};
|
|
|
|
-#define SBP2_ROM_VALUE_WILDCARD ~0 /* match all */
|
|
-#define SBP2_ROM_VALUE_MISSING 0xff000000 /* not present in the unit dir. */
|
|
-
|
|
/*
|
|
* List of devices with known bugs.
|
|
*
|
|
* The firmware_revision field, masked with 0xffff00, is the best
|
|
* indicator for the type of bridge chip of a device. It yields a few
|
|
* false positives but this did not break correctly behaving devices
|
|
- * so far.
|
|
+ * so far. We use ~0 as a wildcard, since the 24 bit values we get
|
|
+ * from the config rom can never match that.
|
|
*/
|
|
static const struct {
|
|
u32 firmware_revision;
|
|
@@ -342,35 +339,33 @@
|
|
},
|
|
/* Initio bridges, actually only needed for some older ones */ {
|
|
.firmware_revision = 0x000200,
|
|
- .model = SBP2_ROM_VALUE_WILDCARD,
|
|
+ .model = ~0,
|
|
.workarounds = SBP2_WORKAROUND_INQUIRY_36,
|
|
},
|
|
/* PL-3507 bridge with Prolific firmware */ {
|
|
.firmware_revision = 0x012800,
|
|
- .model = SBP2_ROM_VALUE_WILDCARD,
|
|
+ .model = ~0,
|
|
.workarounds = SBP2_WORKAROUND_POWER_CONDITION,
|
|
},
|
|
/* Symbios bridge */ {
|
|
.firmware_revision = 0xa0b800,
|
|
- .model = SBP2_ROM_VALUE_WILDCARD,
|
|
+ .model = ~0,
|
|
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
|
},
|
|
/* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
|
|
.firmware_revision = 0x002600,
|
|
- .model = SBP2_ROM_VALUE_WILDCARD,
|
|
+ .model = ~0,
|
|
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
|
},
|
|
+
|
|
/*
|
|
- * iPod 2nd generation: needs 128k max transfer size workaround
|
|
- * iPod 3rd generation: needs fix capacity workaround
|
|
+ * There are iPods (2nd gen, 3rd gen) with model_id == 0, but
|
|
+ * these iPods do not feature the read_capacity bug according
|
|
+ * to one report. Read_capacity behaviour as well as model_id
|
|
+ * could change due to Apple-supplied firmware updates though.
|
|
*/
|
|
- {
|
|
- .firmware_revision = 0x0a2700,
|
|
- .model = 0x000000,
|
|
- .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS |
|
|
- SBP2_WORKAROUND_FIX_CAPACITY,
|
|
- },
|
|
- /* iPod 4th generation */ {
|
|
+
|
|
+ /* iPod 4th generation. */ {
|
|
.firmware_revision = 0x0a2700,
|
|
.model = 0x000021,
|
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
|
@@ -1097,7 +1092,7 @@
|
|
continue;
|
|
|
|
if (sbp2_workarounds_table[i].model != model &&
|
|
- sbp2_workarounds_table[i].model != SBP2_ROM_VALUE_WILDCARD)
|
|
+ sbp2_workarounds_table[i].model != ~0)
|
|
continue;
|
|
|
|
w |= sbp2_workarounds_table[i].workarounds;
|
|
@@ -1147,28 +1142,20 @@
|
|
fw_device_get(device);
|
|
fw_unit_get(unit);
|
|
|
|
+ /* Initialize to values that won't match anything in our table. */
|
|
+ firmware_revision = 0xff000000;
|
|
+ model = 0xff000000;
|
|
+
|
|
/* implicit directory ID */
|
|
tgt->directory_id = ((unit->directory - device->config_rom) * 4
|
|
+ CSR_CONFIG_ROM) & 0xffffff;
|
|
|
|
- firmware_revision = SBP2_ROM_VALUE_MISSING;
|
|
- model = SBP2_ROM_VALUE_MISSING;
|
|
-
|
|
if (sbp2_scan_unit_dir(tgt, unit->directory, &model,
|
|
&firmware_revision) < 0)
|
|
goto fail_tgt_put;
|
|
|
|
sbp2_init_workarounds(tgt, model, firmware_revision);
|
|
|
|
- /*
|
|
- * At S100 we can do 512 bytes per packet, at S200 1024 bytes,
|
|
- * and so on up to 4096 bytes. The SBP-2 max_payload field
|
|
- * specifies the max payload size as 2 ^ (max_payload + 2), so
|
|
- * if we set this to max_speed + 7, we get the right value.
|
|
- */
|
|
- tgt->max_payload = min(device->max_speed + 7, 10U);
|
|
- tgt->max_payload = min(tgt->max_payload, device->card->max_receive - 1);
|
|
-
|
|
/* Do the login in a workqueue so we can easily reschedule retries. */
|
|
list_for_each_entry(lu, &tgt->lu_list, link)
|
|
sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
|
|
@@ -1286,19 +1273,6 @@
|
|
.id_table = sbp2_id_table,
|
|
};
|
|
|
|
-static void sbp2_unmap_scatterlist(struct device *card_device,
|
|
- struct sbp2_command_orb *orb)
|
|
-{
|
|
- if (scsi_sg_count(orb->cmd))
|
|
- dma_unmap_sg(card_device, scsi_sglist(orb->cmd),
|
|
- scsi_sg_count(orb->cmd),
|
|
- orb->cmd->sc_data_direction);
|
|
-
|
|
- if (orb->request.misc & cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT))
|
|
- dma_unmap_single(card_device, orb->page_table_bus,
|
|
- sizeof(orb->page_table), DMA_TO_DEVICE);
|
|
-}
|
|
-
|
|
static unsigned int
|
|
sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
|
|
{
|
|
@@ -1378,7 +1352,15 @@
|
|
|
|
dma_unmap_single(device->card->device, orb->base.request_bus,
|
|
sizeof(orb->request), DMA_TO_DEVICE);
|
|
- sbp2_unmap_scatterlist(device->card->device, orb);
|
|
+
|
|
+ if (scsi_sg_count(orb->cmd) > 0)
|
|
+ dma_unmap_sg(device->card->device, scsi_sglist(orb->cmd),
|
|
+ scsi_sg_count(orb->cmd),
|
|
+ orb->cmd->sc_data_direction);
|
|
+
|
|
+ if (orb->page_table_bus != 0)
|
|
+ dma_unmap_single(device->card->device, orb->page_table_bus,
|
|
+ sizeof(orb->page_table), DMA_TO_DEVICE);
|
|
|
|
orb->cmd->result = result;
|
|
orb->done(orb->cmd);
|
|
@@ -1452,6 +1434,7 @@
|
|
struct sbp2_logical_unit *lu = cmd->device->hostdata;
|
|
struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
|
|
struct sbp2_command_orb *orb;
|
|
+ unsigned int max_payload;
|
|
int generation, retval = SCSI_MLQUEUE_HOST_BUSY;
|
|
|
|
/*
|
|
@@ -1479,9 +1462,17 @@
|
|
orb->done = done;
|
|
orb->cmd = cmd;
|
|
|
|
- orb->request.next.high = cpu_to_be32(SBP2_ORB_NULL);
|
|
+ orb->request.next.high = cpu_to_be32(SBP2_ORB_NULL);
|
|
+ /*
|
|
+ * At speed 100 we can do 512 bytes per packet, at speed 200,
|
|
+ * 1024 bytes per packet etc. The SBP-2 max_payload field
|
|
+ * specifies the max payload size as 2 ^ (max_payload + 2), so
|
|
+ * if we set this to max_speed + 7, we get the right value.
|
|
+ */
|
|
+ max_payload = min(device->max_speed + 7,
|
|
+ device->card->max_receive - 1);
|
|
orb->request.misc = cpu_to_be32(
|
|
- COMMAND_ORB_MAX_PAYLOAD(lu->tgt->max_payload) |
|
|
+ COMMAND_ORB_MAX_PAYLOAD(max_payload) |
|
|
COMMAND_ORB_SPEED(device->max_speed) |
|
|
COMMAND_ORB_NOTIFY);
|
|
|
|
@@ -1500,10 +1491,8 @@
|
|
orb->base.request_bus =
|
|
dma_map_single(device->card->device, &orb->request,
|
|
sizeof(orb->request), DMA_TO_DEVICE);
|
|
- if (dma_mapping_error(device->card->device, orb->base.request_bus)) {
|
|
- sbp2_unmap_scatterlist(device->card->device, orb);
|
|
+ if (dma_mapping_error(device->card->device, orb->base.request_bus))
|
|
goto out;
|
|
- }
|
|
|
|
sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, generation,
|
|
lu->command_block_agent_address + SBP2_ORB_POINTER);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/firewire/fw-topology.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-topology.c
|
|
--- linux-2.6.29.owrt/drivers/firewire/fw-topology.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-topology.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -518,18 +518,6 @@
|
|
struct fw_node *local_node;
|
|
unsigned long flags;
|
|
|
|
- /*
|
|
- * If the selfID buffer is not the immediate successor of the
|
|
- * previously processed one, we cannot reliably compare the
|
|
- * old and new topologies.
|
|
- */
|
|
- if (!is_next_generation(generation, card->generation) &&
|
|
- card->local_node != NULL) {
|
|
- fw_notify("skipped bus generations, destroying all nodes\n");
|
|
- fw_destroy_nodes(card);
|
|
- card->bm_retries = 0;
|
|
- }
|
|
-
|
|
spin_lock_irqsave(&card->lock, flags);
|
|
|
|
card->node_id = node_id;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/firewire/fw-transaction.h linux-2.6.29-rc3.owrt/drivers/firewire/fw-transaction.h
|
|
--- linux-2.6.29.owrt/drivers/firewire/fw-transaction.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-transaction.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -276,15 +276,6 @@
|
|
extern void fw_schedule_bm_work(struct fw_card *card, unsigned long delay);
|
|
|
|
/*
|
|
- * Check whether new_generation is the immediate successor of old_generation.
|
|
- * Take counter roll-over at 255 (as per to OHCI) into account.
|
|
- */
|
|
-static inline bool is_next_generation(int new_generation, int old_generation)
|
|
-{
|
|
- return (new_generation & 0xff) == ((old_generation + 1) & 0xff);
|
|
-}
|
|
-
|
|
-/*
|
|
* The iso packet format allows for an immediate header/payload part
|
|
* stored in 'header' immediately after the packet info plus an
|
|
* indirect payload part that is pointer to by the 'payload' field.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/firmware/memmap.c linux-2.6.29-rc3.owrt/drivers/firmware/memmap.c
|
|
--- linux-2.6.29.owrt/drivers/firmware/memmap.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/firmware/memmap.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* linux/drivers/firmware/memmap.c
|
|
* Copyright (C) 2008 SUSE LINUX Products GmbH
|
|
- * by Bernhard Walle <bernhard.walle@gmx.de>
|
|
+ * by Bernhard Walle <bwalle@suse.de>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License v2.0 as published by
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpio/gpiolib.c linux-2.6.29-rc3.owrt/drivers/gpio/gpiolib.c
|
|
--- linux-2.6.29.owrt/drivers/gpio/gpiolib.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpio/gpiolib.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -789,7 +789,6 @@
|
|
} else {
|
|
status = -EBUSY;
|
|
module_put(chip->owner);
|
|
- goto done;
|
|
}
|
|
|
|
if (chip->request) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_bufs.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_bufs.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_bufs.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_bufs.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -420,7 +420,7 @@
|
|
dev->sigdata.lock = NULL;
|
|
master->lock.hw_lock = NULL; /* SHM removed */
|
|
master->lock.file_priv = NULL;
|
|
- wake_up_interruptible_all(&master->lock.lock_queue);
|
|
+ wake_up_interruptible(&master->lock.lock_queue);
|
|
}
|
|
break;
|
|
case _DRM_AGP:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_crtc.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_crtc.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_crtc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_crtc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1741,8 +1741,9 @@
|
|
* RETURNS:
|
|
* Zero on success, errno on failure.
|
|
*/
|
|
-void drm_fb_release(struct drm_file *priv)
|
|
+void drm_fb_release(struct file *filp)
|
|
{
|
|
+ struct drm_file *priv = filp->private_data;
|
|
struct drm_device *dev = priv->minor->dev;
|
|
struct drm_framebuffer *fb, *tfb;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_crtc_helper.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_crtc_helper.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_crtc_helper.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_crtc_helper.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -452,59 +452,6 @@
|
|
kfree(modes);
|
|
kfree(enabled);
|
|
}
|
|
-
|
|
-/**
|
|
- * drm_encoder_crtc_ok - can a given crtc drive a given encoder?
|
|
- * @encoder: encoder to test
|
|
- * @crtc: crtc to test
|
|
- *
|
|
- * Return false if @encoder can't be driven by @crtc, true otherwise.
|
|
- */
|
|
-static bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
|
|
- struct drm_crtc *crtc)
|
|
-{
|
|
- struct drm_device *dev;
|
|
- struct drm_crtc *tmp;
|
|
- int crtc_mask = 1;
|
|
-
|
|
- WARN(!crtc, "checking null crtc?");
|
|
-
|
|
- dev = crtc->dev;
|
|
-
|
|
- list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) {
|
|
- if (tmp == crtc)
|
|
- break;
|
|
- crtc_mask <<= 1;
|
|
- }
|
|
-
|
|
- if (encoder->possible_crtcs & crtc_mask)
|
|
- return true;
|
|
- return false;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Check the CRTC we're going to map each output to vs. its current
|
|
- * CRTC. If they don't match, we have to disable the output and the CRTC
|
|
- * since the driver will have to re-route things.
|
|
- */
|
|
-static void
|
|
-drm_crtc_prepare_encoders(struct drm_device *dev)
|
|
-{
|
|
- struct drm_encoder_helper_funcs *encoder_funcs;
|
|
- struct drm_encoder *encoder;
|
|
-
|
|
- list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
|
- encoder_funcs = encoder->helper_private;
|
|
- /* Disable unused encoders */
|
|
- if (encoder->crtc == NULL)
|
|
- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
|
- /* Disable encoders whose CRTC is about to change */
|
|
- if (encoder_funcs->get_crtc &&
|
|
- encoder->crtc != (*encoder_funcs->get_crtc)(encoder))
|
|
- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
|
|
- }
|
|
-}
|
|
-
|
|
/**
|
|
* drm_crtc_set_mode - set a mode
|
|
* @crtc: CRTC to program
|
|
@@ -565,8 +512,8 @@
|
|
if (drm_mode_equal(&saved_mode, &crtc->mode)) {
|
|
if (saved_x != crtc->x || saved_y != crtc->y ||
|
|
depth_changed || bpp_changed) {
|
|
- ret = !crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y,
|
|
- old_fb);
|
|
+ crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y,
|
|
+ old_fb);
|
|
goto done;
|
|
}
|
|
}
|
|
@@ -600,16 +547,12 @@
|
|
encoder_funcs->prepare(encoder);
|
|
}
|
|
|
|
- drm_crtc_prepare_encoders(dev);
|
|
-
|
|
crtc_funcs->prepare(crtc);
|
|
|
|
/* Set up the DPLL and any encoders state that needs to adjust or depend
|
|
* on the DPLL.
|
|
*/
|
|
- ret = !crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, old_fb);
|
|
- if (!ret)
|
|
- goto done;
|
|
+ crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, old_fb);
|
|
|
|
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
|
|
|
@@ -672,7 +615,7 @@
|
|
struct drm_device *dev;
|
|
struct drm_crtc **save_crtcs, *new_crtc;
|
|
struct drm_encoder **save_encoders, *new_encoder;
|
|
- struct drm_framebuffer *old_fb = NULL;
|
|
+ struct drm_framebuffer *old_fb;
|
|
bool save_enabled;
|
|
bool mode_changed = false;
|
|
bool fb_changed = false;
|
|
@@ -723,10 +666,9 @@
|
|
* and then just flip_or_move it */
|
|
if (set->crtc->fb != set->fb) {
|
|
/* If we have no fb then treat it as a full mode set */
|
|
- if (set->crtc->fb == NULL) {
|
|
- DRM_DEBUG("crtc has no fb, full mode set\n");
|
|
+ if (set->crtc->fb == NULL)
|
|
mode_changed = true;
|
|
- } else if ((set->fb->bits_per_pixel !=
|
|
+ else if ((set->fb->bits_per_pixel !=
|
|
set->crtc->fb->bits_per_pixel) ||
|
|
set->fb->depth != set->crtc->fb->depth)
|
|
fb_changed = true;
|
|
@@ -738,7 +680,7 @@
|
|
fb_changed = true;
|
|
|
|
if (set->mode && !drm_mode_equal(set->mode, &set->crtc->mode)) {
|
|
- DRM_DEBUG("modes are different, full mode set\n");
|
|
+ DRM_DEBUG("modes are different\n");
|
|
drm_mode_debug_printmodeline(&set->crtc->mode);
|
|
drm_mode_debug_printmodeline(set->mode);
|
|
mode_changed = true;
|
|
@@ -764,7 +706,6 @@
|
|
}
|
|
|
|
if (new_encoder != connector->encoder) {
|
|
- DRM_DEBUG("encoder changed, full mode switch\n");
|
|
mode_changed = true;
|
|
connector->encoder = new_encoder;
|
|
}
|
|
@@ -791,20 +732,10 @@
|
|
if (set->connectors[ro] == connector)
|
|
new_crtc = set->crtc;
|
|
}
|
|
-
|
|
- /* Make sure the new CRTC will work with the encoder */
|
|
- if (new_crtc &&
|
|
- !drm_encoder_crtc_ok(connector->encoder, new_crtc)) {
|
|
- ret = -EINVAL;
|
|
- goto fail_set_mode;
|
|
- }
|
|
if (new_crtc != connector->encoder->crtc) {
|
|
- DRM_DEBUG("crtc changed, full mode switch\n");
|
|
mode_changed = true;
|
|
connector->encoder->crtc = new_crtc;
|
|
}
|
|
- DRM_DEBUG("setting connector %d crtc to %p\n",
|
|
- connector->base.id, new_crtc);
|
|
}
|
|
|
|
/* mode_set_base is not a required function */
|
|
@@ -821,8 +752,6 @@
|
|
if (!drm_crtc_helper_set_mode(set->crtc, set->mode,
|
|
set->x, set->y,
|
|
old_fb)) {
|
|
- DRM_ERROR("failed to set mode on crtc %p\n",
|
|
- set->crtc);
|
|
ret = -EINVAL;
|
|
goto fail_set_mode;
|
|
}
|
|
@@ -836,10 +765,7 @@
|
|
old_fb = set->crtc->fb;
|
|
if (set->crtc->fb != set->fb)
|
|
set->crtc->fb = set->fb;
|
|
- ret = crtc_funcs->mode_set_base(set->crtc,
|
|
- set->x, set->y, old_fb);
|
|
- if (ret != 0)
|
|
- goto fail_set_mode;
|
|
+ crtc_funcs->mode_set_base(set->crtc, set->x, set->y, old_fb);
|
|
}
|
|
|
|
kfree(save_encoders);
|
|
@@ -848,14 +774,9 @@
|
|
|
|
fail_set_mode:
|
|
set->crtc->enabled = save_enabled;
|
|
- set->crtc->fb = old_fb;
|
|
count = 0;
|
|
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
|
- if (!connector->encoder)
|
|
- continue;
|
|
-
|
|
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head)
|
|
connector->encoder->crtc = save_crtcs[count++];
|
|
- }
|
|
fail_no_encoder:
|
|
kfree(save_crtcs);
|
|
count = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_edid.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_edid.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_edid.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_edid.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -125,7 +125,7 @@
|
|
DRM_ERROR("EDID has major version %d, instead of 1\n", edid->version);
|
|
goto bad;
|
|
}
|
|
- if (edid->revision > 3) {
|
|
+ if (edid->revision <= 0 || edid->revision > 3) {
|
|
DRM_ERROR("EDID has minor version %d, which is not between 0-3\n", edid->revision);
|
|
goto bad;
|
|
}
|
|
@@ -320,10 +320,10 @@
|
|
mode->htotal = mode->hdisplay + ((pt->hblank_hi << 8) | pt->hblank_lo);
|
|
|
|
mode->vdisplay = (pt->vactive_hi << 8) | pt->vactive_lo;
|
|
- mode->vsync_start = mode->vdisplay + ((pt->vsync_offset_hi << 4) |
|
|
+ mode->vsync_start = mode->vdisplay + ((pt->vsync_offset_hi << 8) |
|
|
pt->vsync_offset_lo);
|
|
mode->vsync_end = mode->vsync_start +
|
|
- ((pt->vsync_pulse_width_hi << 4) |
|
|
+ ((pt->vsync_pulse_width_hi << 8) |
|
|
pt->vsync_pulse_width_lo);
|
|
mode->vtotal = mode->vdisplay + ((pt->vblank_hi << 8) | pt->vblank_lo);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_fops.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_fops.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_fops.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_fops.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -457,9 +457,6 @@
|
|
if (dev->driver->driver_features & DRIVER_GEM)
|
|
drm_gem_release(dev, file_priv);
|
|
|
|
- if (dev->driver->driver_features & DRIVER_MODESET)
|
|
- drm_fb_release(file_priv);
|
|
-
|
|
mutex_lock(&dev->ctxlist_mutex);
|
|
if (!list_empty(&dev->ctxlist)) {
|
|
struct drm_ctx_list *pos, *n;
|
|
@@ -484,7 +481,6 @@
|
|
mutex_lock(&dev->struct_mutex);
|
|
|
|
if (file_priv->is_master) {
|
|
- struct drm_master *master = file_priv->master;
|
|
struct drm_file *temp;
|
|
list_for_each_entry(temp, &dev->filelist, lhead) {
|
|
if ((temp->master == file_priv->master) &&
|
|
@@ -492,19 +488,6 @@
|
|
temp->authenticated = 0;
|
|
}
|
|
|
|
- /**
|
|
- * Since the master is disappearing, so is the
|
|
- * possibility to lock.
|
|
- */
|
|
-
|
|
- if (master->lock.hw_lock) {
|
|
- if (dev->sigdata.lock == master->lock.hw_lock)
|
|
- dev->sigdata.lock = NULL;
|
|
- master->lock.hw_lock = NULL;
|
|
- master->lock.file_priv = NULL;
|
|
- wake_up_interruptible_all(&master->lock.lock_queue);
|
|
- }
|
|
-
|
|
if (file_priv->minor->master == file_priv->master) {
|
|
/* drop the reference held my the minor */
|
|
drm_master_put(&file_priv->minor->master);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_gem.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_gem.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_gem.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_gem.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -104,8 +104,8 @@
|
|
|
|
if (drm_mm_init(&mm->offset_manager, DRM_FILE_PAGE_OFFSET_START,
|
|
DRM_FILE_PAGE_OFFSET_SIZE)) {
|
|
- drm_ht_remove(&mm->offset_hash);
|
|
drm_free(mm, sizeof(struct drm_gem_mm), DRM_MEM_MM);
|
|
+ drm_ht_remove(&mm->offset_hash);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
@@ -136,7 +136,7 @@
|
|
obj = kcalloc(1, sizeof(*obj), GFP_KERNEL);
|
|
|
|
obj->dev = dev;
|
|
- obj->filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
|
|
+ obj->filp = shmem_file_setup("drm mm object", size, 0);
|
|
if (IS_ERR(obj->filp)) {
|
|
kfree(obj);
|
|
return NULL;
|
|
@@ -295,37 +295,35 @@
|
|
return -EBADF;
|
|
|
|
again:
|
|
- if (idr_pre_get(&dev->object_name_idr, GFP_KERNEL) == 0) {
|
|
- ret = -ENOMEM;
|
|
- goto err;
|
|
- }
|
|
+ if (idr_pre_get(&dev->object_name_idr, GFP_KERNEL) == 0)
|
|
+ return -ENOMEM;
|
|
|
|
spin_lock(&dev->object_name_lock);
|
|
- if (!obj->name) {
|
|
- ret = idr_get_new_above(&dev->object_name_idr, obj, 1,
|
|
- &obj->name);
|
|
- args->name = (uint64_t) obj->name;
|
|
+ if (obj->name) {
|
|
+ args->name = obj->name;
|
|
spin_unlock(&dev->object_name_lock);
|
|
+ return 0;
|
|
+ }
|
|
+ ret = idr_get_new_above(&dev->object_name_idr, obj, 1,
|
|
+ &obj->name);
|
|
+ spin_unlock(&dev->object_name_lock);
|
|
+ if (ret == -EAGAIN)
|
|
+ goto again;
|
|
|
|
- if (ret == -EAGAIN)
|
|
- goto again;
|
|
-
|
|
- if (ret != 0)
|
|
- goto err;
|
|
-
|
|
- /* Allocate a reference for the name table. */
|
|
- drm_gem_object_reference(obj);
|
|
- } else {
|
|
- args->name = (uint64_t) obj->name;
|
|
- spin_unlock(&dev->object_name_lock);
|
|
- ret = 0;
|
|
+ if (ret != 0) {
|
|
+ mutex_lock(&dev->struct_mutex);
|
|
+ drm_gem_object_unreference(obj);
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
+ return ret;
|
|
}
|
|
|
|
-err:
|
|
- mutex_lock(&dev->struct_mutex);
|
|
- drm_gem_object_unreference(obj);
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
- return ret;
|
|
+ /*
|
|
+ * Leave the reference from the lookup around as the
|
|
+ * name table now holds one
|
|
+ */
|
|
+ args->name = (uint64_t) obj->name;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
/**
|
|
@@ -450,7 +448,6 @@
|
|
spin_lock(&dev->object_name_lock);
|
|
if (obj->name) {
|
|
idr_remove(&dev->object_name_idr, obj->name);
|
|
- obj->name = 0;
|
|
spin_unlock(&dev->object_name_lock);
|
|
/*
|
|
* The object name held a reference to this object, drop
|
|
@@ -463,26 +460,6 @@
|
|
}
|
|
EXPORT_SYMBOL(drm_gem_object_handle_free);
|
|
|
|
-void drm_gem_vm_open(struct vm_area_struct *vma)
|
|
-{
|
|
- struct drm_gem_object *obj = vma->vm_private_data;
|
|
-
|
|
- drm_gem_object_reference(obj);
|
|
-}
|
|
-EXPORT_SYMBOL(drm_gem_vm_open);
|
|
-
|
|
-void drm_gem_vm_close(struct vm_area_struct *vma)
|
|
-{
|
|
- struct drm_gem_object *obj = vma->vm_private_data;
|
|
- struct drm_device *dev = obj->dev;
|
|
-
|
|
- mutex_lock(&dev->struct_mutex);
|
|
- drm_gem_object_unreference(obj);
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
-}
|
|
-EXPORT_SYMBOL(drm_gem_vm_close);
|
|
-
|
|
-
|
|
/**
|
|
* drm_gem_mmap - memory map routine for GEM objects
|
|
* @filp: DRM file pointer
|
|
@@ -544,14 +521,6 @@
|
|
#endif
|
|
vma->vm_page_prot = __pgprot(prot);
|
|
|
|
- /* Take a ref for this mapping of the object, so that the fault
|
|
- * handler can dereference the mmap offset's pointer to the object.
|
|
- * This reference is cleaned up by the corresponding vm_close
|
|
- * (which should happen whether the vma was created by this call, or
|
|
- * by a vm_open due to mremap or partial unmap or whatever).
|
|
- */
|
|
- drm_gem_object_reference(obj);
|
|
-
|
|
vma->vm_file = filp; /* Needed for drm_vm_open() */
|
|
drm_vm_open_locked(vma);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_irq.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_irq.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_irq.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -276,7 +276,6 @@
|
|
for (i = 0; i < dev->num_crtcs; i++) {
|
|
DRM_WAKEUP(&dev->vbl_queue[i]);
|
|
dev->vblank_enabled[i] = 0;
|
|
- dev->last_vblank[i] = dev->driver->get_vblank_counter(dev, i);
|
|
}
|
|
spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
|
|
|
|
@@ -435,8 +434,6 @@
|
|
*/
|
|
void drm_vblank_put(struct drm_device *dev, int crtc)
|
|
{
|
|
- BUG_ON (atomic_read (&dev->vblank_refcount[crtc]) == 0);
|
|
-
|
|
/* Last user schedules interrupt disable */
|
|
if (atomic_dec_and_test(&dev->vblank_refcount[crtc]))
|
|
mod_timer(&dev->vblank_disable_timer, jiffies + 5*DRM_HZ);
|
|
@@ -462,9 +459,8 @@
|
|
* so that interrupts remain enabled in the interim.
|
|
*/
|
|
if (!dev->vblank_inmodeset[crtc]) {
|
|
- dev->vblank_inmodeset[crtc] = 0x1;
|
|
- if (drm_vblank_get(dev, crtc) == 0)
|
|
- dev->vblank_inmodeset[crtc] |= 0x2;
|
|
+ dev->vblank_inmodeset[crtc] = 1;
|
|
+ drm_vblank_get(dev, crtc);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(drm_vblank_pre_modeset);
|
|
@@ -476,12 +472,9 @@
|
|
if (dev->vblank_inmodeset[crtc]) {
|
|
spin_lock_irqsave(&dev->vbl_lock, irqflags);
|
|
dev->vblank_disable_allowed = 1;
|
|
- spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
|
|
-
|
|
- if (dev->vblank_inmodeset[crtc] & 0x2)
|
|
- drm_vblank_put(dev, crtc);
|
|
-
|
|
dev->vblank_inmodeset[crtc] = 0;
|
|
+ spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
|
|
+ drm_vblank_put(dev, crtc);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(drm_vblank_post_modeset);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_lock.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_lock.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_lock.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_lock.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -80,7 +80,6 @@
|
|
__set_current_state(TASK_INTERRUPTIBLE);
|
|
if (!master->lock.hw_lock) {
|
|
/* Device has been unregistered */
|
|
- send_sig(SIGTERM, current, 0);
|
|
ret = -EINTR;
|
|
break;
|
|
}
|
|
@@ -94,7 +93,7 @@
|
|
/* Contention */
|
|
schedule();
|
|
if (signal_pending(current)) {
|
|
- ret = -EINTR;
|
|
+ ret = -ERESTARTSYS;
|
|
break;
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_memory.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_memory.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_memory.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_memory.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -171,14 +171,9 @@
|
|
|
|
void drm_core_ioremap_wc(struct drm_map *map, struct drm_device *dev)
|
|
{
|
|
- if (drm_core_has_AGP(dev) &&
|
|
- dev->agp && dev->agp->cant_use_aperture && map->type == _DRM_AGP)
|
|
- map->handle = agp_remap(map->offset, map->size, dev);
|
|
- else
|
|
- map->handle = ioremap_wc(map->offset, map->size);
|
|
+ map->handle = ioremap_wc(map->offset, map->size);
|
|
}
|
|
EXPORT_SYMBOL(drm_core_ioremap_wc);
|
|
-
|
|
void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev)
|
|
{
|
|
if (!map->handle || !map->size)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/drm_stub.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_stub.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/drm_stub.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_stub.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -146,6 +146,14 @@
|
|
|
|
drm_ht_remove(&master->magiclist);
|
|
|
|
+ if (master->lock.hw_lock) {
|
|
+ if (dev->sigdata.lock == master->lock.hw_lock)
|
|
+ dev->sigdata.lock = NULL;
|
|
+ master->lock.hw_lock = NULL;
|
|
+ master->lock.file_priv = NULL;
|
|
+ wake_up_interruptible(&master->lock.lock_queue);
|
|
+ }
|
|
+
|
|
drm_free(master, sizeof(*master), DRM_MEM_DRIVER);
|
|
}
|
|
|
|
@@ -168,7 +176,7 @@
|
|
file_priv->minor->master != file_priv->master) {
|
|
mutex_lock(&dev->struct_mutex);
|
|
file_priv->minor->master = drm_master_get(file_priv->master);
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
+ mutex_lock(&dev->struct_mutex);
|
|
}
|
|
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_dma.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_dma.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_dma.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_dma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -202,7 +202,7 @@
|
|
dev_priv->ring.map.flags = 0;
|
|
dev_priv->ring.map.mtrr = 0;
|
|
|
|
- drm_core_ioremap_wc(&dev_priv->ring.map, dev);
|
|
+ drm_core_ioremap(&dev_priv->ring.map, dev);
|
|
|
|
if (dev_priv->ring.map.handle == NULL) {
|
|
i915_dma_cleanup(dev);
|
|
@@ -731,11 +731,8 @@
|
|
case I915_PARAM_HAS_GEM:
|
|
value = dev_priv->has_gem;
|
|
break;
|
|
- case I915_PARAM_NUM_FENCES_AVAIL:
|
|
- value = dev_priv->num_fence_regs - dev_priv->fence_reg_start;
|
|
- break;
|
|
default:
|
|
- DRM_DEBUG("Unknown parameter %d\n", param->param);
|
|
+ DRM_ERROR("Unknown parameter %d\n", param->param);
|
|
return -EINVAL;
|
|
}
|
|
|
|
@@ -767,15 +764,8 @@
|
|
case I915_SETPARAM_ALLOW_BATCHBUFFER:
|
|
dev_priv->allow_batchbuffer = param->value;
|
|
break;
|
|
- case I915_SETPARAM_NUM_USED_FENCES:
|
|
- if (param->value > dev_priv->num_fence_regs ||
|
|
- param->value < 0)
|
|
- return -EINVAL;
|
|
- /* Userspace can use first N regs */
|
|
- dev_priv->fence_reg_start = param->value;
|
|
- break;
|
|
default:
|
|
- DRM_DEBUG("unknown parameter %d\n", param->param);
|
|
+ DRM_ERROR("unknown parameter %d\n", param->param);
|
|
return -EINVAL;
|
|
}
|
|
|
|
@@ -811,7 +801,7 @@
|
|
dev_priv->hws_map.flags = 0;
|
|
dev_priv->hws_map.mtrr = 0;
|
|
|
|
- drm_core_ioremap_wc(&dev_priv->hws_map, dev);
|
|
+ drm_core_ioremap(&dev_priv->hws_map, dev);
|
|
if (dev_priv->hws_map.handle == NULL) {
|
|
i915_dma_cleanup(dev);
|
|
dev_priv->status_gfx_addr = 0;
|
|
@@ -976,6 +966,10 @@
|
|
if (ret)
|
|
goto kfree_devname;
|
|
|
|
+ dev_priv->mm.gtt_mapping =
|
|
+ io_mapping_create_wc(dev->agp->base,
|
|
+ dev->agp->agp_info.aper_size * 1024*1024);
|
|
+
|
|
/* Allow hardware batchbuffers unless told otherwise.
|
|
*/
|
|
dev_priv->allow_batchbuffer = 1;
|
|
@@ -1087,28 +1081,6 @@
|
|
goto free_priv;
|
|
}
|
|
|
|
- dev_priv->mm.gtt_mapping =
|
|
- io_mapping_create_wc(dev->agp->base,
|
|
- dev->agp->agp_info.aper_size * 1024*1024);
|
|
- if (dev_priv->mm.gtt_mapping == NULL) {
|
|
- ret = -EIO;
|
|
- goto out_rmmap;
|
|
- }
|
|
-
|
|
- /* Set up a WC MTRR for non-PAT systems. This is more common than
|
|
- * one would think, because the kernel disables PAT on first
|
|
- * generation Core chips because WC PAT gets overridden by a UC
|
|
- * MTRR if present. Even if a UC MTRR isn't present.
|
|
- */
|
|
- dev_priv->mm.gtt_mtrr = mtrr_add(dev->agp->base,
|
|
- dev->agp->agp_info.aper_size *
|
|
- 1024 * 1024,
|
|
- MTRR_TYPE_WRCOMB, 1);
|
|
- if (dev_priv->mm.gtt_mtrr < 0) {
|
|
- DRM_INFO("MTRR allocation failed. Graphics "
|
|
- "performance may suffer.\n");
|
|
- }
|
|
-
|
|
#ifdef CONFIG_HIGHMEM64G
|
|
/* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */
|
|
dev_priv->has_gem = 0;
|
|
@@ -1117,17 +1089,13 @@
|
|
dev_priv->has_gem = 1;
|
|
#endif
|
|
|
|
- dev->driver->get_vblank_counter = i915_get_vblank_counter;
|
|
- if (IS_GM45(dev))
|
|
- dev->driver->get_vblank_counter = gm45_get_vblank_counter;
|
|
-
|
|
i915_gem_load(dev);
|
|
|
|
/* Init HWS */
|
|
if (!I915_NEED_GFX_HWS(dev)) {
|
|
ret = i915_init_phys_hws(dev);
|
|
if (ret != 0)
|
|
- goto out_iomapfree;
|
|
+ goto out_rmmap;
|
|
}
|
|
|
|
/* On the 945G/GM, the chipset reports the MSI capability on the
|
|
@@ -1166,8 +1134,6 @@
|
|
|
|
return 0;
|
|
|
|
-out_iomapfree:
|
|
- io_mapping_free(dev_priv->mm.gtt_mapping);
|
|
out_rmmap:
|
|
iounmap(dev_priv->regs);
|
|
free_priv:
|
|
@@ -1179,14 +1145,8 @@
|
|
{
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
|
- io_mapping_free(dev_priv->mm.gtt_mapping);
|
|
- if (dev_priv->mm.gtt_mtrr >= 0) {
|
|
- mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
|
|
- dev->agp->agp_info.aper_size * 1024 * 1024);
|
|
- dev_priv->mm.gtt_mtrr = -1;
|
|
- }
|
|
-
|
|
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
|
+ io_mapping_free(dev_priv->mm.gtt_mapping);
|
|
drm_irq_uninstall(dev);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_drv.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_drv.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_drv.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_drv.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -27,7 +27,6 @@
|
|
*
|
|
*/
|
|
|
|
-#include <linux/device.h>
|
|
#include "drmP.h"
|
|
#include "drm.h"
|
|
#include "i915_drm.h"
|
|
@@ -67,14 +66,6 @@
|
|
|
|
i915_save_state(dev);
|
|
|
|
- /* If KMS is active, we do the leavevt stuff here */
|
|
- if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
|
- if (i915_gem_idle(dev))
|
|
- dev_err(&dev->pdev->dev,
|
|
- "GEM idle failed, resume may fail\n");
|
|
- drm_irq_uninstall(dev);
|
|
- }
|
|
-
|
|
intel_opregion_free(dev);
|
|
|
|
if (state.event == PM_EVENT_SUSPEND) {
|
|
@@ -88,9 +79,6 @@
|
|
|
|
static int i915_resume(struct drm_device *dev)
|
|
{
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
- int ret = 0;
|
|
-
|
|
pci_set_power_state(dev->pdev, PCI_D0);
|
|
pci_restore_state(dev->pdev);
|
|
if (pci_enable_device(dev->pdev))
|
|
@@ -101,26 +89,11 @@
|
|
|
|
intel_opregion_init(dev);
|
|
|
|
- /* KMS EnterVT equivalent */
|
|
- if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
|
- mutex_lock(&dev->struct_mutex);
|
|
- dev_priv->mm.suspended = 0;
|
|
-
|
|
- ret = i915_gem_init_ringbuffer(dev);
|
|
- if (ret != 0)
|
|
- ret = -1;
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
-
|
|
- drm_irq_install(dev);
|
|
- }
|
|
-
|
|
- return ret;
|
|
+ return 0;
|
|
}
|
|
|
|
static struct vm_operations_struct i915_gem_vm_ops = {
|
|
.fault = i915_gem_fault,
|
|
- .open = drm_gem_vm_open,
|
|
- .close = drm_gem_vm_close,
|
|
};
|
|
|
|
static struct drm_driver driver = {
|
|
@@ -139,6 +112,7 @@
|
|
.suspend = i915_suspend,
|
|
.resume = i915_resume,
|
|
.device_is_agp = i915_driver_device_is_agp,
|
|
+ .get_vblank_counter = i915_get_vblank_counter,
|
|
.enable_vblank = i915_enable_vblank,
|
|
.disable_vblank = i915_disable_vblank,
|
|
.irq_preinstall = i915_driver_irq_preinstall,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_drv.h linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_drv.h
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_drv.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_drv.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -184,8 +184,6 @@
|
|
unsigned int lvds_dither:1;
|
|
unsigned int lvds_vbt:1;
|
|
unsigned int int_crt_support:1;
|
|
- unsigned int lvds_use_ssc:1;
|
|
- int lvds_ssc_freq;
|
|
|
|
struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */
|
|
int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */
|
|
@@ -279,13 +277,13 @@
|
|
u8 saveAR_INDEX;
|
|
u8 saveAR[21];
|
|
u8 saveDACMASK;
|
|
+ u8 saveDACDATA[256*3]; /* 256 3-byte colors */
|
|
u8 saveCR[37];
|
|
|
|
struct {
|
|
struct drm_mm gtt_space;
|
|
|
|
struct io_mapping *gtt_mapping;
|
|
- int gtt_mtrr;
|
|
|
|
/**
|
|
* List of objects currently involved in rendering from the
|
|
@@ -456,12 +454,6 @@
|
|
|
|
/** for phy allocated objects */
|
|
struct drm_i915_gem_phys_object *phys_obj;
|
|
-
|
|
- /**
|
|
- * Used for checking the object doesn't appear more than once
|
|
- * in an execbuffer object list.
|
|
- */
|
|
- int in_execbuffer;
|
|
};
|
|
|
|
/**
|
|
@@ -542,7 +534,6 @@
|
|
extern int i915_enable_vblank(struct drm_device *dev, int crtc);
|
|
extern void i915_disable_vblank(struct drm_device *dev, int crtc);
|
|
extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
|
|
-extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc);
|
|
extern int i915_vblank_swap(struct drm_device *dev, void *data,
|
|
struct drm_file *file_priv);
|
|
extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask);
|
|
@@ -610,7 +601,6 @@
|
|
void i915_gem_free_object(struct drm_gem_object *obj);
|
|
int i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment);
|
|
void i915_gem_object_unpin(struct drm_gem_object *obj);
|
|
-int i915_gem_object_unbind(struct drm_gem_object *obj);
|
|
void i915_gem_lastclose(struct drm_device *dev);
|
|
uint32_t i915_get_gem_seqno(struct drm_device *dev);
|
|
void i915_gem_retire_requests(struct drm_device *dev);
|
|
@@ -623,7 +613,6 @@
|
|
void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
|
|
int i915_gem_do_init(struct drm_device *dev, unsigned long start,
|
|
unsigned long end);
|
|
-int i915_gem_idle(struct drm_device *dev);
|
|
int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
|
|
int i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj,
|
|
int write);
|
|
@@ -795,11 +784,6 @@
|
|
IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev))
|
|
|
|
#define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_GM45(dev) || IS_G4X(dev))
|
|
-/* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte
|
|
- * rows, which changed the alignment requirements and fence programming.
|
|
- */
|
|
-#define HAS_128_BYTE_Y_TILING(dev) (IS_I9XX(dev) && !(IS_I915G(dev) || \
|
|
- IS_I915GM(dev)))
|
|
#define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev))
|
|
|
|
#define PRIMARY_RINGBUFFER_SIZE (128*1024)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_gem.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_gem.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_gem.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_gem.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -34,6 +34,10 @@
|
|
|
|
#define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT))
|
|
|
|
+static void
|
|
+i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj,
|
|
+ uint32_t read_domains,
|
|
+ uint32_t write_domain);
|
|
static void i915_gem_object_flush_gpu_write_domain(struct drm_gem_object *obj);
|
|
static void i915_gem_object_flush_gtt_write_domain(struct drm_gem_object *obj);
|
|
static void i915_gem_object_flush_cpu_write_domain(struct drm_gem_object *obj);
|
|
@@ -48,7 +52,7 @@
|
|
static int i915_gem_object_wait_rendering(struct drm_gem_object *obj);
|
|
static int i915_gem_object_bind_to_gtt(struct drm_gem_object *obj,
|
|
unsigned alignment);
|
|
-static int i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write);
|
|
+static void i915_gem_object_get_fence_reg(struct drm_gem_object *obj);
|
|
static void i915_gem_clear_fence_reg(struct drm_gem_object *obj);
|
|
static int i915_gem_evict_something(struct drm_device *dev);
|
|
static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj,
|
|
@@ -563,7 +567,6 @@
|
|
pgoff_t page_offset;
|
|
unsigned long pfn;
|
|
int ret = 0;
|
|
- bool write = !!(vmf->flags & FAULT_FLAG_WRITE);
|
|
|
|
/* We don't use vmf->pgoff since that has the fake offset */
|
|
page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
|
|
@@ -582,13 +585,8 @@
|
|
|
|
/* Need a new fence register? */
|
|
if (obj_priv->fence_reg == I915_FENCE_REG_NONE &&
|
|
- obj_priv->tiling_mode != I915_TILING_NONE) {
|
|
- ret = i915_gem_object_get_fence_reg(obj, write);
|
|
- if (ret) {
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
- return VM_FAULT_SIGBUS;
|
|
- }
|
|
- }
|
|
+ obj_priv->tiling_mode != I915_TILING_NONE)
|
|
+ i915_gem_object_get_fence_reg(obj);
|
|
|
|
pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) +
|
|
page_offset;
|
|
@@ -603,6 +601,8 @@
|
|
case -EAGAIN:
|
|
return VM_FAULT_OOM;
|
|
case -EFAULT:
|
|
+ case -EBUSY:
|
|
+ DRM_ERROR("can't insert pfn?? fault or busy...\n");
|
|
return VM_FAULT_SIGBUS;
|
|
default:
|
|
return VM_FAULT_NOPAGE;
|
|
@@ -678,30 +678,6 @@
|
|
return ret;
|
|
}
|
|
|
|
-static void
|
|
-i915_gem_free_mmap_offset(struct drm_gem_object *obj)
|
|
-{
|
|
- struct drm_device *dev = obj->dev;
|
|
- struct drm_i915_gem_object *obj_priv = obj->driver_private;
|
|
- struct drm_gem_mm *mm = dev->mm_private;
|
|
- struct drm_map_list *list;
|
|
-
|
|
- list = &obj->map_list;
|
|
- drm_ht_remove_item(&mm->offset_hash, &list->hash);
|
|
-
|
|
- if (list->file_offset_node) {
|
|
- drm_mm_put_block(list->file_offset_node);
|
|
- list->file_offset_node = NULL;
|
|
- }
|
|
-
|
|
- if (list->map) {
|
|
- drm_free(list->map, sizeof(struct drm_map), DRM_MEM_DRIVER);
|
|
- list->map = NULL;
|
|
- }
|
|
-
|
|
- obj_priv->mmap_offset = 0;
|
|
-}
|
|
-
|
|
/**
|
|
* i915_gem_get_gtt_alignment - return required GTT alignment for an object
|
|
* @obj: object to check
|
|
@@ -776,11 +752,8 @@
|
|
|
|
if (!obj_priv->mmap_offset) {
|
|
ret = i915_gem_create_mmap_offset(obj);
|
|
- if (ret) {
|
|
- drm_gem_object_unreference(obj);
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
+ if (ret)
|
|
return ret;
|
|
- }
|
|
}
|
|
|
|
args->offset = obj_priv->mmap_offset;
|
|
@@ -1051,9 +1024,6 @@
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
uint32_t seqno;
|
|
|
|
- if (!dev_priv->hw_status_page)
|
|
- return;
|
|
-
|
|
seqno = i915_get_gem_seqno(dev);
|
|
|
|
while (!list_empty(&dev_priv->mm.request_list)) {
|
|
@@ -1241,7 +1211,7 @@
|
|
/**
|
|
* Unbinds an object from the GTT aperture.
|
|
*/
|
|
-int
|
|
+static int
|
|
i915_gem_object_unbind(struct drm_gem_object *obj)
|
|
{
|
|
struct drm_device *dev = obj->dev;
|
|
@@ -1475,26 +1445,21 @@
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
struct drm_i915_gem_object *obj_priv = obj->driver_private;
|
|
int regnum = obj_priv->fence_reg;
|
|
- int tile_width;
|
|
- uint32_t fence_reg, val;
|
|
+ uint32_t val;
|
|
uint32_t pitch_val;
|
|
|
|
if ((obj_priv->gtt_offset & ~I915_FENCE_START_MASK) ||
|
|
(obj_priv->gtt_offset & (obj->size - 1))) {
|
|
- WARN(1, "%s: object 0x%08x not 1M or size (0x%zx) aligned\n",
|
|
- __func__, obj_priv->gtt_offset, obj->size);
|
|
+ WARN(1, "%s: object not 1M or size aligned\n", __func__);
|
|
return;
|
|
}
|
|
|
|
- if (obj_priv->tiling_mode == I915_TILING_Y &&
|
|
- HAS_128_BYTE_Y_TILING(dev))
|
|
- tile_width = 128;
|
|
+ if (obj_priv->tiling_mode == I915_TILING_Y && (IS_I945G(dev) ||
|
|
+ IS_I945GM(dev) ||
|
|
+ IS_G33(dev)))
|
|
+ pitch_val = (obj_priv->stride / 128) - 1;
|
|
else
|
|
- tile_width = 512;
|
|
-
|
|
- /* Note: pitch better be a power of two tile widths */
|
|
- pitch_val = obj_priv->stride / tile_width;
|
|
- pitch_val = ffs(pitch_val) - 1;
|
|
+ pitch_val = (obj_priv->stride / 512) - 1;
|
|
|
|
val = obj_priv->gtt_offset;
|
|
if (obj_priv->tiling_mode == I915_TILING_Y)
|
|
@@ -1503,11 +1468,7 @@
|
|
val |= pitch_val << I830_FENCE_PITCH_SHIFT;
|
|
val |= I830_FENCE_REG_VALID;
|
|
|
|
- if (regnum < 8)
|
|
- fence_reg = FENCE_REG_830_0 + (regnum * 4);
|
|
- else
|
|
- fence_reg = FENCE_REG_945_8 + ((regnum - 8) * 4);
|
|
- I915_WRITE(fence_reg, val);
|
|
+ I915_WRITE(FENCE_REG_830_0 + (regnum * 4), val);
|
|
}
|
|
|
|
static void i830_write_fence_reg(struct drm_i915_fence_reg *reg)
|
|
@@ -1522,8 +1483,7 @@
|
|
|
|
if ((obj_priv->gtt_offset & ~I915_FENCE_START_MASK) ||
|
|
(obj_priv->gtt_offset & (obj->size - 1))) {
|
|
- WARN(1, "%s: object 0x%08x not 1M or size aligned\n",
|
|
- __func__, obj_priv->gtt_offset);
|
|
+ WARN(1, "%s: object not 1M or size aligned\n", __func__);
|
|
return;
|
|
}
|
|
|
|
@@ -1543,7 +1503,6 @@
|
|
/**
|
|
* i915_gem_object_get_fence_reg - set up a fence reg for an object
|
|
* @obj: object to map through a fence reg
|
|
- * @write: object is about to be written
|
|
*
|
|
* When mapping objects through the GTT, userspace wants to be able to write
|
|
* to them without having to worry about swizzling if the object is tiled.
|
|
@@ -1554,77 +1513,49 @@
|
|
* It then sets up the reg based on the object's properties: address, pitch
|
|
* and tiling format.
|
|
*/
|
|
-static int
|
|
-i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write)
|
|
+static void
|
|
+i915_gem_object_get_fence_reg(struct drm_gem_object *obj)
|
|
{
|
|
struct drm_device *dev = obj->dev;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_gem_object *obj_priv = obj->driver_private;
|
|
struct drm_i915_fence_reg *reg = NULL;
|
|
- struct drm_i915_gem_object *old_obj_priv = NULL;
|
|
- int i, ret, avail;
|
|
+ int i, ret;
|
|
|
|
switch (obj_priv->tiling_mode) {
|
|
case I915_TILING_NONE:
|
|
WARN(1, "allocating a fence for non-tiled object?\n");
|
|
break;
|
|
case I915_TILING_X:
|
|
- if (!obj_priv->stride)
|
|
- return -EINVAL;
|
|
- WARN((obj_priv->stride & (512 - 1)),
|
|
- "object 0x%08x is X tiled but has non-512B pitch\n",
|
|
- obj_priv->gtt_offset);
|
|
+ WARN(obj_priv->stride & (512 - 1),
|
|
+ "object is X tiled but has non-512B pitch\n");
|
|
break;
|
|
case I915_TILING_Y:
|
|
- if (!obj_priv->stride)
|
|
- return -EINVAL;
|
|
- WARN((obj_priv->stride & (128 - 1)),
|
|
- "object 0x%08x is Y tiled but has non-128B pitch\n",
|
|
- obj_priv->gtt_offset);
|
|
+ WARN(obj_priv->stride & (128 - 1),
|
|
+ "object is Y tiled but has non-128B pitch\n");
|
|
break;
|
|
}
|
|
|
|
/* First try to find a free reg */
|
|
-try_again:
|
|
- avail = 0;
|
|
for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
|
|
reg = &dev_priv->fence_regs[i];
|
|
if (!reg->obj)
|
|
break;
|
|
-
|
|
- old_obj_priv = reg->obj->driver_private;
|
|
- if (!old_obj_priv->pin_count)
|
|
- avail++;
|
|
}
|
|
|
|
/* None available, try to steal one or wait for a user to finish */
|
|
if (i == dev_priv->num_fence_regs) {
|
|
- uint32_t seqno = dev_priv->mm.next_gem_seqno;
|
|
+ struct drm_i915_gem_object *old_obj_priv = NULL;
|
|
loff_t offset;
|
|
|
|
- if (avail == 0)
|
|
- return -ENOMEM;
|
|
-
|
|
+try_again:
|
|
+ /* Could try to use LRU here instead... */
|
|
for (i = dev_priv->fence_reg_start;
|
|
i < dev_priv->num_fence_regs; i++) {
|
|
- uint32_t this_seqno;
|
|
-
|
|
reg = &dev_priv->fence_regs[i];
|
|
old_obj_priv = reg->obj->driver_private;
|
|
-
|
|
- if (old_obj_priv->pin_count)
|
|
- continue;
|
|
-
|
|
- /* i915 uses fences for GPU access to tiled buffers */
|
|
- if (IS_I965G(dev) || !old_obj_priv->active)
|
|
+ if (!old_obj_priv->pin_count)
|
|
break;
|
|
-
|
|
- /* find the seqno of the first available fence */
|
|
- this_seqno = old_obj_priv->last_rendering_seqno;
|
|
- if (this_seqno != 0 &&
|
|
- reg->obj->write_domain == 0 &&
|
|
- i915_seqno_passed(seqno, this_seqno))
|
|
- seqno = this_seqno;
|
|
}
|
|
|
|
/*
|
|
@@ -1632,25 +1563,14 @@
|
|
* objects to finish before trying again.
|
|
*/
|
|
if (i == dev_priv->num_fence_regs) {
|
|
- if (seqno == dev_priv->mm.next_gem_seqno) {
|
|
- i915_gem_flush(dev,
|
|
- I915_GEM_GPU_DOMAINS,
|
|
- I915_GEM_GPU_DOMAINS);
|
|
- seqno = i915_add_request(dev,
|
|
- I915_GEM_GPU_DOMAINS);
|
|
- if (seqno == 0)
|
|
- return -ENOMEM;
|
|
+ ret = i915_gem_object_wait_rendering(reg->obj);
|
|
+ if (ret) {
|
|
+ WARN(ret, "wait_rendering failed: %d\n", ret);
|
|
+ return;
|
|
}
|
|
-
|
|
- ret = i915_wait_request(dev, seqno);
|
|
- if (ret)
|
|
- return ret;
|
|
goto try_again;
|
|
}
|
|
|
|
- BUG_ON(old_obj_priv->active ||
|
|
- (reg->obj->write_domain & I915_GEM_GPU_DOMAINS));
|
|
-
|
|
/*
|
|
* Zap this virtual mapping so we can set up a fence again
|
|
* for this object next time we need it.
|
|
@@ -1671,8 +1591,6 @@
|
|
i915_write_fence_reg(reg);
|
|
else
|
|
i830_write_fence_reg(reg);
|
|
-
|
|
- return 0;
|
|
}
|
|
|
|
/**
|
|
@@ -1691,17 +1609,8 @@
|
|
|
|
if (IS_I965G(dev))
|
|
I915_WRITE64(FENCE_REG_965_0 + (obj_priv->fence_reg * 8), 0);
|
|
- else {
|
|
- uint32_t fence_reg;
|
|
-
|
|
- if (obj_priv->fence_reg < 8)
|
|
- fence_reg = FENCE_REG_830_0 + obj_priv->fence_reg * 4;
|
|
- else
|
|
- fence_reg = FENCE_REG_945_8 + (obj_priv->fence_reg -
|
|
- 8) * 4;
|
|
-
|
|
- I915_WRITE(fence_reg, 0);
|
|
- }
|
|
+ else
|
|
+ I915_WRITE(FENCE_REG_830_0 + (obj_priv->fence_reg * 4), 0);
|
|
|
|
dev_priv->fence_regs[obj_priv->fence_reg].obj = NULL;
|
|
obj_priv->fence_reg = I915_FENCE_REG_NONE;
|
|
@@ -1722,7 +1631,7 @@
|
|
if (dev_priv->mm.suspended)
|
|
return -EBUSY;
|
|
if (alignment == 0)
|
|
- alignment = i915_gem_get_gtt_alignment(obj);
|
|
+ alignment = PAGE_SIZE;
|
|
if (alignment & (PAGE_SIZE - 1)) {
|
|
DRM_ERROR("Invalid object alignment requested %u\n", alignment);
|
|
return -EINVAL;
|
|
@@ -2065,28 +1974,30 @@
|
|
* drm_agp_chipset_flush
|
|
*/
|
|
static void
|
|
-i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj)
|
|
+i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj,
|
|
+ uint32_t read_domains,
|
|
+ uint32_t write_domain)
|
|
{
|
|
struct drm_device *dev = obj->dev;
|
|
struct drm_i915_gem_object *obj_priv = obj->driver_private;
|
|
uint32_t invalidate_domains = 0;
|
|
uint32_t flush_domains = 0;
|
|
|
|
- BUG_ON(obj->pending_read_domains & I915_GEM_DOMAIN_CPU);
|
|
- BUG_ON(obj->pending_write_domain == I915_GEM_DOMAIN_CPU);
|
|
+ BUG_ON(read_domains & I915_GEM_DOMAIN_CPU);
|
|
+ BUG_ON(write_domain == I915_GEM_DOMAIN_CPU);
|
|
|
|
#if WATCH_BUF
|
|
DRM_INFO("%s: object %p read %08x -> %08x write %08x -> %08x\n",
|
|
__func__, obj,
|
|
- obj->read_domains, obj->pending_read_domains,
|
|
- obj->write_domain, obj->pending_write_domain);
|
|
+ obj->read_domains, read_domains,
|
|
+ obj->write_domain, write_domain);
|
|
#endif
|
|
/*
|
|
* If the object isn't moving to a new write domain,
|
|
* let the object stay in multiple read domains
|
|
*/
|
|
- if (obj->pending_write_domain == 0)
|
|
- obj->pending_read_domains |= obj->read_domains;
|
|
+ if (write_domain == 0)
|
|
+ read_domains |= obj->read_domains;
|
|
else
|
|
obj_priv->dirty = 1;
|
|
|
|
@@ -2096,17 +2007,15 @@
|
|
* any read domains which differ from the old
|
|
* write domain
|
|
*/
|
|
- if (obj->write_domain &&
|
|
- obj->write_domain != obj->pending_read_domains) {
|
|
+ if (obj->write_domain && obj->write_domain != read_domains) {
|
|
flush_domains |= obj->write_domain;
|
|
- invalidate_domains |=
|
|
- obj->pending_read_domains & ~obj->write_domain;
|
|
+ invalidate_domains |= read_domains & ~obj->write_domain;
|
|
}
|
|
/*
|
|
* Invalidate any read caches which may have
|
|
* stale data. That is, any new read domains.
|
|
*/
|
|
- invalidate_domains |= obj->pending_read_domains & ~obj->read_domains;
|
|
+ invalidate_domains |= read_domains & ~obj->read_domains;
|
|
if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU) {
|
|
#if WATCH_BUF
|
|
DRM_INFO("%s: CPU domain flush %08x invalidate %08x\n",
|
|
@@ -2115,15 +2024,9 @@
|
|
i915_gem_clflush_object(obj);
|
|
}
|
|
|
|
- /* The actual obj->write_domain will be updated with
|
|
- * pending_write_domain after we emit the accumulated flush for all
|
|
- * of our domain changes in execbuffers (which clears objects'
|
|
- * write_domains). So if we have a current write domain that we
|
|
- * aren't changing, set pending_write_domain to that.
|
|
- */
|
|
- if (flush_domains == 0 && obj->pending_write_domain == 0)
|
|
- obj->pending_write_domain = obj->write_domain;
|
|
- obj->read_domains = obj->pending_read_domains;
|
|
+ if ((write_domain | flush_domains) != 0)
|
|
+ obj->write_domain = write_domain;
|
|
+ obj->read_domains = read_domains;
|
|
|
|
dev->invalidate_domains |= invalidate_domains;
|
|
dev->flush_domains |= flush_domains;
|
|
@@ -2326,8 +2229,6 @@
|
|
(int) reloc.offset,
|
|
reloc.read_domains,
|
|
reloc.write_domain);
|
|
- drm_gem_object_unreference(target_obj);
|
|
- i915_gem_object_unpin(obj);
|
|
return -EINVAL;
|
|
}
|
|
|
|
@@ -2514,7 +2415,6 @@
|
|
struct drm_i915_gem_exec_object *exec_list = NULL;
|
|
struct drm_gem_object **object_list = NULL;
|
|
struct drm_gem_object *batch_obj;
|
|
- struct drm_i915_gem_object *obj_priv;
|
|
int ret, i, pinned = 0;
|
|
uint64_t exec_offset;
|
|
uint32_t seqno, flush_domains;
|
|
@@ -2558,15 +2458,13 @@
|
|
if (dev_priv->mm.wedged) {
|
|
DRM_ERROR("Execbuf while wedged\n");
|
|
mutex_unlock(&dev->struct_mutex);
|
|
- ret = -EIO;
|
|
- goto pre_mutex_err;
|
|
+ return -EIO;
|
|
}
|
|
|
|
if (dev_priv->mm.suspended) {
|
|
DRM_ERROR("Execbuf while VT-switched.\n");
|
|
mutex_unlock(&dev->struct_mutex);
|
|
- ret = -EBUSY;
|
|
- goto pre_mutex_err;
|
|
+ return -EBUSY;
|
|
}
|
|
|
|
/* Look up object handles */
|
|
@@ -2579,15 +2477,6 @@
|
|
ret = -EBADF;
|
|
goto err;
|
|
}
|
|
-
|
|
- obj_priv = object_list[i]->driver_private;
|
|
- if (obj_priv->in_execbuffer) {
|
|
- DRM_ERROR("Object %p appears more than once in object list\n",
|
|
- object_list[i]);
|
|
- ret = -EBADF;
|
|
- goto err;
|
|
- }
|
|
- obj_priv->in_execbuffer = true;
|
|
}
|
|
|
|
/* Pin and relocate */
|
|
@@ -2643,7 +2532,9 @@
|
|
struct drm_gem_object *obj = object_list[i];
|
|
|
|
/* Compute new gpu domains and update invalidate/flush */
|
|
- i915_gem_object_set_to_gpu_domain(obj);
|
|
+ i915_gem_object_set_to_gpu_domain(obj,
|
|
+ obj->pending_read_domains,
|
|
+ obj->pending_write_domain);
|
|
}
|
|
|
|
i915_verify_inactive(dev, __FILE__, __LINE__);
|
|
@@ -2662,12 +2553,6 @@
|
|
(void)i915_add_request(dev, dev->flush_domains);
|
|
}
|
|
|
|
- for (i = 0; i < args->buffer_count; i++) {
|
|
- struct drm_gem_object *obj = object_list[i];
|
|
-
|
|
- obj->write_domain = obj->pending_write_domain;
|
|
- }
|
|
-
|
|
i915_verify_inactive(dev, __FILE__, __LINE__);
|
|
|
|
#if WATCH_COHERENCY
|
|
@@ -2725,32 +2610,24 @@
|
|
|
|
i915_verify_inactive(dev, __FILE__, __LINE__);
|
|
|
|
+ /* Copy the new buffer offsets back to the user's exec list. */
|
|
+ ret = copy_to_user((struct drm_i915_relocation_entry __user *)
|
|
+ (uintptr_t) args->buffers_ptr,
|
|
+ exec_list,
|
|
+ sizeof(*exec_list) * args->buffer_count);
|
|
+ if (ret)
|
|
+ DRM_ERROR("failed to copy %d exec entries "
|
|
+ "back to user (%d)\n",
|
|
+ args->buffer_count, ret);
|
|
err:
|
|
for (i = 0; i < pinned; i++)
|
|
i915_gem_object_unpin(object_list[i]);
|
|
|
|
- for (i = 0; i < args->buffer_count; i++) {
|
|
- if (object_list[i]) {
|
|
- obj_priv = object_list[i]->driver_private;
|
|
- obj_priv->in_execbuffer = false;
|
|
- }
|
|
+ for (i = 0; i < args->buffer_count; i++)
|
|
drm_gem_object_unreference(object_list[i]);
|
|
- }
|
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
|
- if (!ret) {
|
|
- /* Copy the new buffer offsets back to the user's exec list. */
|
|
- ret = copy_to_user((struct drm_i915_relocation_entry __user *)
|
|
- (uintptr_t) args->buffers_ptr,
|
|
- exec_list,
|
|
- sizeof(*exec_list) * args->buffer_count);
|
|
- if (ret)
|
|
- DRM_ERROR("failed to copy %d exec entries "
|
|
- "back to user (%d)\n",
|
|
- args->buffer_count, ret);
|
|
- }
|
|
-
|
|
pre_mutex_err:
|
|
drm_free(object_list, sizeof(*object_list) * args->buffer_count,
|
|
DRM_MEM_DRIVER);
|
|
@@ -2772,22 +2649,7 @@
|
|
ret = i915_gem_object_bind_to_gtt(obj, alignment);
|
|
if (ret != 0) {
|
|
if (ret != -EBUSY && ret != -ERESTARTSYS)
|
|
- DRM_ERROR("Failure to bind: %d\n", ret);
|
|
- return ret;
|
|
- }
|
|
- }
|
|
- /*
|
|
- * Pre-965 chips need a fence register set up in order to
|
|
- * properly handle tiled surfaces.
|
|
- */
|
|
- if (!IS_I965G(dev) &&
|
|
- obj_priv->fence_reg == I915_FENCE_REG_NONE &&
|
|
- obj_priv->tiling_mode != I915_TILING_NONE) {
|
|
- ret = i915_gem_object_get_fence_reg(obj, true);
|
|
- if (ret != 0) {
|
|
- if (ret != -EBUSY && ret != -ERESTARTSYS)
|
|
- DRM_ERROR("Failure to install fence: %d\n",
|
|
- ret);
|
|
+ DRM_ERROR("Failure to bind: %d", ret);
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -2861,7 +2723,6 @@
|
|
if (obj_priv->pin_filp != NULL && obj_priv->pin_filp != file_priv) {
|
|
DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n",
|
|
args->handle);
|
|
- drm_gem_object_unreference(obj);
|
|
mutex_unlock(&dev->struct_mutex);
|
|
return -EINVAL;
|
|
}
|
|
@@ -2942,13 +2803,6 @@
|
|
return -EBADF;
|
|
}
|
|
|
|
- /* Update the active list for the hardware's current position.
|
|
- * Otherwise this only updates on a delayed timer or when irqs are
|
|
- * actually unmasked, and our working set ends up being larger than
|
|
- * required.
|
|
- */
|
|
- i915_gem_retire_requests(dev);
|
|
-
|
|
obj_priv = obj->driver_private;
|
|
/* Don't count being on the flushing list against the object being
|
|
* done. Otherwise, a buffer left on the flushing list but not getting
|
|
@@ -3001,6 +2855,9 @@
|
|
void i915_gem_free_object(struct drm_gem_object *obj)
|
|
{
|
|
struct drm_device *dev = obj->dev;
|
|
+ struct drm_gem_mm *mm = dev->mm_private;
|
|
+ struct drm_map_list *list;
|
|
+ struct drm_map *map;
|
|
struct drm_i915_gem_object *obj_priv = obj->driver_private;
|
|
|
|
while (obj_priv->pin_count > 0)
|
|
@@ -3011,7 +2868,19 @@
|
|
|
|
i915_gem_object_unbind(obj);
|
|
|
|
- i915_gem_free_mmap_offset(obj);
|
|
+ list = &obj->map_list;
|
|
+ drm_ht_remove_item(&mm->offset_hash, &list->hash);
|
|
+
|
|
+ if (list->file_offset_node) {
|
|
+ drm_mm_put_block(list->file_offset_node);
|
|
+ list->file_offset_node = NULL;
|
|
+ }
|
|
+
|
|
+ map = list->map;
|
|
+ if (map) {
|
|
+ drm_free(map, sizeof(*map), DRM_MEM_DRIVER);
|
|
+ list->map = NULL;
|
|
+ }
|
|
|
|
drm_free(obj_priv->page_cpu_valid, 1, DRM_MEM_DRIVER);
|
|
drm_free(obj->driver_private, 1, DRM_MEM_DRIVER);
|
|
@@ -3050,7 +2919,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-int
|
|
+static int
|
|
i915_gem_idle(struct drm_device *dev)
|
|
{
|
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
@@ -3196,7 +3065,6 @@
|
|
if (dev_priv->hw_status_page == NULL) {
|
|
DRM_ERROR("Failed to map status page.\n");
|
|
memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
|
|
- i915_gem_object_unpin(obj);
|
|
drm_gem_object_unreference(obj);
|
|
return -EINVAL;
|
|
}
|
|
@@ -3209,31 +3077,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-static void
|
|
-i915_gem_cleanup_hws(struct drm_device *dev)
|
|
-{
|
|
- drm_i915_private_t *dev_priv = dev->dev_private;
|
|
- struct drm_gem_object *obj;
|
|
- struct drm_i915_gem_object *obj_priv;
|
|
-
|
|
- if (dev_priv->hws_obj == NULL)
|
|
- return;
|
|
-
|
|
- obj = dev_priv->hws_obj;
|
|
- obj_priv = obj->driver_private;
|
|
-
|
|
- kunmap(obj_priv->page_list[0]);
|
|
- i915_gem_object_unpin(obj);
|
|
- drm_gem_object_unreference(obj);
|
|
- dev_priv->hws_obj = NULL;
|
|
-
|
|
- memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
|
|
- dev_priv->hw_status_page = NULL;
|
|
-
|
|
- /* Write high address into HWS_PGA when disabling. */
|
|
- I915_WRITE(HWS_PGA, 0x1ffff000);
|
|
-}
|
|
-
|
|
int
|
|
i915_gem_init_ringbuffer(struct drm_device *dev)
|
|
{
|
|
@@ -3251,7 +3094,6 @@
|
|
obj = drm_gem_object_alloc(dev, 128 * 1024);
|
|
if (obj == NULL) {
|
|
DRM_ERROR("Failed to allocate ringbuffer\n");
|
|
- i915_gem_cleanup_hws(dev);
|
|
return -ENOMEM;
|
|
}
|
|
obj_priv = obj->driver_private;
|
|
@@ -3259,7 +3101,6 @@
|
|
ret = i915_gem_object_pin(obj, 4096);
|
|
if (ret != 0) {
|
|
drm_gem_object_unreference(obj);
|
|
- i915_gem_cleanup_hws(dev);
|
|
return ret;
|
|
}
|
|
|
|
@@ -3277,9 +3118,7 @@
|
|
if (ring->map.handle == NULL) {
|
|
DRM_ERROR("Failed to map ringbuffer.\n");
|
|
memset(&dev_priv->ring, 0, sizeof(dev_priv->ring));
|
|
- i915_gem_object_unpin(obj);
|
|
drm_gem_object_unreference(obj);
|
|
- i915_gem_cleanup_hws(dev);
|
|
return -EINVAL;
|
|
}
|
|
ring->ring_obj = obj;
|
|
@@ -3359,7 +3198,20 @@
|
|
dev_priv->ring.ring_obj = NULL;
|
|
memset(&dev_priv->ring, 0, sizeof(dev_priv->ring));
|
|
|
|
- i915_gem_cleanup_hws(dev);
|
|
+ if (dev_priv->hws_obj != NULL) {
|
|
+ struct drm_gem_object *obj = dev_priv->hws_obj;
|
|
+ struct drm_i915_gem_object *obj_priv = obj->driver_private;
|
|
+
|
|
+ kunmap(obj_priv->page_list[0]);
|
|
+ i915_gem_object_unpin(obj);
|
|
+ drm_gem_object_unreference(obj);
|
|
+ dev_priv->hws_obj = NULL;
|
|
+ memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
|
|
+ dev_priv->hw_status_page = NULL;
|
|
+
|
|
+ /* Write high address into HWS_PGA when disabling. */
|
|
+ I915_WRITE(HWS_PGA, 0x1ffff000);
|
|
+ }
|
|
}
|
|
|
|
int
|
|
@@ -3377,6 +3229,10 @@
|
|
dev_priv->mm.wedged = 0;
|
|
}
|
|
|
|
+ dev_priv->mm.gtt_mapping = io_mapping_create_wc(dev->agp->base,
|
|
+ dev->agp->agp_info.aper_size
|
|
+ * 1024 * 1024);
|
|
+
|
|
mutex_lock(&dev->struct_mutex);
|
|
dev_priv->mm.suspended = 0;
|
|
|
|
@@ -3399,6 +3255,7 @@
|
|
i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,
|
|
struct drm_file *file_priv)
|
|
{
|
|
+ drm_i915_private_t *dev_priv = dev->dev_private;
|
|
int ret;
|
|
|
|
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
|
@@ -3407,6 +3264,7 @@
|
|
ret = i915_gem_idle(dev);
|
|
drm_irq_uninstall(dev);
|
|
|
|
+ io_mapping_free(dev_priv->mm.gtt_mapping);
|
|
return ret;
|
|
}
|
|
|
|
@@ -3415,9 +3273,6 @@
|
|
{
|
|
int ret;
|
|
|
|
- if (drm_core_check_feature(dev, DRIVER_MODESET))
|
|
- return;
|
|
-
|
|
ret = i915_gem_idle(dev);
|
|
if (ret)
|
|
DRM_ERROR("failed to idle hardware: %d\n", ret);
|
|
@@ -3439,7 +3294,7 @@
|
|
/* Old X drivers will take 0-2 for front, back, depth buffers */
|
|
dev_priv->fence_reg_start = 3;
|
|
|
|
- if (IS_I965G(dev) || IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
|
|
+ if (IS_I965G(dev))
|
|
dev_priv->num_fence_regs = 16;
|
|
else
|
|
dev_priv->num_fence_regs = 8;
|
|
@@ -3615,7 +3470,7 @@
|
|
user_data = (char __user *) (uintptr_t) args->data_ptr;
|
|
obj_addr = obj_priv->phys_obj->handle->vaddr + args->offset;
|
|
|
|
- DRM_DEBUG("obj_addr %p, %lld\n", obj_addr, args->size);
|
|
+ DRM_ERROR("obj_addr %p, %lld\n", obj_addr, args->size);
|
|
ret = copy_from_user(obj_addr, user_data, args->size);
|
|
if (ret)
|
|
return -EFAULT;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_gem_tiling.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_gem_tiling.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_gem_tiling.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_gem_tiling.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -173,73 +173,6 @@
|
|
dev_priv->mm.bit_6_swizzle_y = swizzle_y;
|
|
}
|
|
|
|
-
|
|
-/**
|
|
- * Returns the size of the fence for a tiled object of the given size.
|
|
- */
|
|
-static int
|
|
-i915_get_fence_size(struct drm_device *dev, int size)
|
|
-{
|
|
- int i;
|
|
- int start;
|
|
-
|
|
- if (IS_I965G(dev)) {
|
|
- /* The 965 can have fences at any page boundary. */
|
|
- return ALIGN(size, 4096);
|
|
- } else {
|
|
- /* Align the size to a power of two greater than the smallest
|
|
- * fence size.
|
|
- */
|
|
- if (IS_I9XX(dev))
|
|
- start = 1024 * 1024;
|
|
- else
|
|
- start = 512 * 1024;
|
|
-
|
|
- for (i = start; i < size; i <<= 1)
|
|
- ;
|
|
-
|
|
- return i;
|
|
- }
|
|
-}
|
|
-
|
|
-/* Check pitch constriants for all chips & tiling formats */
|
|
-static bool
|
|
-i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
|
|
-{
|
|
- int tile_width;
|
|
-
|
|
- /* Linear is always fine */
|
|
- if (tiling_mode == I915_TILING_NONE)
|
|
- return true;
|
|
-
|
|
- if (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
|
|
- tile_width = 128;
|
|
- else
|
|
- tile_width = 512;
|
|
-
|
|
- /* 965+ just needs multiples of tile width */
|
|
- if (IS_I965G(dev)) {
|
|
- if (stride & (tile_width - 1))
|
|
- return false;
|
|
- return true;
|
|
- }
|
|
-
|
|
- /* Pre-965 needs power of two tile widths */
|
|
- if (stride < tile_width)
|
|
- return false;
|
|
-
|
|
- if (stride & (stride - 1))
|
|
- return false;
|
|
-
|
|
- /* We don't handle the aperture area covered by the fence being bigger
|
|
- * than the object size.
|
|
- */
|
|
- if (i915_get_fence_size(dev, size) != size)
|
|
- return false;
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
/**
|
|
* Sets the tiling mode of an object, returning the required swizzling of
|
|
* bit 6 of addresses in the object.
|
|
@@ -258,11 +191,6 @@
|
|
return -EINVAL;
|
|
obj_priv = obj->driver_private;
|
|
|
|
- if (!i915_tiling_ok(dev, args->stride, obj->size, args->tiling_mode)) {
|
|
- drm_gem_object_unreference(obj);
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
mutex_lock(&dev->struct_mutex);
|
|
|
|
if (args->tiling_mode == I915_TILING_NONE) {
|
|
@@ -279,29 +207,13 @@
|
|
args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE;
|
|
}
|
|
}
|
|
- if (args->tiling_mode != obj_priv->tiling_mode) {
|
|
- int ret;
|
|
-
|
|
- /* Unbind the object, as switching tiling means we're
|
|
- * switching the cache organization due to fencing, probably.
|
|
- */
|
|
- ret = i915_gem_object_unbind(obj);
|
|
- if (ret != 0) {
|
|
- WARN(ret != -ERESTARTSYS,
|
|
- "failed to unbind object for tiling switch");
|
|
- args->tiling_mode = obj_priv->tiling_mode;
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
- drm_gem_object_unreference(obj);
|
|
-
|
|
- return ret;
|
|
- }
|
|
- obj_priv->tiling_mode = args->tiling_mode;
|
|
- }
|
|
+ obj_priv->tiling_mode = args->tiling_mode;
|
|
obj_priv->stride = args->stride;
|
|
|
|
- drm_gem_object_unreference(obj);
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
|
+ drm_gem_object_unreference(obj);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -339,8 +251,9 @@
|
|
DRM_ERROR("unknown tiling mode\n");
|
|
}
|
|
|
|
- drm_gem_object_unreference(obj);
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
|
+ drm_gem_object_unreference(obj);
|
|
+
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_irq.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_irq.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_irq.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_irq.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -174,19 +174,6 @@
|
|
return count;
|
|
}
|
|
|
|
-u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
|
|
-{
|
|
- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
|
- int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45;
|
|
-
|
|
- if (!i915_pipe_enabled(dev, pipe)) {
|
|
- DRM_ERROR("trying to get vblank count for disabled pipe %d\n", pipe);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- return I915_READ(reg);
|
|
-}
|
|
-
|
|
irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
|
|
{
|
|
struct drm_device *dev = (struct drm_device *) arg;
|
|
@@ -383,13 +370,12 @@
|
|
drm_i915_irq_emit_t *emit = data;
|
|
int result;
|
|
|
|
+ RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
+
|
|
if (!dev_priv) {
|
|
DRM_ERROR("called with no initialization\n");
|
|
return -EINVAL;
|
|
}
|
|
-
|
|
- RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
-
|
|
mutex_lock(&dev->struct_mutex);
|
|
result = i915_emit_irq(dev);
|
|
mutex_unlock(&dev->struct_mutex);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_reg.h linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_reg.h
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_reg.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_reg.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -184,15 +184,14 @@
|
|
* Fence registers
|
|
*/
|
|
#define FENCE_REG_830_0 0x2000
|
|
-#define FENCE_REG_945_8 0x3000
|
|
#define I830_FENCE_START_MASK 0x07f80000
|
|
#define I830_FENCE_TILING_Y_SHIFT 12
|
|
-#define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8)
|
|
+#define I830_FENCE_SIZE_BITS(size) ((get_order(size >> 19) - 1) << 8)
|
|
#define I830_FENCE_PITCH_SHIFT 4
|
|
#define I830_FENCE_REG_VALID (1<<0)
|
|
|
|
#define I915_FENCE_START_MASK 0x0ff00000
|
|
-#define I915_FENCE_SIZE_BITS(size) ((ffs((size) >> 20) - 1) << 8)
|
|
+#define I915_FENCE_SIZE_BITS(size) ((get_order(size >> 20) - 1) << 8)
|
|
|
|
#define FENCE_REG_965_0 0x03000
|
|
#define I965_FENCE_PITCH_SHIFT 2
|
|
@@ -1372,9 +1371,6 @@
|
|
#define PIPE_FRAME_LOW_SHIFT 24
|
|
#define PIPE_PIXEL_MASK 0x00ffffff
|
|
#define PIPE_PIXEL_SHIFT 0
|
|
-/* GM45+ just has to be different */
|
|
-#define PIPEA_FRMCOUNT_GM45 0x70040
|
|
-#define PIPEA_FLIPCOUNT_GM45 0x70044
|
|
|
|
/* Cursor A & B regs */
|
|
#define CURACNTR 0x70080
|
|
@@ -1443,9 +1439,6 @@
|
|
#define PIPEBSTAT 0x71024
|
|
#define PIPEBFRAMEHIGH 0x71040
|
|
#define PIPEBFRAMEPIXEL 0x71044
|
|
-#define PIPEB_FRMCOUNT_GM45 0x71040
|
|
-#define PIPEB_FLIPCOUNT_GM45 0x71044
|
|
-
|
|
|
|
/* Display B control */
|
|
#define DSPBCNTR 0x71180
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_suspend.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_suspend.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_suspend.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_suspend.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -119,6 +119,11 @@
|
|
|
|
/* VGA color palette registers */
|
|
dev_priv->saveDACMASK = I915_READ8(VGA_DACMASK);
|
|
+ /* DACCRX automatically increments during read */
|
|
+ I915_WRITE8(VGA_DACRX, 0);
|
|
+ /* Read 3 bytes of color data from each index */
|
|
+ for (i = 0; i < 256 * 3; i++)
|
|
+ dev_priv->saveDACDATA[i] = I915_READ8(VGA_DACDATA);
|
|
|
|
/* MSR bits */
|
|
dev_priv->saveMSR = I915_READ8(VGA_MSR_READ);
|
|
@@ -220,6 +225,12 @@
|
|
|
|
/* VGA color palette registers */
|
|
I915_WRITE8(VGA_DACMASK, dev_priv->saveDACMASK);
|
|
+ /* DACCRX automatically increments during read */
|
|
+ I915_WRITE8(VGA_DACWX, 0);
|
|
+ /* Read 3 bytes of color data from each index */
|
|
+ for (i = 0; i < 256 * 3; i++)
|
|
+ I915_WRITE8(VGA_DACDATA, dev_priv->saveDACDATA[i]);
|
|
+
|
|
}
|
|
|
|
int i915_save_state(struct drm_device *dev)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_bios.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_bios.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_bios.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_bios.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -111,12 +111,6 @@
|
|
panel_fixed_mode->clock = dvo_timing->clock * 10;
|
|
panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED;
|
|
|
|
- /* Some VBTs have bogus h/vtotal values */
|
|
- if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
|
|
- panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1;
|
|
- if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal)
|
|
- panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1;
|
|
-
|
|
drm_mode_set_name(panel_fixed_mode);
|
|
|
|
dev_priv->vbt_mode = panel_fixed_mode;
|
|
@@ -141,14 +135,6 @@
|
|
if (general) {
|
|
dev_priv->int_tv_support = general->int_tv_support;
|
|
dev_priv->int_crt_support = general->int_crt_support;
|
|
- dev_priv->lvds_use_ssc = general->enable_ssc;
|
|
-
|
|
- if (dev_priv->lvds_use_ssc) {
|
|
- if (IS_I855(dev_priv->dev))
|
|
- dev_priv->lvds_ssc_freq = general->ssc_freq ? 66 : 48;
|
|
- else
|
|
- dev_priv->lvds_ssc_freq = general->ssc_freq ? 100 : 96;
|
|
- }
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_display.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_display.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_display.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_display.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -90,12 +90,12 @@
|
|
#define I9XX_DOT_MAX 400000
|
|
#define I9XX_VCO_MIN 1400000
|
|
#define I9XX_VCO_MAX 2800000
|
|
-#define I9XX_N_MIN 1
|
|
-#define I9XX_N_MAX 6
|
|
+#define I9XX_N_MIN 3
|
|
+#define I9XX_N_MAX 8
|
|
#define I9XX_M_MIN 70
|
|
#define I9XX_M_MAX 120
|
|
#define I9XX_M1_MIN 10
|
|
-#define I9XX_M1_MAX 22
|
|
+#define I9XX_M1_MAX 20
|
|
#define I9XX_M2_MIN 5
|
|
#define I9XX_M2_MAX 9
|
|
#define I9XX_P_SDVO_DAC_MIN 5
|
|
@@ -189,7 +189,9 @@
|
|
return limit;
|
|
}
|
|
|
|
-static void intel_clock(int refclk, intel_clock_t *clock)
|
|
+/** Derive the pixel clock for the given refclk and divisors for 8xx chips. */
|
|
+
|
|
+static void i8xx_clock(int refclk, intel_clock_t *clock)
|
|
{
|
|
clock->m = 5 * (clock->m1 + 2) + (clock->m2 + 2);
|
|
clock->p = clock->p1 * clock->p2;
|
|
@@ -197,6 +199,25 @@
|
|
clock->dot = clock->vco / clock->p;
|
|
}
|
|
|
|
+/** Derive the pixel clock for the given refclk and divisors for 9xx chips. */
|
|
+
|
|
+static void i9xx_clock(int refclk, intel_clock_t *clock)
|
|
+{
|
|
+ clock->m = 5 * (clock->m1 + 2) + (clock->m2 + 2);
|
|
+ clock->p = clock->p1 * clock->p2;
|
|
+ clock->vco = refclk * clock->m / (clock->n + 2);
|
|
+ clock->dot = clock->vco / clock->p;
|
|
+}
|
|
+
|
|
+static void intel_clock(struct drm_device *dev, int refclk,
|
|
+ intel_clock_t *clock)
|
|
+{
|
|
+ if (IS_I9XX(dev))
|
|
+ i9xx_clock (refclk, clock);
|
|
+ else
|
|
+ i8xx_clock (refclk, clock);
|
|
+}
|
|
+
|
|
/**
|
|
* Returns whether any output on the specified pipe is of the specified type
|
|
*/
|
|
@@ -217,7 +238,7 @@
|
|
return false;
|
|
}
|
|
|
|
-#define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0)
|
|
+#define INTELPllInvalid(s) { /* ErrorF (s) */; return false; }
|
|
/**
|
|
* Returns whether the given set of divisors are valid for a given refclk with
|
|
* the given connectors.
|
|
@@ -297,7 +318,7 @@
|
|
clock.p1 <= limit->p1.max; clock.p1++) {
|
|
int this_err;
|
|
|
|
- intel_clock(refclk, &clock);
|
|
+ intel_clock(dev, refclk, &clock);
|
|
|
|
if (!intel_PLL_is_valid(crtc, &clock))
|
|
continue;
|
|
@@ -322,7 +343,7 @@
|
|
udelay(20000);
|
|
}
|
|
|
|
-static int
|
|
+static void
|
|
intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
|
|
struct drm_framebuffer *old_fb)
|
|
{
|
|
@@ -340,21 +361,11 @@
|
|
int dspstride = (pipe == 0) ? DSPASTRIDE : DSPBSTRIDE;
|
|
int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR;
|
|
u32 dspcntr, alignment;
|
|
- int ret;
|
|
|
|
/* no fb bound */
|
|
if (!crtc->fb) {
|
|
DRM_DEBUG("No FB bound\n");
|
|
- return 0;
|
|
- }
|
|
-
|
|
- switch (pipe) {
|
|
- case 0:
|
|
- case 1:
|
|
- break;
|
|
- default:
|
|
- DRM_ERROR("Can't update pipe %d in SAREA\n", pipe);
|
|
- return -EINVAL;
|
|
+ return;
|
|
}
|
|
|
|
intel_fb = to_intel_framebuffer(crtc->fb);
|
|
@@ -366,30 +377,28 @@
|
|
alignment = 64 * 1024;
|
|
break;
|
|
case I915_TILING_X:
|
|
- /* pin() will align the object as required by fence */
|
|
- alignment = 0;
|
|
+ if (IS_I9XX(dev))
|
|
+ alignment = 1024 * 1024;
|
|
+ else
|
|
+ alignment = 512 * 1024;
|
|
break;
|
|
case I915_TILING_Y:
|
|
/* FIXME: Is this true? */
|
|
DRM_ERROR("Y tiled not allowed for scan out buffers\n");
|
|
- return -EINVAL;
|
|
+ return;
|
|
default:
|
|
BUG();
|
|
}
|
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
- ret = i915_gem_object_pin(intel_fb->obj, alignment);
|
|
- if (ret != 0) {
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
- return ret;
|
|
- }
|
|
+ if (i915_gem_object_pin(intel_fb->obj, alignment))
|
|
+ return;
|
|
|
|
- ret = i915_gem_object_set_to_gtt_domain(intel_fb->obj, 1);
|
|
- if (ret != 0) {
|
|
- i915_gem_object_unpin(intel_fb->obj);
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
- return ret;
|
|
- }
|
|
+ i915_gem_object_set_to_gtt_domain(intel_fb->obj, 1);
|
|
+
|
|
+ Start = obj_priv->gtt_offset;
|
|
+ Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8);
|
|
+
|
|
+ I915_WRITE(dspstride, crtc->fb->pitch);
|
|
|
|
dspcntr = I915_READ(dspcntr_reg);
|
|
/* Mask out pixel format bits in case we change it */
|
|
@@ -410,17 +419,11 @@
|
|
break;
|
|
default:
|
|
DRM_ERROR("Unknown color depth\n");
|
|
- i915_gem_object_unpin(intel_fb->obj);
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
- return -EINVAL;
|
|
+ return;
|
|
}
|
|
I915_WRITE(dspcntr_reg, dspcntr);
|
|
|
|
- Start = obj_priv->gtt_offset;
|
|
- Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8);
|
|
-
|
|
DRM_DEBUG("Writing base %08lX %08lX %d %d\n", Start, Offset, x, y);
|
|
- I915_WRITE(dspstride, crtc->fb->pitch);
|
|
if (IS_I965G(dev)) {
|
|
I915_WRITE(dspbase, Offset);
|
|
I915_READ(dspbase);
|
|
@@ -437,24 +440,27 @@
|
|
intel_fb = to_intel_framebuffer(old_fb);
|
|
i915_gem_object_unpin(intel_fb->obj);
|
|
}
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
|
if (!dev->primary->master)
|
|
- return 0;
|
|
+ return;
|
|
|
|
master_priv = dev->primary->master->driver_priv;
|
|
if (!master_priv->sarea_priv)
|
|
- return 0;
|
|
+ return;
|
|
|
|
- if (pipe) {
|
|
- master_priv->sarea_priv->pipeB_x = x;
|
|
- master_priv->sarea_priv->pipeB_y = y;
|
|
- } else {
|
|
+ switch (pipe) {
|
|
+ case 0:
|
|
master_priv->sarea_priv->pipeA_x = x;
|
|
master_priv->sarea_priv->pipeA_y = y;
|
|
+ break;
|
|
+ case 1:
|
|
+ master_priv->sarea_priv->pipeB_x = x;
|
|
+ master_priv->sarea_priv->pipeB_y = y;
|
|
+ break;
|
|
+ default:
|
|
+ DRM_ERROR("Can't update pipe %d in SAREA\n", pipe);
|
|
+ break;
|
|
}
|
|
-
|
|
- return 0;
|
|
}
|
|
|
|
|
|
@@ -702,11 +708,11 @@
|
|
return 1;
|
|
}
|
|
|
|
-static int intel_crtc_mode_set(struct drm_crtc *crtc,
|
|
- struct drm_display_mode *mode,
|
|
- struct drm_display_mode *adjusted_mode,
|
|
- int x, int y,
|
|
- struct drm_framebuffer *old_fb)
|
|
+static void intel_crtc_mode_set(struct drm_crtc *crtc,
|
|
+ struct drm_display_mode *mode,
|
|
+ struct drm_display_mode *adjusted_mode,
|
|
+ int x, int y,
|
|
+ struct drm_framebuffer *old_fb)
|
|
{
|
|
struct drm_device *dev = crtc->dev;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
@@ -726,14 +732,13 @@
|
|
int dspsize_reg = (pipe == 0) ? DSPASIZE : DSPBSIZE;
|
|
int dsppos_reg = (pipe == 0) ? DSPAPOS : DSPBPOS;
|
|
int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC;
|
|
- int refclk, num_outputs = 0;
|
|
+ int refclk;
|
|
intel_clock_t clock;
|
|
u32 dpll = 0, fp = 0, dspcntr, pipeconf;
|
|
bool ok, is_sdvo = false, is_dvo = false;
|
|
bool is_crt = false, is_lvds = false, is_tv = false;
|
|
struct drm_mode_config *mode_config = &dev->mode_config;
|
|
struct drm_connector *connector;
|
|
- int ret;
|
|
|
|
drm_vblank_pre_modeset(dev, pipe);
|
|
|
|
@@ -750,8 +755,6 @@
|
|
case INTEL_OUTPUT_SDVO:
|
|
case INTEL_OUTPUT_HDMI:
|
|
is_sdvo = true;
|
|
- if (intel_output->needs_tv_clock)
|
|
- is_tv = true;
|
|
break;
|
|
case INTEL_OUTPUT_DVO:
|
|
is_dvo = true;
|
|
@@ -763,14 +766,9 @@
|
|
is_crt = true;
|
|
break;
|
|
}
|
|
-
|
|
- num_outputs++;
|
|
}
|
|
|
|
- if (is_lvds && dev_priv->lvds_use_ssc && num_outputs < 2) {
|
|
- refclk = dev_priv->lvds_ssc_freq * 1000;
|
|
- DRM_DEBUG("using SSC reference clock of %d MHz\n", refclk / 1000);
|
|
- } else if (IS_I9XX(dev)) {
|
|
+ if (IS_I9XX(dev)) {
|
|
refclk = 96000;
|
|
} else {
|
|
refclk = 48000;
|
|
@@ -779,7 +777,7 @@
|
|
ok = intel_find_best_PLL(crtc, adjusted_mode->clock, refclk, &clock);
|
|
if (!ok) {
|
|
DRM_ERROR("Couldn't find PLL settings for mode!\n");
|
|
- return -EINVAL;
|
|
+ return;
|
|
}
|
|
|
|
fp = clock.n << 16 | clock.m1 << 8 | clock.m2;
|
|
@@ -829,14 +827,11 @@
|
|
}
|
|
}
|
|
|
|
- if (is_sdvo && is_tv)
|
|
- dpll |= PLL_REF_INPUT_TVCLKINBC;
|
|
- else if (is_tv)
|
|
+ if (is_tv) {
|
|
/* XXX: just matching BIOS for now */
|
|
- /* dpll |= PLL_REF_INPUT_TVCLKINBC; */
|
|
+/* dpll |= PLL_REF_INPUT_TVCLKINBC; */
|
|
dpll |= 3;
|
|
- else if (is_lvds && dev_priv->lvds_use_ssc && num_outputs < 2)
|
|
- dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
|
|
+ }
|
|
else
|
|
dpll |= PLL_REF_INPUT_DREFCLK;
|
|
|
|
@@ -953,13 +948,9 @@
|
|
I915_WRITE(dspcntr_reg, dspcntr);
|
|
|
|
/* Flush the plane changes */
|
|
- ret = intel_pipe_set_base(crtc, x, y, old_fb);
|
|
- if (ret != 0)
|
|
- return ret;
|
|
+ intel_pipe_set_base(crtc, x, y, old_fb);
|
|
|
|
drm_vblank_post_modeset(dev, pipe);
|
|
-
|
|
- return 0;
|
|
}
|
|
|
|
/** Loads the palette/gamma unit for the CRTC with the prepared values */
|
|
@@ -1008,7 +999,6 @@
|
|
temp = CURSOR_MODE_DISABLE;
|
|
addr = 0;
|
|
bo = NULL;
|
|
- mutex_lock(&dev->struct_mutex);
|
|
goto finish;
|
|
}
|
|
|
|
@@ -1031,19 +1021,18 @@
|
|
}
|
|
|
|
/* we only need to pin inside GTT if cursor is non-phy */
|
|
- mutex_lock(&dev->struct_mutex);
|
|
if (!dev_priv->cursor_needs_physical) {
|
|
ret = i915_gem_object_pin(bo, PAGE_SIZE);
|
|
if (ret) {
|
|
DRM_ERROR("failed to pin cursor bo\n");
|
|
- goto fail_locked;
|
|
+ goto fail;
|
|
}
|
|
addr = obj_priv->gtt_offset;
|
|
} else {
|
|
ret = i915_gem_attach_phys_object(dev, bo, (pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1);
|
|
if (ret) {
|
|
DRM_ERROR("failed to attach phys object\n");
|
|
- goto fail_locked;
|
|
+ goto fail;
|
|
}
|
|
addr = obj_priv->phys_obj->handle->busaddr;
|
|
}
|
|
@@ -1063,9 +1052,10 @@
|
|
i915_gem_detach_phys_object(dev, intel_crtc->cursor_bo);
|
|
} else
|
|
i915_gem_object_unpin(intel_crtc->cursor_bo);
|
|
+ mutex_lock(&dev->struct_mutex);
|
|
drm_gem_object_unreference(intel_crtc->cursor_bo);
|
|
+ mutex_unlock(&dev->struct_mutex);
|
|
}
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
|
intel_crtc->cursor_addr = addr;
|
|
intel_crtc->cursor_bo = bo;
|
|
@@ -1073,7 +1063,6 @@
|
|
return 0;
|
|
fail:
|
|
mutex_lock(&dev->struct_mutex);
|
|
-fail_locked:
|
|
drm_gem_object_unreference(bo);
|
|
mutex_unlock(&dev->struct_mutex);
|
|
return ret;
|
|
@@ -1301,7 +1290,7 @@
|
|
}
|
|
|
|
/* XXX: Handle the 100Mhz refclk */
|
|
- intel_clock(96000, &clock);
|
|
+ i9xx_clock(96000, &clock);
|
|
} else {
|
|
bool is_lvds = (pipe == 1) && (I915_READ(LVDS) & LVDS_PORT_EN);
|
|
|
|
@@ -1313,9 +1302,9 @@
|
|
if ((dpll & PLL_REF_INPUT_MASK) ==
|
|
PLLB_REF_INPUT_SPREADSPECTRUMIN) {
|
|
/* XXX: might not be 66MHz */
|
|
- intel_clock(66000, &clock);
|
|
+ i8xx_clock(66000, &clock);
|
|
} else
|
|
- intel_clock(48000, &clock);
|
|
+ i8xx_clock(48000, &clock);
|
|
} else {
|
|
if (dpll & PLL_P1_DIVIDE_BY_TWO)
|
|
clock.p1 = 2;
|
|
@@ -1328,7 +1317,7 @@
|
|
else
|
|
clock.p2 = 2;
|
|
|
|
- intel_clock(48000, &clock);
|
|
+ i8xx_clock(48000, &clock);
|
|
}
|
|
}
|
|
|
|
@@ -1463,7 +1452,6 @@
|
|
|
|
static void intel_setup_outputs(struct drm_device *dev)
|
|
{
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_connector *connector;
|
|
|
|
intel_crt_init(dev);
|
|
@@ -1475,16 +1463,13 @@
|
|
if (IS_I9XX(dev)) {
|
|
int found;
|
|
|
|
- if (I915_READ(SDVOB) & SDVO_DETECTED) {
|
|
- found = intel_sdvo_init(dev, SDVOB);
|
|
- if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
|
|
- intel_hdmi_init(dev, SDVOB);
|
|
- }
|
|
- if (!IS_G4X(dev) || (I915_READ(SDVOB) & SDVO_DETECTED)) {
|
|
- found = intel_sdvo_init(dev, SDVOC);
|
|
- if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
|
|
- intel_hdmi_init(dev, SDVOC);
|
|
- }
|
|
+ found = intel_sdvo_init(dev, SDVOB);
|
|
+ if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
|
|
+ intel_hdmi_init(dev, SDVOB);
|
|
+
|
|
+ found = intel_sdvo_init(dev, SDVOC);
|
|
+ if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
|
|
+ intel_hdmi_init(dev, SDVOC);
|
|
} else
|
|
intel_dvo_init(dev);
|
|
|
|
@@ -1607,9 +1592,7 @@
|
|
|
|
ret = intel_framebuffer_create(dev, mode_cmd, &fb, obj);
|
|
if (ret) {
|
|
- mutex_lock(&dev->struct_mutex);
|
|
drm_gem_object_unreference(obj);
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
return NULL;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_drv.h linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_drv.h
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_drv.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_drv.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -82,7 +82,6 @@
|
|
struct intel_i2c_chan *i2c_bus; /* for control functions */
|
|
struct intel_i2c_chan *ddc_bus; /* for DDC only stuff */
|
|
bool load_detect_temp;
|
|
- bool needs_tv_clock;
|
|
void *dev_priv;
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_fb.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_fb.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_fb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_fb.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -473,7 +473,7 @@
|
|
ret = intel_framebuffer_create(dev, &mode_cmd, &fb, fbo);
|
|
if (ret) {
|
|
DRM_ERROR("failed to allocate fb.\n");
|
|
- goto out_unpin;
|
|
+ goto out_unref;
|
|
}
|
|
|
|
list_add(&fb->filp_head, &dev->mode_config.fb_kernel_list);
|
|
@@ -484,7 +484,7 @@
|
|
info = framebuffer_alloc(sizeof(struct intelfb_par), device);
|
|
if (!info) {
|
|
ret = -ENOMEM;
|
|
- goto out_unpin;
|
|
+ goto out_unref;
|
|
}
|
|
|
|
par = info->par;
|
|
@@ -513,7 +513,7 @@
|
|
size);
|
|
if (!info->screen_base) {
|
|
ret = -ENOSPC;
|
|
- goto out_unpin;
|
|
+ goto out_unref;
|
|
}
|
|
info->screen_size = size;
|
|
|
|
@@ -608,8 +608,6 @@
|
|
mutex_unlock(&dev->struct_mutex);
|
|
return 0;
|
|
|
|
-out_unpin:
|
|
- i915_gem_object_unpin(fbo);
|
|
out_unref:
|
|
drm_gem_object_unreference(fbo);
|
|
mutex_unlock(&dev->struct_mutex);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_lvds.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_lvds.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_lvds.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_lvds.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -27,7 +27,6 @@
|
|
* Jesse Barnes <jesse.barnes@intel.com>
|
|
*/
|
|
|
|
-#include <linux/dmi.h>
|
|
#include <linux/i2c.h>
|
|
#include "drmP.h"
|
|
#include "drm.h"
|
|
@@ -312,8 +311,10 @@
|
|
if (dev_priv->panel_fixed_mode != NULL) {
|
|
struct drm_display_mode *mode;
|
|
|
|
+ mutex_unlock(&dev->mode_config.mutex);
|
|
mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode);
|
|
drm_mode_probed_add(connector, mode);
|
|
+ mutex_unlock(&dev->mode_config.mutex);
|
|
|
|
return 1;
|
|
}
|
|
@@ -404,16 +405,6 @@
|
|
u32 lvds;
|
|
int pipe;
|
|
|
|
- /* Blacklist machines that we know falsely report LVDS. */
|
|
- /* FIXME: add a check for the Aopen Mini PC */
|
|
-
|
|
- /* Apple Mac Mini Core Duo and Mac Mini Core 2 Duo */
|
|
- if(dmi_match(DMI_PRODUCT_NAME, "Macmini1,1") ||
|
|
- dmi_match(DMI_PRODUCT_NAME, "Macmini2,1")) {
|
|
- DRM_DEBUG("Skipping LVDS initialization for Apple Mac Mini\n");
|
|
- return;
|
|
- }
|
|
-
|
|
intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL);
|
|
if (!intel_output) {
|
|
return;
|
|
@@ -467,7 +458,7 @@
|
|
dev_priv->panel_fixed_mode =
|
|
drm_mode_duplicate(dev, scan);
|
|
mutex_unlock(&dev->mode_config.mutex);
|
|
- goto out;
|
|
+ goto out; /* FIXME: check for quirks */
|
|
}
|
|
mutex_unlock(&dev->mode_config.mutex);
|
|
}
|
|
@@ -481,6 +472,8 @@
|
|
if (dev_priv->panel_fixed_mode) {
|
|
dev_priv->panel_fixed_mode->type |=
|
|
DRM_MODE_TYPE_PREFERRED;
|
|
+ drm_mode_probed_add(connector,
|
|
+ dev_priv->panel_fixed_mode);
|
|
goto out;
|
|
}
|
|
}
|
|
@@ -499,7 +492,7 @@
|
|
if (dev_priv->panel_fixed_mode) {
|
|
dev_priv->panel_fixed_mode->type |=
|
|
DRM_MODE_TYPE_PREFERRED;
|
|
- goto out;
|
|
+ goto out; /* FIXME: check for quirks */
|
|
}
|
|
}
|
|
|
|
@@ -507,6 +500,38 @@
|
|
if (!dev_priv->panel_fixed_mode)
|
|
goto failed;
|
|
|
|
+ /* FIXME: detect aopen & mac mini type stuff automatically? */
|
|
+ /*
|
|
+ * Blacklist machines with BIOSes that list an LVDS panel without
|
|
+ * actually having one.
|
|
+ */
|
|
+ if (IS_I945GM(dev)) {
|
|
+ /* aopen mini pc */
|
|
+ if (dev->pdev->subsystem_vendor == 0xa0a0)
|
|
+ goto failed;
|
|
+
|
|
+ if ((dev->pdev->subsystem_vendor == 0x8086) &&
|
|
+ (dev->pdev->subsystem_device == 0x7270)) {
|
|
+ /* It's a Mac Mini or Macbook Pro.
|
|
+ *
|
|
+ * Apple hardware is out to get us. The macbook pro
|
|
+ * has a real LVDS panel, but the mac mini does not,
|
|
+ * and they have the same device IDs. We'll
|
|
+ * distinguish by panel size, on the assumption
|
|
+ * that Apple isn't about to make any machines with an
|
|
+ * 800x600 display.
|
|
+ */
|
|
+
|
|
+ if (dev_priv->panel_fixed_mode != NULL &&
|
|
+ dev_priv->panel_fixed_mode->hdisplay == 800 &&
|
|
+ dev_priv->panel_fixed_mode->vdisplay == 600) {
|
|
+ DRM_DEBUG("Suspected Mac Mini, ignoring the LVDS\n");
|
|
+ goto failed;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+
|
|
out:
|
|
drm_sysfs_connector_add(connector);
|
|
return;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_sdvo.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_sdvo.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_sdvo.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_sdvo.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -40,59 +40,13 @@
|
|
struct intel_sdvo_priv {
|
|
struct intel_i2c_chan *i2c_bus;
|
|
int slaveaddr;
|
|
-
|
|
- /* Register for the SDVO device: SDVOB or SDVOC */
|
|
int output_device;
|
|
|
|
- /* Active outputs controlled by this SDVO output */
|
|
- uint16_t controlled_output;
|
|
+ u16 active_outputs;
|
|
|
|
- /*
|
|
- * Capabilities of the SDVO device returned by
|
|
- * i830_sdvo_get_capabilities()
|
|
- */
|
|
struct intel_sdvo_caps caps;
|
|
-
|
|
- /* Pixel clock limitations reported by the SDVO device, in kHz */
|
|
int pixel_clock_min, pixel_clock_max;
|
|
|
|
- /**
|
|
- * This is set if we're going to treat the device as TV-out.
|
|
- *
|
|
- * While we have these nice friendly flags for output types that ought
|
|
- * to decide this for us, the S-Video output on our HDMI+S-Video card
|
|
- * shows up as RGB1 (VGA).
|
|
- */
|
|
- bool is_tv;
|
|
-
|
|
- /**
|
|
- * This is set if we treat the device as HDMI, instead of DVI.
|
|
- */
|
|
- bool is_hdmi;
|
|
-
|
|
- /**
|
|
- * Returned SDTV resolutions allowed for the current format, if the
|
|
- * device reported it.
|
|
- */
|
|
- struct intel_sdvo_sdtv_resolution_reply sdtv_resolutions;
|
|
-
|
|
- /**
|
|
- * Current selected TV format.
|
|
- *
|
|
- * This is stored in the same structure that's passed to the device, for
|
|
- * convenience.
|
|
- */
|
|
- struct intel_sdvo_tv_format tv_format;
|
|
-
|
|
- /*
|
|
- * supported encoding mode, used to determine whether HDMI is
|
|
- * supported
|
|
- */
|
|
- struct intel_sdvo_encode encode;
|
|
-
|
|
- /* DDC bus used by this SDVO output */
|
|
- uint8_t ddc_bus;
|
|
-
|
|
int save_sdvo_mult;
|
|
u16 save_active_outputs;
|
|
struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2;
|
|
@@ -193,9 +147,9 @@
|
|
|
|
#define SDVO_CMD_NAME_ENTRY(cmd) {cmd, #cmd}
|
|
/** Mapping of command numbers to names, for debug output */
|
|
-static const struct _sdvo_cmd_name {
|
|
- u8 cmd;
|
|
- char *name;
|
|
+const static struct _sdvo_cmd_name {
|
|
+ u8 cmd;
|
|
+ char *name;
|
|
} sdvo_cmd_names[] = {
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_RESET),
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_DEVICE_CAPS),
|
|
@@ -232,35 +186,8 @@
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_TV_FORMATS),
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_TV_FORMAT),
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_FORMAT),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_POWER_STATES),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_POWER_STATE),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ENCODER_POWER_STATE),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_DISPLAY_POWER_STATE),
|
|
+ SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_RESOLUTION_SUPPORT),
|
|
SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_CONTROL_BUS_SWITCH),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SCALED_HDTV_RESOLUTION_SUPPORT),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS),
|
|
- /* HDMI op code */
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPP_ENCODE),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ENCODE),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ENCODE),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_PIXEL_REPLI),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_PIXEL_REPLI),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_COLORIMETRY_CAP),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_COLORIMETRY),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_COLORIMETRY),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_AUDIO_ENCRYPT_PREFER),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_AUDIO_STAT),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_AUDIO_STAT),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_INDEX),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_INDEX),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_INFO),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_AV_SPLIT),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_AV_SPLIT),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_TXRATE),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_TXRATE),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_DATA),
|
|
- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA),
|
|
};
|
|
|
|
#define SDVO_NAME(dev_priv) ((dev_priv)->output_device == SDVOB ? "SDVOB" : "SDVOC")
|
|
@@ -579,50 +506,6 @@
|
|
SDVO_CMD_SET_OUTPUT_TIMINGS_PART1, dtd);
|
|
}
|
|
|
|
-static bool
|
|
-intel_sdvo_create_preferred_input_timing(struct intel_output *output,
|
|
- uint16_t clock,
|
|
- uint16_t width,
|
|
- uint16_t height)
|
|
-{
|
|
- struct intel_sdvo_preferred_input_timing_args args;
|
|
- uint8_t status;
|
|
-
|
|
- args.clock = clock;
|
|
- args.width = width;
|
|
- args.height = height;
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING,
|
|
- &args, sizeof(args));
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
- if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
- return false;
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-static bool intel_sdvo_get_preferred_input_timing(struct intel_output *output,
|
|
- struct intel_sdvo_dtd *dtd)
|
|
-{
|
|
- bool status;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1,
|
|
- NULL, 0);
|
|
-
|
|
- status = intel_sdvo_read_response(output, &dtd->part1,
|
|
- sizeof(dtd->part1));
|
|
- if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
- return false;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2,
|
|
- NULL, 0);
|
|
-
|
|
- status = intel_sdvo_read_response(output, &dtd->part2,
|
|
- sizeof(dtd->part2));
|
|
- if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
- return false;
|
|
-
|
|
- return false;
|
|
-}
|
|
|
|
static int intel_sdvo_get_clock_rate_mult(struct intel_output *intel_output)
|
|
{
|
|
@@ -653,12 +536,36 @@
|
|
return true;
|
|
}
|
|
|
|
-static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd,
|
|
- struct drm_display_mode *mode)
|
|
+static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
|
|
+ struct drm_display_mode *mode,
|
|
+ struct drm_display_mode *adjusted_mode)
|
|
{
|
|
- uint16_t width, height;
|
|
- uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len;
|
|
- uint16_t h_sync_offset, v_sync_offset;
|
|
+ /* Make the CRTC code factor in the SDVO pixel multiplier. The SDVO
|
|
+ * device will be told of the multiplier during mode_set.
|
|
+ */
|
|
+ adjusted_mode->clock *= intel_sdvo_get_pixel_multiplier(mode);
|
|
+ return true;
|
|
+}
|
|
+
|
|
+static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
+ struct drm_display_mode *mode,
|
|
+ struct drm_display_mode *adjusted_mode)
|
|
+{
|
|
+ struct drm_device *dev = encoder->dev;
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
+ struct drm_crtc *crtc = encoder->crtc;
|
|
+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
+ struct intel_output *intel_output = enc_to_intel_output(encoder);
|
|
+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
+ u16 width, height;
|
|
+ u16 h_blank_len, h_sync_len, v_blank_len, v_sync_len;
|
|
+ u16 h_sync_offset, v_sync_offset;
|
|
+ u32 sdvox;
|
|
+ struct intel_sdvo_dtd output_dtd;
|
|
+ int sdvo_pixel_multiply;
|
|
+
|
|
+ if (!mode)
|
|
+ return;
|
|
|
|
width = mode->crtc_hdisplay;
|
|
height = mode->crtc_vdisplay;
|
|
@@ -673,423 +580,93 @@
|
|
h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start;
|
|
v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start;
|
|
|
|
- dtd->part1.clock = mode->clock / 10;
|
|
- dtd->part1.h_active = width & 0xff;
|
|
- dtd->part1.h_blank = h_blank_len & 0xff;
|
|
- dtd->part1.h_high = (((width >> 8) & 0xf) << 4) |
|
|
+ output_dtd.part1.clock = mode->clock / 10;
|
|
+ output_dtd.part1.h_active = width & 0xff;
|
|
+ output_dtd.part1.h_blank = h_blank_len & 0xff;
|
|
+ output_dtd.part1.h_high = (((width >> 8) & 0xf) << 4) |
|
|
((h_blank_len >> 8) & 0xf);
|
|
- dtd->part1.v_active = height & 0xff;
|
|
- dtd->part1.v_blank = v_blank_len & 0xff;
|
|
- dtd->part1.v_high = (((height >> 8) & 0xf) << 4) |
|
|
+ output_dtd.part1.v_active = height & 0xff;
|
|
+ output_dtd.part1.v_blank = v_blank_len & 0xff;
|
|
+ output_dtd.part1.v_high = (((height >> 8) & 0xf) << 4) |
|
|
((v_blank_len >> 8) & 0xf);
|
|
|
|
- dtd->part2.h_sync_off = h_sync_offset;
|
|
- dtd->part2.h_sync_width = h_sync_len & 0xff;
|
|
- dtd->part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 |
|
|
+ output_dtd.part2.h_sync_off = h_sync_offset;
|
|
+ output_dtd.part2.h_sync_width = h_sync_len & 0xff;
|
|
+ output_dtd.part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 |
|
|
(v_sync_len & 0xf);
|
|
- dtd->part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) |
|
|
+ output_dtd.part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) |
|
|
((h_sync_len & 0x300) >> 4) | ((v_sync_offset & 0x30) >> 2) |
|
|
((v_sync_len & 0x30) >> 4);
|
|
|
|
- dtd->part2.dtd_flags = 0x18;
|
|
+ output_dtd.part2.dtd_flags = 0x18;
|
|
if (mode->flags & DRM_MODE_FLAG_PHSYNC)
|
|
- dtd->part2.dtd_flags |= 0x2;
|
|
+ output_dtd.part2.dtd_flags |= 0x2;
|
|
if (mode->flags & DRM_MODE_FLAG_PVSYNC)
|
|
- dtd->part2.dtd_flags |= 0x4;
|
|
-
|
|
- dtd->part2.sdvo_flags = 0;
|
|
- dtd->part2.v_sync_off_high = v_sync_offset & 0xc0;
|
|
- dtd->part2.reserved = 0;
|
|
-}
|
|
-
|
|
-static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode,
|
|
- struct intel_sdvo_dtd *dtd)
|
|
-{
|
|
- uint16_t width, height;
|
|
- uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len;
|
|
- uint16_t h_sync_offset, v_sync_offset;
|
|
-
|
|
- width = mode->crtc_hdisplay;
|
|
- height = mode->crtc_vdisplay;
|
|
-
|
|
- /* do some mode translations */
|
|
- h_blank_len = mode->crtc_hblank_end - mode->crtc_hblank_start;
|
|
- h_sync_len = mode->crtc_hsync_end - mode->crtc_hsync_start;
|
|
-
|
|
- v_blank_len = mode->crtc_vblank_end - mode->crtc_vblank_start;
|
|
- v_sync_len = mode->crtc_vsync_end - mode->crtc_vsync_start;
|
|
-
|
|
- h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start;
|
|
- v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start;
|
|
-
|
|
- mode->hdisplay = dtd->part1.h_active;
|
|
- mode->hdisplay += ((dtd->part1.h_high >> 4) & 0x0f) << 8;
|
|
- mode->hsync_start = mode->hdisplay + dtd->part2.h_sync_off;
|
|
- mode->hsync_start += (dtd->part2.sync_off_width_high & 0xa0) << 2;
|
|
- mode->hsync_end = mode->hsync_start + dtd->part2.h_sync_width;
|
|
- mode->hsync_end += (dtd->part2.sync_off_width_high & 0x30) << 4;
|
|
- mode->htotal = mode->hdisplay + dtd->part1.h_blank;
|
|
- mode->htotal += (dtd->part1.h_high & 0xf) << 8;
|
|
-
|
|
- mode->vdisplay = dtd->part1.v_active;
|
|
- mode->vdisplay += ((dtd->part1.v_high >> 4) & 0x0f) << 8;
|
|
- mode->vsync_start = mode->vdisplay;
|
|
- mode->vsync_start += (dtd->part2.v_sync_off_width >> 4) & 0xf;
|
|
- mode->vsync_start += (dtd->part2.sync_off_width_high & 0x0a) << 2;
|
|
- mode->vsync_start += dtd->part2.v_sync_off_high & 0xc0;
|
|
- mode->vsync_end = mode->vsync_start +
|
|
- (dtd->part2.v_sync_off_width & 0xf);
|
|
- mode->vsync_end += (dtd->part2.sync_off_width_high & 0x3) << 4;
|
|
- mode->vtotal = mode->vdisplay + dtd->part1.v_blank;
|
|
- mode->vtotal += (dtd->part1.v_high & 0xf) << 8;
|
|
-
|
|
- mode->clock = dtd->part1.clock * 10;
|
|
-
|
|
- mode->flags &= (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
|
|
- if (dtd->part2.dtd_flags & 0x2)
|
|
- mode->flags |= DRM_MODE_FLAG_PHSYNC;
|
|
- if (dtd->part2.dtd_flags & 0x4)
|
|
- mode->flags |= DRM_MODE_FLAG_PVSYNC;
|
|
-}
|
|
-
|
|
-static bool intel_sdvo_get_supp_encode(struct intel_output *output,
|
|
- struct intel_sdvo_encode *encode)
|
|
-{
|
|
- uint8_t status;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_SUPP_ENCODE, NULL, 0);
|
|
- status = intel_sdvo_read_response(output, encode, sizeof(*encode));
|
|
- if (status != SDVO_CMD_STATUS_SUCCESS) { /* non-support means DVI */
|
|
- memset(encode, 0, sizeof(*encode));
|
|
- return false;
|
|
- }
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-static bool intel_sdvo_set_encode(struct intel_output *output, uint8_t mode)
|
|
-{
|
|
- uint8_t status;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_ENCODE, &mode, 1);
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
-
|
|
- return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
-}
|
|
-
|
|
-static bool intel_sdvo_set_colorimetry(struct intel_output *output,
|
|
- uint8_t mode)
|
|
-{
|
|
- uint8_t status;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_COLORIMETRY, &mode, 1);
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
-
|
|
- return (status == SDVO_CMD_STATUS_SUCCESS);
|
|
-}
|
|
-
|
|
-#if 0
|
|
-static void intel_sdvo_dump_hdmi_buf(struct intel_output *output)
|
|
-{
|
|
- int i, j;
|
|
- uint8_t set_buf_index[2];
|
|
- uint8_t av_split;
|
|
- uint8_t buf_size;
|
|
- uint8_t buf[48];
|
|
- uint8_t *pos;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_AV_SPLIT, NULL, 0);
|
|
- intel_sdvo_read_response(output, &av_split, 1);
|
|
-
|
|
- for (i = 0; i <= av_split; i++) {
|
|
- set_buf_index[0] = i; set_buf_index[1] = 0;
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_INDEX,
|
|
- set_buf_index, 2);
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_INFO, NULL, 0);
|
|
- intel_sdvo_read_response(output, &buf_size, 1);
|
|
-
|
|
- pos = buf;
|
|
- for (j = 0; j <= buf_size; j += 8) {
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_DATA,
|
|
- NULL, 0);
|
|
- intel_sdvo_read_response(output, pos, 8);
|
|
- pos += 8;
|
|
- }
|
|
- }
|
|
-}
|
|
-#endif
|
|
-
|
|
-static void intel_sdvo_set_hdmi_buf(struct intel_output *output, int index,
|
|
- uint8_t *data, int8_t size, uint8_t tx_rate)
|
|
-{
|
|
- uint8_t set_buf_index[2];
|
|
-
|
|
- set_buf_index[0] = index;
|
|
- set_buf_index[1] = 0;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_INDEX, set_buf_index, 2);
|
|
-
|
|
- for (; size > 0; size -= 8) {
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_DATA, data, 8);
|
|
- data += 8;
|
|
- }
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_TXRATE, &tx_rate, 1);
|
|
-}
|
|
-
|
|
-static uint8_t intel_sdvo_calc_hbuf_csum(uint8_t *data, uint8_t size)
|
|
-{
|
|
- uint8_t csum = 0;
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < size; i++)
|
|
- csum += data[i];
|
|
-
|
|
- return 0x100 - csum;
|
|
-}
|
|
-
|
|
-#define DIP_TYPE_AVI 0x82
|
|
-#define DIP_VERSION_AVI 0x2
|
|
-#define DIP_LEN_AVI 13
|
|
-
|
|
-struct dip_infoframe {
|
|
- uint8_t type;
|
|
- uint8_t version;
|
|
- uint8_t len;
|
|
- uint8_t checksum;
|
|
- union {
|
|
- struct {
|
|
- /* Packet Byte #1 */
|
|
- uint8_t S:2;
|
|
- uint8_t B:2;
|
|
- uint8_t A:1;
|
|
- uint8_t Y:2;
|
|
- uint8_t rsvd1:1;
|
|
- /* Packet Byte #2 */
|
|
- uint8_t R:4;
|
|
- uint8_t M:2;
|
|
- uint8_t C:2;
|
|
- /* Packet Byte #3 */
|
|
- uint8_t SC:2;
|
|
- uint8_t Q:2;
|
|
- uint8_t EC:3;
|
|
- uint8_t ITC:1;
|
|
- /* Packet Byte #4 */
|
|
- uint8_t VIC:7;
|
|
- uint8_t rsvd2:1;
|
|
- /* Packet Byte #5 */
|
|
- uint8_t PR:4;
|
|
- uint8_t rsvd3:4;
|
|
- /* Packet Byte #6~13 */
|
|
- uint16_t top_bar_end;
|
|
- uint16_t bottom_bar_start;
|
|
- uint16_t left_bar_end;
|
|
- uint16_t right_bar_start;
|
|
- } avi;
|
|
- struct {
|
|
- /* Packet Byte #1 */
|
|
- uint8_t channel_count:3;
|
|
- uint8_t rsvd1:1;
|
|
- uint8_t coding_type:4;
|
|
- /* Packet Byte #2 */
|
|
- uint8_t sample_size:2; /* SS0, SS1 */
|
|
- uint8_t sample_frequency:3;
|
|
- uint8_t rsvd2:3;
|
|
- /* Packet Byte #3 */
|
|
- uint8_t coding_type_private:5;
|
|
- uint8_t rsvd3:3;
|
|
- /* Packet Byte #4 */
|
|
- uint8_t channel_allocation;
|
|
- /* Packet Byte #5 */
|
|
- uint8_t rsvd4:3;
|
|
- uint8_t level_shift:4;
|
|
- uint8_t downmix_inhibit:1;
|
|
- } audio;
|
|
- uint8_t payload[28];
|
|
- } __attribute__ ((packed)) u;
|
|
-} __attribute__((packed));
|
|
-
|
|
-static void intel_sdvo_set_avi_infoframe(struct intel_output *output,
|
|
- struct drm_display_mode * mode)
|
|
-{
|
|
- struct dip_infoframe avi_if = {
|
|
- .type = DIP_TYPE_AVI,
|
|
- .version = DIP_VERSION_AVI,
|
|
- .len = DIP_LEN_AVI,
|
|
- };
|
|
-
|
|
- avi_if.checksum = intel_sdvo_calc_hbuf_csum((uint8_t *)&avi_if,
|
|
- 4 + avi_if.len);
|
|
- intel_sdvo_set_hdmi_buf(output, 1, (uint8_t *)&avi_if, 4 + avi_if.len,
|
|
- SDVO_HBUF_TX_VSYNC);
|
|
-}
|
|
-
|
|
-static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
|
|
- struct drm_display_mode *mode,
|
|
- struct drm_display_mode *adjusted_mode)
|
|
-{
|
|
- struct intel_output *output = enc_to_intel_output(encoder);
|
|
- struct intel_sdvo_priv *dev_priv = output->dev_priv;
|
|
-
|
|
- if (!dev_priv->is_tv) {
|
|
- /* Make the CRTC code factor in the SDVO pixel multiplier. The
|
|
- * SDVO device will be told of the multiplier during mode_set.
|
|
- */
|
|
- adjusted_mode->clock *= intel_sdvo_get_pixel_multiplier(mode);
|
|
- } else {
|
|
- struct intel_sdvo_dtd output_dtd;
|
|
- bool success;
|
|
-
|
|
- /* We need to construct preferred input timings based on our
|
|
- * output timings. To do that, we have to set the output
|
|
- * timings, even though this isn't really the right place in
|
|
- * the sequence to do it. Oh well.
|
|
- */
|
|
-
|
|
-
|
|
- /* Set output timings */
|
|
- intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
|
|
- intel_sdvo_set_target_output(output,
|
|
- dev_priv->controlled_output);
|
|
- intel_sdvo_set_output_timing(output, &output_dtd);
|
|
-
|
|
- /* Set the input timing to the screen. Assume always input 0. */
|
|
- intel_sdvo_set_target_input(output, true, false);
|
|
-
|
|
-
|
|
- success = intel_sdvo_create_preferred_input_timing(output,
|
|
- mode->clock / 10,
|
|
- mode->hdisplay,
|
|
- mode->vdisplay);
|
|
- if (success) {
|
|
- struct intel_sdvo_dtd input_dtd;
|
|
-
|
|
- intel_sdvo_get_preferred_input_timing(output,
|
|
- &input_dtd);
|
|
- intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
|
|
-
|
|
- } else {
|
|
- return false;
|
|
- }
|
|
- }
|
|
- return true;
|
|
-}
|
|
-
|
|
-static void intel_sdvo_mode_set(struct drm_encoder *encoder,
|
|
- struct drm_display_mode *mode,
|
|
- struct drm_display_mode *adjusted_mode)
|
|
-{
|
|
- struct drm_device *dev = encoder->dev;
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
- struct drm_crtc *crtc = encoder->crtc;
|
|
- struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
- struct intel_output *output = enc_to_intel_output(encoder);
|
|
- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
- u32 sdvox = 0;
|
|
- int sdvo_pixel_multiply;
|
|
- struct intel_sdvo_in_out_map in_out;
|
|
- struct intel_sdvo_dtd input_dtd;
|
|
- u8 status;
|
|
-
|
|
- if (!mode)
|
|
- return;
|
|
-
|
|
- /* First, set the input mapping for the first input to our controlled
|
|
- * output. This is only correct if we're a single-input device, in
|
|
- * which case the first input is the output from the appropriate SDVO
|
|
- * channel on the motherboard. In a two-input device, the first input
|
|
- * will be SDVOB and the second SDVOC.
|
|
- */
|
|
- in_out.in0 = sdvo_priv->controlled_output;
|
|
- in_out.in1 = 0;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_IN_OUT_MAP,
|
|
- &in_out, sizeof(in_out));
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
-
|
|
- if (sdvo_priv->is_hdmi) {
|
|
- intel_sdvo_set_avi_infoframe(output, mode);
|
|
- sdvox |= SDVO_AUDIO_ENABLE;
|
|
- }
|
|
-
|
|
- intel_sdvo_get_dtd_from_mode(&input_dtd, mode);
|
|
+ output_dtd.part2.dtd_flags |= 0x4;
|
|
|
|
- /* If it's a TV, we already set the output timing in mode_fixup.
|
|
- * Otherwise, the output timing is equal to the input timing.
|
|
- */
|
|
- if (!sdvo_priv->is_tv) {
|
|
- /* Set the output timing to the screen */
|
|
- intel_sdvo_set_target_output(output,
|
|
- sdvo_priv->controlled_output);
|
|
- intel_sdvo_set_output_timing(output, &input_dtd);
|
|
- }
|
|
+ output_dtd.part2.sdvo_flags = 0;
|
|
+ output_dtd.part2.v_sync_off_high = v_sync_offset & 0xc0;
|
|
+ output_dtd.part2.reserved = 0;
|
|
+
|
|
+ /* Set the output timing to the screen */
|
|
+ intel_sdvo_set_target_output(intel_output, sdvo_priv->active_outputs);
|
|
+ intel_sdvo_set_output_timing(intel_output, &output_dtd);
|
|
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
- intel_sdvo_set_target_input(output, true, false);
|
|
+ intel_sdvo_set_target_input(intel_output, true, false);
|
|
|
|
- /* We would like to use intel_sdvo_create_preferred_input_timing() to
|
|
+ /* We would like to use i830_sdvo_create_preferred_input_timing() to
|
|
* provide the device with a timing it can support, if it supports that
|
|
* feature. However, presumably we would need to adjust the CRTC to
|
|
* output the preferred timing, and we don't support that currently.
|
|
*/
|
|
-#if 0
|
|
- success = intel_sdvo_create_preferred_input_timing(output, clock,
|
|
- width, height);
|
|
- if (success) {
|
|
- struct intel_sdvo_dtd *input_dtd;
|
|
-
|
|
- intel_sdvo_get_preferred_input_timing(output, &input_dtd);
|
|
- intel_sdvo_set_input_timing(output, &input_dtd);
|
|
- }
|
|
-#else
|
|
- intel_sdvo_set_input_timing(output, &input_dtd);
|
|
-#endif
|
|
+ intel_sdvo_set_input_timing(intel_output, &output_dtd);
|
|
|
|
switch (intel_sdvo_get_pixel_multiplier(mode)) {
|
|
case 1:
|
|
- intel_sdvo_set_clock_rate_mult(output,
|
|
+ intel_sdvo_set_clock_rate_mult(intel_output,
|
|
SDVO_CLOCK_RATE_MULT_1X);
|
|
break;
|
|
case 2:
|
|
- intel_sdvo_set_clock_rate_mult(output,
|
|
+ intel_sdvo_set_clock_rate_mult(intel_output,
|
|
SDVO_CLOCK_RATE_MULT_2X);
|
|
break;
|
|
case 4:
|
|
- intel_sdvo_set_clock_rate_mult(output,
|
|
+ intel_sdvo_set_clock_rate_mult(intel_output,
|
|
SDVO_CLOCK_RATE_MULT_4X);
|
|
break;
|
|
}
|
|
|
|
/* Set the SDVO control regs. */
|
|
- if (IS_I965G(dev)) {
|
|
- sdvox |= SDVO_BORDER_ENABLE |
|
|
- SDVO_VSYNC_ACTIVE_HIGH |
|
|
- SDVO_HSYNC_ACTIVE_HIGH;
|
|
- } else {
|
|
- sdvox |= I915_READ(sdvo_priv->output_device);
|
|
- switch (sdvo_priv->output_device) {
|
|
- case SDVOB:
|
|
- sdvox &= SDVOB_PRESERVE_MASK;
|
|
- break;
|
|
- case SDVOC:
|
|
- sdvox &= SDVOC_PRESERVE_MASK;
|
|
- break;
|
|
- }
|
|
- sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
|
|
- }
|
|
+ if (0/*IS_I965GM(dev)*/) {
|
|
+ sdvox = SDVO_BORDER_ENABLE;
|
|
+ } else {
|
|
+ sdvox = I915_READ(sdvo_priv->output_device);
|
|
+ switch (sdvo_priv->output_device) {
|
|
+ case SDVOB:
|
|
+ sdvox &= SDVOB_PRESERVE_MASK;
|
|
+ break;
|
|
+ case SDVOC:
|
|
+ sdvox &= SDVOC_PRESERVE_MASK;
|
|
+ break;
|
|
+ }
|
|
+ sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
|
|
+ }
|
|
if (intel_crtc->pipe == 1)
|
|
sdvox |= SDVO_PIPE_B_SELECT;
|
|
|
|
sdvo_pixel_multiply = intel_sdvo_get_pixel_multiplier(mode);
|
|
if (IS_I965G(dev)) {
|
|
- /* done in crtc_mode_set as the dpll_md reg must be written early */
|
|
- } else if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) {
|
|
- /* done in crtc_mode_set as it lives inside the dpll register */
|
|
+ /* done in crtc_mode_set as the dpll_md reg must be written
|
|
+ early */
|
|
+ } else if (IS_I945G(dev) || IS_I945GM(dev)) {
|
|
+ /* done in crtc_mode_set as it lives inside the
|
|
+ dpll register */
|
|
} else {
|
|
sdvox |= (sdvo_pixel_multiply - 1) << SDVO_PORT_MULTIPLY_SHIFT;
|
|
}
|
|
|
|
- intel_sdvo_write_sdvox(output, sdvox);
|
|
+ intel_sdvo_write_sdvox(intel_output, sdvox);
|
|
}
|
|
|
|
static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
|
|
@@ -1137,7 +714,7 @@
|
|
|
|
if (0)
|
|
intel_sdvo_set_encoder_power_state(intel_output, mode);
|
|
- intel_sdvo_set_active_outputs(intel_output, sdvo_priv->controlled_output);
|
|
+ intel_sdvo_set_active_outputs(intel_output, sdvo_priv->active_outputs);
|
|
}
|
|
return;
|
|
}
|
|
@@ -1175,9 +752,6 @@
|
|
&sdvo_priv->save_output_dtd[o]);
|
|
}
|
|
}
|
|
- if (sdvo_priv->is_tv) {
|
|
- /* XXX: Save TV format/enhancements. */
|
|
- }
|
|
|
|
sdvo_priv->save_SDVOX = I915_READ(sdvo_priv->output_device);
|
|
}
|
|
@@ -1185,6 +759,7 @@
|
|
static void intel_sdvo_restore(struct drm_connector *connector)
|
|
{
|
|
struct drm_device *dev = connector->dev;
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct intel_output *intel_output = to_intel_output(connector);
|
|
struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
int o;
|
|
@@ -1215,11 +790,7 @@
|
|
|
|
intel_sdvo_set_clock_rate_mult(intel_output, sdvo_priv->save_sdvo_mult);
|
|
|
|
- if (sdvo_priv->is_tv) {
|
|
- /* XXX: Restore TV format/enhancements. */
|
|
- }
|
|
-
|
|
- intel_sdvo_write_sdvox(intel_output, sdvo_priv->save_SDVOX);
|
|
+ I915_WRITE(sdvo_priv->output_device, sdvo_priv->save_SDVOX);
|
|
|
|
if (sdvo_priv->save_SDVOX & SDVO_ENABLE)
|
|
{
|
|
@@ -1345,173 +916,20 @@
|
|
status = intel_sdvo_read_response(intel_output, &response, 2);
|
|
|
|
DRM_DEBUG("SDVO response %d %d\n", response[0], response[1]);
|
|
-
|
|
- if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
- return connector_status_unknown;
|
|
-
|
|
if ((response[0] != 0) || (response[1] != 0))
|
|
return connector_status_connected;
|
|
else
|
|
return connector_status_disconnected;
|
|
}
|
|
|
|
-static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
|
|
+static int intel_sdvo_get_modes(struct drm_connector *connector)
|
|
{
|
|
struct intel_output *intel_output = to_intel_output(connector);
|
|
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
|
|
|
|
/* set the bus switch and get the modes */
|
|
- intel_sdvo_set_control_bus_switch(intel_output, sdvo_priv->ddc_bus);
|
|
+ intel_sdvo_set_control_bus_switch(intel_output, SDVO_CONTROL_BUS_DDC2);
|
|
intel_ddc_get_modes(intel_output);
|
|
|
|
-#if 0
|
|
- struct drm_device *dev = encoder->dev;
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
- /* Mac mini hack. On this device, I get DDC through the analog, which
|
|
- * load-detects as disconnected. I fail to DDC through the SDVO DDC,
|
|
- * but it does load-detect as connected. So, just steal the DDC bits
|
|
- * from analog when we fail at finding it the right way.
|
|
- */
|
|
- crt = xf86_config->output[0];
|
|
- intel_output = crt->driver_private;
|
|
- if (intel_output->type == I830_OUTPUT_ANALOG &&
|
|
- crt->funcs->detect(crt) == XF86OutputStatusDisconnected) {
|
|
- I830I2CInit(pScrn, &intel_output->pDDCBus, GPIOA, "CRTDDC_A");
|
|
- edid_mon = xf86OutputGetEDID(crt, intel_output->pDDCBus);
|
|
- xf86DestroyI2CBusRec(intel_output->pDDCBus, true, true);
|
|
- }
|
|
- if (edid_mon) {
|
|
- xf86OutputSetEDID(output, edid_mon);
|
|
- modes = xf86OutputGetEDIDModes(output);
|
|
- }
|
|
-#endif
|
|
-}
|
|
-
|
|
-/**
|
|
- * This function checks the current TV format, and chooses a default if
|
|
- * it hasn't been set.
|
|
- */
|
|
-static void
|
|
-intel_sdvo_check_tv_format(struct intel_output *output)
|
|
-{
|
|
- struct intel_sdvo_priv *dev_priv = output->dev_priv;
|
|
- struct intel_sdvo_tv_format format, unset;
|
|
- uint8_t status;
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_TV_FORMAT, NULL, 0);
|
|
- status = intel_sdvo_read_response(output, &format, sizeof(format));
|
|
- if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
- return;
|
|
-
|
|
- memset(&unset, 0, sizeof(unset));
|
|
- if (memcmp(&format, &unset, sizeof(format))) {
|
|
- DRM_DEBUG("%s: Choosing default TV format of NTSC-M\n",
|
|
- SDVO_NAME(dev_priv));
|
|
-
|
|
- format.ntsc_m = true;
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_SET_TV_FORMAT, NULL, 0);
|
|
- status = intel_sdvo_read_response(output, NULL, 0);
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * Set of SDVO TV modes.
|
|
- * Note! This is in reply order (see loop in get_tv_modes).
|
|
- * XXX: all 60Hz refresh?
|
|
- */
|
|
-struct drm_display_mode sdvo_tv_modes[] = {
|
|
- { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 5815680, 321, 384, 416,
|
|
- 200, 0, 232, 201, 233, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 6814080, 321, 384, 416,
|
|
- 240, 0, 272, 241, 273, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 9910080, 401, 464, 496,
|
|
- 300, 0, 332, 301, 333, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 16913280, 641, 704, 736,
|
|
- 350, 0, 382, 351, 383, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121280, 641, 704, 736,
|
|
- 400, 0, 432, 401, 433, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121280, 641, 704, 736,
|
|
- 400, 0, 432, 401, 433, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("704x480", DRM_MODE_TYPE_DRIVER, 24624000, 705, 768, 800,
|
|
- 480, 0, 512, 481, 513, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("704x576", DRM_MODE_TYPE_DRIVER, 29232000, 705, 768, 800,
|
|
- 576, 0, 608, 577, 609, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("720x350", DRM_MODE_TYPE_DRIVER, 18751680, 721, 784, 816,
|
|
- 350, 0, 382, 351, 383, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 21199680, 721, 784, 816,
|
|
- 400, 0, 432, 401, 433, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 25116480, 721, 784, 816,
|
|
- 480, 0, 512, 481, 513, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("720x540", DRM_MODE_TYPE_DRIVER, 28054080, 721, 784, 816,
|
|
- 540, 0, 572, 541, 573, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 29816640, 721, 784, 816,
|
|
- 576, 0, 608, 577, 609, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("768x576", DRM_MODE_TYPE_DRIVER, 31570560, 769, 832, 864,
|
|
- 576, 0, 608, 577, 609, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 34030080, 801, 864, 896,
|
|
- 600, 0, 632, 601, 633, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 36581760, 833, 896, 928,
|
|
- 624, 0, 656, 625, 657, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("920x766", DRM_MODE_TYPE_DRIVER, 48707040, 921, 984, 1016,
|
|
- 766, 0, 798, 767, 799, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 53827200, 1025, 1088, 1120,
|
|
- 768, 0, 800, 769, 801, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
- { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 87265920, 1281, 1344, 1376,
|
|
- 1024, 0, 1056, 1025, 1057, 4196112, 0,
|
|
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
|
-};
|
|
-
|
|
-static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
|
|
-{
|
|
- struct intel_output *output = to_intel_output(connector);
|
|
- uint32_t reply = 0;
|
|
- uint8_t status;
|
|
- int i = 0;
|
|
-
|
|
- intel_sdvo_check_tv_format(output);
|
|
-
|
|
- /* Read the list of supported input resolutions for the selected TV
|
|
- * format.
|
|
- */
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT,
|
|
- NULL, 0);
|
|
- status = intel_sdvo_read_response(output, &reply, 3);
|
|
- if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
- return;
|
|
-
|
|
- for (i = 0; i < ARRAY_SIZE(sdvo_tv_modes); i++)
|
|
- if (reply & (1 << i))
|
|
- drm_mode_probed_add(connector, &sdvo_tv_modes[i]);
|
|
-}
|
|
-
|
|
-static int intel_sdvo_get_modes(struct drm_connector *connector)
|
|
-{
|
|
- struct intel_output *output = to_intel_output(connector);
|
|
- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
-
|
|
- if (sdvo_priv->is_tv)
|
|
- intel_sdvo_get_tv_modes(connector);
|
|
- else
|
|
- intel_sdvo_get_ddc_modes(connector);
|
|
-
|
|
if (list_empty(&connector->probed_modes))
|
|
return 0;
|
|
return 1;
|
|
@@ -1560,65 +978,6 @@
|
|
};
|
|
|
|
|
|
-/**
|
|
- * Choose the appropriate DDC bus for control bus switch command for this
|
|
- * SDVO output based on the controlled output.
|
|
- *
|
|
- * DDC bus number assignment is in a priority order of RGB outputs, then TMDS
|
|
- * outputs, then LVDS outputs.
|
|
- */
|
|
-static void
|
|
-intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv)
|
|
-{
|
|
- uint16_t mask = 0;
|
|
- unsigned int num_bits;
|
|
-
|
|
- /* Make a mask of outputs less than or equal to our own priority in the
|
|
- * list.
|
|
- */
|
|
- switch (dev_priv->controlled_output) {
|
|
- case SDVO_OUTPUT_LVDS1:
|
|
- mask |= SDVO_OUTPUT_LVDS1;
|
|
- case SDVO_OUTPUT_LVDS0:
|
|
- mask |= SDVO_OUTPUT_LVDS0;
|
|
- case SDVO_OUTPUT_TMDS1:
|
|
- mask |= SDVO_OUTPUT_TMDS1;
|
|
- case SDVO_OUTPUT_TMDS0:
|
|
- mask |= SDVO_OUTPUT_TMDS0;
|
|
- case SDVO_OUTPUT_RGB1:
|
|
- mask |= SDVO_OUTPUT_RGB1;
|
|
- case SDVO_OUTPUT_RGB0:
|
|
- mask |= SDVO_OUTPUT_RGB0;
|
|
- break;
|
|
- }
|
|
-
|
|
- /* Count bits to find what number we are in the priority list. */
|
|
- mask &= dev_priv->caps.output_flags;
|
|
- num_bits = hweight16(mask);
|
|
- if (num_bits > 3) {
|
|
- /* if more than 3 outputs, default to DDC bus 3 for now */
|
|
- num_bits = 3;
|
|
- }
|
|
-
|
|
- /* Corresponds to SDVO_CONTROL_BUS_DDCx */
|
|
- dev_priv->ddc_bus = 1 << num_bits;
|
|
-}
|
|
-
|
|
-static bool
|
|
-intel_sdvo_get_digital_encoding_mode(struct intel_output *output)
|
|
-{
|
|
- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
|
|
- uint8_t status;
|
|
-
|
|
- intel_sdvo_set_target_output(output, sdvo_priv->controlled_output);
|
|
-
|
|
- intel_sdvo_write_cmd(output, SDVO_CMD_GET_ENCODE, NULL, 0);
|
|
- status = intel_sdvo_read_response(output, &sdvo_priv->is_hdmi, 1);
|
|
- if (status != SDVO_CMD_STATUS_SUCCESS)
|
|
- return false;
|
|
- return true;
|
|
-}
|
|
-
|
|
bool intel_sdvo_init(struct drm_device *dev, int output_device)
|
|
{
|
|
struct drm_connector *connector;
|
|
@@ -1681,76 +1040,45 @@
|
|
|
|
intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps);
|
|
|
|
- if (sdvo_priv->caps.output_flags &
|
|
- (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) {
|
|
- if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0)
|
|
- sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0;
|
|
- else
|
|
- sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1;
|
|
-
|
|
- connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
- encoder_type = DRM_MODE_ENCODER_TMDS;
|
|
- connector_type = DRM_MODE_CONNECTOR_DVID;
|
|
+ memset(&sdvo_priv->active_outputs, 0, sizeof(sdvo_priv->active_outputs));
|
|
|
|
- if (intel_sdvo_get_supp_encode(intel_output,
|
|
- &sdvo_priv->encode) &&
|
|
- intel_sdvo_get_digital_encoding_mode(intel_output) &&
|
|
- sdvo_priv->is_hdmi) {
|
|
- /* enable hdmi encoding mode if supported */
|
|
- intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI);
|
|
- intel_sdvo_set_colorimetry(intel_output,
|
|
- SDVO_COLORIMETRY_RGB256);
|
|
- connector_type = DRM_MODE_CONNECTOR_HDMIA;
|
|
- }
|
|
- }
|
|
- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_SVID0)
|
|
+ /* TODO, CVBS, SVID, YPRPB & SCART outputs. */
|
|
+ if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0)
|
|
{
|
|
- sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0;
|
|
- connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
- encoder_type = DRM_MODE_ENCODER_TVDAC;
|
|
- connector_type = DRM_MODE_CONNECTOR_SVIDEO;
|
|
- sdvo_priv->is_tv = true;
|
|
- intel_output->needs_tv_clock = true;
|
|
- }
|
|
- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0)
|
|
- {
|
|
- sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0;
|
|
+ sdvo_priv->active_outputs = SDVO_OUTPUT_RGB0;
|
|
connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
encoder_type = DRM_MODE_ENCODER_DAC;
|
|
connector_type = DRM_MODE_CONNECTOR_VGA;
|
|
}
|
|
else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB1)
|
|
{
|
|
- sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1;
|
|
+ sdvo_priv->active_outputs = SDVO_OUTPUT_RGB1;
|
|
connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
encoder_type = DRM_MODE_ENCODER_DAC;
|
|
connector_type = DRM_MODE_CONNECTOR_VGA;
|
|
}
|
|
- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS0)
|
|
+ else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0)
|
|
{
|
|
- sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0;
|
|
+ sdvo_priv->active_outputs = SDVO_OUTPUT_TMDS0;
|
|
connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
- encoder_type = DRM_MODE_ENCODER_LVDS;
|
|
- connector_type = DRM_MODE_CONNECTOR_LVDS;
|
|
+ encoder_type = DRM_MODE_ENCODER_TMDS;
|
|
+ connector_type = DRM_MODE_CONNECTOR_DVID;
|
|
}
|
|
- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS1)
|
|
+ else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS1)
|
|
{
|
|
- sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1;
|
|
+ sdvo_priv->active_outputs = SDVO_OUTPUT_TMDS1;
|
|
connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
|
- encoder_type = DRM_MODE_ENCODER_LVDS;
|
|
- connector_type = DRM_MODE_CONNECTOR_LVDS;
|
|
+ encoder_type = DRM_MODE_ENCODER_TMDS;
|
|
+ connector_type = DRM_MODE_CONNECTOR_DVID;
|
|
}
|
|
else
|
|
{
|
|
unsigned char bytes[2];
|
|
|
|
- sdvo_priv->controlled_output = 0;
|
|
memcpy (bytes, &sdvo_priv->caps.output_flags, 2);
|
|
- DRM_DEBUG("%s: Unknown SDVO output type (0x%02x%02x)\n",
|
|
+ DRM_DEBUG("%s: No active RGB or TMDS outputs (0x%02x%02x)\n",
|
|
SDVO_NAME(sdvo_priv),
|
|
bytes[0], bytes[1]);
|
|
- encoder_type = DRM_MODE_ENCODER_NONE;
|
|
- connector_type = DRM_MODE_CONNECTOR_Unknown;
|
|
goto err_i2c;
|
|
}
|
|
|
|
@@ -1761,8 +1089,6 @@
|
|
drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc);
|
|
drm_sysfs_connector_add(connector);
|
|
|
|
- intel_sdvo_select_ddc_bus(sdvo_priv);
|
|
-
|
|
/* Set the input timing to the screen. Assume always input 0. */
|
|
intel_sdvo_set_target_input(intel_output, true, false);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_sdvo_regs.h linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_sdvo_regs.h
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_sdvo_regs.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_sdvo_regs.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -173,9 +173,6 @@
|
|
* Returns two struct intel_sdvo_output_flags structures.
|
|
*/
|
|
#define SDVO_CMD_GET_IN_OUT_MAP 0x06
|
|
-struct intel_sdvo_in_out_map {
|
|
- u16 in0, in1;
|
|
-};
|
|
|
|
/**
|
|
* Sets the current mapping of SDVO inputs to outputs on the device.
|
|
@@ -209,8 +206,7 @@
|
|
struct intel_sdvo_get_interrupt_event_source_response {
|
|
u16 interrupt_status;
|
|
unsigned int ambient_light_interrupt:1;
|
|
- unsigned int hdmi_audio_encrypt_change:1;
|
|
- unsigned int pad:6;
|
|
+ unsigned int pad:7;
|
|
} __attribute__((packed));
|
|
|
|
/**
|
|
@@ -309,411 +305,23 @@
|
|
# define SDVO_CLOCK_RATE_MULT_4X (1 << 3)
|
|
|
|
#define SDVO_CMD_GET_SUPPORTED_TV_FORMATS 0x27
|
|
-/** 5 bytes of bit flags for TV formats shared by all TV format functions */
|
|
-struct intel_sdvo_tv_format {
|
|
- unsigned int ntsc_m:1;
|
|
- unsigned int ntsc_j:1;
|
|
- unsigned int ntsc_443:1;
|
|
- unsigned int pal_b:1;
|
|
- unsigned int pal_d:1;
|
|
- unsigned int pal_g:1;
|
|
- unsigned int pal_h:1;
|
|
- unsigned int pal_i:1;
|
|
-
|
|
- unsigned int pal_m:1;
|
|
- unsigned int pal_n:1;
|
|
- unsigned int pal_nc:1;
|
|
- unsigned int pal_60:1;
|
|
- unsigned int secam_b:1;
|
|
- unsigned int secam_d:1;
|
|
- unsigned int secam_g:1;
|
|
- unsigned int secam_k:1;
|
|
-
|
|
- unsigned int secam_k1:1;
|
|
- unsigned int secam_l:1;
|
|
- unsigned int secam_60:1;
|
|
- unsigned int hdtv_std_smpte_240m_1080i_59:1;
|
|
- unsigned int hdtv_std_smpte_240m_1080i_60:1;
|
|
- unsigned int hdtv_std_smpte_260m_1080i_59:1;
|
|
- unsigned int hdtv_std_smpte_260m_1080i_60:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080i_50:1;
|
|
-
|
|
- unsigned int hdtv_std_smpte_274m_1080i_59:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080i_60:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_23:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_24:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_25:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_29:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_30:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_50:1;
|
|
-
|
|
- unsigned int hdtv_std_smpte_274m_1080p_59:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_60:1;
|
|
- unsigned int hdtv_std_smpte_295m_1080i_50:1;
|
|
- unsigned int hdtv_std_smpte_295m_1080p_50:1;
|
|
- unsigned int hdtv_std_smpte_296m_720p_59:1;
|
|
- unsigned int hdtv_std_smpte_296m_720p_60:1;
|
|
- unsigned int hdtv_std_smpte_296m_720p_50:1;
|
|
- unsigned int hdtv_std_smpte_293m_480p_59:1;
|
|
-
|
|
- unsigned int hdtv_std_smpte_170m_480i_59:1;
|
|
- unsigned int hdtv_std_iturbt601_576i_50:1;
|
|
- unsigned int hdtv_std_iturbt601_576p_50:1;
|
|
- unsigned int hdtv_std_eia_7702a_480i_60:1;
|
|
- unsigned int hdtv_std_eia_7702a_480p_60:1;
|
|
- unsigned int pad:3;
|
|
-} __attribute__((packed));
|
|
|
|
#define SDVO_CMD_GET_TV_FORMAT 0x28
|
|
|
|
#define SDVO_CMD_SET_TV_FORMAT 0x29
|
|
|
|
-/** Returns the resolutiosn that can be used with the given TV format */
|
|
-#define SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT 0x83
|
|
-struct intel_sdvo_sdtv_resolution_request {
|
|
- unsigned int ntsc_m:1;
|
|
- unsigned int ntsc_j:1;
|
|
- unsigned int ntsc_443:1;
|
|
- unsigned int pal_b:1;
|
|
- unsigned int pal_d:1;
|
|
- unsigned int pal_g:1;
|
|
- unsigned int pal_h:1;
|
|
- unsigned int pal_i:1;
|
|
-
|
|
- unsigned int pal_m:1;
|
|
- unsigned int pal_n:1;
|
|
- unsigned int pal_nc:1;
|
|
- unsigned int pal_60:1;
|
|
- unsigned int secam_b:1;
|
|
- unsigned int secam_d:1;
|
|
- unsigned int secam_g:1;
|
|
- unsigned int secam_k:1;
|
|
-
|
|
- unsigned int secam_k1:1;
|
|
- unsigned int secam_l:1;
|
|
- unsigned int secam_60:1;
|
|
- unsigned int pad:5;
|
|
-} __attribute__((packed));
|
|
-
|
|
-struct intel_sdvo_sdtv_resolution_reply {
|
|
- unsigned int res_320x200:1;
|
|
- unsigned int res_320x240:1;
|
|
- unsigned int res_400x300:1;
|
|
- unsigned int res_640x350:1;
|
|
- unsigned int res_640x400:1;
|
|
- unsigned int res_640x480:1;
|
|
- unsigned int res_704x480:1;
|
|
- unsigned int res_704x576:1;
|
|
-
|
|
- unsigned int res_720x350:1;
|
|
- unsigned int res_720x400:1;
|
|
- unsigned int res_720x480:1;
|
|
- unsigned int res_720x540:1;
|
|
- unsigned int res_720x576:1;
|
|
- unsigned int res_768x576:1;
|
|
- unsigned int res_800x600:1;
|
|
- unsigned int res_832x624:1;
|
|
-
|
|
- unsigned int res_920x766:1;
|
|
- unsigned int res_1024x768:1;
|
|
- unsigned int res_1280x1024:1;
|
|
- unsigned int pad:5;
|
|
-} __attribute__((packed));
|
|
-
|
|
-/* Get supported resolution with squire pixel aspect ratio that can be
|
|
- scaled for the requested HDTV format */
|
|
-#define SDVO_CMD_GET_SCALED_HDTV_RESOLUTION_SUPPORT 0x85
|
|
-
|
|
-struct intel_sdvo_hdtv_resolution_request {
|
|
- unsigned int hdtv_std_smpte_240m_1080i_59:1;
|
|
- unsigned int hdtv_std_smpte_240m_1080i_60:1;
|
|
- unsigned int hdtv_std_smpte_260m_1080i_59:1;
|
|
- unsigned int hdtv_std_smpte_260m_1080i_60:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080i_50:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080i_59:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080i_60:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_23:1;
|
|
-
|
|
- unsigned int hdtv_std_smpte_274m_1080p_24:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_25:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_29:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_30:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_50:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_59:1;
|
|
- unsigned int hdtv_std_smpte_274m_1080p_60:1;
|
|
- unsigned int hdtv_std_smpte_295m_1080i_50:1;
|
|
-
|
|
- unsigned int hdtv_std_smpte_295m_1080p_50:1;
|
|
- unsigned int hdtv_std_smpte_296m_720p_59:1;
|
|
- unsigned int hdtv_std_smpte_296m_720p_60:1;
|
|
- unsigned int hdtv_std_smpte_296m_720p_50:1;
|
|
- unsigned int hdtv_std_smpte_293m_480p_59:1;
|
|
- unsigned int hdtv_std_smpte_170m_480i_59:1;
|
|
- unsigned int hdtv_std_iturbt601_576i_50:1;
|
|
- unsigned int hdtv_std_iturbt601_576p_50:1;
|
|
-
|
|
- unsigned int hdtv_std_eia_7702a_480i_60:1;
|
|
- unsigned int hdtv_std_eia_7702a_480p_60:1;
|
|
- unsigned int pad:6;
|
|
-} __attribute__((packed));
|
|
-
|
|
-struct intel_sdvo_hdtv_resolution_reply {
|
|
- unsigned int res_640x480:1;
|
|
- unsigned int res_800x600:1;
|
|
- unsigned int res_1024x768:1;
|
|
- unsigned int res_1280x960:1;
|
|
- unsigned int res_1400x1050:1;
|
|
- unsigned int res_1600x1200:1;
|
|
- unsigned int res_1920x1440:1;
|
|
- unsigned int res_2048x1536:1;
|
|
-
|
|
- unsigned int res_2560x1920:1;
|
|
- unsigned int res_3200x2400:1;
|
|
- unsigned int res_3840x2880:1;
|
|
- unsigned int pad1:5;
|
|
-
|
|
- unsigned int res_848x480:1;
|
|
- unsigned int res_1064x600:1;
|
|
- unsigned int res_1280x720:1;
|
|
- unsigned int res_1360x768:1;
|
|
- unsigned int res_1704x960:1;
|
|
- unsigned int res_1864x1050:1;
|
|
- unsigned int res_1920x1080:1;
|
|
- unsigned int res_2128x1200:1;
|
|
-
|
|
- unsigned int res_2560x1400:1;
|
|
- unsigned int res_2728x1536:1;
|
|
- unsigned int res_3408x1920:1;
|
|
- unsigned int res_4264x2400:1;
|
|
- unsigned int res_5120x2880:1;
|
|
- unsigned int pad2:3;
|
|
-
|
|
- unsigned int res_768x480:1;
|
|
- unsigned int res_960x600:1;
|
|
- unsigned int res_1152x720:1;
|
|
- unsigned int res_1124x768:1;
|
|
- unsigned int res_1536x960:1;
|
|
- unsigned int res_1680x1050:1;
|
|
- unsigned int res_1728x1080:1;
|
|
- unsigned int res_1920x1200:1;
|
|
-
|
|
- unsigned int res_2304x1440:1;
|
|
- unsigned int res_2456x1536:1;
|
|
- unsigned int res_3072x1920:1;
|
|
- unsigned int res_3840x2400:1;
|
|
- unsigned int res_4608x2880:1;
|
|
- unsigned int pad3:3;
|
|
-
|
|
- unsigned int res_1280x1024:1;
|
|
- unsigned int pad4:7;
|
|
-
|
|
- unsigned int res_1280x768:1;
|
|
- unsigned int pad5:7;
|
|
-} __attribute__((packed));
|
|
-
|
|
-/* Get supported power state returns info for encoder and monitor, rely on
|
|
- last SetTargetInput and SetTargetOutput calls */
|
|
#define SDVO_CMD_GET_SUPPORTED_POWER_STATES 0x2a
|
|
-/* Get power state returns info for encoder and monitor, rely on last
|
|
- SetTargetInput and SetTargetOutput calls */
|
|
-#define SDVO_CMD_GET_POWER_STATE 0x2b
|
|
#define SDVO_CMD_GET_ENCODER_POWER_STATE 0x2b
|
|
#define SDVO_CMD_SET_ENCODER_POWER_STATE 0x2c
|
|
# define SDVO_ENCODER_STATE_ON (1 << 0)
|
|
# define SDVO_ENCODER_STATE_STANDBY (1 << 1)
|
|
# define SDVO_ENCODER_STATE_SUSPEND (1 << 2)
|
|
# define SDVO_ENCODER_STATE_OFF (1 << 3)
|
|
-# define SDVO_MONITOR_STATE_ON (1 << 4)
|
|
-# define SDVO_MONITOR_STATE_STANDBY (1 << 5)
|
|
-# define SDVO_MONITOR_STATE_SUSPEND (1 << 6)
|
|
-# define SDVO_MONITOR_STATE_OFF (1 << 7)
|
|
-
|
|
-#define SDVO_CMD_GET_MAX_PANEL_POWER_SEQUENCING 0x2d
|
|
-#define SDVO_CMD_GET_PANEL_POWER_SEQUENCING 0x2e
|
|
-#define SDVO_CMD_SET_PANEL_POWER_SEQUENCING 0x2f
|
|
-/**
|
|
- * The panel power sequencing parameters are in units of milliseconds.
|
|
- * The high fields are bits 8:9 of the 10-bit values.
|
|
- */
|
|
-struct sdvo_panel_power_sequencing {
|
|
- u8 t0;
|
|
- u8 t1;
|
|
- u8 t2;
|
|
- u8 t3;
|
|
- u8 t4;
|
|
-
|
|
- unsigned int t0_high:2;
|
|
- unsigned int t1_high:2;
|
|
- unsigned int t2_high:2;
|
|
- unsigned int t3_high:2;
|
|
-
|
|
- unsigned int t4_high:2;
|
|
- unsigned int pad:6;
|
|
-} __attribute__((packed));
|
|
-
|
|
-#define SDVO_CMD_GET_MAX_BACKLIGHT_LEVEL 0x30
|
|
-struct sdvo_max_backlight_reply {
|
|
- u8 max_value;
|
|
- u8 default_value;
|
|
-} __attribute__((packed));
|
|
-
|
|
-#define SDVO_CMD_GET_BACKLIGHT_LEVEL 0x31
|
|
-#define SDVO_CMD_SET_BACKLIGHT_LEVEL 0x32
|
|
-
|
|
-#define SDVO_CMD_GET_AMBIENT_LIGHT 0x33
|
|
-struct sdvo_get_ambient_light_reply {
|
|
- u16 trip_low;
|
|
- u16 trip_high;
|
|
- u16 value;
|
|
-} __attribute__((packed));
|
|
-#define SDVO_CMD_SET_AMBIENT_LIGHT 0x34
|
|
-struct sdvo_set_ambient_light_reply {
|
|
- u16 trip_low;
|
|
- u16 trip_high;
|
|
- unsigned int enable:1;
|
|
- unsigned int pad:7;
|
|
-} __attribute__((packed));
|
|
-
|
|
-/* Set display power state */
|
|
-#define SDVO_CMD_SET_DISPLAY_POWER_STATE 0x7d
|
|
-# define SDVO_DISPLAY_STATE_ON (1 << 0)
|
|
-# define SDVO_DISPLAY_STATE_STANDBY (1 << 1)
|
|
-# define SDVO_DISPLAY_STATE_SUSPEND (1 << 2)
|
|
-# define SDVO_DISPLAY_STATE_OFF (1 << 3)
|
|
-
|
|
-#define SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS 0x84
|
|
-struct intel_sdvo_enhancements_reply {
|
|
- unsigned int flicker_filter:1;
|
|
- unsigned int flicker_filter_adaptive:1;
|
|
- unsigned int flicker_filter_2d:1;
|
|
- unsigned int saturation:1;
|
|
- unsigned int hue:1;
|
|
- unsigned int brightness:1;
|
|
- unsigned int contrast:1;
|
|
- unsigned int overscan_h:1;
|
|
-
|
|
- unsigned int overscan_v:1;
|
|
- unsigned int position_h:1;
|
|
- unsigned int position_v:1;
|
|
- unsigned int sharpness:1;
|
|
- unsigned int dot_crawl:1;
|
|
- unsigned int dither:1;
|
|
- unsigned int max_tv_chroma_filter:1;
|
|
- unsigned int max_tv_luma_filter:1;
|
|
-} __attribute__((packed));
|
|
-
|
|
-/* Picture enhancement limits below are dependent on the current TV format,
|
|
- * and thus need to be queried and set after it.
|
|
- */
|
|
-#define SDVO_CMD_GET_MAX_FLICKER_FITER 0x4d
|
|
-#define SDVO_CMD_GET_MAX_ADAPTIVE_FLICKER_FITER 0x7b
|
|
-#define SDVO_CMD_GET_MAX_2D_FLICKER_FITER 0x52
|
|
-#define SDVO_CMD_GET_MAX_SATURATION 0x55
|
|
-#define SDVO_CMD_GET_MAX_HUE 0x58
|
|
-#define SDVO_CMD_GET_MAX_BRIGHTNESS 0x5b
|
|
-#define SDVO_CMD_GET_MAX_CONTRAST 0x5e
|
|
-#define SDVO_CMD_GET_MAX_OVERSCAN_H 0x61
|
|
-#define SDVO_CMD_GET_MAX_OVERSCAN_V 0x64
|
|
-#define SDVO_CMD_GET_MAX_POSITION_H 0x67
|
|
-#define SDVO_CMD_GET_MAX_POSITION_V 0x6a
|
|
-#define SDVO_CMD_GET_MAX_SHARPNESS_V 0x6d
|
|
-#define SDVO_CMD_GET_MAX_TV_CHROMA 0x74
|
|
-#define SDVO_CMD_GET_MAX_TV_LUMA 0x77
|
|
-struct intel_sdvo_enhancement_limits_reply {
|
|
- u16 max_value;
|
|
- u16 default_value;
|
|
-} __attribute__((packed));
|
|
|
|
-#define SDVO_CMD_GET_LVDS_PANEL_INFORMATION 0x7f
|
|
-#define SDVO_CMD_SET_LVDS_PANEL_INFORMATION 0x80
|
|
-# define SDVO_LVDS_COLOR_DEPTH_18 (0 << 0)
|
|
-# define SDVO_LVDS_COLOR_DEPTH_24 (1 << 0)
|
|
-# define SDVO_LVDS_CONNECTOR_SPWG (0 << 2)
|
|
-# define SDVO_LVDS_CONNECTOR_OPENLDI (1 << 2)
|
|
-# define SDVO_LVDS_SINGLE_CHANNEL (0 << 4)
|
|
-# define SDVO_LVDS_DUAL_CHANNEL (1 << 4)
|
|
-
|
|
-#define SDVO_CMD_GET_FLICKER_FILTER 0x4e
|
|
-#define SDVO_CMD_SET_FLICKER_FILTER 0x4f
|
|
-#define SDVO_CMD_GET_ADAPTIVE_FLICKER_FITER 0x50
|
|
-#define SDVO_CMD_SET_ADAPTIVE_FLICKER_FITER 0x51
|
|
-#define SDVO_CMD_GET_2D_FLICKER_FITER 0x53
|
|
-#define SDVO_CMD_SET_2D_FLICKER_FITER 0x54
|
|
-#define SDVO_CMD_GET_SATURATION 0x56
|
|
-#define SDVO_CMD_SET_SATURATION 0x57
|
|
-#define SDVO_CMD_GET_HUE 0x59
|
|
-#define SDVO_CMD_SET_HUE 0x5a
|
|
-#define SDVO_CMD_GET_BRIGHTNESS 0x5c
|
|
-#define SDVO_CMD_SET_BRIGHTNESS 0x5d
|
|
-#define SDVO_CMD_GET_CONTRAST 0x5f
|
|
-#define SDVO_CMD_SET_CONTRAST 0x60
|
|
-#define SDVO_CMD_GET_OVERSCAN_H 0x62
|
|
-#define SDVO_CMD_SET_OVERSCAN_H 0x63
|
|
-#define SDVO_CMD_GET_OVERSCAN_V 0x65
|
|
-#define SDVO_CMD_SET_OVERSCAN_V 0x66
|
|
-#define SDVO_CMD_GET_POSITION_H 0x68
|
|
-#define SDVO_CMD_SET_POSITION_H 0x69
|
|
-#define SDVO_CMD_GET_POSITION_V 0x6b
|
|
-#define SDVO_CMD_SET_POSITION_V 0x6c
|
|
-#define SDVO_CMD_GET_SHARPNESS 0x6e
|
|
-#define SDVO_CMD_SET_SHARPNESS 0x6f
|
|
-#define SDVO_CMD_GET_TV_CHROMA 0x75
|
|
-#define SDVO_CMD_SET_TV_CHROMA 0x76
|
|
-#define SDVO_CMD_GET_TV_LUMA 0x78
|
|
-#define SDVO_CMD_SET_TV_LUMA 0x79
|
|
-struct intel_sdvo_enhancements_arg {
|
|
- u16 value;
|
|
-}__attribute__((packed));
|
|
-
|
|
-#define SDVO_CMD_GET_DOT_CRAWL 0x70
|
|
-#define SDVO_CMD_SET_DOT_CRAWL 0x71
|
|
-# define SDVO_DOT_CRAWL_ON (1 << 0)
|
|
-# define SDVO_DOT_CRAWL_DEFAULT_ON (1 << 1)
|
|
-
|
|
-#define SDVO_CMD_GET_DITHER 0x72
|
|
-#define SDVO_CMD_SET_DITHER 0x73
|
|
-# define SDVO_DITHER_ON (1 << 0)
|
|
-# define SDVO_DITHER_DEFAULT_ON (1 << 1)
|
|
+#define SDVO_CMD_SET_TV_RESOLUTION_SUPPORT 0x93
|
|
|
|
#define SDVO_CMD_SET_CONTROL_BUS_SWITCH 0x7a
|
|
-# define SDVO_CONTROL_BUS_PROM (1 << 0)
|
|
-# define SDVO_CONTROL_BUS_DDC1 (1 << 1)
|
|
-# define SDVO_CONTROL_BUS_DDC2 (1 << 2)
|
|
-# define SDVO_CONTROL_BUS_DDC3 (1 << 3)
|
|
-
|
|
-/* HDMI op codes */
|
|
-#define SDVO_CMD_GET_SUPP_ENCODE 0x9d
|
|
-#define SDVO_CMD_GET_ENCODE 0x9e
|
|
-#define SDVO_CMD_SET_ENCODE 0x9f
|
|
- #define SDVO_ENCODE_DVI 0x0
|
|
- #define SDVO_ENCODE_HDMI 0x1
|
|
-#define SDVO_CMD_SET_PIXEL_REPLI 0x8b
|
|
-#define SDVO_CMD_GET_PIXEL_REPLI 0x8c
|
|
-#define SDVO_CMD_GET_COLORIMETRY_CAP 0x8d
|
|
-#define SDVO_CMD_SET_COLORIMETRY 0x8e
|
|
- #define SDVO_COLORIMETRY_RGB256 0x0
|
|
- #define SDVO_COLORIMETRY_RGB220 0x1
|
|
- #define SDVO_COLORIMETRY_YCrCb422 0x3
|
|
- #define SDVO_COLORIMETRY_YCrCb444 0x4
|
|
-#define SDVO_CMD_GET_COLORIMETRY 0x8f
|
|
-#define SDVO_CMD_GET_AUDIO_ENCRYPT_PREFER 0x90
|
|
-#define SDVO_CMD_SET_AUDIO_STAT 0x91
|
|
-#define SDVO_CMD_GET_AUDIO_STAT 0x92
|
|
-#define SDVO_CMD_SET_HBUF_INDEX 0x93
|
|
-#define SDVO_CMD_GET_HBUF_INDEX 0x94
|
|
-#define SDVO_CMD_GET_HBUF_INFO 0x95
|
|
-#define SDVO_CMD_SET_HBUF_AV_SPLIT 0x96
|
|
-#define SDVO_CMD_GET_HBUF_AV_SPLIT 0x97
|
|
-#define SDVO_CMD_SET_HBUF_DATA 0x98
|
|
-#define SDVO_CMD_GET_HBUF_DATA 0x99
|
|
-#define SDVO_CMD_SET_HBUF_TXRATE 0x9a
|
|
-#define SDVO_CMD_GET_HBUF_TXRATE 0x9b
|
|
- #define SDVO_HBUF_TX_DISABLED (0 << 6)
|
|
- #define SDVO_HBUF_TX_ONCE (2 << 6)
|
|
- #define SDVO_HBUF_TX_VSYNC (3 << 6)
|
|
-#define SDVO_CMD_GET_AUDIO_TX_INFO 0x9c
|
|
-
|
|
-struct intel_sdvo_encode{
|
|
- u8 dvi_rev;
|
|
- u8 hdmi_rev;
|
|
-} __attribute__ ((packed));
|
|
+# define SDVO_CONTROL_BUS_PROM 0x0
|
|
+# define SDVO_CONTROL_BUS_DDC1 0x1
|
|
+# define SDVO_CONTROL_BUS_DDC2 0x2
|
|
+# define SDVO_CONTROL_BUS_DDC3 0x3
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_tv.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_tv.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_tv.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_tv.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -411,7 +411,7 @@
|
|
* These values account for -1s required.
|
|
*/
|
|
|
|
-static const struct tv_mode tv_modes[] = {
|
|
+const static struct tv_mode tv_modes[] = {
|
|
{
|
|
.name = "NTSC-M",
|
|
.clock = 107520,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/Kconfig linux-2.6.29-rc3.owrt/drivers/gpu/drm/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -70,7 +70,7 @@
|
|
select FB_CFB_FILLRECT
|
|
select FB_CFB_COPYAREA
|
|
select FB_CFB_IMAGEBLIT
|
|
- select FB
|
|
+ depends on FB
|
|
tristate "i915 driver"
|
|
help
|
|
Choose this option if you have a system that has Intel 830M, 845G,
|
|
@@ -80,17 +80,18 @@
|
|
XFree86 4.4 and above. If unsure, build this and i830 as modules and
|
|
the X server will load the correct one.
|
|
|
|
+endchoice
|
|
+
|
|
config DRM_I915_KMS
|
|
bool "Enable modesetting on intel by default"
|
|
depends on DRM_I915
|
|
help
|
|
- Choose this option if you want kernel modesetting enabled by default,
|
|
- and you have a new enough userspace to support this. Running old
|
|
- userspaces with this enabled will cause pain. Note that this causes
|
|
- the driver to bind to PCI devices, which precludes loading things
|
|
- like intelfb.
|
|
+ Choose this option if you want kernel modesetting enabled by default,
|
|
+ and you have a new enough userspace to support this. Running old
|
|
+ userspaces with this enabled will cause pain. Note that this causes
|
|
+ the driver to bind to PCI devices, which precludes loading things
|
|
+ like intelfb.
|
|
|
|
-endchoice
|
|
|
|
config DRM_MGA
|
|
tristate "Matrox g200/g400"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/gpu/drm/radeon/radeon_cp.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/radeon/radeon_cp.c
|
|
--- linux-2.6.29.owrt/drivers/gpu/drm/radeon/radeon_cp.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/radeon/radeon_cp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -557,10 +557,8 @@
|
|
}
|
|
|
|
static void radeon_cp_init_ring_buffer(struct drm_device * dev,
|
|
- drm_radeon_private_t *dev_priv,
|
|
- struct drm_file *file_priv)
|
|
+ drm_radeon_private_t * dev_priv)
|
|
{
|
|
- struct drm_radeon_master_private *master_priv;
|
|
u32 ring_start, cur_read_ptr;
|
|
u32 tmp;
|
|
|
|
@@ -679,14 +677,6 @@
|
|
dev_priv->scratch[2] = 0;
|
|
RADEON_WRITE(RADEON_LAST_CLEAR_REG, 0);
|
|
|
|
- /* reset sarea copies of these */
|
|
- master_priv = file_priv->master->driver_priv;
|
|
- if (master_priv->sarea_priv) {
|
|
- master_priv->sarea_priv->last_frame = 0;
|
|
- master_priv->sarea_priv->last_dispatch = 0;
|
|
- master_priv->sarea_priv->last_clear = 0;
|
|
- }
|
|
-
|
|
radeon_do_wait_for_idle(dev_priv);
|
|
|
|
/* Sync everything up */
|
|
@@ -1049,9 +1039,9 @@
|
|
|
|
#if __OS_HAS_AGP
|
|
if (dev_priv->flags & RADEON_IS_AGP) {
|
|
- drm_core_ioremap_wc(dev_priv->cp_ring, dev);
|
|
- drm_core_ioremap_wc(dev_priv->ring_rptr, dev);
|
|
- drm_core_ioremap_wc(dev->agp_buffer_map, dev);
|
|
+ drm_core_ioremap(dev_priv->cp_ring, dev);
|
|
+ drm_core_ioremap(dev_priv->ring_rptr, dev);
|
|
+ drm_core_ioremap(dev->agp_buffer_map, dev);
|
|
if (!dev_priv->cp_ring->handle ||
|
|
!dev_priv->ring_rptr->handle ||
|
|
!dev->agp_buffer_map->handle) {
|
|
@@ -1225,7 +1215,7 @@
|
|
}
|
|
|
|
radeon_cp_load_microcode(dev_priv);
|
|
- radeon_cp_init_ring_buffer(dev, dev_priv, file_priv);
|
|
+ radeon_cp_init_ring_buffer(dev, dev_priv);
|
|
|
|
dev_priv->last_buf = 0;
|
|
|
|
@@ -1291,7 +1281,7 @@
|
|
*
|
|
* Charl P. Botha <http://cpbotha.net>
|
|
*/
|
|
-static int radeon_do_resume_cp(struct drm_device *dev, struct drm_file *file_priv)
|
|
+static int radeon_do_resume_cp(struct drm_device * dev)
|
|
{
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
|
@@ -1314,7 +1304,7 @@
|
|
}
|
|
|
|
radeon_cp_load_microcode(dev_priv);
|
|
- radeon_cp_init_ring_buffer(dev, dev_priv, file_priv);
|
|
+ radeon_cp_init_ring_buffer(dev, dev_priv);
|
|
|
|
radeon_do_engine_reset(dev);
|
|
radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1);
|
|
@@ -1489,7 +1479,8 @@
|
|
*/
|
|
int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
{
|
|
- return radeon_do_resume_cp(dev, file_priv);
|
|
+
|
|
+ return radeon_do_resume_cp(dev);
|
|
}
|
|
|
|
int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hid/hid-core.c linux-2.6.29-rc3.owrt/drivers/hid/hid-core.c
|
|
--- linux-2.6.29.owrt/drivers/hid/hid-core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hid/hid-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1218,7 +1218,6 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(hid_connect);
|
|
|
|
-/* a list of devices for which there is a specialized driver on HID bus */
|
|
static const struct hid_device_id hid_blacklist[] = {
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
|
@@ -1300,13 +1299,7 @@
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
|
|
|
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) },
|
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
|
|
@@ -1483,7 +1476,6 @@
|
|
.uevent = hid_uevent,
|
|
};
|
|
|
|
-/* a list of devices that shouldn't be handled by HID core at all */
|
|
static const struct hid_device_id hid_ignore_list[] = {
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302) },
|
|
@@ -1611,14 +1603,15 @@
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0002) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0003) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0004) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD2) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD3) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD4) },
|
|
- { HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD5) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_TENX, USB_DEVICE_ID_TENX_IBUDDY1) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_TENX, USB_DEVICE_ID_TENX_IBUDDY2) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
|
|
@@ -1629,6 +1622,8 @@
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
|
|
{ }
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hid/hid-ids.h linux-2.6.29-rc3.owrt/drivers/hid/hid-ids.h
|
|
--- linux-2.6.29.owrt/drivers/hid/hid-ids.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hid/hid-ids.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -348,9 +348,6 @@
|
|
#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43
|
|
#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003
|
|
|
|
-#define USB_VENDOR_ID_POWERCOM 0x0d9f
|
|
-#define USB_DEVICE_ID_POWERCOM_UPS 0x0002
|
|
-
|
|
#define USB_VENDOR_ID_SAITEK 0x06a3
|
|
#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
|
|
|
|
@@ -365,8 +362,6 @@
|
|
#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD 0x0038
|
|
#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD2 0x0036
|
|
#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD3 0x0034
|
|
-#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD4 0x0044
|
|
-#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD5 0x0045
|
|
|
|
#define USB_VENDOR_ID_SUN 0x0430
|
|
#define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hid/hid-microsoft.c linux-2.6.29-rc3.owrt/drivers/hid/hid-microsoft.c
|
|
--- linux-2.6.29.owrt/drivers/hid/hid-microsoft.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hid/hid-microsoft.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,7 +30,7 @@
|
|
#define MS_NOGET 0x10
|
|
|
|
/*
|
|
- * Microsoft Wireless Desktop Receiver (Model 1028) has
|
|
+ * Microsoft Wireless Desktop Receiver (Model 1028) has several
|
|
* 'Usage Min/Max' where it ought to have 'Physical Min/Max'
|
|
*/
|
|
static void ms_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
|
@@ -38,12 +38,17 @@
|
|
{
|
|
unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
|
|
|
|
- if ((quirks & MS_RDESC) && rsize == 571 && rdesc[557] == 0x19 &&
|
|
+ if ((quirks & MS_RDESC) && rsize == 571 && rdesc[284] == 0x19 &&
|
|
+ rdesc[286] == 0x2a && rdesc[304] == 0x19 &&
|
|
+ rdesc[306] == 0x29 && rdesc[352] == 0x1a &&
|
|
+ rdesc[355] == 0x2a && rdesc[557] == 0x19 &&
|
|
rdesc[559] == 0x29) {
|
|
dev_info(&hdev->dev, "fixing up Microsoft Wireless Receiver "
|
|
"Model 1028 report descriptor\n");
|
|
- rdesc[557] = 0x35;
|
|
- rdesc[559] = 0x45;
|
|
+ rdesc[284] = rdesc[304] = rdesc[557] = 0x35;
|
|
+ rdesc[352] = 0x36;
|
|
+ rdesc[286] = rdesc[355] = 0x46;
|
|
+ rdesc[306] = rdesc[559] = 0x45;
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hid/hidraw.c linux-2.6.29-rc3.owrt/drivers/hid/hidraw.c
|
|
--- linux-2.6.29.owrt/drivers/hid/hidraw.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hid/hidraw.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -267,10 +267,8 @@
|
|
default:
|
|
{
|
|
struct hid_device *hid = dev->hid;
|
|
- if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ) {
|
|
- ret = -EINVAL;
|
|
- break;
|
|
- }
|
|
+ if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ)
|
|
+ return -EINVAL;
|
|
|
|
if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) {
|
|
int len;
|
|
@@ -279,9 +277,8 @@
|
|
len = strlen(hid->name) + 1;
|
|
if (len > _IOC_SIZE(cmd))
|
|
len = _IOC_SIZE(cmd);
|
|
- ret = copy_to_user(user_arg, hid->name, len) ?
|
|
+ return copy_to_user(user_arg, hid->name, len) ?
|
|
-EFAULT : len;
|
|
- break;
|
|
}
|
|
|
|
if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) {
|
|
@@ -291,13 +288,12 @@
|
|
len = strlen(hid->phys) + 1;
|
|
if (len > _IOC_SIZE(cmd))
|
|
len = _IOC_SIZE(cmd);
|
|
- ret = copy_to_user(user_arg, hid->phys, len) ?
|
|
+ return copy_to_user(user_arg, hid->phys, len) ?
|
|
-EFAULT : len;
|
|
- break;
|
|
}
|
|
}
|
|
|
|
- ret = -ENOTTY;
|
|
+ ret = -ENOTTY;
|
|
}
|
|
unlock_kernel();
|
|
return ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hid/usbhid/hiddev.c linux-2.6.29-rc3.owrt/drivers/hid/usbhid/hiddev.c
|
|
--- linux-2.6.29.owrt/drivers/hid/usbhid/hiddev.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hid/usbhid/hiddev.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -306,7 +306,7 @@
|
|
return 0;
|
|
bail:
|
|
file->private_data = NULL;
|
|
- kfree(list);
|
|
+ kfree(list->hiddev);
|
|
return res;
|
|
}
|
|
|
|
@@ -323,7 +323,7 @@
|
|
*/
|
|
static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t count, loff_t *ppos)
|
|
{
|
|
- DEFINE_WAIT(wait);
|
|
+ DECLARE_WAITQUEUE(wait, current);
|
|
struct hiddev_list *list = file->private_data;
|
|
int event_size;
|
|
int retval;
|
|
@@ -656,7 +656,7 @@
|
|
|
|
case HIDIOCGSTRING:
|
|
mutex_lock(&hiddev->existancelock);
|
|
- if (hiddev->exist)
|
|
+ if (!hiddev->exist)
|
|
r = hiddev_ioctl_string(hiddev, cmd, user_arg);
|
|
else
|
|
r = -ENODEV;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/abituguru3.c linux-2.6.29-rc3.owrt/drivers/hwmon/abituguru3.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/abituguru3.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/abituguru3.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -760,11 +760,8 @@
|
|
|
|
for (i = 0; i < offset_count; i++)
|
|
if ((x = abituguru3_read(data, bank, offset + i, count,
|
|
- buf + i * count)) != count) {
|
|
- if (x < 0)
|
|
- return x;
|
|
- return i * count + x;
|
|
- }
|
|
+ buf + i * count)) != count)
|
|
+ return i * count + (i && (x < 0)) ? 0 : x;
|
|
|
|
return i * count;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/applesmc.c linux-2.6.29-rc3.owrt/drivers/hwmon/applesmc.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/applesmc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/applesmc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -83,7 +83,7 @@
|
|
/*
|
|
* Temperature sensors keys (sp78 - 2 bytes).
|
|
*/
|
|
-static const char *temperature_sensors_sets[][41] = {
|
|
+static const char* temperature_sensors_sets[][36] = {
|
|
/* Set 0: Macbook Pro */
|
|
{ "TA0P", "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "Th0H",
|
|
"Th1H", "Tm0P", "Ts0P", "Ts1P", NULL },
|
|
@@ -135,13 +135,6 @@
|
|
{ "TB0T", "TB1S", "TB1T", "TB2S", "TB2T", "TC0D", "TN0D", "TTF0",
|
|
"TV0P", "TVFP", "TW0P", "Th0P", "Tp0P", "Tp1P", "TpFP", "Ts0P",
|
|
"Ts0S", NULL },
|
|
-/* Set 16: Mac Pro 3,1 (2 x Quad-Core) */
|
|
- { "TA0P", "TCAG", "TCAH", "TCBG", "TCBH", "TC0C", "TC0D", "TC0P",
|
|
- "TC1C", "TC1D", "TC2C", "TC2D", "TC3C", "TC3D", "TH0P", "TH1P",
|
|
- "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", "TM1P",
|
|
- "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", "TM9S",
|
|
- "TN0C", "TN0D", "TN0H", "TS0C", "Tp0C", "Tp1C", "Tv0S", "Tv1S",
|
|
- NULL },
|
|
};
|
|
|
|
/* List of keys used to read/write fan speeds */
|
|
@@ -1160,16 +1153,6 @@
|
|
applesmc_show_temperature, NULL, 33);
|
|
static SENSOR_DEVICE_ATTR(temp35_input, S_IRUGO,
|
|
applesmc_show_temperature, NULL, 34);
|
|
-static SENSOR_DEVICE_ATTR(temp36_input, S_IRUGO,
|
|
- applesmc_show_temperature, NULL, 35);
|
|
-static SENSOR_DEVICE_ATTR(temp37_input, S_IRUGO,
|
|
- applesmc_show_temperature, NULL, 36);
|
|
-static SENSOR_DEVICE_ATTR(temp38_input, S_IRUGO,
|
|
- applesmc_show_temperature, NULL, 37);
|
|
-static SENSOR_DEVICE_ATTR(temp39_input, S_IRUGO,
|
|
- applesmc_show_temperature, NULL, 38);
|
|
-static SENSOR_DEVICE_ATTR(temp40_input, S_IRUGO,
|
|
- applesmc_show_temperature, NULL, 39);
|
|
|
|
static struct attribute *temperature_attributes[] = {
|
|
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
|
@@ -1207,11 +1190,6 @@
|
|
&sensor_dev_attr_temp33_input.dev_attr.attr,
|
|
&sensor_dev_attr_temp34_input.dev_attr.attr,
|
|
&sensor_dev_attr_temp35_input.dev_attr.attr,
|
|
- &sensor_dev_attr_temp36_input.dev_attr.attr,
|
|
- &sensor_dev_attr_temp37_input.dev_attr.attr,
|
|
- &sensor_dev_attr_temp38_input.dev_attr.attr,
|
|
- &sensor_dev_attr_temp39_input.dev_attr.attr,
|
|
- &sensor_dev_attr_temp40_input.dev_attr.attr,
|
|
NULL
|
|
};
|
|
|
|
@@ -1334,8 +1312,6 @@
|
|
{ .accelerometer = 0, .light = 0, .temperature_set = 14 },
|
|
/* MacBook Air 2,1: accelerometer, backlight and temperature set 15 */
|
|
{ .accelerometer = 1, .light = 1, .temperature_set = 15 },
|
|
-/* MacPro3,1: temperature set 16 */
|
|
- { .accelerometer = 0, .light = 0, .temperature_set = 16 },
|
|
};
|
|
|
|
/* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
|
|
@@ -1393,10 +1369,6 @@
|
|
DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
|
|
&applesmc_dmi_data[4]},
|
|
- { applesmc_dmi_match, "Apple MacPro3", {
|
|
- DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
|
- DMI_MATCH(DMI_PRODUCT_NAME, "MacPro3") },
|
|
- &applesmc_dmi_data[16]},
|
|
{ applesmc_dmi_match, "Apple MacPro", {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/f71882fg.c linux-2.6.29-rc3.owrt/drivers/hwmon/f71882fg.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/f71882fg.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/f71882fg.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1872,7 +1872,7 @@
|
|
|
|
devid = superio_inw(sioaddr, SIO_REG_MANID);
|
|
if (devid != SIO_FINTEK_ID) {
|
|
- pr_debug(DRVNAME ": Not a Fintek device\n");
|
|
+ printk(KERN_INFO DRVNAME ": Not a Fintek device\n");
|
|
goto exit;
|
|
}
|
|
|
|
@@ -1932,7 +1932,7 @@
|
|
res.name = f71882fg_pdev->name;
|
|
err = acpi_check_resource_conflict(&res);
|
|
if (err)
|
|
- goto exit_device_put;
|
|
+ return err;
|
|
|
|
err = platform_device_add_resources(f71882fg_pdev, &res, 1);
|
|
if (err) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/f75375s.c linux-2.6.29-rc3.owrt/drivers/hwmon/f75375s.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/f75375s.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/f75375s.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -617,7 +617,7 @@
|
|
static int f75375_probe(struct i2c_client *client,
|
|
const struct i2c_device_id *id)
|
|
{
|
|
- struct f75375_data *data;
|
|
+ struct f75375_data *data = i2c_get_clientdata(client);
|
|
struct f75375s_platform_data *f75375s_pdata = client->dev.platform_data;
|
|
int err;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/hp_accel.c linux-2.6.29-rc3.owrt/drivers/hwmon/hp_accel.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/hp_accel.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/hp_accel.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -153,10 +153,7 @@
|
|
static struct axis_conversion lis3lv02d_axis_x_inverted = {-1, 2, 3};
|
|
static struct axis_conversion lis3lv02d_axis_z_inverted = {1, 2, -3};
|
|
static struct axis_conversion lis3lv02d_axis_xy_rotated_left = {-2, 1, 3};
|
|
-static struct axis_conversion lis3lv02d_axis_xy_rotated_left_usd = {-2, 1, -3};
|
|
static struct axis_conversion lis3lv02d_axis_xy_swap_inverted = {-2, -1, 3};
|
|
-static struct axis_conversion lis3lv02d_axis_xy_rotated_right = {2, -1, 3};
|
|
-static struct axis_conversion lis3lv02d_axis_xy_swap_yz_inverted = {2, -1, -3};
|
|
|
|
#define AXIS_DMI_MATCH(_ident, _name, _axis) { \
|
|
.ident = _ident, \
|
|
@@ -166,18 +163,6 @@
|
|
}, \
|
|
.driver_data = &lis3lv02d_axis_##_axis \
|
|
}
|
|
-
|
|
-#define AXIS_DMI_MATCH2(_ident, _class1, _name1, \
|
|
- _class2, _name2, \
|
|
- _axis) { \
|
|
- .ident = _ident, \
|
|
- .callback = lis3lv02d_dmi_matched, \
|
|
- .matches = { \
|
|
- DMI_MATCH(DMI_##_class1, _name1), \
|
|
- DMI_MATCH(DMI_##_class2, _name2), \
|
|
- }, \
|
|
- .driver_data = &lis3lv02d_axis_##_axis \
|
|
-}
|
|
static struct dmi_system_id lis3lv02d_dmi_ids[] = {
|
|
/* product names are truncated to match all kinds of a same model */
|
|
AXIS_DMI_MATCH("NC64x0", "HP Compaq nc64", x_inverted),
|
|
@@ -187,22 +172,10 @@
|
|
AXIS_DMI_MATCH("NC2510", "HP Compaq 2510", y_inverted),
|
|
AXIS_DMI_MATCH("NC8510", "HP Compaq 8510", xy_swap_inverted),
|
|
AXIS_DMI_MATCH("HP2133", "HP 2133", xy_rotated_left),
|
|
- AXIS_DMI_MATCH("NC653x", "HP Compaq 653", xy_rotated_left_usd),
|
|
- AXIS_DMI_MATCH("NC673x", "HP Compaq 673", xy_rotated_left_usd),
|
|
- AXIS_DMI_MATCH("NC651xx", "HP Compaq 651", xy_rotated_right),
|
|
- AXIS_DMI_MATCH("NC671xx", "HP Compaq 671", xy_swap_yz_inverted),
|
|
- /* Intel-based HP Pavilion dv5 */
|
|
- AXIS_DMI_MATCH2("HPDV5_I",
|
|
- PRODUCT_NAME, "HP Pavilion dv5",
|
|
- BOARD_NAME, "3603",
|
|
- x_inverted),
|
|
- /* AMD-based HP Pavilion dv5 */
|
|
- AXIS_DMI_MATCH2("HPDV5_A",
|
|
- PRODUCT_NAME, "HP Pavilion dv5",
|
|
- BOARD_NAME, "3600",
|
|
- y_inverted),
|
|
{ NULL, }
|
|
/* Laptop models without axis info (yet):
|
|
+ * "NC651xx" "HP Compaq 651"
|
|
+ * "NC671xx" "HP Compaq 671"
|
|
* "NC6910" "HP Compaq 6910"
|
|
* HP Compaq 8710x Notebook PC / Mobile Workstation
|
|
* "NC2400" "HP Compaq nc2400"
|
|
@@ -235,49 +208,9 @@
|
|
.set_brightness = hpled_set,
|
|
};
|
|
|
|
-static acpi_status
|
|
-lis3lv02d_get_resource(struct acpi_resource *resource, void *context)
|
|
-{
|
|
- if (resource->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ) {
|
|
- struct acpi_resource_extended_irq *irq;
|
|
- u32 *device_irq = context;
|
|
-
|
|
- irq = &resource->data.extended_irq;
|
|
- *device_irq = irq->interrupts[0];
|
|
- }
|
|
-
|
|
- return AE_OK;
|
|
-}
|
|
-
|
|
-static void lis3lv02d_enum_resources(struct acpi_device *device)
|
|
-{
|
|
- acpi_status status;
|
|
-
|
|
- status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
|
|
- lis3lv02d_get_resource, &adev.irq);
|
|
- if (ACPI_FAILURE(status))
|
|
- printk(KERN_DEBUG DRIVER_NAME ": Error getting resources\n");
|
|
-}
|
|
-
|
|
-static s16 lis3lv02d_read_16(acpi_handle handle, int reg)
|
|
-{
|
|
- u8 lo, hi;
|
|
-
|
|
- adev.read(handle, reg - 1, &lo);
|
|
- adev.read(handle, reg, &hi);
|
|
- /* In "12 bit right justified" mode, bit 6, bit 7, bit 8 = bit 5 */
|
|
- return (s16)((hi << 8) | lo);
|
|
-}
|
|
-
|
|
-static s16 lis3lv02d_read_8(acpi_handle handle, int reg)
|
|
-{
|
|
- s8 lo;
|
|
- adev.read(handle, reg, &lo);
|
|
- return lo;
|
|
-}
|
|
-
|
|
static int lis3lv02d_add(struct acpi_device *device)
|
|
{
|
|
+ u8 val;
|
|
int ret;
|
|
|
|
if (!device)
|
|
@@ -291,22 +224,10 @@
|
|
strcpy(acpi_device_class(device), ACPI_MDPS_CLASS);
|
|
device->driver_data = &adev;
|
|
|
|
- lis3lv02d_acpi_read(device->handle, WHO_AM_I, &adev.whoami);
|
|
- switch (adev.whoami) {
|
|
- case LIS_DOUBLE_ID:
|
|
- printk(KERN_INFO DRIVER_NAME ": 2-byte sensor found\n");
|
|
- adev.read_data = lis3lv02d_read_16;
|
|
- adev.mdps_max_val = 2048;
|
|
- break;
|
|
- case LIS_SINGLE_ID:
|
|
- printk(KERN_INFO DRIVER_NAME ": 1-byte sensor found\n");
|
|
- adev.read_data = lis3lv02d_read_8;
|
|
- adev.mdps_max_val = 128;
|
|
- break;
|
|
- default:
|
|
+ lis3lv02d_acpi_read(device->handle, WHO_AM_I, &val);
|
|
+ if ((val != LIS3LV02DL_ID) && (val != LIS302DL_ID)) {
|
|
printk(KERN_ERR DRIVER_NAME
|
|
- ": unknown sensor type 0x%X\n", adev.whoami);
|
|
- return -EINVAL;
|
|
+ ": Accelerometer chip not LIS3LV02D{L,Q}\n");
|
|
}
|
|
|
|
/* If possible use a "standard" axes order */
|
|
@@ -321,9 +242,6 @@
|
|
if (ret)
|
|
return ret;
|
|
|
|
- /* obtain IRQ number of our device from ACPI */
|
|
- lis3lv02d_enum_resources(adev.device);
|
|
-
|
|
ret = lis3lv02d_init_device(&adev);
|
|
if (ret) {
|
|
flush_work(&hpled_led.work);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/it87.c linux-2.6.29-rc3.owrt/drivers/hwmon/it87.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/it87.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/it87.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -213,7 +213,7 @@
|
|
|
|
#define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-500)/1000):\
|
|
((val)+500)/1000),-128,127))
|
|
-#define TEMP_FROM_REG(val) ((val) * 1000)
|
|
+#define TEMP_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*1000)
|
|
|
|
#define PWM_TO_REG(val) ((val) >> 1)
|
|
#define PWM_FROM_REG(val) (((val)&0x7f) << 1)
|
|
@@ -267,9 +267,9 @@
|
|
u8 has_fan; /* Bitfield, fans enabled */
|
|
u16 fan[5]; /* Register values, possibly combined */
|
|
u16 fan_min[5]; /* Register values, possibly combined */
|
|
- s8 temp[3]; /* Register value */
|
|
- s8 temp_high[3]; /* Register value */
|
|
- s8 temp_low[3]; /* Register value */
|
|
+ u8 temp[3]; /* Register value */
|
|
+ u8 temp_high[3]; /* Register value */
|
|
+ u8 temp_low[3]; /* Register value */
|
|
u8 sensor; /* Register value */
|
|
u8 fan_div[3]; /* Register encoding, shifted right */
|
|
u8 vid; /* Register encoding, combined */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/Kconfig linux-2.6.29-rc3.owrt/drivers/hwmon/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/hwmon/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -543,8 +543,8 @@
|
|
help
|
|
If you say yes here you get support for National Semiconductor LM90,
|
|
LM86, LM89 and LM99, Analog Devices ADM1032 and ADT7461, and Maxim
|
|
- MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659,
|
|
- MAX6680, MAX6681 and MAX6692 sensor chips.
|
|
+ MAX6646, MAX6647, MAX6649, MAX6657, MAX6658, MAX6659, MAX6680 and
|
|
+ MAX6681 sensor chips.
|
|
|
|
This driver can also be built as a module. If so, the module
|
|
will be called lm90.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/lis3lv02d.c linux-2.6.29-rc3.owrt/drivers/hwmon/lis3lv02d.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/lis3lv02d.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/lis3lv02d.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,7 +3,7 @@
|
|
*
|
|
* Copyright (C) 2007-2008 Yan Burman
|
|
* Copyright (C) 2008 Eric Piel
|
|
- * Copyright (C) 2008-2009 Pavel Machek
|
|
+ * Copyright (C) 2008 Pavel Machek
|
|
*
|
|
* 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
|
|
@@ -35,7 +35,6 @@
|
|
#include <linux/poll.h>
|
|
#include <linux/freezer.h>
|
|
#include <linux/uaccess.h>
|
|
-#include <linux/miscdevice.h>
|
|
#include <acpi/acpi_drivers.h>
|
|
#include <asm/atomic.h>
|
|
#include "lis3lv02d.h"
|
|
@@ -53,14 +52,24 @@
|
|
* joystick.
|
|
*/
|
|
|
|
-struct acpi_lis3lv02d adev = {
|
|
- .misc_wait = __WAIT_QUEUE_HEAD_INITIALIZER(adev.misc_wait),
|
|
-};
|
|
+/* Maximum value our axis may get for the input device (signed 12 bits) */
|
|
+#define MDPS_MAX_VAL 2048
|
|
|
|
+struct acpi_lis3lv02d adev;
|
|
EXPORT_SYMBOL_GPL(adev);
|
|
|
|
static int lis3lv02d_add_fs(struct acpi_device *device);
|
|
|
|
+static s16 lis3lv02d_read_16(acpi_handle handle, int reg)
|
|
+{
|
|
+ u8 lo, hi;
|
|
+
|
|
+ adev.read(handle, reg, &lo);
|
|
+ adev.read(handle, reg + 1, &hi);
|
|
+ /* In "12 bit right justified" mode, bit 6, bit 7, bit 8 = bit 5 */
|
|
+ return (s16)((hi << 8) | lo);
|
|
+}
|
|
+
|
|
/**
|
|
* lis3lv02d_get_axis - For the given axis, give the value converted
|
|
* @axis: 1,2,3 - can also be negative
|
|
@@ -89,9 +98,9 @@
|
|
{
|
|
int position[3];
|
|
|
|
- position[0] = adev.read_data(handle, OUTX);
|
|
- position[1] = adev.read_data(handle, OUTY);
|
|
- position[2] = adev.read_data(handle, OUTZ);
|
|
+ position[0] = lis3lv02d_read_16(handle, OUTX_L);
|
|
+ position[1] = lis3lv02d_read_16(handle, OUTY_L);
|
|
+ position[2] = lis3lv02d_read_16(handle, OUTZ_L);
|
|
|
|
*x = lis3lv02d_get_axis(adev.ac.x, position);
|
|
*y = lis3lv02d_get_axis(adev.ac.y, position);
|
|
@@ -101,13 +110,26 @@
|
|
void lis3lv02d_poweroff(acpi_handle handle)
|
|
{
|
|
adev.is_on = 0;
|
|
+ /* disable X,Y,Z axis and power down */
|
|
+ adev.write(handle, CTRL_REG1, 0x00);
|
|
}
|
|
EXPORT_SYMBOL_GPL(lis3lv02d_poweroff);
|
|
|
|
void lis3lv02d_poweron(acpi_handle handle)
|
|
{
|
|
+ u8 val;
|
|
+
|
|
adev.is_on = 1;
|
|
adev.init(handle);
|
|
+ adev.write(handle, FF_WU_CFG, 0);
|
|
+ /*
|
|
+ * BDU: LSB and MSB values are not updated until both have been read.
|
|
+ * So the value read will always be correct.
|
|
+ * IEN: Interrupt for free-fall and DD, not for data-ready.
|
|
+ */
|
|
+ adev.read(handle, CTRL_REG2, &val);
|
|
+ val |= CTRL2_BDU | CTRL2_IEN;
|
|
+ adev.write(handle, CTRL_REG2, val);
|
|
}
|
|
EXPORT_SYMBOL_GPL(lis3lv02d_poweron);
|
|
|
|
@@ -140,140 +162,6 @@
|
|
mutex_unlock(&dev->lock);
|
|
}
|
|
|
|
-static irqreturn_t lis302dl_interrupt(int irq, void *dummy)
|
|
-{
|
|
- /*
|
|
- * Be careful: on some HP laptops the bios force DD when on battery and
|
|
- * the lid is closed. This leads to interrupts as soon as a little move
|
|
- * is done.
|
|
- */
|
|
- atomic_inc(&adev.count);
|
|
-
|
|
- wake_up_interruptible(&adev.misc_wait);
|
|
- kill_fasync(&adev.async_queue, SIGIO, POLL_IN);
|
|
- return IRQ_HANDLED;
|
|
-}
|
|
-
|
|
-static int lis3lv02d_misc_open(struct inode *inode, struct file *file)
|
|
-{
|
|
- int ret;
|
|
-
|
|
- if (test_and_set_bit(0, &adev.misc_opened))
|
|
- return -EBUSY; /* already open */
|
|
-
|
|
- atomic_set(&adev.count, 0);
|
|
-
|
|
- /*
|
|
- * The sensor can generate interrupts for free-fall and direction
|
|
- * detection (distinguishable with FF_WU_SRC and DD_SRC) but to keep
|
|
- * the things simple and _fast_ we activate it only for free-fall, so
|
|
- * no need to read register (very slow with ACPI). For the same reason,
|
|
- * we forbid shared interrupts.
|
|
- *
|
|
- * IRQF_TRIGGER_RISING seems pointless on HP laptops because the
|
|
- * io-apic is not configurable (and generates a warning) but I keep it
|
|
- * in case of support for other hardware.
|
|
- */
|
|
- ret = request_irq(adev.irq, lis302dl_interrupt, IRQF_TRIGGER_RISING,
|
|
- DRIVER_NAME, &adev);
|
|
-
|
|
- if (ret) {
|
|
- clear_bit(0, &adev.misc_opened);
|
|
- printk(KERN_ERR DRIVER_NAME ": IRQ%d allocation failed\n", adev.irq);
|
|
- return -EBUSY;
|
|
- }
|
|
- lis3lv02d_increase_use(&adev);
|
|
- printk("lis3: registered interrupt %d\n", adev.irq);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int lis3lv02d_misc_release(struct inode *inode, struct file *file)
|
|
-{
|
|
- fasync_helper(-1, file, 0, &adev.async_queue);
|
|
- lis3lv02d_decrease_use(&adev);
|
|
- free_irq(adev.irq, &adev);
|
|
- clear_bit(0, &adev.misc_opened); /* release the device */
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static ssize_t lis3lv02d_misc_read(struct file *file, char __user *buf,
|
|
- size_t count, loff_t *pos)
|
|
-{
|
|
- DECLARE_WAITQUEUE(wait, current);
|
|
- u32 data;
|
|
- unsigned char byte_data;
|
|
- ssize_t retval = 1;
|
|
-
|
|
- if (count < 1)
|
|
- return -EINVAL;
|
|
-
|
|
- add_wait_queue(&adev.misc_wait, &wait);
|
|
- while (true) {
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
- data = atomic_xchg(&adev.count, 0);
|
|
- if (data)
|
|
- break;
|
|
-
|
|
- if (file->f_flags & O_NONBLOCK) {
|
|
- retval = -EAGAIN;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- if (signal_pending(current)) {
|
|
- retval = -ERESTARTSYS;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- schedule();
|
|
- }
|
|
-
|
|
- if (data < 255)
|
|
- byte_data = data;
|
|
- else
|
|
- byte_data = 255;
|
|
-
|
|
- /* make sure we are not going into copy_to_user() with
|
|
- * TASK_INTERRUPTIBLE state */
|
|
- set_current_state(TASK_RUNNING);
|
|
- if (copy_to_user(buf, &byte_data, sizeof(byte_data)))
|
|
- retval = -EFAULT;
|
|
-
|
|
-out:
|
|
- __set_current_state(TASK_RUNNING);
|
|
- remove_wait_queue(&adev.misc_wait, &wait);
|
|
-
|
|
- return retval;
|
|
-}
|
|
-
|
|
-static unsigned int lis3lv02d_misc_poll(struct file *file, poll_table *wait)
|
|
-{
|
|
- poll_wait(file, &adev.misc_wait, wait);
|
|
- if (atomic_read(&adev.count))
|
|
- return POLLIN | POLLRDNORM;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int lis3lv02d_misc_fasync(int fd, struct file *file, int on)
|
|
-{
|
|
- return fasync_helper(fd, file, on, &adev.async_queue);
|
|
-}
|
|
-
|
|
-static const struct file_operations lis3lv02d_misc_fops = {
|
|
- .owner = THIS_MODULE,
|
|
- .llseek = no_llseek,
|
|
- .read = lis3lv02d_misc_read,
|
|
- .open = lis3lv02d_misc_open,
|
|
- .release = lis3lv02d_misc_release,
|
|
- .poll = lis3lv02d_misc_poll,
|
|
- .fasync = lis3lv02d_misc_fasync,
|
|
-};
|
|
-
|
|
-static struct miscdevice lis3lv02d_misc_device = {
|
|
- .minor = MISC_DYNAMIC_MINOR,
|
|
- .name = "freefall",
|
|
- .fops = &lis3lv02d_misc_fops,
|
|
-};
|
|
-
|
|
/**
|
|
* lis3lv02d_joystick_kthread - Kthread polling function
|
|
* @data: unused - here to conform to threadfn prototype
|
|
@@ -315,6 +203,7 @@
|
|
lis3lv02d_decrease_use(&adev);
|
|
}
|
|
|
|
+
|
|
static inline void lis3lv02d_calibrate_joystick(void)
|
|
{
|
|
lis3lv02d_get_xyz(adev.device->handle, &adev.xcalib, &adev.ycalib, &adev.zcalib);
|
|
@@ -342,9 +231,9 @@
|
|
adev.idev->close = lis3lv02d_joystick_close;
|
|
|
|
set_bit(EV_ABS, adev.idev->evbit);
|
|
- input_set_abs_params(adev.idev, ABS_X, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
|
|
- input_set_abs_params(adev.idev, ABS_Y, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
|
|
- input_set_abs_params(adev.idev, ABS_Z, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
|
|
+ input_set_abs_params(adev.idev, ABS_X, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
|
|
+ input_set_abs_params(adev.idev, ABS_Y, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
|
|
+ input_set_abs_params(adev.idev, ABS_Z, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
|
|
|
|
err = input_register_device(adev.idev);
|
|
if (err) {
|
|
@@ -361,7 +250,6 @@
|
|
if (!adev.idev)
|
|
return;
|
|
|
|
- misc_deregister(&lis3lv02d_misc_device);
|
|
input_unregister_device(adev.idev);
|
|
adev.idev = NULL;
|
|
}
|
|
@@ -380,19 +268,6 @@
|
|
if (lis3lv02d_joystick_enable())
|
|
printk(KERN_ERR DRIVER_NAME ": joystick initialization failed\n");
|
|
|
|
- printk("lis3_init_device: irq %d\n", dev->irq);
|
|
-
|
|
- /* if we did not get an IRQ from ACPI - we have nothing more to do */
|
|
- if (!dev->irq) {
|
|
- printk(KERN_ERR DRIVER_NAME
|
|
- ": No IRQ in ACPI. Disabling /dev/freefall\n");
|
|
- goto out;
|
|
- }
|
|
-
|
|
- printk("lis3: registering device\n");
|
|
- if (misc_register(&lis3lv02d_misc_device))
|
|
- printk(KERN_ERR DRIVER_NAME ": misc_register failed\n");
|
|
-out:
|
|
lis3lv02d_decrease_use(dev);
|
|
return 0;
|
|
}
|
|
@@ -476,6 +351,6 @@
|
|
EXPORT_SYMBOL_GPL(lis3lv02d_remove_fs);
|
|
|
|
MODULE_DESCRIPTION("ST LIS3LV02Dx three-axis digital accelerometer driver");
|
|
-MODULE_AUTHOR("Yan Burman, Eric Piel, Pavel Machek");
|
|
+MODULE_AUTHOR("Yan Burman and Eric Piel");
|
|
MODULE_LICENSE("GPL");
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/lis3lv02d.h linux-2.6.29-rc3.owrt/drivers/hwmon/lis3lv02d.h
|
|
--- linux-2.6.29.owrt/drivers/hwmon/lis3lv02d.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/lis3lv02d.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -22,15 +22,12 @@
|
|
/*
|
|
* The actual chip is STMicroelectronics LIS3LV02DL or LIS3LV02DQ that seems to
|
|
* be connected via SPI. There exists also several similar chips (such as LIS302DL or
|
|
- * LIS3L02DQ) and they have slightly different registers, but we can provide a
|
|
- * common interface for all of them.
|
|
+ * LIS3L02DQ) but not in the HP laptops and they have slightly different registers.
|
|
* They can also be connected via I²C.
|
|
*/
|
|
|
|
-/* 2-byte registers */
|
|
-#define LIS_DOUBLE_ID 0x3A /* LIS3LV02D[LQ] */
|
|
-/* 1-byte registers */
|
|
-#define LIS_SINGLE_ID 0x3B /* LIS[32]02DL and others */
|
|
+#define LIS3LV02DL_ID 0x3A /* Also the LIS3LV02DQ */
|
|
+#define LIS302DL_ID 0x3B /* Also the LIS202DL! */
|
|
|
|
enum lis3lv02d_reg {
|
|
WHO_AM_I = 0x0F,
|
|
@@ -47,13 +44,10 @@
|
|
STATUS_REG = 0x27,
|
|
OUTX_L = 0x28,
|
|
OUTX_H = 0x29,
|
|
- OUTX = 0x29,
|
|
OUTY_L = 0x2A,
|
|
OUTY_H = 0x2B,
|
|
- OUTY = 0x2B,
|
|
OUTZ_L = 0x2C,
|
|
OUTZ_H = 0x2D,
|
|
- OUTZ = 0x2D,
|
|
FF_WU_CFG = 0x30,
|
|
FF_WU_SRC = 0x31,
|
|
FF_WU_ACK = 0x32,
|
|
@@ -165,10 +159,6 @@
|
|
acpi_status (*write) (acpi_handle handle, int reg, u8 val);
|
|
acpi_status (*read) (acpi_handle handle, int reg, u8 *ret);
|
|
|
|
- u8 whoami; /* 3Ah: 2-byte registries, 3Bh: 1-byte registries */
|
|
- s16 (*read_data) (acpi_handle handle, int reg);
|
|
- int mdps_max_val;
|
|
-
|
|
struct input_dev *idev; /* input device */
|
|
struct task_struct *kthread; /* kthread for input */
|
|
struct mutex lock;
|
|
@@ -180,11 +170,6 @@
|
|
unsigned char is_on; /* whether the device is on or off */
|
|
unsigned char usage; /* usage counter */
|
|
struct axis_conversion ac; /* hw -> logical axis */
|
|
-
|
|
- u32 irq; /* IRQ number */
|
|
- struct fasync_struct *async_queue; /* queue for the misc device */
|
|
- wait_queue_head_t misc_wait; /* Wait queue for the misc device */
|
|
- unsigned long misc_opened; /* bit0: whether the device is open */
|
|
};
|
|
|
|
int lis3lv02d_init_device(struct acpi_lis3lv02d *dev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/lm85.c linux-2.6.29-rc3.owrt/drivers/hwmon/lm85.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/lm85.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/lm85.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -72,7 +72,6 @@
|
|
#define LM85_COMPANY_SMSC 0x5c
|
|
#define LM85_VERSTEP_VMASK 0xf0
|
|
#define LM85_VERSTEP_GENERIC 0x60
|
|
-#define LM85_VERSTEP_GENERIC2 0x70
|
|
#define LM85_VERSTEP_LM85C 0x60
|
|
#define LM85_VERSTEP_LM85B 0x62
|
|
#define LM85_VERSTEP_ADM1027 0x60
|
|
@@ -335,7 +334,6 @@
|
|
static const struct i2c_device_id lm85_id[] = {
|
|
{ "adm1027", adm1027 },
|
|
{ "adt7463", adt7463 },
|
|
- { "adt7468", adt7468 },
|
|
{ "lm85", any_chip },
|
|
{ "lm85b", lm85b },
|
|
{ "lm85c", lm85c },
|
|
@@ -410,8 +408,7 @@
|
|
struct lm85_data *data = lm85_update_device(dev);
|
|
int vid;
|
|
|
|
- if ((data->type == adt7463 || data->type == adt7468) &&
|
|
- (data->vid & 0x80)) {
|
|
+ if (data->type == adt7463 && (data->vid & 0x80)) {
|
|
/* 6-pin VID (VRM 10) */
|
|
vid = vid_from_reg(data->vid & 0x3f, data->vrm);
|
|
} else {
|
|
@@ -1156,8 +1153,7 @@
|
|
address, company, verstep);
|
|
|
|
/* All supported chips have the version in common */
|
|
- if ((verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC &&
|
|
- (verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC2) {
|
|
+ if ((verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC) {
|
|
dev_dbg(&adapter->dev, "Autodetection failed: "
|
|
"unsupported version\n");
|
|
return -ENODEV;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/lm90.c linux-2.6.29-rc3.owrt/drivers/hwmon/lm90.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/lm90.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/lm90.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -32,10 +32,10 @@
|
|
* supported by this driver. These chips lack the remote temperature
|
|
* offset feature.
|
|
*
|
|
- * This driver also supports the MAX6646, MAX6647, MAX6648, MAX6649 and
|
|
- * MAX6692 chips made by Maxim. These are again similar to the LM86,
|
|
- * but they use unsigned temperature values and can report temperatures
|
|
- * from 0 to 145 degrees.
|
|
+ * This driver also supports the MAX6646, MAX6647 and MAX6649 chips
|
|
+ * made by Maxim. These are again similar to the LM86, but they use
|
|
+ * unsigned temperature values and can report temperatures from 0 to
|
|
+ * 145 degrees.
|
|
*
|
|
* This driver also supports the MAX6680 and MAX6681, two other sensor
|
|
* chips made by Maxim. These are quite similar to the other Maxim
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/vt1211.c linux-2.6.29-rc3.owrt/drivers/hwmon/vt1211.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/vt1211.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/vt1211.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1262,7 +1262,7 @@
|
|
res.name = pdev->name;
|
|
err = acpi_check_resource_conflict(&res);
|
|
if (err)
|
|
- goto EXIT_DEV_PUT;
|
|
+ goto EXIT;
|
|
|
|
err = platform_device_add_resources(pdev, &res, 1);
|
|
if (err) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/hwmon/w83627ehf.c linux-2.6.29-rc3.owrt/drivers/hwmon/w83627ehf.c
|
|
--- linux-2.6.29.owrt/drivers/hwmon/w83627ehf.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/hwmon/w83627ehf.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1548,7 +1548,7 @@
|
|
|
|
err = acpi_check_resource_conflict(&res);
|
|
if (err)
|
|
- goto exit_device_put;
|
|
+ goto exit;
|
|
|
|
err = platform_device_add_resources(pdev, &res, 1);
|
|
if (err) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/i2c/busses/i2c-acorn.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-acorn.c
|
|
--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-acorn.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-acorn.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -79,11 +79,10 @@
|
|
.getsda = ioc_getsda,
|
|
.getscl = ioc_getscl,
|
|
.udelay = 80,
|
|
- .timeout = HZ,
|
|
+ .timeout = 100
|
|
};
|
|
|
|
static struct i2c_adapter ioc_ops = {
|
|
- .nr = 0,
|
|
.algo_data = &ioc_data,
|
|
};
|
|
|
|
@@ -91,7 +90,7 @@
|
|
{
|
|
force_ones = FORCE_ONES | SCL | SDA;
|
|
|
|
- return i2c_bit_add_numbered_bus(&ioc_ops);
|
|
+ return i2c_bit_add_bus(&ioc_ops);
|
|
}
|
|
|
|
module_init(i2c_ioc_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/i2c/busses/i2c-amd8111.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-amd8111.c
|
|
--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-amd8111.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-amd8111.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -72,7 +72,7 @@
|
|
{
|
|
int timeout = 500;
|
|
|
|
- while ((inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF) && --timeout)
|
|
+ while (timeout-- && (inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF))
|
|
udelay(1);
|
|
|
|
if (!timeout) {
|
|
@@ -88,7 +88,7 @@
|
|
{
|
|
int timeout = 500;
|
|
|
|
- while ((~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF) && --timeout)
|
|
+ while (timeout-- && (~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF))
|
|
udelay(1);
|
|
|
|
if (!timeout) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/i2c/busses/i2c-ixp2000.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-ixp2000.c
|
|
--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-ixp2000.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-ixp2000.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -114,7 +114,7 @@
|
|
drv_data->algo_data.getsda = ixp2000_bit_getsda;
|
|
drv_data->algo_data.getscl = ixp2000_bit_getscl;
|
|
drv_data->algo_data.udelay = 6;
|
|
- drv_data->algo_data.timeout = HZ;
|
|
+ drv_data->algo_data.timeout = 100;
|
|
|
|
strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name,
|
|
sizeof(drv_data->adapter.name));
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/i2c/busses/i2c-mv64xxx.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-mv64xxx.c
|
|
--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-mv64xxx.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-mv64xxx.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -482,7 +482,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-static void
|
|
+static void __devexit
|
|
mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
|
|
{
|
|
if (drv_data->reg_base) {
|
|
@@ -577,7 +577,7 @@
|
|
|
|
static struct platform_driver mv64xxx_i2c_driver = {
|
|
.probe = mv64xxx_i2c_probe,
|
|
- .remove = __devexit_p(mv64xxx_i2c_remove),
|
|
+ .remove = mv64xxx_i2c_remove,
|
|
.driver = {
|
|
.owner = THIS_MODULE,
|
|
.name = MV64XXX_I2C_CTLR_NAME,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/i2c/busses/i2c-pxa.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-pxa.c
|
|
--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-pxa.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-pxa.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -644,7 +644,7 @@
|
|
|
|
i2c_pxa_start_message(i2c);
|
|
|
|
- while (i2c->msg_num > 0 && --timeout) {
|
|
+ while (timeout-- && i2c->msg_num > 0) {
|
|
i2c_pxa_handler(0, i2c);
|
|
udelay(10);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/i2c/busses/scx200_i2c.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/scx200_i2c.c
|
|
--- linux-2.6.29.owrt/drivers/i2c/busses/scx200_i2c.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/scx200_i2c.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -76,7 +76,7 @@
|
|
.getsda = scx200_i2c_getsda,
|
|
.getscl = scx200_i2c_getscl,
|
|
.udelay = 10,
|
|
- .timeout = HZ,
|
|
+ .timeout = 100,
|
|
};
|
|
|
|
static struct i2c_adapter scx200_i2c_ops = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/i2c/i2c-core.c linux-2.6.29-rc3.owrt/drivers/i2c/i2c-core.c
|
|
--- linux-2.6.29.owrt/drivers/i2c/i2c-core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/i2c/i2c-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1831,8 +1831,7 @@
|
|
case I2C_SMBUS_QUICK:
|
|
msg[0].len = 0;
|
|
/* Special case: The read/write field is used as data */
|
|
- msg[0].flags = flags | (read_write == I2C_SMBUS_READ ?
|
|
- I2C_M_RD : 0);
|
|
+ msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
|
|
num = 1;
|
|
break;
|
|
case I2C_SMBUS_BYTE:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/i2c/i2c-dev.c linux-2.6.29-rc3.owrt/drivers/i2c/i2c-dev.c
|
|
--- linux-2.6.29.owrt/drivers/i2c/i2c-dev.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/i2c/i2c-dev.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -35,7 +35,6 @@
|
|
#include <linux/i2c.h>
|
|
#include <linux/i2c-dev.h>
|
|
#include <linux/smp_lock.h>
|
|
-#include <linux/jiffies.h>
|
|
#include <asm/uaccess.h>
|
|
|
|
static struct i2c_driver i2cdev_driver;
|
|
@@ -423,10 +422,7 @@
|
|
client->adapter->retries = arg;
|
|
break;
|
|
case I2C_TIMEOUT:
|
|
- /* For historical reasons, user-space sets the timeout
|
|
- * value in units of 10 ms.
|
|
- */
|
|
- client->adapter->timeout = msecs_to_jiffies(arg * 10);
|
|
+ client->adapter->timeout = arg;
|
|
break;
|
|
default:
|
|
/* NOTE: returning a fault code here could cause trouble
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/amd74xx.c linux-2.6.29-rc3.owrt/drivers/ide/amd74xx.c
|
|
--- linux-2.6.29.owrt/drivers/ide/amd74xx.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/amd74xx.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -166,7 +166,7 @@
|
|
* Check for broken FIFO support.
|
|
*/
|
|
if (dev->vendor == PCI_VENDOR_ID_AMD &&
|
|
- dev->device == PCI_DEVICE_ID_AMD_VIPER_7411)
|
|
+ dev->vendor == PCI_DEVICE_ID_AMD_VIPER_7411)
|
|
t &= 0x0f;
|
|
else
|
|
t |= 0xf0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/at91_ide.c linux-2.6.29-rc3.owrt/drivers/ide/at91_ide.c
|
|
--- linux-2.6.29.owrt/drivers/ide/at91_ide.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/at91_ide.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,467 +0,0 @@
|
|
-/*
|
|
- * IDE host driver for AT91 (SAM9, CAP9, AT572D940HF) Static Memory Controller
|
|
- * with Compact Flash True IDE logic
|
|
- *
|
|
- * Copyright (c) 2008, 2009 Kelvatek Ltd.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License as published by
|
|
- * the Free Software Foundation; either version 2 of the License, or
|
|
- * (at your option) any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful,
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
- * GNU General Public License for more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License
|
|
- * along with this program; if not, write to the Free Software
|
|
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
- *
|
|
- */
|
|
-
|
|
-#include <linux/version.h>
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/module.h>
|
|
-#include <linux/clk.h>
|
|
-#include <linux/err.h>
|
|
-#include <linux/ide.h>
|
|
-#include <linux/platform_device.h>
|
|
-
|
|
-#include <mach/board.h>
|
|
-#include <mach/gpio.h>
|
|
-#include <mach/at91sam9263.h>
|
|
-#include <mach/at91sam9_smc.h>
|
|
-#include <mach/at91sam9263_matrix.h>
|
|
-
|
|
-#define DRV_NAME "at91_ide"
|
|
-
|
|
-#define perr(fmt, args...) pr_err(DRV_NAME ": " fmt, ##args)
|
|
-#define pdbg(fmt, args...) pr_debug("%s " fmt, __func__, ##args)
|
|
-
|
|
-/*
|
|
- * Access to IDE device is possible through EBI Static Memory Controller
|
|
- * with Compact Flash logic. For details see EBI and SMC datasheet sections
|
|
- * of any microcontroller from AT91SAM9 family.
|
|
- *
|
|
- * Within SMC chip select address space, lines A[23:21] distinguish Compact
|
|
- * Flash modes (I/O, common memory, attribute memory, True IDE). IDE modes are:
|
|
- * 0x00c0000 - True IDE
|
|
- * 0x00e0000 - Alternate True IDE (Alt Status Register)
|
|
- *
|
|
- * On True IDE mode Task File and Data Register are mapped at the same address.
|
|
- * To distinguish access between these two different bus data width is used:
|
|
- * 8Bit for Task File, 16Bit for Data I/O.
|
|
- *
|
|
- * After initialization we do 8/16 bit flipping (changes in SMC MODE register)
|
|
- * only inside IDE callback routines which are serialized by IDE layer,
|
|
- * so no additional locking needed.
|
|
- */
|
|
-
|
|
-#define TASK_FILE 0x00c00000
|
|
-#define ALT_MODE 0x00e00000
|
|
-#define REGS_SIZE 8
|
|
-
|
|
-#define enter_16bit(cs, mode) do { \
|
|
- mode = at91_sys_read(AT91_SMC_MODE(cs)); \
|
|
- at91_sys_write(AT91_SMC_MODE(cs), mode | AT91_SMC_DBW_16); \
|
|
-} while (0)
|
|
-
|
|
-#define leave_16bit(cs, mode) at91_sys_write(AT91_SMC_MODE(cs), mode);
|
|
-
|
|
-static void set_smc_timings(const u8 chipselect, const u16 cycle,
|
|
- const u16 setup, const u16 pulse,
|
|
- const u16 data_float, int use_iordy)
|
|
-{
|
|
- unsigned long mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
|
- AT91_SMC_BAT_SELECT;
|
|
-
|
|
- /* disable or enable waiting for IORDY signal */
|
|
- if (use_iordy)
|
|
- mode |= AT91_SMC_EXNWMODE_READY;
|
|
-
|
|
- /* add data float cycles if needed */
|
|
- if (data_float)
|
|
- mode |= AT91_SMC_TDF_(data_float);
|
|
-
|
|
- at91_sys_write(AT91_SMC_MODE(chipselect), mode);
|
|
-
|
|
- /* setup timings in SMC */
|
|
- at91_sys_write(AT91_SMC_SETUP(chipselect), AT91_SMC_NWESETUP_(setup) |
|
|
- AT91_SMC_NCS_WRSETUP_(0) |
|
|
- AT91_SMC_NRDSETUP_(setup) |
|
|
- AT91_SMC_NCS_RDSETUP_(0));
|
|
- at91_sys_write(AT91_SMC_PULSE(chipselect), AT91_SMC_NWEPULSE_(pulse) |
|
|
- AT91_SMC_NCS_WRPULSE_(cycle) |
|
|
- AT91_SMC_NRDPULSE_(pulse) |
|
|
- AT91_SMC_NCS_RDPULSE_(cycle));
|
|
- at91_sys_write(AT91_SMC_CYCLE(chipselect), AT91_SMC_NWECYCLE_(cycle) |
|
|
- AT91_SMC_NRDCYCLE_(cycle));
|
|
-}
|
|
-
|
|
-static unsigned int calc_mck_cycles(unsigned int ns, unsigned int mck_hz)
|
|
-{
|
|
- u64 tmp = ns;
|
|
-
|
|
- tmp *= mck_hz;
|
|
- tmp += 1000*1000*1000 - 1; /* round up */
|
|
- do_div(tmp, 1000*1000*1000);
|
|
- return (unsigned int) tmp;
|
|
-}
|
|
-
|
|
-static void apply_timings(const u8 chipselect, const u8 pio,
|
|
- const struct ide_timing *timing, int use_iordy)
|
|
-{
|
|
- unsigned int t0, t1, t2, t6z;
|
|
- unsigned int cycle, setup, pulse, data_float;
|
|
- unsigned int mck_hz;
|
|
- struct clk *mck;
|
|
-
|
|
- /* see table 22 of Compact Flash standard 4.1 for the meaning,
|
|
- * we do not stretch active (t2) time, so setup (t1) + hold time (th)
|
|
- * assure at least minimal recovery (t2i) time */
|
|
- t0 = timing->cyc8b;
|
|
- t1 = timing->setup;
|
|
- t2 = timing->act8b;
|
|
- t6z = (pio < 5) ? 30 : 20;
|
|
-
|
|
- pdbg("t0=%u t1=%u t2=%u t6z=%u\n", t0, t1, t2, t6z);
|
|
-
|
|
- mck = clk_get(NULL, "mck");
|
|
- BUG_ON(IS_ERR(mck));
|
|
- mck_hz = clk_get_rate(mck);
|
|
- pdbg("mck_hz=%u\n", mck_hz);
|
|
-
|
|
- cycle = calc_mck_cycles(t0, mck_hz);
|
|
- setup = calc_mck_cycles(t1, mck_hz);
|
|
- pulse = calc_mck_cycles(t2, mck_hz);
|
|
- data_float = calc_mck_cycles(t6z, mck_hz);
|
|
-
|
|
- pdbg("cycle=%u setup=%u pulse=%u data_float=%u\n",
|
|
- cycle, setup, pulse, data_float);
|
|
-
|
|
- set_smc_timings(chipselect, cycle, setup, pulse, data_float, use_iordy);
|
|
-}
|
|
-
|
|
-static void at91_ide_input_data(ide_drive_t *drive, struct request *rq,
|
|
- void *buf, unsigned int len)
|
|
-{
|
|
- ide_hwif_t *hwif = drive->hwif;
|
|
- struct ide_io_ports *io_ports = &hwif->io_ports;
|
|
- u8 chipselect = hwif->select_data;
|
|
- unsigned long mode;
|
|
-
|
|
- pdbg("cs %u buf %p len %d\n", chipselect, buf, len);
|
|
-
|
|
- len++;
|
|
-
|
|
- enter_16bit(chipselect, mode);
|
|
- __ide_mm_insw((void __iomem *) io_ports->data_addr, buf, len / 2);
|
|
- leave_16bit(chipselect, mode);
|
|
-}
|
|
-
|
|
-static void at91_ide_output_data(ide_drive_t *drive, struct request *rq,
|
|
- void *buf, unsigned int len)
|
|
-{
|
|
- ide_hwif_t *hwif = drive->hwif;
|
|
- struct ide_io_ports *io_ports = &hwif->io_ports;
|
|
- u8 chipselect = hwif->select_data;
|
|
- unsigned long mode;
|
|
-
|
|
- pdbg("cs %u buf %p len %d\n", chipselect, buf, len);
|
|
-
|
|
- enter_16bit(chipselect, mode);
|
|
- __ide_mm_outsw((void __iomem *) io_ports->data_addr, buf, len / 2);
|
|
- leave_16bit(chipselect, mode);
|
|
-}
|
|
-
|
|
-static u8 ide_mm_inb(unsigned long port)
|
|
-{
|
|
- return readb((void __iomem *) port);
|
|
-}
|
|
-
|
|
-static void ide_mm_outb(u8 value, unsigned long port)
|
|
-{
|
|
- writeb(value, (void __iomem *) port);
|
|
-}
|
|
-
|
|
-static void at91_ide_tf_load(ide_drive_t *drive, ide_task_t *task)
|
|
-{
|
|
- ide_hwif_t *hwif = drive->hwif;
|
|
- struct ide_io_ports *io_ports = &hwif->io_ports;
|
|
- struct ide_taskfile *tf = &task->tf;
|
|
- u8 HIHI = (task->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF;
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_FLAGGED)
|
|
- HIHI = 0xFF;
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_DATA) {
|
|
- u16 data = (tf->hob_data << 8) | tf->data;
|
|
-
|
|
- at91_ide_output_data(drive, NULL, &data, 2);
|
|
- }
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
|
|
- ide_mm_outb(tf->hob_feature, io_ports->feature_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
|
|
- ide_mm_outb(tf->hob_nsect, io_ports->nsect_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAL)
|
|
- ide_mm_outb(tf->hob_lbal, io_ports->lbal_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAM)
|
|
- ide_mm_outb(tf->hob_lbam, io_ports->lbam_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAH)
|
|
- ide_mm_outb(tf->hob_lbah, io_ports->lbah_addr);
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_FEATURE)
|
|
- ide_mm_outb(tf->feature, io_ports->feature_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_NSECT)
|
|
- ide_mm_outb(tf->nsect, io_ports->nsect_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_LBAL)
|
|
- ide_mm_outb(tf->lbal, io_ports->lbal_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_LBAM)
|
|
- ide_mm_outb(tf->lbam, io_ports->lbam_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_LBAH)
|
|
- ide_mm_outb(tf->lbah, io_ports->lbah_addr);
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_OUT_DEVICE)
|
|
- ide_mm_outb((tf->device & HIHI) | drive->select, io_ports->device_addr);
|
|
-}
|
|
-
|
|
-static void at91_ide_tf_read(ide_drive_t *drive, ide_task_t *task)
|
|
-{
|
|
- ide_hwif_t *hwif = drive->hwif;
|
|
- struct ide_io_ports *io_ports = &hwif->io_ports;
|
|
- struct ide_taskfile *tf = &task->tf;
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_IN_DATA) {
|
|
- u16 data;
|
|
-
|
|
- at91_ide_input_data(drive, NULL, &data, 2);
|
|
- tf->data = data & 0xff;
|
|
- tf->hob_data = (data >> 8) & 0xff;
|
|
- }
|
|
-
|
|
- /* be sure we're looking at the low order bits */
|
|
- ide_mm_outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr);
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_IN_FEATURE)
|
|
- tf->feature = ide_mm_inb(io_ports->feature_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_NSECT)
|
|
- tf->nsect = ide_mm_inb(io_ports->nsect_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_LBAL)
|
|
- tf->lbal = ide_mm_inb(io_ports->lbal_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_LBAM)
|
|
- tf->lbam = ide_mm_inb(io_ports->lbam_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_LBAH)
|
|
- tf->lbah = ide_mm_inb(io_ports->lbah_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_DEVICE)
|
|
- tf->device = ide_mm_inb(io_ports->device_addr);
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_LBA48) {
|
|
- ide_mm_outb(ATA_DEVCTL_OBS | 0x80, io_ports->ctl_addr);
|
|
-
|
|
- if (task->tf_flags & IDE_TFLAG_IN_HOB_FEATURE)
|
|
- tf->hob_feature = ide_mm_inb(io_ports->feature_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_HOB_NSECT)
|
|
- tf->hob_nsect = ide_mm_inb(io_ports->nsect_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAL)
|
|
- tf->hob_lbal = ide_mm_inb(io_ports->lbal_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAM)
|
|
- tf->hob_lbam = ide_mm_inb(io_ports->lbam_addr);
|
|
- if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAH)
|
|
- tf->hob_lbah = ide_mm_inb(io_ports->lbah_addr);
|
|
- }
|
|
-}
|
|
-
|
|
-static void at91_ide_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|
-{
|
|
- struct ide_timing *timing;
|
|
- u8 chipselect = drive->hwif->select_data;
|
|
- int use_iordy = 0;
|
|
-
|
|
- pdbg("chipselect %u pio %u\n", chipselect, pio);
|
|
-
|
|
- timing = ide_timing_find_mode(XFER_PIO_0 + pio);
|
|
- BUG_ON(!timing);
|
|
-
|
|
- if ((pio > 2 || ata_id_has_iordy(drive->id)) &&
|
|
- !(ata_id_is_cfa(drive->id) && pio > 4))
|
|
- use_iordy = 1;
|
|
-
|
|
- apply_timings(chipselect, pio, timing, use_iordy);
|
|
-}
|
|
-
|
|
-static const struct ide_tp_ops at91_ide_tp_ops = {
|
|
- .exec_command = ide_exec_command,
|
|
- .read_status = ide_read_status,
|
|
- .read_altstatus = ide_read_altstatus,
|
|
- .set_irq = ide_set_irq,
|
|
-
|
|
- .tf_load = at91_ide_tf_load,
|
|
- .tf_read = at91_ide_tf_read,
|
|
-
|
|
- .input_data = at91_ide_input_data,
|
|
- .output_data = at91_ide_output_data,
|
|
-};
|
|
-
|
|
-static const struct ide_port_ops at91_ide_port_ops = {
|
|
- .set_pio_mode = at91_ide_set_pio_mode,
|
|
-};
|
|
-
|
|
-static const struct ide_port_info at91_ide_port_info __initdata = {
|
|
- .port_ops = &at91_ide_port_ops,
|
|
- .tp_ops = &at91_ide_tp_ops,
|
|
- .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA | IDE_HFLAG_SINGLE |
|
|
- IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_UNMASK_IRQS,
|
|
- .pio_mask = ATA_PIO5,
|
|
-};
|
|
-
|
|
-/*
|
|
- * If interrupt is delivered through GPIO, IRQ are triggered on falling
|
|
- * and rising edge of signal. Whereas IDE device request interrupt on high
|
|
- * level (rising edge in our case). This mean we have fake interrupts, so
|
|
- * we need to check interrupt pin and exit instantly from ISR when line
|
|
- * is on low level.
|
|
- */
|
|
-
|
|
-irqreturn_t at91_irq_handler(int irq, void *dev_id)
|
|
-{
|
|
- int ntries = 8;
|
|
- int pin_val1, pin_val2;
|
|
-
|
|
- /* additional deglitch, line can be noisy in badly designed PCB */
|
|
- do {
|
|
- pin_val1 = at91_get_gpio_value(irq);
|
|
- pin_val2 = at91_get_gpio_value(irq);
|
|
- } while (pin_val1 != pin_val2 && --ntries > 0);
|
|
-
|
|
- if (pin_val1 == 0 || ntries <= 0)
|
|
- return IRQ_HANDLED;
|
|
-
|
|
- return ide_intr(irq, dev_id);
|
|
-}
|
|
-
|
|
-static int __init at91_ide_probe(struct platform_device *pdev)
|
|
-{
|
|
- int ret;
|
|
- hw_regs_t hw;
|
|
- hw_regs_t *hws[] = { &hw, NULL, NULL, NULL };
|
|
- struct ide_host *host;
|
|
- struct resource *res;
|
|
- unsigned long tf_base = 0, ctl_base = 0;
|
|
- struct at91_cf_data *board = pdev->dev.platform_data;
|
|
-
|
|
- if (!board)
|
|
- return -ENODEV;
|
|
-
|
|
- if (board->det_pin && at91_get_gpio_value(board->det_pin) != 0) {
|
|
- perr("no device detected\n");
|
|
- return -ENODEV;
|
|
- }
|
|
-
|
|
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
- if (!res) {
|
|
- perr("can't get memory resource\n");
|
|
- return -ENODEV;
|
|
- }
|
|
-
|
|
- if (!devm_request_mem_region(&pdev->dev, res->start + TASK_FILE,
|
|
- REGS_SIZE, "ide") ||
|
|
- !devm_request_mem_region(&pdev->dev, res->start + ALT_MODE,
|
|
- REGS_SIZE, "alt")) {
|
|
- perr("memory resources in use\n");
|
|
- return -EBUSY;
|
|
- }
|
|
-
|
|
- pdbg("chipselect %u irq %u res %08lx\n", board->chipselect,
|
|
- board->irq_pin, (unsigned long) res->start);
|
|
-
|
|
- tf_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + TASK_FILE,
|
|
- REGS_SIZE);
|
|
- ctl_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + ALT_MODE,
|
|
- REGS_SIZE);
|
|
- if (!tf_base || !ctl_base) {
|
|
- perr("can't map memory regions\n");
|
|
- return -EBUSY;
|
|
- }
|
|
-
|
|
- memset(&hw, 0, sizeof(hw));
|
|
-
|
|
- if (board->flags & AT91_IDE_SWAP_A0_A2) {
|
|
- /* workaround for stupid hardware bug */
|
|
- hw.io_ports.data_addr = tf_base + 0;
|
|
- hw.io_ports.error_addr = tf_base + 4;
|
|
- hw.io_ports.nsect_addr = tf_base + 2;
|
|
- hw.io_ports.lbal_addr = tf_base + 6;
|
|
- hw.io_ports.lbam_addr = tf_base + 1;
|
|
- hw.io_ports.lbah_addr = tf_base + 5;
|
|
- hw.io_ports.device_addr = tf_base + 3;
|
|
- hw.io_ports.command_addr = tf_base + 7;
|
|
- hw.io_ports.ctl_addr = ctl_base + 3;
|
|
- } else
|
|
- ide_std_init_ports(&hw, tf_base, ctl_base + 6);
|
|
-
|
|
- hw.irq = board->irq_pin;
|
|
- hw.chipset = ide_generic;
|
|
- hw.dev = &pdev->dev;
|
|
-
|
|
- host = ide_host_alloc(&at91_ide_port_info, hws);
|
|
- if (!host) {
|
|
- perr("failed to allocate ide host\n");
|
|
- return -ENOMEM;
|
|
- }
|
|
-
|
|
- /* setup Static Memory Controller - PIO 0 as default */
|
|
- apply_timings(board->chipselect, 0, ide_timing_find_mode(XFER_PIO_0), 0);
|
|
-
|
|
- /* with GPIO interrupt we have to do quirks in handler */
|
|
- if (board->irq_pin >= PIN_BASE)
|
|
- host->irq_handler = at91_irq_handler;
|
|
-
|
|
- host->ports[0]->select_data = board->chipselect;
|
|
-
|
|
- ret = ide_host_register(host, &at91_ide_port_info, hws);
|
|
- if (ret) {
|
|
- perr("failed to register ide host\n");
|
|
- goto err_free_host;
|
|
- }
|
|
- platform_set_drvdata(pdev, host);
|
|
- return 0;
|
|
-
|
|
-err_free_host:
|
|
- ide_host_free(host);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int __exit at91_ide_remove(struct platform_device *pdev)
|
|
-{
|
|
- struct ide_host *host = platform_get_drvdata(pdev);
|
|
-
|
|
- ide_host_remove(host);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static struct platform_driver at91_ide_driver = {
|
|
- .driver = {
|
|
- .name = DRV_NAME,
|
|
- .owner = THIS_MODULE,
|
|
- },
|
|
- .remove = __exit_p(at91_ide_remove),
|
|
-};
|
|
-
|
|
-static int __init at91_ide_init(void)
|
|
-{
|
|
- return platform_driver_probe(&at91_ide_driver, at91_ide_probe);
|
|
-}
|
|
-
|
|
-static void __exit at91_ide_exit(void)
|
|
-{
|
|
- platform_driver_unregister(&at91_ide_driver);
|
|
-}
|
|
-
|
|
-module_init(at91_ide_init);
|
|
-module_exit(at91_ide_exit);
|
|
-
|
|
-MODULE_LICENSE("GPL");
|
|
-MODULE_AUTHOR("Stanislaw Gruszka <stf_xl@wp.pl>");
|
|
-
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/atiixp.c linux-2.6.29-rc3.owrt/drivers/ide/atiixp.c
|
|
--- linux-2.6.29.owrt/drivers/ide/atiixp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/atiixp.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -52,7 +52,7 @@
|
|
{
|
|
struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
|
|
unsigned long flags;
|
|
- int timing_shift = (drive->dn ^ 1) * 8;
|
|
+ int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8;
|
|
u32 pio_timing_data;
|
|
u16 pio_mode_data;
|
|
|
|
@@ -85,7 +85,7 @@
|
|
{
|
|
struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
|
|
unsigned long flags;
|
|
- int timing_shift = (drive->dn ^ 1) * 8;
|
|
+ int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8;
|
|
u32 tmp32;
|
|
u16 tmp16;
|
|
u16 udma_ctl = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/cs5536.c linux-2.6.29-rc3.owrt/drivers/ide/cs5536.c
|
|
--- linux-2.6.29.owrt/drivers/ide/cs5536.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/cs5536.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,308 +0,0 @@
|
|
-/*
|
|
- * CS5536 PATA support
|
|
- * (C) 2007 Martin K. Petersen <mkp@mkp.net>
|
|
- * (C) 2009 Bartlomiej Zolnierkiewicz
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License version 2 as
|
|
- * published by the Free Software Foundation.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful,
|
|
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
- * GNU General Public License for more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License
|
|
- * along with this program; if not, write to the Free Software
|
|
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
- *
|
|
- * Documentation:
|
|
- * Available from AMD web site.
|
|
- *
|
|
- * The IDE timing registers for the CS5536 live in the Geode Machine
|
|
- * Specific Register file and not PCI config space. Most BIOSes
|
|
- * virtualize the PCI registers so the chip looks like a standard IDE
|
|
- * controller. Unfortunately not all implementations get this right.
|
|
- * In particular some have problems with unaligned accesses to the
|
|
- * virtualized PCI registers. This driver always does full dword
|
|
- * writes to work around the issue. Also, in case of a bad BIOS this
|
|
- * driver can be loaded with the "msr=1" parameter which forces using
|
|
- * the Machine Specific Registers to configure the device.
|
|
- */
|
|
-
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/module.h>
|
|
-#include <linux/pci.h>
|
|
-#include <linux/init.h>
|
|
-#include <linux/ide.h>
|
|
-#include <asm/msr.h>
|
|
-
|
|
-#define DRV_NAME "cs5536"
|
|
-
|
|
-enum {
|
|
- MSR_IDE_CFG = 0x51300010,
|
|
- PCI_IDE_CFG = 0x40,
|
|
-
|
|
- CFG = 0,
|
|
- DTC = 2,
|
|
- CAST = 3,
|
|
- ETC = 4,
|
|
-
|
|
- IDE_CFG_CHANEN = (1 << 1),
|
|
- IDE_CFG_CABLE = (1 << 17) | (1 << 16),
|
|
-
|
|
- IDE_D0_SHIFT = 24,
|
|
- IDE_D1_SHIFT = 16,
|
|
- IDE_DRV_MASK = 0xff,
|
|
-
|
|
- IDE_CAST_D0_SHIFT = 6,
|
|
- IDE_CAST_D1_SHIFT = 4,
|
|
- IDE_CAST_DRV_MASK = 0x3,
|
|
-
|
|
- IDE_CAST_CMD_SHIFT = 24,
|
|
- IDE_CAST_CMD_MASK = 0xff,
|
|
-
|
|
- IDE_ETC_UDMA_MASK = 0xc0,
|
|
-};
|
|
-
|
|
-static int use_msr;
|
|
-
|
|
-static int cs5536_read(struct pci_dev *pdev, int reg, u32 *val)
|
|
-{
|
|
- if (unlikely(use_msr)) {
|
|
- u32 dummy;
|
|
-
|
|
- rdmsr(MSR_IDE_CFG + reg, *val, dummy);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- return pci_read_config_dword(pdev, PCI_IDE_CFG + reg * 4, val);
|
|
-}
|
|
-
|
|
-static int cs5536_write(struct pci_dev *pdev, int reg, int val)
|
|
-{
|
|
- if (unlikely(use_msr)) {
|
|
- wrmsr(MSR_IDE_CFG + reg, val, 0);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- return pci_write_config_dword(pdev, PCI_IDE_CFG + reg * 4, val);
|
|
-}
|
|
-
|
|
-static void cs5536_program_dtc(ide_drive_t *drive, u8 tim)
|
|
-{
|
|
- struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
|
|
- int dshift = (drive->dn & 1) ? IDE_D1_SHIFT : IDE_D0_SHIFT;
|
|
- u32 dtc;
|
|
-
|
|
- cs5536_read(pdev, DTC, &dtc);
|
|
- dtc &= ~(IDE_DRV_MASK << dshift);
|
|
- dtc |= tim << dshift;
|
|
- cs5536_write(pdev, DTC, dtc);
|
|
-}
|
|
-
|
|
-/**
|
|
- * cs5536_cable_detect - detect cable type
|
|
- * @hwif: Port to detect on
|
|
- *
|
|
- * Perform cable detection for ATA66 capable cable.
|
|
- *
|
|
- * Returns a cable type.
|
|
- */
|
|
-
|
|
-static u8 cs5536_cable_detect(ide_hwif_t *hwif)
|
|
-{
|
|
- struct pci_dev *pdev = to_pci_dev(hwif->dev);
|
|
- u32 cfg;
|
|
-
|
|
- cs5536_read(pdev, CFG, &cfg);
|
|
-
|
|
- if (cfg & IDE_CFG_CABLE)
|
|
- return ATA_CBL_PATA80;
|
|
- else
|
|
- return ATA_CBL_PATA40;
|
|
-}
|
|
-
|
|
-/**
|
|
- * cs5536_set_pio_mode - PIO timing setup
|
|
- * @drive: ATA device
|
|
- * @pio: PIO mode number
|
|
- */
|
|
-
|
|
-static void cs5536_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|
-{
|
|
- static const u8 drv_timings[5] = {
|
|
- 0x98, 0x55, 0x32, 0x21, 0x20,
|
|
- };
|
|
-
|
|
- static const u8 addr_timings[5] = {
|
|
- 0x2, 0x1, 0x0, 0x0, 0x0,
|
|
- };
|
|
-
|
|
- static const u8 cmd_timings[5] = {
|
|
- 0x99, 0x92, 0x90, 0x22, 0x20,
|
|
- };
|
|
-
|
|
- struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
|
|
- ide_drive_t *pair = ide_get_pair_dev(drive);
|
|
- int cshift = (drive->dn & 1) ? IDE_CAST_D1_SHIFT : IDE_CAST_D0_SHIFT;
|
|
- u32 cast;
|
|
- u8 cmd_pio = pio;
|
|
-
|
|
- if (pair)
|
|
- cmd_pio = min(pio, ide_get_best_pio_mode(pair, 255, 4));
|
|
-
|
|
- drive->drive_data &= (IDE_DRV_MASK << 8);
|
|
- drive->drive_data |= drv_timings[pio];
|
|
-
|
|
- cs5536_program_dtc(drive, drv_timings[pio]);
|
|
-
|
|
- cs5536_read(pdev, CAST, &cast);
|
|
-
|
|
- cast &= ~(IDE_CAST_DRV_MASK << cshift);
|
|
- cast |= addr_timings[pio] << cshift;
|
|
-
|
|
- cast &= ~(IDE_CAST_CMD_MASK << IDE_CAST_CMD_SHIFT);
|
|
- cast |= cmd_timings[cmd_pio] << IDE_CAST_CMD_SHIFT;
|
|
-
|
|
- cs5536_write(pdev, CAST, cast);
|
|
-}
|
|
-
|
|
-/**
|
|
- * cs5536_set_dma_mode - DMA timing setup
|
|
- * @drive: ATA device
|
|
- * @mode: DMA mode
|
|
- */
|
|
-
|
|
-static void cs5536_set_dma_mode(ide_drive_t *drive, const u8 mode)
|
|
-{
|
|
- static const u8 udma_timings[6] = {
|
|
- 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6,
|
|
- };
|
|
-
|
|
- static const u8 mwdma_timings[3] = {
|
|
- 0x67, 0x21, 0x20,
|
|
- };
|
|
-
|
|
- struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
|
|
- int dshift = (drive->dn & 1) ? IDE_D1_SHIFT : IDE_D0_SHIFT;
|
|
- u32 etc;
|
|
-
|
|
- cs5536_read(pdev, ETC, &etc);
|
|
-
|
|
- if (mode >= XFER_UDMA_0) {
|
|
- etc &= ~(IDE_DRV_MASK << dshift);
|
|
- etc |= udma_timings[mode - XFER_UDMA_0] << dshift;
|
|
- } else { /* MWDMA */
|
|
- etc &= ~(IDE_ETC_UDMA_MASK << dshift);
|
|
- drive->drive_data &= IDE_DRV_MASK;
|
|
- drive->drive_data |= mwdma_timings[mode - XFER_MW_DMA_0] << 8;
|
|
- }
|
|
-
|
|
- cs5536_write(pdev, ETC, etc);
|
|
-}
|
|
-
|
|
-static void cs5536_dma_start(ide_drive_t *drive)
|
|
-{
|
|
- if (drive->current_speed < XFER_UDMA_0 &&
|
|
- (drive->drive_data >> 8) != (drive->drive_data & IDE_DRV_MASK))
|
|
- cs5536_program_dtc(drive, drive->drive_data >> 8);
|
|
-
|
|
- ide_dma_start(drive);
|
|
-}
|
|
-
|
|
-static int cs5536_dma_end(ide_drive_t *drive)
|
|
-{
|
|
- int ret = ide_dma_end(drive);
|
|
-
|
|
- if (drive->current_speed < XFER_UDMA_0 &&
|
|
- (drive->drive_data >> 8) != (drive->drive_data & IDE_DRV_MASK))
|
|
- cs5536_program_dtc(drive, drive->drive_data & IDE_DRV_MASK);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static const struct ide_port_ops cs5536_port_ops = {
|
|
- .set_pio_mode = cs5536_set_pio_mode,
|
|
- .set_dma_mode = cs5536_set_dma_mode,
|
|
- .cable_detect = cs5536_cable_detect,
|
|
-};
|
|
-
|
|
-static const struct ide_dma_ops cs5536_dma_ops = {
|
|
- .dma_host_set = ide_dma_host_set,
|
|
- .dma_setup = ide_dma_setup,
|
|
- .dma_exec_cmd = ide_dma_exec_cmd,
|
|
- .dma_start = cs5536_dma_start,
|
|
- .dma_end = cs5536_dma_end,
|
|
- .dma_test_irq = ide_dma_test_irq,
|
|
- .dma_lost_irq = ide_dma_lost_irq,
|
|
- .dma_timeout = ide_dma_timeout,
|
|
-};
|
|
-
|
|
-static const struct ide_port_info cs5536_info = {
|
|
- .name = DRV_NAME,
|
|
- .port_ops = &cs5536_port_ops,
|
|
- .dma_ops = &cs5536_dma_ops,
|
|
- .host_flags = IDE_HFLAG_SINGLE,
|
|
- .pio_mask = ATA_PIO4,
|
|
- .mwdma_mask = ATA_MWDMA2,
|
|
- .udma_mask = ATA_UDMA5,
|
|
-};
|
|
-
|
|
-/**
|
|
- * cs5536_init_one
|
|
- * @dev: PCI device
|
|
- * @id: Entry in match table
|
|
- */
|
|
-
|
|
-static int cs5536_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|
-{
|
|
- u32 cfg;
|
|
-
|
|
- if (use_msr)
|
|
- printk(KERN_INFO DRV_NAME ": Using MSR regs instead of PCI\n");
|
|
-
|
|
- cs5536_read(dev, CFG, &cfg);
|
|
-
|
|
- if ((cfg & IDE_CFG_CHANEN) == 0) {
|
|
- printk(KERN_ERR DRV_NAME ": disabled by BIOS\n");
|
|
- return -ENODEV;
|
|
- }
|
|
-
|
|
- return ide_pci_init_one(dev, &cs5536_info, NULL);
|
|
-}
|
|
-
|
|
-static const struct pci_device_id cs5536_pci_tbl[] = {
|
|
- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_IDE), },
|
|
- { },
|
|
-};
|
|
-
|
|
-static struct pci_driver cs5536_pci_driver = {
|
|
- .name = DRV_NAME,
|
|
- .id_table = cs5536_pci_tbl,
|
|
- .probe = cs5536_init_one,
|
|
- .remove = ide_pci_remove,
|
|
- .suspend = ide_pci_suspend,
|
|
- .resume = ide_pci_resume,
|
|
-};
|
|
-
|
|
-static int __init cs5536_init(void)
|
|
-{
|
|
- return pci_register_driver(&cs5536_pci_driver);
|
|
-}
|
|
-
|
|
-static void __exit cs5536_exit(void)
|
|
-{
|
|
- pci_unregister_driver(&cs5536_pci_driver);
|
|
-}
|
|
-
|
|
-MODULE_AUTHOR("Martin K. Petersen, Bartlomiej Zolnierkiewicz");
|
|
-MODULE_DESCRIPTION("low-level driver for the CS5536 IDE controller");
|
|
-MODULE_LICENSE("GPL");
|
|
-MODULE_DEVICE_TABLE(pci, cs5536_pci_tbl);
|
|
-
|
|
-module_param_named(msr, use_msr, int, 0644);
|
|
-MODULE_PARM_DESC(msr, "Force using MSR to configure IDE function (Default: 0)");
|
|
-
|
|
-module_init(cs5536_init);
|
|
-module_exit(cs5536_exit);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/icside.c linux-2.6.29-rc3.owrt/drivers/ide/icside.c
|
|
--- linux-2.6.29.owrt/drivers/ide/icside.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/icside.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -534,7 +534,7 @@
|
|
d.dma_ops = NULL;
|
|
}
|
|
|
|
- ret = ide_host_register(host, &d, hws);
|
|
+ ret = ide_host_register(host, NULL, hws);
|
|
if (ret)
|
|
goto err_free;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-acpi.c linux-2.6.29-rc3.owrt/drivers/ide/ide-acpi.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-acpi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-acpi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -282,7 +282,7 @@
|
|
port = hwif->channel ? drive->dn - 2: drive->dn;
|
|
|
|
DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n",
|
|
- hwif->name, dev_name(dev), port, hwif->channel);
|
|
+ hwif->name, dev->bus_id, port, hwif->channel);
|
|
|
|
if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) {
|
|
DEBPRINT("%s drive %d:%d not present\n",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-atapi.c linux-2.6.29-rc3.owrt/drivers/ide/ide-atapi.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-atapi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-atapi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -140,12 +140,6 @@
|
|
rq->cmd_flags |= REQ_PREEMPT;
|
|
rq->buffer = (char *)pc;
|
|
rq->rq_disk = disk;
|
|
-
|
|
- if (pc->req_xfer) {
|
|
- rq->data = pc->buf;
|
|
- rq->data_len = pc->req_xfer;
|
|
- }
|
|
-
|
|
memcpy(rq->cmd, pc->c, 12);
|
|
if (drive->media == ide_tape)
|
|
rq->cmd[13] = REQ_IDETAPE_PC1;
|
|
@@ -165,12 +159,6 @@
|
|
rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
|
|
rq->cmd_type = REQ_TYPE_SPECIAL;
|
|
rq->buffer = (char *)pc;
|
|
-
|
|
- if (pc->req_xfer) {
|
|
- rq->data = pc->buf;
|
|
- rq->data_len = pc->req_xfer;
|
|
- }
|
|
-
|
|
memcpy(rq->cmd, pc->c, 12);
|
|
if (drive->media == ide_tape)
|
|
rq->cmd[13] = REQ_IDETAPE_PC1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide.c linux-2.6.29-rc3.owrt/drivers/ide/ide.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -337,7 +337,6 @@
|
|
int a, b, i, j = 1;
|
|
unsigned int *dev_param_mask = (unsigned int *)kp->arg;
|
|
|
|
- /* controller . device (0 or 1) [ : 1 (set) | 0 (clear) ] */
|
|
if (sscanf(s, "%d.%d:%d", &a, &b, &j) != 3 &&
|
|
sscanf(s, "%d.%d", &a, &b) != 2)
|
|
return -EINVAL;
|
|
@@ -350,7 +349,7 @@
|
|
if (j)
|
|
*dev_param_mask |= (1 << i);
|
|
else
|
|
- *dev_param_mask &= ~(1 << i);
|
|
+ *dev_param_mask &= (1 << i);
|
|
|
|
return 0;
|
|
}
|
|
@@ -393,8 +392,6 @@
|
|
{
|
|
int a, b, c = 0, h = 0, s = 0, i, j = 1;
|
|
|
|
- /* controller . device (0 or 1) : Cylinders , Heads , Sectors */
|
|
- /* controller . device (0 or 1) : 1 (use CHS) | 0 (ignore CHS) */
|
|
if (sscanf(str, "%d.%d:%d,%d,%d", &a, &b, &c, &h, &s) != 5 &&
|
|
sscanf(str, "%d.%d:%d", &a, &b, &j) != 3)
|
|
return -EINVAL;
|
|
@@ -410,7 +407,7 @@
|
|
if (j)
|
|
ide_disks |= (1 << i);
|
|
else
|
|
- ide_disks &= ~(1 << i);
|
|
+ ide_disks &= (1 << i);
|
|
|
|
ide_disks_chs[i].cyl = c;
|
|
ide_disks_chs[i].head = h;
|
|
@@ -472,8 +469,6 @@
|
|
{
|
|
int i, j = 1;
|
|
|
|
- /* controller (ignore) */
|
|
- /* controller : 1 (ignore) | 0 (use) */
|
|
if (sscanf(s, "%d:%d", &i, &j) != 2 && sscanf(s, "%d", &i) != 1)
|
|
return -EINVAL;
|
|
|
|
@@ -483,7 +478,7 @@
|
|
if (j)
|
|
ide_ignore_cable |= (1 << i);
|
|
else
|
|
- ide_ignore_cable &= ~(1 << i);
|
|
+ ide_ignore_cable &= (1 << i);
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-cd.c linux-2.6.29-rc3.owrt/drivers/ide/ide-cd.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-cd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-cd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -55,7 +55,7 @@
|
|
|
|
static DEFINE_MUTEX(idecd_ref_mutex);
|
|
|
|
-static void ide_cd_release(struct device *);
|
|
+static void ide_cd_release(struct kref *);
|
|
|
|
static struct cdrom_info *ide_cd_get(struct gendisk *disk)
|
|
{
|
|
@@ -67,7 +67,7 @@
|
|
if (ide_device_get(cd->drive))
|
|
cd = NULL;
|
|
else
|
|
- get_device(&cd->dev);
|
|
+ kref_get(&cd->kref);
|
|
|
|
}
|
|
mutex_unlock(&idecd_ref_mutex);
|
|
@@ -79,7 +79,7 @@
|
|
ide_drive_t *drive = cd->drive;
|
|
|
|
mutex_lock(&idecd_ref_mutex);
|
|
- put_device(&cd->dev);
|
|
+ kref_put(&cd->kref, ide_cd_release);
|
|
ide_device_put(drive);
|
|
mutex_unlock(&idecd_ref_mutex);
|
|
}
|
|
@@ -194,14 +194,6 @@
|
|
bio_sectors = max(bio_sectors(failed_command->bio), 4U);
|
|
sector &= ~(bio_sectors - 1);
|
|
|
|
- /*
|
|
- * The SCSI specification allows for the value
|
|
- * returned by READ CAPACITY to be up to 75 2K
|
|
- * sectors past the last readable block.
|
|
- * Therefore, if we hit a medium error within the
|
|
- * last 75 2K sectors, we decrease the saved size
|
|
- * value.
|
|
- */
|
|
if (sector < get_capacity(info->disk) &&
|
|
drive->probed_capacity - sector < 4 * 75)
|
|
set_capacity(info->disk, sector);
|
|
@@ -795,9 +787,6 @@
|
|
if (blk_fs_request(rq)) {
|
|
ide_end_request(drive, 1, rq->nr_sectors);
|
|
return ide_stopped;
|
|
- } else if (rq->cmd_type == REQ_TYPE_ATA_PC && !rq->bio) {
|
|
- ide_end_request(drive, 1, 1);
|
|
- return ide_stopped;
|
|
}
|
|
goto end_request;
|
|
}
|
|
@@ -1798,17 +1787,15 @@
|
|
ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__);
|
|
|
|
ide_proc_unregister_driver(drive, info->driver);
|
|
- device_del(&info->dev);
|
|
+
|
|
del_gendisk(info->disk);
|
|
|
|
- mutex_lock(&idecd_ref_mutex);
|
|
- put_device(&info->dev);
|
|
- mutex_unlock(&idecd_ref_mutex);
|
|
+ ide_cd_put(info);
|
|
}
|
|
|
|
-static void ide_cd_release(struct device *dev)
|
|
+static void ide_cd_release(struct kref *kref)
|
|
{
|
|
- struct cdrom_info *info = to_ide_drv(dev, cdrom_info);
|
|
+ struct cdrom_info *info = to_ide_drv(kref, cdrom_info);
|
|
struct cdrom_device_info *devinfo = &info->devinfo;
|
|
ide_drive_t *drive = info->drive;
|
|
struct gendisk *g = info->disk;
|
|
@@ -2007,12 +1994,7 @@
|
|
|
|
ide_init_disk(g, drive);
|
|
|
|
- info->dev.parent = &drive->gendev;
|
|
- info->dev.release = ide_cd_release;
|
|
- dev_set_name(&info->dev, dev_name(&drive->gendev));
|
|
-
|
|
- if (device_register(&info->dev))
|
|
- goto out_free_disk;
|
|
+ kref_init(&info->kref);
|
|
|
|
info->drive = drive;
|
|
info->driver = &ide_cdrom_driver;
|
|
@@ -2026,7 +2008,7 @@
|
|
g->driverfs_dev = &drive->gendev;
|
|
g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
|
|
if (ide_cdrom_setup(drive)) {
|
|
- put_device(&info->dev);
|
|
+ ide_cd_release(&info->kref);
|
|
goto failed;
|
|
}
|
|
|
|
@@ -2036,8 +2018,6 @@
|
|
add_disk(g);
|
|
return 0;
|
|
|
|
-out_free_disk:
|
|
- put_disk(g);
|
|
out_free_cd:
|
|
kfree(info);
|
|
failed:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-cd.h linux-2.6.29-rc3.owrt/drivers/ide/ide-cd.h
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-cd.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-cd.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -80,7 +80,7 @@
|
|
ide_drive_t *drive;
|
|
struct ide_driver *driver;
|
|
struct gendisk *disk;
|
|
- struct device dev;
|
|
+ struct kref kref;
|
|
|
|
/* Buffer for table of contents. NULL if we haven't allocated
|
|
a TOC buffer for this device yet. */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-disk_proc.c linux-2.6.29-rc3.owrt/drivers/ide/ide-disk_proc.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-disk_proc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-disk_proc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -125,5 +125,5 @@
|
|
IDE_PROC_DEVSET(multcount, 0, 16),
|
|
IDE_PROC_DEVSET(nowerr, 0, 1),
|
|
IDE_PROC_DEVSET(wcache, 0, 1),
|
|
- { NULL },
|
|
+ { 0 },
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-dma.c linux-2.6.29-rc3.owrt/drivers/ide/ide-dma.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-dma.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-dma.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -128,7 +128,6 @@
|
|
{
|
|
ide_hwif_t *hwif = drive->hwif;
|
|
struct scatterlist *sg = hwif->sg_table;
|
|
- int i;
|
|
|
|
ide_map_sg(drive, rq);
|
|
|
|
@@ -137,13 +136,8 @@
|
|
else
|
|
hwif->sg_dma_direction = DMA_TO_DEVICE;
|
|
|
|
- i = dma_map_sg(hwif->dev, sg, hwif->sg_nents, hwif->sg_dma_direction);
|
|
- if (i) {
|
|
- hwif->orig_sg_nents = hwif->sg_nents;
|
|
- hwif->sg_nents = i;
|
|
- }
|
|
-
|
|
- return i;
|
|
+ return dma_map_sg(hwif->dev, sg, hwif->sg_nents,
|
|
+ hwif->sg_dma_direction);
|
|
}
|
|
EXPORT_SYMBOL_GPL(ide_build_sglist);
|
|
|
|
@@ -162,7 +156,7 @@
|
|
{
|
|
ide_hwif_t *hwif = drive->hwif;
|
|
|
|
- dma_unmap_sg(hwif->dev, hwif->sg_table, hwif->orig_sg_nents,
|
|
+ dma_unmap_sg(hwif->dev, hwif->sg_table, hwif->sg_nents,
|
|
hwif->sg_dma_direction);
|
|
}
|
|
EXPORT_SYMBOL_GPL(ide_destroy_dmatable);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-floppy.c linux-2.6.29-rc3.owrt/drivers/ide/ide-floppy.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-floppy.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-floppy.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -327,10 +327,8 @@
|
|
return ide_stopped;
|
|
}
|
|
|
|
- if (blk_fs_request(rq) || pc->req_xfer) {
|
|
- ide_init_sg_cmd(drive, rq);
|
|
- ide_map_sg(drive, rq);
|
|
- }
|
|
+ ide_init_sg_cmd(drive, rq);
|
|
+ ide_map_sg(drive, rq);
|
|
|
|
pc->sg = hwif->sg_table;
|
|
pc->sg_cnt = hwif->sg_nents;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-floppy_proc.c linux-2.6.29-rc3.owrt/drivers/ide/ide-floppy_proc.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-floppy_proc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-floppy_proc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -29,5 +29,5 @@
|
|
IDE_PROC_DEVSET(bios_head, 0, 255),
|
|
IDE_PROC_DEVSET(bios_sect, 0, 63),
|
|
IDE_PROC_DEVSET(ticks, 0, 255),
|
|
- { NULL },
|
|
+ { 0 },
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-gd.c linux-2.6.29-rc3.owrt/drivers/ide/ide-gd.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-gd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-gd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -25,7 +25,7 @@
|
|
|
|
static DEFINE_MUTEX(ide_disk_ref_mutex);
|
|
|
|
-static void ide_disk_release(struct device *);
|
|
+static void ide_disk_release(struct kref *);
|
|
|
|
static struct ide_disk_obj *ide_disk_get(struct gendisk *disk)
|
|
{
|
|
@@ -37,7 +37,7 @@
|
|
if (ide_device_get(idkp->drive))
|
|
idkp = NULL;
|
|
else
|
|
- get_device(&idkp->dev);
|
|
+ kref_get(&idkp->kref);
|
|
}
|
|
mutex_unlock(&ide_disk_ref_mutex);
|
|
return idkp;
|
|
@@ -48,7 +48,7 @@
|
|
ide_drive_t *drive = idkp->drive;
|
|
|
|
mutex_lock(&ide_disk_ref_mutex);
|
|
- put_device(&idkp->dev);
|
|
+ kref_put(&idkp->kref, ide_disk_release);
|
|
ide_device_put(drive);
|
|
mutex_unlock(&ide_disk_ref_mutex);
|
|
}
|
|
@@ -66,18 +66,17 @@
|
|
struct gendisk *g = idkp->disk;
|
|
|
|
ide_proc_unregister_driver(drive, idkp->driver);
|
|
- device_del(&idkp->dev);
|
|
+
|
|
del_gendisk(g);
|
|
+
|
|
drive->disk_ops->flush(drive);
|
|
|
|
- mutex_lock(&ide_disk_ref_mutex);
|
|
- put_device(&idkp->dev);
|
|
- mutex_unlock(&ide_disk_ref_mutex);
|
|
+ ide_disk_put(idkp);
|
|
}
|
|
|
|
-static void ide_disk_release(struct device *dev)
|
|
+static void ide_disk_release(struct kref *kref)
|
|
{
|
|
- struct ide_disk_obj *idkp = to_ide_drv(dev, ide_disk_obj);
|
|
+ struct ide_disk_obj *idkp = to_ide_drv(kref, ide_disk_obj);
|
|
ide_drive_t *drive = idkp->drive;
|
|
struct gendisk *g = idkp->disk;
|
|
|
|
@@ -349,12 +348,7 @@
|
|
|
|
ide_init_disk(g, drive);
|
|
|
|
- idkp->dev.parent = &drive->gendev;
|
|
- idkp->dev.release = ide_disk_release;
|
|
- dev_set_name(&idkp->dev, dev_name(&drive->gendev));
|
|
-
|
|
- if (device_register(&idkp->dev))
|
|
- goto out_free_disk;
|
|
+ kref_init(&idkp->kref);
|
|
|
|
idkp->drive = drive;
|
|
idkp->driver = &ide_gd_driver;
|
|
@@ -379,8 +373,6 @@
|
|
add_disk(g);
|
|
return 0;
|
|
|
|
-out_free_disk:
|
|
- put_disk(g);
|
|
out_free_idkp:
|
|
kfree(idkp);
|
|
failed:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-gd.h linux-2.6.29-rc3.owrt/drivers/ide/ide-gd.h
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-gd.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-gd.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -17,7 +17,7 @@
|
|
ide_drive_t *drive;
|
|
struct ide_driver *driver;
|
|
struct gendisk *disk;
|
|
- struct device dev;
|
|
+ struct kref kref;
|
|
unsigned int openers; /* protected by BKL for now */
|
|
|
|
/* Last failed packet command */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-io.c linux-2.6.29-rc3.owrt/drivers/ide/ide-io.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-io.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-io.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -418,14 +418,11 @@
|
|
ide_hwif_t *hwif = drive->hwif;
|
|
struct scatterlist *sg = hwif->sg_table;
|
|
|
|
- if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
|
|
+ if (rq->cmd_type != REQ_TYPE_ATA_TASKFILE) {
|
|
+ hwif->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
|
|
+ } else {
|
|
sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE);
|
|
hwif->sg_nents = 1;
|
|
- } else if (!rq->bio) {
|
|
- sg_init_one(sg, rq->data, rq->data_len);
|
|
- hwif->sg_nents = 1;
|
|
- } else {
|
|
- hwif->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
|
|
}
|
|
}
|
|
|
|
@@ -908,7 +905,7 @@
|
|
ide_drive_t *uninitialized_var(drive);
|
|
ide_handler_t *handler;
|
|
unsigned long flags;
|
|
- int wait = -1;
|
|
+ unsigned long wait = -1;
|
|
int plug_device = 0;
|
|
|
|
spin_lock_irqsave(&hwif->lock, flags);
|
|
@@ -1162,7 +1159,6 @@
|
|
|
|
return irq_ret;
|
|
}
|
|
-EXPORT_SYMBOL_GPL(ide_intr);
|
|
|
|
/**
|
|
* ide_do_drive_cmd - issue IDE special command
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-iops.c linux-2.6.29-rc3.owrt/drivers/ide/ide-iops.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-iops.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-iops.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -315,8 +315,6 @@
|
|
u8 io_32bit = drive->io_32bit;
|
|
u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
|
|
|
|
- len++;
|
|
-
|
|
if (io_32bit) {
|
|
unsigned long uninitialized_var(flags);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-probe.c linux-2.6.29-rc3.owrt/drivers/ide/ide-probe.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-probe.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-probe.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -950,7 +950,6 @@
|
|
static int init_irq (ide_hwif_t *hwif)
|
|
{
|
|
struct ide_io_ports *io_ports = &hwif->io_ports;
|
|
- irq_handler_t irq_handler;
|
|
int sa = 0;
|
|
|
|
mutex_lock(&ide_cfg_mtx);
|
|
@@ -960,10 +959,6 @@
|
|
hwif->timer.function = &ide_timer_expiry;
|
|
hwif->timer.data = (unsigned long)hwif;
|
|
|
|
- irq_handler = hwif->host->irq_handler;
|
|
- if (irq_handler == NULL)
|
|
- irq_handler = ide_intr;
|
|
-
|
|
#if defined(__mc68000__)
|
|
sa = IRQF_SHARED;
|
|
#endif /* __mc68000__ */
|
|
@@ -974,7 +969,7 @@
|
|
if (io_ports->ctl_addr)
|
|
hwif->tp_ops->set_irq(hwif, 1);
|
|
|
|
- if (request_irq(hwif->irq, irq_handler, sa, hwif->name, hwif))
|
|
+ if (request_irq(hwif->irq, &ide_intr, sa, hwif->name, hwif))
|
|
goto out_up;
|
|
|
|
if (!hwif->rqsize) {
|
|
@@ -1472,30 +1467,6 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(ide_host_alloc);
|
|
|
|
-static void ide_port_free(ide_hwif_t *hwif)
|
|
-{
|
|
- ide_port_free_devices(hwif);
|
|
- ide_free_port_slot(hwif->index);
|
|
- kfree(hwif);
|
|
-}
|
|
-
|
|
-static void ide_disable_port(ide_hwif_t *hwif)
|
|
-{
|
|
- struct ide_host *host = hwif->host;
|
|
- int i;
|
|
-
|
|
- printk(KERN_INFO "%s: disabling port\n", hwif->name);
|
|
-
|
|
- for (i = 0; i < MAX_HOST_PORTS; i++) {
|
|
- if (host->ports[i] == hwif) {
|
|
- host->ports[i] = NULL;
|
|
- host->n_ports--;
|
|
- }
|
|
- }
|
|
-
|
|
- ide_port_free(hwif);
|
|
-}
|
|
-
|
|
int ide_host_register(struct ide_host *host, const struct ide_port_info *d,
|
|
hw_regs_t **hws)
|
|
{
|
|
@@ -1536,12 +1507,8 @@
|
|
hwif->present = 1;
|
|
|
|
if (hwif->chipset != ide_4drives || !hwif->mate ||
|
|
- !hwif->mate->present) {
|
|
- if (ide_register_port(hwif)) {
|
|
- ide_disable_port(hwif);
|
|
- continue;
|
|
- }
|
|
- }
|
|
+ !hwif->mate->present)
|
|
+ ide_register_port(hwif);
|
|
|
|
if (hwif->present)
|
|
ide_port_tune_devices(hwif);
|
|
@@ -1554,8 +1521,7 @@
|
|
if (hwif_init(hwif) == 0) {
|
|
printk(KERN_INFO "%s: failed to initialize IDE "
|
|
"interface\n", hwif->name);
|
|
- device_unregister(&hwif->gendev);
|
|
- ide_disable_port(hwif);
|
|
+ hwif->present = 0;
|
|
continue;
|
|
}
|
|
|
|
@@ -1694,8 +1660,12 @@
|
|
int i;
|
|
|
|
ide_host_for_each_port(i, hwif, host) {
|
|
- if (hwif)
|
|
- ide_port_free(hwif);
|
|
+ if (hwif == NULL)
|
|
+ continue;
|
|
+
|
|
+ ide_port_free_devices(hwif);
|
|
+ ide_free_port_slot(hwif->index);
|
|
+ kfree(hwif);
|
|
}
|
|
|
|
kfree(host);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-proc.c linux-2.6.29-rc3.owrt/drivers/ide/ide-proc.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-proc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-proc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -231,7 +231,7 @@
|
|
IDE_PROC_DEVSET(pio_mode, 0, 255),
|
|
IDE_PROC_DEVSET(unmaskirq, 0, 1),
|
|
IDE_PROC_DEVSET(using_dma, 0, 1),
|
|
- { NULL },
|
|
+ { 0 },
|
|
};
|
|
|
|
static void proc_ide_settings_warn(void)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/ide-tape.c linux-2.6.29-rc3.owrt/drivers/ide/ide-tape.c
|
|
--- linux-2.6.29.owrt/drivers/ide/ide-tape.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/ide-tape.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -169,7 +169,7 @@
|
|
ide_drive_t *drive;
|
|
struct ide_driver *driver;
|
|
struct gendisk *disk;
|
|
- struct device dev;
|
|
+ struct kref kref;
|
|
|
|
/*
|
|
* failed_pc points to the last failed packet command, or contains
|
|
@@ -267,7 +267,7 @@
|
|
|
|
static struct class *idetape_sysfs_class;
|
|
|
|
-static void ide_tape_release(struct device *);
|
|
+static void ide_tape_release(struct kref *);
|
|
|
|
static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
|
|
{
|
|
@@ -279,7 +279,7 @@
|
|
if (ide_device_get(tape->drive))
|
|
tape = NULL;
|
|
else
|
|
- get_device(&tape->dev);
|
|
+ kref_get(&tape->kref);
|
|
}
|
|
mutex_unlock(&idetape_ref_mutex);
|
|
return tape;
|
|
@@ -290,7 +290,7 @@
|
|
ide_drive_t *drive = tape->drive;
|
|
|
|
mutex_lock(&idetape_ref_mutex);
|
|
- put_device(&tape->dev);
|
|
+ kref_put(&tape->kref, ide_tape_release);
|
|
ide_device_put(drive);
|
|
mutex_unlock(&idetape_ref_mutex);
|
|
}
|
|
@@ -308,7 +308,7 @@
|
|
mutex_lock(&idetape_ref_mutex);
|
|
tape = idetape_devs[i];
|
|
if (tape)
|
|
- get_device(&tape->dev);
|
|
+ kref_get(&tape->kref);
|
|
mutex_unlock(&idetape_ref_mutex);
|
|
return tape;
|
|
}
|
|
@@ -2166,7 +2166,7 @@
|
|
__IDE_PROC_DEVSET(speed, 0, 0xffff, NULL, NULL),
|
|
__IDE_PROC_DEVSET(tdsc, IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX,
|
|
mulf_tdsc, divf_tdsc),
|
|
- { NULL },
|
|
+ { 0 },
|
|
};
|
|
#endif
|
|
|
|
@@ -2256,17 +2256,15 @@
|
|
idetape_tape_t *tape = drive->driver_data;
|
|
|
|
ide_proc_unregister_driver(drive, tape->driver);
|
|
- device_del(&tape->dev);
|
|
+
|
|
ide_unregister_region(tape->disk);
|
|
|
|
- mutex_lock(&idetape_ref_mutex);
|
|
- put_device(&tape->dev);
|
|
- mutex_unlock(&idetape_ref_mutex);
|
|
+ ide_tape_put(tape);
|
|
}
|
|
|
|
-static void ide_tape_release(struct device *dev)
|
|
+static void ide_tape_release(struct kref *kref)
|
|
{
|
|
- struct ide_tape_obj *tape = to_ide_drv(dev, ide_tape_obj);
|
|
+ struct ide_tape_obj *tape = to_ide_drv(kref, ide_tape_obj);
|
|
ide_drive_t *drive = tape->drive;
|
|
struct gendisk *g = tape->disk;
|
|
|
|
@@ -2409,12 +2407,7 @@
|
|
|
|
ide_init_disk(g, drive);
|
|
|
|
- tape->dev.parent = &drive->gendev;
|
|
- tape->dev.release = ide_tape_release;
|
|
- dev_set_name(&tape->dev, dev_name(&drive->gendev));
|
|
-
|
|
- if (device_register(&tape->dev))
|
|
- goto out_free_disk;
|
|
+ kref_init(&tape->kref);
|
|
|
|
tape->drive = drive;
|
|
tape->driver = &idetape_driver;
|
|
@@ -2443,8 +2436,6 @@
|
|
|
|
return 0;
|
|
|
|
-out_free_disk:
|
|
- put_disk(g);
|
|
out_free_tape:
|
|
kfree(tape);
|
|
failed:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/it821x.c linux-2.6.29-rc3.owrt/drivers/ide/it821x.c
|
|
--- linux-2.6.29.owrt/drivers/ide/it821x.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/it821x.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -5,8 +5,9 @@
|
|
* May be copied or modified under the terms of the GNU General Public License
|
|
* Based in part on the ITE vendor provided SCSI driver.
|
|
*
|
|
- * Documentation:
|
|
- * Datasheet is freely available, some other documents under NDA.
|
|
+ * Documentation available from
|
|
+ * http://www.ite.com.tw/pc/IT8212F_V04.pdf
|
|
+ * Some other documents are NDA.
|
|
*
|
|
* The ITE8212 isn't exactly a standard IDE controller. It has two
|
|
* modes. In pass through mode then it is an IDE controller. In its smart
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/Kconfig linux-2.6.29-rc3.owrt/drivers/ide/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/ide/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -46,7 +46,7 @@
|
|
SMART parameters from disk drives.
|
|
|
|
To compile this driver as a module, choose M here: the
|
|
- module will be called ide-core.ko.
|
|
+ module will be called ide.
|
|
|
|
For further information, please read <file:Documentation/ide/ide.txt>.
|
|
|
|
@@ -465,16 +465,6 @@
|
|
|
|
It is safe to say Y to this question.
|
|
|
|
-config BLK_DEV_CS5536
|
|
- tristate "CS5536 chipset support"
|
|
- depends on X86_32
|
|
- select BLK_DEV_IDEDMA_PCI
|
|
- help
|
|
- This option enables support for the AMD CS5536
|
|
- companion chip used with the Geode LX processor family.
|
|
-
|
|
- If unsure, say N.
|
|
-
|
|
config BLK_DEV_HPT366
|
|
tristate "HPT36X/37X chipset support"
|
|
select BLK_DEV_IDEDMA_PCI
|
|
@@ -721,11 +711,6 @@
|
|
depends on SOC_TX4939
|
|
select BLK_DEV_IDEDMA_SFF
|
|
|
|
-config BLK_DEV_IDE_AT91
|
|
- tristate "Atmel AT91 (SAM9, CAP9, AT572D940HF) IDE support"
|
|
- depends on ARM && ARCH_AT91 && !ARCH_AT91RM9200 && !ARCH_AT91X40
|
|
- select IDE_TIMINGS
|
|
-
|
|
config IDE_ARM
|
|
tristate "ARM IDE support"
|
|
depends on ARM && (ARCH_RPC || ARCH_SHARK)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/Makefile linux-2.6.29-rc3.owrt/drivers/ide/Makefile
|
|
--- linux-2.6.29.owrt/drivers/ide/Makefile 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -43,7 +43,6 @@
|
|
obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o
|
|
obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o
|
|
obj-$(CONFIG_BLK_DEV_CS5535) += cs5535.o
|
|
-obj-$(CONFIG_BLK_DEV_CS5536) += cs5536.o
|
|
obj-$(CONFIG_BLK_DEV_SC1200) += sc1200.o
|
|
obj-$(CONFIG_BLK_DEV_CY82C693) += cy82c693.o
|
|
obj-$(CONFIG_BLK_DEV_DELKIN) += delkin_cb.o
|
|
@@ -116,4 +115,3 @@
|
|
|
|
obj-$(CONFIG_BLK_DEV_IDE_TX4938) += tx4938ide.o
|
|
obj-$(CONFIG_BLK_DEV_IDE_TX4939) += tx4939ide.o
|
|
-obj-$(CONFIG_BLK_DEV_IDE_AT91) += at91_ide.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/qd65xx.c linux-2.6.29-rc3.owrt/drivers/ide/qd65xx.c
|
|
--- linux-2.6.29.owrt/drivers/ide/qd65xx.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/qd65xx.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -16,7 +16,7 @@
|
|
|
|
/*
|
|
* Rewritten from the work of Colten Edwards <pje120@cs.usask.ca> by
|
|
- * Samuel Thibault <samuel.thibault@ens-lyon.org>
|
|
+ * Samuel Thibault <samuel.thibault@fnac.net>
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/qd65xx.h linux-2.6.29-rc3.owrt/drivers/ide/qd65xx.h
|
|
--- linux-2.6.29.owrt/drivers/ide/qd65xx.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/qd65xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -4,7 +4,7 @@
|
|
|
|
/*
|
|
* Authors: Petr Soucek <petr@ryston.cz>
|
|
- * Samuel Thibault <samuel.thibault@ens-lyon.org>
|
|
+ * Samuel Thibault <samuel.thibault@fnac.net>
|
|
*/
|
|
|
|
/* truncates a in [b,c] */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/tx4939ide.c linux-2.6.29-rc3.owrt/drivers/ide/tx4939ide.c
|
|
--- linux-2.6.29.owrt/drivers/ide/tx4939ide.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/tx4939ide.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -261,9 +261,9 @@
|
|
bcount = cur_len;
|
|
/*
|
|
* This workaround for zero count seems required.
|
|
- * (standard ide_build_dmatable does it too)
|
|
+ * (standard ide_build_dmatable do it too)
|
|
*/
|
|
- if (bcount == 0x10000)
|
|
+ if ((bcount & 0xffff) == 0x0000)
|
|
bcount = 0x8000;
|
|
*table++ = bcount & 0xffff;
|
|
*table++ = cur_addr;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ide/via82cxxx.c linux-2.6.29-rc3.owrt/drivers/ide/via82cxxx.c
|
|
--- linux-2.6.29.owrt/drivers/ide/via82cxxx.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ide/via82cxxx.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -448,11 +448,6 @@
|
|
d.host_flags |= IDE_HFLAG_FORCE_LEGACY_IRQS;
|
|
#endif
|
|
|
|
-#ifdef CONFIG_AMIGAONE
|
|
- if (machine_is(amigaone))
|
|
- d.host_flags |= IDE_HFLAG_FORCE_LEGACY_IRQS;
|
|
-#endif
|
|
-
|
|
d.udma_mask = via_config->udma_mask;
|
|
|
|
vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/dma.h linux-2.6.29-rc3.owrt/drivers/ieee1394/dma.h
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/dma.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/dma.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -12,7 +12,6 @@
|
|
|
|
#include <asm/types.h>
|
|
|
|
-struct file;
|
|
struct pci_dev;
|
|
struct scatterlist;
|
|
struct vm_area_struct;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/dv1394.c linux-2.6.29-rc3.owrt/drivers/ieee1394/dv1394.c
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/dv1394.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/dv1394.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1823,10 +1823,6 @@
|
|
|
|
#endif
|
|
|
|
- printk(KERN_INFO "%s: NOTE, the dv1394 interface is unsupported "
|
|
- "and will not be available in the new firewire driver stack. "
|
|
- "Try libraw1394 based programs instead.\n", current->comm);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -2571,6 +2567,10 @@
|
|
{
|
|
int ret;
|
|
|
|
+ printk(KERN_WARNING
|
|
+ "NOTE: The dv1394 driver is unsupported and may be removed in a "
|
|
+ "future Linux release. Use raw1394 instead.\n");
|
|
+
|
|
cdev_init(&dv1394_cdev, &dv1394_fops);
|
|
dv1394_cdev.owner = THIS_MODULE;
|
|
ret = cdev_add(&dv1394_cdev, IEEE1394_DV1394_DEV, 16);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/ieee1394_core.c linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_core.c
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/ieee1394_core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -338,7 +338,6 @@
|
|
u8 cldcnt[nodecount];
|
|
u8 *map = host->speed_map;
|
|
u8 *speedcap = host->speed;
|
|
- u8 local_link_speed = host->csr.lnk_spd;
|
|
struct selfid *sid;
|
|
struct ext_selfid *esid;
|
|
int i, j, n;
|
|
@@ -374,8 +373,8 @@
|
|
if (sid->port2 == SELFID_PORT_CHILD) cldcnt[n]++;
|
|
|
|
speedcap[n] = sid->speed;
|
|
- if (speedcap[n] > local_link_speed)
|
|
- speedcap[n] = local_link_speed;
|
|
+ if (speedcap[n] > host->csr.lnk_spd)
|
|
+ speedcap[n] = host->csr.lnk_spd;
|
|
n--;
|
|
}
|
|
}
|
|
@@ -408,11 +407,12 @@
|
|
}
|
|
}
|
|
|
|
- /* assume a maximum speed for 1394b PHYs, nodemgr will correct it */
|
|
- if (local_link_speed > SELFID_SPEED_UNKNOWN)
|
|
- for (i = 0; i < nodecount; i++)
|
|
- if (speedcap[i] == SELFID_SPEED_UNKNOWN)
|
|
- speedcap[i] = local_link_speed;
|
|
+#if SELFID_SPEED_UNKNOWN != IEEE1394_SPEED_MAX
|
|
+ /* assume maximum speed for 1394b PHYs, nodemgr will correct it */
|
|
+ for (n = 0; n < nodecount; n++)
|
|
+ if (speedcap[n] == SELFID_SPEED_UNKNOWN)
|
|
+ speedcap[n] = IEEE1394_SPEED_MAX;
|
|
+#endif
|
|
}
|
|
|
|
|
|
@@ -1275,7 +1275,7 @@
|
|
unregister_chrdev_region(IEEE1394_CORE_DEV, 256);
|
|
}
|
|
|
|
-fs_initcall(ieee1394_init);
|
|
+module_init(ieee1394_init);
|
|
module_exit(ieee1394_cleanup);
|
|
|
|
/* Exported symbols */
|
|
@@ -1314,7 +1314,6 @@
|
|
EXPORT_SYMBOL(hpsb_make_phypacket);
|
|
EXPORT_SYMBOL(hpsb_read);
|
|
EXPORT_SYMBOL(hpsb_write);
|
|
-EXPORT_SYMBOL(hpsb_lock);
|
|
EXPORT_SYMBOL(hpsb_packet_success);
|
|
|
|
/** highlevel.c **/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/ieee1394.h linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394.h
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/ieee1394.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -54,7 +54,9 @@
|
|
#define IEEE1394_SPEED_800 0x03
|
|
#define IEEE1394_SPEED_1600 0x04
|
|
#define IEEE1394_SPEED_3200 0x05
|
|
-#define IEEE1394_SPEED_MAX IEEE1394_SPEED_3200
|
|
+
|
|
+/* The current highest tested speed supported by the subsystem */
|
|
+#define IEEE1394_SPEED_MAX IEEE1394_SPEED_800
|
|
|
|
/* Maps speed values above to a string representation */
|
|
extern const char *hpsb_speedto_str[];
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/ieee1394_transactions.c linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_transactions.c
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/ieee1394_transactions.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_transactions.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -501,6 +501,8 @@
|
|
if (length == 0)
|
|
return -EINVAL;
|
|
|
|
+ BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
|
|
+
|
|
packet = hpsb_make_readpacket(host, node, addr, length);
|
|
|
|
if (!packet) {
|
|
@@ -548,6 +550,8 @@
|
|
if (length == 0)
|
|
return -EINVAL;
|
|
|
|
+ BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
|
|
+
|
|
packet = hpsb_make_writepacket(host, node, addr, buffer, length);
|
|
|
|
if (!packet)
|
|
@@ -566,30 +570,3 @@
|
|
|
|
return retval;
|
|
}
|
|
-
|
|
-int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
|
|
- u64 addr, int extcode, quadlet_t *data, quadlet_t arg)
|
|
-{
|
|
- struct hpsb_packet *packet;
|
|
- int retval = 0;
|
|
-
|
|
- packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);
|
|
- if (!packet)
|
|
- return -ENOMEM;
|
|
-
|
|
- packet->generation = generation;
|
|
- retval = hpsb_send_packet_and_wait(packet);
|
|
- if (retval < 0)
|
|
- goto hpsb_lock_fail;
|
|
-
|
|
- retval = hpsb_packet_success(packet);
|
|
-
|
|
- if (retval == 0)
|
|
- *data = packet->data[0];
|
|
-
|
|
-hpsb_lock_fail:
|
|
- hpsb_free_tlabel(packet);
|
|
- hpsb_free_packet(packet);
|
|
-
|
|
- return retval;
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/ieee1394_transactions.h linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_transactions.h
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/ieee1394_transactions.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_transactions.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,8 +30,6 @@
|
|
u64 addr, quadlet_t *buffer, size_t length);
|
|
int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
|
|
u64 addr, quadlet_t *buffer, size_t length);
|
|
-int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
|
|
- u64 addr, int extcode, quadlet_t *data, quadlet_t arg);
|
|
|
|
#ifdef HPSB_DEBUG_TLABELS
|
|
extern spinlock_t hpsb_tlabel_lock;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/iso.h linux-2.6.29-rc3.owrt/drivers/ieee1394/iso.h
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/iso.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/iso.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -13,7 +13,6 @@
|
|
#define IEEE1394_ISO_H
|
|
|
|
#include <linux/spinlock_types.h>
|
|
-#include <linux/wait.h>
|
|
#include <asm/atomic.h>
|
|
#include <asm/types.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/nodemgr.c linux-2.6.29-rc3.owrt/drivers/ieee1394/nodemgr.c
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/nodemgr.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/nodemgr.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -971,9 +971,6 @@
|
|
ud->ud_kv = ud_kv;
|
|
ud->id = (*id)++;
|
|
|
|
- /* inherit vendor_id from root directory if none exists in unit dir */
|
|
- ud->vendor_id = ne->vendor_id;
|
|
-
|
|
csr1212_for_each_dir_entry(ne->csr, kv, ud_kv, dentry) {
|
|
switch (kv->key.id) {
|
|
case CSR1212_KV_ID_VENDOR:
|
|
@@ -1268,8 +1265,7 @@
|
|
csr1212_destroy_csr(csr);
|
|
}
|
|
|
|
- /* Finally, mark the node current */
|
|
- smp_wmb();
|
|
+ /* Mark the node current */
|
|
ne->generation = generation;
|
|
|
|
if (ne->in_limbo) {
|
|
@@ -1802,7 +1798,7 @@
|
|
{
|
|
packet->host = ne->host;
|
|
packet->generation = ne->generation;
|
|
- smp_rmb();
|
|
+ barrier();
|
|
packet->node_id = ne->nodeid;
|
|
}
|
|
|
|
@@ -1811,7 +1807,7 @@
|
|
{
|
|
unsigned int generation = ne->generation;
|
|
|
|
- smp_rmb();
|
|
+ barrier();
|
|
return hpsb_write(ne->host, ne->nodeid, generation,
|
|
addr, buffer, length);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/nodemgr.h linux-2.6.29-rc3.owrt/drivers/ieee1394/nodemgr.h
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/nodemgr.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/nodemgr.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,11 +21,9 @@
|
|
#define _IEEE1394_NODEMGR_H
|
|
|
|
#include <linux/device.h>
|
|
-#include <asm/system.h>
|
|
#include <asm/types.h>
|
|
|
|
#include "ieee1394_core.h"
|
|
-#include "ieee1394_transactions.h"
|
|
#include "ieee1394_types.h"
|
|
|
|
struct csr1212_csr;
|
|
@@ -156,22 +154,6 @@
|
|
void hpsb_node_fill_packet(struct node_entry *ne, struct hpsb_packet *packet);
|
|
int hpsb_node_write(struct node_entry *ne, u64 addr,
|
|
quadlet_t *buffer, size_t length);
|
|
-static inline int hpsb_node_read(struct node_entry *ne, u64 addr,
|
|
- quadlet_t *buffer, size_t length)
|
|
-{
|
|
- unsigned int g = ne->generation;
|
|
-
|
|
- smp_rmb();
|
|
- return hpsb_read(ne->host, ne->nodeid, g, addr, buffer, length);
|
|
-}
|
|
-static inline int hpsb_node_lock(struct node_entry *ne, u64 addr, int extcode,
|
|
- quadlet_t *buffer, quadlet_t arg)
|
|
-{
|
|
- unsigned int g = ne->generation;
|
|
-
|
|
- smp_rmb();
|
|
- return hpsb_lock(ne->host, ne->nodeid, g, addr, extcode, buffer, arg);
|
|
-}
|
|
int nodemgr_for_each_host(void *data, int (*cb)(struct hpsb_host *, void *));
|
|
|
|
int init_ieee1394_nodemgr(void);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/ohci1394.h linux-2.6.29-rc3.owrt/drivers/ieee1394/ohci1394.h
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/ohci1394.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ohci1394.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -26,7 +26,7 @@
|
|
|
|
#define OHCI1394_DRIVER_NAME "ohci1394"
|
|
|
|
-#define OHCI1394_MAX_AT_REQ_RETRIES 0xf
|
|
+#define OHCI1394_MAX_AT_REQ_RETRIES 0x2
|
|
#define OHCI1394_MAX_AT_RESP_RETRIES 0x2
|
|
#define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8
|
|
#define OHCI1394_MAX_SELF_ID_ERRORS 16
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/ieee1394/sbp2.c linux-2.6.29-rc3.owrt/drivers/ieee1394/sbp2.c
|
|
--- linux-2.6.29.owrt/drivers/ieee1394/sbp2.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/ieee1394/sbp2.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -115,8 +115,8 @@
|
|
*/
|
|
static int sbp2_max_speed = IEEE1394_SPEED_MAX;
|
|
module_param_named(max_speed, sbp2_max_speed, int, 0644);
|
|
-MODULE_PARM_DESC(max_speed, "Limit data transfer speed (5 <= 3200, "
|
|
- "4 <= 1600, 3 <= 800, 2 <= 400, 1 <= 200, 0 = 100 Mb/s)");
|
|
+MODULE_PARM_DESC(max_speed, "Force max speed "
|
|
+ "(3 = 800Mb/s, 2 = 400Mb/s, 1 = 200Mb/s, 0 = 100Mb/s)");
|
|
|
|
/*
|
|
* Set serialize_io to 0 or N to use dynamically appended lists of command ORBs.
|
|
@@ -256,7 +256,7 @@
|
|
static int sbp2_max_speed_and_size(struct sbp2_lu *);
|
|
|
|
|
|
-static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xa, 0xa, 0xa };
|
|
+static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC };
|
|
|
|
static DEFINE_RWLOCK(sbp2_hi_logical_units_lock);
|
|
|
|
@@ -347,8 +347,8 @@
|
|
.sdev_attrs = sbp2_sysfs_sdev_attrs,
|
|
};
|
|
|
|
-#define SBP2_ROM_VALUE_WILDCARD ~0 /* match all */
|
|
-#define SBP2_ROM_VALUE_MISSING 0xff000000 /* not present in the unit dir. */
|
|
+/* for match-all entries in sbp2_workarounds_table */
|
|
+#define SBP2_ROM_VALUE_WILDCARD 0x1000000
|
|
|
|
/*
|
|
* List of devices with known bugs.
|
|
@@ -359,70 +359,60 @@
|
|
*/
|
|
static const struct {
|
|
u32 firmware_revision;
|
|
- u32 model;
|
|
+ u32 model_id;
|
|
unsigned workarounds;
|
|
} sbp2_workarounds_table[] = {
|
|
/* DViCO Momobay CX-1 with TSB42AA9 bridge */ {
|
|
.firmware_revision = 0x002800,
|
|
- .model = 0x001010,
|
|
+ .model_id = 0x001010,
|
|
.workarounds = SBP2_WORKAROUND_INQUIRY_36 |
|
|
SBP2_WORKAROUND_MODE_SENSE_8 |
|
|
SBP2_WORKAROUND_POWER_CONDITION,
|
|
},
|
|
/* DViCO Momobay FX-3A with TSB42AA9A bridge */ {
|
|
.firmware_revision = 0x002800,
|
|
- .model = 0x000000,
|
|
+ .model_id = 0x000000,
|
|
.workarounds = SBP2_WORKAROUND_DELAY_INQUIRY |
|
|
SBP2_WORKAROUND_POWER_CONDITION,
|
|
},
|
|
/* Initio bridges, actually only needed for some older ones */ {
|
|
.firmware_revision = 0x000200,
|
|
- .model = SBP2_ROM_VALUE_WILDCARD,
|
|
+ .model_id = SBP2_ROM_VALUE_WILDCARD,
|
|
.workarounds = SBP2_WORKAROUND_INQUIRY_36,
|
|
},
|
|
/* PL-3507 bridge with Prolific firmware */ {
|
|
.firmware_revision = 0x012800,
|
|
- .model = SBP2_ROM_VALUE_WILDCARD,
|
|
+ .model_id = SBP2_ROM_VALUE_WILDCARD,
|
|
.workarounds = SBP2_WORKAROUND_POWER_CONDITION,
|
|
},
|
|
/* Symbios bridge */ {
|
|
.firmware_revision = 0xa0b800,
|
|
- .model = SBP2_ROM_VALUE_WILDCARD,
|
|
+ .model_id = SBP2_ROM_VALUE_WILDCARD,
|
|
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
|
},
|
|
/* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
|
|
.firmware_revision = 0x002600,
|
|
- .model = SBP2_ROM_VALUE_WILDCARD,
|
|
+ .model_id = SBP2_ROM_VALUE_WILDCARD,
|
|
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
|
},
|
|
- /*
|
|
- * iPod 2nd generation: needs 128k max transfer size workaround
|
|
- * iPod 3rd generation: needs fix capacity workaround
|
|
- */
|
|
- {
|
|
- .firmware_revision = 0x0a2700,
|
|
- .model = 0x000000,
|
|
- .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS |
|
|
- SBP2_WORKAROUND_FIX_CAPACITY,
|
|
- },
|
|
/* iPod 4th generation */ {
|
|
.firmware_revision = 0x0a2700,
|
|
- .model = 0x000021,
|
|
+ .model_id = 0x000021,
|
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
|
},
|
|
/* iPod mini */ {
|
|
.firmware_revision = 0x0a2700,
|
|
- .model = 0x000022,
|
|
+ .model_id = 0x000022,
|
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
|
},
|
|
/* iPod mini */ {
|
|
.firmware_revision = 0x0a2700,
|
|
- .model = 0x000023,
|
|
+ .model_id = 0x000023,
|
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
|
},
|
|
/* iPod Photo */ {
|
|
.firmware_revision = 0x0a2700,
|
|
- .model = 0x00007e,
|
|
+ .model_id = 0x00007e,
|
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
|
}
|
|
};
|
|
@@ -1351,15 +1341,13 @@
|
|
struct csr1212_keyval *kv;
|
|
struct csr1212_dentry *dentry;
|
|
u64 management_agent_addr;
|
|
- u32 unit_characteristics, firmware_revision, model;
|
|
+ u32 unit_characteristics, firmware_revision;
|
|
unsigned workarounds;
|
|
int i;
|
|
|
|
management_agent_addr = 0;
|
|
unit_characteristics = 0;
|
|
- firmware_revision = SBP2_ROM_VALUE_MISSING;
|
|
- model = ud->flags & UNIT_DIRECTORY_MODEL_ID ?
|
|
- ud->model_id : SBP2_ROM_VALUE_MISSING;
|
|
+ firmware_revision = 0;
|
|
|
|
csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) {
|
|
switch (kv->key.id) {
|
|
@@ -1400,9 +1388,9 @@
|
|
sbp2_workarounds_table[i].firmware_revision !=
|
|
(firmware_revision & 0xffff00))
|
|
continue;
|
|
- if (sbp2_workarounds_table[i].model !=
|
|
+ if (sbp2_workarounds_table[i].model_id !=
|
|
SBP2_ROM_VALUE_WILDCARD &&
|
|
- sbp2_workarounds_table[i].model != model)
|
|
+ sbp2_workarounds_table[i].model_id != ud->model_id)
|
|
continue;
|
|
workarounds |= sbp2_workarounds_table[i].workarounds;
|
|
break;
|
|
@@ -1415,7 +1403,7 @@
|
|
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
|
|
workarounds, firmware_revision,
|
|
ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id,
|
|
- model);
|
|
+ ud->model_id);
|
|
|
|
/* We would need one SCSI host template for each target to adjust
|
|
* max_sectors on the fly, therefore warn only. */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_cm.c linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_cm.c
|
|
--- linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_cm.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_cm.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2490,14 +2490,12 @@
|
|
int ret = 0;
|
|
struct nes_vnic *nesvnic;
|
|
struct nes_device *nesdev;
|
|
- struct nes_ib_device *nesibdev;
|
|
|
|
nesvnic = to_nesvnic(nesqp->ibqp.device);
|
|
if (!nesvnic)
|
|
return -EINVAL;
|
|
|
|
nesdev = nesvnic->nesdev;
|
|
- nesibdev = nesvnic->nesibdev;
|
|
|
|
nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
|
|
atomic_read(&nesvnic->netdev->refcnt));
|
|
@@ -2509,8 +2507,6 @@
|
|
} else {
|
|
/* Need to free the Last Streaming Mode Message */
|
|
if (nesqp->ietf_frame) {
|
|
- if (nesqp->lsmm_mr)
|
|
- nesibdev->ibdev.dereg_mr(nesqp->lsmm_mr);
|
|
pci_free_consistent(nesdev->pcidev,
|
|
nesqp->private_data_len+sizeof(struct ietf_mpa_frame),
|
|
nesqp->ietf_frame, nesqp->ietf_frame_pbase);
|
|
@@ -2547,12 +2543,6 @@
|
|
u32 crc_value;
|
|
int ret;
|
|
int passive_state;
|
|
- struct nes_ib_device *nesibdev;
|
|
- struct ib_mr *ibmr = NULL;
|
|
- struct ib_phys_buf ibphysbuf;
|
|
- struct nes_pd *nespd;
|
|
-
|
|
-
|
|
|
|
ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
|
|
if (!ibqp)
|
|
@@ -2611,26 +2601,6 @@
|
|
if (cm_id->remote_addr.sin_addr.s_addr !=
|
|
cm_id->local_addr.sin_addr.s_addr) {
|
|
u64temp = (unsigned long)nesqp;
|
|
- nesibdev = nesvnic->nesibdev;
|
|
- nespd = nesqp->nespd;
|
|
- ibphysbuf.addr = nesqp->ietf_frame_pbase;
|
|
- ibphysbuf.size = conn_param->private_data_len +
|
|
- sizeof(struct ietf_mpa_frame);
|
|
- ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd,
|
|
- &ibphysbuf, 1,
|
|
- IB_ACCESS_LOCAL_WRITE,
|
|
- (u64 *)&nesqp->ietf_frame);
|
|
- if (!ibmr) {
|
|
- nes_debug(NES_DBG_CM, "Unable to register memory region"
|
|
- "for lSMM for cm_node = %p \n",
|
|
- cm_node);
|
|
- return -ENOMEM;
|
|
- }
|
|
-
|
|
- ibmr->pd = &nespd->ibpd;
|
|
- ibmr->device = nespd->ibpd.device;
|
|
- nesqp->lsmm_mr = ibmr;
|
|
-
|
|
u64temp |= NES_SW_CONTEXT_ALIGN>>1;
|
|
set_wqe_64bit_value(wqe->wqe_words,
|
|
NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,
|
|
@@ -2641,13 +2611,14 @@
|
|
wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =
|
|
cpu_to_le32(conn_param->private_data_len +
|
|
sizeof(struct ietf_mpa_frame));
|
|
- set_wqe_64bit_value(wqe->wqe_words,
|
|
- NES_IWARP_SQ_WQE_FRAG0_LOW_IDX,
|
|
- (u64)nesqp->ietf_frame);
|
|
+ wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] =
|
|
+ cpu_to_le32((u32)nesqp->ietf_frame_pbase);
|
|
+ wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] =
|
|
+ cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32));
|
|
wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =
|
|
cpu_to_le32(conn_param->private_data_len +
|
|
sizeof(struct ietf_mpa_frame));
|
|
- wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = ibmr->lkey;
|
|
+ wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;
|
|
|
|
nesqp->nesqp_context->ird_ord_sizes |=
|
|
cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_verbs.c linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_verbs.c
|
|
--- linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_verbs.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_verbs.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1360,10 +1360,8 @@
|
|
NES_QPCONTEXT_MISC_RQ_SIZE_SHIFT);
|
|
nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.sq_encoded_size <<
|
|
NES_QPCONTEXT_MISC_SQ_SIZE_SHIFT);
|
|
- if (!udata) {
|
|
nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_PRIV_EN);
|
|
nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_FAST_REGISTER_EN);
|
|
- }
|
|
nesqp->nesqp_context->cqs = cpu_to_le32(nesqp->nesscq->hw_cq.cq_number +
|
|
((u32)nesqp->nesrcq->hw_cq.cq_number << 16));
|
|
u64temp = (u64)nesqp->hwqp.sq_pbase;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_verbs.h linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_verbs.h
|
|
--- linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_verbs.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_verbs.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -134,7 +134,6 @@
|
|
struct ietf_mpa_frame *ietf_frame;
|
|
dma_addr_t ietf_frame_pbase;
|
|
wait_queue_head_t state_waitq;
|
|
- struct ib_mr *lsmm_mr;
|
|
unsigned long socket;
|
|
struct nes_hw_qp hwqp;
|
|
struct work_struct work;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/keyboard/atkbd.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/atkbd.c
|
|
--- linux-2.6.29.owrt/drivers/input/keyboard/atkbd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/atkbd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -839,7 +839,7 @@
|
|
*/
|
|
static void atkbd_dell_laptop_keymap_fixup(struct atkbd *atkbd)
|
|
{
|
|
- static const unsigned int forced_release_keys[] = {
|
|
+ const unsigned int forced_release_keys[] = {
|
|
0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93,
|
|
};
|
|
int i;
|
|
@@ -856,7 +856,7 @@
|
|
*/
|
|
static void atkbd_hp_keymap_fixup(struct atkbd *atkbd)
|
|
{
|
|
- static const unsigned int forced_release_keys[] = {
|
|
+ const unsigned int forced_release_keys[] = {
|
|
0x94,
|
|
};
|
|
int i;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/keyboard/bf54x-keys.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/bf54x-keys.c
|
|
--- linux-2.6.29.owrt/drivers/input/keyboard/bf54x-keys.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/bf54x-keys.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -209,8 +209,8 @@
|
|
goto out;
|
|
}
|
|
|
|
- if (!pdata->debounce_time || pdata->debounce_time > MAX_MULT ||
|
|
- !pdata->coldrive_time || pdata->coldrive_time > MAX_MULT) {
|
|
+ if (!pdata->debounce_time || !pdata->debounce_time > MAX_MULT ||
|
|
+ !pdata->coldrive_time || !pdata->coldrive_time > MAX_MULT) {
|
|
printk(KERN_ERR DRV_NAME
|
|
": Invalid Debounce/Columdrive Time from pdata\n");
|
|
bfin_write_KPAD_MSEL(0xFF0); /* Default MSEL */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/keyboard/corgikbd.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/corgikbd.c
|
|
--- linux-2.6.29.owrt/drivers/input/keyboard/corgikbd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/corgikbd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -288,7 +288,7 @@
|
|
#define corgikbd_resume NULL
|
|
#endif
|
|
|
|
-static int __devinit corgikbd_probe(struct platform_device *pdev)
|
|
+static int __init corgikbd_probe(struct platform_device *pdev)
|
|
{
|
|
struct corgikbd *corgikbd;
|
|
struct input_dev *input_dev;
|
|
@@ -368,7 +368,7 @@
|
|
return err;
|
|
}
|
|
|
|
-static int __devexit corgikbd_remove(struct platform_device *pdev)
|
|
+static int corgikbd_remove(struct platform_device *pdev)
|
|
{
|
|
int i;
|
|
struct corgikbd *corgikbd = platform_get_drvdata(pdev);
|
|
@@ -388,7 +388,7 @@
|
|
|
|
static struct platform_driver corgikbd_driver = {
|
|
.probe = corgikbd_probe,
|
|
- .remove = __devexit_p(corgikbd_remove),
|
|
+ .remove = corgikbd_remove,
|
|
.suspend = corgikbd_suspend,
|
|
.resume = corgikbd_resume,
|
|
.driver = {
|
|
@@ -397,7 +397,7 @@
|
|
},
|
|
};
|
|
|
|
-static int __init corgikbd_init(void)
|
|
+static int __devinit corgikbd_init(void)
|
|
{
|
|
return platform_driver_register(&corgikbd_driver);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/keyboard/omap-keypad.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/omap-keypad.c
|
|
--- linux-2.6.29.owrt/drivers/input/keyboard/omap-keypad.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/omap-keypad.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -279,7 +279,7 @@
|
|
#define omap_kp_resume NULL
|
|
#endif
|
|
|
|
-static int __devinit omap_kp_probe(struct platform_device *pdev)
|
|
+static int __init omap_kp_probe(struct platform_device *pdev)
|
|
{
|
|
struct omap_kp *omap_kp;
|
|
struct input_dev *input_dev;
|
|
@@ -422,7 +422,7 @@
|
|
return -EINVAL;
|
|
}
|
|
|
|
-static int __devexit omap_kp_remove(struct platform_device *pdev)
|
|
+static int omap_kp_remove(struct platform_device *pdev)
|
|
{
|
|
struct omap_kp *omap_kp = platform_get_drvdata(pdev);
|
|
|
|
@@ -454,7 +454,7 @@
|
|
|
|
static struct platform_driver omap_kp_driver = {
|
|
.probe = omap_kp_probe,
|
|
- .remove = __devexit_p(omap_kp_remove),
|
|
+ .remove = omap_kp_remove,
|
|
.suspend = omap_kp_suspend,
|
|
.resume = omap_kp_resume,
|
|
.driver = {
|
|
@@ -463,7 +463,7 @@
|
|
},
|
|
};
|
|
|
|
-static int __init omap_kp_init(void)
|
|
+static int __devinit omap_kp_init(void)
|
|
{
|
|
printk(KERN_INFO "OMAP Keypad Driver\n");
|
|
return platform_driver_register(&omap_kp_driver);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/keyboard/spitzkbd.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/spitzkbd.c
|
|
--- linux-2.6.29.owrt/drivers/input/keyboard/spitzkbd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/spitzkbd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -343,7 +343,7 @@
|
|
#define spitzkbd_resume NULL
|
|
#endif
|
|
|
|
-static int __devinit spitzkbd_probe(struct platform_device *dev)
|
|
+static int __init spitzkbd_probe(struct platform_device *dev)
|
|
{
|
|
struct spitzkbd *spitzkbd;
|
|
struct input_dev *input_dev;
|
|
@@ -444,7 +444,7 @@
|
|
return err;
|
|
}
|
|
|
|
-static int __devexit spitzkbd_remove(struct platform_device *dev)
|
|
+static int spitzkbd_remove(struct platform_device *dev)
|
|
{
|
|
int i;
|
|
struct spitzkbd *spitzkbd = platform_get_drvdata(dev);
|
|
@@ -470,7 +470,7 @@
|
|
|
|
static struct platform_driver spitzkbd_driver = {
|
|
.probe = spitzkbd_probe,
|
|
- .remove = __devexit_p(spitzkbd_remove),
|
|
+ .remove = spitzkbd_remove,
|
|
.suspend = spitzkbd_suspend,
|
|
.resume = spitzkbd_resume,
|
|
.driver = {
|
|
@@ -479,7 +479,7 @@
|
|
},
|
|
};
|
|
|
|
-static int __init spitzkbd_init(void)
|
|
+static int __devinit spitzkbd_init(void)
|
|
{
|
|
return platform_driver_register(&spitzkbd_driver);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/mouse/elantech.c linux-2.6.29-rc3.owrt/drivers/input/mouse/elantech.c
|
|
--- linux-2.6.29.owrt/drivers/input/mouse/elantech.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/mouse/elantech.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -542,7 +542,7 @@
|
|
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
|
ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
|
|
ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
|
|
- pr_debug("elantech.c: sending Elantech magic knock failed.\n");
|
|
+ pr_err("elantech.c: sending Elantech magic knock failed.\n");
|
|
return -1;
|
|
}
|
|
|
|
@@ -551,27 +551,8 @@
|
|
* set of magic numbers
|
|
*/
|
|
if (param[0] != 0x3c || param[1] != 0x03 || param[2] != 0xc8) {
|
|
- pr_debug("elantech.c: "
|
|
- "unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
|
|
- param[0], param[1], param[2]);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- /*
|
|
- * Query touchpad's firmware version and see if it reports known
|
|
- * value to avoid mis-detection. Logitech mice are known to respond
|
|
- * to Elantech magic knock and there might be more.
|
|
- */
|
|
- if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
|
|
- pr_debug("elantech.c: failed to query firmware version.\n");
|
|
- return -1;
|
|
- }
|
|
-
|
|
- pr_debug("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
|
|
- param[0], param[1], param[2]);
|
|
-
|
|
- if (param[0] == 0 || param[1] != 0) {
|
|
- pr_debug("elantech.c: Probably not a real Elantech touchpad. Aborting.\n");
|
|
+ pr_info("elantech.c: unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
|
|
+ param[0], param[1], param[2]);
|
|
return -1;
|
|
}
|
|
|
|
@@ -619,7 +600,8 @@
|
|
int i, error;
|
|
unsigned char param[3];
|
|
|
|
- psmouse->private = etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL);
|
|
+ etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL);
|
|
+ psmouse->private = etd;
|
|
if (!etd)
|
|
return -1;
|
|
|
|
@@ -628,12 +610,14 @@
|
|
etd->parity[i] = etd->parity[i & (i - 1)] ^ 1;
|
|
|
|
/*
|
|
- * Do the version query again so we can store the result
|
|
+ * Find out what version hardware this is
|
|
*/
|
|
if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
|
|
pr_err("elantech.c: failed to query firmware version.\n");
|
|
goto init_fail;
|
|
}
|
|
+ pr_info("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
|
|
+ param[0], param[1], param[2]);
|
|
etd->fw_version_maj = param[0];
|
|
etd->fw_version_min = param[2];
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/mouse/Kconfig linux-2.6.29-rc3.owrt/drivers/input/mouse/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/input/mouse/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/mouse/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -70,7 +70,7 @@
|
|
config MOUSE_PS2_LIFEBOOK
|
|
bool "Fujitsu Lifebook PS/2 mouse protocol extension" if EMBEDDED
|
|
default y
|
|
- depends on MOUSE_PS2 && X86
|
|
+ depends on MOUSE_PS2
|
|
help
|
|
Say Y here if you have a Fujitsu B-series Lifebook PS/2
|
|
TouchScreen connected to your system.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/mouse/pxa930_trkball.c linux-2.6.29-rc3.owrt/drivers/input/mouse/pxa930_trkball.c
|
|
--- linux-2.6.29.owrt/drivers/input/mouse/pxa930_trkball.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/mouse/pxa930_trkball.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -83,7 +83,7 @@
|
|
|
|
__raw_writel(v, trkball->mmio_base + TBCR);
|
|
|
|
- while (--i) {
|
|
+ while (i--) {
|
|
if (__raw_readl(trkball->mmio_base + TBCR) == v)
|
|
break;
|
|
msleep(1);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/mouse/synaptics.c linux-2.6.29-rc3.owrt/drivers/input/mouse/synaptics.c
|
|
--- linux-2.6.29.owrt/drivers/input/mouse/synaptics.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/mouse/synaptics.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -182,6 +182,11 @@
|
|
|
|
static int synaptics_query_hardware(struct psmouse *psmouse)
|
|
{
|
|
+ int retries = 0;
|
|
+
|
|
+ while ((retries++ < 3) && psmouse_reset(psmouse))
|
|
+ /* empty */;
|
|
+
|
|
if (synaptics_identify(psmouse))
|
|
return -1;
|
|
if (synaptics_model_id(psmouse))
|
|
@@ -577,8 +582,6 @@
|
|
struct synaptics_data *priv = psmouse->private;
|
|
struct synaptics_data old_priv = *priv;
|
|
|
|
- psmouse_reset(psmouse);
|
|
-
|
|
if (synaptics_detect(psmouse, 0))
|
|
return -1;
|
|
|
|
@@ -637,8 +640,6 @@
|
|
if (!priv)
|
|
return -1;
|
|
|
|
- psmouse_reset(psmouse);
|
|
-
|
|
if (synaptics_query_hardware(psmouse)) {
|
|
printk(KERN_ERR "Unable to query Synaptics hardware.\n");
|
|
goto init_fail;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/serio/ambakmi.c linux-2.6.29-rc3.owrt/drivers/input/serio/ambakmi.c
|
|
--- linux-2.6.29.owrt/drivers/input/serio/ambakmi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/serio/ambakmi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -57,7 +57,7 @@
|
|
struct amba_kmi_port *kmi = io->port_data;
|
|
unsigned int timeleft = 10000; /* timeout in 100ms */
|
|
|
|
- while ((readb(KMISTAT) & KMISTAT_TXEMPTY) == 0 && --timeleft)
|
|
+ while ((readb(KMISTAT) & KMISTAT_TXEMPTY) == 0 && timeleft--)
|
|
udelay(10);
|
|
|
|
if (timeleft)
|
|
@@ -129,8 +129,8 @@
|
|
io->write = amba_kmi_write;
|
|
io->open = amba_kmi_open;
|
|
io->close = amba_kmi_close;
|
|
- strlcpy(io->name, dev_name(&dev->dev), sizeof(io->name));
|
|
- strlcpy(io->phys, dev_name(&dev->dev), sizeof(io->phys));
|
|
+ strlcpy(io->name, dev->dev.bus_id, sizeof(io->name));
|
|
+ strlcpy(io->phys, dev->dev.bus_id, sizeof(io->phys));
|
|
io->port_data = kmi;
|
|
io->dev.parent = &dev->dev;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/serio/gscps2.c linux-2.6.29-rc3.owrt/drivers/input/serio/gscps2.c
|
|
--- linux-2.6.29.owrt/drivers/input/serio/gscps2.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/serio/gscps2.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -359,7 +359,7 @@
|
|
|
|
snprintf(serio->name, sizeof(serio->name), "GSC PS/2 %s",
|
|
(ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse");
|
|
- strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys));
|
|
+ strlcpy(serio->phys, dev->dev.bus_id, sizeof(serio->phys));
|
|
serio->id.type = SERIO_8042;
|
|
serio->write = gscps2_write;
|
|
serio->open = gscps2_open;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/serio/sa1111ps2.c linux-2.6.29-rc3.owrt/drivers/input/serio/sa1111ps2.c
|
|
--- linux-2.6.29.owrt/drivers/input/serio/sa1111ps2.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/serio/sa1111ps2.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -246,8 +246,8 @@
|
|
serio->write = ps2_write;
|
|
serio->open = ps2_open;
|
|
serio->close = ps2_close;
|
|
- strlcpy(serio->name, dev_name(&dev->dev), sizeof(serio->name));
|
|
- strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys));
|
|
+ strlcpy(serio->name, dev->dev.bus_id, sizeof(serio->name));
|
|
+ strlcpy(serio->phys, dev->dev.bus_id, sizeof(serio->phys));
|
|
serio->port_data = ps2if;
|
|
serio->dev.parent = &dev->dev;
|
|
ps2if->io = serio;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/touchscreen/atmel_tsadcc.c linux-2.6.29-rc3.owrt/drivers/input/touchscreen/atmel_tsadcc.c
|
|
--- linux-2.6.29.owrt/drivers/input/touchscreen/atmel_tsadcc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/touchscreen/atmel_tsadcc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -236,7 +236,7 @@
|
|
ts_dev->bufferedmeasure = 0;
|
|
|
|
snprintf(ts_dev->phys, sizeof(ts_dev->phys),
|
|
- "%s/input0", dev_name(&pdev->dev));
|
|
+ "%s/input0", pdev->dev.bus_id);
|
|
|
|
input_dev->name = "atmel touch screen controller";
|
|
input_dev->phys = ts_dev->phys;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/touchscreen/corgi_ts.c linux-2.6.29-rc3.owrt/drivers/input/touchscreen/corgi_ts.c
|
|
--- linux-2.6.29.owrt/drivers/input/touchscreen/corgi_ts.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/touchscreen/corgi_ts.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -268,7 +268,7 @@
|
|
#define corgits_resume NULL
|
|
#endif
|
|
|
|
-static int __devinit corgits_probe(struct platform_device *pdev)
|
|
+static int __init corgits_probe(struct platform_device *pdev)
|
|
{
|
|
struct corgi_ts *corgi_ts;
|
|
struct input_dev *input_dev;
|
|
@@ -343,7 +343,7 @@
|
|
return err;
|
|
}
|
|
|
|
-static int __devexit corgits_remove(struct platform_device *pdev)
|
|
+static int corgits_remove(struct platform_device *pdev)
|
|
{
|
|
struct corgi_ts *corgi_ts = platform_get_drvdata(pdev);
|
|
|
|
@@ -352,13 +352,12 @@
|
|
corgi_ts->machinfo->put_hsync();
|
|
input_unregister_device(corgi_ts->input);
|
|
kfree(corgi_ts);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver corgits_driver = {
|
|
.probe = corgits_probe,
|
|
- .remove = __devexit_p(corgits_remove),
|
|
+ .remove = corgits_remove,
|
|
.suspend = corgits_suspend,
|
|
.resume = corgits_resume,
|
|
.driver = {
|
|
@@ -367,7 +366,7 @@
|
|
},
|
|
};
|
|
|
|
-static int __init corgits_init(void)
|
|
+static int __devinit corgits_init(void)
|
|
{
|
|
return platform_driver_register(&corgits_driver);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/touchscreen/tsc2007.c linux-2.6.29-rc3.owrt/drivers/input/touchscreen/tsc2007.c
|
|
--- linux-2.6.29.owrt/drivers/input/touchscreen/tsc2007.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/touchscreen/tsc2007.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -289,8 +289,7 @@
|
|
|
|
pdata->init_platform_hw();
|
|
|
|
- snprintf(ts->phys, sizeof(ts->phys),
|
|
- "%s/input0", dev_name(&client->dev));
|
|
+ snprintf(ts->phys, sizeof(ts->phys), "%s/input0", client->dev.bus_id);
|
|
|
|
input_dev->name = "TSC2007 Touchscreen";
|
|
input_dev->phys = ts->phys;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/input/touchscreen/usbtouchscreen.c linux-2.6.29-rc3.owrt/drivers/input/touchscreen/usbtouchscreen.c
|
|
--- linux-2.6.29.owrt/drivers/input/touchscreen/usbtouchscreen.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/input/touchscreen/usbtouchscreen.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -60,10 +60,6 @@
|
|
module_param(swap_xy, bool, 0644);
|
|
MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");
|
|
|
|
-static int hwcalib_xy;
|
|
-module_param(hwcalib_xy, bool, 0644);
|
|
-MODULE_PARM_DESC(hwcalib_xy, "If set hw-calibrated X/Y are used if available");
|
|
-
|
|
/* device specifc data/functions */
|
|
struct usbtouch_usb;
|
|
struct usbtouch_device_info {
|
|
@@ -122,7 +118,6 @@
|
|
|
|
#define USB_DEVICE_HID_CLASS(vend, prod) \
|
|
.match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \
|
|
- | USB_DEVICE_ID_MATCH_INT_PROTOCOL \
|
|
| USB_DEVICE_ID_MATCH_DEVICE, \
|
|
.idVendor = (vend), \
|
|
.idProduct = (prod), \
|
|
@@ -265,13 +260,8 @@
|
|
|
|
static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
|
|
{
|
|
- if (hwcalib_xy) {
|
|
- dev->x = (pkt[4] << 8) | pkt[3];
|
|
- dev->y = 0xffff - ((pkt[6] << 8) | pkt[5]);
|
|
- } else {
|
|
- dev->x = (pkt[8] << 8) | pkt[7];
|
|
- dev->y = (pkt[10] << 8) | pkt[9];
|
|
- }
|
|
+ dev->x = (pkt[8] << 8) | pkt[7];
|
|
+ dev->y = (pkt[10] << 8) | pkt[9];
|
|
dev->touch = (pkt[2] & 0x40) ? 1 : 0;
|
|
|
|
return 1;
|
|
@@ -304,12 +294,6 @@
|
|
return ret;
|
|
}
|
|
|
|
- /* Default min/max xy are the raw values, override if using hw-calib */
|
|
- if (hwcalib_xy) {
|
|
- input_set_abs_params(usbtouch->input, ABS_X, 0, 0xffff, 0, 0);
|
|
- input_set_abs_params(usbtouch->input, ABS_Y, 0, 0xffff, 0, 0);
|
|
- }
|
|
-
|
|
return 0;
|
|
}
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/isdn/gigaset/bas-gigaset.c linux-2.6.29-rc3.owrt/drivers/isdn/gigaset/bas-gigaset.c
|
|
--- linux-2.6.29.owrt/drivers/isdn/gigaset/bas-gigaset.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/isdn/gigaset/bas-gigaset.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -46,9 +46,6 @@
|
|
/* length limit according to Siemens 3070usb-protokoll.doc ch. 2.1 */
|
|
#define IF_WRITEBUF 264
|
|
|
|
-/* interrupt pipe message size according to ibid. ch. 2.2 */
|
|
-#define IP_MSGSIZE 3
|
|
-
|
|
/* Values for the Gigaset 307x */
|
|
#define USB_GIGA_VENDOR_ID 0x0681
|
|
#define USB_3070_PRODUCT_ID 0x0001
|
|
@@ -113,7 +110,7 @@
|
|
unsigned char *rcvbuf; /* AT reply receive buffer */
|
|
|
|
struct urb *urb_int_in; /* URB for interrupt pipe */
|
|
- unsigned char *int_in_buf;
|
|
+ unsigned char int_in_buf[3];
|
|
|
|
spinlock_t lock; /* locks all following */
|
|
int basstate; /* bitmap (BS_*) */
|
|
@@ -660,7 +657,7 @@
|
|
}
|
|
|
|
/* drop incomplete packets even if the missing bytes wouldn't matter */
|
|
- if (unlikely(urb->actual_length < IP_MSGSIZE)) {
|
|
+ if (unlikely(urb->actual_length < 3)) {
|
|
dev_warn(cs->dev, "incomplete interrupt packet (%d bytes)\n",
|
|
urb->actual_length);
|
|
goto resubmit;
|
|
@@ -2130,7 +2127,6 @@
|
|
static void gigaset_freecshw(struct cardstate *cs)
|
|
{
|
|
/* timers, URBs and rcvbuf are disposed of in disconnect */
|
|
- kfree(cs->hw.bas->int_in_buf);
|
|
kfree(cs->hw.bas);
|
|
cs->hw.bas = NULL;
|
|
}
|
|
@@ -2144,12 +2140,6 @@
|
|
pr_err("out of memory\n");
|
|
return 0;
|
|
}
|
|
- ucs->int_in_buf = kmalloc(IP_MSGSIZE, GFP_KERNEL);
|
|
- if (!ucs->int_in_buf) {
|
|
- kfree(ucs);
|
|
- pr_err("out of memory\n");
|
|
- return 0;
|
|
- }
|
|
|
|
ucs->urb_cmd_in = NULL;
|
|
ucs->urb_cmd_out = NULL;
|
|
@@ -2302,7 +2292,7 @@
|
|
usb_fill_int_urb(ucs->urb_int_in, udev,
|
|
usb_rcvintpipe(udev,
|
|
(endpoint->bEndpointAddress) & 0x0f),
|
|
- ucs->int_in_buf, IP_MSGSIZE, read_int_callback, cs,
|
|
+ ucs->int_in_buf, 3, read_int_callback, cs,
|
|
endpoint->bInterval);
|
|
if ((rc = usb_submit_urb(ucs->urb_int_in, GFP_KERNEL)) != 0) {
|
|
dev_err(cs->dev, "could not submit interrupt URB: %s\n",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/isdn/hardware/mISDN/hfcmulti.c linux-2.6.29-rc3.owrt/drivers/isdn/hardware/mISDN/hfcmulti.c
|
|
--- linux-2.6.29.owrt/drivers/isdn/hardware/mISDN/hfcmulti.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/isdn/hardware/mISDN/hfcmulti.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -4599,7 +4599,6 @@
|
|
printk(KERN_ERR "%s: no memory for coeffs\n",
|
|
__func__);
|
|
ret = -ENOMEM;
|
|
- kfree(bch);
|
|
goto free_chan;
|
|
}
|
|
bch->nr = ch;
|
|
@@ -4768,7 +4767,6 @@
|
|
printk(KERN_ERR "%s: no memory for coeffs\n",
|
|
__func__);
|
|
ret = -ENOMEM;
|
|
- kfree(bch);
|
|
goto free_chan;
|
|
}
|
|
bch->nr = ch + 1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/isdn/sc/shmem.c linux-2.6.29-rc3.owrt/drivers/isdn/sc/shmem.c
|
|
--- linux-2.6.29.owrt/drivers/isdn/sc/shmem.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/isdn/sc/shmem.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -54,7 +54,7 @@
|
|
spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
|
|
pr_debug("%s: set page to %#x\n",sc_adapter[card]->devicename,
|
|
((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE)>>14)|0x80);
|
|
- pr_debug("%s: copying %zu bytes from %#lx to %#lx\n",
|
|
+ pr_debug("%s: copying %d bytes from %#lx to %#lx\n",
|
|
sc_adapter[card]->devicename, n,
|
|
(unsigned long) src,
|
|
sc_adapter[card]->rambase + ((unsigned long) dest %0x4000));
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/lguest/core.c linux-2.6.29-rc3.owrt/drivers/lguest/core.c
|
|
--- linux-2.6.29.owrt/drivers/lguest/core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/lguest/core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -224,7 +224,7 @@
|
|
break;
|
|
|
|
/* If the Guest asked to be stopped, we sleep. The Guest's
|
|
- * clock timer or LHREQ_BREAK from the Waker will wake us. */
|
|
+ * clock timer or LHCALL_BREAK from the Waker will wake us. */
|
|
if (cpu->halted) {
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
schedule();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/lguest/lguest_device.c linux-2.6.29-rc3.owrt/drivers/lguest/lguest_device.c
|
|
--- linux-2.6.29.owrt/drivers/lguest/lguest_device.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/lguest/lguest_device.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -212,9 +212,6 @@
|
|
hcall(LHCALL_NOTIFY, lvq->config.pfn << PAGE_SHIFT, 0, 0);
|
|
}
|
|
|
|
-/* An extern declaration inside a C file is bad form. Don't do it. */
|
|
-extern void lguest_setup_irq(unsigned int irq);
|
|
-
|
|
/* This routine finds the first virtqueue described in the configuration of
|
|
* this device and sets it up.
|
|
*
|
|
@@ -269,9 +266,6 @@
|
|
goto unmap;
|
|
}
|
|
|
|
- /* Make sure the interrupt is allocated. */
|
|
- lguest_setup_irq(lvq->config.irq);
|
|
-
|
|
/* Tell the interrupt for this virtqueue to go to the virtio_ring
|
|
* interrupt handler. */
|
|
/* FIXME: We used to have a flag for the Host to tell us we could use
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/lguest/lguest_user.c linux-2.6.29-rc3.owrt/drivers/lguest/lguest_user.c
|
|
--- linux-2.6.29.owrt/drivers/lguest/lguest_user.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/lguest/lguest_user.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -307,8 +307,9 @@
|
|
* kmalloc()ed string, either of which is ok to hand to kfree(). */
|
|
if (!IS_ERR(lg->dead))
|
|
kfree(lg->dead);
|
|
- /* Free the memory allocated to the lguest_struct */
|
|
- kfree(lg);
|
|
+ /* We clear the entire structure, which also marks it as free for the
|
|
+ * next user. */
|
|
+ memset(lg, 0, sizeof(*lg));
|
|
/* Release lock and exit. */
|
|
mutex_unlock(&lguest_lock);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/dm.c linux-2.6.29-rc3.owrt/drivers/md/dm.c
|
|
--- linux-2.6.29.owrt/drivers/md/dm.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/dm.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -525,12 +525,9 @@
|
|
static void dec_pending(struct dm_io *io, int error)
|
|
{
|
|
unsigned long flags;
|
|
- int io_error;
|
|
- struct bio *bio;
|
|
- struct mapped_device *md = io->md;
|
|
|
|
/* Push-back supersedes any I/O errors */
|
|
- if (error && !(io->error > 0 && __noflush_suspending(md)))
|
|
+ if (error && !(io->error > 0 && __noflush_suspending(io->md)))
|
|
io->error = error;
|
|
|
|
if (atomic_dec_and_test(&io->io_count)) {
|
|
@@ -540,27 +537,24 @@
|
|
* This must be handled before the sleeper on
|
|
* suspend queue merges the pushback list.
|
|
*/
|
|
- spin_lock_irqsave(&md->pushback_lock, flags);
|
|
- if (__noflush_suspending(md))
|
|
- bio_list_add(&md->pushback, io->bio);
|
|
+ spin_lock_irqsave(&io->md->pushback_lock, flags);
|
|
+ if (__noflush_suspending(io->md))
|
|
+ bio_list_add(&io->md->pushback, io->bio);
|
|
else
|
|
/* noflush suspend was interrupted. */
|
|
io->error = -EIO;
|
|
- spin_unlock_irqrestore(&md->pushback_lock, flags);
|
|
+ spin_unlock_irqrestore(&io->md->pushback_lock, flags);
|
|
}
|
|
|
|
end_io_acct(io);
|
|
|
|
- io_error = io->error;
|
|
- bio = io->bio;
|
|
-
|
|
- free_io(md, io);
|
|
+ if (io->error != DM_ENDIO_REQUEUE) {
|
|
+ trace_block_bio_complete(io->md->queue, io->bio);
|
|
|
|
- if (io_error != DM_ENDIO_REQUEUE) {
|
|
- trace_block_bio_complete(md->queue, bio);
|
|
-
|
|
- bio_endio(bio, io_error);
|
|
+ bio_endio(io->bio, io->error);
|
|
}
|
|
+
|
|
+ free_io(io->md, io);
|
|
}
|
|
}
|
|
|
|
@@ -568,7 +562,6 @@
|
|
{
|
|
int r = 0;
|
|
struct dm_target_io *tio = bio->bi_private;
|
|
- struct dm_io *io = tio->io;
|
|
struct mapped_device *md = tio->io->md;
|
|
dm_endio_fn endio = tio->ti->type->end_io;
|
|
|
|
@@ -592,14 +585,15 @@
|
|
}
|
|
}
|
|
|
|
+ dec_pending(tio->io, error);
|
|
+
|
|
/*
|
|
* Store md for cleanup instead of tio which is about to get freed.
|
|
*/
|
|
bio->bi_private = md->bs;
|
|
|
|
- free_tio(md, tio);
|
|
bio_put(bio);
|
|
- dec_pending(io, error);
|
|
+ free_tio(md, tio);
|
|
}
|
|
|
|
static sector_t max_io_len(struct mapped_device *md,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/dm-crypt.c linux-2.6.29-rc3.owrt/drivers/md/dm-crypt.c
|
|
--- linux-2.6.29.owrt/drivers/md/dm-crypt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/dm-crypt.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -60,7 +60,6 @@
|
|
};
|
|
|
|
struct dm_crypt_request {
|
|
- struct convert_context *ctx;
|
|
struct scatterlist sg_in;
|
|
struct scatterlist sg_out;
|
|
};
|
|
@@ -336,18 +335,6 @@
|
|
init_completion(&ctx->restart);
|
|
}
|
|
|
|
-static struct dm_crypt_request *dmreq_of_req(struct crypt_config *cc,
|
|
- struct ablkcipher_request *req)
|
|
-{
|
|
- return (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
|
|
-}
|
|
-
|
|
-static struct ablkcipher_request *req_of_dmreq(struct crypt_config *cc,
|
|
- struct dm_crypt_request *dmreq)
|
|
-{
|
|
- return (struct ablkcipher_request *)((char *)dmreq - cc->dmreq_start);
|
|
-}
|
|
-
|
|
static int crypt_convert_block(struct crypt_config *cc,
|
|
struct convert_context *ctx,
|
|
struct ablkcipher_request *req)
|
|
@@ -358,11 +345,10 @@
|
|
u8 *iv;
|
|
int r = 0;
|
|
|
|
- dmreq = dmreq_of_req(cc, req);
|
|
+ dmreq = (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
|
|
iv = (u8 *)ALIGN((unsigned long)(dmreq + 1),
|
|
crypto_ablkcipher_alignmask(cc->tfm) + 1);
|
|
|
|
- dmreq->ctx = ctx;
|
|
sg_init_table(&dmreq->sg_in, 1);
|
|
sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,
|
|
bv_in->bv_offset + ctx->offset_in);
|
|
@@ -409,9 +395,8 @@
|
|
cc->req = mempool_alloc(cc->req_pool, GFP_NOIO);
|
|
ablkcipher_request_set_tfm(cc->req, cc->tfm);
|
|
ablkcipher_request_set_callback(cc->req, CRYPTO_TFM_REQ_MAY_BACKLOG |
|
|
- CRYPTO_TFM_REQ_MAY_SLEEP,
|
|
- kcryptd_async_done,
|
|
- dmreq_of_req(cc, cc->req));
|
|
+ CRYPTO_TFM_REQ_MAY_SLEEP,
|
|
+ kcryptd_async_done, ctx);
|
|
}
|
|
|
|
/*
|
|
@@ -568,22 +553,19 @@
|
|
static void crypt_dec_pending(struct dm_crypt_io *io)
|
|
{
|
|
struct crypt_config *cc = io->target->private;
|
|
- struct bio *base_bio = io->base_bio;
|
|
- struct dm_crypt_io *base_io = io->base_io;
|
|
- int error = io->error;
|
|
|
|
if (!atomic_dec_and_test(&io->pending))
|
|
return;
|
|
|
|
- mempool_free(io, cc->io_pool);
|
|
-
|
|
- if (likely(!base_io))
|
|
- bio_endio(base_bio, error);
|
|
+ if (likely(!io->base_io))
|
|
+ bio_endio(io->base_bio, io->error);
|
|
else {
|
|
- if (error && !base_io->error)
|
|
- base_io->error = error;
|
|
- crypt_dec_pending(base_io);
|
|
+ if (io->error && !io->base_io->error)
|
|
+ io->base_io->error = io->error;
|
|
+ crypt_dec_pending(io->base_io);
|
|
}
|
|
+
|
|
+ mempool_free(io, cc->io_pool);
|
|
}
|
|
|
|
/*
|
|
@@ -839,8 +821,7 @@
|
|
static void kcryptd_async_done(struct crypto_async_request *async_req,
|
|
int error)
|
|
{
|
|
- struct dm_crypt_request *dmreq = async_req->data;
|
|
- struct convert_context *ctx = dmreq->ctx;
|
|
+ struct convert_context *ctx = async_req->data;
|
|
struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx);
|
|
struct crypt_config *cc = io->target->private;
|
|
|
|
@@ -849,7 +830,7 @@
|
|
return;
|
|
}
|
|
|
|
- mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool);
|
|
+ mempool_free(ablkcipher_request_cast(async_req), cc->req_pool);
|
|
|
|
if (!atomic_dec_and_test(&ctx->pending))
|
|
return;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/dm-io.c linux-2.6.29-rc3.owrt/drivers/md/dm-io.c
|
|
--- linux-2.6.29.owrt/drivers/md/dm-io.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/dm-io.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -292,8 +292,6 @@
|
|
(PAGE_SIZE >> SECTOR_SHIFT));
|
|
num_bvecs = 1 + min_t(int, bio_get_nr_vecs(where->bdev),
|
|
num_bvecs);
|
|
- if (unlikely(num_bvecs > BIO_MAX_PAGES))
|
|
- num_bvecs = BIO_MAX_PAGES;
|
|
bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios);
|
|
bio->bi_sector = where->sector + (where->count - remaining);
|
|
bio->bi_bdev = where->bdev;
|
|
@@ -330,7 +328,7 @@
|
|
struct dpages old_pages = *dp;
|
|
|
|
if (sync)
|
|
- rw |= (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);
|
|
+ rw |= (1 << BIO_RW_SYNC);
|
|
|
|
/*
|
|
* For multiple regions we need to be careful to rewind
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/dm-ioctl.c linux-2.6.29-rc3.owrt/drivers/md/dm-ioctl.c
|
|
--- linux-2.6.29.owrt/drivers/md/dm-ioctl.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/dm-ioctl.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -704,8 +704,7 @@
|
|
char *new_name = (char *) param + param->data_start;
|
|
|
|
if (new_name < param->data ||
|
|
- invalid_str(new_name, (void *) param + param_size) ||
|
|
- strlen(new_name) > DM_NAME_LEN - 1) {
|
|
+ invalid_str(new_name, (void *) param + param_size)) {
|
|
DMWARN("Invalid new logical volume name supplied.");
|
|
return -EINVAL;
|
|
}
|
|
@@ -1064,7 +1063,7 @@
|
|
|
|
r = populate_table(t, param, param_size);
|
|
if (r) {
|
|
- dm_table_destroy(t);
|
|
+ dm_table_put(t);
|
|
goto out;
|
|
}
|
|
|
|
@@ -1072,7 +1071,7 @@
|
|
hc = dm_get_mdptr(md);
|
|
if (!hc || hc->md != md) {
|
|
DMWARN("device has been removed from the dev hash table.");
|
|
- dm_table_destroy(t);
|
|
+ dm_table_put(t);
|
|
up_write(&_hash_lock);
|
|
r = -ENXIO;
|
|
goto out;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/dm-kcopyd.c linux-2.6.29-rc3.owrt/drivers/md/dm-kcopyd.c
|
|
--- linux-2.6.29.owrt/drivers/md/dm-kcopyd.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/dm-kcopyd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -344,7 +344,7 @@
|
|
{
|
|
int r;
|
|
struct dm_io_request io_req = {
|
|
- .bi_rw = job->rw | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG),
|
|
+ .bi_rw = job->rw | (1 << BIO_RW_SYNC),
|
|
.mem.type = DM_IO_PAGE_LIST,
|
|
.mem.ptr.pl = job->pages,
|
|
.mem.offset = job->offset,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/linear.c linux-2.6.29-rc3.owrt/drivers/md/linear.c
|
|
--- linux-2.6.29.owrt/drivers/md/linear.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/linear.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -25,13 +25,13 @@
|
|
{
|
|
dev_info_t *hash;
|
|
linear_conf_t *conf = mddev_to_conf(mddev);
|
|
- sector_t idx = sector >> conf->sector_shift;
|
|
|
|
/*
|
|
* sector_div(a,b) returns the remainer and sets a to a/b
|
|
*/
|
|
- (void)sector_div(idx, conf->spacing);
|
|
- hash = conf->hash_table[idx];
|
|
+ sector >>= conf->sector_shift;
|
|
+ (void)sector_div(sector, conf->spacing);
|
|
+ hash = conf->hash_table[sector];
|
|
|
|
while (sector >= hash->num_sectors + hash->start_sector)
|
|
hash++;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/md.c linux-2.6.29-rc3.owrt/drivers/md/md.c
|
|
--- linux-2.6.29.owrt/drivers/md/md.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/md.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -214,7 +214,12 @@
|
|
return mddev;
|
|
}
|
|
|
|
-static void mddev_delayed_delete(struct work_struct *ws);
|
|
+static void mddev_delayed_delete(struct work_struct *ws)
|
|
+{
|
|
+ mddev_t *mddev = container_of(ws, mddev_t, del_work);
|
|
+ kobject_del(&mddev->kobj);
|
|
+ kobject_put(&mddev->kobj);
|
|
+}
|
|
|
|
static void mddev_put(mddev_t *mddev)
|
|
{
|
|
@@ -469,7 +474,7 @@
|
|
* causes ENOTSUPP, we allocate a spare bio...
|
|
*/
|
|
struct bio *bio = bio_alloc(GFP_NOIO, 1);
|
|
- int rw = (1<<BIO_RW) | (1<<BIO_RW_SYNCIO) | (1<<BIO_RW_UNPLUG);
|
|
+ int rw = (1<<BIO_RW) | (1<<BIO_RW_SYNC);
|
|
|
|
bio->bi_bdev = rdev->bdev;
|
|
bio->bi_sector = sector;
|
|
@@ -526,7 +531,7 @@
|
|
struct completion event;
|
|
int ret;
|
|
|
|
- rw |= (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);
|
|
+ rw |= (1 << BIO_RW_SYNC);
|
|
|
|
bio->bi_bdev = bdev;
|
|
bio->bi_sector = sector;
|
|
@@ -1476,11 +1481,6 @@
|
|
if (find_rdev_nr(mddev, rdev->desc_nr))
|
|
return -EBUSY;
|
|
}
|
|
- if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
|
|
- printk(KERN_WARNING "md: %s: array is limited to %d devices\n",
|
|
- mdname(mddev), mddev->max_disks);
|
|
- return -EBUSY;
|
|
- }
|
|
bdevname(rdev->bdev,b);
|
|
while ( (s=strchr(b, '/')) != NULL)
|
|
*s = '!';
|
|
@@ -2441,15 +2441,6 @@
|
|
|
|
i = 0;
|
|
rdev_for_each(rdev, tmp, mddev) {
|
|
- if (rdev->desc_nr >= mddev->max_disks ||
|
|
- i > mddev->max_disks) {
|
|
- printk(KERN_WARNING
|
|
- "md: %s: %s: only %d devices permitted\n",
|
|
- mdname(mddev), bdevname(rdev->bdev, b),
|
|
- mddev->max_disks);
|
|
- kick_rdev_from_array(rdev);
|
|
- continue;
|
|
- }
|
|
if (rdev != freshest)
|
|
if (super_types[mddev->major_version].
|
|
validate_super(mddev, rdev)) {
|
|
@@ -3537,21 +3528,6 @@
|
|
|
|
int mdp_major = 0;
|
|
|
|
-static void mddev_delayed_delete(struct work_struct *ws)
|
|
-{
|
|
- mddev_t *mddev = container_of(ws, mddev_t, del_work);
|
|
-
|
|
- if (mddev->private == &md_redundancy_group) {
|
|
- sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
|
|
- if (mddev->sysfs_action)
|
|
- sysfs_put(mddev->sysfs_action);
|
|
- mddev->sysfs_action = NULL;
|
|
- mddev->private = NULL;
|
|
- }
|
|
- kobject_del(&mddev->kobj);
|
|
- kobject_put(&mddev->kobj);
|
|
-}
|
|
-
|
|
static int md_alloc(dev_t dev, char *name)
|
|
{
|
|
static DEFINE_MUTEX(disks_mutex);
|
|
@@ -4043,9 +4019,13 @@
|
|
mddev->queue->merge_bvec_fn = NULL;
|
|
mddev->queue->unplug_fn = NULL;
|
|
mddev->queue->backing_dev_info.congested_fn = NULL;
|
|
+ if (mddev->pers->sync_request) {
|
|
+ sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
|
|
+ if (mddev->sysfs_action)
|
|
+ sysfs_put(mddev->sysfs_action);
|
|
+ mddev->sysfs_action = NULL;
|
|
+ }
|
|
module_put(mddev->pers->owner);
|
|
- if (mddev->pers->sync_request)
|
|
- mddev->private = &md_redundancy_group;
|
|
mddev->pers = NULL;
|
|
/* tell userspace to handle 'inactive' */
|
|
sysfs_notify_dirent(mddev->sysfs_state);
|
|
@@ -4634,6 +4614,13 @@
|
|
* noticed in interrupt contexts ...
|
|
*/
|
|
|
|
+ if (rdev->desc_nr == mddev->max_disks) {
|
|
+ printk(KERN_WARNING "%s: can not hot-add to full array!\n",
|
|
+ mdname(mddev));
|
|
+ err = -EBUSY;
|
|
+ goto abort_unbind_export;
|
|
+ }
|
|
+
|
|
rdev->raid_disk = -1;
|
|
|
|
md_update_sb(mddev, 1);
|
|
@@ -4647,6 +4634,9 @@
|
|
md_new_event(mddev);
|
|
return 0;
|
|
|
|
+abort_unbind_export:
|
|
+ unbind_rdev_from_array(rdev);
|
|
+
|
|
abort_export:
|
|
export_rdev(rdev);
|
|
return err;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/raid10.c linux-2.6.29-rc3.owrt/drivers/md/raid10.c
|
|
--- linux-2.6.29.owrt/drivers/md/raid10.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/raid10.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1236,7 +1236,6 @@
|
|
/* for reconstruct, we always reschedule after a read.
|
|
* for resync, only after all reads
|
|
*/
|
|
- rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev);
|
|
if (test_bit(R10BIO_IsRecover, &r10_bio->state) ||
|
|
atomic_dec_and_test(&r10_bio->remaining)) {
|
|
/* we have read all the blocks,
|
|
@@ -1244,6 +1243,7 @@
|
|
*/
|
|
reschedule_retry(r10_bio);
|
|
}
|
|
+ rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev);
|
|
}
|
|
|
|
static void end_sync_write(struct bio *bio, int error)
|
|
@@ -1264,13 +1264,11 @@
|
|
|
|
update_head_pos(i, r10_bio);
|
|
|
|
- rdev_dec_pending(conf->mirrors[d].rdev, mddev);
|
|
while (atomic_dec_and_test(&r10_bio->remaining)) {
|
|
if (r10_bio->master_bio == NULL) {
|
|
/* the primary of several recovery bios */
|
|
- sector_t s = r10_bio->sectors;
|
|
+ md_done_sync(mddev, r10_bio->sectors, 1);
|
|
put_buf(r10_bio);
|
|
- md_done_sync(mddev, s, 1);
|
|
break;
|
|
} else {
|
|
r10bio_t *r10_bio2 = (r10bio_t *)r10_bio->master_bio;
|
|
@@ -1278,6 +1276,7 @@
|
|
r10_bio = r10_bio2;
|
|
}
|
|
}
|
|
+ rdev_dec_pending(conf->mirrors[d].rdev, mddev);
|
|
}
|
|
|
|
/*
|
|
@@ -1750,6 +1749,8 @@
|
|
if (!go_faster && conf->nr_waiting)
|
|
msleep_interruptible(1000);
|
|
|
|
+ bitmap_cond_end_sync(mddev->bitmap, sector_nr);
|
|
+
|
|
/* Again, very different code for resync and recovery.
|
|
* Both must result in an r10bio with a list of bios that
|
|
* have bi_end_io, bi_sector, bi_bdev set,
|
|
@@ -1885,8 +1886,6 @@
|
|
/* resync. Schedule a read for every block at this virt offset */
|
|
int count = 0;
|
|
|
|
- bitmap_cond_end_sync(mddev->bitmap, sector_nr);
|
|
-
|
|
if (!bitmap_start_sync(mddev->bitmap, sector_nr,
|
|
&sync_blocks, mddev->degraded) &&
|
|
!conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
|
|
@@ -2011,13 +2010,13 @@
|
|
/* There is nowhere to write, so all non-sync
|
|
* drives must be failed, so try the next chunk...
|
|
*/
|
|
- if (sector_nr + max_sync < max_sector)
|
|
- max_sector = sector_nr + max_sync;
|
|
-
|
|
- sectors_skipped += (max_sector - sector_nr);
|
|
+ {
|
|
+ sector_t sec = max_sector - sector_nr;
|
|
+ sectors_skipped += sec;
|
|
chunks_skipped ++;
|
|
sector_nr = max_sector;
|
|
goto skipped;
|
|
+ }
|
|
}
|
|
|
|
static int run(mddev_t *mddev)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/md/raid1.c linux-2.6.29-rc3.owrt/drivers/md/raid1.c
|
|
--- linux-2.6.29.owrt/drivers/md/raid1.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/md/raid1.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1237,9 +1237,8 @@
|
|
update_head_pos(mirror, r1_bio);
|
|
|
|
if (atomic_dec_and_test(&r1_bio->remaining)) {
|
|
- sector_t s = r1_bio->sectors;
|
|
+ md_done_sync(mddev, r1_bio->sectors, uptodate);
|
|
put_buf(r1_bio);
|
|
- md_done_sync(mddev, s, uptodate);
|
|
}
|
|
}
|
|
|
|
@@ -1641,8 +1640,7 @@
|
|
}
|
|
|
|
bio = r1_bio->bios[r1_bio->read_disk];
|
|
- if ((disk=read_balance(conf, r1_bio)) == -1 ||
|
|
- disk == r1_bio->read_disk) {
|
|
+ if ((disk=read_balance(conf, r1_bio)) == -1) {
|
|
printk(KERN_ALERT "raid1: %s: unrecoverable I/O"
|
|
" read error for block %llu\n",
|
|
bdevname(bio->bi_bdev,b),
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/common/saa7146_video.c linux-2.6.29-rc3.owrt/drivers/media/common/saa7146_video.c
|
|
--- linux-2.6.29.owrt/drivers/media/common/saa7146_video.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/common/saa7146_video.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -576,7 +576,6 @@
|
|
vv->vflip = c->value;
|
|
break;
|
|
default: {
|
|
- mutex_unlock(&dev->lock);
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/common/tuners/mxl5007t.c linux-2.6.29-rc3.owrt/drivers/media/common/tuners/mxl5007t.c
|
|
--- linux-2.6.29.owrt/drivers/media/common/tuners/mxl5007t.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/common/tuners/mxl5007t.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -657,7 +657,7 @@
|
|
{
|
|
struct mxl5007t_state *state = fe->tuner_priv;
|
|
int rf_locked, ref_locked;
|
|
- s32 rf_input_level = 0;
|
|
+ s32 rf_input_level;
|
|
int ret;
|
|
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/common/tuners/tuner-simple.c linux-2.6.29-rc3.owrt/drivers/media/common/tuners/tuner-simple.c
|
|
--- linux-2.6.29.owrt/drivers/media/common/tuners/tuner-simple.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/common/tuners/tuner-simple.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -318,6 +318,7 @@
|
|
u8 *config, u8 *cb)
|
|
{
|
|
struct tuner_simple_priv *priv = fe->tuner_priv;
|
|
+ u8 tuneraddr;
|
|
int rc;
|
|
|
|
/* tv norm specific stuff for multi-norm tuners */
|
|
@@ -386,7 +387,6 @@
|
|
|
|
case TUNER_PHILIPS_TUV1236D:
|
|
{
|
|
- struct tuner_i2c_props i2c = priv->i2c_props;
|
|
/* 0x40 -> ATSC antenna input 1 */
|
|
/* 0x48 -> ATSC antenna input 2 */
|
|
/* 0x00 -> NTSC antenna input 1 */
|
|
@@ -398,15 +398,17 @@
|
|
buffer[1] = 0x04;
|
|
}
|
|
/* set to the correct mode (analog or digital) */
|
|
- i2c.addr = 0x0a;
|
|
- rc = tuner_i2c_xfer_send(&i2c, &buffer[0], 2);
|
|
+ tuneraddr = priv->i2c_props.addr;
|
|
+ priv->i2c_props.addr = 0x0a;
|
|
+ rc = tuner_i2c_xfer_send(&priv->i2c_props, &buffer[0], 2);
|
|
if (2 != rc)
|
|
tuner_warn("i2c i/o error: rc == %d "
|
|
"(should be 2)\n", rc);
|
|
- rc = tuner_i2c_xfer_send(&i2c, &buffer[2], 2);
|
|
+ rc = tuner_i2c_xfer_send(&priv->i2c_props, &buffer[2], 2);
|
|
if (2 != rc)
|
|
tuner_warn("i2c i/o error: rc == %d "
|
|
"(should be 2)\n", rc);
|
|
+ priv->i2c_props.addr = tuneraddr;
|
|
break;
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop.c linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -212,7 +212,8 @@
|
|
v210.sw_reset_210.Block_reset_enable = 0xb2;
|
|
|
|
fc->write_ibi_reg(fc,sw_reset_210,v210);
|
|
- udelay(1000);
|
|
+ msleep(1);
|
|
+
|
|
fc->write_ibi_reg(fc,ctrl_208,v208_save);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop-hw-filter.c linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop-hw-filter.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop-hw-filter.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop-hw-filter.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -192,7 +192,6 @@
|
|
|
|
return 0;
|
|
}
|
|
-EXPORT_SYMBOL(flexcop_pid_feed_control);
|
|
|
|
void flexcop_hw_filter_init(struct flexcop_device *fc)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop-pci.c linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop-pci.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop-pci.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop-pci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -13,9 +13,9 @@
|
|
module_param(enable_pid_filtering, int, 0444);
|
|
MODULE_PARM_DESC(enable_pid_filtering, "enable hardware pid filtering: supported values: 0 (fullts), 1");
|
|
|
|
-static int irq_chk_intv = 100;
|
|
+static int irq_chk_intv;
|
|
module_param(irq_chk_intv, int, 0644);
|
|
-MODULE_PARM_DESC(irq_chk_intv, "set the interval for IRQ streaming watchdog.");
|
|
+MODULE_PARM_DESC(irq_chk_intv, "set the interval for IRQ watchdog (currently just debugging).");
|
|
|
|
#ifdef CONFIG_DVB_B2C2_FLEXCOP_DEBUG
|
|
#define dprintk(level,args...) \
|
|
@@ -34,9 +34,7 @@
|
|
|
|
static int debug;
|
|
module_param(debug, int, 0644);
|
|
-MODULE_PARM_DESC(debug,
|
|
- "set debug level (1=info,2=regs,4=TS,8=irqdma,16=check (|-able))."
|
|
- DEBSTATUS);
|
|
+MODULE_PARM_DESC(debug, "set debug level (1=info,2=regs,4=TS,8=irqdma (|-able))." DEBSTATUS);
|
|
|
|
#define DRIVER_VERSION "0.1"
|
|
#define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver"
|
|
@@ -60,8 +58,6 @@
|
|
int active_dma1_addr; /* 0 = addr0 of dma1; 1 = addr1 of dma1 */
|
|
u32 last_dma1_cur_pos; /* position of the pointer last time the timer/packet irq occured */
|
|
int count;
|
|
- int count_prev;
|
|
- int stream_problem;
|
|
|
|
spinlock_t irq_lock;
|
|
|
|
@@ -107,32 +103,18 @@
|
|
container_of(work, struct flexcop_pci, irq_check_work.work);
|
|
struct flexcop_device *fc = fc_pci->fc_dev;
|
|
|
|
- if (fc->feedcount) {
|
|
+ flexcop_ibi_value v = fc->read_ibi_reg(fc,sram_dest_reg_714);
|
|
|
|
- if (fc_pci->count == fc_pci->count_prev) {
|
|
- deb_chk("no IRQ since the last check\n");
|
|
- if (fc_pci->stream_problem++ == 3) {
|
|
- struct dvb_demux_feed *feed;
|
|
-
|
|
- spin_lock_irq(&fc->demux.lock);
|
|
- list_for_each_entry(feed, &fc->demux.feed_list,
|
|
- list_head) {
|
|
- flexcop_pid_feed_control(fc, feed, 0);
|
|
- }
|
|
-
|
|
- list_for_each_entry(feed, &fc->demux.feed_list,
|
|
- list_head) {
|
|
- flexcop_pid_feed_control(fc, feed, 1);
|
|
- }
|
|
- spin_unlock_irq(&fc->demux.lock);
|
|
-
|
|
- fc_pci->stream_problem = 0;
|
|
- }
|
|
- } else {
|
|
- fc_pci->stream_problem = 0;
|
|
- fc_pci->count_prev = fc_pci->count;
|
|
- }
|
|
- }
|
|
+ flexcop_dump_reg(fc_pci->fc_dev,dma1_000,4);
|
|
+
|
|
+ if (v.sram_dest_reg_714.net_ovflow_error)
|
|
+ deb_chk("sram net_ovflow_error\n");
|
|
+ if (v.sram_dest_reg_714.media_ovflow_error)
|
|
+ deb_chk("sram media_ovflow_error\n");
|
|
+ if (v.sram_dest_reg_714.cai_ovflow_error)
|
|
+ deb_chk("sram cai_ovflow_error\n");
|
|
+ if (v.sram_dest_reg_714.cai_ovflow_error)
|
|
+ deb_chk("sram cai_ovflow_error\n");
|
|
|
|
schedule_delayed_work(&fc_pci->irq_check_work,
|
|
msecs_to_jiffies(irq_chk_intv < 100 ? 100 : irq_chk_intv));
|
|
@@ -234,12 +216,16 @@
|
|
flexcop_dma_control_timer_irq(fc,FC_DMA_1,1);
|
|
deb_irq("IRQ enabled\n");
|
|
|
|
- fc_pci->count_prev = fc_pci->count;
|
|
-
|
|
// fc_pci->active_dma1_addr = 0;
|
|
// flexcop_dma_control_size_irq(fc,FC_DMA_1,1);
|
|
|
|
+ if (irq_chk_intv > 0)
|
|
+ schedule_delayed_work(&fc_pci->irq_check_work,
|
|
+ msecs_to_jiffies(irq_chk_intv < 100 ? 100 : irq_chk_intv));
|
|
} else {
|
|
+ if (irq_chk_intv > 0)
|
|
+ cancel_delayed_work(&fc_pci->irq_check_work);
|
|
+
|
|
flexcop_dma_control_timer_irq(fc,FC_DMA_1,0);
|
|
deb_irq("IRQ disabled\n");
|
|
|
|
@@ -313,6 +299,8 @@
|
|
IRQF_SHARED, DRIVER_NAME, fc_pci)) != 0)
|
|
goto err_pci_iounmap;
|
|
|
|
+
|
|
+
|
|
fc_pci->init_state |= FC_PCI_INIT;
|
|
return ret;
|
|
|
|
@@ -387,10 +375,6 @@
|
|
|
|
INIT_DELAYED_WORK(&fc_pci->irq_check_work, flexcop_pci_irq_check_work);
|
|
|
|
- if (irq_chk_intv > 0)
|
|
- schedule_delayed_work(&fc_pci->irq_check_work,
|
|
- msecs_to_jiffies(irq_chk_intv < 100 ? 100 : irq_chk_intv));
|
|
-
|
|
return ret;
|
|
|
|
err_fc_exit:
|
|
@@ -409,9 +393,6 @@
|
|
{
|
|
struct flexcop_pci *fc_pci = pci_get_drvdata(pdev);
|
|
|
|
- if (irq_chk_intv > 0)
|
|
- cancel_delayed_work(&fc_pci->irq_check_work);
|
|
-
|
|
flexcop_pci_dma_exit(fc_pci);
|
|
flexcop_device_exit(fc_pci->fc_dev);
|
|
flexcop_pci_exit(fc_pci);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/bt8xx/dst.c linux-2.6.29-rc3.owrt/drivers/media/dvb/bt8xx/dst.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/bt8xx/dst.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/bt8xx/dst.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1683,7 +1683,7 @@
|
|
|
|
static int dst_get_tuning_algo(struct dvb_frontend *fe)
|
|
{
|
|
- return dst_algo ? DVBFE_ALGO_HW : DVBFE_ALGO_SW;
|
|
+ return dst_algo;
|
|
}
|
|
|
|
static int dst_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dmxdev.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dmxdev.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dmxdev.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dmxdev.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -364,15 +364,16 @@
|
|
enum dmx_success success)
|
|
{
|
|
struct dmxdev_filter *dmxdevfilter = filter->priv;
|
|
+ unsigned long flags;
|
|
int ret;
|
|
|
|
if (dmxdevfilter->buffer.error) {
|
|
wake_up(&dmxdevfilter->buffer.queue);
|
|
return 0;
|
|
}
|
|
- spin_lock(&dmxdevfilter->dev->lock);
|
|
+ spin_lock_irqsave(&dmxdevfilter->dev->lock, flags);
|
|
if (dmxdevfilter->state != DMXDEV_STATE_GO) {
|
|
- spin_unlock(&dmxdevfilter->dev->lock);
|
|
+ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
|
return 0;
|
|
}
|
|
del_timer(&dmxdevfilter->timer);
|
|
@@ -391,7 +392,7 @@
|
|
}
|
|
if (dmxdevfilter->params.sec.flags & DMX_ONESHOT)
|
|
dmxdevfilter->state = DMXDEV_STATE_DONE;
|
|
- spin_unlock(&dmxdevfilter->dev->lock);
|
|
+ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
|
wake_up(&dmxdevfilter->buffer.queue);
|
|
return 0;
|
|
}
|
|
@@ -403,11 +404,12 @@
|
|
{
|
|
struct dmxdev_filter *dmxdevfilter = feed->priv;
|
|
struct dvb_ringbuffer *buffer;
|
|
+ unsigned long flags;
|
|
int ret;
|
|
|
|
- spin_lock(&dmxdevfilter->dev->lock);
|
|
+ spin_lock_irqsave(&dmxdevfilter->dev->lock, flags);
|
|
if (dmxdevfilter->params.pes.output == DMX_OUT_DECODER) {
|
|
- spin_unlock(&dmxdevfilter->dev->lock);
|
|
+ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
|
return 0;
|
|
}
|
|
|
|
@@ -417,7 +419,7 @@
|
|
else
|
|
buffer = &dmxdevfilter->dev->dvr_buffer;
|
|
if (buffer->error) {
|
|
- spin_unlock(&dmxdevfilter->dev->lock);
|
|
+ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
|
wake_up(&buffer->queue);
|
|
return 0;
|
|
}
|
|
@@ -428,7 +430,7 @@
|
|
dvb_ringbuffer_flush(buffer);
|
|
buffer->error = ret;
|
|
}
|
|
- spin_unlock(&dmxdevfilter->dev->lock);
|
|
+ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
|
wake_up(&buffer->queue);
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -93,9 +93,6 @@
|
|
/* current state of the CAM */
|
|
int slot_state;
|
|
|
|
- /* mutex used for serializing access to one CI slot */
|
|
- struct mutex slot_lock;
|
|
-
|
|
/* Number of CAMCHANGES that have occurred since last processing */
|
|
atomic_t camchange_count;
|
|
|
|
@@ -714,20 +711,14 @@
|
|
dprintk("%s\n", __func__);
|
|
|
|
|
|
- /* sanity check */
|
|
+ // sanity check
|
|
if (bytes_write > ca->slot_info[slot].link_buf_size)
|
|
return -EINVAL;
|
|
|
|
- /* it is possible we are dealing with a single buffer implementation,
|
|
- thus if there is data available for read or if there is even a read
|
|
- already in progress, we do nothing but awake the kernel thread to
|
|
- process the data if necessary. */
|
|
+ /* check if interface is actually waiting for us to read from it, or if a read is in progress */
|
|
if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
|
|
goto exitnowrite;
|
|
if (status & (STATUSREG_DA | STATUSREG_RE)) {
|
|
- if (status & STATUSREG_DA)
|
|
- dvb_ca_en50221_thread_wakeup(ca);
|
|
-
|
|
status = -EAGAIN;
|
|
goto exitnowrite;
|
|
}
|
|
@@ -996,8 +987,6 @@
|
|
/* go through all the slots processing them */
|
|
for (slot = 0; slot < ca->slot_count; slot++) {
|
|
|
|
- mutex_lock(&ca->slot_info[slot].slot_lock);
|
|
-
|
|
// check the cam status + deal with CAMCHANGEs
|
|
while (dvb_ca_en50221_check_camstatus(ca, slot)) {
|
|
/* clear down an old CI slot if necessary */
|
|
@@ -1133,7 +1122,7 @@
|
|
|
|
case DVB_CA_SLOTSTATE_RUNNING:
|
|
if (!ca->open)
|
|
- break;
|
|
+ continue;
|
|
|
|
// poll slots for data
|
|
pktcount = 0;
|
|
@@ -1157,8 +1146,6 @@
|
|
}
|
|
break;
|
|
}
|
|
-
|
|
- mutex_unlock(&ca->slot_info[slot].slot_lock);
|
|
}
|
|
}
|
|
|
|
@@ -1194,7 +1181,6 @@
|
|
switch (cmd) {
|
|
case CA_RESET:
|
|
for (slot = 0; slot < ca->slot_count; slot++) {
|
|
- mutex_lock(&ca->slot_info[slot].slot_lock);
|
|
if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_NONE) {
|
|
dvb_ca_en50221_slot_shutdown(ca, slot);
|
|
if (ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)
|
|
@@ -1202,7 +1188,6 @@
|
|
slot,
|
|
DVB_CA_EN50221_CAMCHANGE_INSERTED);
|
|
}
|
|
- mutex_unlock(&ca->slot_info[slot].slot_lock);
|
|
}
|
|
ca->next_read_slot = 0;
|
|
dvb_ca_en50221_thread_wakeup(ca);
|
|
@@ -1323,9 +1308,7 @@
|
|
goto exit;
|
|
}
|
|
|
|
- mutex_lock(&ca->slot_info[slot].slot_lock);
|
|
status = dvb_ca_en50221_write_data(ca, slot, fragbuf, fraglen + 2);
|
|
- mutex_unlock(&ca->slot_info[slot].slot_lock);
|
|
if (status == (fraglen + 2)) {
|
|
written = 1;
|
|
break;
|
|
@@ -1681,7 +1664,6 @@
|
|
ca->slot_info[i].slot_state = DVB_CA_SLOTSTATE_NONE;
|
|
atomic_set(&ca->slot_info[i].camchange_count, 0);
|
|
ca->slot_info[i].camchange_type = DVB_CA_EN50221_CAMCHANGE_REMOVED;
|
|
- mutex_init(&ca->slot_info[i].slot_lock);
|
|
}
|
|
|
|
if (signal_pending(current)) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.h linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.h
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -45,10 +45,8 @@
|
|
/* the module owning this structure */
|
|
struct module* owner;
|
|
|
|
- /* NOTE: the read_*, write_* and poll_slot_status functions will be
|
|
- * called for different slots concurrently and need to use locks where
|
|
- * and if appropriate. There will be no concurrent access to one slot.
|
|
- */
|
|
+ /* NOTE: the read_*, write_* and poll_slot_status functions must use locks as
|
|
+ * they may be called from several threads at once */
|
|
|
|
/* functions for accessing attribute memory on the CAM */
|
|
int (*read_attribute_mem)(struct dvb_ca_en50221* ca, int slot, int address);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_demux.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_demux.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_demux.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_demux.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -399,7 +399,9 @@
|
|
void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
|
|
size_t count)
|
|
{
|
|
- spin_lock(&demux->lock);
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&demux->lock, flags);
|
|
|
|
while (count--) {
|
|
if (buf[0] == 0x47)
|
|
@@ -407,16 +409,17 @@
|
|
buf += 188;
|
|
}
|
|
|
|
- spin_unlock(&demux->lock);
|
|
+ spin_unlock_irqrestore(&demux->lock, flags);
|
|
}
|
|
|
|
EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
|
|
|
|
void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
|
|
{
|
|
+ unsigned long flags;
|
|
int p = 0, i, j;
|
|
|
|
- spin_lock(&demux->lock);
|
|
+ spin_lock_irqsave(&demux->lock, flags);
|
|
|
|
if (demux->tsbufp) {
|
|
i = demux->tsbufp;
|
|
@@ -449,17 +452,18 @@
|
|
}
|
|
|
|
bailout:
|
|
- spin_unlock(&demux->lock);
|
|
+ spin_unlock_irqrestore(&demux->lock, flags);
|
|
}
|
|
|
|
EXPORT_SYMBOL(dvb_dmx_swfilter);
|
|
|
|
void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
|
|
{
|
|
+ unsigned long flags;
|
|
int p = 0, i, j;
|
|
u8 tmppack[188];
|
|
|
|
- spin_lock(&demux->lock);
|
|
+ spin_lock_irqsave(&demux->lock, flags);
|
|
|
|
if (demux->tsbufp) {
|
|
i = demux->tsbufp;
|
|
@@ -500,7 +504,7 @@
|
|
}
|
|
|
|
bailout:
|
|
- spin_unlock(&demux->lock);
|
|
+ spin_unlock_irqrestore(&demux->lock, flags);
|
|
}
|
|
|
|
EXPORT_SYMBOL(dvb_dmx_swfilter_204);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_frontend.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_frontend.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_frontend.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_frontend.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1290,6 +1290,9 @@
|
|
dprintk("%s() Finalised property cache\n", __func__);
|
|
dtv_property_cache_submit(fe);
|
|
|
|
+ /* Request the search algorithm to search */
|
|
+ fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
|
|
+
|
|
r |= dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,
|
|
&fepriv->parameters);
|
|
break;
|
|
@@ -1714,10 +1717,6 @@
|
|
fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
|
|
|
|
fepriv->state = FESTATE_RETUNE;
|
|
-
|
|
- /* Request the search algorithm to search */
|
|
- fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
|
|
-
|
|
dvb_frontend_wakeup(fe);
|
|
dvb_frontend_add_event(fe, 0);
|
|
fepriv->status = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/af9005-fe.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/af9005-fe.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/af9005-fe.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/af9005-fe.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -220,7 +220,7 @@
|
|
u16 * abort_count)
|
|
{
|
|
u32 loc_cw_count = 0, loc_err_count;
|
|
- u16 loc_abort_count = 0;
|
|
+ u16 loc_abort_count;
|
|
int ret;
|
|
|
|
ret =
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/af9015.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/af9015.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/af9015.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/af9015.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -694,12 +694,7 @@
|
|
|
|
/* IR remote controller */
|
|
req.addr = AF9015_EEPROM_IR_MODE;
|
|
- /* first message will timeout often due to possible hw bug */
|
|
- for (i = 0; i < 4; i++) {
|
|
- ret = af9015_rw_udev(udev, &req);
|
|
- if (!ret)
|
|
- break;
|
|
- }
|
|
+ ret = af9015_rw_udev(udev, &req);
|
|
if (ret)
|
|
goto error;
|
|
deb_info("%s: IR mode:%d\n", __func__, val);
|
|
@@ -840,19 +835,18 @@
|
|
if (!dvb_usb_af9015_dual_mode)
|
|
af9015_config.dual_mode = 0;
|
|
|
|
- /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
|
|
- size can be static because it is enabled only USB2.0 */
|
|
+ /* set buffer size according to USB port speed */
|
|
for (i = 0; i < af9015_properties_count; i++) {
|
|
/* USB1.1 set smaller buffersize and disable 2nd adapter */
|
|
if (udev->speed == USB_SPEED_FULL) {
|
|
- af9015_properties[i].adapter[0].stream.u.bulk.buffersize
|
|
- = TS_USB11_MAX_PACKET_SIZE;
|
|
+ af9015_properties[i].adapter->stream.u.bulk.buffersize =
|
|
+ TS_USB11_MAX_PACKET_SIZE;
|
|
/* disable 2nd adapter because we don't have
|
|
PID-filters */
|
|
af9015_config.dual_mode = 0;
|
|
} else {
|
|
- af9015_properties[i].adapter[0].stream.u.bulk.buffersize
|
|
- = TS_USB20_MAX_PACKET_SIZE;
|
|
+ af9015_properties[i].adapter->stream.u.bulk.buffersize =
|
|
+ TS_USB20_MAX_PACKET_SIZE;
|
|
}
|
|
}
|
|
|
|
@@ -1260,12 +1254,6 @@
|
|
.type = USB_BULK,
|
|
.count = 6,
|
|
.endpoint = 0x85,
|
|
- .u = {
|
|
- .bulk = {
|
|
- .buffersize =
|
|
- TS_USB20_MAX_PACKET_SIZE,
|
|
- }
|
|
- }
|
|
},
|
|
}
|
|
},
|
|
@@ -1365,12 +1353,6 @@
|
|
.type = USB_BULK,
|
|
.count = 6,
|
|
.endpoint = 0x85,
|
|
- .u = {
|
|
- .bulk = {
|
|
- .buffersize =
|
|
- TS_USB20_MAX_PACKET_SIZE,
|
|
- }
|
|
- }
|
|
},
|
|
}
|
|
},
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/dib0700_devices.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/dib0700_devices.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/dib0700_devices.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/dib0700_devices.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1393,9 +1393,6 @@
|
|
{ USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
|
|
/* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
|
|
{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
|
|
- { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
|
|
- { USB_DEVICE(USB_VID_TERRATEC,
|
|
- USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
|
|
{ 0 } /* Terminating entry */
|
|
};
|
|
MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
|
|
@@ -1540,8 +1537,7 @@
|
|
{ "DiBcom STK7700D reference design",
|
|
{ &dib0700_usb_id_table[14], NULL },
|
|
{ NULL },
|
|
- },
|
|
-
|
|
+ }
|
|
},
|
|
|
|
.rc_interval = DEFAULT_RC_INTERVAL,
|
|
@@ -1561,7 +1557,7 @@
|
|
},
|
|
},
|
|
|
|
- .num_device_descs = 3,
|
|
+ .num_device_descs = 2,
|
|
.devices = {
|
|
{ "ASUS My Cinema U3000 Mini DVBT Tuner",
|
|
{ &dib0700_usb_id_table[23], NULL },
|
|
@@ -1570,10 +1566,6 @@
|
|
{ "Yuan EC372S",
|
|
{ &dib0700_usb_id_table[31], NULL },
|
|
{ NULL },
|
|
- },
|
|
- { "Terratec Cinergy T Express",
|
|
- { &dib0700_usb_id_table[42], NULL },
|
|
- { NULL },
|
|
}
|
|
},
|
|
|
|
@@ -1661,7 +1653,7 @@
|
|
}
|
|
},
|
|
|
|
- .num_device_descs = 5,
|
|
+ .num_device_descs = 4,
|
|
.devices = {
|
|
{ "DiBcom STK7070PD reference design",
|
|
{ &dib0700_usb_id_table[17], NULL },
|
|
@@ -1678,10 +1670,6 @@
|
|
{ "Hauppauge Nova-TD-500 (84xxx)",
|
|
{ &dib0700_usb_id_table[36], NULL },
|
|
{ NULL },
|
|
- },
|
|
- { "Terratec Cinergy DT USB XS Diversity",
|
|
- { &dib0700_usb_id_table[43], NULL },
|
|
- { NULL },
|
|
}
|
|
}
|
|
}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/dvb-usb-ids.h linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -162,10 +162,8 @@
|
|
#define USB_PID_AVERMEDIA_A309 0xa309
|
|
#define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006
|
|
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a
|
|
-#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081
|
|
#define USB_PID_TERRATEC_CINERGY_HT_USB_XE 0x0058
|
|
#define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060
|
|
-#define USB_PID_TERRATEC_CINERGY_T_EXPRESS 0x0062
|
|
#define USB_PID_TERRATEC_CINERGY_T_XXS 0x0078
|
|
#define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e
|
|
#define USB_PID_PINNACLE_PCTV2000E 0x022c
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-1394.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-1394.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-1394.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-1394.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,285 +0,0 @@
|
|
-/*
|
|
- * FireDTV driver (formerly known as FireSAT)
|
|
- *
|
|
- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
|
|
- * Copyright (C) 2007-2008 Ben Backx <ben@bbackx.com>
|
|
- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
|
|
- *
|
|
- * 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.
|
|
- */
|
|
-
|
|
-#include <linux/device.h>
|
|
-#include <linux/errno.h>
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/list.h>
|
|
-#include <linux/spinlock.h>
|
|
-#include <linux/types.h>
|
|
-
|
|
-#include <dma.h>
|
|
-#include <csr1212.h>
|
|
-#include <highlevel.h>
|
|
-#include <hosts.h>
|
|
-#include <ieee1394.h>
|
|
-#include <iso.h>
|
|
-#include <nodemgr.h>
|
|
-
|
|
-#include "firedtv.h"
|
|
-
|
|
-static LIST_HEAD(node_list);
|
|
-static DEFINE_SPINLOCK(node_list_lock);
|
|
-
|
|
-#define FIREWIRE_HEADER_SIZE 4
|
|
-#define CIP_HEADER_SIZE 8
|
|
-
|
|
-static void rawiso_activity_cb(struct hpsb_iso *iso)
|
|
-{
|
|
- struct firedtv *f, *fdtv = NULL;
|
|
- unsigned int i, num, packet;
|
|
- unsigned char *buf;
|
|
- unsigned long flags;
|
|
- int count;
|
|
-
|
|
- spin_lock_irqsave(&node_list_lock, flags);
|
|
- list_for_each_entry(f, &node_list, list)
|
|
- if (f->backend_data == iso) {
|
|
- fdtv = f;
|
|
- break;
|
|
- }
|
|
- spin_unlock_irqrestore(&node_list_lock, flags);
|
|
-
|
|
- packet = iso->first_packet;
|
|
- num = hpsb_iso_n_ready(iso);
|
|
-
|
|
- if (!fdtv) {
|
|
- dev_err(fdtv->device, "received at unknown iso channel\n");
|
|
- goto out;
|
|
- }
|
|
-
|
|
- for (i = 0; i < num; i++, packet = (packet + 1) % iso->buf_packets) {
|
|
- buf = dma_region_i(&iso->data_buf, unsigned char,
|
|
- iso->infos[packet].offset + CIP_HEADER_SIZE);
|
|
- count = (iso->infos[packet].len - CIP_HEADER_SIZE) /
|
|
- (188 + FIREWIRE_HEADER_SIZE);
|
|
-
|
|
- /* ignore empty packet */
|
|
- if (iso->infos[packet].len <= CIP_HEADER_SIZE)
|
|
- continue;
|
|
-
|
|
- while (count--) {
|
|
- if (buf[FIREWIRE_HEADER_SIZE] == 0x47)
|
|
- dvb_dmx_swfilter_packets(&fdtv->demux,
|
|
- &buf[FIREWIRE_HEADER_SIZE], 1);
|
|
- else
|
|
- dev_err(fdtv->device,
|
|
- "skipping invalid packet\n");
|
|
- buf += 188 + FIREWIRE_HEADER_SIZE;
|
|
- }
|
|
- }
|
|
-out:
|
|
- hpsb_iso_recv_release_packets(iso, num);
|
|
-}
|
|
-
|
|
-static inline struct node_entry *node_of(struct firedtv *fdtv)
|
|
-{
|
|
- return container_of(fdtv->device, struct unit_directory, device)->ne;
|
|
-}
|
|
-
|
|
-static int node_lock(struct firedtv *fdtv, u64 addr, void *data, __be32 arg)
|
|
-{
|
|
- return hpsb_node_lock(node_of(fdtv), addr, EXTCODE_COMPARE_SWAP, data,
|
|
- (__force quadlet_t)arg);
|
|
-}
|
|
-
|
|
-static int node_read(struct firedtv *fdtv, u64 addr, void *data, size_t len)
|
|
-{
|
|
- return hpsb_node_read(node_of(fdtv), addr, data, len);
|
|
-}
|
|
-
|
|
-static int node_write(struct firedtv *fdtv, u64 addr, void *data, size_t len)
|
|
-{
|
|
- return hpsb_node_write(node_of(fdtv), addr, data, len);
|
|
-}
|
|
-
|
|
-#define FDTV_ISO_BUFFER_PACKETS 256
|
|
-#define FDTV_ISO_BUFFER_SIZE (FDTV_ISO_BUFFER_PACKETS * 200)
|
|
-
|
|
-static int start_iso(struct firedtv *fdtv)
|
|
-{
|
|
- struct hpsb_iso *iso_handle;
|
|
- int ret;
|
|
-
|
|
- iso_handle = hpsb_iso_recv_init(node_of(fdtv)->host,
|
|
- FDTV_ISO_BUFFER_SIZE, FDTV_ISO_BUFFER_PACKETS,
|
|
- fdtv->isochannel, HPSB_ISO_DMA_DEFAULT,
|
|
- -1, /* stat.config.irq_interval */
|
|
- rawiso_activity_cb);
|
|
- if (iso_handle == NULL) {
|
|
- dev_err(fdtv->device, "cannot initialize iso receive\n");
|
|
- return -ENOMEM;
|
|
- }
|
|
- fdtv->backend_data = iso_handle;
|
|
-
|
|
- ret = hpsb_iso_recv_start(iso_handle, -1, -1, 0);
|
|
- if (ret != 0) {
|
|
- dev_err(fdtv->device, "cannot start iso receive\n");
|
|
- hpsb_iso_shutdown(iso_handle);
|
|
- fdtv->backend_data = NULL;
|
|
- }
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static void stop_iso(struct firedtv *fdtv)
|
|
-{
|
|
- struct hpsb_iso *iso_handle = fdtv->backend_data;
|
|
-
|
|
- if (iso_handle != NULL) {
|
|
- hpsb_iso_stop(iso_handle);
|
|
- hpsb_iso_shutdown(iso_handle);
|
|
- }
|
|
- fdtv->backend_data = NULL;
|
|
-}
|
|
-
|
|
-static const struct firedtv_backend fdtv_1394_backend = {
|
|
- .lock = node_lock,
|
|
- .read = node_read,
|
|
- .write = node_write,
|
|
- .start_iso = start_iso,
|
|
- .stop_iso = stop_iso,
|
|
-};
|
|
-
|
|
-static void fcp_request(struct hpsb_host *host, int nodeid, int direction,
|
|
- int cts, u8 *data, size_t length)
|
|
-{
|
|
- struct firedtv *f, *fdtv = NULL;
|
|
- unsigned long flags;
|
|
- int su;
|
|
-
|
|
- if (length == 0 || (data[0] & 0xf0) != 0)
|
|
- return;
|
|
-
|
|
- su = data[1] & 0x7;
|
|
-
|
|
- spin_lock_irqsave(&node_list_lock, flags);
|
|
- list_for_each_entry(f, &node_list, list)
|
|
- if (node_of(f)->host == host &&
|
|
- node_of(f)->nodeid == nodeid &&
|
|
- (f->subunit == su || (f->subunit == 0 && su == 0x7))) {
|
|
- fdtv = f;
|
|
- break;
|
|
- }
|
|
- spin_unlock_irqrestore(&node_list_lock, flags);
|
|
-
|
|
- if (fdtv)
|
|
- avc_recv(fdtv, data, length);
|
|
-}
|
|
-
|
|
-static int node_probe(struct device *dev)
|
|
-{
|
|
- struct unit_directory *ud =
|
|
- container_of(dev, struct unit_directory, device);
|
|
- struct firedtv *fdtv;
|
|
- int kv_len, err;
|
|
- void *kv_str;
|
|
-
|
|
- kv_len = (ud->model_name_kv->value.leaf.len - 2) * sizeof(quadlet_t);
|
|
- kv_str = CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv);
|
|
-
|
|
- fdtv = fdtv_alloc(dev, &fdtv_1394_backend, kv_str, kv_len);
|
|
- if (!fdtv)
|
|
- return -ENOMEM;
|
|
-
|
|
- /*
|
|
- * Work around a bug in udev's path_id script: Use the fw-host's dev
|
|
- * instead of the unit directory's dev as parent of the input device.
|
|
- */
|
|
- err = fdtv_register_rc(fdtv, dev->parent->parent);
|
|
- if (err)
|
|
- goto fail_free;
|
|
-
|
|
- spin_lock_irq(&node_list_lock);
|
|
- list_add_tail(&fdtv->list, &node_list);
|
|
- spin_unlock_irq(&node_list_lock);
|
|
-
|
|
- err = avc_identify_subunit(fdtv);
|
|
- if (err)
|
|
- goto fail;
|
|
-
|
|
- err = fdtv_dvb_register(fdtv);
|
|
- if (err)
|
|
- goto fail;
|
|
-
|
|
- avc_register_remote_control(fdtv);
|
|
- return 0;
|
|
-fail:
|
|
- spin_lock_irq(&node_list_lock);
|
|
- list_del(&fdtv->list);
|
|
- spin_unlock_irq(&node_list_lock);
|
|
- fdtv_unregister_rc(fdtv);
|
|
-fail_free:
|
|
- kfree(fdtv);
|
|
- return err;
|
|
-}
|
|
-
|
|
-static int node_remove(struct device *dev)
|
|
-{
|
|
- struct firedtv *fdtv = dev->driver_data;
|
|
-
|
|
- fdtv_dvb_unregister(fdtv);
|
|
-
|
|
- spin_lock_irq(&node_list_lock);
|
|
- list_del(&fdtv->list);
|
|
- spin_unlock_irq(&node_list_lock);
|
|
-
|
|
- cancel_work_sync(&fdtv->remote_ctrl_work);
|
|
- fdtv_unregister_rc(fdtv);
|
|
-
|
|
- kfree(fdtv);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int node_update(struct unit_directory *ud)
|
|
-{
|
|
- struct firedtv *fdtv = ud->device.driver_data;
|
|
-
|
|
- if (fdtv->isochannel >= 0)
|
|
- cmp_establish_pp_connection(fdtv, fdtv->subunit,
|
|
- fdtv->isochannel);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static struct hpsb_protocol_driver fdtv_driver = {
|
|
- .name = "firedtv",
|
|
- .update = node_update,
|
|
- .driver = {
|
|
- .probe = node_probe,
|
|
- .remove = node_remove,
|
|
- },
|
|
-};
|
|
-
|
|
-static struct hpsb_highlevel fdtv_highlevel = {
|
|
- .name = "firedtv",
|
|
- .fcp_request = fcp_request,
|
|
-};
|
|
-
|
|
-int __init fdtv_1394_init(struct ieee1394_device_id id_table[])
|
|
-{
|
|
- int ret;
|
|
-
|
|
- hpsb_register_highlevel(&fdtv_highlevel);
|
|
- fdtv_driver.id_table = id_table;
|
|
- ret = hpsb_register_protocol(&fdtv_driver);
|
|
- if (ret) {
|
|
- printk(KERN_ERR "firedtv: failed to register protocol\n");
|
|
- hpsb_unregister_highlevel(&fdtv_highlevel);
|
|
- }
|
|
- return ret;
|
|
-}
|
|
-
|
|
-void __exit fdtv_1394_exit(void)
|
|
-{
|
|
- hpsb_unregister_protocol(&fdtv_driver);
|
|
- hpsb_unregister_highlevel(&fdtv_highlevel);
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-avc.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-avc.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-avc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-avc.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,1315 +0,0 @@
|
|
-/*
|
|
- * FireDTV driver (formerly known as FireSAT)
|
|
- *
|
|
- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
|
|
- * Copyright (C) 2008 Ben Backx <ben@bbackx.com>
|
|
- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
|
|
- *
|
|
- * 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.
|
|
- */
|
|
-
|
|
-#include <linux/bug.h>
|
|
-#include <linux/crc32.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/device.h>
|
|
-#include <linux/jiffies.h>
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/moduleparam.h>
|
|
-#include <linux/mutex.h>
|
|
-#include <linux/string.h>
|
|
-#include <linux/stringify.h>
|
|
-#include <linux/wait.h>
|
|
-#include <linux/workqueue.h>
|
|
-
|
|
-#include "firedtv.h"
|
|
-
|
|
-#define FCP_COMMAND_REGISTER 0xfffff0000b00ULL
|
|
-
|
|
-#define AVC_CTYPE_CONTROL 0x0
|
|
-#define AVC_CTYPE_STATUS 0x1
|
|
-#define AVC_CTYPE_NOTIFY 0x3
|
|
-
|
|
-#define AVC_RESPONSE_ACCEPTED 0x9
|
|
-#define AVC_RESPONSE_STABLE 0xc
|
|
-#define AVC_RESPONSE_CHANGED 0xd
|
|
-#define AVC_RESPONSE_INTERIM 0xf
|
|
-
|
|
-#define AVC_SUBUNIT_TYPE_TUNER (0x05 << 3)
|
|
-#define AVC_SUBUNIT_TYPE_UNIT (0x1f << 3)
|
|
-
|
|
-#define AVC_OPCODE_VENDOR 0x00
|
|
-#define AVC_OPCODE_READ_DESCRIPTOR 0x09
|
|
-#define AVC_OPCODE_DSIT 0xc8
|
|
-#define AVC_OPCODE_DSD 0xcb
|
|
-
|
|
-#define DESCRIPTOR_TUNER_STATUS 0x80
|
|
-#define DESCRIPTOR_SUBUNIT_IDENTIFIER 0x00
|
|
-
|
|
-#define SFE_VENDOR_DE_COMPANYID_0 0x00 /* OUI of Digital Everywhere */
|
|
-#define SFE_VENDOR_DE_COMPANYID_1 0x12
|
|
-#define SFE_VENDOR_DE_COMPANYID_2 0x87
|
|
-
|
|
-#define SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL 0x0a
|
|
-#define SFE_VENDOR_OPCODE_LNB_CONTROL 0x52
|
|
-#define SFE_VENDOR_OPCODE_TUNE_QPSK 0x58 /* for DVB-S */
|
|
-
|
|
-#define SFE_VENDOR_OPCODE_GET_FIRMWARE_VERSION 0x00
|
|
-#define SFE_VENDOR_OPCODE_HOST2CA 0x56
|
|
-#define SFE_VENDOR_OPCODE_CA2HOST 0x57
|
|
-#define SFE_VENDOR_OPCODE_CISTATUS 0x59
|
|
-#define SFE_VENDOR_OPCODE_TUNE_QPSK2 0x60 /* for DVB-S2 */
|
|
-
|
|
-#define SFE_VENDOR_TAG_CA_RESET 0x00
|
|
-#define SFE_VENDOR_TAG_CA_APPLICATION_INFO 0x01
|
|
-#define SFE_VENDOR_TAG_CA_PMT 0x02
|
|
-#define SFE_VENDOR_TAG_CA_DATE_TIME 0x04
|
|
-#define SFE_VENDOR_TAG_CA_MMI 0x05
|
|
-#define SFE_VENDOR_TAG_CA_ENTER_MENU 0x07
|
|
-
|
|
-#define EN50221_LIST_MANAGEMENT_ONLY 0x03
|
|
-#define EN50221_TAG_APP_INFO 0x9f8021
|
|
-#define EN50221_TAG_CA_INFO 0x9f8031
|
|
-
|
|
-struct avc_command_frame {
|
|
- int length;
|
|
- u8 ctype;
|
|
- u8 subunit;
|
|
- u8 opcode;
|
|
- u8 operand[509];
|
|
-};
|
|
-
|
|
-struct avc_response_frame {
|
|
- int length;
|
|
- u8 response;
|
|
- u8 subunit;
|
|
- u8 opcode;
|
|
- u8 operand[509];
|
|
-};
|
|
-
|
|
-#define AVC_DEBUG_FCP_SUBACTIONS 1
|
|
-#define AVC_DEBUG_FCP_PAYLOADS 2
|
|
-
|
|
-static int avc_debug;
|
|
-module_param_named(debug, avc_debug, int, 0644);
|
|
-MODULE_PARM_DESC(debug, "Verbose logging (default = 0"
|
|
- ", FCP subactions = " __stringify(AVC_DEBUG_FCP_SUBACTIONS)
|
|
- ", FCP payloads = " __stringify(AVC_DEBUG_FCP_PAYLOADS)
|
|
- ", or all = -1)");
|
|
-
|
|
-static const char *debug_fcp_ctype(unsigned int ctype)
|
|
-{
|
|
- static const char *ctypes[] = {
|
|
- [0x0] = "CONTROL", [0x1] = "STATUS",
|
|
- [0x2] = "SPECIFIC INQUIRY", [0x3] = "NOTIFY",
|
|
- [0x4] = "GENERAL INQUIRY", [0x8] = "NOT IMPLEMENTED",
|
|
- [0x9] = "ACCEPTED", [0xa] = "REJECTED",
|
|
- [0xb] = "IN TRANSITION", [0xc] = "IMPLEMENTED/STABLE",
|
|
- [0xd] = "CHANGED", [0xf] = "INTERIM",
|
|
- };
|
|
- const char *ret = ctype < ARRAY_SIZE(ctypes) ? ctypes[ctype] : NULL;
|
|
-
|
|
- return ret ? ret : "?";
|
|
-}
|
|
-
|
|
-static const char *debug_fcp_opcode(unsigned int opcode,
|
|
- const u8 *data, size_t length)
|
|
-{
|
|
- switch (opcode) {
|
|
- case AVC_OPCODE_VENDOR: break;
|
|
- case AVC_OPCODE_READ_DESCRIPTOR: return "ReadDescriptor";
|
|
- case AVC_OPCODE_DSIT: return "DirectSelectInfo.Type";
|
|
- case AVC_OPCODE_DSD: return "DirectSelectData";
|
|
- default: return "?";
|
|
- }
|
|
-
|
|
- if (length < 7 ||
|
|
- data[3] != SFE_VENDOR_DE_COMPANYID_0 ||
|
|
- data[4] != SFE_VENDOR_DE_COMPANYID_1 ||
|
|
- data[5] != SFE_VENDOR_DE_COMPANYID_2)
|
|
- return "Vendor";
|
|
-
|
|
- switch (data[6]) {
|
|
- case SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL: return "RegisterRC";
|
|
- case SFE_VENDOR_OPCODE_LNB_CONTROL: return "LNBControl";
|
|
- case SFE_VENDOR_OPCODE_TUNE_QPSK: return "TuneQPSK";
|
|
- case SFE_VENDOR_OPCODE_HOST2CA: return "Host2CA";
|
|
- case SFE_VENDOR_OPCODE_CA2HOST: return "CA2Host";
|
|
- }
|
|
- return "Vendor";
|
|
-}
|
|
-
|
|
-static void debug_fcp(const u8 *data, size_t length)
|
|
-{
|
|
- unsigned int subunit_type, subunit_id, op;
|
|
- const char *prefix = data[0] > 7 ? "FCP <- " : "FCP -> ";
|
|
-
|
|
- if (avc_debug & AVC_DEBUG_FCP_SUBACTIONS) {
|
|
- subunit_type = data[1] >> 3;
|
|
- subunit_id = data[1] & 7;
|
|
- op = subunit_type == 0x1e || subunit_id == 5 ? ~0 : data[2];
|
|
- printk(KERN_INFO "%ssu=%x.%x l=%d: %-8s - %s\n",
|
|
- prefix, subunit_type, subunit_id, length,
|
|
- debug_fcp_ctype(data[0]),
|
|
- debug_fcp_opcode(op, data, length));
|
|
- }
|
|
-
|
|
- if (avc_debug & AVC_DEBUG_FCP_PAYLOADS)
|
|
- print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_NONE, 16, 1,
|
|
- data, length, false);
|
|
-}
|
|
-
|
|
-static int __avc_write(struct firedtv *fdtv,
|
|
- const struct avc_command_frame *c, struct avc_response_frame *r)
|
|
-{
|
|
- int err, retry;
|
|
-
|
|
- if (r)
|
|
- fdtv->avc_reply_received = false;
|
|
-
|
|
- for (retry = 0; retry < 6; retry++) {
|
|
- if (unlikely(avc_debug))
|
|
- debug_fcp(&c->ctype, c->length);
|
|
-
|
|
- err = fdtv->backend->write(fdtv, FCP_COMMAND_REGISTER,
|
|
- (void *)&c->ctype, c->length);
|
|
- if (err) {
|
|
- fdtv->avc_reply_received = true;
|
|
- dev_err(fdtv->device, "FCP command write failed\n");
|
|
- return err;
|
|
- }
|
|
-
|
|
- if (!r)
|
|
- return 0;
|
|
-
|
|
- /*
|
|
- * AV/C specs say that answers should be sent within 150 ms.
|
|
- * Time out after 200 ms.
|
|
- */
|
|
- if (wait_event_timeout(fdtv->avc_wait,
|
|
- fdtv->avc_reply_received,
|
|
- msecs_to_jiffies(200)) != 0) {
|
|
- r->length = fdtv->response_length;
|
|
- memcpy(&r->response, fdtv->response, r->length);
|
|
-
|
|
- return 0;
|
|
- }
|
|
- }
|
|
- dev_err(fdtv->device, "FCP response timed out\n");
|
|
- return -ETIMEDOUT;
|
|
-}
|
|
-
|
|
-static int avc_write(struct firedtv *fdtv,
|
|
- const struct avc_command_frame *c, struct avc_response_frame *r)
|
|
-{
|
|
- int ret;
|
|
-
|
|
- if (mutex_lock_interruptible(&fdtv->avc_mutex))
|
|
- return -EINTR;
|
|
-
|
|
- ret = __avc_write(fdtv, c, r);
|
|
-
|
|
- mutex_unlock(&fdtv->avc_mutex);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-int avc_recv(struct firedtv *fdtv, void *data, size_t length)
|
|
-{
|
|
- struct avc_response_frame *r =
|
|
- data - offsetof(struct avc_response_frame, response);
|
|
-
|
|
- if (unlikely(avc_debug))
|
|
- debug_fcp(data, length);
|
|
-
|
|
- if (length >= 8 &&
|
|
- r->operand[0] == SFE_VENDOR_DE_COMPANYID_0 &&
|
|
- r->operand[1] == SFE_VENDOR_DE_COMPANYID_1 &&
|
|
- r->operand[2] == SFE_VENDOR_DE_COMPANYID_2 &&
|
|
- r->operand[3] == SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL) {
|
|
- if (r->response == AVC_RESPONSE_CHANGED) {
|
|
- fdtv_handle_rc(fdtv,
|
|
- r->operand[4] << 8 | r->operand[5]);
|
|
- schedule_work(&fdtv->remote_ctrl_work);
|
|
- } else if (r->response != AVC_RESPONSE_INTERIM) {
|
|
- dev_info(fdtv->device,
|
|
- "remote control result = %d\n", r->response);
|
|
- }
|
|
- return 0;
|
|
- }
|
|
-
|
|
- if (fdtv->avc_reply_received) {
|
|
- dev_err(fdtv->device, "out-of-order AVC response, ignored\n");
|
|
- return -EIO;
|
|
- }
|
|
-
|
|
- memcpy(fdtv->response, data, length);
|
|
- fdtv->response_length = length;
|
|
-
|
|
- fdtv->avc_reply_received = true;
|
|
- wake_up(&fdtv->avc_wait);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * tuning command for setting the relative LNB frequency
|
|
- * (not supported by the AVC standard)
|
|
- */
|
|
-static void avc_tuner_tuneqpsk(struct firedtv *fdtv,
|
|
- struct dvb_frontend_parameters *params,
|
|
- struct avc_command_frame *c)
|
|
-{
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_TUNE_QPSK;
|
|
-
|
|
- c->operand[4] = (params->frequency >> 24) & 0xff;
|
|
- c->operand[5] = (params->frequency >> 16) & 0xff;
|
|
- c->operand[6] = (params->frequency >> 8) & 0xff;
|
|
- c->operand[7] = params->frequency & 0xff;
|
|
-
|
|
- c->operand[8] = ((params->u.qpsk.symbol_rate / 1000) >> 8) & 0xff;
|
|
- c->operand[9] = (params->u.qpsk.symbol_rate / 1000) & 0xff;
|
|
-
|
|
- switch (params->u.qpsk.fec_inner) {
|
|
- case FEC_1_2: c->operand[10] = 0x1; break;
|
|
- case FEC_2_3: c->operand[10] = 0x2; break;
|
|
- case FEC_3_4: c->operand[10] = 0x3; break;
|
|
- case FEC_5_6: c->operand[10] = 0x4; break;
|
|
- case FEC_7_8: c->operand[10] = 0x5; break;
|
|
- case FEC_4_5:
|
|
- case FEC_8_9:
|
|
- case FEC_AUTO:
|
|
- default: c->operand[10] = 0x0;
|
|
- }
|
|
-
|
|
- if (fdtv->voltage == 0xff)
|
|
- c->operand[11] = 0xff;
|
|
- else if (fdtv->voltage == SEC_VOLTAGE_18) /* polarisation */
|
|
- c->operand[11] = 0;
|
|
- else
|
|
- c->operand[11] = 1;
|
|
-
|
|
- if (fdtv->tone == 0xff)
|
|
- c->operand[12] = 0xff;
|
|
- else if (fdtv->tone == SEC_TONE_ON) /* band */
|
|
- c->operand[12] = 1;
|
|
- else
|
|
- c->operand[12] = 0;
|
|
-
|
|
- if (fdtv->type == FIREDTV_DVB_S2) {
|
|
- c->operand[13] = 0x1;
|
|
- c->operand[14] = 0xff;
|
|
- c->operand[15] = 0xff;
|
|
- c->length = 20;
|
|
- } else {
|
|
- c->length = 16;
|
|
- }
|
|
-}
|
|
-
|
|
-static void avc_tuner_dsd_dvb_c(struct dvb_frontend_parameters *params,
|
|
- struct avc_command_frame *c)
|
|
-{
|
|
- c->opcode = AVC_OPCODE_DSD;
|
|
-
|
|
- c->operand[0] = 0; /* source plug */
|
|
- c->operand[1] = 0xd2; /* subfunction replace */
|
|
- c->operand[2] = 0x20; /* system id = DVB */
|
|
- c->operand[3] = 0x00; /* antenna number */
|
|
- c->operand[4] = 0x11; /* system_specific_multiplex selection_length */
|
|
-
|
|
- /* multiplex_valid_flags, high byte */
|
|
- c->operand[5] = 0 << 7 /* reserved */
|
|
- | 0 << 6 /* Polarisation */
|
|
- | 0 << 5 /* Orbital_Pos */
|
|
- | 1 << 4 /* Frequency */
|
|
- | 1 << 3 /* Symbol_Rate */
|
|
- | 0 << 2 /* FEC_outer */
|
|
- | (params->u.qam.fec_inner != FEC_AUTO ? 1 << 1 : 0)
|
|
- | (params->u.qam.modulation != QAM_AUTO ? 1 << 0 : 0);
|
|
-
|
|
- /* multiplex_valid_flags, low byte */
|
|
- c->operand[6] = 0 << 7 /* NetworkID */
|
|
- | 0 << 0 /* reserved */ ;
|
|
-
|
|
- c->operand[7] = 0x00;
|
|
- c->operand[8] = 0x00;
|
|
- c->operand[9] = 0x00;
|
|
- c->operand[10] = 0x00;
|
|
-
|
|
- c->operand[11] = (((params->frequency / 4000) >> 16) & 0xff) | (2 << 6);
|
|
- c->operand[12] = ((params->frequency / 4000) >> 8) & 0xff;
|
|
- c->operand[13] = (params->frequency / 4000) & 0xff;
|
|
- c->operand[14] = ((params->u.qpsk.symbol_rate / 1000) >> 12) & 0xff;
|
|
- c->operand[15] = ((params->u.qpsk.symbol_rate / 1000) >> 4) & 0xff;
|
|
- c->operand[16] = ((params->u.qpsk.symbol_rate / 1000) << 4) & 0xf0;
|
|
- c->operand[17] = 0x00;
|
|
-
|
|
- switch (params->u.qpsk.fec_inner) {
|
|
- case FEC_1_2: c->operand[18] = 0x1; break;
|
|
- case FEC_2_3: c->operand[18] = 0x2; break;
|
|
- case FEC_3_4: c->operand[18] = 0x3; break;
|
|
- case FEC_5_6: c->operand[18] = 0x4; break;
|
|
- case FEC_7_8: c->operand[18] = 0x5; break;
|
|
- case FEC_8_9: c->operand[18] = 0x6; break;
|
|
- case FEC_4_5: c->operand[18] = 0x8; break;
|
|
- case FEC_AUTO:
|
|
- default: c->operand[18] = 0x0;
|
|
- }
|
|
-
|
|
- switch (params->u.qam.modulation) {
|
|
- case QAM_16: c->operand[19] = 0x08; break;
|
|
- case QAM_32: c->operand[19] = 0x10; break;
|
|
- case QAM_64: c->operand[19] = 0x18; break;
|
|
- case QAM_128: c->operand[19] = 0x20; break;
|
|
- case QAM_256: c->operand[19] = 0x28; break;
|
|
- case QAM_AUTO:
|
|
- default: c->operand[19] = 0x00;
|
|
- }
|
|
-
|
|
- c->operand[20] = 0x00;
|
|
- c->operand[21] = 0x00;
|
|
- /* Nr_of_dsd_sel_specs = 0 -> no PIDs are transmitted */
|
|
- c->operand[22] = 0x00;
|
|
-
|
|
- c->length = 28;
|
|
-}
|
|
-
|
|
-static void avc_tuner_dsd_dvb_t(struct dvb_frontend_parameters *params,
|
|
- struct avc_command_frame *c)
|
|
-{
|
|
- struct dvb_ofdm_parameters *ofdm = ¶ms->u.ofdm;
|
|
-
|
|
- c->opcode = AVC_OPCODE_DSD;
|
|
-
|
|
- c->operand[0] = 0; /* source plug */
|
|
- c->operand[1] = 0xd2; /* subfunction replace */
|
|
- c->operand[2] = 0x20; /* system id = DVB */
|
|
- c->operand[3] = 0x00; /* antenna number */
|
|
- c->operand[4] = 0x0c; /* system_specific_multiplex selection_length */
|
|
-
|
|
- /* multiplex_valid_flags, high byte */
|
|
- c->operand[5] =
|
|
- 0 << 7 /* reserved */
|
|
- | 1 << 6 /* CenterFrequency */
|
|
- | (ofdm->bandwidth != BANDWIDTH_AUTO ? 1 << 5 : 0)
|
|
- | (ofdm->constellation != QAM_AUTO ? 1 << 4 : 0)
|
|
- | (ofdm->hierarchy_information != HIERARCHY_AUTO ? 1 << 3 : 0)
|
|
- | (ofdm->code_rate_HP != FEC_AUTO ? 1 << 2 : 0)
|
|
- | (ofdm->code_rate_LP != FEC_AUTO ? 1 << 1 : 0)
|
|
- | (ofdm->guard_interval != GUARD_INTERVAL_AUTO ? 1 << 0 : 0);
|
|
-
|
|
- /* multiplex_valid_flags, low byte */
|
|
- c->operand[6] =
|
|
- 0 << 7 /* NetworkID */
|
|
- | (ofdm->transmission_mode != TRANSMISSION_MODE_AUTO ? 1 << 6 : 0)
|
|
- | 0 << 5 /* OtherFrequencyFlag */
|
|
- | 0 << 0 /* reserved */ ;
|
|
-
|
|
- c->operand[7] = 0x0;
|
|
- c->operand[8] = (params->frequency / 10) >> 24;
|
|
- c->operand[9] = ((params->frequency / 10) >> 16) & 0xff;
|
|
- c->operand[10] = ((params->frequency / 10) >> 8) & 0xff;
|
|
- c->operand[11] = (params->frequency / 10) & 0xff;
|
|
-
|
|
- switch (ofdm->bandwidth) {
|
|
- case BANDWIDTH_7_MHZ: c->operand[12] = 0x20; break;
|
|
- case BANDWIDTH_8_MHZ:
|
|
- case BANDWIDTH_6_MHZ: /* not defined by AVC spec */
|
|
- case BANDWIDTH_AUTO:
|
|
- default: c->operand[12] = 0x00;
|
|
- }
|
|
-
|
|
- switch (ofdm->constellation) {
|
|
- case QAM_16: c->operand[13] = 1 << 6; break;
|
|
- case QAM_64: c->operand[13] = 2 << 6; break;
|
|
- case QPSK:
|
|
- default: c->operand[13] = 0x00;
|
|
- }
|
|
-
|
|
- switch (ofdm->hierarchy_information) {
|
|
- case HIERARCHY_1: c->operand[13] |= 1 << 3; break;
|
|
- case HIERARCHY_2: c->operand[13] |= 2 << 3; break;
|
|
- case HIERARCHY_4: c->operand[13] |= 3 << 3; break;
|
|
- case HIERARCHY_AUTO:
|
|
- case HIERARCHY_NONE:
|
|
- default: break;
|
|
- }
|
|
-
|
|
- switch (ofdm->code_rate_HP) {
|
|
- case FEC_2_3: c->operand[13] |= 1; break;
|
|
- case FEC_3_4: c->operand[13] |= 2; break;
|
|
- case FEC_5_6: c->operand[13] |= 3; break;
|
|
- case FEC_7_8: c->operand[13] |= 4; break;
|
|
- case FEC_1_2:
|
|
- default: break;
|
|
- }
|
|
-
|
|
- switch (ofdm->code_rate_LP) {
|
|
- case FEC_2_3: c->operand[14] = 1 << 5; break;
|
|
- case FEC_3_4: c->operand[14] = 2 << 5; break;
|
|
- case FEC_5_6: c->operand[14] = 3 << 5; break;
|
|
- case FEC_7_8: c->operand[14] = 4 << 5; break;
|
|
- case FEC_1_2:
|
|
- default: c->operand[14] = 0x00; break;
|
|
- }
|
|
-
|
|
- switch (ofdm->guard_interval) {
|
|
- case GUARD_INTERVAL_1_16: c->operand[14] |= 1 << 3; break;
|
|
- case GUARD_INTERVAL_1_8: c->operand[14] |= 2 << 3; break;
|
|
- case GUARD_INTERVAL_1_4: c->operand[14] |= 3 << 3; break;
|
|
- case GUARD_INTERVAL_1_32:
|
|
- case GUARD_INTERVAL_AUTO:
|
|
- default: break;
|
|
- }
|
|
-
|
|
- switch (ofdm->transmission_mode) {
|
|
- case TRANSMISSION_MODE_8K: c->operand[14] |= 1 << 1; break;
|
|
- case TRANSMISSION_MODE_2K:
|
|
- case TRANSMISSION_MODE_AUTO:
|
|
- default: break;
|
|
- }
|
|
-
|
|
- c->operand[15] = 0x00; /* network_ID[0] */
|
|
- c->operand[16] = 0x00; /* network_ID[1] */
|
|
- /* Nr_of_dsd_sel_specs = 0 -> no PIDs are transmitted */
|
|
- c->operand[17] = 0x00;
|
|
-
|
|
- c->length = 24;
|
|
-}
|
|
-
|
|
-int avc_tuner_dsd(struct firedtv *fdtv,
|
|
- struct dvb_frontend_parameters *params)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
-
|
|
- switch (fdtv->type) {
|
|
- case FIREDTV_DVB_S:
|
|
- case FIREDTV_DVB_S2: avc_tuner_tuneqpsk(fdtv, params, c); break;
|
|
- case FIREDTV_DVB_C: avc_tuner_dsd_dvb_c(params, c); break;
|
|
- case FIREDTV_DVB_T: avc_tuner_dsd_dvb_t(params, c); break;
|
|
- default:
|
|
- BUG();
|
|
- }
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- msleep(500);
|
|
-#if 0
|
|
- /* FIXME: */
|
|
- /* u8 *status was an out-parameter of avc_tuner_dsd, unused by caller */
|
|
- if (status)
|
|
- *status = r->operand[2];
|
|
-#endif
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_tuner_set_pids(struct firedtv *fdtv, unsigned char pidc, u16 pid[])
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
|
|
- int pos, k;
|
|
-
|
|
- if (pidc > 16 && pidc != 0xff)
|
|
- return -EINVAL;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_DSD;
|
|
-
|
|
- c->operand[0] = 0; /* source plug */
|
|
- c->operand[1] = 0xd2; /* subfunction replace */
|
|
- c->operand[2] = 0x20; /* system id = DVB */
|
|
- c->operand[3] = 0x00; /* antenna number */
|
|
- c->operand[4] = 0x00; /* system_specific_multiplex selection_length */
|
|
- c->operand[5] = pidc; /* Nr_of_dsd_sel_specs */
|
|
-
|
|
- pos = 6;
|
|
- if (pidc != 0xff)
|
|
- for (k = 0; k < pidc; k++) {
|
|
- c->operand[pos++] = 0x13; /* flowfunction relay */
|
|
- c->operand[pos++] = 0x80; /* dsd_sel_spec_valid_flags -> PID */
|
|
- c->operand[pos++] = (pid[k] >> 8) & 0x1f;
|
|
- c->operand[pos++] = pid[k] & 0xff;
|
|
- c->operand[pos++] = 0x00; /* tableID */
|
|
- c->operand[pos++] = 0x00; /* filter_length */
|
|
- }
|
|
-
|
|
- c->length = ALIGN(3 + pos, 4);
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- msleep(50);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_tuner_get_ts(struct firedtv *fdtv)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
|
|
- int sl;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_DSIT;
|
|
-
|
|
- sl = fdtv->type == FIREDTV_DVB_T ? 0x0c : 0x11;
|
|
-
|
|
- c->operand[0] = 0; /* source plug */
|
|
- c->operand[1] = 0xd2; /* subfunction replace */
|
|
- c->operand[2] = 0xff; /* status */
|
|
- c->operand[3] = 0x20; /* system id = DVB */
|
|
- c->operand[4] = 0x00; /* antenna number */
|
|
- c->operand[5] = 0x0; /* system_specific_search_flags */
|
|
- c->operand[6] = sl; /* system_specific_multiplex selection_length */
|
|
- c->operand[7] = 0x00; /* valid_flags [0] */
|
|
- c->operand[8] = 0x00; /* valid_flags [1] */
|
|
- c->operand[7 + sl] = 0x00; /* nr_of_dsit_sel_specs (always 0) */
|
|
-
|
|
- c->length = fdtv->type == FIREDTV_DVB_T ? 24 : 28;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- msleep(250);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_identify_subunit(struct firedtv *fdtv)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_READ_DESCRIPTOR;
|
|
-
|
|
- c->operand[0] = DESCRIPTOR_SUBUNIT_IDENTIFIER;
|
|
- c->operand[1] = 0xff;
|
|
- c->operand[2] = 0x00;
|
|
- c->operand[3] = 0x00; /* length highbyte */
|
|
- c->operand[4] = 0x08; /* length lowbyte */
|
|
- c->operand[5] = 0x00; /* offset highbyte */
|
|
- c->operand[6] = 0x0d; /* offset lowbyte */
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- if ((r->response != AVC_RESPONSE_STABLE &&
|
|
- r->response != AVC_RESPONSE_ACCEPTED) ||
|
|
- (r->operand[3] << 8) + r->operand[4] != 8) {
|
|
- dev_err(fdtv->device, "cannot read subunit identifier\n");
|
|
- return -EINVAL;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-#define SIZEOF_ANTENNA_INPUT_INFO 22
|
|
-
|
|
-int avc_tuner_status(struct firedtv *fdtv, struct firedtv_tuner_status *stat)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer;
|
|
- int length;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_READ_DESCRIPTOR;
|
|
-
|
|
- c->operand[0] = DESCRIPTOR_TUNER_STATUS;
|
|
- c->operand[1] = 0xff; /* read_result_status */
|
|
- c->operand[2] = 0x00; /* reserved */
|
|
- c->operand[3] = 0; /* SIZEOF_ANTENNA_INPUT_INFO >> 8; */
|
|
- c->operand[4] = 0; /* SIZEOF_ANTENNA_INPUT_INFO & 0xff; */
|
|
- c->operand[5] = 0x00;
|
|
- c->operand[6] = 0x00;
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- if (r->response != AVC_RESPONSE_STABLE &&
|
|
- r->response != AVC_RESPONSE_ACCEPTED) {
|
|
- dev_err(fdtv->device, "cannot read tuner status\n");
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- length = r->operand[9];
|
|
- if (r->operand[1] != 0x10 || length != SIZEOF_ANTENNA_INPUT_INFO) {
|
|
- dev_err(fdtv->device, "got invalid tuner status\n");
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- stat->active_system = r->operand[10];
|
|
- stat->searching = r->operand[11] >> 7 & 1;
|
|
- stat->moving = r->operand[11] >> 6 & 1;
|
|
- stat->no_rf = r->operand[11] >> 5 & 1;
|
|
- stat->input = r->operand[12] >> 7 & 1;
|
|
- stat->selected_antenna = r->operand[12] & 0x7f;
|
|
- stat->ber = r->operand[13] << 24 |
|
|
- r->operand[14] << 16 |
|
|
- r->operand[15] << 8 |
|
|
- r->operand[16];
|
|
- stat->signal_strength = r->operand[17];
|
|
- stat->raster_frequency = r->operand[18] >> 6 & 2;
|
|
- stat->rf_frequency = (r->operand[18] & 0x3f) << 16 |
|
|
- r->operand[19] << 8 |
|
|
- r->operand[20];
|
|
- stat->man_dep_info_length = r->operand[21];
|
|
- stat->front_end_error = r->operand[22] >> 4 & 1;
|
|
- stat->antenna_error = r->operand[22] >> 3 & 1;
|
|
- stat->front_end_power_status = r->operand[22] >> 1 & 1;
|
|
- stat->power_supply = r->operand[22] & 1;
|
|
- stat->carrier_noise_ratio = r->operand[23] << 8 |
|
|
- r->operand[24];
|
|
- stat->power_supply_voltage = r->operand[27];
|
|
- stat->antenna_voltage = r->operand[28];
|
|
- stat->firewire_bus_voltage = r->operand[29];
|
|
- stat->ca_mmi = r->operand[30] & 1;
|
|
- stat->ca_pmt_reply = r->operand[31] >> 7 & 1;
|
|
- stat->ca_date_time_request = r->operand[31] >> 6 & 1;
|
|
- stat->ca_application_info = r->operand[31] >> 5 & 1;
|
|
- stat->ca_module_present_status = r->operand[31] >> 4 & 1;
|
|
- stat->ca_dvb_flag = r->operand[31] >> 3 & 1;
|
|
- stat->ca_error_flag = r->operand[31] >> 2 & 1;
|
|
- stat->ca_initialization_status = r->operand[31] >> 1 & 1;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_lnb_control(struct firedtv *fdtv, char voltage, char burst,
|
|
- char conttone, char nrdiseq,
|
|
- struct dvb_diseqc_master_cmd *diseqcmd)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer;
|
|
- int i, j, k;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_LNB_CONTROL;
|
|
-
|
|
- c->operand[4] = voltage;
|
|
- c->operand[5] = nrdiseq;
|
|
-
|
|
- i = 6;
|
|
-
|
|
- for (j = 0; j < nrdiseq; j++) {
|
|
- c->operand[i++] = diseqcmd[j].msg_len;
|
|
-
|
|
- for (k = 0; k < diseqcmd[j].msg_len; k++)
|
|
- c->operand[i++] = diseqcmd[j].msg[k];
|
|
- }
|
|
-
|
|
- c->operand[i++] = burst;
|
|
- c->operand[i++] = conttone;
|
|
-
|
|
- c->length = ALIGN(3 + i, 4);
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- if (r->response != AVC_RESPONSE_ACCEPTED) {
|
|
- dev_err(fdtv->device, "LNB control failed\n");
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_register_remote_control(struct firedtv *fdtv)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_NOTIFY;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_UNIT | 7;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL;
|
|
-
|
|
- c->length = 8;
|
|
-
|
|
- return avc_write(fdtv, c, NULL);
|
|
-}
|
|
-
|
|
-void avc_remote_ctrl_work(struct work_struct *work)
|
|
-{
|
|
- struct firedtv *fdtv =
|
|
- container_of(work, struct firedtv, remote_ctrl_work);
|
|
-
|
|
- /* Should it be rescheduled in failure cases? */
|
|
- avc_register_remote_control(fdtv);
|
|
-}
|
|
-
|
|
-#if 0 /* FIXME: unused */
|
|
-int avc_tuner_host2ca(struct firedtv *fdtv)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
|
|
- c->operand[4] = 0; /* slot */
|
|
- c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
|
|
- c->operand[6] = 0; /* more/last */
|
|
- c->operand[7] = 0; /* length */
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-#endif
|
|
-
|
|
-static int get_ca_object_pos(struct avc_response_frame *r)
|
|
-{
|
|
- int length = 1;
|
|
-
|
|
- /* Check length of length field */
|
|
- if (r->operand[7] & 0x80)
|
|
- length = (r->operand[7] & 0x7f) + 1;
|
|
- return length + 7;
|
|
-}
|
|
-
|
|
-static int get_ca_object_length(struct avc_response_frame *r)
|
|
-{
|
|
-#if 0 /* FIXME: unused */
|
|
- int size = 0;
|
|
- int i;
|
|
-
|
|
- if (r->operand[7] & 0x80)
|
|
- for (i = 0; i < (r->operand[7] & 0x7f); i++) {
|
|
- size <<= 8;
|
|
- size += r->operand[8 + i];
|
|
- }
|
|
-#endif
|
|
- return r->operand[7];
|
|
-}
|
|
-
|
|
-int avc_ca_app_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer;
|
|
- int pos;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_STATUS;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
|
|
- c->operand[4] = 0; /* slot */
|
|
- c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- /* FIXME: check response code and validate response data */
|
|
-
|
|
- pos = get_ca_object_pos(r);
|
|
- app_info[0] = (EN50221_TAG_APP_INFO >> 16) & 0xff;
|
|
- app_info[1] = (EN50221_TAG_APP_INFO >> 8) & 0xff;
|
|
- app_info[2] = (EN50221_TAG_APP_INFO >> 0) & 0xff;
|
|
- app_info[3] = 6 + r->operand[pos + 4];
|
|
- app_info[4] = 0x01;
|
|
- memcpy(&app_info[5], &r->operand[pos], 5 + r->operand[pos + 4]);
|
|
- *len = app_info[3] + 4;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_ca_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer;
|
|
- int pos;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_STATUS;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
|
|
- c->operand[4] = 0; /* slot */
|
|
- c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- pos = get_ca_object_pos(r);
|
|
- app_info[0] = (EN50221_TAG_CA_INFO >> 16) & 0xff;
|
|
- app_info[1] = (EN50221_TAG_CA_INFO >> 8) & 0xff;
|
|
- app_info[2] = (EN50221_TAG_CA_INFO >> 0) & 0xff;
|
|
- app_info[3] = 2;
|
|
- app_info[4] = r->operand[pos + 0];
|
|
- app_info[5] = r->operand[pos + 1];
|
|
- *len = app_info[3] + 4;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_ca_reset(struct firedtv *fdtv)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
|
|
- c->operand[4] = 0; /* slot */
|
|
- c->operand[5] = SFE_VENDOR_TAG_CA_RESET; /* ca tag */
|
|
- c->operand[6] = 0; /* more/last */
|
|
- c->operand[7] = 1; /* length */
|
|
- c->operand[8] = 0; /* force hardware reset */
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer;
|
|
- int list_management;
|
|
- int program_info_length;
|
|
- int pmt_cmd_id;
|
|
- int read_pos;
|
|
- int write_pos;
|
|
- int es_info_length;
|
|
- int crc32_csum;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_CONTROL;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- if (msg[0] != EN50221_LIST_MANAGEMENT_ONLY) {
|
|
- dev_info(fdtv->device, "forcing list_management to ONLY\n");
|
|
- msg[0] = EN50221_LIST_MANAGEMENT_ONLY;
|
|
- }
|
|
- /* We take the cmd_id from the programme level only! */
|
|
- list_management = msg[0];
|
|
- program_info_length = ((msg[4] & 0x0f) << 8) + msg[5];
|
|
- if (program_info_length > 0)
|
|
- program_info_length--; /* Remove pmt_cmd_id */
|
|
- pmt_cmd_id = msg[6];
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
|
|
- c->operand[4] = 0; /* slot */
|
|
- c->operand[5] = SFE_VENDOR_TAG_CA_PMT; /* ca tag */
|
|
- c->operand[6] = 0; /* more/last */
|
|
- /* c->operand[7] = XXXprogram_info_length + 17; */ /* length */
|
|
- c->operand[8] = list_management;
|
|
- c->operand[9] = 0x01; /* pmt_cmd=OK_descramble */
|
|
-
|
|
- /* TS program map table */
|
|
-
|
|
- c->operand[10] = 0x02; /* Table id=2 */
|
|
- c->operand[11] = 0x80; /* Section syntax + length */
|
|
- /* c->operand[12] = XXXprogram_info_length + 12; */
|
|
- c->operand[13] = msg[1]; /* Program number */
|
|
- c->operand[14] = msg[2];
|
|
- c->operand[15] = 0x01; /* Version number=0 + current/next=1 */
|
|
- c->operand[16] = 0x00; /* Section number=0 */
|
|
- c->operand[17] = 0x00; /* Last section number=0 */
|
|
- c->operand[18] = 0x1f; /* PCR_PID=1FFF */
|
|
- c->operand[19] = 0xff;
|
|
- c->operand[20] = (program_info_length >> 8); /* Program info length */
|
|
- c->operand[21] = (program_info_length & 0xff);
|
|
-
|
|
- /* CA descriptors at programme level */
|
|
- read_pos = 6;
|
|
- write_pos = 22;
|
|
- if (program_info_length > 0) {
|
|
- pmt_cmd_id = msg[read_pos++];
|
|
- if (pmt_cmd_id != 1 && pmt_cmd_id != 4)
|
|
- dev_err(fdtv->device,
|
|
- "invalid pmt_cmd_id %d\n", pmt_cmd_id);
|
|
-
|
|
- memcpy(&c->operand[write_pos], &msg[read_pos],
|
|
- program_info_length);
|
|
- read_pos += program_info_length;
|
|
- write_pos += program_info_length;
|
|
- }
|
|
- while (read_pos < length) {
|
|
- c->operand[write_pos++] = msg[read_pos++];
|
|
- c->operand[write_pos++] = msg[read_pos++];
|
|
- c->operand[write_pos++] = msg[read_pos++];
|
|
- es_info_length =
|
|
- ((msg[read_pos] & 0x0f) << 8) + msg[read_pos + 1];
|
|
- read_pos += 2;
|
|
- if (es_info_length > 0)
|
|
- es_info_length--; /* Remove pmt_cmd_id */
|
|
- c->operand[write_pos++] = es_info_length >> 8;
|
|
- c->operand[write_pos++] = es_info_length & 0xff;
|
|
- if (es_info_length > 0) {
|
|
- pmt_cmd_id = msg[read_pos++];
|
|
- if (pmt_cmd_id != 1 && pmt_cmd_id != 4)
|
|
- dev_err(fdtv->device, "invalid pmt_cmd_id %d "
|
|
- "at stream level\n", pmt_cmd_id);
|
|
-
|
|
- memcpy(&c->operand[write_pos], &msg[read_pos],
|
|
- es_info_length);
|
|
- read_pos += es_info_length;
|
|
- write_pos += es_info_length;
|
|
- }
|
|
- }
|
|
-
|
|
- /* CRC */
|
|
- c->operand[write_pos++] = 0x00;
|
|
- c->operand[write_pos++] = 0x00;
|
|
- c->operand[write_pos++] = 0x00;
|
|
- c->operand[write_pos++] = 0x00;
|
|
-
|
|
- c->operand[7] = write_pos - 8;
|
|
- c->operand[12] = write_pos - 13;
|
|
-
|
|
- crc32_csum = crc32_be(0, &c->operand[10], c->operand[12] - 1);
|
|
- c->operand[write_pos - 4] = (crc32_csum >> 24) & 0xff;
|
|
- c->operand[write_pos - 3] = (crc32_csum >> 16) & 0xff;
|
|
- c->operand[write_pos - 2] = (crc32_csum >> 8) & 0xff;
|
|
- c->operand[write_pos - 1] = (crc32_csum >> 0) & 0xff;
|
|
-
|
|
- c->length = ALIGN(3 + write_pos, 4);
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- if (r->response != AVC_RESPONSE_ACCEPTED) {
|
|
- dev_err(fdtv->device,
|
|
- "CA PMT failed with response 0x%x\n", r->response);
|
|
- return -EFAULT;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_ca_get_time_date(struct firedtv *fdtv, int *interval)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_STATUS;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
|
|
- c->operand[4] = 0; /* slot */
|
|
- c->operand[5] = SFE_VENDOR_TAG_CA_DATE_TIME; /* ca tag */
|
|
- c->operand[6] = 0; /* more/last */
|
|
- c->operand[7] = 0; /* length */
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- /* FIXME: check response code and validate response data */
|
|
-
|
|
- *interval = r->operand[get_ca_object_pos(r)];
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_ca_enter_menu(struct firedtv *fdtv)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_STATUS;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
|
|
- c->operand[4] = 0; /* slot */
|
|
- c->operand[5] = SFE_VENDOR_TAG_CA_ENTER_MENU;
|
|
- c->operand[6] = 0; /* more/last */
|
|
- c->operand[7] = 0; /* length */
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int avc_ca_get_mmi(struct firedtv *fdtv, char *mmi_object, unsigned int *len)
|
|
-{
|
|
- char buffer[sizeof(struct avc_command_frame)];
|
|
- struct avc_command_frame *c = (void *)buffer;
|
|
- struct avc_response_frame *r = (void *)buffer;
|
|
-
|
|
- memset(c, 0, sizeof(*c));
|
|
-
|
|
- c->ctype = AVC_CTYPE_STATUS;
|
|
- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
|
|
- c->opcode = AVC_OPCODE_VENDOR;
|
|
-
|
|
- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
|
|
- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
|
|
- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
|
|
- c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
|
|
- c->operand[4] = 0; /* slot */
|
|
- c->operand[5] = SFE_VENDOR_TAG_CA_MMI;
|
|
- c->operand[6] = 0; /* more/last */
|
|
- c->operand[7] = 0; /* length */
|
|
-
|
|
- c->length = 12;
|
|
-
|
|
- if (avc_write(fdtv, c, r) < 0)
|
|
- return -EIO;
|
|
-
|
|
- /* FIXME: check response code and validate response data */
|
|
-
|
|
- *len = get_ca_object_length(r);
|
|
- memcpy(mmi_object, &r->operand[get_ca_object_pos(r)], *len);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-#define CMP_OUTPUT_PLUG_CONTROL_REG_0 0xfffff0000904ULL
|
|
-
|
|
-static int cmp_read(struct firedtv *fdtv, void *buf, u64 addr, size_t len)
|
|
-{
|
|
- int ret;
|
|
-
|
|
- if (mutex_lock_interruptible(&fdtv->avc_mutex))
|
|
- return -EINTR;
|
|
-
|
|
- ret = fdtv->backend->read(fdtv, addr, buf, len);
|
|
- if (ret < 0)
|
|
- dev_err(fdtv->device, "CMP: read I/O error\n");
|
|
-
|
|
- mutex_unlock(&fdtv->avc_mutex);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int cmp_lock(struct firedtv *fdtv, void *data, u64 addr, __be32 arg)
|
|
-{
|
|
- int ret;
|
|
-
|
|
- if (mutex_lock_interruptible(&fdtv->avc_mutex))
|
|
- return -EINTR;
|
|
-
|
|
- ret = fdtv->backend->lock(fdtv, addr, data, arg);
|
|
- if (ret < 0)
|
|
- dev_err(fdtv->device, "CMP: lock I/O error\n");
|
|
-
|
|
- mutex_unlock(&fdtv->avc_mutex);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static inline u32 get_opcr(__be32 opcr, u32 mask, u32 shift)
|
|
-{
|
|
- return (be32_to_cpu(opcr) >> shift) & mask;
|
|
-}
|
|
-
|
|
-static inline void set_opcr(__be32 *opcr, u32 value, u32 mask, u32 shift)
|
|
-{
|
|
- *opcr &= ~cpu_to_be32(mask << shift);
|
|
- *opcr |= cpu_to_be32((value & mask) << shift);
|
|
-}
|
|
-
|
|
-#define get_opcr_online(v) get_opcr((v), 0x1, 31)
|
|
-#define get_opcr_p2p_connections(v) get_opcr((v), 0x3f, 24)
|
|
-#define get_opcr_channel(v) get_opcr((v), 0x3f, 16)
|
|
-
|
|
-#define set_opcr_p2p_connections(p, v) set_opcr((p), (v), 0x3f, 24)
|
|
-#define set_opcr_channel(p, v) set_opcr((p), (v), 0x3f, 16)
|
|
-#define set_opcr_data_rate(p, v) set_opcr((p), (v), 0x3, 14)
|
|
-#define set_opcr_overhead_id(p, v) set_opcr((p), (v), 0xf, 10)
|
|
-
|
|
-int cmp_establish_pp_connection(struct firedtv *fdtv, int plug, int channel)
|
|
-{
|
|
- __be32 old_opcr, opcr;
|
|
- u64 opcr_address = CMP_OUTPUT_PLUG_CONTROL_REG_0 + (plug << 2);
|
|
- int attempts = 0;
|
|
- int ret;
|
|
-
|
|
- ret = cmp_read(fdtv, &opcr, opcr_address, 4);
|
|
- if (ret < 0)
|
|
- return ret;
|
|
-
|
|
-repeat:
|
|
- if (!get_opcr_online(opcr)) {
|
|
- dev_err(fdtv->device, "CMP: output offline\n");
|
|
- return -EBUSY;
|
|
- }
|
|
-
|
|
- old_opcr = opcr;
|
|
-
|
|
- if (get_opcr_p2p_connections(opcr)) {
|
|
- if (get_opcr_channel(opcr) != channel) {
|
|
- dev_err(fdtv->device, "CMP: cannot change channel\n");
|
|
- return -EBUSY;
|
|
- }
|
|
- dev_info(fdtv->device, "CMP: overlaying connection\n");
|
|
-
|
|
- /* We don't allocate isochronous resources. */
|
|
- } else {
|
|
- set_opcr_channel(&opcr, channel);
|
|
- set_opcr_data_rate(&opcr, 2); /* S400 */
|
|
-
|
|
- /* FIXME: this is for the worst case - optimize */
|
|
- set_opcr_overhead_id(&opcr, 0);
|
|
-
|
|
- /*
|
|
- * FIXME: allocate isochronous channel and bandwidth at IRM
|
|
- * fdtv->backend->alloc_resources(fdtv, channels_mask, bw);
|
|
- */
|
|
- }
|
|
-
|
|
- set_opcr_p2p_connections(&opcr, get_opcr_p2p_connections(opcr) + 1);
|
|
-
|
|
- ret = cmp_lock(fdtv, &opcr, opcr_address, old_opcr);
|
|
- if (ret < 0)
|
|
- return ret;
|
|
-
|
|
- if (old_opcr != opcr) {
|
|
- /*
|
|
- * FIXME: if old_opcr.P2P_Connections > 0,
|
|
- * deallocate isochronous channel and bandwidth at IRM
|
|
- * if (...)
|
|
- * fdtv->backend->dealloc_resources(fdtv, channel, bw);
|
|
- */
|
|
-
|
|
- if (++attempts < 6) /* arbitrary limit */
|
|
- goto repeat;
|
|
- return -EBUSY;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void cmp_break_pp_connection(struct firedtv *fdtv, int plug, int channel)
|
|
-{
|
|
- __be32 old_opcr, opcr;
|
|
- u64 opcr_address = CMP_OUTPUT_PLUG_CONTROL_REG_0 + (plug << 2);
|
|
- int attempts = 0;
|
|
-
|
|
- if (cmp_read(fdtv, &opcr, opcr_address, 4) < 0)
|
|
- return;
|
|
-
|
|
-repeat:
|
|
- if (!get_opcr_online(opcr) || !get_opcr_p2p_connections(opcr) ||
|
|
- get_opcr_channel(opcr) != channel) {
|
|
- dev_err(fdtv->device, "CMP: no connection to break\n");
|
|
- return;
|
|
- }
|
|
-
|
|
- old_opcr = opcr;
|
|
- set_opcr_p2p_connections(&opcr, get_opcr_p2p_connections(opcr) - 1);
|
|
-
|
|
- if (cmp_lock(fdtv, &opcr, opcr_address, old_opcr) < 0)
|
|
- return;
|
|
-
|
|
- if (old_opcr != opcr) {
|
|
- /*
|
|
- * FIXME: if old_opcr.P2P_Connections == 1, i.e. we were last
|
|
- * owner, deallocate isochronous channel and bandwidth at IRM
|
|
- * if (...)
|
|
- * fdtv->backend->dealloc_resources(fdtv, channel, bw);
|
|
- */
|
|
-
|
|
- if (++attempts < 6) /* arbitrary limit */
|
|
- goto repeat;
|
|
- }
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-ci.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-ci.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-ci.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-ci.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,260 +0,0 @@
|
|
-/*
|
|
- * FireDTV driver (formerly known as FireSAT)
|
|
- *
|
|
- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
|
|
- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
|
|
- *
|
|
- * 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.
|
|
- */
|
|
-
|
|
-#include <linux/device.h>
|
|
-#include <linux/dvb/ca.h>
|
|
-#include <linux/fs.h>
|
|
-#include <linux/module.h>
|
|
-
|
|
-#include <dvbdev.h>
|
|
-
|
|
-#include "firedtv.h"
|
|
-
|
|
-#define EN50221_TAG_APP_INFO_ENQUIRY 0x9f8020
|
|
-#define EN50221_TAG_CA_INFO_ENQUIRY 0x9f8030
|
|
-#define EN50221_TAG_CA_PMT 0x9f8032
|
|
-#define EN50221_TAG_ENTER_MENU 0x9f8022
|
|
-
|
|
-static int fdtv_ca_ready(struct firedtv_tuner_status *stat)
|
|
-{
|
|
- return stat->ca_initialization_status == 1 &&
|
|
- stat->ca_error_flag == 0 &&
|
|
- stat->ca_dvb_flag == 1 &&
|
|
- stat->ca_module_present_status == 1;
|
|
-}
|
|
-
|
|
-static int fdtv_get_ca_flags(struct firedtv_tuner_status *stat)
|
|
-{
|
|
- int flags = 0;
|
|
-
|
|
- if (stat->ca_module_present_status == 1)
|
|
- flags |= CA_CI_MODULE_PRESENT;
|
|
- if (stat->ca_initialization_status == 1 &&
|
|
- stat->ca_error_flag == 0 &&
|
|
- stat->ca_dvb_flag == 1)
|
|
- flags |= CA_CI_MODULE_READY;
|
|
- return flags;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_reset(struct firedtv *fdtv)
|
|
-{
|
|
- return avc_ca_reset(fdtv) ? -EFAULT : 0;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_get_caps(void *arg)
|
|
-{
|
|
- struct ca_caps *cap = arg;
|
|
-
|
|
- cap->slot_num = 1;
|
|
- cap->slot_type = CA_CI;
|
|
- cap->descr_num = 1;
|
|
- cap->descr_type = CA_ECD;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_get_slot_info(struct firedtv *fdtv, void *arg)
|
|
-{
|
|
- struct firedtv_tuner_status stat;
|
|
- struct ca_slot_info *slot = arg;
|
|
-
|
|
- if (avc_tuner_status(fdtv, &stat))
|
|
- return -EFAULT;
|
|
-
|
|
- if (slot->num != 0)
|
|
- return -EFAULT;
|
|
-
|
|
- slot->type = CA_CI;
|
|
- slot->flags = fdtv_get_ca_flags(&stat);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_app_info(struct firedtv *fdtv, void *arg)
|
|
-{
|
|
- struct ca_msg *reply = arg;
|
|
-
|
|
- return avc_ca_app_info(fdtv, reply->msg, &reply->length) ? -EFAULT : 0;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_info(struct firedtv *fdtv, void *arg)
|
|
-{
|
|
- struct ca_msg *reply = arg;
|
|
-
|
|
- return avc_ca_info(fdtv, reply->msg, &reply->length) ? -EFAULT : 0;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_get_mmi(struct firedtv *fdtv, void *arg)
|
|
-{
|
|
- struct ca_msg *reply = arg;
|
|
-
|
|
- return avc_ca_get_mmi(fdtv, reply->msg, &reply->length) ? -EFAULT : 0;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_get_msg(struct firedtv *fdtv, void *arg)
|
|
-{
|
|
- struct firedtv_tuner_status stat;
|
|
- int err;
|
|
-
|
|
- switch (fdtv->ca_last_command) {
|
|
- case EN50221_TAG_APP_INFO_ENQUIRY:
|
|
- err = fdtv_ca_app_info(fdtv, arg);
|
|
- break;
|
|
- case EN50221_TAG_CA_INFO_ENQUIRY:
|
|
- err = fdtv_ca_info(fdtv, arg);
|
|
- break;
|
|
- default:
|
|
- if (avc_tuner_status(fdtv, &stat))
|
|
- err = -EFAULT;
|
|
- else if (stat.ca_mmi == 1)
|
|
- err = fdtv_ca_get_mmi(fdtv, arg);
|
|
- else {
|
|
- dev_info(fdtv->device, "unhandled CA message 0x%08x\n",
|
|
- fdtv->ca_last_command);
|
|
- err = -EFAULT;
|
|
- }
|
|
- }
|
|
- fdtv->ca_last_command = 0;
|
|
- return err;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_pmt(struct firedtv *fdtv, void *arg)
|
|
-{
|
|
- struct ca_msg *msg = arg;
|
|
- int data_pos;
|
|
- int data_length;
|
|
- int i;
|
|
-
|
|
- data_pos = 4;
|
|
- if (msg->msg[3] & 0x80) {
|
|
- data_length = 0;
|
|
- for (i = 0; i < (msg->msg[3] & 0x7f); i++)
|
|
- data_length = (data_length << 8) + msg->msg[data_pos++];
|
|
- } else {
|
|
- data_length = msg->msg[3];
|
|
- }
|
|
-
|
|
- return avc_ca_pmt(fdtv, &msg->msg[data_pos], data_length) ? -EFAULT : 0;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_send_msg(struct firedtv *fdtv, void *arg)
|
|
-{
|
|
- struct ca_msg *msg = arg;
|
|
- int err;
|
|
-
|
|
- /* Do we need a semaphore for this? */
|
|
- fdtv->ca_last_command =
|
|
- (msg->msg[0] << 16) + (msg->msg[1] << 8) + msg->msg[2];
|
|
- switch (fdtv->ca_last_command) {
|
|
- case EN50221_TAG_CA_PMT:
|
|
- err = fdtv_ca_pmt(fdtv, arg);
|
|
- break;
|
|
- case EN50221_TAG_APP_INFO_ENQUIRY:
|
|
- /* handled in ca_get_msg */
|
|
- err = 0;
|
|
- break;
|
|
- case EN50221_TAG_CA_INFO_ENQUIRY:
|
|
- /* handled in ca_get_msg */
|
|
- err = 0;
|
|
- break;
|
|
- case EN50221_TAG_ENTER_MENU:
|
|
- err = avc_ca_enter_menu(fdtv);
|
|
- break;
|
|
- default:
|
|
- dev_err(fdtv->device, "unhandled CA message 0x%08x\n",
|
|
- fdtv->ca_last_command);
|
|
- err = -EFAULT;
|
|
- }
|
|
- return err;
|
|
-}
|
|
-
|
|
-static int fdtv_ca_ioctl(struct inode *inode, struct file *file,
|
|
- unsigned int cmd, void *arg)
|
|
-{
|
|
- struct dvb_device *dvbdev = file->private_data;
|
|
- struct firedtv *fdtv = dvbdev->priv;
|
|
- struct firedtv_tuner_status stat;
|
|
- int err;
|
|
-
|
|
- switch (cmd) {
|
|
- case CA_RESET:
|
|
- err = fdtv_ca_reset(fdtv);
|
|
- break;
|
|
- case CA_GET_CAP:
|
|
- err = fdtv_ca_get_caps(arg);
|
|
- break;
|
|
- case CA_GET_SLOT_INFO:
|
|
- err = fdtv_ca_get_slot_info(fdtv, arg);
|
|
- break;
|
|
- case CA_GET_MSG:
|
|
- err = fdtv_ca_get_msg(fdtv, arg);
|
|
- break;
|
|
- case CA_SEND_MSG:
|
|
- err = fdtv_ca_send_msg(fdtv, arg);
|
|
- break;
|
|
- default:
|
|
- dev_info(fdtv->device, "unhandled CA ioctl %u\n", cmd);
|
|
- err = -EOPNOTSUPP;
|
|
- }
|
|
-
|
|
- /* FIXME Is this necessary? */
|
|
- avc_tuner_status(fdtv, &stat);
|
|
-
|
|
- return err;
|
|
-}
|
|
-
|
|
-static unsigned int fdtv_ca_io_poll(struct file *file, poll_table *wait)
|
|
-{
|
|
- return POLLIN;
|
|
-}
|
|
-
|
|
-static struct file_operations fdtv_ca_fops = {
|
|
- .owner = THIS_MODULE,
|
|
- .ioctl = dvb_generic_ioctl,
|
|
- .open = dvb_generic_open,
|
|
- .release = dvb_generic_release,
|
|
- .poll = fdtv_ca_io_poll,
|
|
-};
|
|
-
|
|
-static struct dvb_device fdtv_ca = {
|
|
- .users = 1,
|
|
- .readers = 1,
|
|
- .writers = 1,
|
|
- .fops = &fdtv_ca_fops,
|
|
- .kernel_ioctl = fdtv_ca_ioctl,
|
|
-};
|
|
-
|
|
-int fdtv_ca_register(struct firedtv *fdtv)
|
|
-{
|
|
- struct firedtv_tuner_status stat;
|
|
- int err;
|
|
-
|
|
- if (avc_tuner_status(fdtv, &stat))
|
|
- return -EINVAL;
|
|
-
|
|
- if (!fdtv_ca_ready(&stat))
|
|
- return -EFAULT;
|
|
-
|
|
- err = dvb_register_device(&fdtv->adapter, &fdtv->cadev,
|
|
- &fdtv_ca, fdtv, DVB_DEVICE_CA);
|
|
-
|
|
- if (stat.ca_application_info == 0)
|
|
- dev_err(fdtv->device, "CaApplicationInfo is not set\n");
|
|
- if (stat.ca_date_time_request == 1)
|
|
- avc_ca_get_time_date(fdtv, &fdtv->ca_time_interval);
|
|
-
|
|
- return err;
|
|
-}
|
|
-
|
|
-void fdtv_ca_release(struct firedtv *fdtv)
|
|
-{
|
|
- if (fdtv->cadev)
|
|
- dvb_unregister_device(fdtv->cadev);
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-dvb.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-dvb.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-dvb.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-dvb.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,364 +0,0 @@
|
|
-/*
|
|
- * FireDTV driver (formerly known as FireSAT)
|
|
- *
|
|
- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
|
|
- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
|
|
- *
|
|
- * 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.
|
|
- */
|
|
-
|
|
-#include <linux/bitops.h>
|
|
-#include <linux/device.h>
|
|
-#include <linux/errno.h>
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/mod_devicetable.h>
|
|
-#include <linux/module.h>
|
|
-#include <linux/mutex.h>
|
|
-#include <linux/slab.h>
|
|
-#include <linux/string.h>
|
|
-#include <linux/types.h>
|
|
-#include <linux/wait.h>
|
|
-#include <linux/workqueue.h>
|
|
-
|
|
-#include <dmxdev.h>
|
|
-#include <dvb_demux.h>
|
|
-#include <dvbdev.h>
|
|
-#include <dvb_frontend.h>
|
|
-
|
|
-#include "firedtv.h"
|
|
-
|
|
-static int alloc_channel(struct firedtv *fdtv)
|
|
-{
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < 16; i++)
|
|
- if (!__test_and_set_bit(i, &fdtv->channel_active))
|
|
- break;
|
|
- return i;
|
|
-}
|
|
-
|
|
-static void collect_channels(struct firedtv *fdtv, int *pidc, u16 pid[])
|
|
-{
|
|
- int i, n;
|
|
-
|
|
- for (i = 0, n = 0; i < 16; i++)
|
|
- if (test_bit(i, &fdtv->channel_active))
|
|
- pid[n++] = fdtv->channel_pid[i];
|
|
- *pidc = n;
|
|
-}
|
|
-
|
|
-static inline void dealloc_channel(struct firedtv *fdtv, int i)
|
|
-{
|
|
- __clear_bit(i, &fdtv->channel_active);
|
|
-}
|
|
-
|
|
-int fdtv_start_feed(struct dvb_demux_feed *dvbdmxfeed)
|
|
-{
|
|
- struct firedtv *fdtv = dvbdmxfeed->demux->priv;
|
|
- int pidc, c, ret;
|
|
- u16 pids[16];
|
|
-
|
|
- switch (dvbdmxfeed->type) {
|
|
- case DMX_TYPE_TS:
|
|
- case DMX_TYPE_SEC:
|
|
- break;
|
|
- default:
|
|
- dev_err(fdtv->device, "can't start dmx feed: invalid type %u\n",
|
|
- dvbdmxfeed->type);
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- if (mutex_lock_interruptible(&fdtv->demux_mutex))
|
|
- return -EINTR;
|
|
-
|
|
- if (dvbdmxfeed->type == DMX_TYPE_TS) {
|
|
- switch (dvbdmxfeed->pes_type) {
|
|
- case DMX_TS_PES_VIDEO:
|
|
- case DMX_TS_PES_AUDIO:
|
|
- case DMX_TS_PES_TELETEXT:
|
|
- case DMX_TS_PES_PCR:
|
|
- case DMX_TS_PES_OTHER:
|
|
- c = alloc_channel(fdtv);
|
|
- break;
|
|
- default:
|
|
- dev_err(fdtv->device,
|
|
- "can't start dmx feed: invalid pes type %u\n",
|
|
- dvbdmxfeed->pes_type);
|
|
- ret = -EINVAL;
|
|
- goto out;
|
|
- }
|
|
- } else {
|
|
- c = alloc_channel(fdtv);
|
|
- }
|
|
-
|
|
- if (c > 15) {
|
|
- dev_err(fdtv->device, "can't start dmx feed: busy\n");
|
|
- ret = -EBUSY;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- dvbdmxfeed->priv = (typeof(dvbdmxfeed->priv))(unsigned long)c;
|
|
- fdtv->channel_pid[c] = dvbdmxfeed->pid;
|
|
- collect_channels(fdtv, &pidc, pids);
|
|
-
|
|
- if (dvbdmxfeed->pid == 8192) {
|
|
- ret = avc_tuner_get_ts(fdtv);
|
|
- if (ret) {
|
|
- dealloc_channel(fdtv, c);
|
|
- dev_err(fdtv->device, "can't get TS\n");
|
|
- goto out;
|
|
- }
|
|
- } else {
|
|
- ret = avc_tuner_set_pids(fdtv, pidc, pids);
|
|
- if (ret) {
|
|
- dealloc_channel(fdtv, c);
|
|
- dev_err(fdtv->device, "can't set PIDs\n");
|
|
- goto out;
|
|
- }
|
|
- }
|
|
-out:
|
|
- mutex_unlock(&fdtv->demux_mutex);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-int fdtv_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
|
|
-{
|
|
- struct dvb_demux *demux = dvbdmxfeed->demux;
|
|
- struct firedtv *fdtv = demux->priv;
|
|
- int pidc, c, ret;
|
|
- u16 pids[16];
|
|
-
|
|
- if (dvbdmxfeed->type == DMX_TYPE_TS &&
|
|
- !((dvbdmxfeed->ts_type & TS_PACKET) &&
|
|
- (demux->dmx.frontend->source != DMX_MEMORY_FE))) {
|
|
-
|
|
- if (dvbdmxfeed->ts_type & TS_DECODER) {
|
|
- if (dvbdmxfeed->pes_type >= DMX_TS_PES_OTHER ||
|
|
- !demux->pesfilter[dvbdmxfeed->pes_type])
|
|
- return -EINVAL;
|
|
-
|
|
- demux->pids[dvbdmxfeed->pes_type] |= 0x8000;
|
|
- demux->pesfilter[dvbdmxfeed->pes_type] = NULL;
|
|
- }
|
|
-
|
|
- if (!(dvbdmxfeed->ts_type & TS_DECODER &&
|
|
- dvbdmxfeed->pes_type < DMX_TS_PES_OTHER))
|
|
- return 0;
|
|
- }
|
|
-
|
|
- if (mutex_lock_interruptible(&fdtv->demux_mutex))
|
|
- return -EINTR;
|
|
-
|
|
- c = (unsigned long)dvbdmxfeed->priv;
|
|
- dealloc_channel(fdtv, c);
|
|
- collect_channels(fdtv, &pidc, pids);
|
|
-
|
|
- ret = avc_tuner_set_pids(fdtv, pidc, pids);
|
|
-
|
|
- mutex_unlock(&fdtv->demux_mutex);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
|
|
-
|
|
-int fdtv_dvb_register(struct firedtv *fdtv)
|
|
-{
|
|
- int err;
|
|
-
|
|
- err = dvb_register_adapter(&fdtv->adapter, fdtv_model_names[fdtv->type],
|
|
- THIS_MODULE, fdtv->device, adapter_nr);
|
|
- if (err < 0)
|
|
- goto fail_log;
|
|
-
|
|
- /*DMX_TS_FILTERING | DMX_SECTION_FILTERING*/
|
|
- fdtv->demux.dmx.capabilities = 0;
|
|
-
|
|
- fdtv->demux.priv = fdtv;
|
|
- fdtv->demux.filternum = 16;
|
|
- fdtv->demux.feednum = 16;
|
|
- fdtv->demux.start_feed = fdtv_start_feed;
|
|
- fdtv->demux.stop_feed = fdtv_stop_feed;
|
|
- fdtv->demux.write_to_decoder = NULL;
|
|
-
|
|
- err = dvb_dmx_init(&fdtv->demux);
|
|
- if (err)
|
|
- goto fail_unreg_adapter;
|
|
-
|
|
- fdtv->dmxdev.filternum = 16;
|
|
- fdtv->dmxdev.demux = &fdtv->demux.dmx;
|
|
- fdtv->dmxdev.capabilities = 0;
|
|
-
|
|
- err = dvb_dmxdev_init(&fdtv->dmxdev, &fdtv->adapter);
|
|
- if (err)
|
|
- goto fail_dmx_release;
|
|
-
|
|
- fdtv->frontend.source = DMX_FRONTEND_0;
|
|
-
|
|
- err = fdtv->demux.dmx.add_frontend(&fdtv->demux.dmx, &fdtv->frontend);
|
|
- if (err)
|
|
- goto fail_dmxdev_release;
|
|
-
|
|
- err = fdtv->demux.dmx.connect_frontend(&fdtv->demux.dmx,
|
|
- &fdtv->frontend);
|
|
- if (err)
|
|
- goto fail_rem_frontend;
|
|
-
|
|
- dvb_net_init(&fdtv->adapter, &fdtv->dvbnet, &fdtv->demux.dmx);
|
|
-
|
|
- fdtv_frontend_init(fdtv);
|
|
- err = dvb_register_frontend(&fdtv->adapter, &fdtv->fe);
|
|
- if (err)
|
|
- goto fail_net_release;
|
|
-
|
|
- err = fdtv_ca_register(fdtv);
|
|
- if (err)
|
|
- dev_info(fdtv->device,
|
|
- "Conditional Access Module not enabled\n");
|
|
- return 0;
|
|
-
|
|
-fail_net_release:
|
|
- dvb_net_release(&fdtv->dvbnet);
|
|
- fdtv->demux.dmx.close(&fdtv->demux.dmx);
|
|
-fail_rem_frontend:
|
|
- fdtv->demux.dmx.remove_frontend(&fdtv->demux.dmx, &fdtv->frontend);
|
|
-fail_dmxdev_release:
|
|
- dvb_dmxdev_release(&fdtv->dmxdev);
|
|
-fail_dmx_release:
|
|
- dvb_dmx_release(&fdtv->demux);
|
|
-fail_unreg_adapter:
|
|
- dvb_unregister_adapter(&fdtv->adapter);
|
|
-fail_log:
|
|
- dev_err(fdtv->device, "DVB initialization failed\n");
|
|
- return err;
|
|
-}
|
|
-
|
|
-void fdtv_dvb_unregister(struct firedtv *fdtv)
|
|
-{
|
|
- fdtv_ca_release(fdtv);
|
|
- dvb_unregister_frontend(&fdtv->fe);
|
|
- dvb_net_release(&fdtv->dvbnet);
|
|
- fdtv->demux.dmx.close(&fdtv->demux.dmx);
|
|
- fdtv->demux.dmx.remove_frontend(&fdtv->demux.dmx, &fdtv->frontend);
|
|
- dvb_dmxdev_release(&fdtv->dmxdev);
|
|
- dvb_dmx_release(&fdtv->demux);
|
|
- dvb_unregister_adapter(&fdtv->adapter);
|
|
-}
|
|
-
|
|
-const char *fdtv_model_names[] = {
|
|
- [FIREDTV_UNKNOWN] = "unknown type",
|
|
- [FIREDTV_DVB_S] = "FireDTV S/CI",
|
|
- [FIREDTV_DVB_C] = "FireDTV C/CI",
|
|
- [FIREDTV_DVB_T] = "FireDTV T/CI",
|
|
- [FIREDTV_DVB_S2] = "FireDTV S2 ",
|
|
-};
|
|
-
|
|
-struct firedtv *fdtv_alloc(struct device *dev,
|
|
- const struct firedtv_backend *backend,
|
|
- const char *name, size_t name_len)
|
|
-{
|
|
- struct firedtv *fdtv;
|
|
- int i;
|
|
-
|
|
- fdtv = kzalloc(sizeof(*fdtv), GFP_KERNEL);
|
|
- if (!fdtv)
|
|
- return NULL;
|
|
-
|
|
- dev->driver_data = fdtv;
|
|
- fdtv->device = dev;
|
|
- fdtv->isochannel = -1;
|
|
- fdtv->voltage = 0xff;
|
|
- fdtv->tone = 0xff;
|
|
- fdtv->backend = backend;
|
|
-
|
|
- mutex_init(&fdtv->avc_mutex);
|
|
- init_waitqueue_head(&fdtv->avc_wait);
|
|
- fdtv->avc_reply_received = true;
|
|
- mutex_init(&fdtv->demux_mutex);
|
|
- INIT_WORK(&fdtv->remote_ctrl_work, avc_remote_ctrl_work);
|
|
-
|
|
- for (i = ARRAY_SIZE(fdtv_model_names); --i; )
|
|
- if (strlen(fdtv_model_names[i]) <= name_len &&
|
|
- strncmp(name, fdtv_model_names[i], name_len) == 0)
|
|
- break;
|
|
- fdtv->type = i;
|
|
-
|
|
- return fdtv;
|
|
-}
|
|
-
|
|
-#define MATCH_FLAGS (IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID | \
|
|
- IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION)
|
|
-
|
|
-#define DIGITAL_EVERYWHERE_OUI 0x001287
|
|
-#define AVC_UNIT_SPEC_ID_ENTRY 0x00a02d
|
|
-#define AVC_SW_VERSION_ENTRY 0x010001
|
|
-
|
|
-static struct ieee1394_device_id fdtv_id_table[] = {
|
|
- {
|
|
- /* FloppyDTV S/CI and FloppyDTV S2 */
|
|
- .match_flags = MATCH_FLAGS,
|
|
- .vendor_id = DIGITAL_EVERYWHERE_OUI,
|
|
- .model_id = 0x000024,
|
|
- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
|
|
- .version = AVC_SW_VERSION_ENTRY,
|
|
- }, {
|
|
- /* FloppyDTV T/CI */
|
|
- .match_flags = MATCH_FLAGS,
|
|
- .vendor_id = DIGITAL_EVERYWHERE_OUI,
|
|
- .model_id = 0x000025,
|
|
- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
|
|
- .version = AVC_SW_VERSION_ENTRY,
|
|
- }, {
|
|
- /* FloppyDTV C/CI */
|
|
- .match_flags = MATCH_FLAGS,
|
|
- .vendor_id = DIGITAL_EVERYWHERE_OUI,
|
|
- .model_id = 0x000026,
|
|
- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
|
|
- .version = AVC_SW_VERSION_ENTRY,
|
|
- }, {
|
|
- /* FireDTV S/CI and FloppyDTV S2 */
|
|
- .match_flags = MATCH_FLAGS,
|
|
- .vendor_id = DIGITAL_EVERYWHERE_OUI,
|
|
- .model_id = 0x000034,
|
|
- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
|
|
- .version = AVC_SW_VERSION_ENTRY,
|
|
- }, {
|
|
- /* FireDTV T/CI */
|
|
- .match_flags = MATCH_FLAGS,
|
|
- .vendor_id = DIGITAL_EVERYWHERE_OUI,
|
|
- .model_id = 0x000035,
|
|
- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
|
|
- .version = AVC_SW_VERSION_ENTRY,
|
|
- }, {
|
|
- /* FireDTV C/CI */
|
|
- .match_flags = MATCH_FLAGS,
|
|
- .vendor_id = DIGITAL_EVERYWHERE_OUI,
|
|
- .model_id = 0x000036,
|
|
- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
|
|
- .version = AVC_SW_VERSION_ENTRY,
|
|
- }, {}
|
|
-};
|
|
-MODULE_DEVICE_TABLE(ieee1394, fdtv_id_table);
|
|
-
|
|
-static int __init fdtv_init(void)
|
|
-{
|
|
- return fdtv_1394_init(fdtv_id_table);
|
|
-}
|
|
-
|
|
-static void __exit fdtv_exit(void)
|
|
-{
|
|
- fdtv_1394_exit();
|
|
-}
|
|
-
|
|
-module_init(fdtv_init);
|
|
-module_exit(fdtv_exit);
|
|
-
|
|
-MODULE_AUTHOR("Andreas Monitzer <andy@monitzer.com>");
|
|
-MODULE_AUTHOR("Ben Backx <ben@bbackx.com>");
|
|
-MODULE_DESCRIPTION("FireDTV DVB Driver");
|
|
-MODULE_LICENSE("GPL");
|
|
-MODULE_SUPPORTED_DEVICE("FireDTV DVB");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-fe.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-fe.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-fe.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-fe.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,247 +0,0 @@
|
|
-/*
|
|
- * FireDTV driver (formerly known as FireSAT)
|
|
- *
|
|
- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
|
|
- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
|
|
- *
|
|
- * 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.
|
|
- */
|
|
-
|
|
-#include <linux/device.h>
|
|
-#include <linux/errno.h>
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/string.h>
|
|
-#include <linux/types.h>
|
|
-
|
|
-#include <dvb_frontend.h>
|
|
-
|
|
-#include "firedtv.h"
|
|
-
|
|
-static int fdtv_dvb_init(struct dvb_frontend *fe)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
- int err;
|
|
-
|
|
- /* FIXME - allocate free channel at IRM */
|
|
- fdtv->isochannel = fdtv->adapter.num;
|
|
-
|
|
- err = cmp_establish_pp_connection(fdtv, fdtv->subunit,
|
|
- fdtv->isochannel);
|
|
- if (err) {
|
|
- dev_err(fdtv->device,
|
|
- "could not establish point to point connection\n");
|
|
- return err;
|
|
- }
|
|
-
|
|
- return fdtv->backend->start_iso(fdtv);
|
|
-}
|
|
-
|
|
-static int fdtv_sleep(struct dvb_frontend *fe)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
-
|
|
- fdtv->backend->stop_iso(fdtv);
|
|
- cmp_break_pp_connection(fdtv, fdtv->subunit, fdtv->isochannel);
|
|
- fdtv->isochannel = -1;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-#define LNBCONTROL_DONTCARE 0xff
|
|
-
|
|
-static int fdtv_diseqc_send_master_cmd(struct dvb_frontend *fe,
|
|
- struct dvb_diseqc_master_cmd *cmd)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
-
|
|
- return avc_lnb_control(fdtv, LNBCONTROL_DONTCARE, LNBCONTROL_DONTCARE,
|
|
- LNBCONTROL_DONTCARE, 1, cmd);
|
|
-}
|
|
-
|
|
-static int fdtv_diseqc_send_burst(struct dvb_frontend *fe,
|
|
- fe_sec_mini_cmd_t minicmd)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
-
|
|
- fdtv->tone = tone;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_set_voltage(struct dvb_frontend *fe,
|
|
- fe_sec_voltage_t voltage)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
-
|
|
- fdtv->voltage = voltage;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
- struct firedtv_tuner_status stat;
|
|
-
|
|
- if (avc_tuner_status(fdtv, &stat))
|
|
- return -EINVAL;
|
|
-
|
|
- if (stat.no_rf)
|
|
- *status = 0;
|
|
- else
|
|
- *status = FE_HAS_SIGNAL | FE_HAS_VITERBI | FE_HAS_SYNC |
|
|
- FE_HAS_CARRIER | FE_HAS_LOCK;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_read_ber(struct dvb_frontend *fe, u32 *ber)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
- struct firedtv_tuner_status stat;
|
|
-
|
|
- if (avc_tuner_status(fdtv, &stat))
|
|
- return -EINVAL;
|
|
-
|
|
- *ber = stat.ber;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
- struct firedtv_tuner_status stat;
|
|
-
|
|
- if (avc_tuner_status(fdtv, &stat))
|
|
- return -EINVAL;
|
|
-
|
|
- *strength = stat.signal_strength << 8;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_read_snr(struct dvb_frontend *fe, u16 *snr)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
- struct firedtv_tuner_status stat;
|
|
-
|
|
- if (avc_tuner_status(fdtv, &stat))
|
|
- return -EINVAL;
|
|
-
|
|
- /* C/N[dB] = -10 * log10(snr / 65535) */
|
|
- *snr = stat.carrier_noise_ratio * 257;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int fdtv_read_uncorrected_blocks(struct dvb_frontend *fe, u32 *ucblocks)
|
|
-{
|
|
- return -EOPNOTSUPP;
|
|
-}
|
|
-
|
|
-#define ACCEPTED 0x9
|
|
-
|
|
-static int fdtv_set_frontend(struct dvb_frontend *fe,
|
|
- struct dvb_frontend_parameters *params)
|
|
-{
|
|
- struct firedtv *fdtv = fe->sec_priv;
|
|
-
|
|
- /* FIXME: avc_tuner_dsd never returns ACCEPTED. Check status? */
|
|
- if (avc_tuner_dsd(fdtv, params) != ACCEPTED)
|
|
- return -EINVAL;
|
|
- else
|
|
- return 0; /* not sure of this... */
|
|
-}
|
|
-
|
|
-static int fdtv_get_frontend(struct dvb_frontend *fe,
|
|
- struct dvb_frontend_parameters *params)
|
|
-{
|
|
- return -EOPNOTSUPP;
|
|
-}
|
|
-
|
|
-void fdtv_frontend_init(struct firedtv *fdtv)
|
|
-{
|
|
- struct dvb_frontend_ops *ops = &fdtv->fe.ops;
|
|
- struct dvb_frontend_info *fi = &ops->info;
|
|
-
|
|
- ops->init = fdtv_dvb_init;
|
|
- ops->sleep = fdtv_sleep;
|
|
-
|
|
- ops->set_frontend = fdtv_set_frontend;
|
|
- ops->get_frontend = fdtv_get_frontend;
|
|
-
|
|
- ops->read_status = fdtv_read_status;
|
|
- ops->read_ber = fdtv_read_ber;
|
|
- ops->read_signal_strength = fdtv_read_signal_strength;
|
|
- ops->read_snr = fdtv_read_snr;
|
|
- ops->read_ucblocks = fdtv_read_uncorrected_blocks;
|
|
-
|
|
- ops->diseqc_send_master_cmd = fdtv_diseqc_send_master_cmd;
|
|
- ops->diseqc_send_burst = fdtv_diseqc_send_burst;
|
|
- ops->set_tone = fdtv_set_tone;
|
|
- ops->set_voltage = fdtv_set_voltage;
|
|
-
|
|
- switch (fdtv->type) {
|
|
- case FIREDTV_DVB_S:
|
|
- case FIREDTV_DVB_S2:
|
|
- fi->type = FE_QPSK;
|
|
-
|
|
- fi->frequency_min = 950000;
|
|
- fi->frequency_max = 2150000;
|
|
- fi->frequency_stepsize = 125;
|
|
- fi->symbol_rate_min = 1000000;
|
|
- fi->symbol_rate_max = 40000000;
|
|
-
|
|
- fi->caps = FE_CAN_INVERSION_AUTO |
|
|
- FE_CAN_FEC_1_2 |
|
|
- FE_CAN_FEC_2_3 |
|
|
- FE_CAN_FEC_3_4 |
|
|
- FE_CAN_FEC_5_6 |
|
|
- FE_CAN_FEC_7_8 |
|
|
- FE_CAN_FEC_AUTO |
|
|
- FE_CAN_QPSK;
|
|
- break;
|
|
-
|
|
- case FIREDTV_DVB_C:
|
|
- fi->type = FE_QAM;
|
|
-
|
|
- fi->frequency_min = 47000000;
|
|
- fi->frequency_max = 866000000;
|
|
- fi->frequency_stepsize = 62500;
|
|
- fi->symbol_rate_min = 870000;
|
|
- fi->symbol_rate_max = 6900000;
|
|
-
|
|
- fi->caps = FE_CAN_INVERSION_AUTO |
|
|
- FE_CAN_QAM_16 |
|
|
- FE_CAN_QAM_32 |
|
|
- FE_CAN_QAM_64 |
|
|
- FE_CAN_QAM_128 |
|
|
- FE_CAN_QAM_256 |
|
|
- FE_CAN_QAM_AUTO;
|
|
- break;
|
|
-
|
|
- case FIREDTV_DVB_T:
|
|
- fi->type = FE_OFDM;
|
|
-
|
|
- fi->frequency_min = 49000000;
|
|
- fi->frequency_max = 861000000;
|
|
- fi->frequency_stepsize = 62500;
|
|
-
|
|
- fi->caps = FE_CAN_INVERSION_AUTO |
|
|
- FE_CAN_FEC_2_3 |
|
|
- FE_CAN_TRANSMISSION_MODE_AUTO |
|
|
- FE_CAN_GUARD_INTERVAL_AUTO |
|
|
- FE_CAN_HIERARCHY_AUTO;
|
|
- break;
|
|
-
|
|
- default:
|
|
- dev_err(fdtv->device, "no frontend for model type %d\n",
|
|
- fdtv->type);
|
|
- }
|
|
- strcpy(fi->name, fdtv_model_names[fdtv->type]);
|
|
-
|
|
- fdtv->fe.dvb = &fdtv->adapter;
|
|
- fdtv->fe.sec_priv = fdtv;
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv.h linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv.h
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,182 +0,0 @@
|
|
-/*
|
|
- * FireDTV driver (formerly known as FireSAT)
|
|
- *
|
|
- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
|
|
- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
|
|
- *
|
|
- * 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.
|
|
- */
|
|
-
|
|
-#ifndef _FIREDTV_H
|
|
-#define _FIREDTV_H
|
|
-
|
|
-#include <linux/dvb/dmx.h>
|
|
-#include <linux/dvb/frontend.h>
|
|
-#include <linux/list.h>
|
|
-#include <linux/mutex.h>
|
|
-#include <linux/spinlock_types.h>
|
|
-#include <linux/types.h>
|
|
-#include <linux/wait.h>
|
|
-#include <linux/workqueue.h>
|
|
-
|
|
-#include <demux.h>
|
|
-#include <dmxdev.h>
|
|
-#include <dvb_demux.h>
|
|
-#include <dvb_frontend.h>
|
|
-#include <dvb_net.h>
|
|
-#include <dvbdev.h>
|
|
-
|
|
-struct firedtv_tuner_status {
|
|
- unsigned active_system:8;
|
|
- unsigned searching:1;
|
|
- unsigned moving:1;
|
|
- unsigned no_rf:1;
|
|
- unsigned input:1;
|
|
- unsigned selected_antenna:7;
|
|
- unsigned ber:32;
|
|
- unsigned signal_strength:8;
|
|
- unsigned raster_frequency:2;
|
|
- unsigned rf_frequency:22;
|
|
- unsigned man_dep_info_length:8;
|
|
- unsigned front_end_error:1;
|
|
- unsigned antenna_error:1;
|
|
- unsigned front_end_power_status:1;
|
|
- unsigned power_supply:1;
|
|
- unsigned carrier_noise_ratio:16;
|
|
- unsigned power_supply_voltage:8;
|
|
- unsigned antenna_voltage:8;
|
|
- unsigned firewire_bus_voltage:8;
|
|
- unsigned ca_mmi:1;
|
|
- unsigned ca_pmt_reply:1;
|
|
- unsigned ca_date_time_request:1;
|
|
- unsigned ca_application_info:1;
|
|
- unsigned ca_module_present_status:1;
|
|
- unsigned ca_dvb_flag:1;
|
|
- unsigned ca_error_flag:1;
|
|
- unsigned ca_initialization_status:1;
|
|
-};
|
|
-
|
|
-enum model_type {
|
|
- FIREDTV_UNKNOWN = 0,
|
|
- FIREDTV_DVB_S = 1,
|
|
- FIREDTV_DVB_C = 2,
|
|
- FIREDTV_DVB_T = 3,
|
|
- FIREDTV_DVB_S2 = 4,
|
|
-};
|
|
-
|
|
-struct device;
|
|
-struct input_dev;
|
|
-struct firedtv;
|
|
-
|
|
-struct firedtv_backend {
|
|
- int (*lock)(struct firedtv *fdtv, u64 addr, void *data, __be32 arg);
|
|
- int (*read)(struct firedtv *fdtv, u64 addr, void *data, size_t len);
|
|
- int (*write)(struct firedtv *fdtv, u64 addr, void *data, size_t len);
|
|
- int (*start_iso)(struct firedtv *fdtv);
|
|
- void (*stop_iso)(struct firedtv *fdtv);
|
|
-};
|
|
-
|
|
-struct firedtv {
|
|
- struct device *device;
|
|
- struct list_head list;
|
|
-
|
|
- struct dvb_adapter adapter;
|
|
- struct dmxdev dmxdev;
|
|
- struct dvb_demux demux;
|
|
- struct dmx_frontend frontend;
|
|
- struct dvb_net dvbnet;
|
|
- struct dvb_frontend fe;
|
|
-
|
|
- struct dvb_device *cadev;
|
|
- int ca_last_command;
|
|
- int ca_time_interval;
|
|
-
|
|
- struct mutex avc_mutex;
|
|
- wait_queue_head_t avc_wait;
|
|
- bool avc_reply_received;
|
|
- struct work_struct remote_ctrl_work;
|
|
- struct input_dev *remote_ctrl_dev;
|
|
-
|
|
- enum model_type type;
|
|
- char subunit;
|
|
- char isochannel;
|
|
- fe_sec_voltage_t voltage;
|
|
- fe_sec_tone_mode_t tone;
|
|
-
|
|
- const struct firedtv_backend *backend;
|
|
- void *backend_data;
|
|
-
|
|
- struct mutex demux_mutex;
|
|
- unsigned long channel_active;
|
|
- u16 channel_pid[16];
|
|
-
|
|
- size_t response_length;
|
|
- u8 response[512];
|
|
-};
|
|
-
|
|
-/* firedtv-1394.c */
|
|
-#ifdef CONFIG_DVB_FIREDTV_IEEE1394
|
|
-int fdtv_1394_init(struct ieee1394_device_id id_table[]);
|
|
-void fdtv_1394_exit(void);
|
|
-#else
|
|
-static inline int fdtv_1394_init(struct ieee1394_device_id it[]) { return 0; }
|
|
-static inline void fdtv_1394_exit(void) {}
|
|
-#endif
|
|
-
|
|
-/* firedtv-avc.c */
|
|
-int avc_recv(struct firedtv *fdtv, void *data, size_t length);
|
|
-int avc_tuner_status(struct firedtv *fdtv, struct firedtv_tuner_status *stat);
|
|
-struct dvb_frontend_parameters;
|
|
-int avc_tuner_dsd(struct firedtv *fdtv, struct dvb_frontend_parameters *params);
|
|
-int avc_tuner_set_pids(struct firedtv *fdtv, unsigned char pidc, u16 pid[]);
|
|
-int avc_tuner_get_ts(struct firedtv *fdtv);
|
|
-int avc_identify_subunit(struct firedtv *fdtv);
|
|
-struct dvb_diseqc_master_cmd;
|
|
-int avc_lnb_control(struct firedtv *fdtv, char voltage, char burst,
|
|
- char conttone, char nrdiseq,
|
|
- struct dvb_diseqc_master_cmd *diseqcmd);
|
|
-void avc_remote_ctrl_work(struct work_struct *work);
|
|
-int avc_register_remote_control(struct firedtv *fdtv);
|
|
-int avc_ca_app_info(struct firedtv *fdtv, char *app_info, unsigned int *len);
|
|
-int avc_ca_info(struct firedtv *fdtv, char *app_info, unsigned int *len);
|
|
-int avc_ca_reset(struct firedtv *fdtv);
|
|
-int avc_ca_pmt(struct firedtv *fdtv, char *app_info, int length);
|
|
-int avc_ca_get_time_date(struct firedtv *fdtv, int *interval);
|
|
-int avc_ca_enter_menu(struct firedtv *fdtv);
|
|
-int avc_ca_get_mmi(struct firedtv *fdtv, char *mmi_object, unsigned int *len);
|
|
-int cmp_establish_pp_connection(struct firedtv *fdtv, int plug, int channel);
|
|
-void cmp_break_pp_connection(struct firedtv *fdtv, int plug, int channel);
|
|
-
|
|
-/* firedtv-ci.c */
|
|
-int fdtv_ca_register(struct firedtv *fdtv);
|
|
-void fdtv_ca_release(struct firedtv *fdtv);
|
|
-
|
|
-/* firedtv-dvb.c */
|
|
-int fdtv_start_feed(struct dvb_demux_feed *dvbdmxfeed);
|
|
-int fdtv_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
|
|
-int fdtv_dvb_register(struct firedtv *fdtv);
|
|
-void fdtv_dvb_unregister(struct firedtv *fdtv);
|
|
-struct firedtv *fdtv_alloc(struct device *dev,
|
|
- const struct firedtv_backend *backend,
|
|
- const char *name, size_t name_len);
|
|
-extern const char *fdtv_model_names[];
|
|
-
|
|
-/* firedtv-fe.c */
|
|
-void fdtv_frontend_init(struct firedtv *fdtv);
|
|
-
|
|
-/* firedtv-rc.c */
|
|
-#ifdef CONFIG_DVB_FIREDTV_INPUT
|
|
-int fdtv_register_rc(struct firedtv *fdtv, struct device *dev);
|
|
-void fdtv_unregister_rc(struct firedtv *fdtv);
|
|
-void fdtv_handle_rc(struct firedtv *fdtv, unsigned int code);
|
|
-#else
|
|
-static inline int fdtv_register_rc(struct firedtv *fdtv,
|
|
- struct device *dev) { return 0; }
|
|
-static inline void fdtv_unregister_rc(struct firedtv *fdtv) {}
|
|
-static inline void fdtv_handle_rc(struct firedtv *fdtv, unsigned int code) {}
|
|
-#endif
|
|
-
|
|
-#endif /* _FIREDTV_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-rc.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-rc.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-rc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-rc.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,190 +0,0 @@
|
|
-/*
|
|
- * FireDTV driver (formerly known as FireSAT)
|
|
- *
|
|
- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.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.
|
|
- */
|
|
-
|
|
-#include <linux/bitops.h>
|
|
-#include <linux/input.h>
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/string.h>
|
|
-#include <linux/types.h>
|
|
-
|
|
-#include "firedtv.h"
|
|
-
|
|
-/* fixed table with older keycodes, geared towards MythTV */
|
|
-const static u16 oldtable[] = {
|
|
-
|
|
- /* code from device: 0x4501...0x451f */
|
|
-
|
|
- KEY_ESC,
|
|
- KEY_F9,
|
|
- KEY_1,
|
|
- KEY_2,
|
|
- KEY_3,
|
|
- KEY_4,
|
|
- KEY_5,
|
|
- KEY_6,
|
|
- KEY_7,
|
|
- KEY_8,
|
|
- KEY_9,
|
|
- KEY_I,
|
|
- KEY_0,
|
|
- KEY_ENTER,
|
|
- KEY_RED,
|
|
- KEY_UP,
|
|
- KEY_GREEN,
|
|
- KEY_F10,
|
|
- KEY_SPACE,
|
|
- KEY_F11,
|
|
- KEY_YELLOW,
|
|
- KEY_DOWN,
|
|
- KEY_BLUE,
|
|
- KEY_Z,
|
|
- KEY_P,
|
|
- KEY_PAGEDOWN,
|
|
- KEY_LEFT,
|
|
- KEY_W,
|
|
- KEY_RIGHT,
|
|
- KEY_P,
|
|
- KEY_M,
|
|
-
|
|
- /* code from device: 0x4540...0x4542 */
|
|
-
|
|
- KEY_R,
|
|
- KEY_V,
|
|
- KEY_C,
|
|
-};
|
|
-
|
|
-/* user-modifiable table for a remote as sold in 2008 */
|
|
-const static u16 keytable[] = {
|
|
-
|
|
- /* code from device: 0x0300...0x031f */
|
|
-
|
|
- [0x00] = KEY_POWER,
|
|
- [0x01] = KEY_SLEEP,
|
|
- [0x02] = KEY_STOP,
|
|
- [0x03] = KEY_OK,
|
|
- [0x04] = KEY_RIGHT,
|
|
- [0x05] = KEY_1,
|
|
- [0x06] = KEY_2,
|
|
- [0x07] = KEY_3,
|
|
- [0x08] = KEY_LEFT,
|
|
- [0x09] = KEY_4,
|
|
- [0x0a] = KEY_5,
|
|
- [0x0b] = KEY_6,
|
|
- [0x0c] = KEY_UP,
|
|
- [0x0d] = KEY_7,
|
|
- [0x0e] = KEY_8,
|
|
- [0x0f] = KEY_9,
|
|
- [0x10] = KEY_DOWN,
|
|
- [0x11] = KEY_TITLE, /* "OSD" - fixme */
|
|
- [0x12] = KEY_0,
|
|
- [0x13] = KEY_F20, /* "16:9" - fixme */
|
|
- [0x14] = KEY_SCREEN, /* "FULL" - fixme */
|
|
- [0x15] = KEY_MUTE,
|
|
- [0x16] = KEY_SUBTITLE,
|
|
- [0x17] = KEY_RECORD,
|
|
- [0x18] = KEY_TEXT,
|
|
- [0x19] = KEY_AUDIO,
|
|
- [0x1a] = KEY_RED,
|
|
- [0x1b] = KEY_PREVIOUS,
|
|
- [0x1c] = KEY_REWIND,
|
|
- [0x1d] = KEY_PLAYPAUSE,
|
|
- [0x1e] = KEY_NEXT,
|
|
- [0x1f] = KEY_VOLUMEUP,
|
|
-
|
|
- /* code from device: 0x0340...0x0354 */
|
|
-
|
|
- [0x20] = KEY_CHANNELUP,
|
|
- [0x21] = KEY_F21, /* "4:3" - fixme */
|
|
- [0x22] = KEY_TV,
|
|
- [0x23] = KEY_DVD,
|
|
- [0x24] = KEY_VCR,
|
|
- [0x25] = KEY_AUX,
|
|
- [0x26] = KEY_GREEN,
|
|
- [0x27] = KEY_YELLOW,
|
|
- [0x28] = KEY_BLUE,
|
|
- [0x29] = KEY_CHANNEL, /* "CH.LIST" */
|
|
- [0x2a] = KEY_VENDOR, /* "CI" - fixme */
|
|
- [0x2b] = KEY_VOLUMEDOWN,
|
|
- [0x2c] = KEY_CHANNELDOWN,
|
|
- [0x2d] = KEY_LAST,
|
|
- [0x2e] = KEY_INFO,
|
|
- [0x2f] = KEY_FORWARD,
|
|
- [0x30] = KEY_LIST,
|
|
- [0x31] = KEY_FAVORITES,
|
|
- [0x32] = KEY_MENU,
|
|
- [0x33] = KEY_EPG,
|
|
- [0x34] = KEY_EXIT,
|
|
-};
|
|
-
|
|
-int fdtv_register_rc(struct firedtv *fdtv, struct device *dev)
|
|
-{
|
|
- struct input_dev *idev;
|
|
- int i, err;
|
|
-
|
|
- idev = input_allocate_device();
|
|
- if (!idev)
|
|
- return -ENOMEM;
|
|
-
|
|
- fdtv->remote_ctrl_dev = idev;
|
|
- idev->name = "FireDTV remote control";
|
|
- idev->dev.parent = dev;
|
|
- idev->evbit[0] = BIT_MASK(EV_KEY);
|
|
- idev->keycode = kmemdup(keytable, sizeof(keytable), GFP_KERNEL);
|
|
- if (!idev->keycode) {
|
|
- err = -ENOMEM;
|
|
- goto fail;
|
|
- }
|
|
- idev->keycodesize = sizeof(keytable[0]);
|
|
- idev->keycodemax = ARRAY_SIZE(keytable);
|
|
-
|
|
- for (i = 0; i < ARRAY_SIZE(keytable); i++)
|
|
- set_bit(keytable[i], idev->keybit);
|
|
-
|
|
- err = input_register_device(idev);
|
|
- if (err)
|
|
- goto fail_free_keymap;
|
|
-
|
|
- return 0;
|
|
-
|
|
-fail_free_keymap:
|
|
- kfree(idev->keycode);
|
|
-fail:
|
|
- input_free_device(idev);
|
|
- return err;
|
|
-}
|
|
-
|
|
-void fdtv_unregister_rc(struct firedtv *fdtv)
|
|
-{
|
|
- kfree(fdtv->remote_ctrl_dev->keycode);
|
|
- input_unregister_device(fdtv->remote_ctrl_dev);
|
|
-}
|
|
-
|
|
-void fdtv_handle_rc(struct firedtv *fdtv, unsigned int code)
|
|
-{
|
|
- u16 *keycode = fdtv->remote_ctrl_dev->keycode;
|
|
-
|
|
- if (code >= 0x0300 && code <= 0x031f)
|
|
- code = keycode[code - 0x0300];
|
|
- else if (code >= 0x0340 && code <= 0x0354)
|
|
- code = keycode[code - 0x0320];
|
|
- else if (code >= 0x4501 && code <= 0x451f)
|
|
- code = oldtable[code - 0x4501];
|
|
- else if (code >= 0x4540 && code <= 0x4542)
|
|
- code = oldtable[code - 0x4521];
|
|
- else {
|
|
- printk(KERN_DEBUG "firedtv: invalid key code 0x%04x "
|
|
- "from remote control\n", code);
|
|
- return;
|
|
- }
|
|
-
|
|
- input_report_key(fdtv->remote_ctrl_dev, code, 1);
|
|
- input_report_key(fdtv->remote_ctrl_dev, code, 0);
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/Kconfig linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/Kconfig 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,22 +0,0 @@
|
|
-config DVB_FIREDTV
|
|
- tristate "FireDTV and FloppyDTV"
|
|
- depends on DVB_CORE && IEEE1394
|
|
- help
|
|
- Support for DVB receivers from Digital Everywhere
|
|
- which are connected via IEEE 1394 (FireWire).
|
|
-
|
|
- These devices don't have an MPEG decoder built in,
|
|
- so you need an external software decoder to watch TV.
|
|
-
|
|
- To compile this driver as a module, say M here:
|
|
- the module will be called firedtv.
|
|
-
|
|
-if DVB_FIREDTV
|
|
-
|
|
-config DVB_FIREDTV_IEEE1394
|
|
- def_bool IEEE1394
|
|
-
|
|
-config DVB_FIREDTV_INPUT
|
|
- def_bool INPUT = y || (INPUT = m && DVB_FIREDTV = m)
|
|
-
|
|
-endif # DVB_FIREDTV
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/firewire/Makefile linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/Makefile
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/firewire/Makefile 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/Makefile 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,8 +0,0 @@
|
|
-obj-$(CONFIG_DVB_FIREDTV) += firedtv.o
|
|
-
|
|
-firedtv-y := firedtv-avc.o firedtv-ci.o firedtv-dvb.o firedtv-fe.o
|
|
-firedtv-$(CONFIG_DVB_FIREDTV_IEEE1394) += firedtv-1394.o
|
|
-firedtv-$(CONFIG_DVB_FIREDTV_INPUT) += firedtv-rc.o
|
|
-
|
|
-ccflags-y += -Idrivers/media/dvb/dvb-core
|
|
-ccflags-$(CONFIG_DVB_FIREDTV_IEEE1394) += -Idrivers/ieee1394
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/frontends/drx397xD.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/drx397xD.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/frontends/drx397xD.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/drx397xD.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -646,7 +646,7 @@
|
|
u32 edi = 0, ebx = 0, ebp = 0, edx = 0;
|
|
u16 v20 = 0, v1E = 0, v16 = 0, v14 = 0, v12 = 0, v10 = 0, v0E = 0;
|
|
|
|
- int rc, df_tuner = 0;
|
|
+ int rc, df_tuner;
|
|
int a, b, c, d;
|
|
pr_debug("%s %d\n", __func__, s->config.d60);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/frontends/s5h1409.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/s5h1409.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/frontends/s5h1409.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/s5h1409.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -545,6 +545,9 @@
|
|
|
|
s5h1409_enable_modulation(fe, p->u.vsb.modulation);
|
|
|
|
+ /* Allow the demod to settle */
|
|
+ msleep(100);
|
|
+
|
|
if (fe->ops.tuner_ops.set_params) {
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
|
@@ -559,10 +562,6 @@
|
|
s5h1409_set_qam_interleave_mode(fe);
|
|
}
|
|
|
|
- /* Issue a reset to the demod so it knows to resync against the
|
|
- newly tuned frequency */
|
|
- s5h1409_softreset(fe);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_algo.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_algo.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_algo.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_algo.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -31,8 +31,6 @@
|
|
return n;
|
|
}
|
|
|
|
-#if 0
|
|
-/* These functions are currently unused */
|
|
/*
|
|
* stb0899_calc_srate
|
|
* Compute symbol rate
|
|
@@ -65,7 +63,6 @@
|
|
|
|
return stb0899_calc_srate(internal->master_clk, sfr);
|
|
}
|
|
-#endif
|
|
|
|
/*
|
|
* stb0899_set_srate
|
|
@@ -156,7 +153,7 @@
|
|
}
|
|
|
|
if (range > 0)
|
|
- internal->sub_range = min(internal->srch_range, range);
|
|
+ internal->sub_range = MIN(internal->srch_range, range);
|
|
else
|
|
internal->sub_range = 0;
|
|
|
|
@@ -185,7 +182,7 @@
|
|
timing = stb0899_read_reg(state, STB0899_RTF);
|
|
|
|
if (lock >= 42) {
|
|
- if ((lock > 48) && (abs(timing) >= 110)) {
|
|
+ if ((lock > 48) && (ABS(timing) >= 110)) {
|
|
internal->status = ANALOGCARRIER;
|
|
dprintk(state->verbose, FE_DEBUG, 1, "-->ANALOG Carrier !");
|
|
} else {
|
|
@@ -222,7 +219,7 @@
|
|
index++;
|
|
derot_freq += index * internal->direction * derot_step; /* next derot zig zag position */
|
|
|
|
- if (abs(derot_freq) > derot_limit)
|
|
+ if (ABS(derot_freq) > derot_limit)
|
|
next_loop--;
|
|
|
|
if (next_loop) {
|
|
@@ -298,7 +295,7 @@
|
|
last_derot_freq = derot_freq;
|
|
derot_freq += index * internal->direction * internal->derot_step; /* next zig zag derotator position */
|
|
|
|
- if(abs(derot_freq) > derot_limit)
|
|
+ if(ABS(derot_freq) > derot_limit)
|
|
next_loop--;
|
|
|
|
if (next_loop) {
|
|
@@ -400,7 +397,7 @@
|
|
if ((internal->status != CARRIEROK) || (stb0899_check_data(state) != DATAOK)) {
|
|
|
|
derot_freq += index * internal->direction * derot_step; /* next zig zag derotator position */
|
|
- if (abs(derot_freq) > derot_limit)
|
|
+ if (ABS(derot_freq) > derot_limit)
|
|
next_loop--;
|
|
|
|
if (next_loop) {
|
|
@@ -467,7 +464,7 @@
|
|
|
|
if (internal->sub_dir > 0) {
|
|
old_sub_range = internal->sub_range;
|
|
- internal->sub_range = min((internal->srch_range / 2) -
|
|
+ internal->sub_range = MIN((internal->srch_range / 2) -
|
|
(internal->tuner_offst + internal->sub_range / 2),
|
|
internal->sub_range);
|
|
|
|
@@ -771,7 +768,7 @@
|
|
int i;
|
|
|
|
i = 0;
|
|
- while ((1 << i) <= abs(number))
|
|
+ while ((1 << i) <= ABS(number))
|
|
i++;
|
|
|
|
if (number == 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_drv.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_drv.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_drv.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_drv.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -794,7 +794,7 @@
|
|
reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
|
|
old_state = reg;
|
|
/* set to burst mode */
|
|
- STB0899_SETFIELD_VAL(DISEQCMODE, reg, 0x03);
|
|
+ STB0899_SETFIELD_VAL(DISEQCMODE, reg, 0x02);
|
|
STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0x01);
|
|
stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
|
|
switch (burst) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_priv.h linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_priv.h
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_priv.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_priv.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -59,6 +59,10 @@
|
|
#define MAKEWORD32(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
|
|
#define MAKEWORD16(a, b) (((a) << 8) | (b))
|
|
|
|
+#define MIN(x, y) ((x) <= (y) ? (x) : (y))
|
|
+#define MAX(x, y) ((x) >= (y) ? (x) : (y))
|
|
+#define ABS(x) ((x) >= 0 ? (x) : -(x))
|
|
+
|
|
#define LSB(x) ((x & 0xff))
|
|
#define MSB(y) ((y >> 8) & 0xff)
|
|
|
|
@@ -164,10 +168,10 @@
|
|
u32 freq; /* Demod internal Frequency */
|
|
u32 srate; /* Demod internal Symbol rate */
|
|
enum stb0899_fec fecrate; /* Demod internal FEC rate */
|
|
- s32 srch_range; /* Demod internal Search Range */
|
|
- s32 sub_range; /* Demod current sub range (Hz) */
|
|
- s32 tuner_step; /* Tuner step (Hz) */
|
|
- s32 tuner_offst; /* Relative offset to carrier (Hz) */
|
|
+ u32 srch_range; /* Demod internal Search Range */
|
|
+ u32 sub_range; /* Demod current sub range (Hz) */
|
|
+ u32 tuner_step; /* Tuner step (Hz) */
|
|
+ u32 tuner_offst; /* Relative offset to carrier (Hz) */
|
|
u32 tuner_bw; /* Current bandwidth of the tuner (Hz) */
|
|
|
|
s32 mclk; /* Masterclock Divider factor (binary) */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/frontends/stb6100.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb6100.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/frontends/stb6100.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb6100.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -427,11 +427,11 @@
|
|
status->refclock = 27000000; /* Hz */
|
|
status->iqsense = 1;
|
|
status->bandwidth = 36000; /* kHz */
|
|
- state->bandwidth = status->bandwidth * 1000; /* Hz */
|
|
+ state->bandwidth = status->bandwidth * 1000; /* MHz */
|
|
state->reference = status->refclock / 1000; /* kHz */
|
|
|
|
/* Set default bandwidth. */
|
|
- return stb6100_set_bandwidth(fe, state->bandwidth);
|
|
+ return stb6100_set_bandwidth(fe, status->bandwidth);
|
|
}
|
|
|
|
static int stb6100_get_state(struct dvb_frontend *fe,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/frontends/zl10353.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/zl10353.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/frontends/zl10353.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/zl10353.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -590,7 +590,7 @@
|
|
struct zl10353_state *state = fe->demodulator_priv;
|
|
u8 val = 0x0a;
|
|
|
|
- if (state->config.disable_i2c_gate_ctrl) {
|
|
+ if (state->config.no_tuner) {
|
|
/* No tuner attached to the internal I2C bus */
|
|
/* If set enable I2C bridge, the main I2C bus stopped hardly */
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/frontends/zl10353.h linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/zl10353.h
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/frontends/zl10353.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/zl10353.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -38,9 +38,6 @@
|
|
|
|
/* set if parallel ts output is required */
|
|
int parallel_ts;
|
|
-
|
|
- /* set if i2c_gate_ctrl disable is required */
|
|
- u8 disable_i2c_gate_ctrl:1;
|
|
};
|
|
|
|
#if defined(CONFIG_DVB_ZL10353) || (defined(CONFIG_DVB_ZL10353_MODULE) && defined(MODULE))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/Kconfig linux-2.6.29-rc3.owrt/drivers/media/dvb/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -51,10 +51,6 @@
|
|
depends on DVB_CORE && PCI && I2C
|
|
source "drivers/media/dvb/dm1105/Kconfig"
|
|
|
|
-comment "Supported FireWire (IEEE 1394) Adapters"
|
|
- depends on DVB_CORE && IEEE1394
|
|
-source "drivers/media/dvb/firewire/Kconfig"
|
|
-
|
|
comment "Supported DVB Frontends"
|
|
depends on DVB_CORE
|
|
source "drivers/media/dvb/frontends/Kconfig"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/Makefile linux-2.6.29-rc3.owrt/drivers/media/dvb/Makefile
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/Makefile 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,5 +3,3 @@
|
|
#
|
|
|
|
obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dvb-usb/ pluto2/ siano/ dm1105/
|
|
-
|
|
-obj-$(CONFIG_DVB_FIREDTV) += firewire/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/ttpci/budget.c linux-2.6.29-rc3.owrt/drivers/media/dvb/ttpci/budget.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/ttpci/budget.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/ttpci/budget.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -470,7 +470,6 @@
|
|
budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config, &budget->i2c_adap);
|
|
if (budget->dvb_frontend) {
|
|
budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params;
|
|
- budget->dvb_frontend->tuner_priv = NULL;
|
|
break;
|
|
}
|
|
break;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/dvb/ttusb-dec/ttusb_dec.c linux-2.6.29-rc3.owrt/drivers/media/dvb/ttusb-dec/ttusb_dec.c
|
|
--- linux-2.6.29.owrt/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1384,7 +1384,7 @@
|
|
static int ttusb_dec_init_stb(struct ttusb_dec *dec)
|
|
{
|
|
int result;
|
|
- unsigned int mode = 0, model = 0, version = 0;
|
|
+ unsigned int mode, model, version;
|
|
|
|
dprintk("%s\n", __func__);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/radio/radio-mr800.c linux-2.6.29-rc3.owrt/drivers/media/radio/radio-mr800.c
|
|
--- linux-2.6.29.owrt/drivers/media/radio/radio-mr800.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/radio/radio-mr800.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -194,10 +194,10 @@
|
|
return retval;
|
|
}
|
|
|
|
- radio->muted = 0;
|
|
-
|
|
mutex_unlock(&radio->lock);
|
|
|
|
+ radio->muted = 0;
|
|
+
|
|
return retval;
|
|
}
|
|
|
|
@@ -230,10 +230,10 @@
|
|
return retval;
|
|
}
|
|
|
|
- radio->muted = 1;
|
|
-
|
|
mutex_unlock(&radio->lock);
|
|
|
|
+ radio->muted = 1;
|
|
+
|
|
return retval;
|
|
}
|
|
|
|
@@ -284,10 +284,10 @@
|
|
return retval;
|
|
}
|
|
|
|
- radio->stereo = 0;
|
|
-
|
|
mutex_unlock(&radio->lock);
|
|
|
|
+ radio->stereo = 0;
|
|
+
|
|
return retval;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/radio/radio-si470x.c linux-2.6.29-rc3.owrt/drivers/media/radio/radio-si470x.c
|
|
--- linux-2.6.29.owrt/drivers/media/radio/radio-si470x.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/radio/radio-si470x.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -98,16 +98,11 @@
|
|
* - blacklisted KWorld radio in hid-core.c and hid-ids.h
|
|
* 2008-12-03 Mark Lord <mlord@pobox.com>
|
|
* - add support for DealExtreme USB Radio
|
|
- * 2009-01-31 Bob Ross <pigiron@gmx.com>
|
|
- * - correction of stereo detection/setting
|
|
- * - correction of signal strength indicator scaling
|
|
- * 2009-01-31 Rick Bronson <rick@efn.org>
|
|
- * Tobias Lorenz <tobias.lorenz@gmx.net>
|
|
- * - add LED status output
|
|
*
|
|
* ToDo:
|
|
* - add firmware download/update support
|
|
* - RDS support: interrupt mode, instead of polling
|
|
+ * - add LED status output (check if that's not already done in firmware)
|
|
*/
|
|
|
|
|
|
@@ -887,30 +882,6 @@
|
|
|
|
|
|
/**************************************************************************
|
|
- * General Driver Functions - LED_REPORT
|
|
- **************************************************************************/
|
|
-
|
|
-/*
|
|
- * si470x_set_led_state - sets the led state
|
|
- */
|
|
-static int si470x_set_led_state(struct si470x_device *radio,
|
|
- unsigned char led_state)
|
|
-{
|
|
- unsigned char buf[LED_REPORT_SIZE];
|
|
- int retval;
|
|
-
|
|
- buf[0] = LED_REPORT;
|
|
- buf[1] = LED_COMMAND;
|
|
- buf[2] = led_state;
|
|
-
|
|
- retval = si470x_set_report(radio, (void *) &buf, sizeof(buf));
|
|
-
|
|
- return (retval < 0) ? -EINVAL : 0;
|
|
-}
|
|
-
|
|
-
|
|
-
|
|
-/**************************************************************************
|
|
* RDS Driver Functions
|
|
**************************************************************************/
|
|
|
|
@@ -1414,22 +1385,20 @@
|
|
};
|
|
|
|
/* stereo indicator == stereo (instead of mono) */
|
|
- if ((radio->registers[STATUSRSSI] & STATUSRSSI_ST) == 0)
|
|
- tuner->rxsubchans = V4L2_TUNER_SUB_MONO;
|
|
- else
|
|
+ if ((radio->registers[STATUSRSSI] & STATUSRSSI_ST) == 1)
|
|
tuner->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
|
|
+ else
|
|
+ tuner->rxsubchans = V4L2_TUNER_SUB_MONO;
|
|
|
|
/* mono/stereo selector */
|
|
- if ((radio->registers[POWERCFG] & POWERCFG_MONO) == 0)
|
|
- tuner->audmode = V4L2_TUNER_MODE_STEREO;
|
|
- else
|
|
+ if ((radio->registers[POWERCFG] & POWERCFG_MONO) == 1)
|
|
tuner->audmode = V4L2_TUNER_MODE_MONO;
|
|
+ else
|
|
+ tuner->audmode = V4L2_TUNER_MODE_STEREO;
|
|
|
|
/* min is worst, max is best; signal:0..0xffff; rssi: 0..0xff */
|
|
- /* measured in units of dbµV in 1 db increments (max at ~75 dbµV) */
|
|
- tuner->signal = (radio->registers[STATUSRSSI] & STATUSRSSI_RSSI);
|
|
- /* the ideal factor is 0xffff/75 = 873,8 */
|
|
- tuner->signal = (tuner->signal * 873) + (8 * tuner->signal / 10);
|
|
+ tuner->signal = (radio->registers[STATUSRSSI] & STATUSRSSI_RSSI)
|
|
+ * 0x0101;
|
|
|
|
/* automatic frequency control: -1: freq to low, 1 freq to high */
|
|
/* AFCRL does only indicate that freq. differs, not if too low/high */
|
|
@@ -1663,9 +1632,6 @@
|
|
/* set initial frequency */
|
|
si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */
|
|
|
|
- /* set led to connect state */
|
|
- si470x_set_led_state(radio, BLINK_GREEN_LED);
|
|
-
|
|
/* rds buffer allocation */
|
|
radio->buf_size = rds_buf * 3;
|
|
radio->buffer = kmalloc(radio->buf_size, GFP_KERNEL);
|
|
@@ -1749,9 +1715,6 @@
|
|
cancel_delayed_work_sync(&radio->work);
|
|
usb_set_intfdata(intf, NULL);
|
|
if (radio->users == 0) {
|
|
- /* set led to disconnect state */
|
|
- si470x_set_led_state(radio, BLINK_ORANGE_LED);
|
|
-
|
|
video_unregister_device(radio->videodev);
|
|
kfree(radio->buffer);
|
|
kfree(radio);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/cs5345.c linux-2.6.29-rc3.owrt/drivers/media/video/cs5345.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/cs5345.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/cs5345.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -18,6 +18,7 @@
|
|
*/
|
|
|
|
|
|
+#include <linux/version.h>
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/i2c.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/cx23885/cx23885-417.c linux-2.6.29-rc3.owrt/drivers/media/video/cx23885/cx23885-417.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/cx23885/cx23885-417.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/cx23885/cx23885-417.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1586,8 +1586,7 @@
|
|
lock_kernel();
|
|
list_for_each(list, &cx23885_devlist) {
|
|
h = list_entry(list, struct cx23885_dev, devlist);
|
|
- if (h->v4l_device &&
|
|
- h->v4l_device->minor == minor) {
|
|
+ if (h->v4l_device->minor == minor) {
|
|
dev = h;
|
|
break;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/cx23885/cx23885-video.c linux-2.6.29-rc3.owrt/drivers/media/video/cx23885/cx23885-video.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/cx23885/cx23885-video.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/cx23885/cx23885-video.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -730,13 +730,12 @@
|
|
lock_kernel();
|
|
list_for_each(list, &cx23885_devlist) {
|
|
h = list_entry(list, struct cx23885_dev, devlist);
|
|
- if (h->video_dev &&
|
|
- h->video_dev->minor == minor) {
|
|
+ if (h->video_dev->minor == minor) {
|
|
dev = h;
|
|
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
}
|
|
if (h->vbi_dev &&
|
|
- h->vbi_dev->minor == minor) {
|
|
+ h->vbi_dev->minor == minor) {
|
|
dev = h;
|
|
type = V4L2_BUF_TYPE_VBI_CAPTURE;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/cx25840/cx25840-core.c linux-2.6.29-rc3.owrt/drivers/media/video/cx25840/cx25840-core.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/cx25840/cx25840-core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/cx25840/cx25840-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1382,14 +1382,6 @@
|
|
|
|
static int cx25840_command(struct i2c_client *client, unsigned cmd, void *arg)
|
|
{
|
|
- /* ignore this command */
|
|
- if (cmd == TUNER_SET_TYPE_ADDR || cmd == TUNER_SET_CONFIG)
|
|
- return 0;
|
|
-
|
|
- /* Old-style drivers rely on initialization on first use, so
|
|
- call the init whenever a command is issued to this driver.
|
|
- New-style drivers using v4l2_subdev should call init explicitly. */
|
|
- cx25840_init(i2c_get_clientdata(client), 0);
|
|
return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/cx88/cx88-dvb.c linux-2.6.29-rc3.owrt/drivers/media/video/cx88/cx88-dvb.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/cx88/cx88-dvb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/cx88/cx88-dvb.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -614,41 +614,34 @@
|
|
.set_ts_params = cx24116_set_ts_param,
|
|
};
|
|
|
|
-static int cx8802_alloc_frontends(struct cx8802_dev *dev)
|
|
+static int dvb_register(struct cx8802_dev *dev)
|
|
{
|
|
struct cx88_core *core = dev->core;
|
|
- struct videobuf_dvb_frontend *fe = NULL;
|
|
+ struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
|
|
+ int mfe_shared = 0; /* bus not shared by default */
|
|
int i;
|
|
|
|
- mutex_init(&dev->frontends.lock);
|
|
- INIT_LIST_HEAD(&dev->frontends.felist);
|
|
+ if (0 != core->i2c_rc) {
|
|
+ printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
|
|
+ goto frontend_detach;
|
|
+ }
|
|
|
|
if (!core->board.num_frontends)
|
|
- return -ENODEV;
|
|
+ return -EINVAL;
|
|
+
|
|
+ mutex_init(&dev->frontends.lock);
|
|
+ INIT_LIST_HEAD(&dev->frontends.felist);
|
|
|
|
printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
|
|
core->board.num_frontends);
|
|
for (i = 1; i <= core->board.num_frontends; i++) {
|
|
- fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
|
|
- if (!fe) {
|
|
+ fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, i);
|
|
+ if (!fe0) {
|
|
printk(KERN_ERR "%s() failed to alloc\n", __func__);
|
|
videobuf_dvb_dealloc_frontends(&dev->frontends);
|
|
- return -ENOMEM;
|
|
+ goto frontend_detach;
|
|
}
|
|
}
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int dvb_register(struct cx8802_dev *dev)
|
|
-{
|
|
- struct cx88_core *core = dev->core;
|
|
- struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
|
|
- int mfe_shared = 0; /* bus not shared by default */
|
|
-
|
|
- if (0 != core->i2c_rc) {
|
|
- printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
|
|
- goto frontend_detach;
|
|
- }
|
|
|
|
/* Get the first frontend */
|
|
fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
|
|
@@ -1250,8 +1243,6 @@
|
|
struct cx88_core *core = drv->core;
|
|
struct cx8802_dev *dev = drv->core->dvbdev;
|
|
int err;
|
|
- struct videobuf_dvb_frontend *fe;
|
|
- int i;
|
|
|
|
dprintk( 1, "%s\n", __func__);
|
|
dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
|
|
@@ -1267,34 +1258,39 @@
|
|
/* If vp3054 isn't enabled, a stub will just return 0 */
|
|
err = vp3054_i2c_probe(dev);
|
|
if (0 != err)
|
|
- goto fail_core;
|
|
+ goto fail_probe;
|
|
|
|
/* dvb stuff */
|
|
printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
|
|
dev->ts_gen_cntrl = 0x0c;
|
|
|
|
- err = cx8802_alloc_frontends(dev);
|
|
- if (err)
|
|
- goto fail_core;
|
|
-
|
|
err = -ENODEV;
|
|
- for (i = 1; i <= core->board.num_frontends; i++) {
|
|
- fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
|
|
- if (fe == NULL) {
|
|
- printk(KERN_ERR "%s() failed to get frontend(%d)\n",
|
|
+ if (core->board.num_frontends) {
|
|
+ struct videobuf_dvb_frontend *fe;
|
|
+ int i;
|
|
+
|
|
+ for (i = 1; i <= core->board.num_frontends; i++) {
|
|
+ fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
|
|
+ if (fe == NULL) {
|
|
+ printk(KERN_ERR "%s() failed to get frontend(%d)\n",
|
|
__func__, i);
|
|
- goto fail_probe;
|
|
- }
|
|
- videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
|
|
+ goto fail_probe;
|
|
+ }
|
|
+ videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
|
|
&dev->pci->dev, &dev->slock,
|
|
V4L2_BUF_TYPE_VIDEO_CAPTURE,
|
|
V4L2_FIELD_TOP,
|
|
sizeof(struct cx88_buffer),
|
|
dev);
|
|
- /* init struct videobuf_dvb */
|
|
- fe->dvb.name = dev->core->name;
|
|
+ /* init struct videobuf_dvb */
|
|
+ fe->dvb.name = dev->core->name;
|
|
+ }
|
|
+ } else {
|
|
+ /* no frontends allocated */
|
|
+ printk(KERN_ERR "%s/2 .num_frontends should be non-zero\n",
|
|
+ core->name);
|
|
+ goto fail_core;
|
|
}
|
|
-
|
|
err = dvb_register(dev);
|
|
if (err)
|
|
/* frontends/adapter de-allocated in dvb_register */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/cx88/cx88.h linux-2.6.29-rc3.owrt/drivers/media/video/cx88/cx88.h
|
|
--- linux-2.6.29.owrt/drivers/media/video/cx88/cx88.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/cx88/cx88.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -336,8 +336,8 @@
|
|
/* config info -- dvb */
|
|
#if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE)
|
|
int (*prev_set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
|
|
-#endif
|
|
void (*gate_ctrl)(struct cx88_core *core, int open);
|
|
+#endif
|
|
|
|
/* state info */
|
|
struct task_struct *kthread;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-audio.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-audio.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-audio.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-audio.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -62,15 +62,9 @@
|
|
|
|
dprintk("Stopping isoc\n");
|
|
for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
|
|
- if (!irqs_disabled())
|
|
- usb_kill_urb(dev->adev.urb[i]);
|
|
- else
|
|
- usb_unlink_urb(dev->adev.urb[i]);
|
|
+ usb_unlink_urb(dev->adev.urb[i]);
|
|
usb_free_urb(dev->adev.urb[i]);
|
|
dev->adev.urb[i] = NULL;
|
|
-
|
|
- kfree(dev->adev.transfer_buffer[i]);
|
|
- dev->adev.transfer_buffer[i] = NULL;
|
|
}
|
|
|
|
return 0;
|
|
@@ -395,15 +389,11 @@
|
|
static snd_pcm_uframes_t snd_em28xx_capture_pointer(struct snd_pcm_substream
|
|
*substream)
|
|
{
|
|
- unsigned long flags;
|
|
-
|
|
struct em28xx *dev;
|
|
- snd_pcm_uframes_t hwptr_done;
|
|
|
|
+ snd_pcm_uframes_t hwptr_done;
|
|
dev = snd_pcm_substream_chip(substream);
|
|
- spin_lock_irqsave(&dev->adev.slock, flags);
|
|
hwptr_done = dev->adev.hwptr_done_capture;
|
|
- spin_unlock_irqrestore(&dev->adev.slock, flags);
|
|
|
|
return hwptr_done;
|
|
}
|
|
@@ -463,8 +453,6 @@
|
|
pcm->info_flags = 0;
|
|
pcm->private_data = dev;
|
|
strcpy(pcm->name, "Empia 28xx Capture");
|
|
-
|
|
- snd_card_set_dev(card, &dev->udev->dev);
|
|
strcpy(card->driver, "Empia Em28xx Audio");
|
|
strcpy(card->shortname, "Em28xx Audio");
|
|
strcpy(card->longname, "Empia Em28xx Audio");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-cards.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-cards.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-cards.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-cards.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -102,18 +102,6 @@
|
|
/* Board - EM2870 Kworld 355u
|
|
Analog - No input analog */
|
|
|
|
-static struct em28xx_reg_seq kworld_330u_analog[] = {
|
|
- {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
|
|
- {EM2880_R04_GPO, 0x00, 0xff, 10},
|
|
- { -1, -1, -1, -1},
|
|
-};
|
|
-
|
|
-static struct em28xx_reg_seq kworld_330u_digital[] = {
|
|
- {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10},
|
|
- {EM2880_R04_GPO, 0x08, 0xff, 10},
|
|
- { -1, -1, -1, -1},
|
|
-};
|
|
-
|
|
/* Callback for the most boards */
|
|
static struct em28xx_reg_seq default_tuner_gpio[] = {
|
|
{EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10},
|
|
@@ -1189,33 +1177,29 @@
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
|
} },
|
|
},
|
|
- [EM2883_BOARD_KWORLD_HYBRID_330U] = {
|
|
+ [EM2883_BOARD_KWORLD_HYBRID_A316] = {
|
|
.name = "Kworld PlusTV HD Hybrid 330",
|
|
.tuner_type = TUNER_XC2028,
|
|
.tuner_gpio = default_tuner_gpio,
|
|
.decoder = EM28XX_TVP5150,
|
|
.mts_firmware = 1,
|
|
.has_dvb = 1,
|
|
- .dvb_gpio = kworld_330u_digital,
|
|
- .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
|
|
- .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_EEPROM_ON_BOARD | EM28XX_I2C_EEPROM_KEY_VALID,
|
|
+ .dvb_gpio = default_digital,
|
|
.input = { {
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
.vmux = TVP5150_COMPOSITE0,
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
- .gpio = kworld_330u_analog,
|
|
- .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
|
|
+ .gpio = default_analog,
|
|
}, {
|
|
.type = EM28XX_VMUX_COMPOSITE1,
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
- .gpio = kworld_330u_analog,
|
|
- .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
|
|
+ .gpio = hauppauge_wintv_hvr_900_analog,
|
|
}, {
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
.vmux = TVP5150_SVIDEO,
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
- .gpio = kworld_330u_analog,
|
|
+ .gpio = hauppauge_wintv_hvr_900_analog,
|
|
} },
|
|
},
|
|
[EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
|
|
@@ -1265,7 +1249,7 @@
|
|
{ USB_DEVICE(0xeb1a, 0xe310),
|
|
.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
|
|
{ USB_DEVICE(0xeb1a, 0xa316),
|
|
- .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
|
|
+ .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 },
|
|
{ USB_DEVICE(0xeb1a, 0xe320),
|
|
.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
|
|
{ USB_DEVICE(0xeb1a, 0xe323),
|
|
@@ -1542,10 +1526,6 @@
|
|
/* FIXME: Better to specify the needed IF */
|
|
ctl->demod = XC3028_FE_DEFAULT;
|
|
break;
|
|
- case EM2883_BOARD_KWORLD_HYBRID_330U:
|
|
- ctl->demod = XC3028_FE_CHINA;
|
|
- ctl->fname = XC2028_DEFAULT_FIRMWARE;
|
|
- break;
|
|
default:
|
|
ctl->demod = XC3028_FE_OREN538;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-core.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-core.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -438,10 +438,6 @@
|
|
if (dev->audio_mode.ac97 != EM28XX_NO_AC97) {
|
|
int vol;
|
|
|
|
- em28xx_write_ac97(dev, AC97_POWER_DOWN_CTRL, 0x4200);
|
|
- em28xx_write_ac97(dev, AC97_EXT_AUD_CTRL, 0x0031);
|
|
- em28xx_write_ac97(dev, AC97_PCM_IN_SRATE, 0xbb80);
|
|
-
|
|
/* LSB: left channel - both channels with the same level */
|
|
vol = (0x1f - dev->volume) | ((0x1f - dev->volume) << 8);
|
|
|
|
@@ -458,15 +454,6 @@
|
|
em28xx_warn("couldn't setup AC97 register %d\n",
|
|
outputs[i].reg);
|
|
}
|
|
-
|
|
- if (dev->ctl_aoutput & EM28XX_AOUT_PCM_IN) {
|
|
- int sel = ac97_return_record_select(dev->ctl_aoutput);
|
|
-
|
|
- /* Use the same input for both left and right channels */
|
|
- sel |= (sel << 8);
|
|
-
|
|
- em28xx_write_ac97(dev, AC97_RECORD_SELECT, sel);
|
|
- }
|
|
}
|
|
|
|
return ret;
|
|
@@ -860,11 +847,8 @@
|
|
for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
|
|
urb = dev->isoc_ctl.urb[i];
|
|
if (urb) {
|
|
- if (!irqs_disabled())
|
|
- usb_kill_urb(urb);
|
|
- else
|
|
- usb_unlink_urb(urb);
|
|
-
|
|
+ usb_kill_urb(urb);
|
|
+ usb_unlink_urb(urb);
|
|
if (dev->isoc_ctl.transfer_buffer[i]) {
|
|
usb_buffer_free(dev->udev,
|
|
urb->transfer_buffer_length,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-dvb.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-dvb.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-dvb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-dvb.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -28,7 +28,6 @@
|
|
|
|
#include "lgdt330x.h"
|
|
#include "zl10353.h"
|
|
-#include "s5h1409.h"
|
|
#ifdef EM28XX_DRX397XD_SUPPORT
|
|
#include "drx397xD.h"
|
|
#endif
|
|
@@ -233,15 +232,6 @@
|
|
.if2 = 45600,
|
|
};
|
|
|
|
-static struct s5h1409_config em28xx_s5h1409_with_xc3028 = {
|
|
- .demod_address = 0x32 >> 1,
|
|
- .output_mode = S5H1409_PARALLEL_OUTPUT,
|
|
- .gpio = S5H1409_GPIO_OFF,
|
|
- .inversion = S5H1409_INVERSION_OFF,
|
|
- .status_mode = S5H1409_DEMODLOCKING,
|
|
- .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
|
|
-};
|
|
-
|
|
#ifdef EM28XX_DRX397XD_SUPPORT
|
|
/* [TODO] djh - not sure yet what the device config needs to contain */
|
|
static struct drx397xD_config em28xx_drx397xD_with_xc3028 = {
|
|
@@ -422,6 +412,7 @@
|
|
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
|
|
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
|
|
case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
|
|
+ case EM2883_BOARD_KWORLD_HYBRID_A316:
|
|
case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
|
|
dvb->frontend = dvb_attach(lgdt330x_attach,
|
|
&em2880_lgdt3303_dev,
|
|
@@ -442,15 +433,6 @@
|
|
goto out_free;
|
|
}
|
|
break;
|
|
- case EM2883_BOARD_KWORLD_HYBRID_330U:
|
|
- dvb->frontend = dvb_attach(s5h1409_attach,
|
|
- &em28xx_s5h1409_with_xc3028,
|
|
- &dev->i2c_adap);
|
|
- if (attach_xc3028(0x61, dev) < 0) {
|
|
- result = -EINVAL;
|
|
- goto out_free;
|
|
- }
|
|
- break;
|
|
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
|
|
#ifdef EM28XX_DRX397XD_SUPPORT
|
|
/* We don't have the config structure properly populated, so
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx.h linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx.h
|
|
--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -94,7 +94,7 @@
|
|
#define EM2882_BOARD_KWORLD_VS_DVBT 54
|
|
#define EM2882_BOARD_TERRATEC_HYBRID_XS 55
|
|
#define EM2882_BOARD_PINNACLE_HYBRID_PRO 56
|
|
-#define EM2883_BOARD_KWORLD_HYBRID_330U 57
|
|
+#define EM2883_BOARD_KWORLD_HYBRID_A316 57
|
|
#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58
|
|
#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60
|
|
#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61
|
|
@@ -300,32 +300,13 @@
|
|
};
|
|
|
|
enum em28xx_aout {
|
|
- /* AC97 outputs */
|
|
EM28XX_AOUT_MASTER = 1 << 0,
|
|
EM28XX_AOUT_LINE = 1 << 1,
|
|
EM28XX_AOUT_MONO = 1 << 2,
|
|
EM28XX_AOUT_LFE = 1 << 3,
|
|
EM28XX_AOUT_SURR = 1 << 4,
|
|
-
|
|
- /* PCM IN Mixer - used by AC97_RECORD_SELECT register */
|
|
- EM28XX_AOUT_PCM_IN = 1 << 7,
|
|
-
|
|
- /* Bits 10-8 are used to indicate the PCM IN record select */
|
|
- EM28XX_AOUT_PCM_MIC_PCM = 0 << 8,
|
|
- EM28XX_AOUT_PCM_CD = 1 << 8,
|
|
- EM28XX_AOUT_PCM_VIDEO = 2 << 8,
|
|
- EM28XX_AOUT_PCM_AUX = 3 << 8,
|
|
- EM28XX_AOUT_PCM_LINE = 4 << 8,
|
|
- EM28XX_AOUT_PCM_STEREO = 5 << 8,
|
|
- EM28XX_AOUT_PCM_MONO = 6 << 8,
|
|
- EM28XX_AOUT_PCM_PHONE = 7 << 8,
|
|
};
|
|
|
|
-static inline int ac97_return_record_select(int a_out)
|
|
-{
|
|
- return (a_out & 0x700) >> 8;
|
|
-}
|
|
-
|
|
struct em28xx_reg_seq {
|
|
int reg;
|
|
unsigned char val, mask;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-video.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-video.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-video.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-video.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -886,10 +886,10 @@
|
|
if (0 == INPUT(i)->type)
|
|
return -EINVAL;
|
|
|
|
- dev->ctl_input = i;
|
|
-
|
|
mutex_lock(&dev->lock);
|
|
- video_mux(dev, dev->ctl_input);
|
|
+
|
|
+ video_mux(dev, i);
|
|
+
|
|
mutex_unlock(&dev->lock);
|
|
return 0;
|
|
}
|
|
@@ -939,12 +939,6 @@
|
|
struct em28xx_fh *fh = priv;
|
|
struct em28xx *dev = fh->dev;
|
|
|
|
-
|
|
- if (a->index >= MAX_EM28XX_INPUT)
|
|
- return -EINVAL;
|
|
- if (0 == INPUT(a->index)->type)
|
|
- return -EINVAL;
|
|
-
|
|
mutex_lock(&dev->lock);
|
|
|
|
dev->ctl_ainput = INPUT(a->index)->amux;
|
|
@@ -1956,7 +1950,6 @@
|
|
|
|
int em28xx_register_analog_devices(struct em28xx *dev)
|
|
{
|
|
- u8 val;
|
|
int ret;
|
|
|
|
printk(KERN_INFO "%s: v4l2 driver version %d.%d.%d\n",
|
|
@@ -1964,34 +1957,34 @@
|
|
(EM28XX_VERSION_CODE >> 16) & 0xff,
|
|
(EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
|
|
|
|
- /* set default norm */
|
|
- dev->norm = em28xx_video_template.current_norm;
|
|
- dev->width = norm_maxw(dev);
|
|
- dev->height = norm_maxh(dev);
|
|
- dev->interlaced = EM28XX_INTERLACED_DEFAULT;
|
|
- dev->hscale = 0;
|
|
- dev->vscale = 0;
|
|
- dev->ctl_input = 0;
|
|
-
|
|
/* Analog specific initialization */
|
|
dev->format = &format[0];
|
|
- video_mux(dev, dev->ctl_input);
|
|
-
|
|
- /* Audio defaults */
|
|
- dev->mute = 1;
|
|
- dev->volume = 0x1f;
|
|
+ video_mux(dev, 0);
|
|
|
|
/* enable vbi capturing */
|
|
|
|
/* em28xx_write_reg(dev, EM28XX_R0E_AUDIOSRC, 0xc0); audio register */
|
|
- val = (u8)em28xx_read_reg(dev, EM28XX_R0F_XCLK);
|
|
- em28xx_write_reg(dev, EM28XX_R0F_XCLK, (EM28XX_XCLK_AUDIO_UNMUTE | val));
|
|
+/* em28xx_write_reg(dev, EM28XX_R0F_XCLK, 0x80); clk register */
|
|
em28xx_write_reg(dev, EM28XX_R11_VINCTRL, 0x51);
|
|
|
|
+ dev->mute = 1; /* maybe not the right place... */
|
|
+ dev->volume = 0x1f;
|
|
+
|
|
em28xx_set_outfmt(dev);
|
|
em28xx_colorlevels_set_default(dev);
|
|
em28xx_compression_disable(dev);
|
|
|
|
+ /* set default norm */
|
|
+ dev->norm = em28xx_video_template.current_norm;
|
|
+ dev->width = norm_maxw(dev);
|
|
+ dev->height = norm_maxh(dev);
|
|
+ dev->interlaced = EM28XX_INTERLACED_DEFAULT;
|
|
+ dev->hscale = 0;
|
|
+ dev->vscale = 0;
|
|
+
|
|
+ /* FIXME: This is a very bad hack! Not all devices have TV on input 2 */
|
|
+ dev->ctl_input = 2;
|
|
+
|
|
/* allocate and fill video video_device struct */
|
|
dev->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video");
|
|
if (!dev->vdev) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/gspca/gspca.c linux-2.6.29-rc3.owrt/drivers/media/video/gspca/gspca.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/gspca/gspca.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/gspca/gspca.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -422,10 +422,8 @@
|
|
if (urb == NULL)
|
|
break;
|
|
|
|
- BUG_ON(!gspca_dev->dev);
|
|
gspca_dev->urb[i] = NULL;
|
|
- if (!gspca_dev->present)
|
|
- usb_kill_urb(urb);
|
|
+ usb_kill_urb(urb);
|
|
if (urb->transfer_buffer != NULL)
|
|
usb_buffer_free(gspca_dev->dev,
|
|
urb->transfer_buffer_length,
|
|
@@ -1951,12 +1949,9 @@
|
|
{
|
|
struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
|
|
|
|
- mutex_lock(&gspca_dev->usb_lock);
|
|
gspca_dev->present = 0;
|
|
- mutex_unlock(&gspca_dev->usb_lock);
|
|
+ gspca_dev->streaming = 0;
|
|
|
|
- destroy_urbs(gspca_dev);
|
|
- gspca_dev->dev = NULL;
|
|
usb_set_intfdata(intf, NULL);
|
|
|
|
/* release the device */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/gspca/m5602/m5602_s5k4aa.c linux-2.6.29-rc3.owrt/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/gspca/m5602/m5602_s5k4aa.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/gspca/m5602/m5602_s5k4aa.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -102,11 +102,7 @@
|
|
}
|
|
|
|
/* Test some registers, but we don't know their exact meaning yet */
|
|
- if (m5602_read_sensor(sd, 0x00, prod_id, 2))
|
|
- return -ENODEV;
|
|
- if (m5602_read_sensor(sd, 0x02, prod_id+2, 2))
|
|
- return -ENODEV;
|
|
- if (m5602_read_sensor(sd, 0x04, prod_id+4, 2))
|
|
+ if (m5602_read_sensor(sd, 0x00, prod_id, sizeof(prod_id)))
|
|
return -ENODEV;
|
|
|
|
if (memcmp(prod_id, expected_prod_id, sizeof(prod_id)))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/ivtv/ivtv-driver.c linux-2.6.29-rc3.owrt/drivers/media/video/ivtv/ivtv-driver.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/ivtv/ivtv-driver.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/ivtv/ivtv-driver.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -949,10 +949,8 @@
|
|
itv->instance = atomic_inc_return(&ivtv_instance) - 1;
|
|
|
|
retval = v4l2_device_register(&dev->dev, &itv->device);
|
|
- if (retval) {
|
|
- kfree(itv);
|
|
+ if (retval)
|
|
return retval;
|
|
- }
|
|
/* "ivtv + PCI ID" is a bit of a mouthful, so use
|
|
"ivtv + instance" instead. */
|
|
snprintf(itv->device.name, sizeof(itv->device.name),
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/ivtv/ivtv-ioctl.c linux-2.6.29-rc3.owrt/drivers/media/video/ivtv/ivtv-ioctl.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/ivtv/ivtv-ioctl.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/ivtv/ivtv-ioctl.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -393,7 +393,7 @@
|
|
return 0;
|
|
}
|
|
|
|
- v4l2_subdev_call(itv->sd_video, video, g_fmt, fmt);
|
|
+ v4l2_subdev_call(itv->sd_video, video, s_fmt, fmt);
|
|
vbifmt->service_set = ivtv_get_service_set(vbifmt);
|
|
return 0;
|
|
}
|
|
@@ -1748,18 +1748,6 @@
|
|
break;
|
|
}
|
|
|
|
- case IVTV_IOC_DMA_FRAME:
|
|
- case VIDEO_GET_PTS:
|
|
- case VIDEO_GET_FRAME_COUNT:
|
|
- case VIDEO_GET_EVENT:
|
|
- case VIDEO_PLAY:
|
|
- case VIDEO_STOP:
|
|
- case VIDEO_FREEZE:
|
|
- case VIDEO_CONTINUE:
|
|
- case VIDEO_COMMAND:
|
|
- case VIDEO_TRY_COMMAND:
|
|
- return ivtv_decoder_ioctls(file, cmd, (void *)arg);
|
|
-
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
@@ -1802,6 +1790,18 @@
|
|
ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
|
|
return 0;
|
|
|
|
+ case IVTV_IOC_DMA_FRAME:
|
|
+ case VIDEO_GET_PTS:
|
|
+ case VIDEO_GET_FRAME_COUNT:
|
|
+ case VIDEO_GET_EVENT:
|
|
+ case VIDEO_PLAY:
|
|
+ case VIDEO_STOP:
|
|
+ case VIDEO_FREEZE:
|
|
+ case VIDEO_CONTINUE:
|
|
+ case VIDEO_COMMAND:
|
|
+ case VIDEO_TRY_COMMAND:
|
|
+ return ivtv_decoder_ioctls(filp, cmd, (void *)arg);
|
|
+
|
|
default:
|
|
break;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/pwc/pwc-if.c linux-2.6.29-rc3.owrt/drivers/media/video/pwc/pwc-if.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/pwc/pwc-if.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/pwc/pwc-if.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -62,6 +62,7 @@
|
|
#include <linux/poll.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/vmalloc.h>
|
|
+#include <linux/version.h>
|
|
#include <asm/io.h>
|
|
|
|
#include "pwc.h"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/pxa_camera.c linux-2.6.29-rc3.owrt/drivers/media/video/pxa_camera.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/pxa_camera.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/pxa_camera.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1155,24 +1155,24 @@
|
|
{
|
|
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
|
|
struct pxa_camera_dev *pcdev = ici->priv;
|
|
- const struct soc_camera_data_format *cam_fmt = NULL;
|
|
- const struct soc_camera_format_xlate *xlate = NULL;
|
|
+ const struct soc_camera_data_format *host_fmt, *cam_fmt = NULL;
|
|
+ const struct soc_camera_format_xlate *xlate;
|
|
struct soc_camera_sense sense = {
|
|
.master_clock = pcdev->mclk,
|
|
.pixel_clock_max = pcdev->ciclk / 4,
|
|
};
|
|
- int ret;
|
|
+ int ret, buswidth;
|
|
|
|
- if (pixfmt) {
|
|
- xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
|
|
- if (!xlate) {
|
|
- dev_warn(&ici->dev, "Format %x not found\n", pixfmt);
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- cam_fmt = xlate->cam_fmt;
|
|
+ xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
|
|
+ if (!xlate) {
|
|
+ dev_warn(&ici->dev, "Format %x not found\n", pixfmt);
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
+ buswidth = xlate->buswidth;
|
|
+ host_fmt = xlate->host_fmt;
|
|
+ cam_fmt = xlate->cam_fmt;
|
|
+
|
|
/* If PCLK is used to latch data from the sensor, check sense */
|
|
if (pcdev->platform_flags & PXA_CAMERA_PCLK_EN)
|
|
icd->sense = &sense;
|
|
@@ -1201,8 +1201,8 @@
|
|
}
|
|
|
|
if (pixfmt && !ret) {
|
|
- icd->buswidth = xlate->buswidth;
|
|
- icd->current_fmt = xlate->host_fmt;
|
|
+ icd->buswidth = buswidth;
|
|
+ icd->current_fmt = host_fmt;
|
|
}
|
|
|
|
return ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/saa7127.c linux-2.6.29-rc3.owrt/drivers/media/video/saa7127.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/saa7127.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/saa7127.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -149,7 +149,7 @@
|
|
{ SAA7127_REG_COPYGEN_0, 0x77 },
|
|
{ SAA7127_REG_COPYGEN_1, 0x41 },
|
|
{ SAA7127_REG_COPYGEN_2, 0x00 }, /* Macrovision enable/disable */
|
|
- { SAA7127_REG_OUTPUT_PORT_CONTROL, 0xbf },
|
|
+ { SAA7127_REG_OUTPUT_PORT_CONTROL, 0x9e },
|
|
{ SAA7127_REG_GAIN_LUMINANCE_RGB, 0x00 },
|
|
{ SAA7127_REG_GAIN_COLORDIFF_RGB, 0x00 },
|
|
{ SAA7127_REG_INPUT_PORT_CONTROL_1, 0x80 }, /* for color bars */
|
|
@@ -488,18 +488,12 @@
|
|
break;
|
|
|
|
case SAA7127_OUTPUT_TYPE_COMPOSITE:
|
|
- if (state->ident == V4L2_IDENT_SAA7129)
|
|
- state->reg_2d = 0x20; /* CVBS only */
|
|
- else
|
|
- state->reg_2d = 0x08; /* 00001000 CVBS only, RGB DAC's off (high impedance mode) */
|
|
+ state->reg_2d = 0x08; /* 00001000 CVBS only, RGB DAC's off (high impedance mode) */
|
|
state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
|
|
break;
|
|
|
|
case SAA7127_OUTPUT_TYPE_SVIDEO:
|
|
- if (state->ident == V4L2_IDENT_SAA7129)
|
|
- state->reg_2d = 0x18; /* Y + C */
|
|
- else
|
|
- state->reg_2d = 0xff; /*11111111 croma -> R, luma -> CVBS + G + B */
|
|
+ state->reg_2d = 0xff; /* 11111111 croma -> R, luma -> CVBS + G + B */
|
|
state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
|
|
break;
|
|
|
|
@@ -514,10 +508,7 @@
|
|
break;
|
|
|
|
case SAA7127_OUTPUT_TYPE_BOTH:
|
|
- if (state->ident == V4L2_IDENT_SAA7129)
|
|
- state->reg_2d = 0x38;
|
|
- else
|
|
- state->reg_2d = 0xbf;
|
|
+ state->reg_2d = 0xbf;
|
|
state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
|
|
break;
|
|
|
|
@@ -740,6 +731,24 @@
|
|
return -ENODEV;
|
|
}
|
|
|
|
+ /* Configure Encoder */
|
|
+
|
|
+ v4l2_dbg(1, debug, sd, "Configuring encoder\n");
|
|
+ saa7127_write_inittab(sd, saa7127_init_config_common);
|
|
+ saa7127_set_std(sd, V4L2_STD_NTSC);
|
|
+ saa7127_set_output_type(sd, SAA7127_OUTPUT_TYPE_BOTH);
|
|
+ saa7127_set_vps(sd, &vbi);
|
|
+ saa7127_set_wss(sd, &vbi);
|
|
+ saa7127_set_cc(sd, &vbi);
|
|
+ saa7127_set_xds(sd, &vbi);
|
|
+ if (test_image == 1)
|
|
+ /* The Encoder has an internal Colorbar generator */
|
|
+ /* This can be used for debugging */
|
|
+ saa7127_set_input_type(sd, SAA7127_INPUT_TYPE_TEST_IMAGE);
|
|
+ else
|
|
+ saa7127_set_input_type(sd, SAA7127_INPUT_TYPE_NORMAL);
|
|
+ saa7127_set_video_enable(sd, 1);
|
|
+
|
|
if (id->driver_data) { /* Chip type is already known */
|
|
state->ident = id->driver_data;
|
|
} else { /* Needs detection */
|
|
@@ -761,23 +770,6 @@
|
|
|
|
v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name,
|
|
client->addr << 1, client->adapter->name);
|
|
-
|
|
- v4l2_dbg(1, debug, sd, "Configuring encoder\n");
|
|
- saa7127_write_inittab(sd, saa7127_init_config_common);
|
|
- saa7127_set_std(sd, V4L2_STD_NTSC);
|
|
- saa7127_set_output_type(sd, SAA7127_OUTPUT_TYPE_BOTH);
|
|
- saa7127_set_vps(sd, &vbi);
|
|
- saa7127_set_wss(sd, &vbi);
|
|
- saa7127_set_cc(sd, &vbi);
|
|
- saa7127_set_xds(sd, &vbi);
|
|
- if (test_image == 1)
|
|
- /* The Encoder has an internal Colorbar generator */
|
|
- /* This can be used for debugging */
|
|
- saa7127_set_input_type(sd, SAA7127_INPUT_TYPE_TEST_IMAGE);
|
|
- else
|
|
- saa7127_set_input_type(sd, SAA7127_INPUT_TYPE_NORMAL);
|
|
- saa7127_set_video_enable(sd, 1);
|
|
-
|
|
if (state->ident == V4L2_IDENT_SAA7129)
|
|
saa7127_write_inittab(sd, saa7129_init_config_extra);
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-alsa.c linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-alsa.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-alsa.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-alsa.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1089,11 +1089,7 @@
|
|
|
|
list_for_each(list,&saa7134_devlist) {
|
|
dev = list_entry(list, struct saa7134_dev, devlist);
|
|
- if (dev->pci->device == PCI_DEVICE_ID_PHILIPS_SAA7130)
|
|
- printk(KERN_INFO "%s/alsa: %s doesn't support digital audio\n",
|
|
- dev->name, saa7134_boards[dev->board].name);
|
|
- else
|
|
- alsa_device_init(dev);
|
|
+ alsa_device_init(dev);
|
|
}
|
|
|
|
if (dev == NULL)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-core.c linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-core.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -660,10 +660,6 @@
|
|
|
|
saa_writel(SAA7134_IRQ1, 0);
|
|
saa_writel(SAA7134_IRQ2, 0);
|
|
-
|
|
- /* Clear any stale IRQ reports */
|
|
- saa_writel(SAA7134_IRQ_REPORT, saa_readl(SAA7134_IRQ_REPORT));
|
|
-
|
|
mutex_init(&dev->lock);
|
|
spin_lock_init(&dev->slock);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-dvb.c linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-dvb.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-dvb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-dvb.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -860,7 +860,6 @@
|
|
.demod_address = 0x1e>>1,
|
|
.no_tuner = 1,
|
|
.parallel_ts = 1,
|
|
- .disable_i2c_gate_ctrl = 1,
|
|
};
|
|
|
|
/* ==================================================================
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/saa717x.c linux-2.6.29-rc3.owrt/drivers/media/video/saa717x.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/saa717x.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/saa717x.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -30,6 +30,7 @@
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
+#include <linux/version.h>
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/sched.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/sh_mobile_ceu_camera.c linux-2.6.29-rc3.owrt/drivers/media/video/sh_mobile_ceu_camera.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/sh_mobile_ceu_camera.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/sh_mobile_ceu_camera.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -603,18 +603,21 @@
|
|
const struct soc_camera_format_xlate *xlate;
|
|
int ret;
|
|
|
|
- if (!pixfmt)
|
|
- return icd->ops->set_fmt(icd, pixfmt, rect);
|
|
-
|
|
xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
|
|
if (!xlate) {
|
|
dev_warn(&ici->dev, "Format %x not found\n", pixfmt);
|
|
return -EINVAL;
|
|
}
|
|
|
|
- ret = icd->ops->set_fmt(icd, xlate->cam_fmt->fourcc, rect);
|
|
+ switch (pixfmt) {
|
|
+ case 0: /* Only geometry change */
|
|
+ ret = icd->ops->set_fmt(icd, pixfmt, rect);
|
|
+ break;
|
|
+ default:
|
|
+ ret = icd->ops->set_fmt(icd, xlate->cam_fmt->fourcc, rect);
|
|
+ }
|
|
|
|
- if (!ret) {
|
|
+ if (pixfmt && !ret) {
|
|
icd->buswidth = xlate->buswidth;
|
|
icd->current_fmt = xlate->host_fmt;
|
|
pcdev->camera_fmt = xlate->cam_fmt;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/tda9875.c linux-2.6.29-rc3.owrt/drivers/media/video/tda9875.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/tda9875.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/tda9875.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -242,7 +242,7 @@
|
|
static int tda9875_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
|
|
{
|
|
struct tda9875 *t = to_state(sd);
|
|
- int chvol = 0, volume = 0, balance = 0, left, right;
|
|
+ int chvol=0, volume, balance, left, right;
|
|
|
|
switch (ctrl->id) {
|
|
case V4L2_CID_AUDIO_VOLUME:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/tvaudio.c linux-2.6.29-rc3.owrt/drivers/media/video/tvaudio.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/tvaudio.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/tvaudio.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -54,7 +54,7 @@
|
|
/* ---------------------------------------------------------------------- */
|
|
/* our structs */
|
|
|
|
-#define MAXREGS 256
|
|
+#define MAXREGS 64
|
|
|
|
struct CHIPSTATE;
|
|
typedef int (*getvalue)(int);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/tveeprom.c linux-2.6.29-rc3.owrt/drivers/media/video/tveeprom.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/tveeprom.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/tveeprom.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -427,9 +427,6 @@
|
|
const char *t_fmt_name2[8] = { " none", "", "", "", "", "", "", "" };
|
|
|
|
memset(tvee, 0, sizeof(*tvee));
|
|
- tvee->tuner_type = TUNER_ABSENT;
|
|
- tvee->tuner2_type = TUNER_ABSENT;
|
|
-
|
|
done = len = beenhere = 0;
|
|
|
|
/* Different eeprom start offsets for em28xx, cx2388x and cx23418 */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/tvp514x.c linux-2.6.29-rc3.owrt/drivers/media/video/tvp514x.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/tvp514x.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/tvp514x.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1401,7 +1401,7 @@
|
|
|
|
decoder->pdata = client->dev.platform_data;
|
|
if (!decoder->pdata) {
|
|
- v4l_err(client, "No platform data!!\n");
|
|
+ v4l_err(client, "No platform data\n!!");
|
|
return -ENODEV;
|
|
}
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/upd64031a.c linux-2.6.29-rc3.owrt/drivers/media/video/upd64031a.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/upd64031a.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/upd64031a.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,6 +21,7 @@
|
|
*/
|
|
|
|
|
|
+#include <linux/version.h>
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/i2c.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/upd64083.c linux-2.6.29-rc3.owrt/drivers/media/video/upd64083.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/upd64083.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/upd64083.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -21,6 +21,7 @@
|
|
* 02110-1301, USA.
|
|
*/
|
|
|
|
+#include <linux/version.h>
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/i2c.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/usbvision/usbvision-i2c.c linux-2.6.29-rc3.owrt/drivers/media/video/usbvision/usbvision-i2c.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/usbvision/usbvision-i2c.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/usbvision/usbvision-i2c.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -157,7 +157,7 @@
|
|
struct i2c_msg *pmsg;
|
|
struct usb_usbvision *usbvision;
|
|
int i, ret;
|
|
- unsigned char addr = 0;
|
|
+ unsigned char addr;
|
|
|
|
usbvision = (struct usb_usbvision *)i2c_get_adapdata(i2c_adap);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_ctrl.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_ctrl.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_ctrl.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_ctrl.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* uvc_ctrl.c -- USB Video Class driver - Controls
|
|
*
|
|
- * Copyright (C) 2005-2009
|
|
+ * Copyright (C) 2005-2008
|
|
* Laurent Pinchart (laurent.pinchart@skynet.be)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -12,6 +12,7 @@
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/list.h>
|
|
#include <linux/module.h>
|
|
#include <linux/uaccess.h>
|
|
@@ -28,7 +29,7 @@
|
|
#define UVC_CTRL_DATA_BACKUP 1
|
|
|
|
/* ------------------------------------------------------------------------
|
|
- * Controls
|
|
+ * Control, formats, ...
|
|
*/
|
|
|
|
static struct uvc_control_info uvc_ctrls[] = {
|
|
@@ -634,7 +635,7 @@
|
|
mask = (1 << bits) - 1;
|
|
}
|
|
|
|
- /* Sign-extend the value if needed. */
|
|
+ /* Sign-extend the value if needed */
|
|
if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED)
|
|
value |= -(value & (1 << (mapping->size - 1)));
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_driver.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_driver.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_driver.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_driver.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* uvc_driver.c -- USB Video Class driver
|
|
*
|
|
- * Copyright (C) 2005-2009
|
|
+ * Copyright (C) 2005-2008
|
|
* Laurent Pinchart (laurent.pinchart@skynet.be)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -24,6 +24,7 @@
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/list.h>
|
|
#include <linux/module.h>
|
|
#include <linux/usb.h>
|
|
@@ -48,7 +49,7 @@
|
|
unsigned int uvc_trace_param;
|
|
|
|
/* ------------------------------------------------------------------------
|
|
- * Video formats
|
|
+ * Control, formats, ...
|
|
*/
|
|
|
|
static struct uvc_format_desc uvc_fmts[] = {
|
|
@@ -473,7 +474,7 @@
|
|
|
|
/* Several UVC chipsets screw up dwMaxVideoFrameBufferSize
|
|
* completely. Observed behaviours range from setting the
|
|
- * value to 1.1x the actual frame size to hardwiring the
|
|
+ * value to 1.1x the actual frame size of hardwiring the
|
|
* 16 low bits to 0. This results in a higher than necessary
|
|
* memory usage as well as a wrong image size information. For
|
|
* uncompressed formats this can be fixed by computing the
|
|
@@ -486,7 +487,7 @@
|
|
/* Some bogus devices report dwMinFrameInterval equal to
|
|
* dwMaxFrameInterval and have dwFrameIntervalStep set to
|
|
* zero. Setting all null intervals to 1 fixes the problem and
|
|
- * some other divisions by zero that could happen.
|
|
+ * some other divisions by zero which could happen.
|
|
*/
|
|
for (i = 0; i < n; ++i) {
|
|
interval = get_unaligned_le32(&buffer[26+4*i]);
|
|
@@ -1199,13 +1200,13 @@
|
|
* Scan the UVC descriptors to locate a chain starting at an Output Terminal
|
|
* and containing the following units:
|
|
*
|
|
- * - one Output Terminal (USB Streaming or Display)
|
|
+ * - a USB Streaming Output Terminal
|
|
* - zero or one Processing Unit
|
|
* - zero, one or mode single-input Selector Units
|
|
* - zero or one multiple-input Selector Units, provided all inputs are
|
|
* connected to input terminals
|
|
* - zero, one or mode single-input Extension Units
|
|
- * - one or more Input Terminals (Camera, External or USB Streaming)
|
|
+ * - one Camera Input Terminal, or one or more External terminals.
|
|
*
|
|
* A side forward scan is made on each detected entity to check for additional
|
|
* extension units.
|
|
@@ -1530,6 +1531,10 @@
|
|
|
|
/* Set the driver data before calling video_register_device, otherwise
|
|
* uvc_v4l2_open might race us.
|
|
+ *
|
|
+ * FIXME: usb_set_intfdata hasn't been called so far. Is that a
|
|
+ * problem ? Does any function which could be called here get
|
|
+ * a pointer to the usb_interface ?
|
|
*/
|
|
dev->video.vdev = vdev;
|
|
video_set_drvdata(vdev, &dev->video);
|
|
@@ -1564,7 +1569,7 @@
|
|
struct uvc_device *dev = container_of(kref, struct uvc_device, kref);
|
|
struct list_head *p, *n;
|
|
|
|
- /* Unregister the video device. */
|
|
+ /* Unregister the video device */
|
|
uvc_unregister_video(dev);
|
|
usb_put_intf(dev->intf);
|
|
usb_put_dev(dev->udev);
|
|
@@ -1607,7 +1612,7 @@
|
|
uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n",
|
|
udev->devpath);
|
|
|
|
- /* Allocate memory for the device and initialize it. */
|
|
+ /* Allocate memory for the device and initialize it */
|
|
if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)
|
|
return -ENOMEM;
|
|
|
|
@@ -1628,14 +1633,14 @@
|
|
le16_to_cpu(udev->descriptor.idVendor),
|
|
le16_to_cpu(udev->descriptor.idProduct));
|
|
|
|
- /* Parse the Video Class control descriptor. */
|
|
+ /* Parse the Video Class control descriptor */
|
|
if (uvc_parse_control(dev) < 0) {
|
|
uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC "
|
|
"descriptors.\n");
|
|
goto error;
|
|
}
|
|
|
|
- uvc_printk(KERN_INFO, "Found UVC %u.%02x device %s (%04x:%04x)\n",
|
|
+ uvc_printk(KERN_INFO, "Found UVC %u.%02u device %s (%04x:%04x)\n",
|
|
dev->uvc_version >> 8, dev->uvc_version & 0xff,
|
|
udev->product ? udev->product : "<unnamed>",
|
|
le16_to_cpu(udev->descriptor.idVendor),
|
|
@@ -1648,18 +1653,18 @@
|
|
"linux-uvc-devel mailing list.\n");
|
|
}
|
|
|
|
- /* Initialize controls. */
|
|
+ /* Initialize controls */
|
|
if (uvc_ctrl_init_device(dev) < 0)
|
|
goto error;
|
|
|
|
- /* Register the video devices. */
|
|
+ /* Register the video devices */
|
|
if (uvc_register_video(dev) < 0)
|
|
goto error;
|
|
|
|
- /* Save our data pointer in the interface data. */
|
|
+ /* Save our data pointer in the interface data */
|
|
usb_set_intfdata(intf, dev);
|
|
|
|
- /* Initialize the interrupt URB. */
|
|
+ /* Initialize the interrupt URB */
|
|
if ((ret = uvc_status_init(dev)) < 0) {
|
|
uvc_printk(KERN_INFO, "Unable to initialize the status "
|
|
"endpoint (%d), status interrupt will not be "
|
|
@@ -1834,24 +1839,24 @@
|
|
.bInterfaceSubClass = 1,
|
|
.bInterfaceProtocol = 0 },
|
|
/* Apple Built-In iSight */
|
|
- { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|
|
.idVendor = 0x05ac,
|
|
.idProduct = 0x8501,
|
|
- .bInterfaceClass = USB_CLASS_VIDEO,
|
|
- .bInterfaceSubClass = 1,
|
|
- .bInterfaceProtocol = 0,
|
|
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
+ .bInterfaceSubClass = 1,
|
|
+ .bInterfaceProtocol = 0,
|
|
.driver_info = UVC_QUIRK_PROBE_MINMAX
|
|
| UVC_QUIRK_BUILTIN_ISIGHT },
|
|
/* Genesys Logic USB 2.0 PC Camera */
|
|
- { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|
|
- .idVendor = 0x05e3,
|
|
- .idProduct = 0x0505,
|
|
- .bInterfaceClass = USB_CLASS_VIDEO,
|
|
- .bInterfaceSubClass = 1,
|
|
- .bInterfaceProtocol = 0,
|
|
- .driver_info = UVC_QUIRK_STREAM_NO_FID },
|
|
+ .idVendor = 0x05e3,
|
|
+ .idProduct = 0x0505,
|
|
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
+ .bInterfaceSubClass = 1,
|
|
+ .bInterfaceProtocol = 0,
|
|
+ .driver_info = UVC_QUIRK_STREAM_NO_FID },
|
|
/* MT6227 */
|
|
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_isight.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_isight.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_isight.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_isight.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,8 +3,6 @@
|
|
*
|
|
* Copyright (C) 2006-2007
|
|
* Ivan N. Zlatev <contact@i-nz.net>
|
|
- * Copyright (C) 2008-2009
|
|
- * Laurent Pinchart <laurent.pinchart@skynet.be>
|
|
*
|
|
* 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
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_queue.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_queue.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_queue.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_queue.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* uvc_queue.c -- USB Video Class driver - Buffers management
|
|
*
|
|
- * Copyright (C) 2005-2009
|
|
+ * Copyright (C) 2005-2008
|
|
* Laurent Pinchart (laurent.pinchart@skynet.be)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -12,6 +12,7 @@
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/list.h>
|
|
#include <linux/module.h>
|
|
@@ -36,22 +37,22 @@
|
|
* to user space will return -EBUSY.
|
|
*
|
|
* Video buffers are managed using two queues. However, unlike most USB video
|
|
- * drivers that use an in queue and an out queue, we use a main queue to hold
|
|
- * all queued buffers (both 'empty' and 'done' buffers), and an irq queue to
|
|
- * hold empty buffers. This design (copied from video-buf) minimizes locking
|
|
- * in interrupt, as only one queue is shared between interrupt and user
|
|
- * contexts.
|
|
+ * drivers which use an in queue and an out queue, we use a main queue which
|
|
+ * holds all queued buffers (both 'empty' and 'done' buffers), and an irq
|
|
+ * queue which holds empty buffers. This design (copied from video-buf)
|
|
+ * minimizes locking in interrupt, as only one queue is shared between
|
|
+ * interrupt and user contexts.
|
|
*
|
|
* Use cases
|
|
* ---------
|
|
*
|
|
- * Unless stated otherwise, all operations that modify the irq buffers queue
|
|
+ * Unless stated otherwise, all operations which modify the irq buffers queue
|
|
* are protected by the irq spinlock.
|
|
*
|
|
* 1. The user queues the buffers, starts streaming and dequeues a buffer.
|
|
*
|
|
* The buffers are added to the main and irq queues. Both operations are
|
|
- * protected by the queue lock, and the later is protected by the irq
|
|
+ * protected by the queue lock, and the latert is protected by the irq
|
|
* spinlock as well.
|
|
*
|
|
* The completion handler fetches a buffer from the irq queue and fills it
|
|
@@ -59,7 +60,7 @@
|
|
* returns immediately.
|
|
*
|
|
* When the buffer is full, the completion handler removes it from the irq
|
|
- * queue, marks it as ready (UVC_BUF_STATE_DONE) and wakes its wait queue.
|
|
+ * queue, marks it as ready (UVC_BUF_STATE_DONE) and wake its wait queue.
|
|
* At that point, any process waiting on the buffer will be woken up. If a
|
|
* process tries to dequeue a buffer after it has been marked ready, the
|
|
* dequeing will succeed immediately.
|
|
@@ -90,8 +91,8 @@
|
|
/*
|
|
* Allocate the video buffers.
|
|
*
|
|
- * Pages are reserved to make sure they will not be swapped, as they will be
|
|
- * filled in the URB completion handler.
|
|
+ * Pages are reserved to make sure they will not be swaped, as they will be
|
|
+ * filled in URB completion handler.
|
|
*
|
|
* Buffers will be individually mapped, so they must all be page aligned.
|
|
*/
|
|
@@ -209,8 +210,8 @@
|
|
__uvc_query_buffer(&queue->buffer[v4l2_buf->index], v4l2_buf);
|
|
|
|
done:
|
|
- mutex_unlock(&queue->mutex);
|
|
- return ret;
|
|
+ mutex_unlock(&queue->mutex);
|
|
+ return ret;
|
|
}
|
|
|
|
/*
|
|
@@ -235,7 +236,7 @@
|
|
}
|
|
|
|
mutex_lock(&queue->mutex);
|
|
- if (v4l2_buf->index >= queue->count) {
|
|
+ if (v4l2_buf->index >= queue->count) {
|
|
uvc_trace(UVC_TRACE_CAPTURE, "[E] Out of range index.\n");
|
|
ret = -EINVAL;
|
|
goto done;
|
|
@@ -428,7 +429,7 @@
|
|
* Cancel the video buffers queue.
|
|
*
|
|
* Cancelling the queue marks all buffers on the irq queue as erroneous,
|
|
- * wakes them up and removes them from the queue.
|
|
+ * wakes them up and remove them from the queue.
|
|
*
|
|
* If the disconnect parameter is set, further calls to uvc_queue_buffer will
|
|
* fail with -ENODEV.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_status.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_status.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_status.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_status.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* uvc_status.c -- USB Video Class driver - Status endpoint
|
|
*
|
|
- * Copyright (C) 2007-2009
|
|
+ * Copyright (C) 2007-2008
|
|
* Laurent Pinchart (laurent.pinchart@skynet.be)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -12,6 +12,7 @@
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/input.h>
|
|
#include <linux/usb.h>
|
|
#include <linux/usb/input.h>
|
|
@@ -46,8 +47,8 @@
|
|
usb_to_input_id(udev, &input->id);
|
|
input->dev.parent = &dev->intf->dev;
|
|
|
|
- __set_bit(EV_KEY, input->evbit);
|
|
- __set_bit(KEY_CAMERA, input->keybit);
|
|
+ set_bit(EV_KEY, input->evbit);
|
|
+ set_bit(BTN_0, input->keybit);
|
|
|
|
if ((ret = input_register_device(input)) < 0)
|
|
goto error;
|
|
@@ -70,10 +71,8 @@
|
|
static void uvc_input_report_key(struct uvc_device *dev, unsigned int code,
|
|
int value)
|
|
{
|
|
- if (dev->input) {
|
|
+ if (dev->input)
|
|
input_report_key(dev->input, code, value);
|
|
- input_sync(dev->input);
|
|
- }
|
|
}
|
|
|
|
#else
|
|
@@ -98,7 +97,7 @@
|
|
return;
|
|
uvc_trace(UVC_TRACE_STATUS, "Button (intf %u) %s len %d\n",
|
|
data[1], data[3] ? "pressed" : "released", len);
|
|
- uvc_input_report_key(dev, KEY_CAMERA, data[3]);
|
|
+ uvc_input_report_key(dev, BTN_0, data[3]);
|
|
} else {
|
|
uvc_trace(UVC_TRACE_STATUS, "Stream %u error event %02x %02x "
|
|
"len %d.\n", data[1], data[2], data[3], len);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_v4l2.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_v4l2.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_v4l2.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_v4l2.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* uvc_v4l2.c -- USB Video Class driver - V4L2 API
|
|
*
|
|
- * Copyright (C) 2005-2009
|
|
+ * Copyright (C) 2005-2008
|
|
* Laurent Pinchart (laurent.pinchart@skynet.be)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -37,7 +37,7 @@
|
|
* must be grouped (for instance the Red Balance, Blue Balance and Do White
|
|
* Balance V4L2 controls use the White Balance Component UVC control) or
|
|
* otherwise translated. The approach we take here is to use a translation
|
|
- * table for the controls that can be mapped directly, and handle the others
|
|
+ * table for the controls which can be mapped directly, and handle the others
|
|
* manually.
|
|
*/
|
|
static int uvc_v4l2_query_menu(struct uvc_video_device *video,
|
|
@@ -189,7 +189,7 @@
|
|
probe->dwMaxVideoFrameSize =
|
|
video->streaming->ctrl.dwMaxVideoFrameSize;
|
|
|
|
- /* Probe the device. */
|
|
+ /* Probe the device */
|
|
if ((ret = uvc_probe_video(video, probe)) < 0)
|
|
goto done;
|
|
|
|
@@ -354,11 +354,11 @@
|
|
*
|
|
* Each open instance of a UVC device can either be in a privileged or
|
|
* unprivileged state. Only a single instance can be in a privileged state at
|
|
- * a given time. Trying to perform an operation that requires privileges will
|
|
+ * a given time. Trying to perform an operation which requires privileges will
|
|
* automatically acquire the required privileges if possible, or return -EBUSY
|
|
* otherwise. Privileges are dismissed when closing the instance.
|
|
*
|
|
- * Operations that require privileges are:
|
|
+ * Operations which require privileges are:
|
|
*
|
|
* - VIDIOC_S_INPUT
|
|
* - VIDIOC_S_PARM
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_video.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_video.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_video.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_video.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* uvc_video.c -- USB Video Class driver - Video handling
|
|
*
|
|
- * Copyright (C) 2005-2009
|
|
+ * Copyright (C) 2005-2008
|
|
* Laurent Pinchart (laurent.pinchart@skynet.be)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -12,6 +12,7 @@
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/list.h>
|
|
#include <linux/module.h>
|
|
#include <linux/usb.h>
|
|
@@ -114,7 +115,7 @@
|
|
ctrl->wCompQuality = le16_to_cpup((__le16 *)data);
|
|
ret = 0;
|
|
goto out;
|
|
- } else if (query == GET_DEF && probe == 1 && ret != size) {
|
|
+ } else if (query == GET_DEF && probe == 1) {
|
|
/* Many cameras don't support the GET_DEF request on their
|
|
* video probe control. Warn once and return, the caller will
|
|
* fall back to GET_CUR.
|
|
@@ -159,7 +160,7 @@
|
|
}
|
|
|
|
/* Some broken devices return a null or wrong dwMaxVideoFrameSize.
|
|
- * Try to get the value from the format and frame descriptors.
|
|
+ * Try to get the value from the format and frame descriptor.
|
|
*/
|
|
uvc_fixup_buffer_size(video, ctrl);
|
|
ret = 0;
|
|
@@ -190,6 +191,9 @@
|
|
*(__le16 *)&data[12] = cpu_to_le16(ctrl->wCompQuality);
|
|
*(__le16 *)&data[14] = cpu_to_le16(ctrl->wCompWindowSize);
|
|
*(__le16 *)&data[16] = cpu_to_le16(ctrl->wDelay);
|
|
+ /* Note: Some of the fields below are not required for IN devices (see
|
|
+ * UVC spec, 4.3.1.1), but we still copy them in case support for OUT
|
|
+ * devices is added in the future. */
|
|
put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]);
|
|
put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]);
|
|
|
|
@@ -396,7 +400,7 @@
|
|
*
|
|
* Empty buffers (bytesused == 0) don't trigger end of frame detection
|
|
* as it doesn't make sense to return an empty buffer. This also
|
|
- * avoids detecting end of frame conditions at FID toggling if the
|
|
+ * avoids detecting and of frame conditions at FID toggling if the
|
|
* previous payload had the EOF bit set.
|
|
*/
|
|
if (fid != video->last_fid && buf->buf.bytesused != 0) {
|
|
@@ -449,17 +453,6 @@
|
|
}
|
|
}
|
|
|
|
-/* Video payload encoding is handled by uvc_video_encode_header() and
|
|
- * uvc_video_encode_data(). Only bulk transfers are currently supported.
|
|
- *
|
|
- * uvc_video_encode_header is called at the start of a payload. It adds header
|
|
- * data to the transfer buffer and returns the header size. As the only known
|
|
- * UVC output device transfers a whole frame in a single payload, the EOF bit
|
|
- * is always set in the header.
|
|
- *
|
|
- * uvc_video_encode_data is called for every URB and copies the data from the
|
|
- * video buffer to the transfer buffer.
|
|
- */
|
|
static int uvc_video_encode_header(struct uvc_video_device *video,
|
|
struct uvc_buffer *buf, __u8 *data, int len)
|
|
{
|
|
@@ -960,7 +953,7 @@
|
|
}
|
|
|
|
/*
|
|
- * Reconfigure the video interface and restart streaming if it was enabled
|
|
+ * Reconfigure the video interface and restart streaming if it was enable
|
|
* before suspend.
|
|
*
|
|
* If an error occurs, disable the video queue. This will wake all pending
|
|
@@ -992,8 +985,8 @@
|
|
*/
|
|
|
|
/*
|
|
- * Initialize the UVC video device by switching to alternate setting 0 and
|
|
- * retrieve the default format.
|
|
+ * Initialize the UVC video device by retrieving the default format and
|
|
+ * committing it.
|
|
*
|
|
* Some cameras (namely the Fuji Finepix) set the format and frame
|
|
* indexes to zero. The UVC standard doesn't clearly make this a spec
|
|
@@ -1021,7 +1014,7 @@
|
|
*/
|
|
usb_set_interface(video->dev->udev, video->streaming->intfnum, 0);
|
|
|
|
- /* Some webcams don't suport GET_DEF requests on the probe control. We
|
|
+ /* Some webcams don't suport GET_DEF request on the probe control. We
|
|
* fall back to GET_CUR if GET_DEF fails.
|
|
*/
|
|
if ((ret = uvc_get_video_ctrl(video, probe, 1, GET_DEF)) < 0 &&
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/uvc/uvcvideo.h linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvcvideo.h
|
|
--- linux-2.6.29.owrt/drivers/media/video/uvc/uvcvideo.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvcvideo.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -72,149 +72,149 @@
|
|
* UVC constants
|
|
*/
|
|
|
|
-#define SC_UNDEFINED 0x00
|
|
-#define SC_VIDEOCONTROL 0x01
|
|
-#define SC_VIDEOSTREAMING 0x02
|
|
-#define SC_VIDEO_INTERFACE_COLLECTION 0x03
|
|
-
|
|
-#define PC_PROTOCOL_UNDEFINED 0x00
|
|
-
|
|
-#define CS_UNDEFINED 0x20
|
|
-#define CS_DEVICE 0x21
|
|
-#define CS_CONFIGURATION 0x22
|
|
-#define CS_STRING 0x23
|
|
-#define CS_INTERFACE 0x24
|
|
-#define CS_ENDPOINT 0x25
|
|
+#define SC_UNDEFINED 0x00
|
|
+#define SC_VIDEOCONTROL 0x01
|
|
+#define SC_VIDEOSTREAMING 0x02
|
|
+#define SC_VIDEO_INTERFACE_COLLECTION 0x03
|
|
+
|
|
+#define PC_PROTOCOL_UNDEFINED 0x00
|
|
+
|
|
+#define CS_UNDEFINED 0x20
|
|
+#define CS_DEVICE 0x21
|
|
+#define CS_CONFIGURATION 0x22
|
|
+#define CS_STRING 0x23
|
|
+#define CS_INTERFACE 0x24
|
|
+#define CS_ENDPOINT 0x25
|
|
|
|
/* VideoControl class specific interface descriptor */
|
|
-#define VC_DESCRIPTOR_UNDEFINED 0x00
|
|
-#define VC_HEADER 0x01
|
|
-#define VC_INPUT_TERMINAL 0x02
|
|
-#define VC_OUTPUT_TERMINAL 0x03
|
|
-#define VC_SELECTOR_UNIT 0x04
|
|
-#define VC_PROCESSING_UNIT 0x05
|
|
-#define VC_EXTENSION_UNIT 0x06
|
|
+#define VC_DESCRIPTOR_UNDEFINED 0x00
|
|
+#define VC_HEADER 0x01
|
|
+#define VC_INPUT_TERMINAL 0x02
|
|
+#define VC_OUTPUT_TERMINAL 0x03
|
|
+#define VC_SELECTOR_UNIT 0x04
|
|
+#define VC_PROCESSING_UNIT 0x05
|
|
+#define VC_EXTENSION_UNIT 0x06
|
|
|
|
/* VideoStreaming class specific interface descriptor */
|
|
-#define VS_UNDEFINED 0x00
|
|
-#define VS_INPUT_HEADER 0x01
|
|
-#define VS_OUTPUT_HEADER 0x02
|
|
-#define VS_STILL_IMAGE_FRAME 0x03
|
|
-#define VS_FORMAT_UNCOMPRESSED 0x04
|
|
-#define VS_FRAME_UNCOMPRESSED 0x05
|
|
-#define VS_FORMAT_MJPEG 0x06
|
|
-#define VS_FRAME_MJPEG 0x07
|
|
-#define VS_FORMAT_MPEG2TS 0x0a
|
|
-#define VS_FORMAT_DV 0x0c
|
|
-#define VS_COLORFORMAT 0x0d
|
|
-#define VS_FORMAT_FRAME_BASED 0x10
|
|
-#define VS_FRAME_FRAME_BASED 0x11
|
|
-#define VS_FORMAT_STREAM_BASED 0x12
|
|
+#define VS_UNDEFINED 0x00
|
|
+#define VS_INPUT_HEADER 0x01
|
|
+#define VS_OUTPUT_HEADER 0x02
|
|
+#define VS_STILL_IMAGE_FRAME 0x03
|
|
+#define VS_FORMAT_UNCOMPRESSED 0x04
|
|
+#define VS_FRAME_UNCOMPRESSED 0x05
|
|
+#define VS_FORMAT_MJPEG 0x06
|
|
+#define VS_FRAME_MJPEG 0x07
|
|
+#define VS_FORMAT_MPEG2TS 0x0a
|
|
+#define VS_FORMAT_DV 0x0c
|
|
+#define VS_COLORFORMAT 0x0d
|
|
+#define VS_FORMAT_FRAME_BASED 0x10
|
|
+#define VS_FRAME_FRAME_BASED 0x11
|
|
+#define VS_FORMAT_STREAM_BASED 0x12
|
|
|
|
/* Endpoint type */
|
|
-#define EP_UNDEFINED 0x00
|
|
-#define EP_GENERAL 0x01
|
|
-#define EP_ENDPOINT 0x02
|
|
-#define EP_INTERRUPT 0x03
|
|
+#define EP_UNDEFINED 0x00
|
|
+#define EP_GENERAL 0x01
|
|
+#define EP_ENDPOINT 0x02
|
|
+#define EP_INTERRUPT 0x03
|
|
|
|
/* Request codes */
|
|
-#define RC_UNDEFINED 0x00
|
|
-#define SET_CUR 0x01
|
|
-#define GET_CUR 0x81
|
|
-#define GET_MIN 0x82
|
|
-#define GET_MAX 0x83
|
|
-#define GET_RES 0x84
|
|
-#define GET_LEN 0x85
|
|
-#define GET_INFO 0x86
|
|
-#define GET_DEF 0x87
|
|
+#define RC_UNDEFINED 0x00
|
|
+#define SET_CUR 0x01
|
|
+#define GET_CUR 0x81
|
|
+#define GET_MIN 0x82
|
|
+#define GET_MAX 0x83
|
|
+#define GET_RES 0x84
|
|
+#define GET_LEN 0x85
|
|
+#define GET_INFO 0x86
|
|
+#define GET_DEF 0x87
|
|
|
|
/* VideoControl interface controls */
|
|
-#define VC_CONTROL_UNDEFINED 0x00
|
|
-#define VC_VIDEO_POWER_MODE_CONTROL 0x01
|
|
-#define VC_REQUEST_ERROR_CODE_CONTROL 0x02
|
|
+#define VC_CONTROL_UNDEFINED 0x00
|
|
+#define VC_VIDEO_POWER_MODE_CONTROL 0x01
|
|
+#define VC_REQUEST_ERROR_CODE_CONTROL 0x02
|
|
|
|
/* Terminal controls */
|
|
-#define TE_CONTROL_UNDEFINED 0x00
|
|
+#define TE_CONTROL_UNDEFINED 0x00
|
|
|
|
/* Selector Unit controls */
|
|
-#define SU_CONTROL_UNDEFINED 0x00
|
|
-#define SU_INPUT_SELECT_CONTROL 0x01
|
|
+#define SU_CONTROL_UNDEFINED 0x00
|
|
+#define SU_INPUT_SELECT_CONTROL 0x01
|
|
|
|
/* Camera Terminal controls */
|
|
-#define CT_CONTROL_UNDEFINED 0x00
|
|
-#define CT_SCANNING_MODE_CONTROL 0x01
|
|
-#define CT_AE_MODE_CONTROL 0x02
|
|
-#define CT_AE_PRIORITY_CONTROL 0x03
|
|
-#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
|
|
-#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
|
|
-#define CT_FOCUS_ABSOLUTE_CONTROL 0x06
|
|
-#define CT_FOCUS_RELATIVE_CONTROL 0x07
|
|
-#define CT_FOCUS_AUTO_CONTROL 0x08
|
|
-#define CT_IRIS_ABSOLUTE_CONTROL 0x09
|
|
-#define CT_IRIS_RELATIVE_CONTROL 0x0a
|
|
-#define CT_ZOOM_ABSOLUTE_CONTROL 0x0b
|
|
-#define CT_ZOOM_RELATIVE_CONTROL 0x0c
|
|
-#define CT_PANTILT_ABSOLUTE_CONTROL 0x0d
|
|
-#define CT_PANTILT_RELATIVE_CONTROL 0x0e
|
|
-#define CT_ROLL_ABSOLUTE_CONTROL 0x0f
|
|
-#define CT_ROLL_RELATIVE_CONTROL 0x10
|
|
-#define CT_PRIVACY_CONTROL 0x11
|
|
+#define CT_CONTROL_UNDEFINED 0x00
|
|
+#define CT_SCANNING_MODE_CONTROL 0x01
|
|
+#define CT_AE_MODE_CONTROL 0x02
|
|
+#define CT_AE_PRIORITY_CONTROL 0x03
|
|
+#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
|
|
+#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
|
|
+#define CT_FOCUS_ABSOLUTE_CONTROL 0x06
|
|
+#define CT_FOCUS_RELATIVE_CONTROL 0x07
|
|
+#define CT_FOCUS_AUTO_CONTROL 0x08
|
|
+#define CT_IRIS_ABSOLUTE_CONTROL 0x09
|
|
+#define CT_IRIS_RELATIVE_CONTROL 0x0a
|
|
+#define CT_ZOOM_ABSOLUTE_CONTROL 0x0b
|
|
+#define CT_ZOOM_RELATIVE_CONTROL 0x0c
|
|
+#define CT_PANTILT_ABSOLUTE_CONTROL 0x0d
|
|
+#define CT_PANTILT_RELATIVE_CONTROL 0x0e
|
|
+#define CT_ROLL_ABSOLUTE_CONTROL 0x0f
|
|
+#define CT_ROLL_RELATIVE_CONTROL 0x10
|
|
+#define CT_PRIVACY_CONTROL 0x11
|
|
|
|
/* Processing Unit controls */
|
|
-#define PU_CONTROL_UNDEFINED 0x00
|
|
-#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
|
|
-#define PU_BRIGHTNESS_CONTROL 0x02
|
|
-#define PU_CONTRAST_CONTROL 0x03
|
|
-#define PU_GAIN_CONTROL 0x04
|
|
-#define PU_POWER_LINE_FREQUENCY_CONTROL 0x05
|
|
-#define PU_HUE_CONTROL 0x06
|
|
-#define PU_SATURATION_CONTROL 0x07
|
|
-#define PU_SHARPNESS_CONTROL 0x08
|
|
-#define PU_GAMMA_CONTROL 0x09
|
|
-#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a
|
|
-#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b
|
|
-#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c
|
|
-#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d
|
|
-#define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e
|
|
-#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f
|
|
-#define PU_HUE_AUTO_CONTROL 0x10
|
|
-#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11
|
|
-#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12
|
|
+#define PU_CONTROL_UNDEFINED 0x00
|
|
+#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
|
|
+#define PU_BRIGHTNESS_CONTROL 0x02
|
|
+#define PU_CONTRAST_CONTROL 0x03
|
|
+#define PU_GAIN_CONTROL 0x04
|
|
+#define PU_POWER_LINE_FREQUENCY_CONTROL 0x05
|
|
+#define PU_HUE_CONTROL 0x06
|
|
+#define PU_SATURATION_CONTROL 0x07
|
|
+#define PU_SHARPNESS_CONTROL 0x08
|
|
+#define PU_GAMMA_CONTROL 0x09
|
|
+#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a
|
|
+#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b
|
|
+#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c
|
|
+#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d
|
|
+#define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e
|
|
+#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f
|
|
+#define PU_HUE_AUTO_CONTROL 0x10
|
|
+#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11
|
|
+#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12
|
|
|
|
#define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01
|
|
#define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02
|
|
#define LXU_MOTOR_FOCUS_MOTOR_CONTROL 0x03
|
|
|
|
/* VideoStreaming interface controls */
|
|
-#define VS_CONTROL_UNDEFINED 0x00
|
|
-#define VS_PROBE_CONTROL 0x01
|
|
-#define VS_COMMIT_CONTROL 0x02
|
|
-#define VS_STILL_PROBE_CONTROL 0x03
|
|
-#define VS_STILL_COMMIT_CONTROL 0x04
|
|
-#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
|
|
-#define VS_STREAM_ERROR_CODE_CONTROL 0x06
|
|
-#define VS_GENERATE_KEY_FRAME_CONTROL 0x07
|
|
-#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
|
|
-#define VS_SYNC_DELAY_CONTROL 0x09
|
|
+#define VS_CONTROL_UNDEFINED 0x00
|
|
+#define VS_PROBE_CONTROL 0x01
|
|
+#define VS_COMMIT_CONTROL 0x02
|
|
+#define VS_STILL_PROBE_CONTROL 0x03
|
|
+#define VS_STILL_COMMIT_CONTROL 0x04
|
|
+#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
|
|
+#define VS_STREAM_ERROR_CODE_CONTROL 0x06
|
|
+#define VS_GENERATE_KEY_FRAME_CONTROL 0x07
|
|
+#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
|
|
+#define VS_SYNC_DELAY_CONTROL 0x09
|
|
|
|
-#define TT_VENDOR_SPECIFIC 0x0100
|
|
-#define TT_STREAMING 0x0101
|
|
+#define TT_VENDOR_SPECIFIC 0x0100
|
|
+#define TT_STREAMING 0x0101
|
|
|
|
/* Input Terminal types */
|
|
-#define ITT_VENDOR_SPECIFIC 0x0200
|
|
-#define ITT_CAMERA 0x0201
|
|
-#define ITT_MEDIA_TRANSPORT_INPUT 0x0202
|
|
+#define ITT_VENDOR_SPECIFIC 0x0200
|
|
+#define ITT_CAMERA 0x0201
|
|
+#define ITT_MEDIA_TRANSPORT_INPUT 0x0202
|
|
|
|
/* Output Terminal types */
|
|
-#define OTT_VENDOR_SPECIFIC 0x0300
|
|
-#define OTT_DISPLAY 0x0301
|
|
-#define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302
|
|
+#define OTT_VENDOR_SPECIFIC 0x0300
|
|
+#define OTT_DISPLAY 0x0301
|
|
+#define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302
|
|
|
|
/* External Terminal types */
|
|
-#define EXTERNAL_VENDOR_SPECIFIC 0x0400
|
|
-#define COMPOSITE_CONNECTOR 0x0401
|
|
-#define SVIDEO_CONNECTOR 0x0402
|
|
-#define COMPONENT_CONNECTOR 0x0403
|
|
+#define EXTERNAL_VENDOR_SPECIFIC 0x0400
|
|
+#define COMPOSITE_CONNECTOR 0x0401
|
|
+#define SVIDEO_CONNECTOR 0x0402
|
|
+#define COMPONENT_CONNECTOR 0x0403
|
|
|
|
#define UVC_TERM_INPUT 0x0000
|
|
#define UVC_TERM_OUTPUT 0x8000
|
|
@@ -541,11 +541,11 @@
|
|
};
|
|
|
|
enum uvc_buffer_state {
|
|
- UVC_BUF_STATE_IDLE = 0,
|
|
- UVC_BUF_STATE_QUEUED = 1,
|
|
- UVC_BUF_STATE_ACTIVE = 2,
|
|
- UVC_BUF_STATE_DONE = 3,
|
|
- UVC_BUF_STATE_ERROR = 4,
|
|
+ UVC_BUF_STATE_IDLE = 0,
|
|
+ UVC_BUF_STATE_QUEUED = 1,
|
|
+ UVC_BUF_STATE_ACTIVE = 2,
|
|
+ UVC_BUF_STATE_DONE = 3,
|
|
+ UVC_BUF_STATE_ERROR = 4,
|
|
};
|
|
|
|
struct uvc_buffer {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/v4l2-subdev.c linux-2.6.29-rc3.owrt/drivers/media/video/v4l2-subdev.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/v4l2-subdev.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/v4l2-subdev.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -28,13 +28,13 @@
|
|
{
|
|
switch (cmd) {
|
|
case VIDIOC_QUERYCTRL:
|
|
- return v4l2_subdev_call(sd, core, queryctrl, arg);
|
|
+ return v4l2_subdev_call(sd, core, querymenu, arg);
|
|
case VIDIOC_G_CTRL:
|
|
return v4l2_subdev_call(sd, core, g_ctrl, arg);
|
|
case VIDIOC_S_CTRL:
|
|
return v4l2_subdev_call(sd, core, s_ctrl, arg);
|
|
case VIDIOC_QUERYMENU:
|
|
- return v4l2_subdev_call(sd, core, querymenu, arg);
|
|
+ return v4l2_subdev_call(sd, core, queryctrl, arg);
|
|
case VIDIOC_LOG_STATUS:
|
|
return v4l2_subdev_call(sd, core, log_status);
|
|
case VIDIOC_DBG_G_CHIP_IDENT:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/zoran/Kconfig linux-2.6.29-rc3.owrt/drivers/media/video/zoran/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/media/video/zoran/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -68,7 +68,6 @@
|
|
tristate "AverMedia 6 Eyes support (EXPERIMENTAL)"
|
|
depends on VIDEO_ZORAN_ZR36060 && EXPERIMENTAL && VIDEO_V4L1
|
|
select VIDEO_BT856 if VIDEO_HELPER_CHIPS_AUTO
|
|
- select VIDEO_BT866 if VIDEO_HELPER_CHIPS_AUTO
|
|
select VIDEO_KS0127 if VIDEO_HELPER_CHIPS_AUTO
|
|
help
|
|
Support for the AverMedia 6 Eyes video surveillance card.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/zoran/zoran_card.c linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_card.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/zoran/zoran_card.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_card.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -61,17 +61,17 @@
|
|
|
|
extern const struct zoran_format zoran_formats[];
|
|
|
|
-static int card[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
|
|
+static int card[BUZ_MAX] = { -1, -1, -1, -1 };
|
|
module_param_array(card, int, NULL, 0444);
|
|
-MODULE_PARM_DESC(card, "Card type");
|
|
+MODULE_PARM_DESC(card, "The type of card");
|
|
|
|
-static int encoder[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
|
|
+static int encoder[BUZ_MAX] = { -1, -1, -1, -1 };
|
|
module_param_array(encoder, int, NULL, 0444);
|
|
-MODULE_PARM_DESC(encoder, "Video encoder chip");
|
|
+MODULE_PARM_DESC(encoder, "i2c TV encoder");
|
|
|
|
-static int decoder[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
|
|
+static int decoder[BUZ_MAX] = { -1, -1, -1, -1 };
|
|
module_param_array(decoder, int, NULL, 0444);
|
|
-MODULE_PARM_DESC(decoder, "Video decoder chip");
|
|
+MODULE_PARM_DESC(decoder, "i2c TV decoder");
|
|
|
|
/*
|
|
The video mem address of the video card.
|
|
@@ -104,9 +104,9 @@
|
|
MODULE_PARM_DESC(default_norm, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
|
|
|
|
/* /dev/videoN, -1 for autodetect */
|
|
-static int video_nr[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
|
|
+static int video_nr[BUZ_MAX] = {-1, -1, -1, -1};
|
|
module_param_array(video_nr, int, NULL, 0444);
|
|
-MODULE_PARM_DESC(video_nr, "Video device number (-1=Auto)");
|
|
+MODULE_PARM_DESC(video_nr, "video device number (-1=Auto)");
|
|
|
|
/*
|
|
Number and size of grab buffers for Video 4 Linux
|
|
@@ -153,21 +153,9 @@
|
|
MODULE_AUTHOR("Serguei Miridonov");
|
|
MODULE_LICENSE("GPL");
|
|
|
|
-#define ZR_DEVICE(subven, subdev, data) { \
|
|
- .vendor = PCI_VENDOR_ID_ZORAN, .device = PCI_DEVICE_ID_ZORAN_36057, \
|
|
- .subvendor = (subven), .subdevice = (subdev), .driver_data = (data) }
|
|
-
|
|
-static struct pci_device_id zr36067_pci_tbl[] = {
|
|
- ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC10PLUS, DC10plus),
|
|
- ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC30PLUS, DC30plus),
|
|
- ZR_DEVICE(PCI_VENDOR_ID_ELECTRONICDESIGNGMBH, PCI_DEVICE_ID_LML_33R10, LML33R10),
|
|
- ZR_DEVICE(PCI_VENDOR_ID_IOMEGA, PCI_DEVICE_ID_IOMEGA_BUZ, BUZ),
|
|
- ZR_DEVICE(PCI_ANY_ID, PCI_ANY_ID, NUM_CARDS),
|
|
- {0}
|
|
-};
|
|
-MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
|
|
|
|
-static unsigned int zoran_num; /* number of cards found */
|
|
+int zoran_num; /* number of Buzs in use */
|
|
+struct zoran *zoran[BUZ_MAX];
|
|
|
|
/* videocodec bus functions ZR36060 */
|
|
static u32
|
|
@@ -484,6 +472,8 @@
|
|
}, {
|
|
.type = DC10plus,
|
|
.name = "DC10plus",
|
|
+ .vendor_id = PCI_VENDOR_ID_MIRO,
|
|
+ .device_id = PCI_DEVICE_ID_MIRO_DC10PLUS,
|
|
.i2c_decoder = I2C_DRIVERID_SAA7110,
|
|
.i2c_encoder = I2C_DRIVERID_ADV7175,
|
|
.video_codec = CODEC_TYPE_ZR36060,
|
|
@@ -541,6 +531,8 @@
|
|
}, {
|
|
.type = DC30plus,
|
|
.name = "DC30plus",
|
|
+ .vendor_id = PCI_VENDOR_ID_MIRO,
|
|
+ .device_id = PCI_DEVICE_ID_MIRO_DC30PLUS,
|
|
.i2c_decoder = I2C_DRIVERID_VPX3220,
|
|
.i2c_encoder = I2C_DRIVERID_ADV7175,
|
|
.video_codec = CODEC_TYPE_ZR36050,
|
|
@@ -597,6 +589,8 @@
|
|
}, {
|
|
.type = LML33R10,
|
|
.name = "LML33R10",
|
|
+ .vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,
|
|
+ .device_id = PCI_DEVICE_ID_LML_33R10,
|
|
.i2c_decoder = I2C_DRIVERID_SAA7114,
|
|
.i2c_encoder = I2C_DRIVERID_ADV7170,
|
|
.video_codec = CODEC_TYPE_ZR36060,
|
|
@@ -624,6 +618,8 @@
|
|
}, {
|
|
.type = BUZ,
|
|
.name = "Buz",
|
|
+ .vendor_id = PCI_VENDOR_ID_IOMEGA,
|
|
+ .device_id = PCI_DEVICE_ID_IOMEGA_BUZ,
|
|
.i2c_decoder = I2C_DRIVERID_SAA7111A,
|
|
.i2c_encoder = I2C_DRIVERID_SAA7185B,
|
|
.video_codec = CODEC_TYPE_ZR36060,
|
|
@@ -653,6 +649,8 @@
|
|
.name = "6-Eyes",
|
|
/* AverMedia chose not to brand the 6-Eyes. Thus it
|
|
can't be autodetected, and requires card=x. */
|
|
+ .vendor_id = -1,
|
|
+ .device_id = -1,
|
|
.i2c_decoder = I2C_DRIVERID_KS0127,
|
|
.i2c_encoder = I2C_DRIVERID_BT866,
|
|
.video_codec = CODEC_TYPE_ZR36060,
|
|
@@ -1140,8 +1138,7 @@
|
|
strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
|
|
err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
|
|
if (err < 0)
|
|
- goto exit_free;
|
|
- video_set_drvdata(zr->video_dev, zr);
|
|
+ goto exit_unregister;
|
|
|
|
zoran_init_hardware(zr);
|
|
if (zr36067_debug > 2)
|
|
@@ -1156,19 +1153,19 @@
|
|
zr->initialized = 1;
|
|
return 0;
|
|
|
|
+exit_unregister:
|
|
+ zoran_unregister_i2c(zr);
|
|
exit_free:
|
|
kfree(zr->stat_com);
|
|
kfree(zr->video_dev);
|
|
return err;
|
|
}
|
|
|
|
-static void __devexit zoran_remove(struct pci_dev *pdev)
|
|
+static void
|
|
+zoran_release (struct zoran *zr)
|
|
{
|
|
- struct zoran *zr = pci_get_drvdata(pdev);
|
|
-
|
|
if (!zr->initialized)
|
|
goto exit_free;
|
|
-
|
|
/* unregister videocodec bus */
|
|
if (zr->codec) {
|
|
struct videocodec_master *master = zr->codec->master_data;
|
|
@@ -1197,7 +1194,6 @@
|
|
pci_disable_device(zr->pci_dev);
|
|
video_unregister_device(zr->video_dev);
|
|
exit_free:
|
|
- pci_set_drvdata(pdev, NULL);
|
|
kfree(zr);
|
|
}
|
|
|
|
@@ -1260,329 +1256,338 @@
|
|
* Scan for a Buz card (actually for the PCI controller ZR36057),
|
|
* request the irq and map the io memory
|
|
*/
|
|
-static int __devinit zoran_probe(struct pci_dev *pdev,
|
|
- const struct pci_device_id *ent)
|
|
+static int __devinit
|
|
+find_zr36057 (void)
|
|
{
|
|
unsigned char latency, need_latency;
|
|
struct zoran *zr;
|
|
+ struct pci_dev *dev = NULL;
|
|
int result;
|
|
struct videocodec_master *master_vfe = NULL;
|
|
struct videocodec_master *master_codec = NULL;
|
|
int card_num;
|
|
char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
|
|
- unsigned int nr;
|
|
-
|
|
-
|
|
- nr = zoran_num++;
|
|
- if (nr >= BUZ_MAX) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: driver limited to %d card(s) maximum\n",
|
|
- ZORAN_NAME, BUZ_MAX);
|
|
- return -ENOENT;
|
|
- }
|
|
|
|
- zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
|
|
- if (!zr) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() - kzalloc failed\n",
|
|
- ZORAN_NAME);
|
|
- return -ENOMEM;
|
|
- }
|
|
- zr->pci_dev = pdev;
|
|
- zr->id = nr;
|
|
- snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
|
|
- spin_lock_init(&zr->spinlock);
|
|
- mutex_init(&zr->resource_lock);
|
|
- if (pci_enable_device(pdev))
|
|
- goto zr_free_mem;
|
|
- pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
|
|
+ zoran_num = 0;
|
|
+ while (zoran_num < BUZ_MAX &&
|
|
+ (dev = pci_get_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
|
|
+ card_num = card[zoran_num];
|
|
+ zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
|
|
+ if (!zr) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - kzalloc failed\n",
|
|
+ ZORAN_NAME);
|
|
+ continue;
|
|
+ }
|
|
+ zr->pci_dev = dev;
|
|
+ //zr->zr36057_mem = NULL;
|
|
+ zr->id = zoran_num;
|
|
+ snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
|
|
+ spin_lock_init(&zr->spinlock);
|
|
+ mutex_init(&zr->resource_lock);
|
|
+ if (pci_enable_device(dev))
|
|
+ goto zr_free_mem;
|
|
+ zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
|
|
+ pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION,
|
|
+ &zr->revision);
|
|
+ if (zr->revision < 2) {
|
|
+ dprintk(1,
|
|
+ KERN_INFO
|
|
+ "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
|
|
+ ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
|
|
+ zr->zr36057_adr);
|
|
|
|
- dprintk(1,
|
|
- KERN_INFO
|
|
- "%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
|
|
- ZR_DEVNAME(zr), zr->revision < 2 ? '5' : '6', zr->revision,
|
|
- zr->pci_dev->irq, (uint64_t)pci_resource_start(zr->pci_dev, 0));
|
|
- if (zr->revision >= 2) {
|
|
- dprintk(1,
|
|
- KERN_INFO
|
|
- "%s: Subsystem vendor=0x%04x id=0x%04x\n",
|
|
- ZR_DEVNAME(zr), zr->pci_dev->subsystem_vendor,
|
|
- zr->pci_dev->subsystem_device);
|
|
- }
|
|
+ if (card_num == -1) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ goto zr_free_mem;
|
|
+ }
|
|
+ } else {
|
|
+ int i;
|
|
+ unsigned short ss_vendor, ss_device;
|
|
|
|
- /* Use auto-detected card type? */
|
|
- if (card[nr] == -1) {
|
|
- if (zr->revision < 2) {
|
|
+ ss_vendor = zr->pci_dev->subsystem_vendor;
|
|
+ ss_device = zr->pci_dev->subsystem_device;
|
|
dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: No card type specified, please use the card=X module parameter\n",
|
|
- ZR_DEVNAME(zr));
|
|
+ KERN_INFO
|
|
+ "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
|
|
+ ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
|
|
+ zr->zr36057_adr);
|
|
dprintk(1,
|
|
+ KERN_INFO
|
|
+ "%s: subsystem vendor=0x%04x id=0x%04x\n",
|
|
+ ZR_DEVNAME(zr), ss_vendor, ss_device);
|
|
+ if (card_num == -1) {
|
|
+ dprintk(3,
|
|
+ KERN_DEBUG
|
|
+ "%s: find_zr36057() - trying to autodetect card type\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ for (i=0;i<NUM_CARDS;i++) {
|
|
+ if (ss_vendor == zoran_cards[i].vendor_id &&
|
|
+ ss_device == zoran_cards[i].device_id) {
|
|
+ dprintk(3,
|
|
+ KERN_DEBUG
|
|
+ "%s: find_zr36057() - card %s detected\n",
|
|
+ ZR_DEVNAME(zr),
|
|
+ zoran_cards[i].name);
|
|
+ card_num = i;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ if (i == NUM_CARDS) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - unknown card\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ goto zr_free_mem;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (card_num < 0 || card_num >= NUM_CARDS) {
|
|
+ dprintk(2,
|
|
KERN_ERR
|
|
- "%s: It is not possible to auto-detect ZR36057 based cards\n",
|
|
- ZR_DEVNAME(zr));
|
|
+ "%s: find_zr36057() - invalid cardnum %d\n",
|
|
+ ZR_DEVNAME(zr), card_num);
|
|
goto zr_free_mem;
|
|
}
|
|
|
|
- card_num = ent->driver_data;
|
|
- if (card_num >= NUM_CARDS) {
|
|
+ /* even though we make this a non pointer and thus
|
|
+ * theoretically allow for making changes to this struct
|
|
+ * on a per-individual card basis at runtime, this is
|
|
+ * strongly discouraged. This structure is intended to
|
|
+ * keep general card information, no settings or anything */
|
|
+ zr->card = zoran_cards[card_num];
|
|
+ snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
|
|
+ "%s[%u]", zr->card.name, zr->id);
|
|
+
|
|
+ zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
|
|
+ if (!zr->zr36057_mem) {
|
|
dprintk(1,
|
|
KERN_ERR
|
|
- "%s: Unknown card, try specifying card=X module parameter\n",
|
|
+ "%s: find_zr36057() - ioremap failed\n",
|
|
ZR_DEVNAME(zr));
|
|
goto zr_free_mem;
|
|
}
|
|
- dprintk(3,
|
|
- KERN_DEBUG
|
|
- "%s: %s() - card %s detected\n",
|
|
- ZR_DEVNAME(zr), __func__, zoran_cards[card_num].name);
|
|
- } else {
|
|
- card_num = card[nr];
|
|
- if (card_num >= NUM_CARDS || card_num < 0) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: User specified card type %d out of range (0 .. %d)\n",
|
|
- ZR_DEVNAME(zr), card_num, NUM_CARDS - 1);
|
|
- goto zr_free_mem;
|
|
+
|
|
+ result = request_irq(zr->pci_dev->irq,
|
|
+ zoran_irq,
|
|
+ IRQF_SHARED | IRQF_DISABLED,
|
|
+ ZR_DEVNAME(zr),
|
|
+ (void *) zr);
|
|
+ if (result < 0) {
|
|
+ if (result == -EINVAL) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - bad irq number or handler\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ } else if (result == -EBUSY) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
|
|
+ ZR_DEVNAME(zr), zr->pci_dev->irq);
|
|
+ } else {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - can't assign irq, error code %d\n",
|
|
+ ZR_DEVNAME(zr), result);
|
|
+ }
|
|
+ goto zr_unmap;
|
|
}
|
|
- }
|
|
|
|
- /* even though we make this a non pointer and thus
|
|
- * theoretically allow for making changes to this struct
|
|
- * on a per-individual card basis at runtime, this is
|
|
- * strongly discouraged. This structure is intended to
|
|
- * keep general card information, no settings or anything */
|
|
- zr->card = zoran_cards[card_num];
|
|
- snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
|
|
- "%s[%u]", zr->card.name, zr->id);
|
|
+ /* set PCI latency timer */
|
|
+ pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
|
|
+ &latency);
|
|
+ need_latency = zr->revision > 1 ? 32 : 48;
|
|
+ if (latency != need_latency) {
|
|
+ dprintk(2,
|
|
+ KERN_INFO
|
|
+ "%s: Changing PCI latency from %d to %d.\n",
|
|
+ ZR_DEVNAME(zr), latency, need_latency);
|
|
+ pci_write_config_byte(zr->pci_dev,
|
|
+ PCI_LATENCY_TIMER,
|
|
+ need_latency);
|
|
+ }
|
|
|
|
- zr->zr36057_mem = pci_ioremap_bar(zr->pci_dev, 0);
|
|
- if (!zr->zr36057_mem) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: %s() - ioremap failed\n",
|
|
- ZR_DEVNAME(zr), __func__);
|
|
- goto zr_free_mem;
|
|
- }
|
|
+ zr36057_restart(zr);
|
|
+ /* i2c */
|
|
+ dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
|
|
+ ZR_DEVNAME(zr));
|
|
|
|
- result = request_irq(zr->pci_dev->irq, zoran_irq,
|
|
- IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
|
|
- if (result < 0) {
|
|
- if (result == -EINVAL) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() - bad irq number or handler\n",
|
|
- ZR_DEVNAME(zr));
|
|
- } else if (result == -EBUSY) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
|
|
- ZR_DEVNAME(zr), zr->pci_dev->irq);
|
|
+ /* i2c decoder */
|
|
+ if (decoder[zr->id] != -1) {
|
|
+ i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
|
|
+ zr->card.i2c_decoder = decoder[zr->id];
|
|
+ } else if (zr->card.i2c_decoder != 0) {
|
|
+ i2c_dec_name =
|
|
+ i2cid_to_modulename(zr->card.i2c_decoder);
|
|
} else {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() - can't assign irq, error code %d\n",
|
|
- ZR_DEVNAME(zr), result);
|
|
+ i2c_dec_name = NULL;
|
|
}
|
|
- goto zr_unmap;
|
|
- }
|
|
|
|
- /* set PCI latency timer */
|
|
- pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
|
|
- &latency);
|
|
- need_latency = zr->revision > 1 ? 32 : 48;
|
|
- if (latency != need_latency) {
|
|
- dprintk(2,
|
|
- KERN_INFO
|
|
- "%s: Changing PCI latency from %d to %d\n",
|
|
- ZR_DEVNAME(zr), latency, need_latency);
|
|
- pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
|
|
- need_latency);
|
|
- }
|
|
-
|
|
- zr36057_restart(zr);
|
|
- /* i2c */
|
|
- dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
|
|
- ZR_DEVNAME(zr));
|
|
-
|
|
- /* i2c decoder */
|
|
- if (decoder[zr->id] != -1) {
|
|
- i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
|
|
- zr->card.i2c_decoder = decoder[zr->id];
|
|
- } else if (zr->card.i2c_decoder != 0) {
|
|
- i2c_dec_name = i2cid_to_modulename(zr->card.i2c_decoder);
|
|
- } else {
|
|
- i2c_dec_name = NULL;
|
|
- }
|
|
+ if (i2c_dec_name) {
|
|
+ if ((result = request_module(i2c_dec_name)) < 0) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: failed to load module %s: %d\n",
|
|
+ ZR_DEVNAME(zr), i2c_dec_name, result);
|
|
+ }
|
|
+ }
|
|
|
|
- if (i2c_dec_name) {
|
|
- result = request_module(i2c_dec_name);
|
|
- if (result < 0) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: failed to load module %s: %d\n",
|
|
- ZR_DEVNAME(zr), i2c_dec_name, result);
|
|
+ /* i2c encoder */
|
|
+ if (encoder[zr->id] != -1) {
|
|
+ i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
|
|
+ zr->card.i2c_encoder = encoder[zr->id];
|
|
+ } else if (zr->card.i2c_encoder != 0) {
|
|
+ i2c_enc_name =
|
|
+ i2cid_to_modulename(zr->card.i2c_encoder);
|
|
+ } else {
|
|
+ i2c_enc_name = NULL;
|
|
}
|
|
- }
|
|
|
|
- /* i2c encoder */
|
|
- if (encoder[zr->id] != -1) {
|
|
- i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
|
|
- zr->card.i2c_encoder = encoder[zr->id];
|
|
- } else if (zr->card.i2c_encoder != 0) {
|
|
- i2c_enc_name = i2cid_to_modulename(zr->card.i2c_encoder);
|
|
- } else {
|
|
- i2c_enc_name = NULL;
|
|
- }
|
|
+ if (i2c_enc_name) {
|
|
+ if ((result = request_module(i2c_enc_name)) < 0) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: failed to load module %s: %d\n",
|
|
+ ZR_DEVNAME(zr), i2c_enc_name, result);
|
|
+ }
|
|
+ }
|
|
|
|
- if (i2c_enc_name) {
|
|
- result = request_module(i2c_enc_name);
|
|
- if (result < 0) {
|
|
+ if (zoran_register_i2c(zr) < 0) {
|
|
dprintk(1,
|
|
KERN_ERR
|
|
- "%s: failed to load module %s: %d\n",
|
|
- ZR_DEVNAME(zr), i2c_enc_name, result);
|
|
+ "%s: find_zr36057() - can't initialize i2c bus\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ goto zr_free_irq;
|
|
}
|
|
- }
|
|
|
|
- if (zoran_register_i2c(zr) < 0) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() - can't initialize i2c bus\n",
|
|
+ dprintk(2,
|
|
+ KERN_INFO "%s: Initializing videocodec bus...\n",
|
|
ZR_DEVNAME(zr));
|
|
- goto zr_free_irq;
|
|
- }
|
|
-
|
|
- dprintk(2,
|
|
- KERN_INFO "%s: Initializing videocodec bus...\n",
|
|
- ZR_DEVNAME(zr));
|
|
|
|
- if (zr->card.video_codec) {
|
|
- codec_name = codecid_to_modulename(zr->card.video_codec);
|
|
- if (codec_name) {
|
|
- result = request_module(codec_name);
|
|
- if (result) {
|
|
+ if (zr->card.video_codec != 0 &&
|
|
+ (codec_name =
|
|
+ codecid_to_modulename(zr->card.video_codec)) != NULL) {
|
|
+ if ((result = request_module(codec_name)) < 0) {
|
|
dprintk(1,
|
|
KERN_ERR
|
|
"%s: failed to load modules %s: %d\n",
|
|
ZR_DEVNAME(zr), codec_name, result);
|
|
}
|
|
}
|
|
- }
|
|
- if (zr->card.video_vfe) {
|
|
- vfe_name = codecid_to_modulename(zr->card.video_vfe);
|
|
- if (vfe_name) {
|
|
- result = request_module(vfe_name);
|
|
- if (result < 0) {
|
|
+ if (zr->card.video_vfe != 0 &&
|
|
+ (vfe_name =
|
|
+ codecid_to_modulename(zr->card.video_vfe)) != NULL) {
|
|
+ if ((result = request_module(vfe_name)) < 0) {
|
|
dprintk(1,
|
|
KERN_ERR
|
|
"%s: failed to load modules %s: %d\n",
|
|
ZR_DEVNAME(zr), vfe_name, result);
|
|
}
|
|
}
|
|
- }
|
|
|
|
- /* reset JPEG codec */
|
|
- jpeg_codec_sleep(zr, 1);
|
|
- jpeg_codec_reset(zr);
|
|
- /* video bus enabled */
|
|
- /* display codec revision */
|
|
- if (zr->card.video_codec != 0) {
|
|
- master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
|
|
- if (!master_codec)
|
|
- goto zr_unreg_i2c;
|
|
- zr->codec = videocodec_attach(master_codec);
|
|
- if (!zr->codec) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() - no codec found\n",
|
|
- ZR_DEVNAME(zr));
|
|
- goto zr_free_codec;
|
|
- }
|
|
- if (zr->codec->type != zr->card.video_codec) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() - wrong codec\n",
|
|
- ZR_DEVNAME(zr));
|
|
- goto zr_detach_codec;
|
|
- }
|
|
- }
|
|
- if (zr->card.video_vfe != 0) {
|
|
- master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
|
|
- if (!master_vfe)
|
|
- goto zr_detach_codec;
|
|
- zr->vfe = videocodec_attach(master_vfe);
|
|
- if (!zr->vfe) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() - no VFE found\n",
|
|
- ZR_DEVNAME(zr));
|
|
- goto zr_free_vfe;
|
|
+ /* reset JPEG codec */
|
|
+ jpeg_codec_sleep(zr, 1);
|
|
+ jpeg_codec_reset(zr);
|
|
+ /* video bus enabled */
|
|
+ /* display codec revision */
|
|
+ if (zr->card.video_codec != 0) {
|
|
+ master_codec = zoran_setup_videocodec(zr,
|
|
+ zr->card.video_codec);
|
|
+ if (!master_codec)
|
|
+ goto zr_unreg_i2c;
|
|
+ zr->codec = videocodec_attach(master_codec);
|
|
+ if (!zr->codec) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - no codec found\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ goto zr_free_codec;
|
|
+ }
|
|
+ if (zr->codec->type != zr->card.video_codec) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - wrong codec\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ goto zr_detach_codec;
|
|
+ }
|
|
}
|
|
- if (zr->vfe->type != zr->card.video_vfe) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: find_zr36057() = wrong VFE\n",
|
|
- ZR_DEVNAME(zr));
|
|
- goto zr_detach_vfe;
|
|
+ if (zr->card.video_vfe != 0) {
|
|
+ master_vfe = zoran_setup_videocodec(zr,
|
|
+ zr->card.video_vfe);
|
|
+ if (!master_vfe)
|
|
+ goto zr_detach_codec;
|
|
+ zr->vfe = videocodec_attach(master_vfe);
|
|
+ if (!zr->vfe) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() - no VFE found\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ goto zr_free_vfe;
|
|
+ }
|
|
+ if (zr->vfe->type != zr->card.video_vfe) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: find_zr36057() = wrong VFE\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ goto zr_detach_vfe;
|
|
+ }
|
|
}
|
|
- }
|
|
-
|
|
- /* take care of Natoma chipset and a revision 1 zr36057 */
|
|
- if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
|
|
- zr->jpg_buffers.need_contiguous = 1;
|
|
- dprintk(1,
|
|
- KERN_INFO
|
|
- "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
|
|
- ZR_DEVNAME(zr));
|
|
- }
|
|
+ /* Success so keep the pci_dev referenced */
|
|
+ pci_dev_get(zr->pci_dev);
|
|
+ zoran[zoran_num++] = zr;
|
|
+ continue;
|
|
|
|
- if (zr36057_init(zr) < 0)
|
|
- goto zr_detach_vfe;
|
|
-
|
|
- zoran_proc_init(zr);
|
|
-
|
|
- pci_set_drvdata(pdev, zr);
|
|
-
|
|
- return 0;
|
|
-
|
|
-zr_detach_vfe:
|
|
- videocodec_detach(zr->vfe);
|
|
-zr_free_vfe:
|
|
- kfree(master_vfe);
|
|
-zr_detach_codec:
|
|
- videocodec_detach(zr->codec);
|
|
-zr_free_codec:
|
|
- kfree(master_codec);
|
|
-zr_unreg_i2c:
|
|
- zoran_unregister_i2c(zr);
|
|
-zr_free_irq:
|
|
- btwrite(0, ZR36057_SPGPPCR);
|
|
- free_irq(zr->pci_dev->irq, zr);
|
|
-zr_unmap:
|
|
- iounmap(zr->zr36057_mem);
|
|
-zr_free_mem:
|
|
- kfree(zr);
|
|
+ // Init errors
|
|
+ zr_detach_vfe:
|
|
+ videocodec_detach(zr->vfe);
|
|
+ zr_free_vfe:
|
|
+ kfree(master_vfe);
|
|
+ zr_detach_codec:
|
|
+ videocodec_detach(zr->codec);
|
|
+ zr_free_codec:
|
|
+ kfree(master_codec);
|
|
+ zr_unreg_i2c:
|
|
+ zoran_unregister_i2c(zr);
|
|
+ zr_free_irq:
|
|
+ btwrite(0, ZR36057_SPGPPCR);
|
|
+ free_irq(zr->pci_dev->irq, zr);
|
|
+ zr_unmap:
|
|
+ iounmap(zr->zr36057_mem);
|
|
+ zr_free_mem:
|
|
+ kfree(zr);
|
|
+ continue;
|
|
+ }
|
|
+ if (dev) /* Clean up ref count on early exit */
|
|
+ pci_dev_put(dev);
|
|
|
|
- return -ENODEV;
|
|
+ if (zoran_num == 0) {
|
|
+ dprintk(1, KERN_INFO "No known MJPEG cards found.\n");
|
|
+ }
|
|
+ return zoran_num;
|
|
}
|
|
|
|
-static struct pci_driver zoran_driver = {
|
|
- .name = "zr36067",
|
|
- .id_table = zr36067_pci_tbl,
|
|
- .probe = zoran_probe,
|
|
- .remove = zoran_remove,
|
|
-};
|
|
-
|
|
-static int __init zoran_init(void)
|
|
+static int __init
|
|
+init_dc10_cards (void)
|
|
{
|
|
- int res;
|
|
+ int i;
|
|
|
|
+ memset(zoran, 0, sizeof(zoran));
|
|
printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
|
|
MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
|
|
|
|
+ /* Look for cards */
|
|
+ if (find_zr36057() < 0) {
|
|
+ return -EIO;
|
|
+ }
|
|
+ if (zoran_num == 0)
|
|
+ return -ENODEV;
|
|
+ dprintk(1, KERN_INFO "%s: %d card(s) found\n", ZORAN_NAME,
|
|
+ zoran_num);
|
|
/* check the parameters we have been given, adjust if necessary */
|
|
if (v4l_nbufs < 2)
|
|
v4l_nbufs = 2;
|
|
@@ -1624,22 +1629,37 @@
|
|
ZORAN_NAME);
|
|
}
|
|
|
|
- res = pci_register_driver(&zoran_driver);
|
|
- if (res) {
|
|
- dprintk(1,
|
|
- KERN_ERR
|
|
- "%s: Unable to register ZR36057 driver\n",
|
|
- ZORAN_NAME);
|
|
- return res;
|
|
+ /* take care of Natoma chipset and a revision 1 zr36057 */
|
|
+ for (i = 0; i < zoran_num; i++) {
|
|
+ struct zoran *zr = zoran[i];
|
|
+
|
|
+ if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
|
|
+ zr->jpg_buffers.need_contiguous = 1;
|
|
+ dprintk(1,
|
|
+ KERN_INFO
|
|
+ "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ }
|
|
+
|
|
+ if (zr36057_init(zr) < 0) {
|
|
+ for (i = 0; i < zoran_num; i++)
|
|
+ zoran_release(zoran[i]);
|
|
+ return -EIO;
|
|
+ }
|
|
+ zoran_proc_init(zr);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
-static void __exit zoran_exit(void)
|
|
+static void __exit
|
|
+unload_dc10_cards (void)
|
|
{
|
|
- pci_unregister_driver(&zoran_driver);
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < zoran_num; i++)
|
|
+ zoran_release(zoran[i]);
|
|
}
|
|
|
|
-module_init(zoran_init);
|
|
-module_exit(zoran_exit);
|
|
+module_init(init_dc10_cards);
|
|
+module_exit(unload_dc10_cards);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/zoran/zoran_card.h linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_card.h
|
|
--- linux-2.6.29.owrt/drivers/media/video/zoran/zoran_card.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_card.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -40,6 +40,8 @@
|
|
|
|
/* Anybody who uses more than four? */
|
|
#define BUZ_MAX 4
|
|
+extern int zoran_num;
|
|
+extern struct zoran *zoran[BUZ_MAX];
|
|
|
|
extern struct video_device zoran_template;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/zoran/zoran_driver.c linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_driver.c
|
|
--- linux-2.6.29.owrt/drivers/media/video/zoran/zoran_driver.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_driver.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1196,54 +1196,83 @@
|
|
* Open a zoran card. Right now the flags stuff is just playing
|
|
*/
|
|
|
|
-static int zoran_open(struct file *file)
|
|
+static int
|
|
+zoran_open(struct file *file)
|
|
{
|
|
- struct zoran *zr = video_drvdata(file);
|
|
+ unsigned int minor = video_devdata(file)->minor;
|
|
+ struct zoran *zr = NULL;
|
|
struct zoran_fh *fh;
|
|
- int res, first_open = 0;
|
|
-
|
|
- dprintk(2, KERN_INFO "%s: zoran_open(%s, pid=[%d]), users(-)=%d\n",
|
|
- ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user + 1);
|
|
+ int i, res, first_open = 0, have_module_locks = 0;
|
|
|
|
lock_kernel();
|
|
+ /* find the device */
|
|
+ for (i = 0; i < zoran_num; i++) {
|
|
+ if (zoran[i]->video_dev->minor == minor) {
|
|
+ zr = zoran[i];
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (!zr) {
|
|
+ dprintk(1, KERN_ERR "%s: device not found!\n", ZORAN_NAME);
|
|
+ res = -ENODEV;
|
|
+ goto open_unlock_and_return;
|
|
+ }
|
|
|
|
/* see fs/device.c - the kernel already locks during open(),
|
|
* so locking ourselves only causes deadlocks */
|
|
/*mutex_lock(&zr->resource_lock);*/
|
|
|
|
- if (zr->user >= 2048) {
|
|
- dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
|
|
- ZR_DEVNAME(zr), zr->user);
|
|
- res = -EBUSY;
|
|
- goto fail_unlock;
|
|
- }
|
|
-
|
|
if (!zr->decoder) {
|
|
dprintk(1,
|
|
KERN_ERR "%s: no TV decoder loaded for device!\n",
|
|
ZR_DEVNAME(zr));
|
|
res = -EIO;
|
|
- goto fail_unlock;
|
|
+ goto open_unlock_and_return;
|
|
}
|
|
|
|
+ /* try to grab a module lock */
|
|
+ if (!try_module_get(THIS_MODULE)) {
|
|
+ dprintk(1,
|
|
+ KERN_ERR
|
|
+ "%s: failed to acquire my own lock! PANIC!\n",
|
|
+ ZR_DEVNAME(zr));
|
|
+ res = -ENODEV;
|
|
+ goto open_unlock_and_return;
|
|
+ }
|
|
if (!try_module_get(zr->decoder->driver->driver.owner)) {
|
|
dprintk(1,
|
|
KERN_ERR
|
|
- "%s: failed to grab ownership of video decoder\n",
|
|
+ "%s: failed to grab ownership of i2c decoder\n",
|
|
ZR_DEVNAME(zr));
|
|
res = -EIO;
|
|
- goto fail_unlock;
|
|
+ module_put(THIS_MODULE);
|
|
+ goto open_unlock_and_return;
|
|
}
|
|
if (zr->encoder &&
|
|
!try_module_get(zr->encoder->driver->driver.owner)) {
|
|
dprintk(1,
|
|
KERN_ERR
|
|
- "%s: failed to grab ownership of video encoder\n",
|
|
+ "%s: failed to grab ownership of i2c encoder\n",
|
|
ZR_DEVNAME(zr));
|
|
res = -EIO;
|
|
- goto fail_decoder;
|
|
+ module_put(zr->decoder->driver->driver.owner);
|
|
+ module_put(THIS_MODULE);
|
|
+ goto open_unlock_and_return;
|
|
+ }
|
|
+
|
|
+ have_module_locks = 1;
|
|
+
|
|
+ if (zr->user >= 2048) {
|
|
+ dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
|
|
+ ZR_DEVNAME(zr), zr->user);
|
|
+ res = -EBUSY;
|
|
+ goto open_unlock_and_return;
|
|
}
|
|
|
|
+ dprintk(1, KERN_INFO "%s: zoran_open(%s, pid=[%d]), users(-)=%d\n",
|
|
+ ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user);
|
|
+
|
|
/* now, create the open()-specific file_ops struct */
|
|
fh = kzalloc(sizeof(struct zoran_fh), GFP_KERNEL);
|
|
if (!fh) {
|
|
@@ -1252,7 +1281,7 @@
|
|
"%s: zoran_open() - allocation of zoran_fh failed\n",
|
|
ZR_DEVNAME(zr));
|
|
res = -ENOMEM;
|
|
- goto fail_encoder;
|
|
+ goto open_unlock_and_return;
|
|
}
|
|
/* used to be BUZ_MAX_WIDTH/HEIGHT, but that gives overflows
|
|
* on norm-change! */
|
|
@@ -1263,8 +1292,9 @@
|
|
KERN_ERR
|
|
"%s: zoran_open() - allocation of overlay_mask failed\n",
|
|
ZR_DEVNAME(zr));
|
|
+ kfree(fh);
|
|
res = -ENOMEM;
|
|
- goto fail_fh;
|
|
+ goto open_unlock_and_return;
|
|
}
|
|
|
|
if (zr->user++ == 0)
|
|
@@ -1289,18 +1319,21 @@
|
|
|
|
return 0;
|
|
|
|
-fail_fh:
|
|
- kfree(fh);
|
|
-fail_encoder:
|
|
- if (zr->encoder)
|
|
- module_put(zr->encoder->driver->driver.owner);
|
|
-fail_decoder:
|
|
- module_put(zr->decoder->driver->driver.owner);
|
|
-fail_unlock:
|
|
- unlock_kernel();
|
|
+open_unlock_and_return:
|
|
+ /* if we grabbed locks, release them accordingly */
|
|
+ if (have_module_locks) {
|
|
+ module_put(zr->decoder->driver->driver.owner);
|
|
+ if (zr->encoder) {
|
|
+ module_put(zr->encoder->driver->driver.owner);
|
|
+ }
|
|
+ module_put(THIS_MODULE);
|
|
+ }
|
|
|
|
- dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n",
|
|
- ZR_DEVNAME(zr), res, zr->user);
|
|
+ /* if there's no device found, we didn't obtain the lock either */
|
|
+ if (zr) {
|
|
+ /*mutex_unlock(&zr->resource_lock);*/
|
|
+ }
|
|
+ unlock_kernel();
|
|
|
|
return res;
|
|
}
|
|
@@ -1311,8 +1344,8 @@
|
|
struct zoran_fh *fh = file->private_data;
|
|
struct zoran *zr = fh->zr;
|
|
|
|
- dprintk(2, KERN_INFO "%s: zoran_close(%s, pid=[%d]), users(+)=%d\n",
|
|
- ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user - 1);
|
|
+ dprintk(1, KERN_INFO "%s: zoran_close(%s, pid=[%d]), users(+)=%d\n",
|
|
+ ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user);
|
|
|
|
/* kernel locks (fs/device.c), so don't do that ourselves
|
|
* (prevents deadlocks) */
|
|
@@ -1358,8 +1391,10 @@
|
|
|
|
/* release locks on the i2c modules */
|
|
module_put(zr->decoder->driver->driver.owner);
|
|
- if (zr->encoder)
|
|
- module_put(zr->encoder->driver->driver.owner);
|
|
+ if (zr->encoder) {
|
|
+ module_put(zr->encoder->driver->driver.owner);
|
|
+ }
|
|
+ module_put(THIS_MODULE);
|
|
|
|
/*mutex_unlock(&zr->resource_lock);*/
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/media/video/zoran/zoran.h linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran.h
|
|
--- linux-2.6.29.owrt/drivers/media/video/zoran/zoran.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -349,6 +349,7 @@
|
|
u16 i2c_decoder, i2c_encoder; /* I2C types */
|
|
u16 video_vfe, video_codec; /* videocodec types */
|
|
u16 audio_chip; /* audio type */
|
|
+ u16 vendor_id, device_id; /* subsystem vendor/device ID */
|
|
|
|
int inputs; /* number of video inputs */
|
|
struct input {
|
|
@@ -400,6 +401,7 @@
|
|
char name[32]; /* name of this device */
|
|
struct pci_dev *pci_dev; /* PCI device */
|
|
unsigned char revision; /* revision of zr36057 */
|
|
+ unsigned int zr36057_adr; /* bus address of IO mem returned by PCI BIOS */
|
|
unsigned char __iomem *zr36057_mem;/* pointer to mapped IO memory */
|
|
|
|
spinlock_t spinlock; /* Spinlock */
|
|
@@ -488,10 +490,16 @@
|
|
wait_queue_head_t test_q;
|
|
};
|
|
|
|
-/* There was something called _ALPHA_BUZ that used the PCI address instead of
|
|
- * the kernel iomapped address for btread/btwrite. */
|
|
+/*The following should be done in more portable way. It depends on define
|
|
+ of _ALPHA_BUZ in the Makefile.*/
|
|
+
|
|
+#ifdef _ALPHA_BUZ
|
|
+#define btwrite(dat,adr) writel((dat), zr->zr36057_adr+(adr))
|
|
+#define btread(adr) readl(zr->zr36057_adr+(adr))
|
|
+#else
|
|
#define btwrite(dat,adr) writel((dat), zr->zr36057_mem+(adr))
|
|
#define btread(adr) readl(zr->zr36057_mem+(adr))
|
|
+#endif
|
|
|
|
#define btand(dat,adr) btwrite((dat) & btread(adr), adr)
|
|
#define btor(dat,adr) btwrite((dat) | btread(adr), adr)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/message/fusion/mptbase.c linux-2.6.29-rc3.owrt/drivers/message/fusion/mptbase.c
|
|
--- linux-2.6.29.owrt/drivers/message/fusion/mptbase.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/message/fusion/mptbase.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -91,9 +91,9 @@
|
|
controllers (default=0)");
|
|
|
|
static int mpt_msi_enable_sas;
|
|
-module_param(mpt_msi_enable_sas, int, 0);
|
|
+module_param(mpt_msi_enable_sas, int, 1);
|
|
MODULE_PARM_DESC(mpt_msi_enable_sas, " Enable MSI Support for SAS \
|
|
- controllers (default=0)");
|
|
+ controllers (default=1)");
|
|
|
|
|
|
static int mpt_channel_mapping;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mfd/htc-egpio.c linux-2.6.29-rc3.owrt/drivers/mfd/htc-egpio.c
|
|
--- linux-2.6.29.owrt/drivers/mfd/htc-egpio.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mfd/htc-egpio.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -286,7 +286,7 @@
|
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
if (!res)
|
|
goto fail;
|
|
- ei->base_addr = ioremap_nocache(res->start, resource_size(res));
|
|
+ ei->base_addr = ioremap_nocache(res->start, res->end - res->start);
|
|
if (!ei->base_addr)
|
|
goto fail;
|
|
pr_debug("EGPIO phys=%08x virt=%p\n", (u32)res->start, ei->base_addr);
|
|
@@ -307,7 +307,7 @@
|
|
|
|
ei->nchips = pdata->num_chips;
|
|
ei->chip = kzalloc(sizeof(struct egpio_chip) * ei->nchips, GFP_KERNEL);
|
|
- if (!ei->chip) {
|
|
+ if (!ei) {
|
|
ret = -ENOMEM;
|
|
goto fail;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mfd/pcf50633-core.c linux-2.6.29-rc3.owrt/drivers/mfd/pcf50633-core.c
|
|
--- linux-2.6.29.owrt/drivers/mfd/pcf50633-core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mfd/pcf50633-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -626,6 +626,7 @@
|
|
}
|
|
|
|
if (client->irq) {
|
|
+ set_irq_handler(client->irq, handle_level_irq);
|
|
ret = request_irq(client->irq, pcf50633_irq,
|
|
IRQF_TRIGGER_LOW, "pcf50633", pcf);
|
|
|
|
@@ -678,7 +679,6 @@
|
|
|
|
static struct i2c_device_id pcf50633_id_table[] = {
|
|
{"pcf50633", 0x73},
|
|
- {/* end of list */}
|
|
};
|
|
|
|
static struct i2c_driver pcf50633_driver = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mfd/sm501.c linux-2.6.29-rc3.owrt/drivers/mfd/sm501.c
|
|
--- linux-2.6.29.owrt/drivers/mfd/sm501.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mfd/sm501.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1050,7 +1050,7 @@
|
|
return gpiochip_add(gchip);
|
|
}
|
|
|
|
-static int __devinit sm501_register_gpio(struct sm501_devdata *sm)
|
|
+static int sm501_register_gpio(struct sm501_devdata *sm)
|
|
{
|
|
struct sm501_gpio *gpio = &sm->gpio;
|
|
resource_size_t iobase = sm->io_res->start + SM501_GPIO;
|
|
@@ -1321,7 +1321,7 @@
|
|
* Common init code for an SM501
|
|
*/
|
|
|
|
-static int __devinit sm501_init_dev(struct sm501_devdata *sm)
|
|
+static int sm501_init_dev(struct sm501_devdata *sm)
|
|
{
|
|
struct sm501_initdata *idata;
|
|
struct sm501_platdata *pdata;
|
|
@@ -1397,7 +1397,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-static int __devinit sm501_plat_probe(struct platform_device *dev)
|
|
+static int sm501_plat_probe(struct platform_device *dev)
|
|
{
|
|
struct sm501_devdata *sm;
|
|
int ret;
|
|
@@ -1586,8 +1586,8 @@
|
|
.gpio_base = -1,
|
|
};
|
|
|
|
-static int __devinit sm501_pci_probe(struct pci_dev *dev,
|
|
- const struct pci_device_id *id)
|
|
+static int sm501_pci_probe(struct pci_dev *dev,
|
|
+ const struct pci_device_id *id)
|
|
{
|
|
struct sm501_devdata *sm;
|
|
int err;
|
|
@@ -1693,7 +1693,7 @@
|
|
sm501_gpio_remove(sm);
|
|
}
|
|
|
|
-static void __devexit sm501_pci_remove(struct pci_dev *dev)
|
|
+static void sm501_pci_remove(struct pci_dev *dev)
|
|
{
|
|
struct sm501_devdata *sm = pci_get_drvdata(dev);
|
|
|
|
@@ -1727,16 +1727,16 @@
|
|
|
|
MODULE_DEVICE_TABLE(pci, sm501_pci_tbl);
|
|
|
|
-static struct pci_driver sm501_pci_driver = {
|
|
+static struct pci_driver sm501_pci_drv = {
|
|
.name = "sm501",
|
|
.id_table = sm501_pci_tbl,
|
|
.probe = sm501_pci_probe,
|
|
- .remove = __devexit_p(sm501_pci_remove),
|
|
+ .remove = sm501_pci_remove,
|
|
};
|
|
|
|
MODULE_ALIAS("platform:sm501");
|
|
|
|
-static struct platform_driver sm501_plat_driver = {
|
|
+static struct platform_driver sm501_plat_drv = {
|
|
.driver = {
|
|
.name = "sm501",
|
|
.owner = THIS_MODULE,
|
|
@@ -1749,14 +1749,14 @@
|
|
|
|
static int __init sm501_base_init(void)
|
|
{
|
|
- platform_driver_register(&sm501_plat_driver);
|
|
- return pci_register_driver(&sm501_pci_driver);
|
|
+ platform_driver_register(&sm501_plat_drv);
|
|
+ return pci_register_driver(&sm501_pci_drv);
|
|
}
|
|
|
|
static void __exit sm501_base_exit(void)
|
|
{
|
|
- platform_driver_unregister(&sm501_plat_driver);
|
|
- pci_unregister_driver(&sm501_pci_driver);
|
|
+ platform_driver_unregister(&sm501_plat_drv);
|
|
+ pci_unregister_driver(&sm501_pci_drv);
|
|
}
|
|
|
|
module_init(sm501_base_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mfd/twl4030-core.c linux-2.6.29-rc3.owrt/drivers/mfd/twl4030-core.c
|
|
--- linux-2.6.29.owrt/drivers/mfd/twl4030-core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mfd/twl4030-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -38,7 +38,7 @@
|
|
#include <linux/i2c.h>
|
|
#include <linux/i2c/twl4030.h>
|
|
|
|
-#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
|
|
+#ifdef CONFIG_ARM
|
|
#include <mach/cpu.h>
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mfd/wm8350-core.c linux-2.6.29-rc3.owrt/drivers/mfd/wm8350-core.c
|
|
--- linux-2.6.29.owrt/drivers/mfd/wm8350-core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mfd/wm8350-core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1111,7 +1111,7 @@
|
|
do {
|
|
schedule_timeout_interruptible(1);
|
|
reg = wm8350_reg_read(wm8350, WM8350_DIGITISER_CONTROL_1);
|
|
- } while (--tries && (reg & WM8350_AUXADC_POLL));
|
|
+ } while (tries-- && (reg & WM8350_AUXADC_POLL));
|
|
|
|
if (!tries)
|
|
dev_err(wm8350->dev, "adc chn %d read timeout\n", channel);
|
|
@@ -1297,29 +1297,14 @@
|
|
int wm8350_device_init(struct wm8350 *wm8350, int irq,
|
|
struct wm8350_platform_data *pdata)
|
|
{
|
|
- int ret;
|
|
+ int ret = -EINVAL;
|
|
u16 id1, id2, mask_rev;
|
|
u16 cust_id, mode, chip_rev;
|
|
|
|
/* get WM8350 revision and config mode */
|
|
- ret = wm8350->read_dev(wm8350, WM8350_RESET_ID, sizeof(id1), &id1);
|
|
- if (ret != 0) {
|
|
- dev_err(wm8350->dev, "Failed to read ID: %d\n", ret);
|
|
- goto err;
|
|
- }
|
|
-
|
|
- ret = wm8350->read_dev(wm8350, WM8350_ID, sizeof(id2), &id2);
|
|
- if (ret != 0) {
|
|
- dev_err(wm8350->dev, "Failed to read ID: %d\n", ret);
|
|
- goto err;
|
|
- }
|
|
-
|
|
- ret = wm8350->read_dev(wm8350, WM8350_REVISION, sizeof(mask_rev),
|
|
- &mask_rev);
|
|
- if (ret != 0) {
|
|
- dev_err(wm8350->dev, "Failed to read revision: %d\n", ret);
|
|
- goto err;
|
|
- }
|
|
+ wm8350->read_dev(wm8350, WM8350_RESET_ID, sizeof(id1), &id1);
|
|
+ wm8350->read_dev(wm8350, WM8350_ID, sizeof(id2), &id2);
|
|
+ wm8350->read_dev(wm8350, WM8350_REVISION, sizeof(mask_rev), &mask_rev);
|
|
|
|
id1 = be16_to_cpu(id1);
|
|
id2 = be16_to_cpu(id2);
|
|
@@ -1383,11 +1368,6 @@
|
|
wm8350->power.rev_g_coeff = 1;
|
|
break;
|
|
|
|
- case 1:
|
|
- dev_info(wm8350->dev, "WM8351 Rev B\n");
|
|
- wm8350->power.rev_g_coeff = 1;
|
|
- break;
|
|
-
|
|
default:
|
|
dev_err(wm8350->dev, "Unknown WM8351 CHIP_REV\n");
|
|
ret = -ENODEV;
|
|
@@ -1424,12 +1404,14 @@
|
|
return ret;
|
|
}
|
|
|
|
- wm8350_reg_write(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK, 0xFFFF);
|
|
- wm8350_reg_write(wm8350, WM8350_INT_STATUS_1_MASK, 0xFFFF);
|
|
- wm8350_reg_write(wm8350, WM8350_INT_STATUS_2_MASK, 0xFFFF);
|
|
- wm8350_reg_write(wm8350, WM8350_UNDER_VOLTAGE_INT_STATUS_MASK, 0xFFFF);
|
|
- wm8350_reg_write(wm8350, WM8350_GPIO_INT_STATUS_MASK, 0xFFFF);
|
|
- wm8350_reg_write(wm8350, WM8350_COMPARATOR_INT_STATUS_MASK, 0xFFFF);
|
|
+ if (pdata && pdata->init) {
|
|
+ ret = pdata->init(wm8350);
|
|
+ if (ret != 0) {
|
|
+ dev_err(wm8350->dev, "Platform init() failed: %d\n",
|
|
+ ret);
|
|
+ goto err;
|
|
+ }
|
|
+ }
|
|
|
|
mutex_init(&wm8350->auxadc_mutex);
|
|
mutex_init(&wm8350->irq_mutex);
|
|
@@ -1448,15 +1430,6 @@
|
|
}
|
|
wm8350->chip_irq = irq;
|
|
|
|
- if (pdata && pdata->init) {
|
|
- ret = pdata->init(wm8350);
|
|
- if (ret != 0) {
|
|
- dev_err(wm8350->dev, "Platform init() failed: %d\n",
|
|
- ret);
|
|
- goto err;
|
|
- }
|
|
- }
|
|
-
|
|
wm8350_reg_write(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK, 0x0);
|
|
|
|
wm8350_client_dev_register(wm8350, "wm8350-codec",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mfd/wm8350-regmap.c linux-2.6.29-rc3.owrt/drivers/mfd/wm8350-regmap.c
|
|
--- linux-2.6.29.owrt/drivers/mfd/wm8350-regmap.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mfd/wm8350-regmap.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3188,7 +3188,7 @@
|
|
{ 0x7CFF, 0x0C00, 0x7FFF }, /* R1 - ID */
|
|
{ 0x0000, 0x0000, 0x0000 }, /* R2 */
|
|
{ 0xBE3B, 0xBE3B, 0x8000 }, /* R3 - System Control 1 */
|
|
- { 0xFEF7, 0xFEF7, 0xF800 }, /* R4 - System Control 2 */
|
|
+ { 0xFCF7, 0xFCF7, 0xF800 }, /* R4 - System Control 2 */
|
|
{ 0x80FF, 0x80FF, 0x8000 }, /* R5 - System Hibernate */
|
|
{ 0xFB0E, 0xFB0E, 0x0000 }, /* R6 - Interface Control */
|
|
{ 0x0000, 0x0000, 0x0000 }, /* R7 */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/atmel-ssc.c linux-2.6.29-rc3.owrt/drivers/misc/atmel-ssc.c
|
|
--- linux-2.6.29.owrt/drivers/misc/atmel-ssc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/atmel-ssc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -35,7 +35,7 @@
|
|
|
|
if (!ssc_valid) {
|
|
spin_unlock(&user_lock);
|
|
- pr_err("ssc: ssc%d platform device is missing\n", ssc_num);
|
|
+ dev_dbg(&ssc->pdev->dev, "could not find requested device\n");
|
|
return ERR_PTR(-ENODEV);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/hpilo.c linux-2.6.29-rc3.owrt/drivers/misc/hpilo.c
|
|
--- linux-2.6.29.owrt/drivers/misc/hpilo.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/hpilo.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -207,7 +207,7 @@
|
|
&device_ccb->recv_ctrl);
|
|
|
|
/* give iLO some time to process stop request */
|
|
- for (retries = MAX_WAIT; retries > 0; retries--) {
|
|
+ for (retries = 1000; retries > 0; retries--) {
|
|
doorbell_set(driver_ccb);
|
|
udelay(1);
|
|
if (!(ioread32(&device_ccb->send_ctrl) & (1 << CTRL_BITPOS_A))
|
|
@@ -309,7 +309,7 @@
|
|
doorbell_clr(driver_ccb);
|
|
|
|
/* make sure iLO is really handling requests */
|
|
- for (i = MAX_WAIT; i > 0; i--) {
|
|
+ for (i = 1000; i > 0; i--) {
|
|
if (ilo_pkt_dequeue(hw, driver_ccb, SENDQ, &pkt_id, NULL, NULL))
|
|
break;
|
|
udelay(1);
|
|
@@ -326,7 +326,7 @@
|
|
|
|
return 0;
|
|
free:
|
|
- ilo_ccb_close(pdev, data);
|
|
+ pci_free_consistent(pdev, data->dma_size, data->dma_va, data->dma_pa);
|
|
out:
|
|
return error;
|
|
}
|
|
@@ -710,7 +710,6 @@
|
|
|
|
static struct pci_device_id ilo_devices[] = {
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_COMPAQ, 0xB204) },
|
|
- { PCI_DEVICE(PCI_VENDOR_ID_HP, 0x3307) },
|
|
{ }
|
|
};
|
|
MODULE_DEVICE_TABLE(pci, ilo_devices);
|
|
@@ -759,7 +758,7 @@
|
|
class_destroy(ilo_class);
|
|
}
|
|
|
|
-MODULE_VERSION("1.0");
|
|
+MODULE_VERSION("0.05");
|
|
MODULE_ALIAS(ILO_NAME);
|
|
MODULE_DESCRIPTION(ILO_NAME);
|
|
MODULE_AUTHOR("David Altobelli <david.altobelli@hp.com>");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/hpilo.h linux-2.6.29-rc3.owrt/drivers/misc/hpilo.h
|
|
--- linux-2.6.29.owrt/drivers/misc/hpilo.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/hpilo.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -19,8 +19,6 @@
|
|
#define MAX_ILO_DEV 1
|
|
/* max number of files */
|
|
#define MAX_OPEN (MAX_CCB * MAX_ILO_DEV)
|
|
-/* spin counter for open/close delay */
|
|
-#define MAX_WAIT 10000
|
|
|
|
/*
|
|
* Per device, used to track global memory allocations.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/Kconfig linux-2.6.29-rc3.owrt/drivers/misc/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/misc/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -217,7 +217,6 @@
|
|
depends on EXPERIMENTAL
|
|
depends on BACKLIGHT_CLASS_DEVICE
|
|
depends on RFKILL
|
|
- depends on POWER_SUPPLY
|
|
default n
|
|
---help---
|
|
This driver adds support for rfkill and backlight control to Dell
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_channel.c linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_channel.c
|
|
--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_channel.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_channel.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -49,6 +49,9 @@
|
|
|
|
if (ch->flags & (XPC_C_CONNECTED | XPC_C_DISCONNECTING))
|
|
return;
|
|
+
|
|
+ DBUG_ON(ch->local_msgqueue == NULL);
|
|
+ DBUG_ON(ch->remote_msgqueue == NULL);
|
|
}
|
|
|
|
if (!(ch->flags & XPC_C_OPENREPLY)) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc.h linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc.h
|
|
--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,7 +3,7 @@
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
- * Copyright (c) 2004-2009 Silicon Graphics, Inc. All Rights Reserved.
|
|
+ * Copyright (c) 2004-2008 Silicon Graphics, Inc. All Rights Reserved.
|
|
*/
|
|
|
|
/*
|
|
@@ -514,8 +514,7 @@
|
|
/* partition's notify mq */
|
|
|
|
struct xpc_send_msg_slot_uv *send_msg_slots;
|
|
- void *recv_msg_slots; /* each slot will hold a xpc_notify_mq_msg_uv */
|
|
- /* structure plus the user's payload */
|
|
+ struct xpc_notify_mq_msg_uv *recv_msg_slots;
|
|
|
|
struct xpc_fifo_head_uv msg_slot_free_list;
|
|
struct xpc_fifo_head_uv recv_msg_list; /* deliverable payloads */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_sn2.c linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_sn2.c
|
|
--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_sn2.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_sn2.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1106,6 +1106,8 @@
|
|
int n_IRQs_expected;
|
|
int n_IRQs_detected;
|
|
|
|
+ DBUG_ON(xpc_activate_IRQ_rcvd == 0);
|
|
+
|
|
spin_lock_irqsave(&xpc_activate_IRQ_rcvd_lock, irq_flags);
|
|
n_IRQs_expected = xpc_activate_IRQ_rcvd;
|
|
xpc_activate_IRQ_rcvd = 0;
|
|
@@ -1724,7 +1726,6 @@
|
|
msg = (struct xpc_msg_sn2 *)((u64)ch_sn2->local_msgqueue +
|
|
(get % ch->local_nentries) *
|
|
ch->entry_size);
|
|
- DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
|
|
msg->flags = 0;
|
|
} while (++get < ch_sn2->remote_GP.get);
|
|
}
|
|
@@ -1739,18 +1740,11 @@
|
|
struct xpc_msg_sn2 *msg;
|
|
s64 put;
|
|
|
|
- /* flags are zeroed when the buffer is allocated */
|
|
- if (ch_sn2->remote_GP.put < ch->remote_nentries)
|
|
- return;
|
|
-
|
|
- put = max(ch_sn2->w_remote_GP.put, ch->remote_nentries);
|
|
+ put = ch_sn2->w_remote_GP.put;
|
|
do {
|
|
msg = (struct xpc_msg_sn2 *)((u64)ch_sn2->remote_msgqueue +
|
|
(put % ch->remote_nentries) *
|
|
ch->entry_size);
|
|
- DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
|
|
- DBUG_ON(!(msg->flags & XPC_M_SN2_DONE));
|
|
- DBUG_ON(msg->number != put - ch->remote_nentries);
|
|
msg->flags = 0;
|
|
} while (++put < ch_sn2->remote_GP.put);
|
|
}
|
|
@@ -1842,7 +1836,6 @@
|
|
*/
|
|
xpc_clear_remote_msgqueue_flags_sn2(ch);
|
|
|
|
- smp_wmb(); /* ensure flags have been cleared before bte_copy */
|
|
ch_sn2->w_remote_GP.put = ch_sn2->remote_GP.put;
|
|
|
|
dev_dbg(xpc_chan, "w_remote_GP.put changed to %ld, partid=%d, "
|
|
@@ -1941,7 +1934,7 @@
|
|
break;
|
|
|
|
get = ch_sn2->w_local_GP.get;
|
|
- smp_rmb(); /* guarantee that .get loads before .put */
|
|
+ rmb(); /* guarantee that .get loads before .put */
|
|
if (get == ch_sn2->w_remote_GP.put)
|
|
break;
|
|
|
|
@@ -1963,13 +1956,11 @@
|
|
|
|
msg = xpc_pull_remote_msg_sn2(ch, get);
|
|
|
|
- if (msg != NULL) {
|
|
- DBUG_ON(msg->number != get);
|
|
- DBUG_ON(msg->flags & XPC_M_SN2_DONE);
|
|
- DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
|
|
+ DBUG_ON(msg != NULL && msg->number != get);
|
|
+ DBUG_ON(msg != NULL && (msg->flags & XPC_M_SN2_DONE));
|
|
+ DBUG_ON(msg != NULL && !(msg->flags & XPC_M_SN2_READY));
|
|
|
|
- payload = &msg->payload;
|
|
- }
|
|
+ payload = &msg->payload;
|
|
break;
|
|
}
|
|
|
|
@@ -2062,7 +2053,7 @@
|
|
while (1) {
|
|
|
|
put = ch_sn2->w_local_GP.put;
|
|
- smp_rmb(); /* guarantee that .put loads before .get */
|
|
+ rmb(); /* guarantee that .put loads before .get */
|
|
if (put - ch_sn2->w_remote_GP.get < ch->local_nentries) {
|
|
|
|
/* There are available message entries. We need to try
|
|
@@ -2195,7 +2186,7 @@
|
|
* The preceding store of msg->flags must occur before the following
|
|
* load of local_GP->put.
|
|
*/
|
|
- smp_mb();
|
|
+ mb();
|
|
|
|
/* see if the message is next in line to be sent, if so send it */
|
|
|
|
@@ -2286,9 +2277,8 @@
|
|
dev_dbg(xpc_chan, "msg=0x%p, msg_number=%ld, partid=%d, channel=%d\n",
|
|
(void *)msg, msg_number, ch->partid, ch->number);
|
|
|
|
- DBUG_ON((((u64)msg - (u64)ch->sn.sn2.remote_msgqueue) / ch->entry_size) !=
|
|
+ DBUG_ON((((u64)msg - (u64)ch->remote_msgqueue) / ch->entry_size) !=
|
|
msg_number % ch->remote_nentries);
|
|
- DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
|
|
DBUG_ON(msg->flags & XPC_M_SN2_DONE);
|
|
|
|
msg->flags |= XPC_M_SN2_DONE;
|
|
@@ -2297,7 +2287,7 @@
|
|
* The preceding store of msg->flags must occur before the following
|
|
* load of local_GP->get.
|
|
*/
|
|
- smp_mb();
|
|
+ mb();
|
|
|
|
/*
|
|
* See if this message is next in line to be acknowledged as having
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_uv.c linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_uv.c
|
|
--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_uv.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_uv.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,7 +3,7 @@
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
- * Copyright (c) 2008-2009 Silicon Graphics, Inc. All Rights Reserved.
|
|
+ * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved.
|
|
*/
|
|
|
|
/*
|
|
@@ -1010,8 +1010,8 @@
|
|
continue;
|
|
|
|
for (entry = 0; entry < nentries; entry++) {
|
|
- msg_slot = ch_uv->recv_msg_slots +
|
|
- entry * ch->entry_size;
|
|
+ msg_slot = ch_uv->recv_msg_slots + entry *
|
|
+ ch->entry_size;
|
|
|
|
msg_slot->hdr.msg_slot_number = entry;
|
|
}
|
|
@@ -1308,8 +1308,9 @@
|
|
/* we're dealing with a normal message sent via the notify_mq */
|
|
ch_uv = &ch->sn.uv;
|
|
|
|
- msg_slot = ch_uv->recv_msg_slots +
|
|
- (msg->hdr.msg_slot_number % ch->remote_nentries) * ch->entry_size;
|
|
+ msg_slot = (struct xpc_notify_mq_msg_uv *)((u64)ch_uv->recv_msg_slots +
|
|
+ (msg->hdr.msg_slot_number % ch->remote_nentries) *
|
|
+ ch->entry_size);
|
|
|
|
BUG_ON(msg->hdr.msg_slot_number != msg_slot->hdr.msg_slot_number);
|
|
BUG_ON(msg_slot->hdr.size != 0);
|
|
@@ -1422,7 +1423,7 @@
|
|
atomic_inc(&ch->n_to_notify);
|
|
|
|
msg_slot->key = key;
|
|
- smp_wmb(); /* a non-NULL func must hit memory after the key */
|
|
+ wmb(); /* a non-NULL func must hit memory after the key */
|
|
msg_slot->func = func;
|
|
|
|
if (ch->flags & XPC_C_DISCONNECTING) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpnet.c linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpnet.c
|
|
--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpnet.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpnet.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3,7 +3,7 @@
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
- * Copyright (C) 1999-2009 Silicon Graphics, Inc. All rights reserved.
|
|
+ * Copyright (C) 1999-2008 Silicon Graphics, Inc. All rights reserved.
|
|
*/
|
|
|
|
/*
|
|
@@ -551,7 +551,6 @@
|
|
|
|
netif_carrier_off(xpnet_device);
|
|
|
|
- xpnet_device->netdev_ops = &xpnet_netdev_ops;
|
|
xpnet_device->mtu = XPNET_DEF_MTU;
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/card/block.c linux-2.6.29-rc3.owrt/drivers/mmc/card/block.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/card/block.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/card/block.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -584,7 +584,7 @@
|
|
if (err)
|
|
goto out;
|
|
|
|
- string_get_size((u64)get_capacity(md->disk) << 9, STRING_UNITS_2,
|
|
+ string_get_size(get_capacity(md->disk) << 9, STRING_UNITS_2,
|
|
cap_str, sizeof(cap_str));
|
|
printk(KERN_INFO "%s: %s %s %s %s\n",
|
|
md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/card/mmc_test.c linux-2.6.29-rc3.owrt/drivers/mmc/card/mmc_test.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/card/mmc_test.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/card/mmc_test.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -494,7 +494,7 @@
|
|
|
|
sg_init_one(&sg, test->buffer, 512);
|
|
|
|
- ret = mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 0);
|
|
+ ret = mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 1);
|
|
if (ret)
|
|
return ret;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/core/mmc_ops.c linux-2.6.29-rc3.owrt/drivers/mmc/core/mmc_ops.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/core/mmc_ops.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/core/mmc_ops.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -248,15 +248,12 @@
|
|
|
|
sg_init_one(&sg, data_buf, len);
|
|
|
|
- if (opcode == MMC_SEND_CSD || opcode == MMC_SEND_CID) {
|
|
- /*
|
|
- * The spec states that CSR and CID accesses have a timeout
|
|
- * of 64 clock cycles.
|
|
- */
|
|
- data.timeout_ns = 0;
|
|
- data.timeout_clks = 64;
|
|
- } else
|
|
- mmc_set_data_timeout(&data, card);
|
|
+ /*
|
|
+ * The spec states that CSR and CID accesses have a timeout
|
|
+ * of 64 clock cycles.
|
|
+ */
|
|
+ data.timeout_ns = 0;
|
|
+ data.timeout_clks = 64;
|
|
|
|
mmc_wait_for_req(host, &mrq);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/atmel-mci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/atmel-mci.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/atmel-mci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/atmel-mci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1548,10 +1548,9 @@
|
|
{
|
|
struct dw_dma_slave *dws = slave;
|
|
|
|
- if (dws->dma_dev == chan->device->dev) {
|
|
- chan->private = dws;
|
|
+ if (dws->dma_dev == chan->device->dev)
|
|
return true;
|
|
- } else
|
|
+ else
|
|
return false;
|
|
}
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/Kconfig linux-2.6.29-rc3.owrt/drivers/mmc/host/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -145,16 +145,6 @@
|
|
|
|
If unsure, say N.
|
|
|
|
-config MMC_MXC
|
|
- tristate "Freescale i.MX2/3 Multimedia Card Interface support"
|
|
- depends on ARCH_MXC
|
|
- help
|
|
- This selects the Freescale i.MX2/3 Multimedia card Interface.
|
|
- If you have a i.MX platform with a Multimedia Card slot,
|
|
- say Y or M here.
|
|
-
|
|
- If unsure, say N.
|
|
-
|
|
config MMC_TIFM_SD
|
|
tristate "TI Flash Media MMC/SD Interface support (EXPERIMENTAL)"
|
|
depends on EXPERIMENTAL && PCI
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/Makefile linux-2.6.29-rc3.owrt/drivers/mmc/host/Makefile
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -9,7 +9,6 @@
|
|
obj-$(CONFIG_MMC_ARMMMCI) += mmci.o
|
|
obj-$(CONFIG_MMC_PXA) += pxamci.o
|
|
obj-$(CONFIG_MMC_IMX) += imxmmc.o
|
|
-obj-$(CONFIG_MMC_MXC) += mxcmmc.o
|
|
obj-$(CONFIG_MMC_SDHCI) += sdhci.o
|
|
obj-$(CONFIG_MMC_SDHCI_PCI) += sdhci-pci.o
|
|
obj-$(CONFIG_MMC_RICOH_MMC) += ricoh_mmc.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/mmci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/mmci.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/mmci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/mmci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -430,8 +430,6 @@
|
|
clk = 255;
|
|
host->cclk = host->mclk / (2 * (clk + 1));
|
|
}
|
|
- if (host->hw_designer == 0x80)
|
|
- clk |= MCI_FCEN; /* Bug fix in ST IP block */
|
|
clk |= MCI_CLK_ENABLE;
|
|
}
|
|
|
|
@@ -442,27 +440,15 @@
|
|
case MMC_POWER_OFF:
|
|
break;
|
|
case MMC_POWER_UP:
|
|
- /* The ST version does not have this, fall through to POWER_ON */
|
|
- if (host->hw_designer != 0x80) {
|
|
- pwr |= MCI_PWR_UP;
|
|
- break;
|
|
- }
|
|
+ pwr |= MCI_PWR_UP;
|
|
+ break;
|
|
case MMC_POWER_ON:
|
|
pwr |= MCI_PWR_ON;
|
|
break;
|
|
}
|
|
|
|
- if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) {
|
|
- if (host->hw_designer != 0x80)
|
|
- pwr |= MCI_ROD;
|
|
- else {
|
|
- /*
|
|
- * The ST Micro variant use the ROD bit for something
|
|
- * else and only has OD (Open Drain).
|
|
- */
|
|
- pwr |= MCI_OD;
|
|
- }
|
|
- }
|
|
+ if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
|
|
+ pwr |= MCI_ROD;
|
|
|
|
writel(clk, host->base + MMCICLOCK);
|
|
|
|
@@ -514,12 +500,6 @@
|
|
}
|
|
|
|
host = mmc_priv(mmc);
|
|
- /* Bits 12 thru 19 is the designer */
|
|
- host->hw_designer = (dev->periphid >> 12) & 0xff;
|
|
- /* Bits 20 thru 23 is the revison */
|
|
- host->hw_revision = (dev->periphid >> 20) & 0xf;
|
|
- DBG(host, "designer ID = 0x%02x\n", host->hw_designer);
|
|
- DBG(host, "revision = 0x%01x\n", host->hw_revision);
|
|
host->clk = clk_get(&dev->dev, NULL);
|
|
if (IS_ERR(host->clk)) {
|
|
ret = PTR_ERR(host->clk);
|
|
@@ -713,15 +693,6 @@
|
|
.id = 0x00041181,
|
|
.mask = 0x000fffff,
|
|
},
|
|
- /* ST Micro variants */
|
|
- {
|
|
- .id = 0x00180180,
|
|
- .mask = 0x00ffffff,
|
|
- },
|
|
- {
|
|
- .id = 0x00280180,
|
|
- .mask = 0x00ffffff,
|
|
- },
|
|
{ 0, 0 },
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/mmci.h linux-2.6.29-rc3.owrt/drivers/mmc/host/mmci.h
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/mmci.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/mmci.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -11,23 +11,13 @@
|
|
#define MCI_PWR_OFF 0x00
|
|
#define MCI_PWR_UP 0x02
|
|
#define MCI_PWR_ON 0x03
|
|
-#define MCI_DATA2DIREN (1 << 2)
|
|
-#define MCI_CMDDIREN (1 << 3)
|
|
-#define MCI_DATA0DIREN (1 << 4)
|
|
-#define MCI_DATA31DIREN (1 << 5)
|
|
#define MCI_OD (1 << 6)
|
|
#define MCI_ROD (1 << 7)
|
|
-/* The ST Micro version does not have ROD */
|
|
-#define MCI_FBCLKEN (1 << 7)
|
|
-#define MCI_DATA74DIREN (1 << 8)
|
|
|
|
#define MMCICLOCK 0x004
|
|
#define MCI_CLK_ENABLE (1 << 8)
|
|
#define MCI_CLK_PWRSAVE (1 << 9)
|
|
#define MCI_CLK_BYPASS (1 << 10)
|
|
-#define MCI_WIDE_BUS (1 << 11)
|
|
-/* HW flow control on the ST Micro version */
|
|
-#define MCI_FCEN (1 << 13)
|
|
|
|
#define MMCIARGUMENT 0x008
|
|
#define MMCICOMMAND 0x00c
|
|
@@ -36,10 +26,6 @@
|
|
#define MCI_CPSM_INTERRUPT (1 << 8)
|
|
#define MCI_CPSM_PENDING (1 << 9)
|
|
#define MCI_CPSM_ENABLE (1 << 10)
|
|
-#define MCI_SDIO_SUSP (1 << 11)
|
|
-#define MCI_ENCMD_COMPL (1 << 12)
|
|
-#define MCI_NIEN (1 << 13)
|
|
-#define MCI_CE_ATACMD (1 << 14)
|
|
|
|
#define MMCIRESPCMD 0x010
|
|
#define MMCIRESPONSE0 0x014
|
|
@@ -53,11 +39,6 @@
|
|
#define MCI_DPSM_DIRECTION (1 << 1)
|
|
#define MCI_DPSM_MODE (1 << 2)
|
|
#define MCI_DPSM_DMAENABLE (1 << 3)
|
|
-#define MCI_DPSM_BLOCKSIZE (1 << 4)
|
|
-#define MCI_DPSM_RWSTART (1 << 8)
|
|
-#define MCI_DPSM_RWSTOP (1 << 9)
|
|
-#define MCI_DPSM_RWMOD (1 << 10)
|
|
-#define MCI_DPSM_SDIOEN (1 << 11)
|
|
|
|
#define MMCIDATACNT 0x030
|
|
#define MMCISTATUS 0x034
|
|
@@ -82,8 +63,6 @@
|
|
#define MCI_RXFIFOEMPTY (1 << 19)
|
|
#define MCI_TXDATAAVLBL (1 << 20)
|
|
#define MCI_RXDATAAVLBL (1 << 21)
|
|
-#define MCI_SDIOIT (1 << 22)
|
|
-#define MCI_CEATAEND (1 << 23)
|
|
|
|
#define MMCICLEAR 0x038
|
|
#define MCI_CMDCRCFAILCLR (1 << 0)
|
|
@@ -96,8 +75,6 @@
|
|
#define MCI_CMDSENTCLR (1 << 7)
|
|
#define MCI_DATAENDCLR (1 << 8)
|
|
#define MCI_DATABLOCKENDCLR (1 << 10)
|
|
-#define MCI_SDIOITC (1 << 22)
|
|
-#define MCI_CEATAENDC (1 << 23)
|
|
|
|
#define MMCIMASK0 0x03c
|
|
#define MCI_CMDCRCFAILMASK (1 << 0)
|
|
@@ -121,8 +98,6 @@
|
|
#define MCI_RXFIFOEMPTYMASK (1 << 19)
|
|
#define MCI_TXDATAAVLBLMASK (1 << 20)
|
|
#define MCI_RXDATAAVLBLMASK (1 << 21)
|
|
-#define MCI_SDIOITMASK (1 << 22)
|
|
-#define MCI_CEATAENDMASK (1 << 23)
|
|
|
|
#define MMCIMASK1 0x040
|
|
#define MMCIFIFOCNT 0x048
|
|
@@ -161,9 +136,6 @@
|
|
u32 pwr;
|
|
struct mmc_platform_data *plat;
|
|
|
|
- u8 hw_designer;
|
|
- u8 hw_revision:4;
|
|
-
|
|
struct timer_list timer;
|
|
unsigned int oldstat;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/mxcmmc.c linux-2.6.29-rc3.owrt/drivers/mmc/host/mxcmmc.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/mxcmmc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/mxcmmc.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,880 +0,0 @@
|
|
-/*
|
|
- * linux/drivers/mmc/host/mxcmmc.c - Freescale i.MX MMCI driver
|
|
- *
|
|
- * This is a driver for the SDHC controller found in Freescale MX2/MX3
|
|
- * SoCs. It is basically the same hardware as found on MX1 (imxmmc.c).
|
|
- * Unlike the hardware found on MX1, this hardware just works and does
|
|
- * not need all the quirks found in imxmmc.c, hence the seperate driver.
|
|
- *
|
|
- * Copyright (C) 2008 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>
|
|
- * Copyright (C) 2006 Pavel Pisa, PiKRON <ppisa@pikron.com>
|
|
- *
|
|
- * derived from pxamci.c by Russell King
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License version 2 as
|
|
- * published by the Free Software Foundation.
|
|
- *
|
|
- */
|
|
-
|
|
-#include <linux/module.h>
|
|
-#include <linux/init.h>
|
|
-#include <linux/ioport.h>
|
|
-#include <linux/platform_device.h>
|
|
-#include <linux/interrupt.h>
|
|
-#include <linux/irq.h>
|
|
-#include <linux/blkdev.h>
|
|
-#include <linux/dma-mapping.h>
|
|
-#include <linux/mmc/host.h>
|
|
-#include <linux/mmc/card.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/clk.h>
|
|
-#include <linux/io.h>
|
|
-#include <linux/gpio.h>
|
|
-
|
|
-#include <asm/dma.h>
|
|
-#include <asm/irq.h>
|
|
-#include <asm/sizes.h>
|
|
-#include <mach/mmc.h>
|
|
-
|
|
-#ifdef CONFIG_ARCH_MX2
|
|
-#include <mach/dma-mx1-mx2.h>
|
|
-#define HAS_DMA
|
|
-#endif
|
|
-
|
|
-#define DRIVER_NAME "imx-mmc"
|
|
-
|
|
-#define MMC_REG_STR_STP_CLK 0x00
|
|
-#define MMC_REG_STATUS 0x04
|
|
-#define MMC_REG_CLK_RATE 0x08
|
|
-#define MMC_REG_CMD_DAT_CONT 0x0C
|
|
-#define MMC_REG_RES_TO 0x10
|
|
-#define MMC_REG_READ_TO 0x14
|
|
-#define MMC_REG_BLK_LEN 0x18
|
|
-#define MMC_REG_NOB 0x1C
|
|
-#define MMC_REG_REV_NO 0x20
|
|
-#define MMC_REG_INT_CNTR 0x24
|
|
-#define MMC_REG_CMD 0x28
|
|
-#define MMC_REG_ARG 0x2C
|
|
-#define MMC_REG_RES_FIFO 0x34
|
|
-#define MMC_REG_BUFFER_ACCESS 0x38
|
|
-
|
|
-#define STR_STP_CLK_RESET (1 << 3)
|
|
-#define STR_STP_CLK_START_CLK (1 << 1)
|
|
-#define STR_STP_CLK_STOP_CLK (1 << 0)
|
|
-
|
|
-#define STATUS_CARD_INSERTION (1 << 31)
|
|
-#define STATUS_CARD_REMOVAL (1 << 30)
|
|
-#define STATUS_YBUF_EMPTY (1 << 29)
|
|
-#define STATUS_XBUF_EMPTY (1 << 28)
|
|
-#define STATUS_YBUF_FULL (1 << 27)
|
|
-#define STATUS_XBUF_FULL (1 << 26)
|
|
-#define STATUS_BUF_UND_RUN (1 << 25)
|
|
-#define STATUS_BUF_OVFL (1 << 24)
|
|
-#define STATUS_SDIO_INT_ACTIVE (1 << 14)
|
|
-#define STATUS_END_CMD_RESP (1 << 13)
|
|
-#define STATUS_WRITE_OP_DONE (1 << 12)
|
|
-#define STATUS_DATA_TRANS_DONE (1 << 11)
|
|
-#define STATUS_READ_OP_DONE (1 << 11)
|
|
-#define STATUS_WR_CRC_ERROR_CODE_MASK (3 << 10)
|
|
-#define STATUS_CARD_BUS_CLK_RUN (1 << 8)
|
|
-#define STATUS_BUF_READ_RDY (1 << 7)
|
|
-#define STATUS_BUF_WRITE_RDY (1 << 6)
|
|
-#define STATUS_RESP_CRC_ERR (1 << 5)
|
|
-#define STATUS_CRC_READ_ERR (1 << 3)
|
|
-#define STATUS_CRC_WRITE_ERR (1 << 2)
|
|
-#define STATUS_TIME_OUT_RESP (1 << 1)
|
|
-#define STATUS_TIME_OUT_READ (1 << 0)
|
|
-#define STATUS_ERR_MASK 0x2f
|
|
-
|
|
-#define CMD_DAT_CONT_CMD_RESP_LONG_OFF (1 << 12)
|
|
-#define CMD_DAT_CONT_STOP_READWAIT (1 << 11)
|
|
-#define CMD_DAT_CONT_START_READWAIT (1 << 10)
|
|
-#define CMD_DAT_CONT_BUS_WIDTH_4 (2 << 8)
|
|
-#define CMD_DAT_CONT_INIT (1 << 7)
|
|
-#define CMD_DAT_CONT_WRITE (1 << 4)
|
|
-#define CMD_DAT_CONT_DATA_ENABLE (1 << 3)
|
|
-#define CMD_DAT_CONT_RESPONSE_48BIT_CRC (1 << 0)
|
|
-#define CMD_DAT_CONT_RESPONSE_136BIT (2 << 0)
|
|
-#define CMD_DAT_CONT_RESPONSE_48BIT (3 << 0)
|
|
-
|
|
-#define INT_SDIO_INT_WKP_EN (1 << 18)
|
|
-#define INT_CARD_INSERTION_WKP_EN (1 << 17)
|
|
-#define INT_CARD_REMOVAL_WKP_EN (1 << 16)
|
|
-#define INT_CARD_INSERTION_EN (1 << 15)
|
|
-#define INT_CARD_REMOVAL_EN (1 << 14)
|
|
-#define INT_SDIO_IRQ_EN (1 << 13)
|
|
-#define INT_DAT0_EN (1 << 12)
|
|
-#define INT_BUF_READ_EN (1 << 4)
|
|
-#define INT_BUF_WRITE_EN (1 << 3)
|
|
-#define INT_END_CMD_RES_EN (1 << 2)
|
|
-#define INT_WRITE_OP_DONE_EN (1 << 1)
|
|
-#define INT_READ_OP_EN (1 << 0)
|
|
-
|
|
-struct mxcmci_host {
|
|
- struct mmc_host *mmc;
|
|
- struct resource *res;
|
|
- void __iomem *base;
|
|
- int irq;
|
|
- int detect_irq;
|
|
- int dma;
|
|
- int do_dma;
|
|
- unsigned int power_mode;
|
|
- struct imxmmc_platform_data *pdata;
|
|
-
|
|
- struct mmc_request *req;
|
|
- struct mmc_command *cmd;
|
|
- struct mmc_data *data;
|
|
-
|
|
- unsigned int dma_nents;
|
|
- unsigned int datasize;
|
|
- unsigned int dma_dir;
|
|
-
|
|
- u16 rev_no;
|
|
- unsigned int cmdat;
|
|
-
|
|
- struct clk *clk;
|
|
-
|
|
- int clock;
|
|
-
|
|
- struct work_struct datawork;
|
|
-};
|
|
-
|
|
-static inline int mxcmci_use_dma(struct mxcmci_host *host)
|
|
-{
|
|
- return host->do_dma;
|
|
-}
|
|
-
|
|
-static void mxcmci_softreset(struct mxcmci_host *host)
|
|
-{
|
|
- int i;
|
|
-
|
|
- /* reset sequence */
|
|
- writew(STR_STP_CLK_RESET, host->base + MMC_REG_STR_STP_CLK);
|
|
- writew(STR_STP_CLK_RESET | STR_STP_CLK_START_CLK,
|
|
- host->base + MMC_REG_STR_STP_CLK);
|
|
-
|
|
- for (i = 0; i < 8; i++)
|
|
- writew(STR_STP_CLK_START_CLK, host->base + MMC_REG_STR_STP_CLK);
|
|
-
|
|
- writew(0xff, host->base + MMC_REG_RES_TO);
|
|
-}
|
|
-
|
|
-static void mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
|
|
-{
|
|
- unsigned int nob = data->blocks;
|
|
- unsigned int blksz = data->blksz;
|
|
- unsigned int datasize = nob * blksz;
|
|
-#ifdef HAS_DMA
|
|
- struct scatterlist *sg;
|
|
- int i;
|
|
-#endif
|
|
- if (data->flags & MMC_DATA_STREAM)
|
|
- nob = 0xffff;
|
|
-
|
|
- host->data = data;
|
|
- data->bytes_xfered = 0;
|
|
-
|
|
- writew(nob, host->base + MMC_REG_NOB);
|
|
- writew(blksz, host->base + MMC_REG_BLK_LEN);
|
|
- host->datasize = datasize;
|
|
-
|
|
-#ifdef HAS_DMA
|
|
- for_each_sg(data->sg, sg, data->sg_len, i) {
|
|
- if (sg->offset & 3 || sg->length & 3) {
|
|
- host->do_dma = 0;
|
|
- return;
|
|
- }
|
|
- }
|
|
-
|
|
- if (data->flags & MMC_DATA_READ) {
|
|
- host->dma_dir = DMA_FROM_DEVICE;
|
|
- host->dma_nents = dma_map_sg(mmc_dev(host->mmc), data->sg,
|
|
- data->sg_len, host->dma_dir);
|
|
-
|
|
- imx_dma_setup_sg(host->dma, data->sg, host->dma_nents, datasize,
|
|
- host->res->start + MMC_REG_BUFFER_ACCESS,
|
|
- DMA_MODE_READ);
|
|
- } else {
|
|
- host->dma_dir = DMA_TO_DEVICE;
|
|
- host->dma_nents = dma_map_sg(mmc_dev(host->mmc), data->sg,
|
|
- data->sg_len, host->dma_dir);
|
|
-
|
|
- imx_dma_setup_sg(host->dma, data->sg, host->dma_nents, datasize,
|
|
- host->res->start + MMC_REG_BUFFER_ACCESS,
|
|
- DMA_MODE_WRITE);
|
|
- }
|
|
-
|
|
- wmb();
|
|
-
|
|
- imx_dma_enable(host->dma);
|
|
-#endif /* HAS_DMA */
|
|
-}
|
|
-
|
|
-static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd,
|
|
- unsigned int cmdat)
|
|
-{
|
|
- WARN_ON(host->cmd != NULL);
|
|
- host->cmd = cmd;
|
|
-
|
|
- switch (mmc_resp_type(cmd)) {
|
|
- case MMC_RSP_R1: /* short CRC, OPCODE */
|
|
- case MMC_RSP_R1B:/* short CRC, OPCODE, BUSY */
|
|
- cmdat |= CMD_DAT_CONT_RESPONSE_48BIT_CRC;
|
|
- break;
|
|
- case MMC_RSP_R2: /* long 136 bit + CRC */
|
|
- cmdat |= CMD_DAT_CONT_RESPONSE_136BIT;
|
|
- break;
|
|
- case MMC_RSP_R3: /* short */
|
|
- cmdat |= CMD_DAT_CONT_RESPONSE_48BIT;
|
|
- break;
|
|
- case MMC_RSP_NONE:
|
|
- break;
|
|
- default:
|
|
- dev_err(mmc_dev(host->mmc), "unhandled response type 0x%x\n",
|
|
- mmc_resp_type(cmd));
|
|
- cmd->error = -EINVAL;
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- if (mxcmci_use_dma(host))
|
|
- writel(INT_READ_OP_EN | INT_WRITE_OP_DONE_EN |
|
|
- INT_END_CMD_RES_EN,
|
|
- host->base + MMC_REG_INT_CNTR);
|
|
- else
|
|
- writel(INT_END_CMD_RES_EN, host->base + MMC_REG_INT_CNTR);
|
|
-
|
|
- writew(cmd->opcode, host->base + MMC_REG_CMD);
|
|
- writel(cmd->arg, host->base + MMC_REG_ARG);
|
|
- writew(cmdat, host->base + MMC_REG_CMD_DAT_CONT);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void mxcmci_finish_request(struct mxcmci_host *host,
|
|
- struct mmc_request *req)
|
|
-{
|
|
- writel(0, host->base + MMC_REG_INT_CNTR);
|
|
-
|
|
- host->req = NULL;
|
|
- host->cmd = NULL;
|
|
- host->data = NULL;
|
|
-
|
|
- mmc_request_done(host->mmc, req);
|
|
-}
|
|
-
|
|
-static int mxcmci_finish_data(struct mxcmci_host *host, unsigned int stat)
|
|
-{
|
|
- struct mmc_data *data = host->data;
|
|
- int data_error;
|
|
-
|
|
-#ifdef HAS_DMA
|
|
- if (mxcmci_use_dma(host)) {
|
|
- imx_dma_disable(host->dma);
|
|
- dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->dma_nents,
|
|
- host->dma_dir);
|
|
- }
|
|
-#endif
|
|
-
|
|
- if (stat & STATUS_ERR_MASK) {
|
|
- dev_dbg(mmc_dev(host->mmc), "request failed. status: 0x%08x\n",
|
|
- stat);
|
|
- if (stat & STATUS_CRC_READ_ERR) {
|
|
- data->error = -EILSEQ;
|
|
- } else if (stat & STATUS_CRC_WRITE_ERR) {
|
|
- u32 err_code = (stat >> 9) & 0x3;
|
|
- if (err_code == 2) /* No CRC response */
|
|
- data->error = -ETIMEDOUT;
|
|
- else
|
|
- data->error = -EILSEQ;
|
|
- } else if (stat & STATUS_TIME_OUT_READ) {
|
|
- data->error = -ETIMEDOUT;
|
|
- } else {
|
|
- data->error = -EIO;
|
|
- }
|
|
- } else {
|
|
- data->bytes_xfered = host->datasize;
|
|
- }
|
|
-
|
|
- data_error = data->error;
|
|
-
|
|
- host->data = NULL;
|
|
-
|
|
- return data_error;
|
|
-}
|
|
-
|
|
-static void mxcmci_read_response(struct mxcmci_host *host, unsigned int stat)
|
|
-{
|
|
- struct mmc_command *cmd = host->cmd;
|
|
- int i;
|
|
- u32 a, b, c;
|
|
-
|
|
- if (!cmd)
|
|
- return;
|
|
-
|
|
- if (stat & STATUS_TIME_OUT_RESP) {
|
|
- dev_dbg(mmc_dev(host->mmc), "CMD TIMEOUT\n");
|
|
- cmd->error = -ETIMEDOUT;
|
|
- } else if (stat & STATUS_RESP_CRC_ERR && cmd->flags & MMC_RSP_CRC) {
|
|
- dev_dbg(mmc_dev(host->mmc), "cmd crc error\n");
|
|
- cmd->error = -EILSEQ;
|
|
- }
|
|
-
|
|
- if (cmd->flags & MMC_RSP_PRESENT) {
|
|
- if (cmd->flags & MMC_RSP_136) {
|
|
- for (i = 0; i < 4; i++) {
|
|
- a = readw(host->base + MMC_REG_RES_FIFO);
|
|
- b = readw(host->base + MMC_REG_RES_FIFO);
|
|
- cmd->resp[i] = a << 16 | b;
|
|
- }
|
|
- } else {
|
|
- a = readw(host->base + MMC_REG_RES_FIFO);
|
|
- b = readw(host->base + MMC_REG_RES_FIFO);
|
|
- c = readw(host->base + MMC_REG_RES_FIFO);
|
|
- cmd->resp[0] = a << 24 | b << 8 | c >> 8;
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-static int mxcmci_poll_status(struct mxcmci_host *host, u32 mask)
|
|
-{
|
|
- u32 stat;
|
|
- unsigned long timeout = jiffies + HZ;
|
|
-
|
|
- do {
|
|
- stat = readl(host->base + MMC_REG_STATUS);
|
|
- if (stat & STATUS_ERR_MASK)
|
|
- return stat;
|
|
- if (time_after(jiffies, timeout))
|
|
- return STATUS_TIME_OUT_READ;
|
|
- if (stat & mask)
|
|
- return 0;
|
|
- cpu_relax();
|
|
- } while (1);
|
|
-}
|
|
-
|
|
-static int mxcmci_pull(struct mxcmci_host *host, void *_buf, int bytes)
|
|
-{
|
|
- unsigned int stat;
|
|
- u32 *buf = _buf;
|
|
-
|
|
- while (bytes > 3) {
|
|
- stat = mxcmci_poll_status(host,
|
|
- STATUS_BUF_READ_RDY | STATUS_READ_OP_DONE);
|
|
- if (stat)
|
|
- return stat;
|
|
- *buf++ = readl(host->base + MMC_REG_BUFFER_ACCESS);
|
|
- bytes -= 4;
|
|
- }
|
|
-
|
|
- if (bytes) {
|
|
- u8 *b = (u8 *)buf;
|
|
- u32 tmp;
|
|
-
|
|
- stat = mxcmci_poll_status(host,
|
|
- STATUS_BUF_READ_RDY | STATUS_READ_OP_DONE);
|
|
- if (stat)
|
|
- return stat;
|
|
- tmp = readl(host->base + MMC_REG_BUFFER_ACCESS);
|
|
- memcpy(b, &tmp, bytes);
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int mxcmci_push(struct mxcmci_host *host, void *_buf, int bytes)
|
|
-{
|
|
- unsigned int stat;
|
|
- u32 *buf = _buf;
|
|
-
|
|
- while (bytes > 3) {
|
|
- stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY);
|
|
- if (stat)
|
|
- return stat;
|
|
- writel(*buf++, host->base + MMC_REG_BUFFER_ACCESS);
|
|
- bytes -= 4;
|
|
- }
|
|
-
|
|
- if (bytes) {
|
|
- u8 *b = (u8 *)buf;
|
|
- u32 tmp;
|
|
-
|
|
- stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY);
|
|
- if (stat)
|
|
- return stat;
|
|
-
|
|
- memcpy(&tmp, b, bytes);
|
|
- writel(tmp, host->base + MMC_REG_BUFFER_ACCESS);
|
|
- }
|
|
-
|
|
- stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY);
|
|
- if (stat)
|
|
- return stat;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int mxcmci_transfer_data(struct mxcmci_host *host)
|
|
-{
|
|
- struct mmc_data *data = host->req->data;
|
|
- struct scatterlist *sg;
|
|
- int stat, i;
|
|
-
|
|
- host->datasize = 0;
|
|
-
|
|
- host->data = data;
|
|
- host->datasize = 0;
|
|
-
|
|
- if (data->flags & MMC_DATA_READ) {
|
|
- for_each_sg(data->sg, sg, data->sg_len, i) {
|
|
- stat = mxcmci_pull(host, sg_virt(sg), sg->length);
|
|
- if (stat)
|
|
- return stat;
|
|
- host->datasize += sg->length;
|
|
- }
|
|
- } else {
|
|
- for_each_sg(data->sg, sg, data->sg_len, i) {
|
|
- stat = mxcmci_push(host, sg_virt(sg), sg->length);
|
|
- if (stat)
|
|
- return stat;
|
|
- host->datasize += sg->length;
|
|
- }
|
|
- stat = mxcmci_poll_status(host, STATUS_WRITE_OP_DONE);
|
|
- if (stat)
|
|
- return stat;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void mxcmci_datawork(struct work_struct *work)
|
|
-{
|
|
- struct mxcmci_host *host = container_of(work, struct mxcmci_host,
|
|
- datawork);
|
|
- int datastat = mxcmci_transfer_data(host);
|
|
- mxcmci_finish_data(host, datastat);
|
|
-
|
|
- if (host->req->stop) {
|
|
- if (mxcmci_start_cmd(host, host->req->stop, 0)) {
|
|
- mxcmci_finish_request(host, host->req);
|
|
- return;
|
|
- }
|
|
- } else {
|
|
- mxcmci_finish_request(host, host->req);
|
|
- }
|
|
-}
|
|
-
|
|
-#ifdef HAS_DMA
|
|
-static void mxcmci_data_done(struct mxcmci_host *host, unsigned int stat)
|
|
-{
|
|
- struct mmc_data *data = host->data;
|
|
- int data_error;
|
|
-
|
|
- if (!data)
|
|
- return;
|
|
-
|
|
- data_error = mxcmci_finish_data(host, stat);
|
|
-
|
|
- mxcmci_read_response(host, stat);
|
|
- host->cmd = NULL;
|
|
-
|
|
- if (host->req->stop) {
|
|
- if (mxcmci_start_cmd(host, host->req->stop, 0)) {
|
|
- mxcmci_finish_request(host, host->req);
|
|
- return;
|
|
- }
|
|
- } else {
|
|
- mxcmci_finish_request(host, host->req);
|
|
- }
|
|
-}
|
|
-#endif /* HAS_DMA */
|
|
-
|
|
-static void mxcmci_cmd_done(struct mxcmci_host *host, unsigned int stat)
|
|
-{
|
|
- mxcmci_read_response(host, stat);
|
|
- host->cmd = NULL;
|
|
-
|
|
- if (!host->data && host->req) {
|
|
- mxcmci_finish_request(host, host->req);
|
|
- return;
|
|
- }
|
|
-
|
|
- /* For the DMA case the DMA engine handles the data transfer
|
|
- * automatically. For non DMA we have to to it ourselves.
|
|
- * Don't do it in interrupt context though.
|
|
- */
|
|
- if (!mxcmci_use_dma(host) && host->data)
|
|
- schedule_work(&host->datawork);
|
|
-
|
|
-}
|
|
-
|
|
-static irqreturn_t mxcmci_irq(int irq, void *devid)
|
|
-{
|
|
- struct mxcmci_host *host = devid;
|
|
- u32 stat;
|
|
-
|
|
- stat = readl(host->base + MMC_REG_STATUS);
|
|
- writel(stat, host->base + MMC_REG_STATUS);
|
|
-
|
|
- dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat);
|
|
-
|
|
- if (stat & STATUS_END_CMD_RESP)
|
|
- mxcmci_cmd_done(host, stat);
|
|
-#ifdef HAS_DMA
|
|
- if (mxcmci_use_dma(host) &&
|
|
- (stat & (STATUS_DATA_TRANS_DONE | STATUS_WRITE_OP_DONE)))
|
|
- mxcmci_data_done(host, stat);
|
|
-#endif
|
|
- return IRQ_HANDLED;
|
|
-}
|
|
-
|
|
-static void mxcmci_request(struct mmc_host *mmc, struct mmc_request *req)
|
|
-{
|
|
- struct mxcmci_host *host = mmc_priv(mmc);
|
|
- unsigned int cmdat = host->cmdat;
|
|
-
|
|
- WARN_ON(host->req != NULL);
|
|
-
|
|
- host->req = req;
|
|
- host->cmdat &= ~CMD_DAT_CONT_INIT;
|
|
-#ifdef HAS_DMA
|
|
- host->do_dma = 1;
|
|
-#endif
|
|
- if (req->data) {
|
|
- mxcmci_setup_data(host, req->data);
|
|
-
|
|
- cmdat |= CMD_DAT_CONT_DATA_ENABLE;
|
|
-
|
|
- if (req->data->flags & MMC_DATA_WRITE)
|
|
- cmdat |= CMD_DAT_CONT_WRITE;
|
|
- }
|
|
-
|
|
- if (mxcmci_start_cmd(host, req->cmd, cmdat))
|
|
- mxcmci_finish_request(host, req);
|
|
-}
|
|
-
|
|
-static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios)
|
|
-{
|
|
- unsigned int divider;
|
|
- int prescaler = 0;
|
|
- unsigned int clk_in = clk_get_rate(host->clk);
|
|
-
|
|
- while (prescaler <= 0x800) {
|
|
- for (divider = 1; divider <= 0xF; divider++) {
|
|
- int x;
|
|
-
|
|
- x = (clk_in / (divider + 1));
|
|
-
|
|
- if (prescaler)
|
|
- x /= (prescaler * 2);
|
|
-
|
|
- if (x <= clk_ios)
|
|
- break;
|
|
- }
|
|
- if (divider < 0x10)
|
|
- break;
|
|
-
|
|
- if (prescaler == 0)
|
|
- prescaler = 1;
|
|
- else
|
|
- prescaler <<= 1;
|
|
- }
|
|
-
|
|
- writew((prescaler << 4) | divider, host->base + MMC_REG_CLK_RATE);
|
|
-
|
|
- dev_dbg(mmc_dev(host->mmc), "scaler: %d divider: %d in: %d out: %d\n",
|
|
- prescaler, divider, clk_in, clk_ios);
|
|
-}
|
|
-
|
|
-static void mxcmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
-{
|
|
- struct mxcmci_host *host = mmc_priv(mmc);
|
|
-#ifdef HAS_DMA
|
|
- unsigned int blen;
|
|
- /*
|
|
- * use burstlen of 64 in 4 bit mode (--> reg value 0)
|
|
- * use burstlen of 16 in 1 bit mode (--> reg value 16)
|
|
- */
|
|
- if (ios->bus_width == MMC_BUS_WIDTH_4)
|
|
- blen = 0;
|
|
- else
|
|
- blen = 16;
|
|
-
|
|
- imx_dma_config_burstlen(host->dma, blen);
|
|
-#endif
|
|
- if (ios->bus_width == MMC_BUS_WIDTH_4)
|
|
- host->cmdat |= CMD_DAT_CONT_BUS_WIDTH_4;
|
|
- else
|
|
- host->cmdat &= ~CMD_DAT_CONT_BUS_WIDTH_4;
|
|
-
|
|
- if (host->power_mode != ios->power_mode) {
|
|
- if (host->pdata && host->pdata->setpower)
|
|
- host->pdata->setpower(mmc_dev(mmc), ios->vdd);
|
|
- host->power_mode = ios->power_mode;
|
|
- if (ios->power_mode == MMC_POWER_ON)
|
|
- host->cmdat |= CMD_DAT_CONT_INIT;
|
|
- }
|
|
-
|
|
- if (ios->clock) {
|
|
- mxcmci_set_clk_rate(host, ios->clock);
|
|
- writew(STR_STP_CLK_START_CLK, host->base + MMC_REG_STR_STP_CLK);
|
|
- } else {
|
|
- writew(STR_STP_CLK_STOP_CLK, host->base + MMC_REG_STR_STP_CLK);
|
|
- }
|
|
-
|
|
- host->clock = ios->clock;
|
|
-}
|
|
-
|
|
-static irqreturn_t mxcmci_detect_irq(int irq, void *data)
|
|
-{
|
|
- struct mmc_host *mmc = data;
|
|
-
|
|
- dev_dbg(mmc_dev(mmc), "%s\n", __func__);
|
|
-
|
|
- mmc_detect_change(mmc, msecs_to_jiffies(250));
|
|
- return IRQ_HANDLED;
|
|
-}
|
|
-
|
|
-static int mxcmci_get_ro(struct mmc_host *mmc)
|
|
-{
|
|
- struct mxcmci_host *host = mmc_priv(mmc);
|
|
-
|
|
- if (host->pdata && host->pdata->get_ro)
|
|
- return !!host->pdata->get_ro(mmc_dev(mmc));
|
|
- /*
|
|
- * Board doesn't support read only detection; let the mmc core
|
|
- * decide what to do.
|
|
- */
|
|
- return -ENOSYS;
|
|
-}
|
|
-
|
|
-
|
|
-static const struct mmc_host_ops mxcmci_ops = {
|
|
- .request = mxcmci_request,
|
|
- .set_ios = mxcmci_set_ios,
|
|
- .get_ro = mxcmci_get_ro,
|
|
-};
|
|
-
|
|
-static int mxcmci_probe(struct platform_device *pdev)
|
|
-{
|
|
- struct mmc_host *mmc;
|
|
- struct mxcmci_host *host = NULL;
|
|
- struct resource *r;
|
|
- int ret = 0, irq;
|
|
-
|
|
- printk(KERN_INFO "i.MX SDHC driver\n");
|
|
-
|
|
- r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
- irq = platform_get_irq(pdev, 0);
|
|
- if (!r || irq < 0)
|
|
- return -EINVAL;
|
|
-
|
|
- r = request_mem_region(r->start, resource_size(r), pdev->name);
|
|
- if (!r)
|
|
- return -EBUSY;
|
|
-
|
|
- mmc = mmc_alloc_host(sizeof(struct mxcmci_host), &pdev->dev);
|
|
- if (!mmc) {
|
|
- ret = -ENOMEM;
|
|
- goto out_release_mem;
|
|
- }
|
|
-
|
|
- mmc->ops = &mxcmci_ops;
|
|
- mmc->caps = MMC_CAP_4_BIT_DATA;
|
|
-
|
|
- /* MMC core transfer sizes tunable parameters */
|
|
- mmc->max_hw_segs = 64;
|
|
- mmc->max_phys_segs = 64;
|
|
- mmc->max_blk_size = 2048;
|
|
- mmc->max_blk_count = 65535;
|
|
- mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
|
|
- mmc->max_seg_size = mmc->max_seg_size;
|
|
-
|
|
- host = mmc_priv(mmc);
|
|
- host->base = ioremap(r->start, resource_size(r));
|
|
- if (!host->base) {
|
|
- ret = -ENOMEM;
|
|
- goto out_free;
|
|
- }
|
|
-
|
|
- host->mmc = mmc;
|
|
- host->pdata = pdev->dev.platform_data;
|
|
-
|
|
- if (host->pdata && host->pdata->ocr_avail)
|
|
- mmc->ocr_avail = host->pdata->ocr_avail;
|
|
- else
|
|
- mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
|
|
-
|
|
- host->res = r;
|
|
- host->irq = irq;
|
|
-
|
|
- host->clk = clk_get(&pdev->dev, "sdhc_clk");
|
|
- if (IS_ERR(host->clk)) {
|
|
- ret = PTR_ERR(host->clk);
|
|
- goto out_iounmap;
|
|
- }
|
|
- clk_enable(host->clk);
|
|
-
|
|
- mxcmci_softreset(host);
|
|
-
|
|
- host->rev_no = readw(host->base + MMC_REG_REV_NO);
|
|
- if (host->rev_no != 0x400) {
|
|
- ret = -ENODEV;
|
|
- dev_err(mmc_dev(host->mmc), "wrong rev.no. 0x%08x. aborting.\n",
|
|
- host->rev_no);
|
|
- goto out_clk_put;
|
|
- }
|
|
-
|
|
- mmc->f_min = clk_get_rate(host->clk) >> 7;
|
|
- mmc->f_max = clk_get_rate(host->clk) >> 1;
|
|
-
|
|
- /* recommended in data sheet */
|
|
- writew(0x2db4, host->base + MMC_REG_READ_TO);
|
|
-
|
|
- writel(0, host->base + MMC_REG_INT_CNTR);
|
|
-
|
|
-#ifdef HAS_DMA
|
|
- host->dma = imx_dma_request_by_prio(DRIVER_NAME, DMA_PRIO_LOW);
|
|
- if (host->dma < 0) {
|
|
- dev_err(mmc_dev(host->mmc), "imx_dma_request_by_prio failed\n");
|
|
- ret = -EBUSY;
|
|
- goto out_clk_put;
|
|
- }
|
|
-
|
|
- r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
|
- if (!r) {
|
|
- ret = -EINVAL;
|
|
- goto out_free_dma;
|
|
- }
|
|
-
|
|
- ret = imx_dma_config_channel(host->dma,
|
|
- IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_FIFO,
|
|
- IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_LINEAR,
|
|
- r->start, 0);
|
|
- if (ret) {
|
|
- dev_err(mmc_dev(host->mmc), "failed to config DMA channel\n");
|
|
- goto out_free_dma;
|
|
- }
|
|
-#endif
|
|
- INIT_WORK(&host->datawork, mxcmci_datawork);
|
|
-
|
|
- ret = request_irq(host->irq, mxcmci_irq, 0, DRIVER_NAME, host);
|
|
- if (ret)
|
|
- goto out_free_dma;
|
|
-
|
|
- platform_set_drvdata(pdev, mmc);
|
|
-
|
|
- if (host->pdata && host->pdata->init) {
|
|
- ret = host->pdata->init(&pdev->dev, mxcmci_detect_irq,
|
|
- host->mmc);
|
|
- if (ret)
|
|
- goto out_free_irq;
|
|
- }
|
|
-
|
|
- mmc_add_host(mmc);
|
|
-
|
|
- return 0;
|
|
-
|
|
-out_free_irq:
|
|
- free_irq(host->irq, host);
|
|
-out_free_dma:
|
|
-#ifdef HAS_DMA
|
|
- imx_dma_free(host->dma);
|
|
-#endif
|
|
-out_clk_put:
|
|
- clk_disable(host->clk);
|
|
- clk_put(host->clk);
|
|
-out_iounmap:
|
|
- iounmap(host->base);
|
|
-out_free:
|
|
- mmc_free_host(mmc);
|
|
-out_release_mem:
|
|
- release_mem_region(host->res->start, resource_size(host->res));
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int mxcmci_remove(struct platform_device *pdev)
|
|
-{
|
|
- struct mmc_host *mmc = platform_get_drvdata(pdev);
|
|
- struct mxcmci_host *host = mmc_priv(mmc);
|
|
-
|
|
- platform_set_drvdata(pdev, NULL);
|
|
-
|
|
- mmc_remove_host(mmc);
|
|
-
|
|
- if (host->pdata && host->pdata->exit)
|
|
- host->pdata->exit(&pdev->dev, mmc);
|
|
-
|
|
- free_irq(host->irq, host);
|
|
- iounmap(host->base);
|
|
-#ifdef HAS_DMA
|
|
- imx_dma_free(host->dma);
|
|
-#endif
|
|
- clk_disable(host->clk);
|
|
- clk_put(host->clk);
|
|
-
|
|
- release_mem_region(host->res->start, resource_size(host->res));
|
|
- release_resource(host->res);
|
|
-
|
|
- mmc_free_host(mmc);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-#ifdef CONFIG_PM
|
|
-static int mxcmci_suspend(struct platform_device *dev, pm_message_t state)
|
|
-{
|
|
- struct mmc_host *mmc = platform_get_drvdata(dev);
|
|
- int ret = 0;
|
|
-
|
|
- if (mmc)
|
|
- ret = mmc_suspend_host(mmc, state);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int mxcmci_resume(struct platform_device *dev)
|
|
-{
|
|
- struct mmc_host *mmc = platform_get_drvdata(dev);
|
|
- struct mxcmci_host *host;
|
|
- int ret = 0;
|
|
-
|
|
- if (mmc) {
|
|
- host = mmc_priv(mmc);
|
|
- ret = mmc_resume_host(mmc);
|
|
- }
|
|
-
|
|
- return ret;
|
|
-}
|
|
-#else
|
|
-#define mxcmci_suspend NULL
|
|
-#define mxcmci_resume NULL
|
|
-#endif /* CONFIG_PM */
|
|
-
|
|
-static struct platform_driver mxcmci_driver = {
|
|
- .probe = mxcmci_probe,
|
|
- .remove = mxcmci_remove,
|
|
- .suspend = mxcmci_suspend,
|
|
- .resume = mxcmci_resume,
|
|
- .driver = {
|
|
- .name = DRIVER_NAME,
|
|
- .owner = THIS_MODULE,
|
|
- }
|
|
-};
|
|
-
|
|
-static int __init mxcmci_init(void)
|
|
-{
|
|
- return platform_driver_register(&mxcmci_driver);
|
|
-}
|
|
-
|
|
-static void __exit mxcmci_exit(void)
|
|
-{
|
|
- platform_driver_unregister(&mxcmci_driver);
|
|
-}
|
|
-
|
|
-module_init(mxcmci_init);
|
|
-module_exit(mxcmci_exit);
|
|
-
|
|
-MODULE_DESCRIPTION("i.MX Multimedia Card Interface Driver");
|
|
-MODULE_AUTHOR("Sascha Hauer, Pengutronix");
|
|
-MODULE_LICENSE("GPL");
|
|
-MODULE_ALIAS("platform:imx-mmc");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/omap_hsmmc.c linux-2.6.29-rc3.owrt/drivers/mmc/host/omap_hsmmc.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/omap_hsmmc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/omap_hsmmc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -55,7 +55,6 @@
|
|
#define VS30 (1 << 25)
|
|
#define SDVS18 (0x5 << 9)
|
|
#define SDVS30 (0x6 << 9)
|
|
-#define SDVS33 (0x7 << 9)
|
|
#define SDVSCLR 0xFFFFF1FF
|
|
#define SDVSDET 0x00000400
|
|
#define AUTOIDLE 0x1
|
|
@@ -376,32 +375,6 @@
|
|
}
|
|
#endif /* CONFIG_MMC_DEBUG */
|
|
|
|
-/*
|
|
- * MMC controller internal state machines reset
|
|
- *
|
|
- * Used to reset command or data internal state machines, using respectively
|
|
- * SRC or SRD bit of SYSCTL register
|
|
- * Can be called from interrupt context
|
|
- */
|
|
-static inline void mmc_omap_reset_controller_fsm(struct mmc_omap_host *host,
|
|
- unsigned long bit)
|
|
-{
|
|
- unsigned long i = 0;
|
|
- unsigned long limit = (loops_per_jiffy *
|
|
- msecs_to_jiffies(MMC_TIMEOUT_MS));
|
|
-
|
|
- OMAP_HSMMC_WRITE(host->base, SYSCTL,
|
|
- OMAP_HSMMC_READ(host->base, SYSCTL) | bit);
|
|
-
|
|
- while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) &&
|
|
- (i++ < limit))
|
|
- cpu_relax();
|
|
-
|
|
- if (OMAP_HSMMC_READ(host->base, SYSCTL) & bit)
|
|
- dev_err(mmc_dev(host->mmc),
|
|
- "Timeout waiting on controller reset in %s\n",
|
|
- __func__);
|
|
-}
|
|
|
|
/*
|
|
* MMC controller IRQ handler
|
|
@@ -430,17 +403,21 @@
|
|
(status & CMD_CRC)) {
|
|
if (host->cmd) {
|
|
if (status & CMD_TIMEOUT) {
|
|
- mmc_omap_reset_controller_fsm(host, SRC);
|
|
+ OMAP_HSMMC_WRITE(host->base, SYSCTL,
|
|
+ OMAP_HSMMC_READ(host->base,
|
|
+ SYSCTL) | SRC);
|
|
+ while (OMAP_HSMMC_READ(host->base,
|
|
+ SYSCTL) & SRC)
|
|
+ ;
|
|
+
|
|
host->cmd->error = -ETIMEDOUT;
|
|
} else {
|
|
host->cmd->error = -EILSEQ;
|
|
}
|
|
end_cmd = 1;
|
|
}
|
|
- if (host->data) {
|
|
+ if (host->data)
|
|
mmc_dma_cleanup(host);
|
|
- mmc_omap_reset_controller_fsm(host, SRD);
|
|
- }
|
|
}
|
|
if ((status & DATA_TIMEOUT) ||
|
|
(status & DATA_CRC)) {
|
|
@@ -449,7 +426,12 @@
|
|
mmc_dma_cleanup(host);
|
|
else
|
|
host->data->error = -EILSEQ;
|
|
- mmc_omap_reset_controller_fsm(host, SRD);
|
|
+ OMAP_HSMMC_WRITE(host->base, SYSCTL,
|
|
+ OMAP_HSMMC_READ(host->base,
|
|
+ SYSCTL) | SRD);
|
|
+ while (OMAP_HSMMC_READ(host->base,
|
|
+ SYSCTL) & SRD)
|
|
+ ;
|
|
end_trans = 1;
|
|
}
|
|
}
|
|
@@ -474,20 +456,13 @@
|
|
}
|
|
|
|
/*
|
|
- * Switch MMC interface voltage ... only relevant for MMC1.
|
|
- *
|
|
- * MMC2 and MMC3 use fixed 1.8V levels, and maybe a transceiver.
|
|
- * The MMC2 transceiver controls are used instead of DAT4..DAT7.
|
|
- * Some chips, like eMMC ones, use internal transceivers.
|
|
+ * Switch MMC operating voltage
|
|
*/
|
|
static int omap_mmc_switch_opcond(struct mmc_omap_host *host, int vdd)
|
|
{
|
|
u32 reg_val = 0;
|
|
int ret;
|
|
|
|
- if (host->id != OMAP_MMC1_DEVID)
|
|
- return 0;
|
|
-
|
|
/* Disable the clocks */
|
|
clk_disable(host->fclk);
|
|
clk_disable(host->iclk);
|
|
@@ -510,26 +485,19 @@
|
|
OMAP_HSMMC_WRITE(host->base, HCTL,
|
|
OMAP_HSMMC_READ(host->base, HCTL) & SDVSCLR);
|
|
reg_val = OMAP_HSMMC_READ(host->base, HCTL);
|
|
-
|
|
/*
|
|
* If a MMC dual voltage card is detected, the set_ios fn calls
|
|
* this fn with VDD bit set for 1.8V. Upon card removal from the
|
|
* slot, omap_mmc_set_ios sets the VDD back to 3V on MMC_POWER_OFF.
|
|
*
|
|
- * Cope with a bit of slop in the range ... per data sheets:
|
|
- * - "1.8V" for vdds_mmc1/vdds_mmc1a can be up to 2.45V max,
|
|
- * but recommended values are 1.71V to 1.89V
|
|
- * - "3.0V" for vdds_mmc1/vdds_mmc1a can be up to 3.5V max,
|
|
- * but recommended values are 2.7V to 3.3V
|
|
- *
|
|
- * Board setup code shouldn't permit anything very out-of-range.
|
|
- * TWL4030-family VMMC1 and VSIM regulators are fine (avoiding the
|
|
- * middle range) but VSIM can't power DAT4..DAT7 at more than 3V.
|
|
+ * Only MMC1 supports 3.0V. MMC2 will not function if SDVS30 is
|
|
+ * set in HCTL.
|
|
*/
|
|
- if ((1 << vdd) <= MMC_VDD_23_24)
|
|
- reg_val |= SDVS18;
|
|
- else
|
|
+ if (host->id == OMAP_MMC1_DEVID && (((1 << vdd) == MMC_VDD_32_33) ||
|
|
+ ((1 << vdd) == MMC_VDD_33_34)))
|
|
reg_val |= SDVS30;
|
|
+ if ((1 << vdd) == MMC_VDD_165_195)
|
|
+ reg_val |= SDVS18;
|
|
|
|
OMAP_HSMMC_WRITE(host->base, HCTL, reg_val);
|
|
|
|
@@ -549,15 +517,16 @@
|
|
{
|
|
struct mmc_omap_host *host = container_of(work, struct mmc_omap_host,
|
|
mmc_carddetect_work);
|
|
- struct omap_mmc_slot_data *slot = &mmc_slot(host);
|
|
-
|
|
- host->carddetect = slot->card_detect(slot->card_detect_irq);
|
|
|
|
sysfs_notify(&host->mmc->class_dev.kobj, NULL, "cover_switch");
|
|
if (host->carddetect) {
|
|
mmc_detect_change(host->mmc, (HZ * 200) / 1000);
|
|
} else {
|
|
- mmc_omap_reset_controller_fsm(host, SRD);
|
|
+ OMAP_HSMMC_WRITE(host->base, SYSCTL,
|
|
+ OMAP_HSMMC_READ(host->base, SYSCTL) | SRD);
|
|
+ while (OMAP_HSMMC_READ(host->base, SYSCTL) & SRD)
|
|
+ ;
|
|
+
|
|
mmc_detect_change(host->mmc, (HZ * 50) / 1000);
|
|
}
|
|
}
|
|
@@ -569,6 +538,7 @@
|
|
{
|
|
struct mmc_omap_host *host = (struct mmc_omap_host *)dev_id;
|
|
|
|
+ host->carddetect = mmc_slot(host).card_detect(irq);
|
|
schedule_work(&host->mmc_carddetect_work);
|
|
|
|
return IRQ_HANDLED;
|
|
@@ -787,14 +757,10 @@
|
|
case MMC_POWER_OFF:
|
|
mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0);
|
|
/*
|
|
- * Reset interface voltage to 3V if it's 1.8V now;
|
|
- * only relevant on MMC-1, the others always use 1.8V.
|
|
- *
|
|
+ * Reset bus voltage to 3V if it got set to 1.8V earlier.
|
|
* REVISIT: If we are able to detect cards after unplugging
|
|
* a 1.8V card, this code should not be needed.
|
|
*/
|
|
- if (host->id != OMAP_MMC1_DEVID)
|
|
- break;
|
|
if (!(OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET)) {
|
|
int vdd = fls(host->mmc->ocr_avail) - 1;
|
|
if (omap_mmc_switch_opcond(host, vdd) != 0)
|
|
@@ -818,9 +784,7 @@
|
|
}
|
|
|
|
if (host->id == OMAP_MMC1_DEVID) {
|
|
- /* Only MMC1 can interface at 3V without some flavor
|
|
- * of external transceiver; but they all handle 1.8V.
|
|
- */
|
|
+ /* Only MMC1 can operate at 3V/1.8V */
|
|
if ((OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET) &&
|
|
(ios->vdd == DUAL_VOLT_OCR_BIT)) {
|
|
/*
|
|
@@ -1173,9 +1137,7 @@
|
|
" level suspend\n");
|
|
}
|
|
|
|
- if (host->id == OMAP_MMC1_DEVID
|
|
- && !(OMAP_HSMMC_READ(host->base, HCTL)
|
|
- & SDVSDET)) {
|
|
+ if (!(OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET)) {
|
|
OMAP_HSMMC_WRITE(host->base, HCTL,
|
|
OMAP_HSMMC_READ(host->base, HCTL)
|
|
& SDVSCLR);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/pxamci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/pxamci.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/pxamci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/pxamci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -180,15 +180,7 @@
|
|
else
|
|
DALGN &= ~(1 << host->dma);
|
|
DDADR(host->dma) = host->sg_dma;
|
|
-
|
|
- /*
|
|
- * workaround for erratum #91:
|
|
- * only start DMA now if we are doing a read,
|
|
- * otherwise we wait until CMD/RESP has finished
|
|
- * before starting DMA.
|
|
- */
|
|
- if (!cpu_is_pxa27x() || data->flags & MMC_DATA_READ)
|
|
- DCSR(host->dma) = DCSR_RUN;
|
|
+ DCSR(host->dma) = DCSR_RUN;
|
|
}
|
|
|
|
static void pxamci_start_cmd(struct pxamci_host *host, struct mmc_command *cmd, unsigned int cmdat)
|
|
@@ -259,28 +251,23 @@
|
|
if (stat & STAT_TIME_OUT_RESPONSE) {
|
|
cmd->error = -ETIMEDOUT;
|
|
} else if (stat & STAT_RES_CRC_ERR && cmd->flags & MMC_RSP_CRC) {
|
|
+#ifdef CONFIG_PXA27x
|
|
/*
|
|
* workaround for erratum #42:
|
|
* Intel PXA27x Family Processor Specification Update Rev 001
|
|
* A bogus CRC error can appear if the msb of a 136 bit
|
|
* response is a one.
|
|
*/
|
|
- if (cpu_is_pxa27x() &&
|
|
- (cmd->flags & MMC_RSP_136 && cmd->resp[0] & 0x80000000))
|
|
+ if (cmd->flags & MMC_RSP_136 && cmd->resp[0] & 0x80000000) {
|
|
pr_debug("ignoring CRC from command %d - *risky*\n", cmd->opcode);
|
|
- else
|
|
- cmd->error = -EILSEQ;
|
|
+ } else
|
|
+#endif
|
|
+ cmd->error = -EILSEQ;
|
|
}
|
|
|
|
pxamci_disable_irq(host, END_CMD_RES);
|
|
if (host->data && !cmd->error) {
|
|
pxamci_enable_irq(host, DATA_TRAN_DONE);
|
|
- /*
|
|
- * workaround for erratum #91, if doing write
|
|
- * enable DMA late
|
|
- */
|
|
- if (cpu_is_pxa27x() && host->data->flags & MMC_DATA_WRITE)
|
|
- DCSR(host->dma) = DCSR_RUN;
|
|
} else {
|
|
pxamci_finish_request(host, host->mrq);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/ricoh_mmc.c linux-2.6.29-rc3.owrt/drivers/mmc/host/ricoh_mmc.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/ricoh_mmc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/ricoh_mmc.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -196,7 +196,7 @@
|
|
pci_set_drvdata(pdev, NULL);
|
|
}
|
|
|
|
-static int ricoh_mmc_suspend_late(struct pci_dev *pdev, pm_message_t state)
|
|
+static int ricoh_mmc_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
{
|
|
struct pci_dev *fw_dev = NULL;
|
|
|
|
@@ -210,7 +210,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-static int ricoh_mmc_resume_early(struct pci_dev *pdev)
|
|
+static int ricoh_mmc_resume(struct pci_dev *pdev)
|
|
{
|
|
struct pci_dev *fw_dev = NULL;
|
|
|
|
@@ -229,8 +229,8 @@
|
|
.id_table = pci_ids,
|
|
.probe = ricoh_mmc_probe,
|
|
.remove = __devexit_p(ricoh_mmc_remove),
|
|
- .suspend_late = ricoh_mmc_suspend_late,
|
|
- .resume_early = ricoh_mmc_resume_early,
|
|
+ .suspend = ricoh_mmc_suspend,
|
|
+ .resume = ricoh_mmc_resume,
|
|
};
|
|
|
|
/*****************************************************************************\
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/s3cmci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/s3cmci.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/s3cmci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/s3cmci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -329,7 +329,7 @@
|
|
|
|
to_ptr = host->base + host->sdidata;
|
|
|
|
- while ((fifo = fifo_free(host)) > 3) {
|
|
+ while ((fifo = fifo_free(host))) {
|
|
if (!host->pio_bytes) {
|
|
res = get_data_buffer(host, &host->pio_bytes,
|
|
&host->pio_ptr);
|
|
@@ -793,7 +793,8 @@
|
|
host->mem->start + host->sdidata);
|
|
|
|
if (!setup_ok) {
|
|
- s3c2410_dma_config(host->dma, 4, 0);
|
|
+ s3c2410_dma_config(host->dma, 4,
|
|
+ (S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI));
|
|
s3c2410_dma_set_buffdone_fn(host->dma,
|
|
s3cmci_dma_done_callback);
|
|
s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/sdhci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/sdhci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1291,11 +1291,8 @@
|
|
if (host->cmd->data)
|
|
DBG("Cannot wait for busy signal when also "
|
|
"doing a data transfer");
|
|
- else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ))
|
|
+ else
|
|
return;
|
|
-
|
|
- /* The controller does not support the end-of-busy IRQ,
|
|
- * fall through and take the SDHCI_INT_RESPONSE */
|
|
}
|
|
|
|
if (intmask & SDHCI_INT_RESPONSE)
|
|
@@ -1639,7 +1636,8 @@
|
|
mmc->f_max = host->max_clk;
|
|
mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
|
|
|
|
- if (caps & SDHCI_CAN_DO_HISPD)
|
|
+ if ((caps & SDHCI_CAN_DO_HISPD) ||
|
|
+ (host->quirks & SDHCI_QUIRK_FORCE_HIGHSPEED))
|
|
mmc->caps |= MMC_CAP_SD_HIGHSPEED;
|
|
|
|
mmc->ocr_avail = 0;
|
|
@@ -1725,9 +1723,7 @@
|
|
#endif
|
|
|
|
#ifdef SDHCI_USE_LEDS_CLASS
|
|
- snprintf(host->led_name, sizeof(host->led_name),
|
|
- "%s::", mmc_hostname(mmc));
|
|
- host->led.name = host->led_name;
|
|
+ host->led.name = mmc_hostname(mmc);
|
|
host->led.brightness = LED_OFF;
|
|
host->led.default_trigger = mmc_hostname(mmc);
|
|
host->led.brightness_set = sdhci_led_control;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/sdhci.h linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.h
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/sdhci.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -208,8 +208,8 @@
|
|
#define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12)
|
|
/* Controller has an issue with buffer bits for small transfers */
|
|
#define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
|
|
-/* Controller does not provide transfer-complete interrupt when not busy */
|
|
-#define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14)
|
|
+/* Controller supports high speed but doesn't have the caps bit set */
|
|
+#define SDHCI_QUIRK_FORCE_HIGHSPEED (1<<14)
|
|
|
|
int irq; /* Device IRQ */
|
|
void __iomem * ioaddr; /* Mapped address */
|
|
@@ -222,7 +222,6 @@
|
|
|
|
#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
|
|
struct led_classdev led; /* LED control */
|
|
- char led_name[32];
|
|
#endif
|
|
|
|
spinlock_t lock; /* Mutex */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mmc/host/sdhci-pci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci-pci.c
|
|
--- linux-2.6.29.owrt/drivers/mmc/host/sdhci-pci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci-pci.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -107,7 +107,6 @@
|
|
|
|
static const struct sdhci_pci_fixes sdhci_cafe = {
|
|
.quirks = SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER |
|
|
- SDHCI_QUIRK_NO_BUSY_IRQ |
|
|
SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
|
|
};
|
|
|
|
@@ -145,7 +144,8 @@
|
|
SDHCI_QUIRK_32BIT_DMA_SIZE |
|
|
SDHCI_QUIRK_32BIT_ADMA_SIZE |
|
|
SDHCI_QUIRK_RESET_AFTER_REQUEST |
|
|
- SDHCI_QUIRK_BROKEN_SMALL_PIO;
|
|
+ SDHCI_QUIRK_BROKEN_SMALL_PIO |
|
|
+ SDHCI_QUIRK_FORCE_HIGHSPEED;
|
|
}
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/chips/map_rom.c linux-2.6.29-rc3.owrt/drivers/mtd/chips/map_rom.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/chips/map_rom.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/chips/map_rom.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
static int maprom_write (struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
|
|
static void maprom_nop (struct mtd_info *);
|
|
static struct mtd_info *map_rom_probe(struct map_info *map);
|
|
-static int maprom_erase (struct mtd_info *mtd, struct erase_info *info);
|
|
|
|
static struct mtd_chip_driver maprom_chipdrv = {
|
|
.probe = map_rom_probe,
|
|
@@ -43,7 +42,6 @@
|
|
mtd->read = maprom_read;
|
|
mtd->write = maprom_write;
|
|
mtd->sync = maprom_nop;
|
|
- mtd->erase = maprom_erase;
|
|
mtd->flags = MTD_CAP_ROM;
|
|
mtd->erasesize = map->size;
|
|
mtd->writesize = 1;
|
|
@@ -73,12 +71,6 @@
|
|
return -EIO;
|
|
}
|
|
|
|
-static int maprom_erase (struct mtd_info *mtd, struct erase_info *info)
|
|
-{
|
|
- /* We do our best 8) */
|
|
- return -EROFS;
|
|
-}
|
|
-
|
|
static int __init map_rom_init(void)
|
|
{
|
|
register_mtd_chip_driver(&maprom_chipdrv);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/devices/Kconfig linux-2.6.29-rc3.owrt/drivers/mtd/devices/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/mtd/devices/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -120,6 +120,13 @@
|
|
doesn't have access to, memory beyond the mem=xxx limit, nvram,
|
|
memory on the video card, etc...
|
|
|
|
+config MTD_PS3VRAM
|
|
+ tristate "PS3 video RAM"
|
|
+ depends on FB_PS3
|
|
+ help
|
|
+ This driver allows you to use excess PS3 video RAM as volatile
|
|
+ storage or system swap.
|
|
+
|
|
config MTD_LART
|
|
tristate "28F160xx flash driver for LART"
|
|
depends on SA1100_LART
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/devices/Makefile linux-2.6.29-rc3.owrt/drivers/mtd/devices/Makefile
|
|
--- linux-2.6.29.owrt/drivers/mtd/devices/Makefile 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -16,3 +16,4 @@
|
|
obj-$(CONFIG_MTD_BLOCK2MTD) += block2mtd.o
|
|
obj-$(CONFIG_MTD_DATAFLASH) += mtd_dataflash.o
|
|
obj-$(CONFIG_MTD_M25P80) += m25p80.o
|
|
+obj-$(CONFIG_MTD_PS3VRAM) += ps3vram.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/devices/mtd_dataflash.c linux-2.6.29-rc3.owrt/drivers/mtd/devices/mtd_dataflash.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/devices/mtd_dataflash.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/mtd_dataflash.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -821,8 +821,7 @@
|
|
if (!(info->flags & IS_POW2PS))
|
|
return info;
|
|
}
|
|
- } else
|
|
- return info;
|
|
+ }
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/devices/ps3vram.c linux-2.6.29-rc3.owrt/drivers/mtd/devices/ps3vram.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/devices/ps3vram.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/ps3vram.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -0,0 +1,768 @@
|
|
+/**
|
|
+ * ps3vram - Use extra PS3 video ram as MTD block device.
|
|
+ *
|
|
+ * Copyright (c) 2007-2008 Jim Paris <jim@jtan.com>
|
|
+ * Added support RSX DMA Vivien Chappelier <vivien.chappelier@free.fr>
|
|
+ */
|
|
+
|
|
+#include <linux/io.h>
|
|
+#include <linux/mm.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/list.h>
|
|
+#include <linux/module.h>
|
|
+#include <linux/moduleparam.h>
|
|
+#include <linux/slab.h>
|
|
+#include <linux/version.h>
|
|
+#include <linux/gfp.h>
|
|
+#include <linux/delay.h>
|
|
+#include <linux/mtd/mtd.h>
|
|
+
|
|
+#include <asm/lv1call.h>
|
|
+#include <asm/ps3.h>
|
|
+
|
|
+#define DEVICE_NAME "ps3vram"
|
|
+
|
|
+#define XDR_BUF_SIZE (2 * 1024 * 1024) /* XDR buffer (must be 1MiB aligned) */
|
|
+#define XDR_IOIF 0x0c000000
|
|
+
|
|
+#define FIFO_BASE XDR_IOIF
|
|
+#define FIFO_SIZE (64 * 1024)
|
|
+
|
|
+#define DMA_PAGE_SIZE (4 * 1024)
|
|
+
|
|
+#define CACHE_PAGE_SIZE (256 * 1024)
|
|
+#define CACHE_PAGE_COUNT ((XDR_BUF_SIZE - FIFO_SIZE) / CACHE_PAGE_SIZE)
|
|
+
|
|
+#define CACHE_OFFSET CACHE_PAGE_SIZE
|
|
+#define FIFO_OFFSET 0
|
|
+
|
|
+#define CTRL_PUT 0x10
|
|
+#define CTRL_GET 0x11
|
|
+#define CTRL_TOP 0x15
|
|
+
|
|
+#define UPLOAD_SUBCH 1
|
|
+#define DOWNLOAD_SUBCH 2
|
|
+
|
|
+#define NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN 0x0000030c
|
|
+#define NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY 0x00000104
|
|
+
|
|
+#define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT 0x601
|
|
+
|
|
+struct mtd_info ps3vram_mtd;
|
|
+
|
|
+#define CACHE_PAGE_PRESENT 1
|
|
+#define CACHE_PAGE_DIRTY 2
|
|
+
|
|
+struct ps3vram_tag {
|
|
+ unsigned int address;
|
|
+ unsigned int flags;
|
|
+};
|
|
+
|
|
+struct ps3vram_cache {
|
|
+ unsigned int page_count;
|
|
+ unsigned int page_size;
|
|
+ struct ps3vram_tag *tags;
|
|
+};
|
|
+
|
|
+struct ps3vram_priv {
|
|
+ u64 memory_handle;
|
|
+ u64 context_handle;
|
|
+ u32 *ctrl;
|
|
+ u32 *reports;
|
|
+ u8 __iomem *ddr_base;
|
|
+ u8 *xdr_buf;
|
|
+
|
|
+ u32 *fifo_base;
|
|
+ u32 *fifo_ptr;
|
|
+
|
|
+ struct device *dev;
|
|
+ struct ps3vram_cache cache;
|
|
+
|
|
+ /* Used to serialize cache/DMA operations */
|
|
+ struct mutex lock;
|
|
+};
|
|
+
|
|
+#define DMA_NOTIFIER_HANDLE_BASE 0x66604200 /* first DMA notifier handle */
|
|
+#define DMA_NOTIFIER_OFFSET_BASE 0x1000 /* first DMA notifier offset */
|
|
+#define DMA_NOTIFIER_SIZE 0x40
|
|
+#define NOTIFIER 7 /* notifier used for completion report */
|
|
+
|
|
+/* A trailing '-' means to subtract off ps3fb_videomemory.size */
|
|
+char *size = "256M-";
|
|
+module_param(size, charp, 0);
|
|
+MODULE_PARM_DESC(size, "memory size");
|
|
+
|
|
+static u32 *ps3vram_get_notifier(u32 *reports, int notifier)
|
|
+{
|
|
+ return (void *) reports +
|
|
+ DMA_NOTIFIER_OFFSET_BASE +
|
|
+ DMA_NOTIFIER_SIZE * notifier;
|
|
+}
|
|
+
|
|
+static void ps3vram_notifier_reset(struct mtd_info *mtd)
|
|
+{
|
|
+ int i;
|
|
+
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
|
|
+ for (i = 0; i < 4; i++)
|
|
+ notify[i] = 0xffffffff;
|
|
+}
|
|
+
|
|
+static int ps3vram_notifier_wait(struct mtd_info *mtd, unsigned int timeout_ms)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
|
|
+ unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
|
|
+
|
|
+ do {
|
|
+ if (!notify[3])
|
|
+ return 0;
|
|
+ msleep(1);
|
|
+ } while (time_before(jiffies, timeout));
|
|
+
|
|
+ return -ETIMEDOUT;
|
|
+}
|
|
+
|
|
+static void ps3vram_init_ring(struct mtd_info *mtd)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+
|
|
+ priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET;
|
|
+ priv->ctrl[CTRL_GET] = FIFO_BASE + FIFO_OFFSET;
|
|
+}
|
|
+
|
|
+static int ps3vram_wait_ring(struct mtd_info *mtd, unsigned int timeout_ms)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
|
|
+
|
|
+ do {
|
|
+ if (priv->ctrl[CTRL_PUT] == priv->ctrl[CTRL_GET])
|
|
+ return 0;
|
|
+ msleep(1);
|
|
+ } while (time_before(jiffies, timeout));
|
|
+
|
|
+ dev_dbg(priv->dev, "%s:%d: FIFO timeout (%08x/%08x/%08x)\n", __func__,
|
|
+ __LINE__, priv->ctrl[CTRL_PUT], priv->ctrl[CTRL_GET],
|
|
+ priv->ctrl[CTRL_TOP]);
|
|
+
|
|
+ return -ETIMEDOUT;
|
|
+}
|
|
+
|
|
+static void ps3vram_out_ring(struct ps3vram_priv *priv, u32 data)
|
|
+{
|
|
+ *(priv->fifo_ptr)++ = data;
|
|
+}
|
|
+
|
|
+static void ps3vram_begin_ring(struct ps3vram_priv *priv, u32 chan,
|
|
+ u32 tag, u32 size)
|
|
+{
|
|
+ ps3vram_out_ring(priv, (size << 18) | (chan << 13) | tag);
|
|
+}
|
|
+
|
|
+static void ps3vram_rewind_ring(struct mtd_info *mtd)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ u64 status;
|
|
+
|
|
+ ps3vram_out_ring(priv, 0x20000000 | (FIFO_BASE + FIFO_OFFSET));
|
|
+
|
|
+ priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET;
|
|
+
|
|
+ /* asking the HV for a blit will kick the fifo */
|
|
+ status = lv1_gpu_context_attribute(priv->context_handle,
|
|
+ L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT,
|
|
+ 0, 0, 0, 0);
|
|
+ if (status)
|
|
+ dev_err(priv->dev, "%s:%d: lv1_gpu_context_attribute failed\n",
|
|
+ __func__, __LINE__);
|
|
+
|
|
+ priv->fifo_ptr = priv->fifo_base;
|
|
+}
|
|
+
|
|
+static void ps3vram_fire_ring(struct mtd_info *mtd)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ u64 status;
|
|
+
|
|
+ mutex_lock(&ps3_gpu_mutex);
|
|
+
|
|
+ priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET +
|
|
+ (priv->fifo_ptr - priv->fifo_base) * sizeof(u32);
|
|
+
|
|
+ /* asking the HV for a blit will kick the fifo */
|
|
+ status = lv1_gpu_context_attribute(priv->context_handle,
|
|
+ L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT,
|
|
+ 0, 0, 0, 0);
|
|
+ if (status)
|
|
+ dev_err(priv->dev, "%s:%d: lv1_gpu_context_attribute failed\n",
|
|
+ __func__, __LINE__);
|
|
+
|
|
+ if ((priv->fifo_ptr - priv->fifo_base) * sizeof(u32) >
|
|
+ FIFO_SIZE - 1024) {
|
|
+ dev_dbg(priv->dev, "%s:%d: fifo full, rewinding\n", __func__,
|
|
+ __LINE__);
|
|
+ ps3vram_wait_ring(mtd, 200);
|
|
+ ps3vram_rewind_ring(mtd);
|
|
+ }
|
|
+
|
|
+ mutex_unlock(&ps3_gpu_mutex);
|
|
+}
|
|
+
|
|
+static void ps3vram_bind(struct mtd_info *mtd)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+
|
|
+ ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0, 1);
|
|
+ ps3vram_out_ring(priv, 0x31337303);
|
|
+ ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x180, 3);
|
|
+ ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER);
|
|
+ ps3vram_out_ring(priv, 0xfeed0001); /* DMA system RAM instance */
|
|
+ ps3vram_out_ring(priv, 0xfeed0000); /* DMA video RAM instance */
|
|
+
|
|
+ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0, 1);
|
|
+ ps3vram_out_ring(priv, 0x3137c0de);
|
|
+ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x180, 3);
|
|
+ ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER);
|
|
+ ps3vram_out_ring(priv, 0xfeed0000); /* DMA video RAM instance */
|
|
+ ps3vram_out_ring(priv, 0xfeed0001); /* DMA system RAM instance */
|
|
+
|
|
+ ps3vram_fire_ring(mtd);
|
|
+}
|
|
+
|
|
+static int ps3vram_upload(struct mtd_info *mtd, unsigned int src_offset,
|
|
+ unsigned int dst_offset, int len, int count)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+
|
|
+ ps3vram_begin_ring(priv, UPLOAD_SUBCH,
|
|
+ NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
|
|
+ ps3vram_out_ring(priv, XDR_IOIF + src_offset);
|
|
+ ps3vram_out_ring(priv, dst_offset);
|
|
+ ps3vram_out_ring(priv, len);
|
|
+ ps3vram_out_ring(priv, len);
|
|
+ ps3vram_out_ring(priv, len);
|
|
+ ps3vram_out_ring(priv, count);
|
|
+ ps3vram_out_ring(priv, (1 << 8) | 1);
|
|
+ ps3vram_out_ring(priv, 0);
|
|
+
|
|
+ ps3vram_notifier_reset(mtd);
|
|
+ ps3vram_begin_ring(priv, UPLOAD_SUBCH,
|
|
+ NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1);
|
|
+ ps3vram_out_ring(priv, 0);
|
|
+ ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x100, 1);
|
|
+ ps3vram_out_ring(priv, 0);
|
|
+ ps3vram_fire_ring(mtd);
|
|
+ if (ps3vram_notifier_wait(mtd, 200) < 0) {
|
|
+ dev_dbg(priv->dev, "%s:%d: notifier timeout\n", __func__,
|
|
+ __LINE__);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int ps3vram_download(struct mtd_info *mtd, unsigned int src_offset,
|
|
+ unsigned int dst_offset, int len, int count)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+
|
|
+ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH,
|
|
+ NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
|
|
+ ps3vram_out_ring(priv, src_offset);
|
|
+ ps3vram_out_ring(priv, XDR_IOIF + dst_offset);
|
|
+ ps3vram_out_ring(priv, len);
|
|
+ ps3vram_out_ring(priv, len);
|
|
+ ps3vram_out_ring(priv, len);
|
|
+ ps3vram_out_ring(priv, count);
|
|
+ ps3vram_out_ring(priv, (1 << 8) | 1);
|
|
+ ps3vram_out_ring(priv, 0);
|
|
+
|
|
+ ps3vram_notifier_reset(mtd);
|
|
+ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH,
|
|
+ NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1);
|
|
+ ps3vram_out_ring(priv, 0);
|
|
+ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x100, 1);
|
|
+ ps3vram_out_ring(priv, 0);
|
|
+ ps3vram_fire_ring(mtd);
|
|
+ if (ps3vram_notifier_wait(mtd, 200) < 0) {
|
|
+ dev_dbg(priv->dev, "%s:%d: notifier timeout\n", __func__,
|
|
+ __LINE__);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void ps3vram_cache_evict(struct mtd_info *mtd, int entry)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ struct ps3vram_cache *cache = &priv->cache;
|
|
+
|
|
+ if (cache->tags[entry].flags & CACHE_PAGE_DIRTY) {
|
|
+ dev_dbg(priv->dev, "%s:%d: flushing %d : 0x%08x\n", __func__,
|
|
+ __LINE__, entry, cache->tags[entry].address);
|
|
+ if (ps3vram_upload(mtd,
|
|
+ CACHE_OFFSET + entry * cache->page_size,
|
|
+ cache->tags[entry].address,
|
|
+ DMA_PAGE_SIZE,
|
|
+ cache->page_size / DMA_PAGE_SIZE) < 0) {
|
|
+ dev_dbg(priv->dev, "%s:%d: failed to upload from "
|
|
+ "0x%x to 0x%x size 0x%x\n", __func__, __LINE__,
|
|
+ entry * cache->page_size,
|
|
+ cache->tags[entry].address, cache->page_size);
|
|
+ }
|
|
+ cache->tags[entry].flags &= ~CACHE_PAGE_DIRTY;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void ps3vram_cache_load(struct mtd_info *mtd, int entry,
|
|
+ unsigned int address)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ struct ps3vram_cache *cache = &priv->cache;
|
|
+
|
|
+ dev_dbg(priv->dev, "%s:%d: fetching %d : 0x%08x\n", __func__, __LINE__,
|
|
+ entry, address);
|
|
+ if (ps3vram_download(mtd,
|
|
+ address,
|
|
+ CACHE_OFFSET + entry * cache->page_size,
|
|
+ DMA_PAGE_SIZE,
|
|
+ cache->page_size / DMA_PAGE_SIZE) < 0) {
|
|
+ dev_err(priv->dev, "%s:%d: failed to download from "
|
|
+ "0x%x to 0x%x size 0x%x\n", __func__, __LINE__, address,
|
|
+ entry * cache->page_size, cache->page_size);
|
|
+ }
|
|
+
|
|
+ cache->tags[entry].address = address;
|
|
+ cache->tags[entry].flags |= CACHE_PAGE_PRESENT;
|
|
+}
|
|
+
|
|
+
|
|
+static void ps3vram_cache_flush(struct mtd_info *mtd)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ struct ps3vram_cache *cache = &priv->cache;
|
|
+ int i;
|
|
+
|
|
+ dev_dbg(priv->dev, "%s:%d: FLUSH\n", __func__, __LINE__);
|
|
+ for (i = 0; i < cache->page_count; i++) {
|
|
+ ps3vram_cache_evict(mtd, i);
|
|
+ cache->tags[i].flags = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
+static unsigned int ps3vram_cache_match(struct mtd_info *mtd, loff_t address)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ struct ps3vram_cache *cache = &priv->cache;
|
|
+ unsigned int base;
|
|
+ unsigned int offset;
|
|
+ int i;
|
|
+ static int counter;
|
|
+
|
|
+ offset = (unsigned int) (address & (cache->page_size - 1));
|
|
+ base = (unsigned int) (address - offset);
|
|
+
|
|
+ /* fully associative check */
|
|
+ for (i = 0; i < cache->page_count; i++) {
|
|
+ if ((cache->tags[i].flags & CACHE_PAGE_PRESENT) &&
|
|
+ cache->tags[i].address == base) {
|
|
+ dev_dbg(priv->dev, "%s:%d: found entry %d : 0x%08x\n",
|
|
+ __func__, __LINE__, i, cache->tags[i].address);
|
|
+ return i;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* choose a random entry */
|
|
+ i = (jiffies + (counter++)) % cache->page_count;
|
|
+ dev_dbg(priv->dev, "%s:%d: using entry %d\n", __func__, __LINE__, i);
|
|
+
|
|
+ ps3vram_cache_evict(mtd, i);
|
|
+ ps3vram_cache_load(mtd, i, base);
|
|
+
|
|
+ return i;
|
|
+}
|
|
+
|
|
+static int ps3vram_cache_init(struct mtd_info *mtd)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+
|
|
+ priv->cache.page_count = CACHE_PAGE_COUNT;
|
|
+ priv->cache.page_size = CACHE_PAGE_SIZE;
|
|
+ priv->cache.tags = kzalloc(sizeof(struct ps3vram_tag) *
|
|
+ CACHE_PAGE_COUNT, GFP_KERNEL);
|
|
+ if (priv->cache.tags == NULL) {
|
|
+ dev_err(priv->dev, "%s:%d: could not allocate cache tags\n",
|
|
+ __func__, __LINE__);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
+ dev_info(priv->dev, "created ram cache: %d entries, %d KiB each\n",
|
|
+ CACHE_PAGE_COUNT, CACHE_PAGE_SIZE / 1024);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void ps3vram_cache_cleanup(struct mtd_info *mtd)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+
|
|
+ ps3vram_cache_flush(mtd);
|
|
+ kfree(priv->cache.tags);
|
|
+}
|
|
+
|
|
+static int ps3vram_erase(struct mtd_info *mtd, struct erase_info *instr)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+
|
|
+ if (instr->addr + instr->len > mtd->size)
|
|
+ return -EINVAL;
|
|
+
|
|
+ mutex_lock(&priv->lock);
|
|
+
|
|
+ ps3vram_cache_flush(mtd);
|
|
+
|
|
+ /* Set bytes to 0xFF */
|
|
+ memset_io(priv->ddr_base + instr->addr, 0xFF, instr->len);
|
|
+
|
|
+ mutex_unlock(&priv->lock);
|
|
+
|
|
+ instr->state = MTD_ERASE_DONE;
|
|
+ mtd_erase_callback(instr);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int ps3vram_read(struct mtd_info *mtd, loff_t from, size_t len,
|
|
+ size_t *retlen, u_char *buf)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ unsigned int cached, count;
|
|
+
|
|
+ dev_dbg(priv->dev, "%s:%d: from=0x%08x len=0x%zx\n", __func__, __LINE__,
|
|
+ (unsigned int)from, len);
|
|
+
|
|
+ if (from >= mtd->size)
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (len > mtd->size - from)
|
|
+ len = mtd->size - from;
|
|
+
|
|
+ /* Copy from vram to buf */
|
|
+ count = len;
|
|
+ while (count) {
|
|
+ unsigned int offset, avail;
|
|
+ unsigned int entry;
|
|
+
|
|
+ offset = (unsigned int) (from & (priv->cache.page_size - 1));
|
|
+ avail = priv->cache.page_size - offset;
|
|
+
|
|
+ mutex_lock(&priv->lock);
|
|
+
|
|
+ entry = ps3vram_cache_match(mtd, from);
|
|
+ cached = CACHE_OFFSET + entry * priv->cache.page_size + offset;
|
|
+
|
|
+ dev_dbg(priv->dev, "%s:%d: from=%08x cached=%08x offset=%08x "
|
|
+ "avail=%08x count=%08x\n", __func__, __LINE__,
|
|
+ (unsigned int)from, cached, offset, avail, count);
|
|
+
|
|
+ if (avail > count)
|
|
+ avail = count;
|
|
+ memcpy(buf, priv->xdr_buf + cached, avail);
|
|
+
|
|
+ mutex_unlock(&priv->lock);
|
|
+
|
|
+ buf += avail;
|
|
+ count -= avail;
|
|
+ from += avail;
|
|
+ }
|
|
+
|
|
+ *retlen = len;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int ps3vram_write(struct mtd_info *mtd, loff_t to, size_t len,
|
|
+ size_t *retlen, const u_char *buf)
|
|
+{
|
|
+ struct ps3vram_priv *priv = mtd->priv;
|
|
+ unsigned int cached, count;
|
|
+
|
|
+ if (to >= mtd->size)
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (len > mtd->size - to)
|
|
+ len = mtd->size - to;
|
|
+
|
|
+ /* Copy from buf to vram */
|
|
+ count = len;
|
|
+ while (count) {
|
|
+ unsigned int offset, avail;
|
|
+ unsigned int entry;
|
|
+
|
|
+ offset = (unsigned int) (to & (priv->cache.page_size - 1));
|
|
+ avail = priv->cache.page_size - offset;
|
|
+
|
|
+ mutex_lock(&priv->lock);
|
|
+
|
|
+ entry = ps3vram_cache_match(mtd, to);
|
|
+ cached = CACHE_OFFSET + entry * priv->cache.page_size + offset;
|
|
+
|
|
+ dev_dbg(priv->dev, "%s:%d: to=%08x cached=%08x offset=%08x "
|
|
+ "avail=%08x count=%08x\n", __func__, __LINE__,
|
|
+ (unsigned int)to, cached, offset, avail, count);
|
|
+
|
|
+ if (avail > count)
|
|
+ avail = count;
|
|
+ memcpy(priv->xdr_buf + cached, buf, avail);
|
|
+
|
|
+ priv->cache.tags[entry].flags |= CACHE_PAGE_DIRTY;
|
|
+
|
|
+ mutex_unlock(&priv->lock);
|
|
+
|
|
+ buf += avail;
|
|
+ count -= avail;
|
|
+ to += avail;
|
|
+ }
|
|
+
|
|
+ *retlen = len;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int __devinit ps3vram_probe(struct ps3_system_bus_device *dev)
|
|
+{
|
|
+ struct ps3vram_priv *priv;
|
|
+ int status;
|
|
+ u64 ddr_lpar;
|
|
+ u64 ctrl_lpar;
|
|
+ u64 info_lpar;
|
|
+ u64 reports_lpar;
|
|
+ u64 ddr_size;
|
|
+ u64 reports_size;
|
|
+ int ret = -ENOMEM;
|
|
+ char *rest;
|
|
+
|
|
+ ret = -EIO;
|
|
+ ps3vram_mtd.priv = kzalloc(sizeof(struct ps3vram_priv), GFP_KERNEL);
|
|
+ if (!ps3vram_mtd.priv)
|
|
+ goto out;
|
|
+ priv = ps3vram_mtd.priv;
|
|
+
|
|
+ mutex_init(&priv->lock);
|
|
+ priv->dev = &dev->core;
|
|
+
|
|
+ /* Allocate XDR buffer (1MiB aligned) */
|
|
+ priv->xdr_buf = (void *)__get_free_pages(GFP_KERNEL,
|
|
+ get_order(XDR_BUF_SIZE));
|
|
+ if (priv->xdr_buf == NULL) {
|
|
+ dev_dbg(&dev->core, "%s:%d: could not allocate XDR buffer\n",
|
|
+ __func__, __LINE__);
|
|
+ ret = -ENOMEM;
|
|
+ goto out_free_priv;
|
|
+ }
|
|
+
|
|
+ /* Put FIFO at begginning of XDR buffer */
|
|
+ priv->fifo_base = (u32 *) (priv->xdr_buf + FIFO_OFFSET);
|
|
+ priv->fifo_ptr = priv->fifo_base;
|
|
+
|
|
+ /* XXX: Need to open GPU, in case ps3fb or snd_ps3 aren't loaded */
|
|
+ if (ps3_open_hv_device(dev)) {
|
|
+ dev_err(&dev->core, "%s:%d: ps3_open_hv_device failed\n",
|
|
+ __func__, __LINE__);
|
|
+ ret = -EAGAIN;
|
|
+ goto out_close_gpu;
|
|
+ }
|
|
+
|
|
+ /* Request memory */
|
|
+ status = -1;
|
|
+ ddr_size = memparse(size, &rest);
|
|
+ if (*rest == '-')
|
|
+ ddr_size -= ps3fb_videomemory.size;
|
|
+ ddr_size = ALIGN(ddr_size, 1024*1024);
|
|
+ if (ddr_size <= 0) {
|
|
+ dev_err(&dev->core, "%s:%d: specified size is too small\n",
|
|
+ __func__, __LINE__);
|
|
+ ret = -EINVAL;
|
|
+ goto out_close_gpu;
|
|
+ }
|
|
+
|
|
+ while (ddr_size > 0) {
|
|
+ status = lv1_gpu_memory_allocate(ddr_size, 0, 0, 0, 0,
|
|
+ &priv->memory_handle,
|
|
+ &ddr_lpar);
|
|
+ if (!status)
|
|
+ break;
|
|
+ ddr_size -= 1024*1024;
|
|
+ }
|
|
+ if (status || ddr_size <= 0) {
|
|
+ dev_err(&dev->core, "%s:%d: lv1_gpu_memory_allocate failed\n",
|
|
+ __func__, __LINE__);
|
|
+ ret = -ENOMEM;
|
|
+ goto out_free_xdr_buf;
|
|
+ }
|
|
+
|
|
+ /* Request context */
|
|
+ status = lv1_gpu_context_allocate(priv->memory_handle,
|
|
+ 0,
|
|
+ &priv->context_handle,
|
|
+ &ctrl_lpar,
|
|
+ &info_lpar,
|
|
+ &reports_lpar,
|
|
+ &reports_size);
|
|
+ if (status) {
|
|
+ dev_err(&dev->core, "%s:%d: lv1_gpu_context_allocate failed\n",
|
|
+ __func__, __LINE__);
|
|
+ ret = -ENOMEM;
|
|
+ goto out_free_memory;
|
|
+ }
|
|
+
|
|
+ /* Map XDR buffer to RSX */
|
|
+ status = lv1_gpu_context_iomap(priv->context_handle, XDR_IOIF,
|
|
+ ps3_mm_phys_to_lpar(__pa(priv->xdr_buf)),
|
|
+ XDR_BUF_SIZE, 0);
|
|
+ if (status) {
|
|
+ dev_err(&dev->core, "%s:%d: lv1_gpu_context_iomap failed\n",
|
|
+ __func__, __LINE__);
|
|
+ ret = -ENOMEM;
|
|
+ goto out_free_context;
|
|
+ }
|
|
+
|
|
+ priv->ddr_base = ioremap_flags(ddr_lpar, ddr_size, _PAGE_NO_CACHE);
|
|
+
|
|
+ if (!priv->ddr_base) {
|
|
+ dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__,
|
|
+ __LINE__);
|
|
+ ret = -ENOMEM;
|
|
+ goto out_free_context;
|
|
+ }
|
|
+
|
|
+ priv->ctrl = ioremap(ctrl_lpar, 64 * 1024);
|
|
+ if (!priv->ctrl) {
|
|
+ dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__,
|
|
+ __LINE__);
|
|
+ ret = -ENOMEM;
|
|
+ goto out_unmap_vram;
|
|
+ }
|
|
+
|
|
+ priv->reports = ioremap(reports_lpar, reports_size);
|
|
+ if (!priv->reports) {
|
|
+ dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__,
|
|
+ __LINE__);
|
|
+ ret = -ENOMEM;
|
|
+ goto out_unmap_ctrl;
|
|
+ }
|
|
+
|
|
+ mutex_lock(&ps3_gpu_mutex);
|
|
+ ps3vram_init_ring(&ps3vram_mtd);
|
|
+ mutex_unlock(&ps3_gpu_mutex);
|
|
+
|
|
+ ps3vram_mtd.name = "ps3vram";
|
|
+ ps3vram_mtd.size = ddr_size;
|
|
+ ps3vram_mtd.flags = MTD_CAP_RAM;
|
|
+ ps3vram_mtd.erase = ps3vram_erase;
|
|
+ ps3vram_mtd.point = NULL;
|
|
+ ps3vram_mtd.unpoint = NULL;
|
|
+ ps3vram_mtd.read = ps3vram_read;
|
|
+ ps3vram_mtd.write = ps3vram_write;
|
|
+ ps3vram_mtd.owner = THIS_MODULE;
|
|
+ ps3vram_mtd.type = MTD_RAM;
|
|
+ ps3vram_mtd.erasesize = CACHE_PAGE_SIZE;
|
|
+ ps3vram_mtd.writesize = 1;
|
|
+
|
|
+ ps3vram_bind(&ps3vram_mtd);
|
|
+
|
|
+ mutex_lock(&ps3_gpu_mutex);
|
|
+ ret = ps3vram_wait_ring(&ps3vram_mtd, 100);
|
|
+ mutex_unlock(&ps3_gpu_mutex);
|
|
+ if (ret < 0) {
|
|
+ dev_err(&dev->core, "%s:%d: failed to initialize channels\n",
|
|
+ __func__, __LINE__);
|
|
+ ret = -ETIMEDOUT;
|
|
+ goto out_unmap_reports;
|
|
+ }
|
|
+
|
|
+ ps3vram_cache_init(&ps3vram_mtd);
|
|
+
|
|
+ if (add_mtd_device(&ps3vram_mtd)) {
|
|
+ dev_err(&dev->core, "%s:%d: add_mtd_device failed\n",
|
|
+ __func__, __LINE__);
|
|
+ ret = -EAGAIN;
|
|
+ goto out_cache_cleanup;
|
|
+ }
|
|
+
|
|
+ dev_info(&dev->core, "reserved %u MiB of gpu memory\n",
|
|
+ (unsigned int)(ddr_size / 1024 / 1024));
|
|
+
|
|
+ return 0;
|
|
+
|
|
+out_cache_cleanup:
|
|
+ ps3vram_cache_cleanup(&ps3vram_mtd);
|
|
+out_unmap_reports:
|
|
+ iounmap(priv->reports);
|
|
+out_unmap_ctrl:
|
|
+ iounmap(priv->ctrl);
|
|
+out_unmap_vram:
|
|
+ iounmap(priv->ddr_base);
|
|
+out_free_context:
|
|
+ lv1_gpu_context_free(priv->context_handle);
|
|
+out_free_memory:
|
|
+ lv1_gpu_memory_free(priv->memory_handle);
|
|
+out_close_gpu:
|
|
+ ps3_close_hv_device(dev);
|
|
+out_free_xdr_buf:
|
|
+ free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE));
|
|
+out_free_priv:
|
|
+ kfree(ps3vram_mtd.priv);
|
|
+ ps3vram_mtd.priv = NULL;
|
|
+out:
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int ps3vram_shutdown(struct ps3_system_bus_device *dev)
|
|
+{
|
|
+ struct ps3vram_priv *priv;
|
|
+
|
|
+ priv = ps3vram_mtd.priv;
|
|
+
|
|
+ del_mtd_device(&ps3vram_mtd);
|
|
+ ps3vram_cache_cleanup(&ps3vram_mtd);
|
|
+ iounmap(priv->reports);
|
|
+ iounmap(priv->ctrl);
|
|
+ iounmap(priv->ddr_base);
|
|
+ lv1_gpu_context_free(priv->context_handle);
|
|
+ lv1_gpu_memory_free(priv->memory_handle);
|
|
+ ps3_close_hv_device(dev);
|
|
+ free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE));
|
|
+ kfree(priv);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static struct ps3_system_bus_driver ps3vram_driver = {
|
|
+ .match_id = PS3_MATCH_ID_GPU,
|
|
+ .match_sub_id = PS3_MATCH_SUB_ID_GPU_RAMDISK,
|
|
+ .core.name = DEVICE_NAME,
|
|
+ .core.owner = THIS_MODULE,
|
|
+ .probe = ps3vram_probe,
|
|
+ .remove = ps3vram_shutdown,
|
|
+ .shutdown = ps3vram_shutdown,
|
|
+};
|
|
+
|
|
+static int __init ps3vram_init(void)
|
|
+{
|
|
+ return ps3_system_bus_driver_register(&ps3vram_driver);
|
|
+}
|
|
+
|
|
+static void __exit ps3vram_exit(void)
|
|
+{
|
|
+ ps3_system_bus_driver_unregister(&ps3vram_driver);
|
|
+}
|
|
+
|
|
+module_init(ps3vram_init);
|
|
+module_exit(ps3vram_exit);
|
|
+
|
|
+MODULE_LICENSE("GPL");
|
|
+MODULE_AUTHOR("Jim Paris <jim@jtan.com>");
|
|
+MODULE_DESCRIPTION("MTD driver for PS3 video RAM");
|
|
+MODULE_ALIAS(PS3_MODULE_ALIAS_GPU_RAMDISK);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/devices/slram.c linux-2.6.29-rc3.owrt/drivers/mtd/devices/slram.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/devices/slram.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/slram.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -267,28 +267,22 @@
|
|
if (*(szlength) != '+') {
|
|
devlength = simple_strtoul(szlength, &buffer, 0);
|
|
devlength = handle_unit(devlength, buffer) - devstart;
|
|
- if (devlength < devstart)
|
|
- goto err_out;
|
|
-
|
|
- devlength -= devstart;
|
|
} else {
|
|
devlength = simple_strtoul(szlength + 1, &buffer, 0);
|
|
devlength = handle_unit(devlength, buffer);
|
|
}
|
|
T("slram: devname=%s, devstart=0x%lx, devlength=0x%lx\n",
|
|
devname, devstart, devlength);
|
|
- if (devlength % SLRAM_BLK_SZ != 0)
|
|
- goto err_out;
|
|
+ if ((devstart < 0) || (devlength < 0) || (devlength % SLRAM_BLK_SZ != 0)) {
|
|
+ E("slram: Illegal start / length parameter.\n");
|
|
+ return(-EINVAL);
|
|
+ }
|
|
|
|
if ((devstart = register_device(devname, devstart, devlength))){
|
|
unregister_devices();
|
|
return((int)devstart);
|
|
}
|
|
return(0);
|
|
-
|
|
-err_out:
|
|
- E("slram: Illegal length parameter.\n");
|
|
- return(-EINVAL);
|
|
}
|
|
|
|
#ifndef MODULE
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/lpddr/Kconfig linux-2.6.29-rc3.owrt/drivers/mtd/lpddr/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/mtd/lpddr/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/lpddr/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -12,7 +12,6 @@
|
|
DDR memories, intended for battery-operated systems.
|
|
|
|
config MTD_QINFO_PROBE
|
|
- depends on MTD_LPDDR
|
|
tristate "Detect flash chips by QINFO probe"
|
|
help
|
|
Device Information for LPDDR chips is offered through the Overlay
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/maps/bfin-async-flash.c linux-2.6.29-rc3.owrt/drivers/mtd/maps/bfin-async-flash.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/maps/bfin-async-flash.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/bfin-async-flash.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -152,18 +152,14 @@
|
|
|
|
if (gpio_request(state->enet_flash_pin, DRIVER_NAME)) {
|
|
pr_devinit(KERN_ERR DRIVER_NAME ": Failed to request gpio %d\n", state->enet_flash_pin);
|
|
- kfree(state);
|
|
return -EBUSY;
|
|
}
|
|
gpio_direction_output(state->enet_flash_pin, 1);
|
|
|
|
pr_devinit(KERN_NOTICE DRIVER_NAME ": probing %d-bit flash bus\n", state->map.bankwidth * 8);
|
|
state->mtd = do_map_probe(memory->name, &state->map);
|
|
- if (!state->mtd) {
|
|
- gpio_free(state->enet_flash_pin);
|
|
- kfree(state);
|
|
+ if (!state->mtd)
|
|
return -ENXIO;
|
|
- }
|
|
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
ret = parse_mtd_partitions(state->mtd, part_probe_types, &pdata->parts, 0);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/maps/ck804xrom.c linux-2.6.29-rc3.owrt/drivers/mtd/maps/ck804xrom.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/maps/ck804xrom.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/ck804xrom.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -342,9 +342,9 @@
|
|
{ 0, }
|
|
};
|
|
|
|
-#if 0
|
|
MODULE_DEVICE_TABLE(pci, ck804xrom_pci_tbl);
|
|
|
|
+#if 0
|
|
static struct pci_driver ck804xrom_driver = {
|
|
.name = MOD_NAME,
|
|
.id_table = ck804xrom_pci_tbl,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/maps/Kconfig linux-2.6.29-rc3.owrt/drivers/mtd/maps/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/mtd/maps/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -491,7 +491,7 @@
|
|
|
|
config MTD_BFIN_ASYNC
|
|
tristate "Blackfin BF533-STAMP Flash Chip Support"
|
|
- depends on BFIN533_STAMP && MTD_CFI && MTD_COMPLEX_MAPPINGS
|
|
+ depends on BFIN533_STAMP && MTD_CFI
|
|
select MTD_PARTITIONS
|
|
default y
|
|
help
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/maps/physmap.c linux-2.6.29-rc3.owrt/drivers/mtd/maps/physmap.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/maps/physmap.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/physmap.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -29,7 +29,6 @@
|
|
struct map_info map[MAX_RESOURCES];
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
int nr_parts;
|
|
- struct mtd_partition *parts;
|
|
#endif
|
|
};
|
|
|
|
@@ -46,29 +45,25 @@
|
|
|
|
physmap_data = dev->dev.platform_data;
|
|
|
|
- if (info->cmtd) {
|
|
-#ifdef CONFIG_MTD_PARTITIONS
|
|
- if (info->nr_parts || physmap_data->nr_parts)
|
|
- del_mtd_partitions(info->cmtd);
|
|
- else
|
|
- del_mtd_device(info->cmtd);
|
|
-#else
|
|
- del_mtd_device(info->cmtd);
|
|
-#endif
|
|
- }
|
|
-#ifdef CONFIG_MTD_PARTITIONS
|
|
- if (info->nr_parts)
|
|
- kfree(info->parts);
|
|
-#endif
|
|
-
|
|
#ifdef CONFIG_MTD_CONCAT
|
|
- if (info->cmtd != info->mtd[0])
|
|
+ if (info->cmtd != info->mtd[0]) {
|
|
+ del_mtd_device(info->cmtd);
|
|
mtd_concat_destroy(info->cmtd);
|
|
+ }
|
|
#endif
|
|
|
|
for (i = 0; i < MAX_RESOURCES; i++) {
|
|
- if (info->mtd[i] != NULL)
|
|
+ if (info->mtd[i] != NULL) {
|
|
+#ifdef CONFIG_MTD_PARTITIONS
|
|
+ if (info->nr_parts || physmap_data->nr_parts)
|
|
+ del_mtd_partitions(info->mtd[i]);
|
|
+ else
|
|
+ del_mtd_device(info->mtd[i]);
|
|
+#else
|
|
+ del_mtd_device(info->mtd[i]);
|
|
+#endif
|
|
map_destroy(info->mtd[i]);
|
|
+ }
|
|
}
|
|
return 0;
|
|
}
|
|
@@ -91,6 +86,9 @@
|
|
int err = 0;
|
|
int i;
|
|
int devices_found = 0;
|
|
+#ifdef CONFIG_MTD_PARTITIONS
|
|
+ struct mtd_partition *parts;
|
|
+#endif
|
|
|
|
physmap_data = dev->dev.platform_data;
|
|
if (physmap_data == NULL)
|
|
@@ -169,11 +167,10 @@
|
|
goto err_out;
|
|
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
- err = parse_mtd_partitions(info->cmtd, part_probe_types,
|
|
- &info->parts, 0);
|
|
+ err = parse_mtd_partitions(info->cmtd, part_probe_types, &parts, 0);
|
|
if (err > 0) {
|
|
- add_mtd_partitions(info->cmtd, info->parts, err);
|
|
- info->nr_parts = err;
|
|
+ add_mtd_partitions(info->cmtd, parts, err);
|
|
+ kfree(parts);
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/maps/sa1100-flash.c linux-2.6.29-rc3.owrt/drivers/mtd/maps/sa1100-flash.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/maps/sa1100-flash.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/sa1100-flash.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -453,7 +453,7 @@
|
|
.resume = sa1100_mtd_resume,
|
|
.shutdown = sa1100_mtd_shutdown,
|
|
.driver = {
|
|
- .name = "sa1100-mtd",
|
|
+ .name = "flash",
|
|
.owner = THIS_MODULE,
|
|
},
|
|
};
|
|
@@ -474,4 +474,4 @@
|
|
MODULE_AUTHOR("Nicolas Pitre");
|
|
MODULE_DESCRIPTION("SA1100 CFI map driver");
|
|
MODULE_LICENSE("GPL");
|
|
-MODULE_ALIAS("platform:sa1100-mtd");
|
|
+MODULE_ALIAS("platform:flash");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/nand/atmel_nand.c linux-2.6.29-rc3.owrt/drivers/mtd/nand/atmel_nand.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/nand/atmel_nand.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/nand/atmel_nand.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -139,8 +139,7 @@
|
|
struct nand_chip *nand_chip = mtd->priv;
|
|
struct atmel_nand_host *host = nand_chip->priv;
|
|
|
|
- return gpio_get_value(host->board->rdy_pin) ^
|
|
- !!host->board->rdy_pin_active_low;
|
|
+ return gpio_get_value(host->board->rdy_pin);
|
|
}
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/nand/orion_nand.c linux-2.6.29-rc3.owrt/drivers/mtd/nand/orion_nand.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/nand/orion_nand.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/nand/orion_nand.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -149,7 +149,7 @@
|
|
|
|
static struct platform_driver orion_nand_driver = {
|
|
.probe = orion_nand_probe,
|
|
- .remove = __devexit_p(orion_nand_remove),
|
|
+ .remove = orion_nand_remove,
|
|
.driver = {
|
|
.name = "orion_nand",
|
|
.owner = THIS_MODULE,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/ubi/build.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/build.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/ubi/build.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/build.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -263,12 +263,8 @@
|
|
return ret;
|
|
}
|
|
|
|
-static void dev_release(struct device *dev)
|
|
-{
|
|
- struct ubi_device *ubi = container_of(dev, struct ubi_device, dev);
|
|
-
|
|
- kfree(ubi);
|
|
-}
|
|
+/* Fake "release" method for UBI devices */
|
|
+static void dev_release(struct device *dev) { }
|
|
|
|
/**
|
|
* ubi_sysfs_init - initialize sysfs for an UBI device.
|
|
@@ -384,7 +380,7 @@
|
|
*/
|
|
static int uif_init(struct ubi_device *ubi)
|
|
{
|
|
- int i, err;
|
|
+ int i, err, do_free = 0;
|
|
dev_t dev;
|
|
|
|
sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num);
|
|
@@ -431,10 +427,13 @@
|
|
|
|
out_volumes:
|
|
kill_volumes(ubi);
|
|
+ do_free = 0;
|
|
out_sysfs:
|
|
ubi_sysfs_close(ubi);
|
|
cdev_del(&ubi->cdev);
|
|
out_unreg:
|
|
+ if (do_free)
|
|
+ free_user_volumes(ubi);
|
|
unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1);
|
|
ubi_err("cannot initialize UBI %s, error %d", ubi->ubi_name, err);
|
|
return err;
|
|
@@ -948,12 +947,6 @@
|
|
if (ubi->bgt_thread)
|
|
kthread_stop(ubi->bgt_thread);
|
|
|
|
- /*
|
|
- * Get a reference to the device in order to prevent 'dev_release()'
|
|
- * from freeing @ubi object.
|
|
- */
|
|
- get_device(&ubi->dev);
|
|
-
|
|
uif_close(ubi);
|
|
ubi_wl_close(ubi);
|
|
free_internal_volumes(ubi);
|
|
@@ -965,7 +958,7 @@
|
|
vfree(ubi->dbg_peb_buf);
|
|
#endif
|
|
ubi_msg("mtd%d is detached from ubi%d", ubi->mtd->index, ubi->ubi_num);
|
|
- put_device(&ubi->dev);
|
|
+ kfree(ubi);
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/ubi/cdev.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/cdev.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/ubi/cdev.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/cdev.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -40,9 +40,9 @@
|
|
#include <linux/ioctl.h>
|
|
#include <linux/capability.h>
|
|
#include <linux/uaccess.h>
|
|
-#include <linux/compat.h>
|
|
-#include <linux/math64.h>
|
|
+#include <linux/smp_lock.h>
|
|
#include <mtd/ubi-user.h>
|
|
+#include <asm/div64.h>
|
|
#include "ubi.h"
|
|
|
|
/**
|
|
@@ -195,6 +195,7 @@
|
|
int err, lnum, off, len, tbuf_size;
|
|
size_t count_save = count;
|
|
void *tbuf;
|
|
+ uint64_t tmp;
|
|
|
|
dbg_gen("read %zd bytes from offset %lld of volume %d",
|
|
count, *offp, vol->vol_id);
|
|
@@ -224,7 +225,10 @@
|
|
return -ENOMEM;
|
|
|
|
len = count > tbuf_size ? tbuf_size : count;
|
|
- lnum = div_u64_rem(*offp, vol->usable_leb_size, &off);
|
|
+
|
|
+ tmp = *offp;
|
|
+ off = do_div(tmp, vol->usable_leb_size);
|
|
+ lnum = tmp;
|
|
|
|
do {
|
|
cond_resched();
|
|
@@ -259,9 +263,12 @@
|
|
return err ? err : count_save - count;
|
|
}
|
|
|
|
+#ifdef CONFIG_MTD_UBI_DEBUG_USERSPACE_IO
|
|
+
|
|
/*
|
|
* This function allows to directly write to dynamic UBI volumes, without
|
|
- * issuing the volume update operation.
|
|
+ * issuing the volume update operation. Available only as a debugging feature.
|
|
+ * Very useful for testing UBI.
|
|
*/
|
|
static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf,
|
|
size_t count, loff_t *offp)
|
|
@@ -272,9 +279,7 @@
|
|
int lnum, off, len, tbuf_size, err = 0;
|
|
size_t count_save = count;
|
|
char *tbuf;
|
|
-
|
|
- if (!vol->direct_writes)
|
|
- return -EPERM;
|
|
+ uint64_t tmp;
|
|
|
|
dbg_gen("requested: write %zd bytes to offset %lld of volume %u",
|
|
count, *offp, vol->vol_id);
|
|
@@ -282,7 +287,10 @@
|
|
if (vol->vol_type == UBI_STATIC_VOLUME)
|
|
return -EROFS;
|
|
|
|
- lnum = div_u64_rem(*offp, vol->usable_leb_size, &off);
|
|
+ tmp = *offp;
|
|
+ off = do_div(tmp, vol->usable_leb_size);
|
|
+ lnum = tmp;
|
|
+
|
|
if (off & (ubi->min_io_size - 1)) {
|
|
dbg_err("unaligned position");
|
|
return -EINVAL;
|
|
@@ -339,6 +347,10 @@
|
|
return err ? err : count_save - count;
|
|
}
|
|
|
|
+#else
|
|
+#define vol_cdev_direct_write(file, buf, count, offp) (-EPERM)
|
|
+#endif /* CONFIG_MTD_UBI_DEBUG_USERSPACE_IO */
|
|
+
|
|
static ssize_t vol_cdev_write(struct file *file, const char __user *buf,
|
|
size_t count, loff_t *offp)
|
|
{
|
|
@@ -390,8 +402,8 @@
|
|
return count;
|
|
}
|
|
|
|
-static long vol_cdev_ioctl(struct file *file, unsigned int cmd,
|
|
- unsigned long arg)
|
|
+static int vol_cdev_ioctl(struct inode *inode, struct file *file,
|
|
+ unsigned int cmd, unsigned long arg)
|
|
{
|
|
int err = 0;
|
|
struct ubi_volume_desc *desc = file->private_data;
|
|
@@ -475,6 +487,7 @@
|
|
break;
|
|
}
|
|
|
|
+#ifdef CONFIG_MTD_UBI_DEBUG_USERSPACE_IO
|
|
/* Logical eraseblock erasure command */
|
|
case UBI_IOCEBER:
|
|
{
|
|
@@ -505,77 +518,13 @@
|
|
err = ubi_wl_flush(ubi);
|
|
break;
|
|
}
|
|
-
|
|
- /* Logical eraseblock map command */
|
|
- case UBI_IOCEBMAP:
|
|
- {
|
|
- struct ubi_map_req req;
|
|
-
|
|
- err = copy_from_user(&req, argp, sizeof(struct ubi_map_req));
|
|
- if (err) {
|
|
- err = -EFAULT;
|
|
- break;
|
|
- }
|
|
- err = ubi_leb_map(desc, req.lnum, req.dtype);
|
|
- break;
|
|
- }
|
|
-
|
|
- /* Logical eraseblock un-map command */
|
|
- case UBI_IOCEBUNMAP:
|
|
- {
|
|
- int32_t lnum;
|
|
-
|
|
- err = get_user(lnum, (__user int32_t *)argp);
|
|
- if (err) {
|
|
- err = -EFAULT;
|
|
- break;
|
|
- }
|
|
- err = ubi_leb_unmap(desc, lnum);
|
|
- break;
|
|
- }
|
|
-
|
|
- /* Check if logical eraseblock is mapped command */
|
|
- case UBI_IOCEBISMAP:
|
|
- {
|
|
- int32_t lnum;
|
|
-
|
|
- err = get_user(lnum, (__user int32_t *)argp);
|
|
- if (err) {
|
|
- err = -EFAULT;
|
|
- break;
|
|
- }
|
|
- err = ubi_is_mapped(desc, lnum);
|
|
- break;
|
|
- }
|
|
-
|
|
- /* Set volume property command*/
|
|
- case UBI_IOCSETPROP:
|
|
- {
|
|
- struct ubi_set_prop_req req;
|
|
-
|
|
- err = copy_from_user(&req, argp,
|
|
- sizeof(struct ubi_set_prop_req));
|
|
- if (err) {
|
|
- err = -EFAULT;
|
|
- break;
|
|
- }
|
|
- switch (req.property) {
|
|
- case UBI_PROP_DIRECT_WRITE:
|
|
- mutex_lock(&ubi->volumes_mutex);
|
|
- desc->vol->direct_writes = !!req.value;
|
|
- mutex_unlock(&ubi->volumes_mutex);
|
|
- break;
|
|
- default:
|
|
- err = -EINVAL;
|
|
- break;
|
|
- }
|
|
- break;
|
|
- }
|
|
+#endif
|
|
|
|
default:
|
|
err = -ENOTTY;
|
|
break;
|
|
}
|
|
+
|
|
return err;
|
|
}
|
|
|
|
@@ -813,8 +762,8 @@
|
|
return err;
|
|
}
|
|
|
|
-static long ubi_cdev_ioctl(struct file *file, unsigned int cmd,
|
|
- unsigned long arg)
|
|
+static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
|
|
+ unsigned int cmd, unsigned long arg)
|
|
{
|
|
int err = 0;
|
|
struct ubi_device *ubi;
|
|
@@ -824,7 +773,7 @@
|
|
if (!capable(CAP_SYS_RESOURCE))
|
|
return -EPERM;
|
|
|
|
- ubi = ubi_get_by_major(imajor(file->f_mapping->host));
|
|
+ ubi = ubi_get_by_major(imajor(inode));
|
|
if (!ubi)
|
|
return -ENODEV;
|
|
|
|
@@ -894,6 +843,7 @@
|
|
case UBI_IOCRSVOL:
|
|
{
|
|
int pebs;
|
|
+ uint64_t tmp;
|
|
struct ubi_rsvol_req req;
|
|
|
|
dbg_gen("re-size volume");
|
|
@@ -913,8 +863,9 @@
|
|
break;
|
|
}
|
|
|
|
- pebs = div_u64(req.bytes + desc->vol->usable_leb_size - 1,
|
|
- desc->vol->usable_leb_size);
|
|
+ tmp = req.bytes;
|
|
+ pebs = !!do_div(tmp, desc->vol->usable_leb_size);
|
|
+ pebs += tmp;
|
|
|
|
mutex_lock(&ubi->volumes_mutex);
|
|
err = ubi_resize_volume(desc, pebs);
|
|
@@ -958,8 +909,8 @@
|
|
return err;
|
|
}
|
|
|
|
-static long ctrl_cdev_ioctl(struct file *file, unsigned int cmd,
|
|
- unsigned long arg)
|
|
+static int ctrl_cdev_ioctl(struct inode *inode, struct file *file,
|
|
+ unsigned int cmd, unsigned long arg)
|
|
{
|
|
int err = 0;
|
|
void __user *argp = (void __user *)arg;
|
|
@@ -1035,59 +986,26 @@
|
|
return err;
|
|
}
|
|
|
|
-#ifdef CONFIG_COMPAT
|
|
-static long vol_cdev_compat_ioctl(struct file *file, unsigned int cmd,
|
|
- unsigned long arg)
|
|
-{
|
|
- unsigned long translated_arg = (unsigned long)compat_ptr(arg);
|
|
-
|
|
- return vol_cdev_ioctl(file, cmd, translated_arg);
|
|
-}
|
|
-
|
|
-static long ubi_cdev_compat_ioctl(struct file *file, unsigned int cmd,
|
|
- unsigned long arg)
|
|
-{
|
|
- unsigned long translated_arg = (unsigned long)compat_ptr(arg);
|
|
-
|
|
- return ubi_cdev_ioctl(file, cmd, translated_arg);
|
|
-}
|
|
-
|
|
-static long ctrl_cdev_compat_ioctl(struct file *file, unsigned int cmd,
|
|
- unsigned long arg)
|
|
-{
|
|
- unsigned long translated_arg = (unsigned long)compat_ptr(arg);
|
|
-
|
|
- return ctrl_cdev_ioctl(file, cmd, translated_arg);
|
|
-}
|
|
-#else
|
|
-#define vol_cdev_compat_ioctl NULL
|
|
-#define ubi_cdev_compat_ioctl NULL
|
|
-#define ctrl_cdev_compat_ioctl NULL
|
|
-#endif
|
|
-
|
|
-/* UBI volume character device operations */
|
|
-const struct file_operations ubi_vol_cdev_operations = {
|
|
- .owner = THIS_MODULE,
|
|
- .open = vol_cdev_open,
|
|
- .release = vol_cdev_release,
|
|
- .llseek = vol_cdev_llseek,
|
|
- .read = vol_cdev_read,
|
|
- .write = vol_cdev_write,
|
|
- .unlocked_ioctl = vol_cdev_ioctl,
|
|
- .compat_ioctl = vol_cdev_compat_ioctl,
|
|
+/* UBI control character device operations */
|
|
+struct file_operations ubi_ctrl_cdev_operations = {
|
|
+ .ioctl = ctrl_cdev_ioctl,
|
|
+ .owner = THIS_MODULE,
|
|
};
|
|
|
|
/* UBI character device operations */
|
|
-const struct file_operations ubi_cdev_operations = {
|
|
- .owner = THIS_MODULE,
|
|
- .llseek = no_llseek,
|
|
- .unlocked_ioctl = ubi_cdev_ioctl,
|
|
- .compat_ioctl = ubi_cdev_compat_ioctl,
|
|
+struct file_operations ubi_cdev_operations = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .ioctl = ubi_cdev_ioctl,
|
|
+ .llseek = no_llseek,
|
|
};
|
|
|
|
-/* UBI control character device operations */
|
|
-const struct file_operations ubi_ctrl_cdev_operations = {
|
|
- .owner = THIS_MODULE,
|
|
- .unlocked_ioctl = ctrl_cdev_ioctl,
|
|
- .compat_ioctl = ctrl_cdev_compat_ioctl,
|
|
+/* UBI volume character device operations */
|
|
+struct file_operations ubi_vol_cdev_operations = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .open = vol_cdev_open,
|
|
+ .release = vol_cdev_release,
|
|
+ .llseek = vol_cdev_llseek,
|
|
+ .read = vol_cdev_read,
|
|
+ .write = vol_cdev_write,
|
|
+ .ioctl = vol_cdev_ioctl,
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/ubi/gluebi.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/gluebi.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/ubi/gluebi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/gluebi.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -28,7 +28,7 @@
|
|
* eraseblock size is equivalent to the logical eraseblock size of the volume.
|
|
*/
|
|
|
|
-#include <linux/math64.h>
|
|
+#include <asm/div64.h>
|
|
#include "ubi.h"
|
|
|
|
/**
|
|
@@ -109,6 +109,7 @@
|
|
int err = 0, lnum, offs, total_read;
|
|
struct ubi_volume *vol;
|
|
struct ubi_device *ubi;
|
|
+ uint64_t tmp = from;
|
|
|
|
dbg_gen("read %zd bytes from offset %lld", len, from);
|
|
|
|
@@ -118,7 +119,9 @@
|
|
vol = container_of(mtd, struct ubi_volume, gluebi_mtd);
|
|
ubi = vol->ubi;
|
|
|
|
- lnum = div_u64_rem(from, mtd->erasesize, &offs);
|
|
+ offs = do_div(tmp, mtd->erasesize);
|
|
+ lnum = tmp;
|
|
+
|
|
total_read = len;
|
|
while (total_read) {
|
|
size_t to_read = mtd->erasesize - offs;
|
|
@@ -157,6 +160,7 @@
|
|
int err = 0, lnum, offs, total_written;
|
|
struct ubi_volume *vol;
|
|
struct ubi_device *ubi;
|
|
+ uint64_t tmp = to;
|
|
|
|
dbg_gen("write %zd bytes to offset %lld", len, to);
|
|
|
|
@@ -169,7 +173,8 @@
|
|
if (ubi->ro_mode)
|
|
return -EROFS;
|
|
|
|
- lnum = div_u64_rem(to, mtd->erasesize, &offs);
|
|
+ offs = do_div(tmp, mtd->erasesize);
|
|
+ lnum = tmp;
|
|
|
|
if (len % mtd->writesize || offs % mtd->writesize)
|
|
return -EINVAL;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/ubi/Kconfig.debug linux-2.6.29-rc3.owrt/drivers/mtd/ubi/Kconfig.debug
|
|
--- linux-2.6.29.owrt/drivers/mtd/ubi/Kconfig.debug 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/Kconfig.debug 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -33,6 +33,16 @@
|
|
This option switches the background thread off by default. The thread
|
|
may be also be enabled/disabled via UBI sysfs.
|
|
|
|
+config MTD_UBI_DEBUG_USERSPACE_IO
|
|
+ bool "Direct user-space write/erase support"
|
|
+ default n
|
|
+ depends on MTD_UBI_DEBUG
|
|
+ help
|
|
+ By default, users cannot directly write and erase individual
|
|
+ eraseblocks of dynamic volumes, and have to use update operation
|
|
+ instead. This option enables this capability - it is very useful for
|
|
+ debugging and testing.
|
|
+
|
|
config MTD_UBI_DEBUG_EMULATE_BITFLIPS
|
|
bool "Emulate flash bit-flips"
|
|
depends on MTD_UBI_DEBUG
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/ubi/scan.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/scan.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/ubi/scan.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/scan.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -42,7 +42,7 @@
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/crc32.h>
|
|
-#include <linux/math64.h>
|
|
+#include <asm/div64.h>
|
|
#include "ubi.h"
|
|
|
|
#ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
|
|
@@ -904,8 +904,10 @@
|
|
dbg_msg("scanning is finished");
|
|
|
|
/* Calculate mean erase counter */
|
|
- if (si->ec_count)
|
|
- si->mean_ec = div_u64(si->ec_sum, si->ec_count);
|
|
+ if (si->ec_count) {
|
|
+ do_div(si->ec_sum, si->ec_count);
|
|
+ si->mean_ec = si->ec_sum;
|
|
+ }
|
|
|
|
if (si->is_empty)
|
|
ubi_msg("empty MTD device detected");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/ubi/ubi.h linux-2.6.29-rc3.owrt/drivers/mtd/ubi/ubi.h
|
|
--- linux-2.6.29.owrt/drivers/mtd/ubi/ubi.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/ubi.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -206,7 +206,6 @@
|
|
* @upd_marker: %1 if the update marker is set for this volume
|
|
* @updating: %1 if the volume is being updated
|
|
* @changing_leb: %1 if the atomic LEB change ioctl command is in progress
|
|
- * @direct_writes: %1 if direct writes are enabled for this volume
|
|
*
|
|
* @gluebi_desc: gluebi UBI volume descriptor
|
|
* @gluebi_refcount: reference count of the gluebi MTD device
|
|
@@ -254,7 +253,6 @@
|
|
unsigned int upd_marker:1;
|
|
unsigned int updating:1;
|
|
unsigned int changing_leb:1;
|
|
- unsigned int direct_writes:1;
|
|
|
|
#ifdef CONFIG_MTD_UBI_GLUEBI
|
|
/*
|
|
@@ -306,8 +304,7 @@
|
|
* @vtbl_size: size of the volume table in bytes
|
|
* @vtbl: in-RAM volume table copy
|
|
* @volumes_mutex: protects on-flash volume table and serializes volume
|
|
- * changes, like creation, deletion, update, re-size,
|
|
- * re-name and set property
|
|
+ * changes, like creation, deletion, update, re-size and re-name
|
|
*
|
|
* @max_ec: current highest erase counter value
|
|
* @mean_ec: current mean erase counter value
|
|
@@ -452,9 +449,9 @@
|
|
};
|
|
|
|
extern struct kmem_cache *ubi_wl_entry_slab;
|
|
-extern const struct file_operations ubi_ctrl_cdev_operations;
|
|
-extern const struct file_operations ubi_cdev_operations;
|
|
-extern const struct file_operations ubi_vol_cdev_operations;
|
|
+extern struct file_operations ubi_ctrl_cdev_operations;
|
|
+extern struct file_operations ubi_cdev_operations;
|
|
+extern struct file_operations ubi_vol_cdev_operations;
|
|
extern struct class *ubi_class;
|
|
extern struct mutex ubi_devices_mutex;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/ubi/upd.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/upd.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/ubi/upd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/upd.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -40,7 +40,7 @@
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/uaccess.h>
|
|
-#include <linux/math64.h>
|
|
+#include <asm/div64.h>
|
|
#include "ubi.h"
|
|
|
|
/**
|
|
@@ -89,6 +89,7 @@
|
|
long long bytes)
|
|
{
|
|
int err;
|
|
+ uint64_t tmp;
|
|
struct ubi_vtbl_record vtbl_rec;
|
|
|
|
dbg_gen("clear update marker for volume %d", vol->vol_id);
|
|
@@ -100,9 +101,9 @@
|
|
|
|
if (vol->vol_type == UBI_STATIC_VOLUME) {
|
|
vol->corrupted = 0;
|
|
- vol->used_bytes = bytes;
|
|
- vol->used_ebs = div_u64_rem(bytes, vol->usable_leb_size,
|
|
- &vol->last_eb_bytes);
|
|
+ vol->used_bytes = tmp = bytes;
|
|
+ vol->last_eb_bytes = do_div(tmp, vol->usable_leb_size);
|
|
+ vol->used_ebs = tmp;
|
|
if (vol->last_eb_bytes)
|
|
vol->used_ebs += 1;
|
|
else
|
|
@@ -130,6 +131,7 @@
|
|
long long bytes)
|
|
{
|
|
int i, err;
|
|
+ uint64_t tmp;
|
|
|
|
dbg_gen("start update of volume %d, %llu bytes", vol->vol_id, bytes);
|
|
ubi_assert(!vol->updating && !vol->changing_leb);
|
|
@@ -159,8 +161,9 @@
|
|
if (!vol->upd_buf)
|
|
return -ENOMEM;
|
|
|
|
- vol->upd_ebs = div_u64(bytes + vol->usable_leb_size - 1,
|
|
- vol->usable_leb_size);
|
|
+ tmp = bytes;
|
|
+ vol->upd_ebs = !!do_div(tmp, vol->usable_leb_size);
|
|
+ vol->upd_ebs += tmp;
|
|
vol->upd_bytes = bytes;
|
|
vol->upd_received = 0;
|
|
return 0;
|
|
@@ -279,6 +282,7 @@
|
|
int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol,
|
|
const void __user *buf, int count)
|
|
{
|
|
+ uint64_t tmp;
|
|
int lnum, offs, err = 0, len, to_write = count;
|
|
|
|
dbg_gen("write %d of %lld bytes, %lld already passed",
|
|
@@ -287,7 +291,10 @@
|
|
if (ubi->ro_mode)
|
|
return -EROFS;
|
|
|
|
- lnum = div_u64_rem(vol->upd_received, vol->usable_leb_size, &offs);
|
|
+ tmp = vol->upd_received;
|
|
+ offs = do_div(tmp, vol->usable_leb_size);
|
|
+ lnum = tmp;
|
|
+
|
|
if (vol->upd_received + count > vol->upd_bytes)
|
|
to_write = count = vol->upd_bytes - vol->upd_received;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/mtd/ubi/vmt.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/vmt.c
|
|
--- linux-2.6.29.owrt/drivers/mtd/ubi/vmt.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/vmt.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -24,7 +24,7 @@
|
|
*/
|
|
|
|
#include <linux/err.h>
|
|
-#include <linux/math64.h>
|
|
+#include <asm/div64.h>
|
|
#include "ubi.h"
|
|
|
|
#ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
|
|
@@ -205,6 +205,7 @@
|
|
int i, err, vol_id = req->vol_id, do_free = 1;
|
|
struct ubi_volume *vol;
|
|
struct ubi_vtbl_record vtbl_rec;
|
|
+ uint64_t bytes;
|
|
dev_t dev;
|
|
|
|
if (ubi->ro_mode)
|
|
@@ -254,8 +255,10 @@
|
|
|
|
/* Calculate how many eraseblocks are requested */
|
|
vol->usable_leb_size = ubi->leb_size - ubi->leb_size % req->alignment;
|
|
- vol->reserved_pebs += div_u64(req->bytes + vol->usable_leb_size - 1,
|
|
- vol->usable_leb_size);
|
|
+ bytes = req->bytes;
|
|
+ if (do_div(bytes, vol->usable_leb_size))
|
|
+ vol->reserved_pebs = 1;
|
|
+ vol->reserved_pebs += bytes;
|
|
|
|
/* Reserve physical eraseblocks */
|
|
if (vol->reserved_pebs > ubi->avail_pebs) {
|
|
@@ -298,10 +301,10 @@
|
|
vol->used_bytes =
|
|
(long long)vol->used_ebs * vol->usable_leb_size;
|
|
} else {
|
|
- vol->used_ebs = div_u64_rem(vol->used_bytes,
|
|
- vol->usable_leb_size,
|
|
- &vol->last_eb_bytes);
|
|
- if (vol->last_eb_bytes != 0)
|
|
+ bytes = vol->used_bytes;
|
|
+ vol->last_eb_bytes = do_div(bytes, vol->usable_leb_size);
|
|
+ vol->used_ebs = bytes;
|
|
+ if (vol->last_eb_bytes)
|
|
vol->used_ebs += 1;
|
|
else
|
|
vol->last_eb_bytes = vol->usable_leb_size;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/3c505.c linux-2.6.29-rc3.owrt/drivers/net/3c505.c
|
|
--- linux-2.6.29.owrt/drivers/net/3c505.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/3c505.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -493,27 +493,21 @@
|
|
}
|
|
/* read the data */
|
|
spin_lock_irqsave(&adapter->lock, flags);
|
|
- for (i = 0; i < MAX_PCB_DATA; i++) {
|
|
- for (j = 0; j < 20000; j++) {
|
|
- stat = get_status(dev->base_addr);
|
|
- if (stat & ACRF)
|
|
- break;
|
|
- }
|
|
- pcb->data.raw[i] = inb_command(dev->base_addr);
|
|
- if ((stat & ASF_PCB_MASK) == ASF_PCB_END || j >= 20000)
|
|
- break;
|
|
- }
|
|
+ i = 0;
|
|
+ do {
|
|
+ j = 0;
|
|
+ while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && j++ < 20000);
|
|
+ pcb->data.raw[i++] = inb_command(dev->base_addr);
|
|
+ if (i > MAX_PCB_DATA)
|
|
+ INVALID_PCB_MSG(i);
|
|
+ } while ((stat & ASF_PCB_MASK) != ASF_PCB_END && j < 20000);
|
|
spin_unlock_irqrestore(&adapter->lock, flags);
|
|
- if (i >= MAX_PCB_DATA) {
|
|
- INVALID_PCB_MSG(i);
|
|
- return false;
|
|
- }
|
|
if (j >= 20000) {
|
|
TIMEOUT_MSG(__LINE__);
|
|
return false;
|
|
}
|
|
- /* the last "data" byte was really the length! */
|
|
- total_length = pcb->data.raw[i];
|
|
+ /* woops, the last "data" byte was really the length! */
|
|
+ total_length = pcb->data.raw[--i];
|
|
|
|
/* safety check total length vs data length */
|
|
if (total_length != (pcb->length + 2)) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/3c509.c linux-2.6.29-rc3.owrt/drivers/net/3c509.c
|
|
--- linux-2.6.29.owrt/drivers/net/3c509.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/3c509.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1475,7 +1475,6 @@
|
|
spin_lock_irqsave(&lp->lock, flags);
|
|
|
|
outw(PowerUp, ioaddr + EL3_CMD);
|
|
- EL3WINDOW(0);
|
|
el3_up(dev);
|
|
|
|
if (netif_running(dev))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/arm/etherh.c linux-2.6.29-rc3.owrt/drivers/net/arm/etherh.c
|
|
--- linux-2.6.29.owrt/drivers/net/arm/etherh.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/arm/etherh.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -641,15 +641,15 @@
|
|
.ndo_open = etherh_open,
|
|
.ndo_stop = etherh_close,
|
|
.ndo_set_config = etherh_set_config,
|
|
- .ndo_start_xmit = __ei_start_xmit,
|
|
- .ndo_tx_timeout = __ei_tx_timeout,
|
|
- .ndo_get_stats = __ei_get_stats,
|
|
- .ndo_set_multicast_list = __ei_set_multicast_list,
|
|
+ .ndo_start_xmit = ei_start_xmit,
|
|
+ .ndo_tx_timeout = ei_tx_timeout,
|
|
+ .ndo_get_stats = ei_get_stats,
|
|
+ .ndo_set_multicast_list = ei_set_multicast_list,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
- .ndo_set_mac_address = eth_mac_addr,
|
|
+ .ndo_set_mac_address = eth_set_mac_addr,
|
|
.ndo_change_mtu = eth_change_mtu,
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
- .ndo_poll_controller = __ei_poll,
|
|
+ .ndo_poll_controller = ei_poll,
|
|
#endif
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/arm/ks8695net.c linux-2.6.29-rc3.owrt/drivers/net/arm/ks8695net.c
|
|
--- linux-2.6.29.owrt/drivers/net/arm/ks8695net.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/arm/ks8695net.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -560,7 +560,7 @@
|
|
msleep(1);
|
|
}
|
|
|
|
- if (reset_timeout < 0) {
|
|
+ if (reset_timeout == 0) {
|
|
dev_crit(ksp->dev,
|
|
"Timeout waiting for DMA engines to reset\n");
|
|
/* And blithely carry on */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/arm/Makefile linux-2.6.29-rc3.owrt/drivers/net/arm/Makefile
|
|
--- linux-2.6.29.owrt/drivers/net/arm/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/arm/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -4,7 +4,7 @@
|
|
#
|
|
|
|
obj-$(CONFIG_ARM_AM79C961A) += am79c961a.o
|
|
-obj-$(CONFIG_ARM_ETHERH) += etherh.o
|
|
+obj-$(CONFIG_ARM_ETHERH) += etherh.o ../8390.o
|
|
obj-$(CONFIG_ARM_ETHER3) += ether3.o
|
|
obj-$(CONFIG_ARM_ETHER1) += ether1.o
|
|
obj-$(CONFIG_ARM_AT91_ETHER) += at91_ether.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/atl1c/atl1c_ethtool.c linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_ethtool.c
|
|
--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c_ethtool.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_ethtool.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,317 +0,0 @@
|
|
-/*
|
|
- * Copyright(c) 2009 - 2009 Atheros Corporation. All rights reserved.
|
|
- *
|
|
- * Derived from Intel e1000 driver
|
|
- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the Free
|
|
- * Software Foundation; either version 2 of the License, or (at your option)
|
|
- * any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but WITHOUT
|
|
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
- * more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
- * this program; if not, write to the Free Software Foundation, Inc., 59
|
|
- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
- *
|
|
- */
|
|
-
|
|
-#include <linux/netdevice.h>
|
|
-#include <linux/ethtool.h>
|
|
-
|
|
-#include "atl1c.h"
|
|
-
|
|
-static int atl1c_get_settings(struct net_device *netdev,
|
|
- struct ethtool_cmd *ecmd)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
-
|
|
- ecmd->supported = (SUPPORTED_10baseT_Half |
|
|
- SUPPORTED_10baseT_Full |
|
|
- SUPPORTED_100baseT_Half |
|
|
- SUPPORTED_100baseT_Full |
|
|
- SUPPORTED_Autoneg |
|
|
- SUPPORTED_TP);
|
|
- if (hw->ctrl_flags & ATL1C_LINK_CAP_1000M)
|
|
- ecmd->supported |= SUPPORTED_1000baseT_Full;
|
|
-
|
|
- ecmd->advertising = ADVERTISED_TP;
|
|
-
|
|
- ecmd->advertising |= hw->autoneg_advertised;
|
|
-
|
|
- ecmd->port = PORT_TP;
|
|
- ecmd->phy_address = 0;
|
|
- ecmd->transceiver = XCVR_INTERNAL;
|
|
-
|
|
- if (adapter->link_speed != SPEED_0) {
|
|
- ecmd->speed = adapter->link_speed;
|
|
- if (adapter->link_duplex == FULL_DUPLEX)
|
|
- ecmd->duplex = DUPLEX_FULL;
|
|
- else
|
|
- ecmd->duplex = DUPLEX_HALF;
|
|
- } else {
|
|
- ecmd->speed = -1;
|
|
- ecmd->duplex = -1;
|
|
- }
|
|
-
|
|
- ecmd->autoneg = AUTONEG_ENABLE;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int atl1c_set_settings(struct net_device *netdev,
|
|
- struct ethtool_cmd *ecmd)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- u16 autoneg_advertised;
|
|
-
|
|
- while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
|
|
- msleep(1);
|
|
-
|
|
- if (ecmd->autoneg == AUTONEG_ENABLE) {
|
|
- autoneg_advertised = ADVERTISED_Autoneg;
|
|
- } else {
|
|
- if (ecmd->speed == SPEED_1000) {
|
|
- if (ecmd->duplex != DUPLEX_FULL) {
|
|
- if (netif_msg_link(adapter))
|
|
- dev_warn(&adapter->pdev->dev,
|
|
- "1000M half is invalid\n");
|
|
- clear_bit(__AT_RESETTING, &adapter->flags);
|
|
- return -EINVAL;
|
|
- }
|
|
- autoneg_advertised = ADVERTISED_1000baseT_Full;
|
|
- } else if (ecmd->speed == SPEED_100) {
|
|
- if (ecmd->duplex == DUPLEX_FULL)
|
|
- autoneg_advertised = ADVERTISED_100baseT_Full;
|
|
- else
|
|
- autoneg_advertised = ADVERTISED_100baseT_Half;
|
|
- } else {
|
|
- if (ecmd->duplex == DUPLEX_FULL)
|
|
- autoneg_advertised = ADVERTISED_10baseT_Full;
|
|
- else
|
|
- autoneg_advertised = ADVERTISED_10baseT_Half;
|
|
- }
|
|
- }
|
|
-
|
|
- if (hw->autoneg_advertised != autoneg_advertised) {
|
|
- hw->autoneg_advertised = autoneg_advertised;
|
|
- if (atl1c_restart_autoneg(hw) != 0) {
|
|
- if (netif_msg_link(adapter))
|
|
- dev_warn(&adapter->pdev->dev,
|
|
- "ethtool speed/duplex setting failed\n");
|
|
- clear_bit(__AT_RESETTING, &adapter->flags);
|
|
- return -EINVAL;
|
|
- }
|
|
- }
|
|
- clear_bit(__AT_RESETTING, &adapter->flags);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static u32 atl1c_get_tx_csum(struct net_device *netdev)
|
|
-{
|
|
- return (netdev->features & NETIF_F_HW_CSUM) != 0;
|
|
-}
|
|
-
|
|
-static u32 atl1c_get_msglevel(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- return adapter->msg_enable;
|
|
-}
|
|
-
|
|
-static void atl1c_set_msglevel(struct net_device *netdev, u32 data)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- adapter->msg_enable = data;
|
|
-}
|
|
-
|
|
-static int atl1c_get_regs_len(struct net_device *netdev)
|
|
-{
|
|
- return AT_REGS_LEN;
|
|
-}
|
|
-
|
|
-static void atl1c_get_regs(struct net_device *netdev,
|
|
- struct ethtool_regs *regs, void *p)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- u32 *regs_buff = p;
|
|
- u16 phy_data;
|
|
-
|
|
- memset(p, 0, AT_REGS_LEN);
|
|
-
|
|
- regs->version = 0;
|
|
- AT_READ_REG(hw, REG_VPD_CAP, p++);
|
|
- AT_READ_REG(hw, REG_PM_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_MAC_HALF_DUPLX_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_TWSI_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_PCIE_DEV_MISC_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_MASTER_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_MANUAL_TIMER_INIT, p++);
|
|
- AT_READ_REG(hw, REG_IRQ_MODRT_TIMER_INIT, p++);
|
|
- AT_READ_REG(hw, REG_GPHY_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_LINK_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_IDLE_STATUS, p++);
|
|
- AT_READ_REG(hw, REG_MDIO_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_SERDES_LOCK, p++);
|
|
- AT_READ_REG(hw, REG_MAC_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_MAC_IPG_IFG, p++);
|
|
- AT_READ_REG(hw, REG_MAC_STA_ADDR, p++);
|
|
- AT_READ_REG(hw, REG_MAC_STA_ADDR+4, p++);
|
|
- AT_READ_REG(hw, REG_RX_HASH_TABLE, p++);
|
|
- AT_READ_REG(hw, REG_RX_HASH_TABLE+4, p++);
|
|
- AT_READ_REG(hw, REG_RXQ_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_TXQ_CTRL, p++);
|
|
- AT_READ_REG(hw, REG_MTU, p++);
|
|
- AT_READ_REG(hw, REG_WOL_CTRL, p++);
|
|
-
|
|
- atl1c_read_phy_reg(hw, MII_BMCR, &phy_data);
|
|
- regs_buff[73] = (u32) phy_data;
|
|
- atl1c_read_phy_reg(hw, MII_BMSR, &phy_data);
|
|
- regs_buff[74] = (u32) phy_data;
|
|
-}
|
|
-
|
|
-static int atl1c_get_eeprom_len(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- if (atl1c_check_eeprom_exist(&adapter->hw))
|
|
- return AT_EEPROM_LEN;
|
|
- else
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int atl1c_get_eeprom(struct net_device *netdev,
|
|
- struct ethtool_eeprom *eeprom, u8 *bytes)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- u32 *eeprom_buff;
|
|
- int first_dword, last_dword;
|
|
- int ret_val = 0;
|
|
- int i;
|
|
-
|
|
- if (eeprom->len == 0)
|
|
- return -EINVAL;
|
|
-
|
|
- if (!atl1c_check_eeprom_exist(hw)) /* not exist */
|
|
- return -EINVAL;
|
|
-
|
|
- eeprom->magic = adapter->pdev->vendor |
|
|
- (adapter->pdev->device << 16);
|
|
-
|
|
- first_dword = eeprom->offset >> 2;
|
|
- last_dword = (eeprom->offset + eeprom->len - 1) >> 2;
|
|
-
|
|
- eeprom_buff = kmalloc(sizeof(u32) *
|
|
- (last_dword - first_dword + 1), GFP_KERNEL);
|
|
- if (eeprom_buff == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
- for (i = first_dword; i < last_dword; i++) {
|
|
- if (!atl1c_read_eeprom(hw, i * 4, &(eeprom_buff[i-first_dword]))) {
|
|
- kfree(eeprom_buff);
|
|
- return -EIO;
|
|
- }
|
|
- }
|
|
-
|
|
- memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 3),
|
|
- eeprom->len);
|
|
- kfree(eeprom_buff);
|
|
-
|
|
- return ret_val;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void atl1c_get_drvinfo(struct net_device *netdev,
|
|
- struct ethtool_drvinfo *drvinfo)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- strncpy(drvinfo->driver, atl1c_driver_name, sizeof(drvinfo->driver));
|
|
- strncpy(drvinfo->version, atl1c_driver_version,
|
|
- sizeof(drvinfo->version));
|
|
- strncpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
|
|
- strncpy(drvinfo->bus_info, pci_name(adapter->pdev),
|
|
- sizeof(drvinfo->bus_info));
|
|
- drvinfo->n_stats = 0;
|
|
- drvinfo->testinfo_len = 0;
|
|
- drvinfo->regdump_len = atl1c_get_regs_len(netdev);
|
|
- drvinfo->eedump_len = atl1c_get_eeprom_len(netdev);
|
|
-}
|
|
-
|
|
-static void atl1c_get_wol(struct net_device *netdev,
|
|
- struct ethtool_wolinfo *wol)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- wol->supported = WAKE_MAGIC | WAKE_PHY;
|
|
- wol->wolopts = 0;
|
|
-
|
|
- if (adapter->wol & AT_WUFC_EX)
|
|
- wol->wolopts |= WAKE_UCAST;
|
|
- if (adapter->wol & AT_WUFC_MC)
|
|
- wol->wolopts |= WAKE_MCAST;
|
|
- if (adapter->wol & AT_WUFC_BC)
|
|
- wol->wolopts |= WAKE_BCAST;
|
|
- if (adapter->wol & AT_WUFC_MAG)
|
|
- wol->wolopts |= WAKE_MAGIC;
|
|
- if (adapter->wol & AT_WUFC_LNKC)
|
|
- wol->wolopts |= WAKE_PHY;
|
|
-
|
|
- return;
|
|
-}
|
|
-
|
|
-static int atl1c_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE |
|
|
- WAKE_MCAST | WAKE_BCAST | WAKE_MCAST))
|
|
- return -EOPNOTSUPP;
|
|
- /* these settings will always override what we currently have */
|
|
- adapter->wol = 0;
|
|
-
|
|
- if (wol->wolopts & WAKE_MAGIC)
|
|
- adapter->wol |= AT_WUFC_MAG;
|
|
- if (wol->wolopts & WAKE_PHY)
|
|
- adapter->wol |= AT_WUFC_LNKC;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int atl1c_nway_reset(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- if (netif_running(netdev))
|
|
- atl1c_reinit_locked(adapter);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static struct ethtool_ops atl1c_ethtool_ops = {
|
|
- .get_settings = atl1c_get_settings,
|
|
- .set_settings = atl1c_set_settings,
|
|
- .get_drvinfo = atl1c_get_drvinfo,
|
|
- .get_regs_len = atl1c_get_regs_len,
|
|
- .get_regs = atl1c_get_regs,
|
|
- .get_wol = atl1c_get_wol,
|
|
- .set_wol = atl1c_set_wol,
|
|
- .get_msglevel = atl1c_get_msglevel,
|
|
- .set_msglevel = atl1c_set_msglevel,
|
|
- .nway_reset = atl1c_nway_reset,
|
|
- .get_link = ethtool_op_get_link,
|
|
- .get_eeprom_len = atl1c_get_eeprom_len,
|
|
- .get_eeprom = atl1c_get_eeprom,
|
|
- .get_tx_csum = atl1c_get_tx_csum,
|
|
- .get_sg = ethtool_op_get_sg,
|
|
- .set_sg = ethtool_op_set_sg,
|
|
-};
|
|
-
|
|
-void atl1c_set_ethtool_ops(struct net_device *netdev)
|
|
-{
|
|
- SET_ETHTOOL_OPS(netdev, &atl1c_ethtool_ops);
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/atl1c/atl1c.h linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c.h
|
|
--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,606 +0,0 @@
|
|
-/*
|
|
- * Copyright(c) 2008 - 2009 Atheros Corporation. All rights reserved.
|
|
- *
|
|
- * Derived from Intel e1000 driver
|
|
- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the Free
|
|
- * Software Foundation; either version 2 of the License, or (at your option)
|
|
- * any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but WITHOUT
|
|
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
- * more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
- * this program; if not, write to the Free Software Foundation, Inc., 59
|
|
- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
- */
|
|
-
|
|
-#ifndef _ATL1C_H_
|
|
-#define _ATL1C_H_
|
|
-
|
|
-#include <linux/version.h>
|
|
-#include <linux/init.h>
|
|
-#include <linux/types.h>
|
|
-#include <linux/errno.h>
|
|
-#include <linux/module.h>
|
|
-#include <linux/pci.h>
|
|
-#include <linux/netdevice.h>
|
|
-#include <linux/etherdevice.h>
|
|
-#include <linux/skbuff.h>
|
|
-#include <linux/ioport.h>
|
|
-#include <linux/slab.h>
|
|
-#include <linux/list.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/sched.h>
|
|
-#include <linux/in.h>
|
|
-#include <linux/ip.h>
|
|
-#include <linux/ipv6.h>
|
|
-#include <linux/udp.h>
|
|
-#include <linux/mii.h>
|
|
-#include <linux/io.h>
|
|
-#include <linux/vmalloc.h>
|
|
-#include <linux/pagemap.h>
|
|
-#include <linux/tcp.h>
|
|
-#include <linux/mii.h>
|
|
-#include <linux/ethtool.h>
|
|
-#include <linux/if_vlan.h>
|
|
-#include <linux/workqueue.h>
|
|
-#include <net/checksum.h>
|
|
-#include <net/ip6_checksum.h>
|
|
-
|
|
-#include "atl1c_hw.h"
|
|
-
|
|
-/* Wake Up Filter Control */
|
|
-#define AT_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */
|
|
-#define AT_WUFC_MAG 0x00000002 /* Magic Packet Wakeup Enable */
|
|
-#define AT_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */
|
|
-#define AT_WUFC_MC 0x00000008 /* Multicast Wakeup Enable */
|
|
-#define AT_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */
|
|
-
|
|
-#define AT_VLAN_TO_TAG(_vlan, _tag) \
|
|
- _tag = ((((_vlan) >> 8) & 0xFF) |\
|
|
- (((_vlan) & 0xFF) << 8))
|
|
-
|
|
-#define AT_TAG_TO_VLAN(_tag, _vlan) \
|
|
- _vlan = ((((_tag) >> 8) & 0xFF) |\
|
|
- (((_tag) & 0xFF) << 8))
|
|
-
|
|
-#define SPEED_0 0xffff
|
|
-#define HALF_DUPLEX 1
|
|
-#define FULL_DUPLEX 2
|
|
-
|
|
-#define AT_RX_BUF_SIZE (ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN)
|
|
-#define MAX_JUMBO_FRAME_SIZE (9*1024)
|
|
-#define MAX_TX_OFFLOAD_THRESH (9*1024)
|
|
-
|
|
-#define AT_MAX_RECEIVE_QUEUE 4
|
|
-#define AT_DEF_RECEIVE_QUEUE 1
|
|
-#define AT_MAX_TRANSMIT_QUEUE 2
|
|
-
|
|
-#define AT_DMA_HI_ADDR_MASK 0xffffffff00000000ULL
|
|
-#define AT_DMA_LO_ADDR_MASK 0x00000000ffffffffULL
|
|
-
|
|
-#define AT_TX_WATCHDOG (5 * HZ)
|
|
-#define AT_MAX_INT_WORK 5
|
|
-#define AT_TWSI_EEPROM_TIMEOUT 100
|
|
-#define AT_HW_MAX_IDLE_DELAY 10
|
|
-#define AT_SUSPEND_LINK_TIMEOUT 28
|
|
-
|
|
-#define AT_ASPM_L0S_TIMER 6
|
|
-#define AT_ASPM_L1_TIMER 12
|
|
-
|
|
-#define ATL1C_PCIE_L0S_L1_DISABLE 0x01
|
|
-#define ATL1C_PCIE_PHY_RESET 0x02
|
|
-
|
|
-#define ATL1C_ASPM_L0s_ENABLE 0x0001
|
|
-#define ATL1C_ASPM_L1_ENABLE 0x0002
|
|
-
|
|
-#define AT_REGS_LEN (75 * sizeof(u32))
|
|
-#define AT_EEPROM_LEN 512
|
|
-
|
|
-#define ATL1C_GET_DESC(R, i, type) (&(((type *)((R)->desc))[i]))
|
|
-#define ATL1C_RFD_DESC(R, i) ATL1C_GET_DESC(R, i, struct atl1c_rx_free_desc)
|
|
-#define ATL1C_TPD_DESC(R, i) ATL1C_GET_DESC(R, i, struct atl1c_tpd_desc)
|
|
-#define ATL1C_RRD_DESC(R, i) ATL1C_GET_DESC(R, i, struct atl1c_recv_ret_status)
|
|
-
|
|
-/* tpd word 1 bit 0:7 General Checksum task offload */
|
|
-#define TPD_L4HDR_OFFSET_MASK 0x00FF
|
|
-#define TPD_L4HDR_OFFSET_SHIFT 0
|
|
-
|
|
-/* tpd word 1 bit 0:7 Large Send task offload (IPv4/IPV6) */
|
|
-#define TPD_TCPHDR_OFFSET_MASK 0x00FF
|
|
-#define TPD_TCPHDR_OFFSET_SHIFT 0
|
|
-
|
|
-/* tpd word 1 bit 0:7 Custom Checksum task offload */
|
|
-#define TPD_PLOADOFFSET_MASK 0x00FF
|
|
-#define TPD_PLOADOFFSET_SHIFT 0
|
|
-
|
|
-/* tpd word 1 bit 8:17 */
|
|
-#define TPD_CCSUM_EN_MASK 0x0001
|
|
-#define TPD_CCSUM_EN_SHIFT 8
|
|
-#define TPD_IP_CSUM_MASK 0x0001
|
|
-#define TPD_IP_CSUM_SHIFT 9
|
|
-#define TPD_TCP_CSUM_MASK 0x0001
|
|
-#define TPD_TCP_CSUM_SHIFT 10
|
|
-#define TPD_UDP_CSUM_MASK 0x0001
|
|
-#define TPD_UDP_CSUM_SHIFT 11
|
|
-#define TPD_LSO_EN_MASK 0x0001 /* TCP Large Send Offload */
|
|
-#define TPD_LSO_EN_SHIFT 12
|
|
-#define TPD_LSO_VER_MASK 0x0001
|
|
-#define TPD_LSO_VER_SHIFT 13 /* 0 : ipv4; 1 : ipv4/ipv6 */
|
|
-#define TPD_CON_VTAG_MASK 0x0001
|
|
-#define TPD_CON_VTAG_SHIFT 14
|
|
-#define TPD_INS_VTAG_MASK 0x0001
|
|
-#define TPD_INS_VTAG_SHIFT 15
|
|
-#define TPD_IPV4_PACKET_MASK 0x0001 /* valid when LSO VER is 1 */
|
|
-#define TPD_IPV4_PACKET_SHIFT 16
|
|
-#define TPD_ETH_TYPE_MASK 0x0001
|
|
-#define TPD_ETH_TYPE_SHIFT 17 /* 0 : 802.3 frame; 1 : Ethernet */
|
|
-
|
|
-/* tpd word 18:25 Custom Checksum task offload */
|
|
-#define TPD_CCSUM_OFFSET_MASK 0x00FF
|
|
-#define TPD_CCSUM_OFFSET_SHIFT 18
|
|
-#define TPD_CCSUM_EPAD_MASK 0x0001
|
|
-#define TPD_CCSUM_EPAD_SHIFT 30
|
|
-
|
|
-/* tpd word 18:30 Large Send task offload (IPv4/IPV6) */
|
|
-#define TPD_MSS_MASK 0x1FFF
|
|
-#define TPD_MSS_SHIFT 18
|
|
-
|
|
-#define TPD_EOP_MASK 0x0001
|
|
-#define TPD_EOP_SHIFT 31
|
|
-
|
|
-struct atl1c_tpd_desc {
|
|
- __le16 buffer_len; /* include 4-byte CRC */
|
|
- __le16 vlan_tag;
|
|
- __le32 word1;
|
|
- __le64 buffer_addr;
|
|
-};
|
|
-
|
|
-struct atl1c_tpd_ext_desc {
|
|
- u32 reservd_0;
|
|
- __le32 word1;
|
|
- __le32 pkt_len;
|
|
- u32 reservd_1;
|
|
-};
|
|
-/* rrs word 0 bit 0:31 */
|
|
-#define RRS_RX_CSUM_MASK 0xFFFF
|
|
-#define RRS_RX_CSUM_SHIFT 0
|
|
-#define RRS_RX_RFD_CNT_MASK 0x000F
|
|
-#define RRS_RX_RFD_CNT_SHIFT 16
|
|
-#define RRS_RX_RFD_INDEX_MASK 0x0FFF
|
|
-#define RRS_RX_RFD_INDEX_SHIFT 20
|
|
-
|
|
-/* rrs flag bit 0:16 */
|
|
-#define RRS_HEAD_LEN_MASK 0x00FF
|
|
-#define RRS_HEAD_LEN_SHIFT 0
|
|
-#define RRS_HDS_TYPE_MASK 0x0003
|
|
-#define RRS_HDS_TYPE_SHIFT 8
|
|
-#define RRS_CPU_NUM_MASK 0x0003
|
|
-#define RRS_CPU_NUM_SHIFT 10
|
|
-#define RRS_HASH_FLG_MASK 0x000F
|
|
-#define RRS_HASH_FLG_SHIFT 12
|
|
-
|
|
-#define RRS_HDS_TYPE_HEAD 1
|
|
-#define RRS_HDS_TYPE_DATA 2
|
|
-
|
|
-#define RRS_IS_NO_HDS_TYPE(flag) \
|
|
- (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == 0)
|
|
-
|
|
-#define RRS_IS_HDS_HEAD(flag) \
|
|
- (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \
|
|
- RRS_HDS_TYPE_HEAD)
|
|
-
|
|
-#define RRS_IS_HDS_DATA(flag) \
|
|
- (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \
|
|
- RRS_HDS_TYPE_DATA)
|
|
-
|
|
-/* rrs word 3 bit 0:31 */
|
|
-#define RRS_PKT_SIZE_MASK 0x3FFF
|
|
-#define RRS_PKT_SIZE_SHIFT 0
|
|
-#define RRS_ERR_L4_CSUM_MASK 0x0001
|
|
-#define RRS_ERR_L4_CSUM_SHIFT 14
|
|
-#define RRS_ERR_IP_CSUM_MASK 0x0001
|
|
-#define RRS_ERR_IP_CSUM_SHIFT 15
|
|
-#define RRS_VLAN_INS_MASK 0x0001
|
|
-#define RRS_VLAN_INS_SHIFT 16
|
|
-#define RRS_PROT_ID_MASK 0x0007
|
|
-#define RRS_PROT_ID_SHIFT 17
|
|
-#define RRS_RX_ERR_SUM_MASK 0x0001
|
|
-#define RRS_RX_ERR_SUM_SHIFT 20
|
|
-#define RRS_RX_ERR_CRC_MASK 0x0001
|
|
-#define RRS_RX_ERR_CRC_SHIFT 21
|
|
-#define RRS_RX_ERR_FAE_MASK 0x0001
|
|
-#define RRS_RX_ERR_FAE_SHIFT 22
|
|
-#define RRS_RX_ERR_TRUNC_MASK 0x0001
|
|
-#define RRS_RX_ERR_TRUNC_SHIFT 23
|
|
-#define RRS_RX_ERR_RUNC_MASK 0x0001
|
|
-#define RRS_RX_ERR_RUNC_SHIFT 24
|
|
-#define RRS_RX_ERR_ICMP_MASK 0x0001
|
|
-#define RRS_RX_ERR_ICMP_SHIFT 25
|
|
-#define RRS_PACKET_BCAST_MASK 0x0001
|
|
-#define RRS_PACKET_BCAST_SHIFT 26
|
|
-#define RRS_PACKET_MCAST_MASK 0x0001
|
|
-#define RRS_PACKET_MCAST_SHIFT 27
|
|
-#define RRS_PACKET_TYPE_MASK 0x0001
|
|
-#define RRS_PACKET_TYPE_SHIFT 28
|
|
-#define RRS_FIFO_FULL_MASK 0x0001
|
|
-#define RRS_FIFO_FULL_SHIFT 29
|
|
-#define RRS_802_3_LEN_ERR_MASK 0x0001
|
|
-#define RRS_802_3_LEN_ERR_SHIFT 30
|
|
-#define RRS_RXD_UPDATED_MASK 0x0001
|
|
-#define RRS_RXD_UPDATED_SHIFT 31
|
|
-
|
|
-#define RRS_ERR_L4_CSUM 0x00004000
|
|
-#define RRS_ERR_IP_CSUM 0x00008000
|
|
-#define RRS_VLAN_INS 0x00010000
|
|
-#define RRS_RX_ERR_SUM 0x00100000
|
|
-#define RRS_RX_ERR_CRC 0x00200000
|
|
-#define RRS_802_3_LEN_ERR 0x40000000
|
|
-#define RRS_RXD_UPDATED 0x80000000
|
|
-
|
|
-#define RRS_PACKET_TYPE_802_3 1
|
|
-#define RRS_PACKET_TYPE_ETH 0
|
|
-#define RRS_PACKET_IS_ETH(word) \
|
|
- (((word) >> RRS_PACKET_TYPE_SHIFT) & RRS_PACKET_TYPE_MASK == \
|
|
- RRS_PACKET_TYPE_ETH)
|
|
-#define RRS_RXD_IS_VALID(word) \
|
|
- ((((word) >> RRS_RXD_UPDATED_SHIFT) & RRS_RXD_UPDATED_MASK) == 1)
|
|
-
|
|
-#define RRS_PACKET_PROT_IS_IPV4_ONLY(word) \
|
|
- ((((word) >> RRS_PROT_ID_SHIFT) & RRS_PROT_ID_MASK) == 1)
|
|
-#define RRS_PACKET_PROT_IS_IPV6_ONLY(word) \
|
|
- ((((word) >> RRS_PROT_ID_SHIFT) & RRS_PROT_ID_MASK) == 6)
|
|
-
|
|
-struct atl1c_recv_ret_status {
|
|
- __le32 word0;
|
|
- __le32 rss_hash;
|
|
- __le16 vlan_tag;
|
|
- __le16 flag;
|
|
- __le32 word3;
|
|
-};
|
|
-
|
|
-/* RFD desciptor */
|
|
-struct atl1c_rx_free_desc {
|
|
- __le64 buffer_addr;
|
|
-};
|
|
-
|
|
-/* DMA Order Settings */
|
|
-enum atl1c_dma_order {
|
|
- atl1c_dma_ord_in = 1,
|
|
- atl1c_dma_ord_enh = 2,
|
|
- atl1c_dma_ord_out = 4
|
|
-};
|
|
-
|
|
-enum atl1c_dma_rcb {
|
|
- atl1c_rcb_64 = 0,
|
|
- atl1c_rcb_128 = 1
|
|
-};
|
|
-
|
|
-enum atl1c_mac_speed {
|
|
- atl1c_mac_speed_0 = 0,
|
|
- atl1c_mac_speed_10_100 = 1,
|
|
- atl1c_mac_speed_1000 = 2
|
|
-};
|
|
-
|
|
-enum atl1c_dma_req_block {
|
|
- atl1c_dma_req_128 = 0,
|
|
- atl1c_dma_req_256 = 1,
|
|
- atl1c_dma_req_512 = 2,
|
|
- atl1c_dma_req_1024 = 3,
|
|
- atl1c_dma_req_2048 = 4,
|
|
- atl1c_dma_req_4096 = 5
|
|
-};
|
|
-
|
|
-enum atl1c_rss_mode {
|
|
- atl1c_rss_mode_disable = 0,
|
|
- atl1c_rss_sig_que = 1,
|
|
- atl1c_rss_mul_que_sig_int = 2,
|
|
- atl1c_rss_mul_que_mul_int = 4,
|
|
-};
|
|
-
|
|
-enum atl1c_rss_type {
|
|
- atl1c_rss_disable = 0,
|
|
- atl1c_rss_ipv4 = 1,
|
|
- atl1c_rss_ipv4_tcp = 2,
|
|
- atl1c_rss_ipv6 = 4,
|
|
- atl1c_rss_ipv6_tcp = 8
|
|
-};
|
|
-
|
|
-enum atl1c_nic_type {
|
|
- athr_l1c = 0,
|
|
- athr_l2c = 1,
|
|
-};
|
|
-
|
|
-enum atl1c_trans_queue {
|
|
- atl1c_trans_normal = 0,
|
|
- atl1c_trans_high = 1
|
|
-};
|
|
-
|
|
-struct atl1c_hw_stats {
|
|
- /* rx */
|
|
- unsigned long rx_ok; /* The number of good packet received. */
|
|
- unsigned long rx_bcast; /* The number of good broadcast packet received. */
|
|
- unsigned long rx_mcast; /* The number of good multicast packet received. */
|
|
- unsigned long rx_pause; /* The number of Pause packet received. */
|
|
- unsigned long rx_ctrl; /* The number of Control packet received other than Pause frame. */
|
|
- unsigned long rx_fcs_err; /* The number of packets with bad FCS. */
|
|
- unsigned long rx_len_err; /* The number of packets with mismatch of length field and actual size. */
|
|
- unsigned long rx_byte_cnt; /* The number of bytes of good packet received. FCS is NOT included. */
|
|
- unsigned long rx_runt; /* The number of packets received that are less than 64 byte long and with good FCS. */
|
|
- unsigned long rx_frag; /* The number of packets received that are less than 64 byte long and with bad FCS. */
|
|
- unsigned long rx_sz_64; /* The number of good and bad packets received that are 64 byte long. */
|
|
- unsigned long rx_sz_65_127; /* The number of good and bad packets received that are between 65 and 127-byte long. */
|
|
- unsigned long rx_sz_128_255; /* The number of good and bad packets received that are between 128 and 255-byte long. */
|
|
- unsigned long rx_sz_256_511; /* The number of good and bad packets received that are between 256 and 511-byte long. */
|
|
- unsigned long rx_sz_512_1023; /* The number of good and bad packets received that are between 512 and 1023-byte long. */
|
|
- unsigned long rx_sz_1024_1518; /* The number of good and bad packets received that are between 1024 and 1518-byte long. */
|
|
- unsigned long rx_sz_1519_max; /* The number of good and bad packets received that are between 1519-byte and MTU. */
|
|
- unsigned long rx_sz_ov; /* The number of good and bad packets received that are more than MTU size truncated by Selene. */
|
|
- unsigned long rx_rxf_ov; /* The number of frame dropped due to occurrence of RX FIFO overflow. */
|
|
- unsigned long rx_rrd_ov; /* The number of frame dropped due to occurrence of RRD overflow. */
|
|
- unsigned long rx_align_err; /* Alignment Error */
|
|
- unsigned long rx_bcast_byte_cnt; /* The byte count of broadcast packet received, excluding FCS. */
|
|
- unsigned long rx_mcast_byte_cnt; /* The byte count of multicast packet received, excluding FCS. */
|
|
- unsigned long rx_err_addr; /* The number of packets dropped due to address filtering. */
|
|
-
|
|
- /* tx */
|
|
- unsigned long tx_ok; /* The number of good packet transmitted. */
|
|
- unsigned long tx_bcast; /* The number of good broadcast packet transmitted. */
|
|
- unsigned long tx_mcast; /* The number of good multicast packet transmitted. */
|
|
- unsigned long tx_pause; /* The number of Pause packet transmitted. */
|
|
- unsigned long tx_exc_defer; /* The number of packets transmitted with excessive deferral. */
|
|
- unsigned long tx_ctrl; /* The number of packets transmitted is a control frame, excluding Pause frame. */
|
|
- unsigned long tx_defer; /* The number of packets transmitted that is deferred. */
|
|
- unsigned long tx_byte_cnt; /* The number of bytes of data transmitted. FCS is NOT included. */
|
|
- unsigned long tx_sz_64; /* The number of good and bad packets transmitted that are 64 byte long. */
|
|
- unsigned long tx_sz_65_127; /* The number of good and bad packets transmitted that are between 65 and 127-byte long. */
|
|
- unsigned long tx_sz_128_255; /* The number of good and bad packets transmitted that are between 128 and 255-byte long. */
|
|
- unsigned long tx_sz_256_511; /* The number of good and bad packets transmitted that are between 256 and 511-byte long. */
|
|
- unsigned long tx_sz_512_1023; /* The number of good and bad packets transmitted that are between 512 and 1023-byte long. */
|
|
- unsigned long tx_sz_1024_1518; /* The number of good and bad packets transmitted that are between 1024 and 1518-byte long. */
|
|
- unsigned long tx_sz_1519_max; /* The number of good and bad packets transmitted that are between 1519-byte and MTU. */
|
|
- unsigned long tx_1_col; /* The number of packets subsequently transmitted successfully with a single prior collision. */
|
|
- unsigned long tx_2_col; /* The number of packets subsequently transmitted successfully with multiple prior collisions. */
|
|
- unsigned long tx_late_col; /* The number of packets transmitted with late collisions. */
|
|
- unsigned long tx_abort_col; /* The number of transmit packets aborted due to excessive collisions. */
|
|
- unsigned long tx_underrun; /* The number of transmit packets aborted due to transmit FIFO underrun, or TRD FIFO underrun */
|
|
- unsigned long tx_rd_eop; /* The number of times that read beyond the EOP into the next frame area when TRD was not written timely */
|
|
- unsigned long tx_len_err; /* The number of transmit packets with length field does NOT match the actual frame size. */
|
|
- unsigned long tx_trunc; /* The number of transmit packets truncated due to size exceeding MTU. */
|
|
- unsigned long tx_bcast_byte; /* The byte count of broadcast packet transmitted, excluding FCS. */
|
|
- unsigned long tx_mcast_byte; /* The byte count of multicast packet transmitted, excluding FCS. */
|
|
-};
|
|
-
|
|
-struct atl1c_hw {
|
|
- u8 __iomem *hw_addr; /* inner register address */
|
|
- struct atl1c_adapter *adapter;
|
|
- enum atl1c_nic_type nic_type;
|
|
- enum atl1c_dma_order dma_order;
|
|
- enum atl1c_dma_rcb rcb_value;
|
|
- enum atl1c_dma_req_block dmar_block;
|
|
- enum atl1c_dma_req_block dmaw_block;
|
|
-
|
|
- u16 device_id;
|
|
- u16 vendor_id;
|
|
- u16 subsystem_id;
|
|
- u16 subsystem_vendor_id;
|
|
- u8 revision_id;
|
|
-
|
|
- u32 intr_mask;
|
|
- u8 dmaw_dly_cnt;
|
|
- u8 dmar_dly_cnt;
|
|
-
|
|
- u8 preamble_len;
|
|
- u16 max_frame_size;
|
|
- u16 min_frame_size;
|
|
-
|
|
- enum atl1c_mac_speed mac_speed;
|
|
- bool mac_duplex;
|
|
- bool hibernate;
|
|
- u16 media_type;
|
|
-#define MEDIA_TYPE_AUTO_SENSOR 0
|
|
-#define MEDIA_TYPE_100M_FULL 1
|
|
-#define MEDIA_TYPE_100M_HALF 2
|
|
-#define MEDIA_TYPE_10M_FULL 3
|
|
-#define MEDIA_TYPE_10M_HALF 4
|
|
-
|
|
- u16 autoneg_advertised;
|
|
- u16 mii_autoneg_adv_reg;
|
|
- u16 mii_1000t_ctrl_reg;
|
|
-
|
|
- u16 tx_imt; /* TX Interrupt Moderator timer ( 2us resolution) */
|
|
- u16 rx_imt; /* RX Interrupt Moderator timer ( 2us resolution) */
|
|
- u16 ict; /* Interrupt Clear timer (2us resolution) */
|
|
- u16 ctrl_flags;
|
|
-#define ATL1C_INTR_CLEAR_ON_READ 0x0001
|
|
-#define ATL1C_INTR_MODRT_ENABLE 0x0002
|
|
-#define ATL1C_CMB_ENABLE 0x0004
|
|
-#define ATL1C_SMB_ENABLE 0x0010
|
|
-#define ATL1C_TXQ_MODE_ENHANCE 0x0020
|
|
-#define ATL1C_RX_IPV6_CHKSUM 0x0040
|
|
-#define ATL1C_ASPM_L0S_SUPPORT 0x0080
|
|
-#define ATL1C_ASPM_L1_SUPPORT 0x0100
|
|
-#define ATL1C_ASPM_CTRL_MON 0x0200
|
|
-#define ATL1C_HIB_DISABLE 0x0400
|
|
-#define ATL1C_LINK_CAP_1000M 0x0800
|
|
-#define ATL1C_FPGA_VERSION 0x8000
|
|
- u16 cmb_tpd;
|
|
- u16 cmb_rrd;
|
|
- u16 cmb_rx_timer; /* 2us resolution */
|
|
- u16 cmb_tx_timer;
|
|
- u32 smb_timer;
|
|
-
|
|
- u16 rrd_thresh; /* Threshold of number of RRD produced to trigger
|
|
- interrupt request */
|
|
- u16 tpd_thresh;
|
|
- u8 tpd_burst; /* Number of TPD to prefetch in cache-aligned burst. */
|
|
- u8 rfd_burst;
|
|
- enum atl1c_rss_type rss_type;
|
|
- enum atl1c_rss_mode rss_mode;
|
|
- u8 rss_hash_bits;
|
|
- u32 base_cpu;
|
|
- u32 indirect_tab;
|
|
- u8 mac_addr[ETH_ALEN];
|
|
- u8 perm_mac_addr[ETH_ALEN];
|
|
-
|
|
- bool phy_configured;
|
|
- bool re_autoneg;
|
|
- bool emi_ca;
|
|
-};
|
|
-
|
|
-/*
|
|
- * atl1c_ring_header represents a single, contiguous block of DMA space
|
|
- * mapped for the three descriptor rings (tpd, rfd, rrd) and the two
|
|
- * message blocks (cmb, smb) described below
|
|
- */
|
|
-struct atl1c_ring_header {
|
|
- void *desc; /* virtual address */
|
|
- dma_addr_t dma; /* physical address*/
|
|
- unsigned int size; /* length in bytes */
|
|
-};
|
|
-
|
|
-/*
|
|
- * atl1c_buffer is wrapper around a pointer to a socket buffer
|
|
- * so a DMA handle can be stored along with the skb
|
|
- */
|
|
-struct atl1c_buffer {
|
|
- struct sk_buff *skb; /* socket buffer */
|
|
- u16 length; /* rx buffer length */
|
|
- u16 state; /* state of buffer */
|
|
-#define ATL1_BUFFER_FREE 0
|
|
-#define ATL1_BUFFER_BUSY 1
|
|
- dma_addr_t dma;
|
|
-};
|
|
-
|
|
-/* transimit packet descriptor (tpd) ring */
|
|
-struct atl1c_tpd_ring {
|
|
- void *desc; /* descriptor ring virtual address */
|
|
- dma_addr_t dma; /* descriptor ring physical address */
|
|
- u16 size; /* descriptor ring length in bytes */
|
|
- u16 count; /* number of descriptors in the ring */
|
|
- u16 next_to_use; /* this is protectd by adapter->tx_lock */
|
|
- atomic_t next_to_clean;
|
|
- struct atl1c_buffer *buffer_info;
|
|
-};
|
|
-
|
|
-/* receive free descriptor (rfd) ring */
|
|
-struct atl1c_rfd_ring {
|
|
- void *desc; /* descriptor ring virtual address */
|
|
- dma_addr_t dma; /* descriptor ring physical address */
|
|
- u16 size; /* descriptor ring length in bytes */
|
|
- u16 count; /* number of descriptors in the ring */
|
|
- u16 next_to_use;
|
|
- u16 next_to_clean;
|
|
- struct atl1c_buffer *buffer_info;
|
|
-};
|
|
-
|
|
-/* receive return desciptor (rrd) ring */
|
|
-struct atl1c_rrd_ring {
|
|
- void *desc; /* descriptor ring virtual address */
|
|
- dma_addr_t dma; /* descriptor ring physical address */
|
|
- u16 size; /* descriptor ring length in bytes */
|
|
- u16 count; /* number of descriptors in the ring */
|
|
- u16 next_to_use;
|
|
- u16 next_to_clean;
|
|
-};
|
|
-
|
|
-struct atl1c_cmb {
|
|
- void *cmb;
|
|
- dma_addr_t dma;
|
|
-};
|
|
-
|
|
-struct atl1c_smb {
|
|
- void *smb;
|
|
- dma_addr_t dma;
|
|
-};
|
|
-
|
|
-/* board specific private data structure */
|
|
-struct atl1c_adapter {
|
|
- struct net_device *netdev;
|
|
- struct pci_dev *pdev;
|
|
- struct vlan_group *vlgrp;
|
|
- struct napi_struct napi;
|
|
- struct atl1c_hw hw;
|
|
- struct atl1c_hw_stats hw_stats;
|
|
- struct net_device_stats net_stats;
|
|
- struct mii_if_info mii; /* MII interface info */
|
|
- u16 rx_buffer_len;
|
|
-
|
|
- unsigned long flags;
|
|
-#define __AT_TESTING 0x0001
|
|
-#define __AT_RESETTING 0x0002
|
|
-#define __AT_DOWN 0x0003
|
|
- u32 msg_enable;
|
|
-
|
|
- bool have_msi;
|
|
- u32 wol;
|
|
- u16 link_speed;
|
|
- u16 link_duplex;
|
|
-
|
|
- spinlock_t mdio_lock;
|
|
- spinlock_t tx_lock;
|
|
- atomic_t irq_sem;
|
|
-
|
|
- struct work_struct reset_task;
|
|
- struct work_struct link_chg_task;
|
|
- struct timer_list watchdog_timer;
|
|
- struct timer_list phy_config_timer;
|
|
-
|
|
- /* All Descriptor memory */
|
|
- struct atl1c_ring_header ring_header;
|
|
- struct atl1c_tpd_ring tpd_ring[AT_MAX_TRANSMIT_QUEUE];
|
|
- struct atl1c_rfd_ring rfd_ring[AT_MAX_RECEIVE_QUEUE];
|
|
- struct atl1c_rrd_ring rrd_ring[AT_MAX_RECEIVE_QUEUE];
|
|
- struct atl1c_cmb cmb;
|
|
- struct atl1c_smb smb;
|
|
- int num_rx_queues;
|
|
- u32 bd_number; /* board number;*/
|
|
-};
|
|
-
|
|
-#define AT_WRITE_REG(a, reg, value) ( \
|
|
- writel((value), ((a)->hw_addr + reg)))
|
|
-
|
|
-#define AT_WRITE_FLUSH(a) (\
|
|
- readl((a)->hw_addr))
|
|
-
|
|
-#define AT_READ_REG(a, reg, pdata) do { \
|
|
- if (unlikely((a)->hibernate)) { \
|
|
- readl((a)->hw_addr + reg); \
|
|
- *(u32 *)pdata = readl((a)->hw_addr + reg); \
|
|
- } else { \
|
|
- *(u32 *)pdata = readl((a)->hw_addr + reg); \
|
|
- } \
|
|
- } while (0)
|
|
-
|
|
-#define AT_WRITE_REGB(a, reg, value) (\
|
|
- writeb((value), ((a)->hw_addr + reg)))
|
|
-
|
|
-#define AT_READ_REGB(a, reg) (\
|
|
- readb((a)->hw_addr + reg))
|
|
-
|
|
-#define AT_WRITE_REGW(a, reg, value) (\
|
|
- writew((value), ((a)->hw_addr + reg)))
|
|
-
|
|
-#define AT_READ_REGW(a, reg) (\
|
|
- readw((a)->hw_addr + reg))
|
|
-
|
|
-#define AT_WRITE_REG_ARRAY(a, reg, offset, value) ( \
|
|
- writel((value), (((a)->hw_addr + reg) + ((offset) << 2))))
|
|
-
|
|
-#define AT_READ_REG_ARRAY(a, reg, offset) ( \
|
|
- readl(((a)->hw_addr + reg) + ((offset) << 2)))
|
|
-
|
|
-extern char atl1c_driver_name[];
|
|
-extern char atl1c_driver_version[];
|
|
-
|
|
-extern int atl1c_up(struct atl1c_adapter *adapter);
|
|
-extern void atl1c_down(struct atl1c_adapter *adapter);
|
|
-extern void atl1c_reinit_locked(struct atl1c_adapter *adapter);
|
|
-extern s32 atl1c_reset_hw(struct atl1c_hw *hw);
|
|
-extern void atl1c_set_ethtool_ops(struct net_device *netdev);
|
|
-#endif /* _ATL1C_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/atl1c/atl1c_hw.c linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_hw.c
|
|
--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c_hw.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_hw.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,527 +0,0 @@
|
|
-/*
|
|
- * Copyright(c) 2007 Atheros Corporation. All rights reserved.
|
|
- *
|
|
- * Derived from Intel e1000 driver
|
|
- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the Free
|
|
- * Software Foundation; either version 2 of the License, or (at your option)
|
|
- * any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but WITHOUT
|
|
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
- * more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
- * this program; if not, write to the Free Software Foundation, Inc., 59
|
|
- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
- */
|
|
-#include <linux/pci.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/mii.h>
|
|
-#include <linux/crc32.h>
|
|
-
|
|
-#include "atl1c.h"
|
|
-
|
|
-/*
|
|
- * check_eeprom_exist
|
|
- * return 1 if eeprom exist
|
|
- */
|
|
-int atl1c_check_eeprom_exist(struct atl1c_hw *hw)
|
|
-{
|
|
- u32 data;
|
|
-
|
|
- AT_READ_REG(hw, REG_TWSI_DEBUG, &data);
|
|
- if (data & TWSI_DEBUG_DEV_EXIST)
|
|
- return 1;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void atl1c_hw_set_mac_addr(struct atl1c_hw *hw)
|
|
-{
|
|
- u32 value;
|
|
- /*
|
|
- * 00-0B-6A-F6-00-DC
|
|
- * 0: 6AF600DC 1: 000B
|
|
- * low dword
|
|
- */
|
|
- value = (((u32)hw->mac_addr[2]) << 24) |
|
|
- (((u32)hw->mac_addr[3]) << 16) |
|
|
- (((u32)hw->mac_addr[4]) << 8) |
|
|
- (((u32)hw->mac_addr[5])) ;
|
|
- AT_WRITE_REG_ARRAY(hw, REG_MAC_STA_ADDR, 0, value);
|
|
- /* hight dword */
|
|
- value = (((u32)hw->mac_addr[0]) << 8) |
|
|
- (((u32)hw->mac_addr[1])) ;
|
|
- AT_WRITE_REG_ARRAY(hw, REG_MAC_STA_ADDR, 1, value);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_get_permanent_address
|
|
- * return 0 if get valid mac address,
|
|
- */
|
|
-static int atl1c_get_permanent_address(struct atl1c_hw *hw)
|
|
-{
|
|
- u32 addr[2];
|
|
- u32 i;
|
|
- u32 otp_ctrl_data;
|
|
- u32 twsi_ctrl_data;
|
|
- u8 eth_addr[ETH_ALEN];
|
|
-
|
|
- /* init */
|
|
- addr[0] = addr[1] = 0;
|
|
- AT_READ_REG(hw, REG_OTP_CTRL, &otp_ctrl_data);
|
|
- if (atl1c_check_eeprom_exist(hw)) {
|
|
- /* Enable OTP CLK */
|
|
- if (!(otp_ctrl_data & OTP_CTRL_CLK_EN)) {
|
|
- otp_ctrl_data |= OTP_CTRL_CLK_EN;
|
|
- AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data);
|
|
- AT_WRITE_FLUSH(hw);
|
|
- msleep(1);
|
|
- }
|
|
-
|
|
- AT_READ_REG(hw, REG_TWSI_CTRL, &twsi_ctrl_data);
|
|
- twsi_ctrl_data |= TWSI_CTRL_SW_LDSTART;
|
|
- AT_WRITE_REG(hw, REG_TWSI_CTRL, twsi_ctrl_data);
|
|
- for (i = 0; i < AT_TWSI_EEPROM_TIMEOUT; i++) {
|
|
- msleep(10);
|
|
- AT_READ_REG(hw, REG_TWSI_CTRL, &twsi_ctrl_data);
|
|
- if ((twsi_ctrl_data & TWSI_CTRL_SW_LDSTART) == 0)
|
|
- break;
|
|
- }
|
|
- if (i >= AT_TWSI_EEPROM_TIMEOUT)
|
|
- return -1;
|
|
- }
|
|
- /* Disable OTP_CLK */
|
|
- if (otp_ctrl_data & OTP_CTRL_CLK_EN) {
|
|
- otp_ctrl_data &= ~OTP_CTRL_CLK_EN;
|
|
- AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data);
|
|
- AT_WRITE_FLUSH(hw);
|
|
- msleep(1);
|
|
- }
|
|
-
|
|
- /* maybe MAC-address is from BIOS */
|
|
- AT_READ_REG(hw, REG_MAC_STA_ADDR, &addr[0]);
|
|
- AT_READ_REG(hw, REG_MAC_STA_ADDR + 4, &addr[1]);
|
|
- *(u32 *) ð_addr[2] = swab32(addr[0]);
|
|
- *(u16 *) ð_addr[0] = swab16(*(u16 *)&addr[1]);
|
|
-
|
|
- if (is_valid_ether_addr(eth_addr)) {
|
|
- memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- return -1;
|
|
-}
|
|
-
|
|
-bool atl1c_read_eeprom(struct atl1c_hw *hw, u32 offset, u32 *p_value)
|
|
-{
|
|
- int i;
|
|
- int ret = false;
|
|
- u32 otp_ctrl_data;
|
|
- u32 control;
|
|
- u32 data;
|
|
-
|
|
- if (offset & 3)
|
|
- return ret; /* address do not align */
|
|
-
|
|
- AT_READ_REG(hw, REG_OTP_CTRL, &otp_ctrl_data);
|
|
- if (!(otp_ctrl_data & OTP_CTRL_CLK_EN))
|
|
- AT_WRITE_REG(hw, REG_OTP_CTRL,
|
|
- (otp_ctrl_data | OTP_CTRL_CLK_EN));
|
|
-
|
|
- AT_WRITE_REG(hw, REG_EEPROM_DATA_LO, 0);
|
|
- control = (offset & EEPROM_CTRL_ADDR_MASK) << EEPROM_CTRL_ADDR_SHIFT;
|
|
- AT_WRITE_REG(hw, REG_EEPROM_CTRL, control);
|
|
-
|
|
- for (i = 0; i < 10; i++) {
|
|
- udelay(100);
|
|
- AT_READ_REG(hw, REG_EEPROM_CTRL, &control);
|
|
- if (control & EEPROM_CTRL_RW)
|
|
- break;
|
|
- }
|
|
- if (control & EEPROM_CTRL_RW) {
|
|
- AT_READ_REG(hw, REG_EEPROM_CTRL, &data);
|
|
- AT_READ_REG(hw, REG_EEPROM_DATA_LO, p_value);
|
|
- data = data & 0xFFFF;
|
|
- *p_value = swab32((data << 16) | (*p_value >> 16));
|
|
- ret = true;
|
|
- }
|
|
- if (!(otp_ctrl_data & OTP_CTRL_CLK_EN))
|
|
- AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-/*
|
|
- * Reads the adapter's MAC address from the EEPROM
|
|
- *
|
|
- * hw - Struct containing variables accessed by shared code
|
|
- */
|
|
-int atl1c_read_mac_addr(struct atl1c_hw *hw)
|
|
-{
|
|
- int err = 0;
|
|
-
|
|
- err = atl1c_get_permanent_address(hw);
|
|
- if (err)
|
|
- random_ether_addr(hw->perm_mac_addr);
|
|
-
|
|
- memcpy(hw->mac_addr, hw->perm_mac_addr, sizeof(hw->perm_mac_addr));
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_hash_mc_addr
|
|
- * purpose
|
|
- * set hash value for a multicast address
|
|
- * hash calcu processing :
|
|
- * 1. calcu 32bit CRC for multicast address
|
|
- * 2. reverse crc with MSB to LSB
|
|
- */
|
|
-u32 atl1c_hash_mc_addr(struct atl1c_hw *hw, u8 *mc_addr)
|
|
-{
|
|
- u32 crc32;
|
|
- u32 value = 0;
|
|
- int i;
|
|
-
|
|
- crc32 = ether_crc_le(6, mc_addr);
|
|
- for (i = 0; i < 32; i++)
|
|
- value |= (((crc32 >> i) & 1) << (31 - i));
|
|
-
|
|
- return value;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Sets the bit in the multicast table corresponding to the hash value.
|
|
- * hw - Struct containing variables accessed by shared code
|
|
- * hash_value - Multicast address hash value
|
|
- */
|
|
-void atl1c_hash_set(struct atl1c_hw *hw, u32 hash_value)
|
|
-{
|
|
- u32 hash_bit, hash_reg;
|
|
- u32 mta;
|
|
-
|
|
- /*
|
|
- * The HASH Table is a register array of 2 32-bit registers.
|
|
- * It is treated like an array of 64 bits. We want to set
|
|
- * bit BitArray[hash_value]. So we figure out what register
|
|
- * the bit is in, read it, OR in the new bit, then write
|
|
- * back the new value. The register is determined by the
|
|
- * upper bit of the hash value and the bit within that
|
|
- * register are determined by the lower 5 bits of the value.
|
|
- */
|
|
- hash_reg = (hash_value >> 31) & 0x1;
|
|
- hash_bit = (hash_value >> 26) & 0x1F;
|
|
-
|
|
- mta = AT_READ_REG_ARRAY(hw, REG_RX_HASH_TABLE, hash_reg);
|
|
-
|
|
- mta |= (1 << hash_bit);
|
|
-
|
|
- AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, hash_reg, mta);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Reads the value from a PHY register
|
|
- * hw - Struct containing variables accessed by shared code
|
|
- * reg_addr - address of the PHY register to read
|
|
- */
|
|
-int atl1c_read_phy_reg(struct atl1c_hw *hw, u16 reg_addr, u16 *phy_data)
|
|
-{
|
|
- u32 val;
|
|
- int i;
|
|
-
|
|
- val = ((u32)(reg_addr & MDIO_REG_ADDR_MASK)) << MDIO_REG_ADDR_SHIFT |
|
|
- MDIO_START | MDIO_SUP_PREAMBLE | MDIO_RW |
|
|
- MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_MDIO_CTRL, val);
|
|
-
|
|
- for (i = 0; i < MDIO_WAIT_TIMES; i++) {
|
|
- udelay(2);
|
|
- AT_READ_REG(hw, REG_MDIO_CTRL, &val);
|
|
- if (!(val & (MDIO_START | MDIO_BUSY)))
|
|
- break;
|
|
- }
|
|
- if (!(val & (MDIO_START | MDIO_BUSY))) {
|
|
- *phy_data = (u16)val;
|
|
- return 0;
|
|
- }
|
|
-
|
|
- return -1;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Writes a value to a PHY register
|
|
- * hw - Struct containing variables accessed by shared code
|
|
- * reg_addr - address of the PHY register to write
|
|
- * data - data to write to the PHY
|
|
- */
|
|
-int atl1c_write_phy_reg(struct atl1c_hw *hw, u32 reg_addr, u16 phy_data)
|
|
-{
|
|
- int i;
|
|
- u32 val;
|
|
-
|
|
- val = ((u32)(phy_data & MDIO_DATA_MASK)) << MDIO_DATA_SHIFT |
|
|
- (reg_addr & MDIO_REG_ADDR_MASK) << MDIO_REG_ADDR_SHIFT |
|
|
- MDIO_SUP_PREAMBLE | MDIO_START |
|
|
- MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_MDIO_CTRL, val);
|
|
-
|
|
- for (i = 0; i < MDIO_WAIT_TIMES; i++) {
|
|
- udelay(2);
|
|
- AT_READ_REG(hw, REG_MDIO_CTRL, &val);
|
|
- if (!(val & (MDIO_START | MDIO_BUSY)))
|
|
- break;
|
|
- }
|
|
-
|
|
- if (!(val & (MDIO_START | MDIO_BUSY)))
|
|
- return 0;
|
|
-
|
|
- return -1;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Configures PHY autoneg and flow control advertisement settings
|
|
- *
|
|
- * hw - Struct containing variables accessed by shared code
|
|
- */
|
|
-static int atl1c_phy_setup_adv(struct atl1c_hw *hw)
|
|
-{
|
|
- u16 mii_adv_data = ADVERTISE_DEFAULT_CAP & ~ADVERTISE_SPEED_MASK;
|
|
- u16 mii_giga_ctrl_data = GIGA_CR_1000T_DEFAULT_CAP &
|
|
- ~GIGA_CR_1000T_SPEED_MASK;
|
|
-
|
|
- if (hw->autoneg_advertised & ADVERTISED_10baseT_Half)
|
|
- mii_adv_data |= ADVERTISE_10HALF;
|
|
- if (hw->autoneg_advertised & ADVERTISED_10baseT_Full)
|
|
- mii_adv_data |= ADVERTISE_10FULL;
|
|
- if (hw->autoneg_advertised & ADVERTISED_100baseT_Half)
|
|
- mii_adv_data |= ADVERTISE_100HALF;
|
|
- if (hw->autoneg_advertised & ADVERTISED_100baseT_Full)
|
|
- mii_adv_data |= ADVERTISE_100FULL;
|
|
-
|
|
- if (hw->autoneg_advertised & ADVERTISED_Autoneg)
|
|
- mii_adv_data |= ADVERTISE_10HALF | ADVERTISE_10FULL |
|
|
- ADVERTISE_100HALF | ADVERTISE_100FULL;
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_LINK_CAP_1000M) {
|
|
- if (hw->autoneg_advertised & ADVERTISED_1000baseT_Half)
|
|
- mii_giga_ctrl_data |= ADVERTISE_1000HALF;
|
|
- if (hw->autoneg_advertised & ADVERTISED_1000baseT_Full)
|
|
- mii_giga_ctrl_data |= ADVERTISE_1000FULL;
|
|
- if (hw->autoneg_advertised & ADVERTISED_Autoneg)
|
|
- mii_giga_ctrl_data |= ADVERTISE_1000HALF |
|
|
- ADVERTISE_1000FULL;
|
|
- }
|
|
-
|
|
- if (atl1c_write_phy_reg(hw, MII_ADVERTISE, mii_adv_data) != 0 ||
|
|
- atl1c_write_phy_reg(hw, MII_GIGA_CR, mii_giga_ctrl_data) != 0)
|
|
- return -1;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void atl1c_phy_disable(struct atl1c_hw *hw)
|
|
-{
|
|
- AT_WRITE_REGW(hw, REG_GPHY_CTRL,
|
|
- GPHY_CTRL_PW_WOL_DIS | GPHY_CTRL_EXT_RESET);
|
|
-}
|
|
-
|
|
-static void atl1c_phy_magic_data(struct atl1c_hw *hw)
|
|
-{
|
|
- u16 data;
|
|
-
|
|
- data = ANA_LOOP_SEL_10BT | ANA_EN_MASK_TB | ANA_EN_10BT_IDLE |
|
|
- ((1 & ANA_INTERVAL_SEL_TIMER_MASK) <<
|
|
- ANA_INTERVAL_SEL_TIMER_SHIFT);
|
|
-
|
|
- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_18);
|
|
- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
|
|
-
|
|
- data = (2 & ANA_SERDES_CDR_BW_MASK) | ANA_MS_PAD_DBG |
|
|
- ANA_SERDES_EN_DEEM | ANA_SERDES_SEL_HSP | ANA_SERDES_EN_PLL |
|
|
- ANA_SERDES_EN_LCKDT;
|
|
-
|
|
- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_5);
|
|
- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
|
|
-
|
|
- data = (44 & ANA_LONG_CABLE_TH_100_MASK) |
|
|
- ((33 & ANA_SHORT_CABLE_TH_100_MASK) <<
|
|
- ANA_SHORT_CABLE_TH_100_SHIFT) | ANA_BP_BAD_LINK_ACCUM |
|
|
- ANA_BP_SMALL_BW;
|
|
-
|
|
- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_54);
|
|
- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
|
|
-
|
|
- data = (11 & ANA_IECHO_ADJ_MASK) | ((11 & ANA_IECHO_ADJ_MASK) <<
|
|
- ANA_IECHO_ADJ_2_SHIFT) | ((8 & ANA_IECHO_ADJ_MASK) <<
|
|
- ANA_IECHO_ADJ_1_SHIFT) | ((8 & ANA_IECHO_ADJ_MASK) <<
|
|
- ANA_IECHO_ADJ_0_SHIFT);
|
|
-
|
|
- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_4);
|
|
- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
|
|
-
|
|
- data = ANA_RESTART_CAL | ((7 & ANA_MANUL_SWICH_ON_MASK) <<
|
|
- ANA_MANUL_SWICH_ON_SHIFT) | ANA_MAN_ENABLE |
|
|
- ANA_SEL_HSP | ANA_EN_HB | ANA_OEN_125M;
|
|
-
|
|
- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_0);
|
|
- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_HIB_DISABLE) {
|
|
- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_41);
|
|
- if (atl1c_read_phy_reg(hw, MII_DBG_DATA, &data) != 0)
|
|
- return;
|
|
- data &= ~ANA_TOP_PS_EN;
|
|
- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
|
|
-
|
|
- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_11);
|
|
- if (atl1c_read_phy_reg(hw, MII_DBG_DATA, &data) != 0)
|
|
- return;
|
|
- data &= ~ANA_PS_HIB_EN;
|
|
- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
|
|
- }
|
|
-}
|
|
-
|
|
-int atl1c_phy_reset(struct atl1c_hw *hw)
|
|
-{
|
|
- struct atl1c_adapter *adapter = hw->adapter;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- u32 phy_ctrl_data = GPHY_CTRL_DEFAULT;
|
|
- u32 mii_ier_data = IER_LINK_UP | IER_LINK_DOWN;
|
|
- int err;
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_HIB_DISABLE)
|
|
- phy_ctrl_data &= ~GPHY_CTRL_HIB_EN;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_GPHY_CTRL, phy_ctrl_data);
|
|
- AT_WRITE_FLUSH(hw);
|
|
- msleep(40);
|
|
- phy_ctrl_data |= GPHY_CTRL_EXT_RESET;
|
|
- AT_WRITE_REG(hw, REG_GPHY_CTRL, phy_ctrl_data);
|
|
- AT_WRITE_FLUSH(hw);
|
|
- msleep(10);
|
|
-
|
|
- /*Enable PHY LinkChange Interrupt */
|
|
- err = atl1c_write_phy_reg(hw, MII_IER, mii_ier_data);
|
|
- if (err) {
|
|
- if (netif_msg_hw(adapter))
|
|
- dev_err(&pdev->dev,
|
|
- "Error enable PHY linkChange Interrupt\n");
|
|
- return err;
|
|
- }
|
|
- if (!(hw->ctrl_flags & ATL1C_FPGA_VERSION))
|
|
- atl1c_phy_magic_data(hw);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int atl1c_phy_init(struct atl1c_hw *hw)
|
|
-{
|
|
- struct atl1c_adapter *adapter = (struct atl1c_adapter *)hw->adapter;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- int ret_val;
|
|
- u16 mii_bmcr_data = BMCR_RESET;
|
|
- u16 phy_id1, phy_id2;
|
|
-
|
|
- if ((atl1c_read_phy_reg(hw, MII_PHYSID1, &phy_id1) != 0) ||
|
|
- (atl1c_read_phy_reg(hw, MII_PHYSID2, &phy_id2) != 0)) {
|
|
- if (netif_msg_link(adapter))
|
|
- dev_err(&pdev->dev, "Error get phy ID\n");
|
|
- return -1;
|
|
- }
|
|
- switch (hw->media_type) {
|
|
- case MEDIA_TYPE_AUTO_SENSOR:
|
|
- ret_val = atl1c_phy_setup_adv(hw);
|
|
- if (ret_val) {
|
|
- if (netif_msg_link(adapter))
|
|
- dev_err(&pdev->dev,
|
|
- "Error Setting up Auto-Negotiation\n");
|
|
- return ret_val;
|
|
- }
|
|
- mii_bmcr_data |= BMCR_AUTO_NEG_EN | BMCR_RESTART_AUTO_NEG;
|
|
- break;
|
|
- case MEDIA_TYPE_100M_FULL:
|
|
- mii_bmcr_data |= BMCR_SPEED_100 | BMCR_FULL_DUPLEX;
|
|
- break;
|
|
- case MEDIA_TYPE_100M_HALF:
|
|
- mii_bmcr_data |= BMCR_SPEED_100;
|
|
- break;
|
|
- case MEDIA_TYPE_10M_FULL:
|
|
- mii_bmcr_data |= BMCR_SPEED_10 | BMCR_FULL_DUPLEX;
|
|
- break;
|
|
- case MEDIA_TYPE_10M_HALF:
|
|
- mii_bmcr_data |= BMCR_SPEED_10;
|
|
- break;
|
|
- default:
|
|
- if (netif_msg_link(adapter))
|
|
- dev_err(&pdev->dev, "Wrong Media type %d\n",
|
|
- hw->media_type);
|
|
- return -1;
|
|
- break;
|
|
- }
|
|
-
|
|
- ret_val = atl1c_write_phy_reg(hw, MII_BMCR, mii_bmcr_data);
|
|
- if (ret_val)
|
|
- return ret_val;
|
|
- hw->phy_configured = true;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Detects the current speed and duplex settings of the hardware.
|
|
- *
|
|
- * hw - Struct containing variables accessed by shared code
|
|
- * speed - Speed of the connection
|
|
- * duplex - Duplex setting of the connection
|
|
- */
|
|
-int atl1c_get_speed_and_duplex(struct atl1c_hw *hw, u16 *speed, u16 *duplex)
|
|
-{
|
|
- int err;
|
|
- u16 phy_data;
|
|
-
|
|
- /* Read PHY Specific Status Register (17) */
|
|
- err = atl1c_read_phy_reg(hw, MII_GIGA_PSSR, &phy_data);
|
|
- if (err)
|
|
- return err;
|
|
-
|
|
- if (!(phy_data & GIGA_PSSR_SPD_DPLX_RESOLVED))
|
|
- return -1;
|
|
-
|
|
- switch (phy_data & GIGA_PSSR_SPEED) {
|
|
- case GIGA_PSSR_1000MBS:
|
|
- *speed = SPEED_1000;
|
|
- break;
|
|
- case GIGA_PSSR_100MBS:
|
|
- *speed = SPEED_100;
|
|
- break;
|
|
- case GIGA_PSSR_10MBS:
|
|
- *speed = SPEED_10;
|
|
- break;
|
|
- default:
|
|
- return -1;
|
|
- break;
|
|
- }
|
|
-
|
|
- if (phy_data & GIGA_PSSR_DPLX)
|
|
- *duplex = FULL_DUPLEX;
|
|
- else
|
|
- *duplex = HALF_DUPLEX;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int atl1c_restart_autoneg(struct atl1c_hw *hw)
|
|
-{
|
|
- int err = 0;
|
|
- u16 mii_bmcr_data = BMCR_RESET;
|
|
-
|
|
- err = atl1c_phy_setup_adv(hw);
|
|
- if (err)
|
|
- return err;
|
|
- mii_bmcr_data |= BMCR_AUTO_NEG_EN | BMCR_RESTART_AUTO_NEG;
|
|
-
|
|
- return atl1c_write_phy_reg(hw, MII_BMCR, mii_bmcr_data);
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/atl1c/atl1c_hw.h linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_hw.h
|
|
--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c_hw.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_hw.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,859 +0,0 @@
|
|
-/*
|
|
- * Copyright(c) 2008 - 2009 Atheros Corporation. All rights reserved.
|
|
- *
|
|
- * Derived from Intel e1000 driver
|
|
- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the Free
|
|
- * Software Foundation; either version 2 of the License, or (at your option)
|
|
- * any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but WITHOUT
|
|
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
- * more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
- * this program; if not, write to the Free Software Foundation, Inc., 59
|
|
- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
- */
|
|
-
|
|
-#ifndef _ATL1C_HW_H_
|
|
-#define _ATL1C_HW_H_
|
|
-
|
|
-#include <linux/types.h>
|
|
-#include <linux/mii.h>
|
|
-
|
|
-struct atl1c_adapter;
|
|
-struct atl1c_hw;
|
|
-
|
|
-/* function prototype */
|
|
-void atl1c_phy_disable(struct atl1c_hw *hw);
|
|
-void atl1c_hw_set_mac_addr(struct atl1c_hw *hw);
|
|
-int atl1c_phy_reset(struct atl1c_hw *hw);
|
|
-int atl1c_read_mac_addr(struct atl1c_hw *hw);
|
|
-int atl1c_get_speed_and_duplex(struct atl1c_hw *hw, u16 *speed, u16 *duplex);
|
|
-u32 atl1c_hash_mc_addr(struct atl1c_hw *hw, u8 *mc_addr);
|
|
-void atl1c_hash_set(struct atl1c_hw *hw, u32 hash_value);
|
|
-int atl1c_read_phy_reg(struct atl1c_hw *hw, u16 reg_addr, u16 *phy_data);
|
|
-int atl1c_write_phy_reg(struct atl1c_hw *hw, u32 reg_addr, u16 phy_data);
|
|
-bool atl1c_read_eeprom(struct atl1c_hw *hw, u32 offset, u32 *p_value);
|
|
-int atl1c_phy_init(struct atl1c_hw *hw);
|
|
-int atl1c_check_eeprom_exist(struct atl1c_hw *hw);
|
|
-int atl1c_restart_autoneg(struct atl1c_hw *hw);
|
|
-
|
|
-/* register definition */
|
|
-#define REG_DEVICE_CAP 0x5C
|
|
-#define DEVICE_CAP_MAX_PAYLOAD_MASK 0x7
|
|
-#define DEVICE_CAP_MAX_PAYLOAD_SHIFT 0
|
|
-
|
|
-#define REG_DEVICE_CTRL 0x60
|
|
-#define DEVICE_CTRL_MAX_PAYLOAD_MASK 0x7
|
|
-#define DEVICE_CTRL_MAX_PAYLOAD_SHIFT 5
|
|
-#define DEVICE_CTRL_MAX_RREQ_SZ_MASK 0x7
|
|
-#define DEVICE_CTRL_MAX_RREQ_SZ_SHIFT 12
|
|
-
|
|
-#define REG_LINK_CTRL 0x68
|
|
-#define LINK_CTRL_L0S_EN 0x01
|
|
-#define LINK_CTRL_L1_EN 0x02
|
|
-
|
|
-#define REG_VPD_CAP 0x6C
|
|
-#define VPD_CAP_ID_MASK 0xff
|
|
-#define VPD_CAP_ID_SHIFT 0
|
|
-#define VPD_CAP_NEXT_PTR_MASK 0xFF
|
|
-#define VPD_CAP_NEXT_PTR_SHIFT 8
|
|
-#define VPD_CAP_VPD_ADDR_MASK 0x7FFF
|
|
-#define VPD_CAP_VPD_ADDR_SHIFT 16
|
|
-#define VPD_CAP_VPD_FLAG 0x80000000
|
|
-
|
|
-#define REG_VPD_DATA 0x70
|
|
-
|
|
-#define REG_PCIE_UC_SEVERITY 0x10C
|
|
-#define PCIE_UC_SERVRITY_TRN 0x00000001
|
|
-#define PCIE_UC_SERVRITY_DLP 0x00000010
|
|
-#define PCIE_UC_SERVRITY_PSN_TLP 0x00001000
|
|
-#define PCIE_UC_SERVRITY_FCP 0x00002000
|
|
-#define PCIE_UC_SERVRITY_CPL_TO 0x00004000
|
|
-#define PCIE_UC_SERVRITY_CA 0x00008000
|
|
-#define PCIE_UC_SERVRITY_UC 0x00010000
|
|
-#define PCIE_UC_SERVRITY_ROV 0x00020000
|
|
-#define PCIE_UC_SERVRITY_MLFP 0x00040000
|
|
-#define PCIE_UC_SERVRITY_ECRC 0x00080000
|
|
-#define PCIE_UC_SERVRITY_UR 0x00100000
|
|
-
|
|
-#define REG_DEV_SERIALNUM_CTRL 0x200
|
|
-#define REG_DEV_MAC_SEL_MASK 0x0 /* 0:EUI; 1:MAC */
|
|
-#define REG_DEV_MAC_SEL_SHIFT 0
|
|
-#define REG_DEV_SERIAL_NUM_EN_MASK 0x1
|
|
-#define REG_DEV_SERIAL_NUM_EN_SHIFT 1
|
|
-
|
|
-#define REG_TWSI_CTRL 0x218
|
|
-#define TWSI_CTRL_LD_OFFSET_MASK 0xFF
|
|
-#define TWSI_CTRL_LD_OFFSET_SHIFT 0
|
|
-#define TWSI_CTRL_LD_SLV_ADDR_MASK 0x7
|
|
-#define TWSI_CTRL_LD_SLV_ADDR_SHIFT 8
|
|
-#define TWSI_CTRL_SW_LDSTART 0x800
|
|
-#define TWSI_CTRL_HW_LDSTART 0x1000
|
|
-#define TWSI_CTRL_SMB_SLV_ADDR_MASK 0x7F
|
|
-#define TWSI_CTRL_SMB_SLV_ADDR_SHIFT 15
|
|
-#define TWSI_CTRL_LD_EXIST 0x400000
|
|
-#define TWSI_CTRL_READ_FREQ_SEL_MASK 0x3
|
|
-#define TWSI_CTRL_READ_FREQ_SEL_SHIFT 23
|
|
-#define TWSI_CTRL_FREQ_SEL_100K 0
|
|
-#define TWSI_CTRL_FREQ_SEL_200K 1
|
|
-#define TWSI_CTRL_FREQ_SEL_300K 2
|
|
-#define TWSI_CTRL_FREQ_SEL_400K 3
|
|
-#define TWSI_CTRL_SMB_SLV_ADDR
|
|
-#define TWSI_CTRL_WRITE_FREQ_SEL_MASK 0x3
|
|
-#define TWSI_CTRL_WRITE_FREQ_SEL_SHIFT 24
|
|
-
|
|
-
|
|
-#define REG_PCIE_DEV_MISC_CTRL 0x21C
|
|
-#define PCIE_DEV_MISC_EXT_PIPE 0x2
|
|
-#define PCIE_DEV_MISC_RETRY_BUFDIS 0x1
|
|
-#define PCIE_DEV_MISC_SPIROM_EXIST 0x4
|
|
-#define PCIE_DEV_MISC_SERDES_ENDIAN 0x8
|
|
-#define PCIE_DEV_MISC_SERDES_SEL_DIN 0x10
|
|
-
|
|
-#define REG_PCIE_PHYMISC 0x1000
|
|
-#define PCIE_PHYMISC_FORCE_RCV_DET 0x4
|
|
-
|
|
-#define REG_TWSI_DEBUG 0x1108
|
|
-#define TWSI_DEBUG_DEV_EXIST 0x20000000
|
|
-
|
|
-#define REG_EEPROM_CTRL 0x12C0
|
|
-#define EEPROM_CTRL_DATA_HI_MASK 0xFFFF
|
|
-#define EEPROM_CTRL_DATA_HI_SHIFT 0
|
|
-#define EEPROM_CTRL_ADDR_MASK 0x3FF
|
|
-#define EEPROM_CTRL_ADDR_SHIFT 16
|
|
-#define EEPROM_CTRL_ACK 0x40000000
|
|
-#define EEPROM_CTRL_RW 0x80000000
|
|
-
|
|
-#define REG_EEPROM_DATA_LO 0x12C4
|
|
-
|
|
-#define REG_OTP_CTRL 0x12F0
|
|
-#define OTP_CTRL_CLK_EN 0x0002
|
|
-
|
|
-#define REG_PM_CTRL 0x12F8
|
|
-#define PM_CTRL_SDES_EN 0x00000001
|
|
-#define PM_CTRL_RBER_EN 0x00000002
|
|
-#define PM_CTRL_CLK_REQ_EN 0x00000004
|
|
-#define PM_CTRL_ASPM_L1_EN 0x00000008
|
|
-#define PM_CTRL_SERDES_L1_EN 0x00000010
|
|
-#define PM_CTRL_SERDES_PLL_L1_EN 0x00000020
|
|
-#define PM_CTRL_SERDES_PD_EX_L1 0x00000040
|
|
-#define PM_CTRL_SERDES_BUDS_RX_L1_EN 0x00000080
|
|
-#define PM_CTRL_L0S_ENTRY_TIMER_MASK 0xF
|
|
-#define PM_CTRL_L0S_ENTRY_TIMER_SHIFT 8
|
|
-#define PM_CTRL_ASPM_L0S_EN 0x00001000
|
|
-#define PM_CTRL_CLK_SWH_L1 0x00002000
|
|
-#define PM_CTRL_CLK_PWM_VER1_1 0x00004000
|
|
-#define PM_CTRL_PCIE_RECV 0x00008000
|
|
-#define PM_CTRL_L1_ENTRY_TIMER_MASK 0xF
|
|
-#define PM_CTRL_L1_ENTRY_TIMER_SHIFT 16
|
|
-#define PM_CTRL_PM_REQ_TIMER_MASK 0xF
|
|
-#define PM_CTRL_PM_REQ_TIMER_SHIFT 20
|
|
-#define PM_CTRL_LCKDET_TIMER_MASK 0x3F
|
|
-#define PM_CTRL_LCKDET_TIMER_SHIFT 24
|
|
-#define PM_CTRL_MAC_ASPM_CHK 0x40000000
|
|
-#define PM_CTRL_HOTRST 0x80000000
|
|
-
|
|
-/* Selene Master Control Register */
|
|
-#define REG_MASTER_CTRL 0x1400
|
|
-#define MASTER_CTRL_SOFT_RST 0x1
|
|
-#define MASTER_CTRL_TEST_MODE_MASK 0x3
|
|
-#define MASTER_CTRL_TEST_MODE_SHIFT 2
|
|
-#define MASTER_CTRL_BERT_START 0x10
|
|
-#define MASTER_CTRL_MTIMER_EN 0x100
|
|
-#define MASTER_CTRL_MANUAL_INT 0x200
|
|
-#define MASTER_CTRL_TX_ITIMER_EN 0x400
|
|
-#define MASTER_CTRL_RX_ITIMER_EN 0x800
|
|
-#define MASTER_CTRL_CLK_SEL_DIS 0x1000
|
|
-#define MASTER_CTRL_CLK_SWH_MODE 0x2000
|
|
-#define MASTER_CTRL_INT_RDCLR 0x4000
|
|
-#define MASTER_CTRL_REV_NUM_SHIFT 16
|
|
-#define MASTER_CTRL_REV_NUM_MASK 0xff
|
|
-#define MASTER_CTRL_DEV_ID_SHIFT 24
|
|
-#define MASTER_CTRL_DEV_ID_MASK 0x7f
|
|
-#define MASTER_CTRL_OTP_SEL 0x80000000
|
|
-
|
|
-/* Timer Initial Value Register */
|
|
-#define REG_MANUAL_TIMER_INIT 0x1404
|
|
-
|
|
-/* IRQ ModeratorTimer Initial Value Register */
|
|
-#define REG_IRQ_MODRT_TIMER_INIT 0x1408
|
|
-#define IRQ_MODRT_TIMER_MASK 0xffff
|
|
-#define IRQ_MODRT_TX_TIMER_SHIFT 0
|
|
-#define IRQ_MODRT_RX_TIMER_SHIFT 16
|
|
-
|
|
-#define REG_GPHY_CTRL 0x140C
|
|
-#define GPHY_CTRL_EXT_RESET 0x1
|
|
-#define GPHY_CTRL_RTL_MODE 0x2
|
|
-#define GPHY_CTRL_LED_MODE 0x4
|
|
-#define GPHY_CTRL_ANEG_NOW 0x8
|
|
-#define GPHY_CTRL_REV_ANEG 0x10
|
|
-#define GPHY_CTRL_GATE_25M_EN 0x20
|
|
-#define GPHY_CTRL_LPW_EXIT 0x40
|
|
-#define GPHY_CTRL_PHY_IDDQ 0x80
|
|
-#define GPHY_CTRL_PHY_IDDQ_DIS 0x100
|
|
-#define GPHY_CTRL_GIGA_DIS 0x200
|
|
-#define GPHY_CTRL_HIB_EN 0x400
|
|
-#define GPHY_CTRL_HIB_PULSE 0x800
|
|
-#define GPHY_CTRL_SEL_ANA_RST 0x1000
|
|
-#define GPHY_CTRL_PHY_PLL_ON 0x2000
|
|
-#define GPHY_CTRL_PWDOWN_HW 0x4000
|
|
-#define GPHY_CTRL_PHY_PLL_BYPASS 0x8000
|
|
-
|
|
-#define GPHY_CTRL_DEFAULT ( \
|
|
- GPHY_CTRL_SEL_ANA_RST |\
|
|
- GPHY_CTRL_HIB_PULSE |\
|
|
- GPHY_CTRL_HIB_EN)
|
|
-
|
|
-#define GPHY_CTRL_PW_WOL_DIS ( \
|
|
- GPHY_CTRL_SEL_ANA_RST |\
|
|
- GPHY_CTRL_HIB_PULSE |\
|
|
- GPHY_CTRL_HIB_EN |\
|
|
- GPHY_CTRL_PWDOWN_HW |\
|
|
- GPHY_CTRL_PHY_IDDQ)
|
|
-
|
|
-/* Block IDLE Status Register */
|
|
-#define REG_IDLE_STATUS 0x1410
|
|
-#define IDLE_STATUS_MASK 0x00FF
|
|
-#define IDLE_STATUS_RXMAC_NO_IDLE 0x1
|
|
-#define IDLE_STATUS_TXMAC_NO_IDLE 0x2
|
|
-#define IDLE_STATUS_RXQ_NO_IDLE 0x4
|
|
-#define IDLE_STATUS_TXQ_NO_IDLE 0x8
|
|
-#define IDLE_STATUS_DMAR_NO_IDLE 0x10
|
|
-#define IDLE_STATUS_DMAW_NO_IDLE 0x20
|
|
-#define IDLE_STATUS_SMB_NO_IDLE 0x40
|
|
-#define IDLE_STATUS_CMB_NO_IDLE 0x80
|
|
-
|
|
-/* MDIO Control Register */
|
|
-#define REG_MDIO_CTRL 0x1414
|
|
-#define MDIO_DATA_MASK 0xffff /* On MDIO write, the 16-bit
|
|
- * control data to write to PHY
|
|
- * MII management register */
|
|
-#define MDIO_DATA_SHIFT 0 /* On MDIO read, the 16-bit
|
|
- * status data that was read
|
|
- * from the PHY MII management register */
|
|
-#define MDIO_REG_ADDR_MASK 0x1f /* MDIO register address */
|
|
-#define MDIO_REG_ADDR_SHIFT 16
|
|
-#define MDIO_RW 0x200000 /* 1: read, 0: write */
|
|
-#define MDIO_SUP_PREAMBLE 0x400000 /* Suppress preamble */
|
|
-#define MDIO_START 0x800000 /* Write 1 to initiate the MDIO
|
|
- * master. And this bit is self
|
|
- * cleared after one cycle */
|
|
-#define MDIO_CLK_SEL_SHIFT 24
|
|
-#define MDIO_CLK_25_4 0
|
|
-#define MDIO_CLK_25_6 2
|
|
-#define MDIO_CLK_25_8 3
|
|
-#define MDIO_CLK_25_10 4
|
|
-#define MDIO_CLK_25_14 5
|
|
-#define MDIO_CLK_25_20 6
|
|
-#define MDIO_CLK_25_28 7
|
|
-#define MDIO_BUSY 0x8000000
|
|
-#define MDIO_AP_EN 0x10000000
|
|
-#define MDIO_WAIT_TIMES 10
|
|
-
|
|
-/* MII PHY Status Register */
|
|
-#define REG_PHY_STATUS 0x1418
|
|
-#define PHY_GENERAL_STATUS_MASK 0xFFFF
|
|
-#define PHY_STATUS_RECV_ENABLE 0x0001
|
|
-#define PHY_OE_PWSP_STATUS_MASK 0x07FF
|
|
-#define PHY_OE_PWSP_STATUS_SHIFT 16
|
|
-#define PHY_STATUS_LPW_STATE 0x80000000
|
|
-/* BIST Control and Status Register0 (for the Packet Memory) */
|
|
-#define REG_BIST0_CTRL 0x141c
|
|
-#define BIST0_NOW 0x1
|
|
-#define BIST0_SRAM_FAIL 0x2 /* 1: The SRAM failure is
|
|
- * un-repairable because
|
|
- * it has address decoder
|
|
- * failure or more than 1 cell
|
|
- * stuck-to-x failure */
|
|
-#define BIST0_FUSE_FLAG 0x4
|
|
-
|
|
-/* BIST Control and Status Register1(for the retry buffer of PCI Express) */
|
|
-#define REG_BIST1_CTRL 0x1420
|
|
-#define BIST1_NOW 0x1
|
|
-#define BIST1_SRAM_FAIL 0x2
|
|
-#define BIST1_FUSE_FLAG 0x4
|
|
-
|
|
-/* SerDes Lock Detect Control and Status Register */
|
|
-#define REG_SERDES_LOCK 0x1424
|
|
-#define SERDES_LOCK_DETECT 0x1 /* SerDes lock detected. This signal
|
|
- * comes from Analog SerDes */
|
|
-#define SERDES_LOCK_DETECT_EN 0x2 /* 1: Enable SerDes Lock detect function */
|
|
-
|
|
-/* MAC Control Register */
|
|
-#define REG_MAC_CTRL 0x1480
|
|
-#define MAC_CTRL_TX_EN 0x1
|
|
-#define MAC_CTRL_RX_EN 0x2
|
|
-#define MAC_CTRL_TX_FLOW 0x4
|
|
-#define MAC_CTRL_RX_FLOW 0x8
|
|
-#define MAC_CTRL_LOOPBACK 0x10
|
|
-#define MAC_CTRL_DUPLX 0x20
|
|
-#define MAC_CTRL_ADD_CRC 0x40
|
|
-#define MAC_CTRL_PAD 0x80
|
|
-#define MAC_CTRL_LENCHK 0x100
|
|
-#define MAC_CTRL_HUGE_EN 0x200
|
|
-#define MAC_CTRL_PRMLEN_SHIFT 10
|
|
-#define MAC_CTRL_PRMLEN_MASK 0xf
|
|
-#define MAC_CTRL_RMV_VLAN 0x4000
|
|
-#define MAC_CTRL_PROMIS_EN 0x8000
|
|
-#define MAC_CTRL_TX_PAUSE 0x10000
|
|
-#define MAC_CTRL_SCNT 0x20000
|
|
-#define MAC_CTRL_SRST_TX 0x40000
|
|
-#define MAC_CTRL_TX_SIMURST 0x80000
|
|
-#define MAC_CTRL_SPEED_SHIFT 20
|
|
-#define MAC_CTRL_SPEED_MASK 0x3
|
|
-#define MAC_CTRL_DBG_TX_BKPRESURE 0x400000
|
|
-#define MAC_CTRL_TX_HUGE 0x800000
|
|
-#define MAC_CTRL_RX_CHKSUM_EN 0x1000000
|
|
-#define MAC_CTRL_MC_ALL_EN 0x2000000
|
|
-#define MAC_CTRL_BC_EN 0x4000000
|
|
-#define MAC_CTRL_DBG 0x8000000
|
|
-#define MAC_CTRL_SINGLE_PAUSE_EN 0x10000000
|
|
-
|
|
-/* MAC IPG/IFG Control Register */
|
|
-#define REG_MAC_IPG_IFG 0x1484
|
|
-#define MAC_IPG_IFG_IPGT_SHIFT 0 /* Desired back to back
|
|
- * inter-packet gap. The
|
|
- * default is 96-bit time */
|
|
-#define MAC_IPG_IFG_IPGT_MASK 0x7f
|
|
-#define MAC_IPG_IFG_MIFG_SHIFT 8 /* Minimum number of IFG to
|
|
- * enforce in between RX frames */
|
|
-#define MAC_IPG_IFG_MIFG_MASK 0xff /* Frame gap below such IFP is dropped */
|
|
-#define MAC_IPG_IFG_IPGR1_SHIFT 16 /* 64bit Carrier-Sense window */
|
|
-#define MAC_IPG_IFG_IPGR1_MASK 0x7f
|
|
-#define MAC_IPG_IFG_IPGR2_SHIFT 24 /* 96-bit IPG window */
|
|
-#define MAC_IPG_IFG_IPGR2_MASK 0x7f
|
|
-
|
|
-/* MAC STATION ADDRESS */
|
|
-#define REG_MAC_STA_ADDR 0x1488
|
|
-
|
|
-/* Hash table for multicast address */
|
|
-#define REG_RX_HASH_TABLE 0x1490
|
|
-
|
|
-/* MAC Half-Duplex Control Register */
|
|
-#define REG_MAC_HALF_DUPLX_CTRL 0x1498
|
|
-#define MAC_HALF_DUPLX_CTRL_LCOL_SHIFT 0 /* Collision Window */
|
|
-#define MAC_HALF_DUPLX_CTRL_LCOL_MASK 0x3ff
|
|
-#define MAC_HALF_DUPLX_CTRL_RETRY_SHIFT 12
|
|
-#define MAC_HALF_DUPLX_CTRL_RETRY_MASK 0xf
|
|
-#define MAC_HALF_DUPLX_CTRL_EXC_DEF_EN 0x10000
|
|
-#define MAC_HALF_DUPLX_CTRL_NO_BACK_C 0x20000
|
|
-#define MAC_HALF_DUPLX_CTRL_NO_BACK_P 0x40000 /* No back-off on backpressure,
|
|
- * immediately start the
|
|
- * transmission after back pressure */
|
|
-#define MAC_HALF_DUPLX_CTRL_ABEBE 0x80000 /* 1: Alternative Binary Exponential Back-off Enabled */
|
|
-#define MAC_HALF_DUPLX_CTRL_ABEBT_SHIFT 20 /* Maximum binary exponential number */
|
|
-#define MAC_HALF_DUPLX_CTRL_ABEBT_MASK 0xf
|
|
-#define MAC_HALF_DUPLX_CTRL_JAMIPG_SHIFT 24 /* IPG to start JAM for collision based flow control in half-duplex */
|
|
-#define MAC_HALF_DUPLX_CTRL_JAMIPG_MASK 0xf /* mode. In unit of 8-bit time */
|
|
-
|
|
-/* Maximum Frame Length Control Register */
|
|
-#define REG_MTU 0x149c
|
|
-
|
|
-/* Wake-On-Lan control register */
|
|
-#define REG_WOL_CTRL 0x14a0
|
|
-#define WOL_PATTERN_EN 0x00000001
|
|
-#define WOL_PATTERN_PME_EN 0x00000002
|
|
-#define WOL_MAGIC_EN 0x00000004
|
|
-#define WOL_MAGIC_PME_EN 0x00000008
|
|
-#define WOL_LINK_CHG_EN 0x00000010
|
|
-#define WOL_LINK_CHG_PME_EN 0x00000020
|
|
-#define WOL_PATTERN_ST 0x00000100
|
|
-#define WOL_MAGIC_ST 0x00000200
|
|
-#define WOL_LINKCHG_ST 0x00000400
|
|
-#define WOL_CLK_SWITCH_EN 0x00008000
|
|
-#define WOL_PT0_EN 0x00010000
|
|
-#define WOL_PT1_EN 0x00020000
|
|
-#define WOL_PT2_EN 0x00040000
|
|
-#define WOL_PT3_EN 0x00080000
|
|
-#define WOL_PT4_EN 0x00100000
|
|
-#define WOL_PT5_EN 0x00200000
|
|
-#define WOL_PT6_EN 0x00400000
|
|
-
|
|
-/* WOL Length ( 2 DWORD ) */
|
|
-#define REG_WOL_PATTERN_LEN 0x14a4
|
|
-#define WOL_PT_LEN_MASK 0x7f
|
|
-#define WOL_PT0_LEN_SHIFT 0
|
|
-#define WOL_PT1_LEN_SHIFT 8
|
|
-#define WOL_PT2_LEN_SHIFT 16
|
|
-#define WOL_PT3_LEN_SHIFT 24
|
|
-#define WOL_PT4_LEN_SHIFT 0
|
|
-#define WOL_PT5_LEN_SHIFT 8
|
|
-#define WOL_PT6_LEN_SHIFT 16
|
|
-
|
|
-/* Internal SRAM Partition Register */
|
|
-#define RFDX_HEAD_ADDR_MASK 0x03FF
|
|
-#define RFDX_HARD_ADDR_SHIFT 0
|
|
-#define RFDX_TAIL_ADDR_MASK 0x03FF
|
|
-#define RFDX_TAIL_ADDR_SHIFT 16
|
|
-
|
|
-#define REG_SRAM_RFD0_INFO 0x1500
|
|
-#define REG_SRAM_RFD1_INFO 0x1504
|
|
-#define REG_SRAM_RFD2_INFO 0x1508
|
|
-#define REG_SRAM_RFD3_INFO 0x150C
|
|
-
|
|
-#define REG_RFD_NIC_LEN 0x1510 /* In 8-bytes */
|
|
-#define RFD_NIC_LEN_MASK 0x03FF
|
|
-
|
|
-#define REG_SRAM_TRD_ADDR 0x1518
|
|
-#define TPD_HEAD_ADDR_MASK 0x03FF
|
|
-#define TPD_HEAD_ADDR_SHIFT 0
|
|
-#define TPD_TAIL_ADDR_MASK 0x03FF
|
|
-#define TPD_TAIL_ADDR_SHIFT 16
|
|
-
|
|
-#define REG_SRAM_TRD_LEN 0x151C /* In 8-bytes */
|
|
-#define TPD_NIC_LEN_MASK 0x03FF
|
|
-
|
|
-#define REG_SRAM_RXF_ADDR 0x1520
|
|
-#define REG_SRAM_RXF_LEN 0x1524
|
|
-#define REG_SRAM_TXF_ADDR 0x1528
|
|
-#define REG_SRAM_TXF_LEN 0x152C
|
|
-#define REG_SRAM_TCPH_ADDR 0x1530
|
|
-#define REG_SRAM_PKTH_ADDR 0x1532
|
|
-
|
|
-/*
|
|
- * Load Ptr Register
|
|
- * Software sets this bit after the initialization of the head and tail */
|
|
-#define REG_LOAD_PTR 0x1534
|
|
-
|
|
-/*
|
|
- * addresses of all descriptors, as well as the following descriptor
|
|
- * control register, which triggers each function block to load the head
|
|
- * pointer to prepare for the operation. This bit is then self-cleared
|
|
- * after one cycle.
|
|
- */
|
|
-#define REG_RX_BASE_ADDR_HI 0x1540
|
|
-#define REG_TX_BASE_ADDR_HI 0x1544
|
|
-#define REG_SMB_BASE_ADDR_HI 0x1548
|
|
-#define REG_SMB_BASE_ADDR_LO 0x154C
|
|
-#define REG_RFD0_HEAD_ADDR_LO 0x1550
|
|
-#define REG_RFD1_HEAD_ADDR_LO 0x1554
|
|
-#define REG_RFD2_HEAD_ADDR_LO 0x1558
|
|
-#define REG_RFD3_HEAD_ADDR_LO 0x155C
|
|
-#define REG_RFD_RING_SIZE 0x1560
|
|
-#define RFD_RING_SIZE_MASK 0x0FFF
|
|
-#define REG_RX_BUF_SIZE 0x1564
|
|
-#define RX_BUF_SIZE_MASK 0xFFFF
|
|
-#define REG_RRD0_HEAD_ADDR_LO 0x1568
|
|
-#define REG_RRD1_HEAD_ADDR_LO 0x156C
|
|
-#define REG_RRD2_HEAD_ADDR_LO 0x1570
|
|
-#define REG_RRD3_HEAD_ADDR_LO 0x1574
|
|
-#define REG_RRD_RING_SIZE 0x1578
|
|
-#define RRD_RING_SIZE_MASK 0x0FFF
|
|
-#define REG_HTPD_HEAD_ADDR_LO 0x157C
|
|
-#define REG_NTPD_HEAD_ADDR_LO 0x1580
|
|
-#define REG_TPD_RING_SIZE 0x1584
|
|
-#define TPD_RING_SIZE_MASK 0xFFFF
|
|
-#define REG_CMB_BASE_ADDR_LO 0x1588
|
|
-
|
|
-/* RSS about */
|
|
-#define REG_RSS_KEY0 0x14B0
|
|
-#define REG_RSS_KEY1 0x14B4
|
|
-#define REG_RSS_KEY2 0x14B8
|
|
-#define REG_RSS_KEY3 0x14BC
|
|
-#define REG_RSS_KEY4 0x14C0
|
|
-#define REG_RSS_KEY5 0x14C4
|
|
-#define REG_RSS_KEY6 0x14C8
|
|
-#define REG_RSS_KEY7 0x14CC
|
|
-#define REG_RSS_KEY8 0x14D0
|
|
-#define REG_RSS_KEY9 0x14D4
|
|
-#define REG_IDT_TABLE0 0x14E0
|
|
-#define REG_IDT_TABLE1 0x14E4
|
|
-#define REG_IDT_TABLE2 0x14E8
|
|
-#define REG_IDT_TABLE3 0x14EC
|
|
-#define REG_IDT_TABLE4 0x14F0
|
|
-#define REG_IDT_TABLE5 0x14F4
|
|
-#define REG_IDT_TABLE6 0x14F8
|
|
-#define REG_IDT_TABLE7 0x14FC
|
|
-#define REG_IDT_TABLE REG_IDT_TABLE0
|
|
-#define REG_RSS_HASH_VALUE 0x15B0
|
|
-#define REG_RSS_HASH_FLAG 0x15B4
|
|
-#define REG_BASE_CPU_NUMBER 0x15B8
|
|
-
|
|
-/* TXQ Control Register */
|
|
-#define REG_TXQ_CTRL 0x1590
|
|
-#define TXQ_NUM_TPD_BURST_MASK 0xF
|
|
-#define TXQ_NUM_TPD_BURST_SHIFT 0
|
|
-#define TXQ_CTRL_IP_OPTION_EN 0x10
|
|
-#define TXQ_CTRL_EN 0x20
|
|
-#define TXQ_CTRL_ENH_MODE 0x40
|
|
-#define TXQ_CTRL_LS_8023_EN 0x80
|
|
-#define TXQ_TXF_BURST_NUM_SHIFT 16
|
|
-#define TXQ_TXF_BURST_NUM_MASK 0xFFFF
|
|
-
|
|
-/* Jumbo packet Threshold for task offload */
|
|
-#define REG_TX_TSO_OFFLOAD_THRESH 0x1594 /* In 8-bytes */
|
|
-#define TX_TSO_OFFLOAD_THRESH_MASK 0x07FF
|
|
-
|
|
-#define REG_TXF_WATER_MARK 0x1598 /* In 8-bytes */
|
|
-#define TXF_WATER_MARK_MASK 0x0FFF
|
|
-#define TXF_LOW_WATER_MARK_SHIFT 0
|
|
-#define TXF_HIGH_WATER_MARK_SHIFT 16
|
|
-#define TXQ_CTRL_BURST_MODE_EN 0x80000000
|
|
-
|
|
-#define REG_THRUPUT_MON_CTRL 0x159C
|
|
-#define THRUPUT_MON_RATE_MASK 0x3
|
|
-#define THRUPUT_MON_RATE_SHIFT 0
|
|
-#define THRUPUT_MON_EN 0x80
|
|
-
|
|
-/* RXQ Control Register */
|
|
-#define REG_RXQ_CTRL 0x15A0
|
|
-#define ASPM_THRUPUT_LIMIT_MASK 0x3
|
|
-#define ASPM_THRUPUT_LIMIT_SHIFT 0
|
|
-#define ASPM_THRUPUT_LIMIT_NO 0x00
|
|
-#define ASPM_THRUPUT_LIMIT_1M 0x01
|
|
-#define ASPM_THRUPUT_LIMIT_10M 0x02
|
|
-#define ASPM_THRUPUT_LIMIT_100M 0x04
|
|
-#define RXQ1_CTRL_EN 0x10
|
|
-#define RXQ2_CTRL_EN 0x20
|
|
-#define RXQ3_CTRL_EN 0x40
|
|
-#define IPV6_CHKSUM_CTRL_EN 0x80
|
|
-#define RSS_HASH_BITS_MASK 0x00FF
|
|
-#define RSS_HASH_BITS_SHIFT 8
|
|
-#define RSS_HASH_IPV4 0x10000
|
|
-#define RSS_HASH_IPV4_TCP 0x20000
|
|
-#define RSS_HASH_IPV6 0x40000
|
|
-#define RSS_HASH_IPV6_TCP 0x80000
|
|
-#define RXQ_RFD_BURST_NUM_MASK 0x003F
|
|
-#define RXQ_RFD_BURST_NUM_SHIFT 20
|
|
-#define RSS_MODE_MASK 0x0003
|
|
-#define RSS_MODE_SHIFT 26
|
|
-#define RSS_NIP_QUEUE_SEL_MASK 0x1
|
|
-#define RSS_NIP_QUEUE_SEL_SHIFT 28
|
|
-#define RRS_HASH_CTRL_EN 0x20000000
|
|
-#define RX_CUT_THRU_EN 0x40000000
|
|
-#define RXQ_CTRL_EN 0x80000000
|
|
-
|
|
-#define REG_RFD_FREE_THRESH 0x15A4
|
|
-#define RFD_FREE_THRESH_MASK 0x003F
|
|
-#define RFD_FREE_HI_THRESH_SHIFT 0
|
|
-#define RFD_FREE_LO_THRESH_SHIFT 6
|
|
-
|
|
-/* RXF flow control register */
|
|
-#define REG_RXQ_RXF_PAUSE_THRESH 0x15A8
|
|
-#define RXQ_RXF_PAUSE_TH_HI_SHIFT 0
|
|
-#define RXQ_RXF_PAUSE_TH_HI_MASK 0x0FFF
|
|
-#define RXQ_RXF_PAUSE_TH_LO_SHIFT 16
|
|
-#define RXQ_RXF_PAUSE_TH_LO_MASK 0x0FFF
|
|
-
|
|
-#define REG_RXD_DMA_CTRL 0x15AC
|
|
-#define RXD_DMA_THRESH_MASK 0x0FFF /* In 8-bytes */
|
|
-#define RXD_DMA_THRESH_SHIFT 0
|
|
-#define RXD_DMA_DOWN_TIMER_MASK 0xFFFF
|
|
-#define RXD_DMA_DOWN_TIMER_SHIFT 16
|
|
-
|
|
-/* DMA Engine Control Register */
|
|
-#define REG_DMA_CTRL 0x15C0
|
|
-#define DMA_CTRL_DMAR_IN_ORDER 0x1
|
|
-#define DMA_CTRL_DMAR_ENH_ORDER 0x2
|
|
-#define DMA_CTRL_DMAR_OUT_ORDER 0x4
|
|
-#define DMA_CTRL_RCB_VALUE 0x8
|
|
-#define DMA_CTRL_DMAR_BURST_LEN_MASK 0x0007
|
|
-#define DMA_CTRL_DMAR_BURST_LEN_SHIFT 4
|
|
-#define DMA_CTRL_DMAW_BURST_LEN_MASK 0x0007
|
|
-#define DMA_CTRL_DMAW_BURST_LEN_SHIFT 7
|
|
-#define DMA_CTRL_DMAR_REQ_PRI 0x400
|
|
-#define DMA_CTRL_DMAR_DLY_CNT_MASK 0x001F
|
|
-#define DMA_CTRL_DMAR_DLY_CNT_SHIFT 11
|
|
-#define DMA_CTRL_DMAW_DLY_CNT_MASK 0x000F
|
|
-#define DMA_CTRL_DMAW_DLY_CNT_SHIFT 16
|
|
-#define DMA_CTRL_CMB_EN 0x100000
|
|
-#define DMA_CTRL_SMB_EN 0x200000
|
|
-#define DMA_CTRL_CMB_NOW 0x400000
|
|
-#define MAC_CTRL_SMB_DIS 0x1000000
|
|
-#define DMA_CTRL_SMB_NOW 0x80000000
|
|
-
|
|
-/* CMB/SMB Control Register */
|
|
-#define REG_SMB_STAT_TIMER 0x15C4 /* 2us resolution */
|
|
-#define SMB_STAT_TIMER_MASK 0xFFFFFF
|
|
-#define REG_CMB_TPD_THRESH 0x15C8
|
|
-#define CMB_TPD_THRESH_MASK 0xFFFF
|
|
-#define REG_CMB_TX_TIMER 0x15CC /* 2us resolution */
|
|
-#define CMB_TX_TIMER_MASK 0xFFFF
|
|
-
|
|
-/* Mail box */
|
|
-#define MB_RFDX_PROD_IDX_MASK 0xFFFF
|
|
-#define REG_MB_RFD0_PROD_IDX 0x15E0
|
|
-#define REG_MB_RFD1_PROD_IDX 0x15E4
|
|
-#define REG_MB_RFD2_PROD_IDX 0x15E8
|
|
-#define REG_MB_RFD3_PROD_IDX 0x15EC
|
|
-
|
|
-#define MB_PRIO_PROD_IDX_MASK 0xFFFF
|
|
-#define REG_MB_PRIO_PROD_IDX 0x15F0
|
|
-#define MB_HTPD_PROD_IDX_SHIFT 0
|
|
-#define MB_NTPD_PROD_IDX_SHIFT 16
|
|
-
|
|
-#define MB_PRIO_CONS_IDX_MASK 0xFFFF
|
|
-#define REG_MB_PRIO_CONS_IDX 0x15F4
|
|
-#define MB_HTPD_CONS_IDX_SHIFT 0
|
|
-#define MB_NTPD_CONS_IDX_SHIFT 16
|
|
-
|
|
-#define REG_MB_RFD01_CONS_IDX 0x15F8
|
|
-#define MB_RFD0_CONS_IDX_MASK 0x0000FFFF
|
|
-#define MB_RFD1_CONS_IDX_MASK 0xFFFF0000
|
|
-#define REG_MB_RFD23_CONS_IDX 0x15FC
|
|
-#define MB_RFD2_CONS_IDX_MASK 0x0000FFFF
|
|
-#define MB_RFD3_CONS_IDX_MASK 0xFFFF0000
|
|
-
|
|
-/* Interrupt Status Register */
|
|
-#define REG_ISR 0x1600
|
|
-#define ISR_SMB 0x00000001
|
|
-#define ISR_TIMER 0x00000002
|
|
-/*
|
|
- * Software manual interrupt, for debug. Set when SW_MAN_INT_EN is set
|
|
- * in Table 51 Selene Master Control Register (Offset 0x1400).
|
|
- */
|
|
-#define ISR_MANUAL 0x00000004
|
|
-#define ISR_HW_RXF_OV 0x00000008 /* RXF overflow interrupt */
|
|
-#define ISR_RFD0_UR 0x00000010 /* RFD0 under run */
|
|
-#define ISR_RFD1_UR 0x00000020
|
|
-#define ISR_RFD2_UR 0x00000040
|
|
-#define ISR_RFD3_UR 0x00000080
|
|
-#define ISR_TXF_UR 0x00000100
|
|
-#define ISR_DMAR_TO_RST 0x00000200
|
|
-#define ISR_DMAW_TO_RST 0x00000400
|
|
-#define ISR_TX_CREDIT 0x00000800
|
|
-#define ISR_GPHY 0x00001000
|
|
-/* GPHY low power state interrupt */
|
|
-#define ISR_GPHY_LPW 0x00002000
|
|
-#define ISR_TXQ_TO_RST 0x00004000
|
|
-#define ISR_TX_PKT 0x00008000
|
|
-#define ISR_RX_PKT_0 0x00010000
|
|
-#define ISR_RX_PKT_1 0x00020000
|
|
-#define ISR_RX_PKT_2 0x00040000
|
|
-#define ISR_RX_PKT_3 0x00080000
|
|
-#define ISR_MAC_RX 0x00100000
|
|
-#define ISR_MAC_TX 0x00200000
|
|
-#define ISR_UR_DETECTED 0x00400000
|
|
-#define ISR_FERR_DETECTED 0x00800000
|
|
-#define ISR_NFERR_DETECTED 0x01000000
|
|
-#define ISR_CERR_DETECTED 0x02000000
|
|
-#define ISR_PHY_LINKDOWN 0x04000000
|
|
-#define ISR_DIS_INT 0x80000000
|
|
-
|
|
-/* Interrupt Mask Register */
|
|
-#define REG_IMR 0x1604
|
|
-
|
|
-#define IMR_NORMAL_MASK (\
|
|
- ISR_MANUAL |\
|
|
- ISR_HW_RXF_OV |\
|
|
- ISR_RFD0_UR |\
|
|
- ISR_TXF_UR |\
|
|
- ISR_DMAR_TO_RST |\
|
|
- ISR_TXQ_TO_RST |\
|
|
- ISR_DMAW_TO_RST |\
|
|
- ISR_GPHY |\
|
|
- ISR_TX_PKT |\
|
|
- ISR_RX_PKT_0 |\
|
|
- ISR_GPHY_LPW |\
|
|
- ISR_PHY_LINKDOWN)
|
|
-
|
|
-#define ISR_RX_PKT (\
|
|
- ISR_RX_PKT_0 |\
|
|
- ISR_RX_PKT_1 |\
|
|
- ISR_RX_PKT_2 |\
|
|
- ISR_RX_PKT_3)
|
|
-
|
|
-#define ISR_OVER (\
|
|
- ISR_RFD0_UR |\
|
|
- ISR_RFD1_UR |\
|
|
- ISR_RFD2_UR |\
|
|
- ISR_RFD3_UR |\
|
|
- ISR_HW_RXF_OV |\
|
|
- ISR_TXF_UR)
|
|
-
|
|
-#define ISR_ERROR (\
|
|
- ISR_DMAR_TO_RST |\
|
|
- ISR_TXQ_TO_RST |\
|
|
- ISR_DMAW_TO_RST |\
|
|
- ISR_PHY_LINKDOWN)
|
|
-
|
|
-#define REG_INT_RETRIG_TIMER 0x1608
|
|
-#define INT_RETRIG_TIMER_MASK 0xFFFF
|
|
-
|
|
-#define REG_HDS_CTRL 0x160C
|
|
-#define HDS_CTRL_EN 0x0001
|
|
-#define HDS_CTRL_BACKFILLSIZE_SHIFT 8
|
|
-#define HDS_CTRL_BACKFILLSIZE_MASK 0x0FFF
|
|
-#define HDS_CTRL_MAX_HDRSIZE_SHIFT 20
|
|
-#define HDS_CTRL_MAC_HDRSIZE_MASK 0x0FFF
|
|
-
|
|
-#define REG_MAC_RX_STATUS_BIN 0x1700
|
|
-#define REG_MAC_RX_STATUS_END 0x175c
|
|
-#define REG_MAC_TX_STATUS_BIN 0x1760
|
|
-#define REG_MAC_TX_STATUS_END 0x17c0
|
|
-
|
|
-/* DEBUG ADDR */
|
|
-#define REG_DEBUG_DATA0 0x1900
|
|
-#define REG_DEBUG_DATA1 0x1904
|
|
-
|
|
-/* PHY Control Register */
|
|
-#define MII_BMCR 0x00
|
|
-#define BMCR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */
|
|
-#define BMCR_COLL_TEST_ENABLE 0x0080 /* Collision test enable */
|
|
-#define BMCR_FULL_DUPLEX 0x0100 /* FDX =1, half duplex =0 */
|
|
-#define BMCR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */
|
|
-#define BMCR_ISOLATE 0x0400 /* Isolate PHY from MII */
|
|
-#define BMCR_POWER_DOWN 0x0800 /* Power down */
|
|
-#define BMCR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */
|
|
-#define BMCR_SPEED_SELECT_LSB 0x2000 /* bits 6,13: 10=1000, 01=100, 00=10 */
|
|
-#define BMCR_LOOPBACK 0x4000 /* 0 = normal, 1 = loopback */
|
|
-#define BMCR_RESET 0x8000 /* 0 = normal, 1 = PHY reset */
|
|
-#define BMCR_SPEED_MASK 0x2040
|
|
-#define BMCR_SPEED_1000 0x0040
|
|
-#define BMCR_SPEED_100 0x2000
|
|
-#define BMCR_SPEED_10 0x0000
|
|
-
|
|
-/* PHY Status Register */
|
|
-#define MII_BMSR 0x01
|
|
-#define BMMSR_EXTENDED_CAPS 0x0001 /* Extended register capabilities */
|
|
-#define BMSR_JABBER_DETECT 0x0002 /* Jabber Detected */
|
|
-#define BMSR_LINK_STATUS 0x0004 /* Link Status 1 = link */
|
|
-#define BMSR_AUTONEG_CAPS 0x0008 /* Auto Neg Capable */
|
|
-#define BMSR_REMOTE_FAULT 0x0010 /* Remote Fault Detect */
|
|
-#define BMSR_AUTONEG_COMPLETE 0x0020 /* Auto Neg Complete */
|
|
-#define BMSR_PREAMBLE_SUPPRESS 0x0040 /* Preamble may be suppressed */
|
|
-#define BMSR_EXTENDED_STATUS 0x0100 /* Ext. status info in Reg 0x0F */
|
|
-#define BMSR_100T2_HD_CAPS 0x0200 /* 100T2 Half Duplex Capable */
|
|
-#define BMSR_100T2_FD_CAPS 0x0400 /* 100T2 Full Duplex Capable */
|
|
-#define BMSR_10T_HD_CAPS 0x0800 /* 10T Half Duplex Capable */
|
|
-#define BMSR_10T_FD_CAPS 0x1000 /* 10T Full Duplex Capable */
|
|
-#define BMSR_100X_HD_CAPS 0x2000 /* 100X Half Duplex Capable */
|
|
-#define BMMII_SR_100X_FD_CAPS 0x4000 /* 100X Full Duplex Capable */
|
|
-#define BMMII_SR_100T4_CAPS 0x8000 /* 100T4 Capable */
|
|
-
|
|
-#define MII_PHYSID1 0x02
|
|
-#define MII_PHYSID2 0x03
|
|
-
|
|
-/* Autoneg Advertisement Register */
|
|
-#define MII_ADVERTISE 0x04
|
|
-#define ADVERTISE_SPEED_MASK 0x01E0
|
|
-#define ADVERTISE_DEFAULT_CAP 0x0DE0
|
|
-
|
|
-/* 1000BASE-T Control Register */
|
|
-#define MII_GIGA_CR 0x09
|
|
-#define GIGA_CR_1000T_REPEATER_DTE 0x0400 /* 1=Repeater/switch device port 0=DTE device */
|
|
-
|
|
-#define GIGA_CR_1000T_MS_VALUE 0x0800 /* 1=Configure PHY as Master 0=Configure PHY as Slave */
|
|
-#define GIGA_CR_1000T_MS_ENABLE 0x1000 /* 1=Master/Slave manual config value 0=Automatic Master/Slave config */
|
|
-#define GIGA_CR_1000T_TEST_MODE_NORMAL 0x0000 /* Normal Operation */
|
|
-#define GIGA_CR_1000T_TEST_MODE_1 0x2000 /* Transmit Waveform test */
|
|
-#define GIGA_CR_1000T_TEST_MODE_2 0x4000 /* Master Transmit Jitter test */
|
|
-#define GIGA_CR_1000T_TEST_MODE_3 0x6000 /* Slave Transmit Jitter test */
|
|
-#define GIGA_CR_1000T_TEST_MODE_4 0x8000 /* Transmitter Distortion test */
|
|
-#define GIGA_CR_1000T_SPEED_MASK 0x0300
|
|
-#define GIGA_CR_1000T_DEFAULT_CAP 0x0300
|
|
-
|
|
-/* PHY Specific Status Register */
|
|
-#define MII_GIGA_PSSR 0x11
|
|
-#define GIGA_PSSR_SPD_DPLX_RESOLVED 0x0800 /* 1=Speed & Duplex resolved */
|
|
-#define GIGA_PSSR_DPLX 0x2000 /* 1=Duplex 0=Half Duplex */
|
|
-#define GIGA_PSSR_SPEED 0xC000 /* Speed, bits 14:15 */
|
|
-#define GIGA_PSSR_10MBS 0x0000 /* 00=10Mbs */
|
|
-#define GIGA_PSSR_100MBS 0x4000 /* 01=100Mbs */
|
|
-#define GIGA_PSSR_1000MBS 0x8000 /* 10=1000Mbs */
|
|
-
|
|
-/* PHY Interrupt Enable Register */
|
|
-#define MII_IER 0x12
|
|
-#define IER_LINK_UP 0x0400
|
|
-#define IER_LINK_DOWN 0x0800
|
|
-
|
|
-/* PHY Interrupt Status Register */
|
|
-#define MII_ISR 0x13
|
|
-#define ISR_LINK_UP 0x0400
|
|
-#define ISR_LINK_DOWN 0x0800
|
|
-
|
|
-/* Cable-Detect-Test Control Register */
|
|
-#define MII_CDTC 0x16
|
|
-#define CDTC_EN_OFF 0 /* sc */
|
|
-#define CDTC_EN_BITS 1
|
|
-#define CDTC_PAIR_OFF 8
|
|
-#define CDTC_PAIR_BIT 2
|
|
-
|
|
-/* Cable-Detect-Test Status Register */
|
|
-#define MII_CDTS 0x1C
|
|
-#define CDTS_STATUS_OFF 8
|
|
-#define CDTS_STATUS_BITS 2
|
|
-#define CDTS_STATUS_NORMAL 0
|
|
-#define CDTS_STATUS_SHORT 1
|
|
-#define CDTS_STATUS_OPEN 2
|
|
-#define CDTS_STATUS_INVALID 3
|
|
-
|
|
-#define MII_DBG_ADDR 0x1D
|
|
-#define MII_DBG_DATA 0x1E
|
|
-
|
|
-#define MII_ANA_CTRL_0 0x0
|
|
-#define ANA_RESTART_CAL 0x0001
|
|
-#define ANA_MANUL_SWICH_ON_SHIFT 0x1
|
|
-#define ANA_MANUL_SWICH_ON_MASK 0xF
|
|
-#define ANA_MAN_ENABLE 0x0020
|
|
-#define ANA_SEL_HSP 0x0040
|
|
-#define ANA_EN_HB 0x0080
|
|
-#define ANA_EN_HBIAS 0x0100
|
|
-#define ANA_OEN_125M 0x0200
|
|
-#define ANA_EN_LCKDT 0x0400
|
|
-#define ANA_LCKDT_PHY 0x0800
|
|
-#define ANA_AFE_MODE 0x1000
|
|
-#define ANA_VCO_SLOW 0x2000
|
|
-#define ANA_VCO_FAST 0x4000
|
|
-#define ANA_SEL_CLK125M_DSP 0x8000
|
|
-
|
|
-#define MII_ANA_CTRL_4 0x4
|
|
-#define ANA_IECHO_ADJ_MASK 0xF
|
|
-#define ANA_IECHO_ADJ_3_SHIFT 0
|
|
-#define ANA_IECHO_ADJ_2_SHIFT 4
|
|
-#define ANA_IECHO_ADJ_1_SHIFT 8
|
|
-#define ANA_IECHO_ADJ_0_SHIFT 12
|
|
-
|
|
-#define MII_ANA_CTRL_5 0x5
|
|
-#define ANA_SERDES_CDR_BW_SHIFT 0
|
|
-#define ANA_SERDES_CDR_BW_MASK 0x3
|
|
-#define ANA_MS_PAD_DBG 0x0004
|
|
-#define ANA_SPEEDUP_DBG 0x0008
|
|
-#define ANA_SERDES_TH_LOS_SHIFT 4
|
|
-#define ANA_SERDES_TH_LOS_MASK 0x3
|
|
-#define ANA_SERDES_EN_DEEM 0x0040
|
|
-#define ANA_SERDES_TXELECIDLE 0x0080
|
|
-#define ANA_SERDES_BEACON 0x0100
|
|
-#define ANA_SERDES_HALFTXDR 0x0200
|
|
-#define ANA_SERDES_SEL_HSP 0x0400
|
|
-#define ANA_SERDES_EN_PLL 0x0800
|
|
-#define ANA_SERDES_EN 0x1000
|
|
-#define ANA_SERDES_EN_LCKDT 0x2000
|
|
-
|
|
-#define MII_ANA_CTRL_11 0xB
|
|
-#define ANA_PS_HIB_EN 0x8000
|
|
-
|
|
-#define MII_ANA_CTRL_18 0x12
|
|
-#define ANA_TEST_MODE_10BT_01SHIFT 0
|
|
-#define ANA_TEST_MODE_10BT_01MASK 0x3
|
|
-#define ANA_LOOP_SEL_10BT 0x0004
|
|
-#define ANA_RGMII_MODE_SW 0x0008
|
|
-#define ANA_EN_LONGECABLE 0x0010
|
|
-#define ANA_TEST_MODE_10BT_2 0x0020
|
|
-#define ANA_EN_10BT_IDLE 0x0400
|
|
-#define ANA_EN_MASK_TB 0x0800
|
|
-#define ANA_TRIGGER_SEL_TIMER_SHIFT 12
|
|
-#define ANA_TRIGGER_SEL_TIMER_MASK 0x3
|
|
-#define ANA_INTERVAL_SEL_TIMER_SHIFT 14
|
|
-#define ANA_INTERVAL_SEL_TIMER_MASK 0x3
|
|
-
|
|
-#define MII_ANA_CTRL_41 0x29
|
|
-#define ANA_TOP_PS_EN 0x8000
|
|
-
|
|
-#define MII_ANA_CTRL_54 0x36
|
|
-#define ANA_LONG_CABLE_TH_100_SHIFT 0
|
|
-#define ANA_LONG_CABLE_TH_100_MASK 0x3F
|
|
-#define ANA_DESERVED 0x0040
|
|
-#define ANA_EN_LIT_CH 0x0080
|
|
-#define ANA_SHORT_CABLE_TH_100_SHIFT 8
|
|
-#define ANA_SHORT_CABLE_TH_100_MASK 0x3F
|
|
-#define ANA_BP_BAD_LINK_ACCUM 0x4000
|
|
-#define ANA_BP_SMALL_BW 0x8000
|
|
-
|
|
-#endif /*_ATL1C_HW_H_*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/atl1c/atl1c_main.c linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_main.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,2797 +0,0 @@
|
|
-/*
|
|
- * Copyright(c) 2008 - 2009 Atheros Corporation. All rights reserved.
|
|
- *
|
|
- * Derived from Intel e1000 driver
|
|
- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the Free
|
|
- * Software Foundation; either version 2 of the License, or (at your option)
|
|
- * any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but WITHOUT
|
|
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
- * more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
- * this program; if not, write to the Free Software Foundation, Inc., 59
|
|
- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
- */
|
|
-
|
|
-#include "atl1c.h"
|
|
-
|
|
-#define ATL1C_DRV_VERSION "1.0.0.1-NAPI"
|
|
-char atl1c_driver_name[] = "atl1c";
|
|
-char atl1c_driver_version[] = ATL1C_DRV_VERSION;
|
|
-#define PCI_DEVICE_ID_ATTANSIC_L2C 0x1062
|
|
-#define PCI_DEVICE_ID_ATTANSIC_L1C 0x1063
|
|
-/*
|
|
- * atl1c_pci_tbl - PCI Device ID Table
|
|
- *
|
|
- * Wildcard entries (PCI_ANY_ID) should come last
|
|
- * Last entry must be all 0s
|
|
- *
|
|
- * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
|
|
- * Class, Class Mask, private data (not used) }
|
|
- */
|
|
-static struct pci_device_id atl1c_pci_tbl[] = {
|
|
- {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1C)},
|
|
- {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L2C)},
|
|
- /* required last entry */
|
|
- { 0 }
|
|
-};
|
|
-MODULE_DEVICE_TABLE(pci, atl1c_pci_tbl);
|
|
-
|
|
-MODULE_AUTHOR("Jie Yang <jie.yang@atheros.com>");
|
|
-MODULE_DESCRIPTION("Atheros 1000M Ethernet Network Driver");
|
|
-MODULE_LICENSE("GPL");
|
|
-MODULE_VERSION(ATL1C_DRV_VERSION);
|
|
-
|
|
-static int atl1c_stop_mac(struct atl1c_hw *hw);
|
|
-static void atl1c_enable_rx_ctrl(struct atl1c_hw *hw);
|
|
-static void atl1c_enable_tx_ctrl(struct atl1c_hw *hw);
|
|
-static void atl1c_disable_l0s_l1(struct atl1c_hw *hw);
|
|
-static void atl1c_set_aspm(struct atl1c_hw *hw, bool linkup);
|
|
-static void atl1c_setup_mac_ctrl(struct atl1c_adapter *adapter);
|
|
-static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter, u8 que,
|
|
- int *work_done, int work_to_do);
|
|
-
|
|
-static const u16 atl1c_pay_load_size[] = {
|
|
- 128, 256, 512, 1024, 2048, 4096,
|
|
-};
|
|
-
|
|
-static const u16 atl1c_rfd_prod_idx_regs[AT_MAX_RECEIVE_QUEUE] =
|
|
-{
|
|
- REG_MB_RFD0_PROD_IDX,
|
|
- REG_MB_RFD1_PROD_IDX,
|
|
- REG_MB_RFD2_PROD_IDX,
|
|
- REG_MB_RFD3_PROD_IDX
|
|
-};
|
|
-
|
|
-static const u16 atl1c_rfd_addr_lo_regs[AT_MAX_RECEIVE_QUEUE] =
|
|
-{
|
|
- REG_RFD0_HEAD_ADDR_LO,
|
|
- REG_RFD1_HEAD_ADDR_LO,
|
|
- REG_RFD2_HEAD_ADDR_LO,
|
|
- REG_RFD3_HEAD_ADDR_LO
|
|
-};
|
|
-
|
|
-static const u16 atl1c_rrd_addr_lo_regs[AT_MAX_RECEIVE_QUEUE] =
|
|
-{
|
|
- REG_RRD0_HEAD_ADDR_LO,
|
|
- REG_RRD1_HEAD_ADDR_LO,
|
|
- REG_RRD2_HEAD_ADDR_LO,
|
|
- REG_RRD3_HEAD_ADDR_LO
|
|
-};
|
|
-
|
|
-static const u32 atl1c_default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE |
|
|
- NETIF_MSG_LINK | NETIF_MSG_TIMER | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP;
|
|
-
|
|
-/*
|
|
- * atl1c_init_pcie - init PCIE module
|
|
- */
|
|
-static void atl1c_reset_pcie(struct atl1c_hw *hw, u32 flag)
|
|
-{
|
|
- u32 data;
|
|
- u32 pci_cmd;
|
|
- struct pci_dev *pdev = hw->adapter->pdev;
|
|
-
|
|
- AT_READ_REG(hw, PCI_COMMAND, &pci_cmd);
|
|
- pci_cmd &= ~PCI_COMMAND_INTX_DISABLE;
|
|
- pci_cmd |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
|
|
- PCI_COMMAND_IO);
|
|
- AT_WRITE_REG(hw, PCI_COMMAND, pci_cmd);
|
|
-
|
|
- /*
|
|
- * Clear any PowerSaveing Settings
|
|
- */
|
|
- pci_enable_wake(pdev, PCI_D3hot, 0);
|
|
- pci_enable_wake(pdev, PCI_D3cold, 0);
|
|
-
|
|
- /*
|
|
- * Mask some pcie error bits
|
|
- */
|
|
- AT_READ_REG(hw, REG_PCIE_UC_SEVERITY, &data);
|
|
- data &= ~PCIE_UC_SERVRITY_DLP;
|
|
- data &= ~PCIE_UC_SERVRITY_FCP;
|
|
- AT_WRITE_REG(hw, REG_PCIE_UC_SEVERITY, data);
|
|
-
|
|
- if (flag & ATL1C_PCIE_L0S_L1_DISABLE)
|
|
- atl1c_disable_l0s_l1(hw);
|
|
- if (flag & ATL1C_PCIE_PHY_RESET)
|
|
- AT_WRITE_REG(hw, REG_GPHY_CTRL, GPHY_CTRL_DEFAULT);
|
|
- else
|
|
- AT_WRITE_REG(hw, REG_GPHY_CTRL,
|
|
- GPHY_CTRL_DEFAULT | GPHY_CTRL_EXT_RESET);
|
|
-
|
|
- msleep(1);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_irq_enable - Enable default interrupt generation settings
|
|
- * @adapter: board private structure
|
|
- */
|
|
-static inline void atl1c_irq_enable(struct atl1c_adapter *adapter)
|
|
-{
|
|
- if (likely(atomic_dec_and_test(&adapter->irq_sem))) {
|
|
- AT_WRITE_REG(&adapter->hw, REG_ISR, 0x7FFFFFFF);
|
|
- AT_WRITE_REG(&adapter->hw, REG_IMR, adapter->hw.intr_mask);
|
|
- AT_WRITE_FLUSH(&adapter->hw);
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_irq_disable - Mask off interrupt generation on the NIC
|
|
- * @adapter: board private structure
|
|
- */
|
|
-static inline void atl1c_irq_disable(struct atl1c_adapter *adapter)
|
|
-{
|
|
- atomic_inc(&adapter->irq_sem);
|
|
- AT_WRITE_REG(&adapter->hw, REG_IMR, 0);
|
|
- AT_WRITE_FLUSH(&adapter->hw);
|
|
- synchronize_irq(adapter->pdev->irq);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_irq_reset - reset interrupt confiure on the NIC
|
|
- * @adapter: board private structure
|
|
- */
|
|
-static inline void atl1c_irq_reset(struct atl1c_adapter *adapter)
|
|
-{
|
|
- atomic_set(&adapter->irq_sem, 1);
|
|
- atl1c_irq_enable(adapter);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_phy_config - Timer Call-back
|
|
- * @data: pointer to netdev cast into an unsigned long
|
|
- */
|
|
-static void atl1c_phy_config(unsigned long data)
|
|
-{
|
|
- struct atl1c_adapter *adapter = (struct atl1c_adapter *) data;
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&adapter->mdio_lock, flags);
|
|
- atl1c_restart_autoneg(hw);
|
|
- spin_unlock_irqrestore(&adapter->mdio_lock, flags);
|
|
-}
|
|
-
|
|
-void atl1c_reinit_locked(struct atl1c_adapter *adapter)
|
|
-{
|
|
-
|
|
- WARN_ON(in_interrupt());
|
|
- atl1c_down(adapter);
|
|
- atl1c_up(adapter);
|
|
- clear_bit(__AT_RESETTING, &adapter->flags);
|
|
-}
|
|
-
|
|
-static void atl1c_reset_task(struct work_struct *work)
|
|
-{
|
|
- struct atl1c_adapter *adapter;
|
|
- struct net_device *netdev;
|
|
-
|
|
- adapter = container_of(work, struct atl1c_adapter, reset_task);
|
|
- netdev = adapter->netdev;
|
|
-
|
|
- netif_device_detach(netdev);
|
|
- atl1c_down(adapter);
|
|
- atl1c_up(adapter);
|
|
- netif_device_attach(netdev);
|
|
-}
|
|
-
|
|
-static void atl1c_check_link_status(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- int err;
|
|
- unsigned long flags;
|
|
- u16 speed, duplex, phy_data;
|
|
-
|
|
- spin_lock_irqsave(&adapter->mdio_lock, flags);
|
|
- /* MII_BMSR must read twise */
|
|
- atl1c_read_phy_reg(hw, MII_BMSR, &phy_data);
|
|
- atl1c_read_phy_reg(hw, MII_BMSR, &phy_data);
|
|
- spin_unlock_irqrestore(&adapter->mdio_lock, flags);
|
|
-
|
|
- if ((phy_data & BMSR_LSTATUS) == 0) {
|
|
- /* link down */
|
|
- if (netif_carrier_ok(netdev)) {
|
|
- hw->hibernate = true;
|
|
- atl1c_set_aspm(hw, false);
|
|
- if (atl1c_stop_mac(hw) != 0)
|
|
- if (netif_msg_hw(adapter))
|
|
- dev_warn(&pdev->dev,
|
|
- "stop mac failed\n");
|
|
- }
|
|
- netif_carrier_off(netdev);
|
|
- } else {
|
|
- /* Link Up */
|
|
- hw->hibernate = false;
|
|
- spin_lock_irqsave(&adapter->mdio_lock, flags);
|
|
- err = atl1c_get_speed_and_duplex(hw, &speed, &duplex);
|
|
- spin_unlock_irqrestore(&adapter->mdio_lock, flags);
|
|
- if (unlikely(err))
|
|
- return;
|
|
- /* link result is our setting */
|
|
- if (adapter->link_speed != speed ||
|
|
- adapter->link_duplex != duplex) {
|
|
- adapter->link_speed = speed;
|
|
- adapter->link_duplex = duplex;
|
|
- atl1c_enable_tx_ctrl(hw);
|
|
- atl1c_enable_rx_ctrl(hw);
|
|
- atl1c_setup_mac_ctrl(adapter);
|
|
- atl1c_set_aspm(hw, true);
|
|
- if (netif_msg_link(adapter))
|
|
- dev_info(&pdev->dev,
|
|
- "%s: %s NIC Link is Up<%d Mbps %s>\n",
|
|
- atl1c_driver_name, netdev->name,
|
|
- adapter->link_speed,
|
|
- adapter->link_duplex == FULL_DUPLEX ?
|
|
- "Full Duplex" : "Half Duplex");
|
|
- }
|
|
- if (!netif_carrier_ok(netdev))
|
|
- netif_carrier_on(netdev);
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_link_chg_task - deal with link change event Out of interrupt context
|
|
- * @netdev: network interface device structure
|
|
- */
|
|
-static void atl1c_link_chg_task(struct work_struct *work)
|
|
-{
|
|
- struct atl1c_adapter *adapter;
|
|
-
|
|
- adapter = container_of(work, struct atl1c_adapter, link_chg_task);
|
|
- atl1c_check_link_status(adapter);
|
|
-}
|
|
-
|
|
-static void atl1c_link_chg_event(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- u16 phy_data;
|
|
- u16 link_up;
|
|
-
|
|
- spin_lock(&adapter->mdio_lock);
|
|
- atl1c_read_phy_reg(&adapter->hw, MII_BMSR, &phy_data);
|
|
- atl1c_read_phy_reg(&adapter->hw, MII_BMSR, &phy_data);
|
|
- spin_unlock(&adapter->mdio_lock);
|
|
- link_up = phy_data & BMSR_LSTATUS;
|
|
- /* notify upper layer link down ASAP */
|
|
- if (!link_up) {
|
|
- if (netif_carrier_ok(netdev)) {
|
|
- /* old link state: Up */
|
|
- netif_carrier_off(netdev);
|
|
- if (netif_msg_link(adapter))
|
|
- dev_info(&pdev->dev,
|
|
- "%s: %s NIC Link is Down\n",
|
|
- atl1c_driver_name, netdev->name);
|
|
- adapter->link_speed = SPEED_0;
|
|
- }
|
|
- }
|
|
- schedule_work(&adapter->link_chg_task);
|
|
-}
|
|
-
|
|
-static void atl1c_del_timer(struct atl1c_adapter *adapter)
|
|
-{
|
|
- del_timer_sync(&adapter->phy_config_timer);
|
|
-}
|
|
-
|
|
-static void atl1c_cancel_work(struct atl1c_adapter *adapter)
|
|
-{
|
|
- cancel_work_sync(&adapter->reset_task);
|
|
- cancel_work_sync(&adapter->link_chg_task);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_tx_timeout - Respond to a Tx Hang
|
|
- * @netdev: network interface device structure
|
|
- */
|
|
-static void atl1c_tx_timeout(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- /* Do the reset outside of interrupt context */
|
|
- schedule_work(&adapter->reset_task);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_set_multi - Multicast and Promiscuous mode set
|
|
- * @netdev: network interface device structure
|
|
- *
|
|
- * The set_multi entry point is called whenever the multicast address
|
|
- * list or the network interface flags are updated. This routine is
|
|
- * responsible for configuring the hardware for proper multicast,
|
|
- * promiscuous mode, and all-multi behavior.
|
|
- */
|
|
-static void atl1c_set_multi(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- struct dev_mc_list *mc_ptr;
|
|
- u32 mac_ctrl_data;
|
|
- u32 hash_value;
|
|
-
|
|
- /* Check for Promiscuous and All Multicast modes */
|
|
- AT_READ_REG(hw, REG_MAC_CTRL, &mac_ctrl_data);
|
|
-
|
|
- if (netdev->flags & IFF_PROMISC) {
|
|
- mac_ctrl_data |= MAC_CTRL_PROMIS_EN;
|
|
- } else if (netdev->flags & IFF_ALLMULTI) {
|
|
- mac_ctrl_data |= MAC_CTRL_MC_ALL_EN;
|
|
- mac_ctrl_data &= ~MAC_CTRL_PROMIS_EN;
|
|
- } else {
|
|
- mac_ctrl_data &= ~(MAC_CTRL_PROMIS_EN | MAC_CTRL_MC_ALL_EN);
|
|
- }
|
|
-
|
|
- AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
|
|
-
|
|
- /* clear the old settings from the multicast hash table */
|
|
- AT_WRITE_REG(hw, REG_RX_HASH_TABLE, 0);
|
|
- AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, 1, 0);
|
|
-
|
|
- /* comoute mc addresses' hash value ,and put it into hash table */
|
|
- for (mc_ptr = netdev->mc_list; mc_ptr; mc_ptr = mc_ptr->next) {
|
|
- hash_value = atl1c_hash_mc_addr(hw, mc_ptr->dmi_addr);
|
|
- atl1c_hash_set(hw, hash_value);
|
|
- }
|
|
-}
|
|
-
|
|
-static void atl1c_vlan_rx_register(struct net_device *netdev,
|
|
- struct vlan_group *grp)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- u32 mac_ctrl_data = 0;
|
|
-
|
|
- if (netif_msg_pktdata(adapter))
|
|
- dev_dbg(&pdev->dev, "atl1c_vlan_rx_register\n");
|
|
-
|
|
- atl1c_irq_disable(adapter);
|
|
-
|
|
- adapter->vlgrp = grp;
|
|
- AT_READ_REG(&adapter->hw, REG_MAC_CTRL, &mac_ctrl_data);
|
|
-
|
|
- if (grp) {
|
|
- /* enable VLAN tag insert/strip */
|
|
- mac_ctrl_data |= MAC_CTRL_RMV_VLAN;
|
|
- } else {
|
|
- /* disable VLAN tag insert/strip */
|
|
- mac_ctrl_data &= ~MAC_CTRL_RMV_VLAN;
|
|
- }
|
|
-
|
|
- AT_WRITE_REG(&adapter->hw, REG_MAC_CTRL, mac_ctrl_data);
|
|
- atl1c_irq_enable(adapter);
|
|
-}
|
|
-
|
|
-static void atl1c_restore_vlan(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
-
|
|
- if (netif_msg_pktdata(adapter))
|
|
- dev_dbg(&pdev->dev, "atl1c_restore_vlan !");
|
|
- atl1c_vlan_rx_register(adapter->netdev, adapter->vlgrp);
|
|
-}
|
|
-/*
|
|
- * atl1c_set_mac - Change the Ethernet Address of the NIC
|
|
- * @netdev: network interface device structure
|
|
- * @p: pointer to an address structure
|
|
- *
|
|
- * Returns 0 on success, negative on failure
|
|
- */
|
|
-static int atl1c_set_mac_addr(struct net_device *netdev, void *p)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct sockaddr *addr = p;
|
|
-
|
|
- if (!is_valid_ether_addr(addr->sa_data))
|
|
- return -EADDRNOTAVAIL;
|
|
-
|
|
- if (netif_running(netdev))
|
|
- return -EBUSY;
|
|
-
|
|
- memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
|
|
- memcpy(adapter->hw.mac_addr, addr->sa_data, netdev->addr_len);
|
|
-
|
|
- atl1c_hw_set_mac_addr(&adapter->hw);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void atl1c_set_rxbufsize(struct atl1c_adapter *adapter,
|
|
- struct net_device *dev)
|
|
-{
|
|
- int mtu = dev->mtu;
|
|
-
|
|
- adapter->rx_buffer_len = mtu > AT_RX_BUF_SIZE ?
|
|
- roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE;
|
|
-}
|
|
-/*
|
|
- * atl1c_change_mtu - Change the Maximum Transfer Unit
|
|
- * @netdev: network interface device structure
|
|
- * @new_mtu: new value for maximum frame size
|
|
- *
|
|
- * Returns 0 on success, negative on failure
|
|
- */
|
|
-static int atl1c_change_mtu(struct net_device *netdev, int new_mtu)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- int old_mtu = netdev->mtu;
|
|
- int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
|
|
-
|
|
- if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
|
|
- (max_frame > MAX_JUMBO_FRAME_SIZE)) {
|
|
- if (netif_msg_link(adapter))
|
|
- dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
|
|
- return -EINVAL;
|
|
- }
|
|
- /* set MTU */
|
|
- if (old_mtu != new_mtu && netif_running(netdev)) {
|
|
- while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
|
|
- msleep(1);
|
|
- netdev->mtu = new_mtu;
|
|
- adapter->hw.max_frame_size = new_mtu;
|
|
- atl1c_set_rxbufsize(adapter, netdev);
|
|
- atl1c_down(adapter);
|
|
- atl1c_up(adapter);
|
|
- clear_bit(__AT_RESETTING, &adapter->flags);
|
|
- if (adapter->hw.ctrl_flags & ATL1C_FPGA_VERSION) {
|
|
- u32 phy_data;
|
|
-
|
|
- AT_READ_REG(&adapter->hw, 0x1414, &phy_data);
|
|
- phy_data |= 0x10000000;
|
|
- AT_WRITE_REG(&adapter->hw, 0x1414, phy_data);
|
|
- }
|
|
-
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * caller should hold mdio_lock
|
|
- */
|
|
-static int atl1c_mdio_read(struct net_device *netdev, int phy_id, int reg_num)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- u16 result;
|
|
-
|
|
- atl1c_read_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, &result);
|
|
- return result;
|
|
-}
|
|
-
|
|
-static void atl1c_mdio_write(struct net_device *netdev, int phy_id,
|
|
- int reg_num, int val)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- atl1c_write_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, val);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_mii_ioctl -
|
|
- * @netdev:
|
|
- * @ifreq:
|
|
- * @cmd:
|
|
- */
|
|
-static int atl1c_mii_ioctl(struct net_device *netdev,
|
|
- struct ifreq *ifr, int cmd)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- struct mii_ioctl_data *data = if_mii(ifr);
|
|
- unsigned long flags;
|
|
- int retval = 0;
|
|
-
|
|
- if (!netif_running(netdev))
|
|
- return -EINVAL;
|
|
-
|
|
- spin_lock_irqsave(&adapter->mdio_lock, flags);
|
|
- switch (cmd) {
|
|
- case SIOCGMIIPHY:
|
|
- data->phy_id = 0;
|
|
- break;
|
|
-
|
|
- case SIOCGMIIREG:
|
|
- if (!capable(CAP_NET_ADMIN)) {
|
|
- retval = -EPERM;
|
|
- goto out;
|
|
- }
|
|
- if (atl1c_read_phy_reg(&adapter->hw, data->reg_num & 0x1F,
|
|
- &data->val_out)) {
|
|
- retval = -EIO;
|
|
- goto out;
|
|
- }
|
|
- break;
|
|
-
|
|
- case SIOCSMIIREG:
|
|
- if (!capable(CAP_NET_ADMIN)) {
|
|
- retval = -EPERM;
|
|
- goto out;
|
|
- }
|
|
- if (data->reg_num & ~(0x1F)) {
|
|
- retval = -EFAULT;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- dev_dbg(&pdev->dev, "<atl1c_mii_ioctl> write %x %x",
|
|
- data->reg_num, data->val_in);
|
|
- if (atl1c_write_phy_reg(&adapter->hw,
|
|
- data->reg_num, data->val_in)) {
|
|
- retval = -EIO;
|
|
- goto out;
|
|
- }
|
|
- break;
|
|
-
|
|
- default:
|
|
- retval = -EOPNOTSUPP;
|
|
- break;
|
|
- }
|
|
-out:
|
|
- spin_unlock_irqrestore(&adapter->mdio_lock, flags);
|
|
- return retval;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_ioctl -
|
|
- * @netdev:
|
|
- * @ifreq:
|
|
- * @cmd:
|
|
- */
|
|
-static int atl1c_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
|
|
-{
|
|
- switch (cmd) {
|
|
- case SIOCGMIIPHY:
|
|
- case SIOCGMIIREG:
|
|
- case SIOCSMIIREG:
|
|
- return atl1c_mii_ioctl(netdev, ifr, cmd);
|
|
- default:
|
|
- return -EOPNOTSUPP;
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_alloc_queues - Allocate memory for all rings
|
|
- * @adapter: board private structure to initialize
|
|
- *
|
|
- */
|
|
-static int __devinit atl1c_alloc_queues(struct atl1c_adapter *adapter)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void atl1c_set_mac_type(struct atl1c_hw *hw)
|
|
-{
|
|
- switch (hw->device_id) {
|
|
- case PCI_DEVICE_ID_ATTANSIC_L2C:
|
|
- hw->nic_type = athr_l2c;
|
|
- break;
|
|
-
|
|
- case PCI_DEVICE_ID_ATTANSIC_L1C:
|
|
- hw->nic_type = athr_l1c;
|
|
- break;
|
|
-
|
|
- default:
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-static int atl1c_setup_mac_funcs(struct atl1c_hw *hw)
|
|
-{
|
|
- u32 phy_status_data;
|
|
- u32 link_ctrl_data;
|
|
-
|
|
- atl1c_set_mac_type(hw);
|
|
- AT_READ_REG(hw, REG_PHY_STATUS, &phy_status_data);
|
|
- AT_READ_REG(hw, REG_LINK_CTRL, &link_ctrl_data);
|
|
-
|
|
- hw->ctrl_flags = ATL1C_INTR_CLEAR_ON_READ |
|
|
- ATL1C_INTR_MODRT_ENABLE |
|
|
- ATL1C_RX_IPV6_CHKSUM |
|
|
- ATL1C_TXQ_MODE_ENHANCE;
|
|
- if (link_ctrl_data & LINK_CTRL_L0S_EN)
|
|
- hw->ctrl_flags |= ATL1C_ASPM_L0S_SUPPORT;
|
|
- if (link_ctrl_data & LINK_CTRL_L1_EN)
|
|
- hw->ctrl_flags |= ATL1C_ASPM_L1_SUPPORT;
|
|
-
|
|
- if (hw->nic_type == athr_l1c) {
|
|
- hw->ctrl_flags |= ATL1C_ASPM_CTRL_MON;
|
|
- hw->ctrl_flags |= ATL1C_LINK_CAP_1000M;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-/*
|
|
- * atl1c_sw_init - Initialize general software structures (struct atl1c_adapter)
|
|
- * @adapter: board private structure to initialize
|
|
- *
|
|
- * atl1c_sw_init initializes the Adapter private data structure.
|
|
- * Fields are initialized based on PCI device information and
|
|
- * OS network device settings (MTU size).
|
|
- */
|
|
-static int __devinit atl1c_sw_init(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
-
|
|
- adapter->wol = 0;
|
|
- adapter->link_speed = SPEED_0;
|
|
- adapter->link_duplex = FULL_DUPLEX;
|
|
- adapter->num_rx_queues = AT_DEF_RECEIVE_QUEUE;
|
|
- adapter->tpd_ring[0].count = 1024;
|
|
- adapter->rfd_ring[0].count = 512;
|
|
-
|
|
- hw->vendor_id = pdev->vendor;
|
|
- hw->device_id = pdev->device;
|
|
- hw->subsystem_vendor_id = pdev->subsystem_vendor;
|
|
- hw->subsystem_id = pdev->subsystem_device;
|
|
-
|
|
- /* before link up, we assume hibernate is true */
|
|
- hw->hibernate = true;
|
|
- hw->media_type = MEDIA_TYPE_AUTO_SENSOR;
|
|
- if (atl1c_setup_mac_funcs(hw) != 0) {
|
|
- dev_err(&pdev->dev, "set mac function pointers failed\n");
|
|
- return -1;
|
|
- }
|
|
- hw->intr_mask = IMR_NORMAL_MASK;
|
|
- hw->phy_configured = false;
|
|
- hw->preamble_len = 7;
|
|
- hw->max_frame_size = adapter->netdev->mtu;
|
|
- if (adapter->num_rx_queues < 2) {
|
|
- hw->rss_type = atl1c_rss_disable;
|
|
- hw->rss_mode = atl1c_rss_mode_disable;
|
|
- } else {
|
|
- hw->rss_type = atl1c_rss_ipv4;
|
|
- hw->rss_mode = atl1c_rss_mul_que_mul_int;
|
|
- hw->rss_hash_bits = 16;
|
|
- }
|
|
- hw->autoneg_advertised = ADVERTISED_Autoneg;
|
|
- hw->indirect_tab = 0xE4E4E4E4;
|
|
- hw->base_cpu = 0;
|
|
-
|
|
- hw->ict = 50000; /* 100ms */
|
|
- hw->smb_timer = 200000; /* 400ms */
|
|
- hw->cmb_tpd = 4;
|
|
- hw->cmb_tx_timer = 1; /* 2 us */
|
|
- hw->rx_imt = 200;
|
|
- hw->tx_imt = 1000;
|
|
-
|
|
- hw->tpd_burst = 5;
|
|
- hw->rfd_burst = 8;
|
|
- hw->dma_order = atl1c_dma_ord_out;
|
|
- hw->dmar_block = atl1c_dma_req_1024;
|
|
- hw->dmaw_block = atl1c_dma_req_1024;
|
|
- hw->dmar_dly_cnt = 15;
|
|
- hw->dmaw_dly_cnt = 4;
|
|
-
|
|
- if (atl1c_alloc_queues(adapter)) {
|
|
- dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
|
|
- return -ENOMEM;
|
|
- }
|
|
- /* TODO */
|
|
- atl1c_set_rxbufsize(adapter, adapter->netdev);
|
|
- atomic_set(&adapter->irq_sem, 1);
|
|
- spin_lock_init(&adapter->mdio_lock);
|
|
- spin_lock_init(&adapter->tx_lock);
|
|
- set_bit(__AT_DOWN, &adapter->flags);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_clean_tx_ring - Free Tx-skb
|
|
- * @adapter: board private structure
|
|
- */
|
|
-static void atl1c_clean_tx_ring(struct atl1c_adapter *adapter,
|
|
- enum atl1c_trans_queue type)
|
|
-{
|
|
- struct atl1c_tpd_ring *tpd_ring = &adapter->tpd_ring[type];
|
|
- struct atl1c_buffer *buffer_info;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- u16 index, ring_count;
|
|
-
|
|
- ring_count = tpd_ring->count;
|
|
- for (index = 0; index < ring_count; index++) {
|
|
- buffer_info = &tpd_ring->buffer_info[index];
|
|
- if (buffer_info->state == ATL1_BUFFER_FREE)
|
|
- continue;
|
|
- if (buffer_info->dma)
|
|
- pci_unmap_single(pdev, buffer_info->dma,
|
|
- buffer_info->length,
|
|
- PCI_DMA_TODEVICE);
|
|
- if (buffer_info->skb)
|
|
- dev_kfree_skb(buffer_info->skb);
|
|
- buffer_info->dma = 0;
|
|
- buffer_info->skb = NULL;
|
|
- buffer_info->state = ATL1_BUFFER_FREE;
|
|
- }
|
|
-
|
|
- /* Zero out Tx-buffers */
|
|
- memset(tpd_ring->desc, 0, sizeof(struct atl1c_tpd_desc) *
|
|
- ring_count);
|
|
- atomic_set(&tpd_ring->next_to_clean, 0);
|
|
- tpd_ring->next_to_use = 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_clean_rx_ring - Free rx-reservation skbs
|
|
- * @adapter: board private structure
|
|
- */
|
|
-static void atl1c_clean_rx_ring(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
|
|
- struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
|
|
- struct atl1c_buffer *buffer_info;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- int i, j;
|
|
-
|
|
- for (i = 0; i < adapter->num_rx_queues; i++) {
|
|
- for (j = 0; j < rfd_ring[i].count; j++) {
|
|
- buffer_info = &rfd_ring[i].buffer_info[j];
|
|
- if (buffer_info->state == ATL1_BUFFER_FREE)
|
|
- continue;
|
|
- if (buffer_info->dma)
|
|
- pci_unmap_single(pdev, buffer_info->dma,
|
|
- buffer_info->length,
|
|
- PCI_DMA_FROMDEVICE);
|
|
- if (buffer_info->skb)
|
|
- dev_kfree_skb(buffer_info->skb);
|
|
- buffer_info->state = ATL1_BUFFER_FREE;
|
|
- buffer_info->skb = NULL;
|
|
- }
|
|
- /* zero out the descriptor ring */
|
|
- memset(rfd_ring[i].desc, 0, rfd_ring[i].size);
|
|
- rfd_ring[i].next_to_clean = 0;
|
|
- rfd_ring[i].next_to_use = 0;
|
|
- rrd_ring[i].next_to_use = 0;
|
|
- rrd_ring[i].next_to_clean = 0;
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * Read / Write Ptr Initialize:
|
|
- */
|
|
-static void atl1c_init_ring_ptrs(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
|
|
- struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
|
|
- struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
|
|
- struct atl1c_buffer *buffer_info;
|
|
- int i, j;
|
|
-
|
|
- for (i = 0; i < AT_MAX_TRANSMIT_QUEUE; i++) {
|
|
- tpd_ring[i].next_to_use = 0;
|
|
- atomic_set(&tpd_ring[i].next_to_clean, 0);
|
|
- buffer_info = tpd_ring[i].buffer_info;
|
|
- for (j = 0; j < tpd_ring->count; j++)
|
|
- buffer_info[i].state = ATL1_BUFFER_FREE;
|
|
- }
|
|
- for (i = 0; i < adapter->num_rx_queues; i++) {
|
|
- rfd_ring[i].next_to_use = 0;
|
|
- rfd_ring[i].next_to_clean = 0;
|
|
- rrd_ring[i].next_to_use = 0;
|
|
- rrd_ring[i].next_to_clean = 0;
|
|
- for (j = 0; j < rfd_ring[i].count; j++) {
|
|
- buffer_info = &rfd_ring[i].buffer_info[j];
|
|
- buffer_info->state = ATL1_BUFFER_FREE;
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_free_ring_resources - Free Tx / RX descriptor Resources
|
|
- * @adapter: board private structure
|
|
- *
|
|
- * Free all transmit software resources
|
|
- */
|
|
-static void atl1c_free_ring_resources(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
-
|
|
- pci_free_consistent(pdev, adapter->ring_header.size,
|
|
- adapter->ring_header.desc,
|
|
- adapter->ring_header.dma);
|
|
- adapter->ring_header.desc = NULL;
|
|
-
|
|
- /* Note: just free tdp_ring.buffer_info,
|
|
- * it contain rfd_ring.buffer_info, do not double free */
|
|
- if (adapter->tpd_ring[0].buffer_info) {
|
|
- kfree(adapter->tpd_ring[0].buffer_info);
|
|
- adapter->tpd_ring[0].buffer_info = NULL;
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_setup_mem_resources - allocate Tx / RX descriptor resources
|
|
- * @adapter: board private structure
|
|
- *
|
|
- * Return 0 on success, negative on failure
|
|
- */
|
|
-static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
|
|
- struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
|
|
- struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
|
|
- struct atl1c_ring_header *ring_header = &adapter->ring_header;
|
|
- int num_rx_queues = adapter->num_rx_queues;
|
|
- int size;
|
|
- int i;
|
|
- int count = 0;
|
|
- int rx_desc_count = 0;
|
|
- u32 offset = 0;
|
|
-
|
|
- rrd_ring[0].count = rfd_ring[0].count;
|
|
- for (i = 1; i < AT_MAX_TRANSMIT_QUEUE; i++)
|
|
- tpd_ring[i].count = tpd_ring[0].count;
|
|
-
|
|
- for (i = 1; i < adapter->num_rx_queues; i++)
|
|
- rfd_ring[i].count = rrd_ring[i].count = rfd_ring[0].count;
|
|
-
|
|
- /* 2 tpd queue, one high priority queue,
|
|
- * another normal priority queue */
|
|
- size = sizeof(struct atl1c_buffer) * (tpd_ring->count * 2 +
|
|
- rfd_ring->count * num_rx_queues);
|
|
- tpd_ring->buffer_info = kzalloc(size, GFP_KERNEL);
|
|
- if (unlikely(!tpd_ring->buffer_info)) {
|
|
- dev_err(&pdev->dev, "kzalloc failed, size = %d\n",
|
|
- size);
|
|
- goto err_nomem;
|
|
- }
|
|
- for (i = 0; i < AT_MAX_TRANSMIT_QUEUE; i++) {
|
|
- tpd_ring[i].buffer_info =
|
|
- (struct atl1c_buffer *) (tpd_ring->buffer_info + count);
|
|
- count += tpd_ring[i].count;
|
|
- }
|
|
-
|
|
- for (i = 0; i < num_rx_queues; i++) {
|
|
- rfd_ring[i].buffer_info =
|
|
- (struct atl1c_buffer *) (tpd_ring->buffer_info + count);
|
|
- count += rfd_ring[i].count;
|
|
- rx_desc_count += rfd_ring[i].count;
|
|
- }
|
|
- /*
|
|
- * real ring DMA buffer
|
|
- * each ring/block may need up to 8 bytes for alignment, hence the
|
|
- * additional bytes tacked onto the end.
|
|
- */
|
|
- ring_header->size = size =
|
|
- sizeof(struct atl1c_tpd_desc) * tpd_ring->count * 2 +
|
|
- sizeof(struct atl1c_rx_free_desc) * rx_desc_count +
|
|
- sizeof(struct atl1c_recv_ret_status) * rx_desc_count +
|
|
- sizeof(struct atl1c_hw_stats) +
|
|
- 8 * 4 + 8 * 2 * num_rx_queues;
|
|
-
|
|
- ring_header->desc = pci_alloc_consistent(pdev, ring_header->size,
|
|
- &ring_header->dma);
|
|
- if (unlikely(!ring_header->desc)) {
|
|
- dev_err(&pdev->dev, "pci_alloc_consistend failed\n");
|
|
- goto err_nomem;
|
|
- }
|
|
- memset(ring_header->desc, 0, ring_header->size);
|
|
- /* init TPD ring */
|
|
-
|
|
- tpd_ring[0].dma = roundup(ring_header->dma, 8);
|
|
- offset = tpd_ring[0].dma - ring_header->dma;
|
|
- for (i = 0; i < AT_MAX_TRANSMIT_QUEUE; i++) {
|
|
- tpd_ring[i].dma = ring_header->dma + offset;
|
|
- tpd_ring[i].desc = (u8 *) ring_header->desc + offset;
|
|
- tpd_ring[i].size =
|
|
- sizeof(struct atl1c_tpd_desc) * tpd_ring[i].count;
|
|
- offset += roundup(tpd_ring[i].size, 8);
|
|
- }
|
|
- /* init RFD ring */
|
|
- for (i = 0; i < num_rx_queues; i++) {
|
|
- rfd_ring[i].dma = ring_header->dma + offset;
|
|
- rfd_ring[i].desc = (u8 *) ring_header->desc + offset;
|
|
- rfd_ring[i].size = sizeof(struct atl1c_rx_free_desc) *
|
|
- rfd_ring[i].count;
|
|
- offset += roundup(rfd_ring[i].size, 8);
|
|
- }
|
|
-
|
|
- /* init RRD ring */
|
|
- for (i = 0; i < num_rx_queues; i++) {
|
|
- rrd_ring[i].dma = ring_header->dma + offset;
|
|
- rrd_ring[i].desc = (u8 *) ring_header->desc + offset;
|
|
- rrd_ring[i].size = sizeof(struct atl1c_recv_ret_status) *
|
|
- rrd_ring[i].count;
|
|
- offset += roundup(rrd_ring[i].size, 8);
|
|
- }
|
|
-
|
|
- adapter->smb.dma = ring_header->dma + offset;
|
|
- adapter->smb.smb = (u8 *)ring_header->desc + offset;
|
|
- return 0;
|
|
-
|
|
-err_nomem:
|
|
- kfree(tpd_ring->buffer_info);
|
|
- return -ENOMEM;
|
|
-}
|
|
-
|
|
-static void atl1c_configure_des_ring(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- struct atl1c_rfd_ring *rfd_ring = (struct atl1c_rfd_ring *)
|
|
- adapter->rfd_ring;
|
|
- struct atl1c_rrd_ring *rrd_ring = (struct atl1c_rrd_ring *)
|
|
- adapter->rrd_ring;
|
|
- struct atl1c_tpd_ring *tpd_ring = (struct atl1c_tpd_ring *)
|
|
- adapter->tpd_ring;
|
|
- struct atl1c_cmb *cmb = (struct atl1c_cmb *) &adapter->cmb;
|
|
- struct atl1c_smb *smb = (struct atl1c_smb *) &adapter->smb;
|
|
- int i;
|
|
-
|
|
- /* TPD */
|
|
- AT_WRITE_REG(hw, REG_TX_BASE_ADDR_HI,
|
|
- (u32)((tpd_ring[atl1c_trans_normal].dma &
|
|
- AT_DMA_HI_ADDR_MASK) >> 32));
|
|
- /* just enable normal priority TX queue */
|
|
- AT_WRITE_REG(hw, REG_NTPD_HEAD_ADDR_LO,
|
|
- (u32)(tpd_ring[atl1c_trans_normal].dma &
|
|
- AT_DMA_LO_ADDR_MASK));
|
|
- AT_WRITE_REG(hw, REG_HTPD_HEAD_ADDR_LO,
|
|
- (u32)(tpd_ring[atl1c_trans_high].dma &
|
|
- AT_DMA_LO_ADDR_MASK));
|
|
- AT_WRITE_REG(hw, REG_TPD_RING_SIZE,
|
|
- (u32)(tpd_ring[0].count & TPD_RING_SIZE_MASK));
|
|
-
|
|
-
|
|
- /* RFD */
|
|
- AT_WRITE_REG(hw, REG_RX_BASE_ADDR_HI,
|
|
- (u32)((rfd_ring[0].dma & AT_DMA_HI_ADDR_MASK) >> 32));
|
|
- for (i = 0; i < adapter->num_rx_queues; i++)
|
|
- AT_WRITE_REG(hw, atl1c_rfd_addr_lo_regs[i],
|
|
- (u32)(rfd_ring[i].dma & AT_DMA_LO_ADDR_MASK));
|
|
-
|
|
- AT_WRITE_REG(hw, REG_RFD_RING_SIZE,
|
|
- rfd_ring[0].count & RFD_RING_SIZE_MASK);
|
|
- AT_WRITE_REG(hw, REG_RX_BUF_SIZE,
|
|
- adapter->rx_buffer_len & RX_BUF_SIZE_MASK);
|
|
-
|
|
- /* RRD */
|
|
- for (i = 0; i < adapter->num_rx_queues; i++)
|
|
- AT_WRITE_REG(hw, atl1c_rrd_addr_lo_regs[i],
|
|
- (u32)(rrd_ring[i].dma & AT_DMA_LO_ADDR_MASK));
|
|
- AT_WRITE_REG(hw, REG_RRD_RING_SIZE,
|
|
- (rrd_ring[0].count & RRD_RING_SIZE_MASK));
|
|
-
|
|
- /* CMB */
|
|
- AT_WRITE_REG(hw, REG_CMB_BASE_ADDR_LO, cmb->dma & AT_DMA_LO_ADDR_MASK);
|
|
-
|
|
- /* SMB */
|
|
- AT_WRITE_REG(hw, REG_SMB_BASE_ADDR_HI,
|
|
- (u32)((smb->dma & AT_DMA_HI_ADDR_MASK) >> 32));
|
|
- AT_WRITE_REG(hw, REG_SMB_BASE_ADDR_LO,
|
|
- (u32)(smb->dma & AT_DMA_LO_ADDR_MASK));
|
|
- /* Load all of base address above */
|
|
- AT_WRITE_REG(hw, REG_LOAD_PTR, 1);
|
|
-}
|
|
-
|
|
-static void atl1c_configure_tx(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- u32 dev_ctrl_data;
|
|
- u32 max_pay_load;
|
|
- u16 tx_offload_thresh;
|
|
- u32 txq_ctrl_data;
|
|
- u32 extra_size = 0; /* Jumbo frame threshold in QWORD unit */
|
|
-
|
|
- extra_size = ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
|
|
- tx_offload_thresh = MAX_TX_OFFLOAD_THRESH;
|
|
- AT_WRITE_REG(hw, REG_TX_TSO_OFFLOAD_THRESH,
|
|
- (tx_offload_thresh >> 3) & TX_TSO_OFFLOAD_THRESH_MASK);
|
|
- AT_READ_REG(hw, REG_DEVICE_CTRL, &dev_ctrl_data);
|
|
- max_pay_load = (dev_ctrl_data >> DEVICE_CTRL_MAX_PAYLOAD_SHIFT) &
|
|
- DEVICE_CTRL_MAX_PAYLOAD_MASK;
|
|
- hw->dmaw_block = min(max_pay_load, hw->dmaw_block);
|
|
- max_pay_load = (dev_ctrl_data >> DEVICE_CTRL_MAX_RREQ_SZ_SHIFT) &
|
|
- DEVICE_CTRL_MAX_RREQ_SZ_MASK;
|
|
- hw->dmar_block = min(max_pay_load, hw->dmar_block);
|
|
-
|
|
- txq_ctrl_data = (hw->tpd_burst & TXQ_NUM_TPD_BURST_MASK) <<
|
|
- TXQ_NUM_TPD_BURST_SHIFT;
|
|
- if (hw->ctrl_flags & ATL1C_TXQ_MODE_ENHANCE)
|
|
- txq_ctrl_data |= TXQ_CTRL_ENH_MODE;
|
|
- txq_ctrl_data |= (atl1c_pay_load_size[hw->dmar_block] &
|
|
- TXQ_TXF_BURST_NUM_MASK) << TXQ_TXF_BURST_NUM_SHIFT;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_TXQ_CTRL, txq_ctrl_data);
|
|
-}
|
|
-
|
|
-static void atl1c_configure_rx(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- u32 rxq_ctrl_data;
|
|
-
|
|
- rxq_ctrl_data = (hw->rfd_burst & RXQ_RFD_BURST_NUM_MASK) <<
|
|
- RXQ_RFD_BURST_NUM_SHIFT;
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_RX_IPV6_CHKSUM)
|
|
- rxq_ctrl_data |= IPV6_CHKSUM_CTRL_EN;
|
|
- if (hw->rss_type == atl1c_rss_ipv4)
|
|
- rxq_ctrl_data |= RSS_HASH_IPV4;
|
|
- if (hw->rss_type == atl1c_rss_ipv4_tcp)
|
|
- rxq_ctrl_data |= RSS_HASH_IPV4_TCP;
|
|
- if (hw->rss_type == atl1c_rss_ipv6)
|
|
- rxq_ctrl_data |= RSS_HASH_IPV6;
|
|
- if (hw->rss_type == atl1c_rss_ipv6_tcp)
|
|
- rxq_ctrl_data |= RSS_HASH_IPV6_TCP;
|
|
- if (hw->rss_type != atl1c_rss_disable)
|
|
- rxq_ctrl_data |= RRS_HASH_CTRL_EN;
|
|
-
|
|
- rxq_ctrl_data |= (hw->rss_mode & RSS_MODE_MASK) <<
|
|
- RSS_MODE_SHIFT;
|
|
- rxq_ctrl_data |= (hw->rss_hash_bits & RSS_HASH_BITS_MASK) <<
|
|
- RSS_HASH_BITS_SHIFT;
|
|
- if (hw->ctrl_flags & ATL1C_ASPM_CTRL_MON)
|
|
- rxq_ctrl_data |= (ASPM_THRUPUT_LIMIT_100M &
|
|
- ASPM_THRUPUT_LIMIT_MASK) << ASPM_THRUPUT_LIMIT_SHIFT;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_RXQ_CTRL, rxq_ctrl_data);
|
|
-}
|
|
-
|
|
-static void atl1c_configure_rss(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_IDT_TABLE, hw->indirect_tab);
|
|
- AT_WRITE_REG(hw, REG_BASE_CPU_NUMBER, hw->base_cpu);
|
|
-}
|
|
-
|
|
-static void atl1c_configure_dma(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- u32 dma_ctrl_data;
|
|
-
|
|
- dma_ctrl_data = DMA_CTRL_DMAR_REQ_PRI;
|
|
- if (hw->ctrl_flags & ATL1C_CMB_ENABLE)
|
|
- dma_ctrl_data |= DMA_CTRL_CMB_EN;
|
|
- if (hw->ctrl_flags & ATL1C_SMB_ENABLE)
|
|
- dma_ctrl_data |= DMA_CTRL_SMB_EN;
|
|
- else
|
|
- dma_ctrl_data |= MAC_CTRL_SMB_DIS;
|
|
-
|
|
- switch (hw->dma_order) {
|
|
- case atl1c_dma_ord_in:
|
|
- dma_ctrl_data |= DMA_CTRL_DMAR_IN_ORDER;
|
|
- break;
|
|
- case atl1c_dma_ord_enh:
|
|
- dma_ctrl_data |= DMA_CTRL_DMAR_ENH_ORDER;
|
|
- break;
|
|
- case atl1c_dma_ord_out:
|
|
- dma_ctrl_data |= DMA_CTRL_DMAR_OUT_ORDER;
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- dma_ctrl_data |= (((u32)hw->dmar_block) & DMA_CTRL_DMAR_BURST_LEN_MASK)
|
|
- << DMA_CTRL_DMAR_BURST_LEN_SHIFT;
|
|
- dma_ctrl_data |= (((u32)hw->dmaw_block) & DMA_CTRL_DMAW_BURST_LEN_MASK)
|
|
- << DMA_CTRL_DMAW_BURST_LEN_SHIFT;
|
|
- dma_ctrl_data |= (((u32)hw->dmar_dly_cnt) & DMA_CTRL_DMAR_DLY_CNT_MASK)
|
|
- << DMA_CTRL_DMAR_DLY_CNT_SHIFT;
|
|
- dma_ctrl_data |= (((u32)hw->dmaw_dly_cnt) & DMA_CTRL_DMAW_DLY_CNT_MASK)
|
|
- << DMA_CTRL_DMAW_DLY_CNT_SHIFT;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_DMA_CTRL, dma_ctrl_data);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Stop the mac, transmit and receive units
|
|
- * hw - Struct containing variables accessed by shared code
|
|
- * return : 0 or idle status (if error)
|
|
- */
|
|
-static int atl1c_stop_mac(struct atl1c_hw *hw)
|
|
-{
|
|
- u32 data;
|
|
- int timeout;
|
|
-
|
|
- AT_READ_REG(hw, REG_RXQ_CTRL, &data);
|
|
- data &= ~(RXQ1_CTRL_EN | RXQ2_CTRL_EN |
|
|
- RXQ3_CTRL_EN | RXQ_CTRL_EN);
|
|
- AT_WRITE_REG(hw, REG_RXQ_CTRL, data);
|
|
-
|
|
- AT_READ_REG(hw, REG_TXQ_CTRL, &data);
|
|
- data &= ~TXQ_CTRL_EN;
|
|
- AT_WRITE_REG(hw, REG_TWSI_CTRL, data);
|
|
-
|
|
- for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
|
|
- AT_READ_REG(hw, REG_IDLE_STATUS, &data);
|
|
- if ((data & (IDLE_STATUS_RXQ_NO_IDLE |
|
|
- IDLE_STATUS_TXQ_NO_IDLE)) == 0)
|
|
- break;
|
|
- msleep(1);
|
|
- }
|
|
-
|
|
- AT_READ_REG(hw, REG_MAC_CTRL, &data);
|
|
- data &= ~(MAC_CTRL_TX_EN | MAC_CTRL_RX_EN);
|
|
- AT_WRITE_REG(hw, REG_MAC_CTRL, data);
|
|
-
|
|
- for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
|
|
- AT_READ_REG(hw, REG_IDLE_STATUS, &data);
|
|
- if ((data & IDLE_STATUS_MASK) == 0)
|
|
- return 0;
|
|
- msleep(1);
|
|
- }
|
|
- return data;
|
|
-}
|
|
-
|
|
-static void atl1c_enable_rx_ctrl(struct atl1c_hw *hw)
|
|
-{
|
|
- u32 data;
|
|
-
|
|
- AT_READ_REG(hw, REG_RXQ_CTRL, &data);
|
|
- switch (hw->adapter->num_rx_queues) {
|
|
- case 4:
|
|
- data |= (RXQ3_CTRL_EN | RXQ2_CTRL_EN | RXQ1_CTRL_EN);
|
|
- break;
|
|
- case 3:
|
|
- data |= (RXQ2_CTRL_EN | RXQ1_CTRL_EN);
|
|
- break;
|
|
- case 2:
|
|
- data |= RXQ1_CTRL_EN;
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
- data |= RXQ_CTRL_EN;
|
|
- AT_WRITE_REG(hw, REG_RXQ_CTRL, data);
|
|
-}
|
|
-
|
|
-static void atl1c_enable_tx_ctrl(struct atl1c_hw *hw)
|
|
-{
|
|
- u32 data;
|
|
-
|
|
- AT_READ_REG(hw, REG_TXQ_CTRL, &data);
|
|
- data |= TXQ_CTRL_EN;
|
|
- AT_WRITE_REG(hw, REG_TXQ_CTRL, data);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Reset the transmit and receive units; mask and clear all interrupts.
|
|
- * hw - Struct containing variables accessed by shared code
|
|
- * return : 0 or idle status (if error)
|
|
- */
|
|
-static int atl1c_reset_mac(struct atl1c_hw *hw)
|
|
-{
|
|
- struct atl1c_adapter *adapter = (struct atl1c_adapter *)hw->adapter;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- u32 idle_status_data = 0;
|
|
- int timeout = 0;
|
|
- int ret;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_IMR, 0);
|
|
- AT_WRITE_REG(hw, REG_ISR, ISR_DIS_INT);
|
|
-
|
|
- ret = atl1c_stop_mac(hw);
|
|
- if (ret)
|
|
- return ret;
|
|
- /*
|
|
- * Issue Soft Reset to the MAC. This will reset the chip's
|
|
- * transmit, receive, DMA. It will not effect
|
|
- * the current PCI configuration. The global reset bit is self-
|
|
- * clearing, and should clear within a microsecond.
|
|
- */
|
|
- AT_WRITE_REGW(hw, REG_MASTER_CTRL, MASTER_CTRL_SOFT_RST);
|
|
- AT_WRITE_FLUSH(hw);
|
|
- msleep(10);
|
|
- /* Wait at least 10ms for All module to be Idle */
|
|
- for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
|
|
- AT_READ_REG(hw, REG_IDLE_STATUS, &idle_status_data);
|
|
- if ((idle_status_data & IDLE_STATUS_MASK) == 0)
|
|
- break;
|
|
- msleep(1);
|
|
- }
|
|
- if (timeout >= AT_HW_MAX_IDLE_DELAY) {
|
|
- dev_err(&pdev->dev,
|
|
- "MAC state machine cann't be idle since"
|
|
- " disabled for 10ms second\n");
|
|
- return -1;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void atl1c_disable_l0s_l1(struct atl1c_hw *hw)
|
|
-{
|
|
- u32 pm_ctrl_data;
|
|
-
|
|
- AT_READ_REG(hw, REG_PM_CTRL, &pm_ctrl_data);
|
|
- pm_ctrl_data &= ~(PM_CTRL_L1_ENTRY_TIMER_MASK <<
|
|
- PM_CTRL_L1_ENTRY_TIMER_SHIFT);
|
|
- pm_ctrl_data &= ~PM_CTRL_CLK_SWH_L1;
|
|
- pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN;
|
|
- pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN;
|
|
- pm_ctrl_data &= ~PM_CTRL_MAC_ASPM_CHK;
|
|
- pm_ctrl_data &= ~PM_CTRL_SERDES_PD_EX_L1;
|
|
-
|
|
- pm_ctrl_data |= PM_CTRL_SERDES_BUDS_RX_L1_EN;
|
|
- pm_ctrl_data |= PM_CTRL_SERDES_PLL_L1_EN;
|
|
- pm_ctrl_data |= PM_CTRL_SERDES_L1_EN;
|
|
- AT_WRITE_REG(hw, REG_PM_CTRL, pm_ctrl_data);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Set ASPM state.
|
|
- * Enable/disable L0s/L1 depend on link state.
|
|
- */
|
|
-static void atl1c_set_aspm(struct atl1c_hw *hw, bool linkup)
|
|
-{
|
|
- u32 pm_ctrl_data;
|
|
-
|
|
- AT_READ_REG(hw, REG_PM_CTRL, &pm_ctrl_data);
|
|
-
|
|
- pm_ctrl_data &= PM_CTRL_SERDES_PD_EX_L1;
|
|
- pm_ctrl_data |= ~PM_CTRL_SERDES_BUDS_RX_L1_EN;
|
|
- pm_ctrl_data |= ~PM_CTRL_SERDES_L1_EN;
|
|
- pm_ctrl_data &= ~(PM_CTRL_L1_ENTRY_TIMER_MASK <<
|
|
- PM_CTRL_L1_ENTRY_TIMER_SHIFT);
|
|
-
|
|
- pm_ctrl_data |= PM_CTRL_MAC_ASPM_CHK;
|
|
-
|
|
- if (linkup) {
|
|
- pm_ctrl_data |= PM_CTRL_SERDES_PLL_L1_EN;
|
|
- pm_ctrl_data &= ~PM_CTRL_CLK_SWH_L1;
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_ASPM_L1_SUPPORT) {
|
|
- pm_ctrl_data |= AT_ASPM_L1_TIMER <<
|
|
- PM_CTRL_L1_ENTRY_TIMER_SHIFT;
|
|
- pm_ctrl_data |= PM_CTRL_ASPM_L1_EN;
|
|
- } else
|
|
- pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN;
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_ASPM_L0S_SUPPORT)
|
|
- pm_ctrl_data |= PM_CTRL_ASPM_L0S_EN;
|
|
- else
|
|
- pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN;
|
|
-
|
|
- } else {
|
|
- pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN;
|
|
- pm_ctrl_data &= ~PM_CTRL_SERDES_PLL_L1_EN;
|
|
-
|
|
- pm_ctrl_data |= PM_CTRL_CLK_SWH_L1;
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_ASPM_L1_SUPPORT)
|
|
- pm_ctrl_data |= PM_CTRL_ASPM_L1_EN;
|
|
- else
|
|
- pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN;
|
|
- }
|
|
-
|
|
- AT_WRITE_REG(hw, REG_PM_CTRL, pm_ctrl_data);
|
|
-}
|
|
-
|
|
-static void atl1c_setup_mac_ctrl(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- u32 mac_ctrl_data;
|
|
-
|
|
- mac_ctrl_data = MAC_CTRL_TX_EN | MAC_CTRL_RX_EN;
|
|
- mac_ctrl_data |= (MAC_CTRL_TX_FLOW | MAC_CTRL_RX_FLOW);
|
|
-
|
|
- if (adapter->link_duplex == FULL_DUPLEX) {
|
|
- hw->mac_duplex = true;
|
|
- mac_ctrl_data |= MAC_CTRL_DUPLX;
|
|
- }
|
|
-
|
|
- if (adapter->link_speed == SPEED_1000)
|
|
- hw->mac_speed = atl1c_mac_speed_1000;
|
|
- else
|
|
- hw->mac_speed = atl1c_mac_speed_10_100;
|
|
-
|
|
- mac_ctrl_data |= (hw->mac_speed & MAC_CTRL_SPEED_MASK) <<
|
|
- MAC_CTRL_SPEED_SHIFT;
|
|
-
|
|
- mac_ctrl_data |= (MAC_CTRL_ADD_CRC | MAC_CTRL_PAD);
|
|
- mac_ctrl_data |= ((hw->preamble_len & MAC_CTRL_PRMLEN_MASK) <<
|
|
- MAC_CTRL_PRMLEN_SHIFT);
|
|
-
|
|
- if (adapter->vlgrp)
|
|
- mac_ctrl_data |= MAC_CTRL_RMV_VLAN;
|
|
-
|
|
- mac_ctrl_data |= MAC_CTRL_BC_EN;
|
|
- if (netdev->flags & IFF_PROMISC)
|
|
- mac_ctrl_data |= MAC_CTRL_PROMIS_EN;
|
|
- if (netdev->flags & IFF_ALLMULTI)
|
|
- mac_ctrl_data |= MAC_CTRL_MC_ALL_EN;
|
|
-
|
|
- mac_ctrl_data |= MAC_CTRL_SINGLE_PAUSE_EN;
|
|
- AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_configure - Configure Transmit&Receive Unit after Reset
|
|
- * @adapter: board private structure
|
|
- *
|
|
- * Configure the Tx /Rx unit of the MAC after a reset.
|
|
- */
|
|
-static int atl1c_configure(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- u32 master_ctrl_data = 0;
|
|
- u32 intr_modrt_data;
|
|
-
|
|
- /* clear interrupt status */
|
|
- AT_WRITE_REG(hw, REG_ISR, 0xFFFFFFFF);
|
|
- /* Clear any WOL status */
|
|
- AT_WRITE_REG(hw, REG_WOL_CTRL, 0);
|
|
- /* set Interrupt Clear Timer
|
|
- * HW will enable self to assert interrupt event to system after
|
|
- * waiting x-time for software to notify it accept interrupt.
|
|
- */
|
|
- AT_WRITE_REG(hw, REG_INT_RETRIG_TIMER,
|
|
- hw->ict & INT_RETRIG_TIMER_MASK);
|
|
-
|
|
- atl1c_configure_des_ring(adapter);
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_INTR_MODRT_ENABLE) {
|
|
- intr_modrt_data = (hw->tx_imt & IRQ_MODRT_TIMER_MASK) <<
|
|
- IRQ_MODRT_TX_TIMER_SHIFT;
|
|
- intr_modrt_data |= (hw->rx_imt & IRQ_MODRT_TIMER_MASK) <<
|
|
- IRQ_MODRT_RX_TIMER_SHIFT;
|
|
- AT_WRITE_REG(hw, REG_IRQ_MODRT_TIMER_INIT, intr_modrt_data);
|
|
- master_ctrl_data |=
|
|
- MASTER_CTRL_TX_ITIMER_EN | MASTER_CTRL_RX_ITIMER_EN;
|
|
- }
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_INTR_CLEAR_ON_READ)
|
|
- master_ctrl_data |= MASTER_CTRL_INT_RDCLR;
|
|
-
|
|
- AT_WRITE_REG(hw, REG_MASTER_CTRL, master_ctrl_data);
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_CMB_ENABLE) {
|
|
- AT_WRITE_REG(hw, REG_CMB_TPD_THRESH,
|
|
- hw->cmb_tpd & CMB_TPD_THRESH_MASK);
|
|
- AT_WRITE_REG(hw, REG_CMB_TX_TIMER,
|
|
- hw->cmb_tx_timer & CMB_TX_TIMER_MASK);
|
|
- }
|
|
-
|
|
- if (hw->ctrl_flags & ATL1C_SMB_ENABLE)
|
|
- AT_WRITE_REG(hw, REG_SMB_STAT_TIMER,
|
|
- hw->smb_timer & SMB_STAT_TIMER_MASK);
|
|
- /* set MTU */
|
|
- AT_WRITE_REG(hw, REG_MTU, hw->max_frame_size + ETH_HLEN +
|
|
- VLAN_HLEN + ETH_FCS_LEN);
|
|
- /* HDS, disable */
|
|
- AT_WRITE_REG(hw, REG_HDS_CTRL, 0);
|
|
-
|
|
- atl1c_configure_tx(adapter);
|
|
- atl1c_configure_rx(adapter);
|
|
- atl1c_configure_rss(adapter);
|
|
- atl1c_configure_dma(adapter);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void atl1c_update_hw_stats(struct atl1c_adapter *adapter)
|
|
-{
|
|
- u16 hw_reg_addr = 0;
|
|
- unsigned long *stats_item = NULL;
|
|
- u32 data;
|
|
-
|
|
- /* update rx status */
|
|
- hw_reg_addr = REG_MAC_RX_STATUS_BIN;
|
|
- stats_item = &adapter->hw_stats.rx_ok;
|
|
- while (hw_reg_addr <= REG_MAC_RX_STATUS_END) {
|
|
- AT_READ_REG(&adapter->hw, hw_reg_addr, &data);
|
|
- *stats_item += data;
|
|
- stats_item++;
|
|
- hw_reg_addr += 4;
|
|
- }
|
|
-/* update tx status */
|
|
- hw_reg_addr = REG_MAC_TX_STATUS_BIN;
|
|
- stats_item = &adapter->hw_stats.tx_ok;
|
|
- while (hw_reg_addr <= REG_MAC_TX_STATUS_END) {
|
|
- AT_READ_REG(&adapter->hw, hw_reg_addr, &data);
|
|
- *stats_item += data;
|
|
- stats_item++;
|
|
- hw_reg_addr += 4;
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_get_stats - Get System Network Statistics
|
|
- * @netdev: network interface device structure
|
|
- *
|
|
- * Returns the address of the device statistics structure.
|
|
- * The statistics are actually updated from the timer callback.
|
|
- */
|
|
-static struct net_device_stats *atl1c_get_stats(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct atl1c_hw_stats *hw_stats = &adapter->hw_stats;
|
|
- struct net_device_stats *net_stats = &adapter->net_stats;
|
|
-
|
|
- atl1c_update_hw_stats(adapter);
|
|
- net_stats->rx_packets = hw_stats->rx_ok;
|
|
- net_stats->tx_packets = hw_stats->tx_ok;
|
|
- net_stats->rx_bytes = hw_stats->rx_byte_cnt;
|
|
- net_stats->tx_bytes = hw_stats->tx_byte_cnt;
|
|
- net_stats->multicast = hw_stats->rx_mcast;
|
|
- net_stats->collisions = hw_stats->tx_1_col +
|
|
- hw_stats->tx_2_col * 2 +
|
|
- hw_stats->tx_late_col + hw_stats->tx_abort_col;
|
|
- net_stats->rx_errors = hw_stats->rx_frag + hw_stats->rx_fcs_err +
|
|
- hw_stats->rx_len_err + hw_stats->rx_sz_ov +
|
|
- hw_stats->rx_rrd_ov + hw_stats->rx_align_err;
|
|
- net_stats->rx_fifo_errors = hw_stats->rx_rxf_ov;
|
|
- net_stats->rx_length_errors = hw_stats->rx_len_err;
|
|
- net_stats->rx_crc_errors = hw_stats->rx_fcs_err;
|
|
- net_stats->rx_frame_errors = hw_stats->rx_align_err;
|
|
- net_stats->rx_over_errors = hw_stats->rx_rrd_ov + hw_stats->rx_rxf_ov;
|
|
-
|
|
- net_stats->rx_missed_errors = hw_stats->rx_rrd_ov + hw_stats->rx_rxf_ov;
|
|
-
|
|
- net_stats->tx_errors = hw_stats->tx_late_col + hw_stats->tx_abort_col +
|
|
- hw_stats->tx_underrun + hw_stats->tx_trunc;
|
|
- net_stats->tx_fifo_errors = hw_stats->tx_underrun;
|
|
- net_stats->tx_aborted_errors = hw_stats->tx_abort_col;
|
|
- net_stats->tx_window_errors = hw_stats->tx_late_col;
|
|
-
|
|
- return &adapter->net_stats;
|
|
-}
|
|
-
|
|
-static inline void atl1c_clear_phy_int(struct atl1c_adapter *adapter)
|
|
-{
|
|
- u16 phy_data;
|
|
-
|
|
- spin_lock(&adapter->mdio_lock);
|
|
- atl1c_read_phy_reg(&adapter->hw, MII_ISR, &phy_data);
|
|
- spin_unlock(&adapter->mdio_lock);
|
|
-}
|
|
-
|
|
-static bool atl1c_clean_tx_irq(struct atl1c_adapter *adapter,
|
|
- enum atl1c_trans_queue type)
|
|
-{
|
|
- struct atl1c_tpd_ring *tpd_ring = (struct atl1c_tpd_ring *)
|
|
- &adapter->tpd_ring[type];
|
|
- struct atl1c_buffer *buffer_info;
|
|
- u16 next_to_clean = atomic_read(&tpd_ring->next_to_clean);
|
|
- u16 hw_next_to_clean;
|
|
- u16 shift;
|
|
- u32 data;
|
|
-
|
|
- if (type == atl1c_trans_high)
|
|
- shift = MB_HTPD_CONS_IDX_SHIFT;
|
|
- else
|
|
- shift = MB_NTPD_CONS_IDX_SHIFT;
|
|
-
|
|
- AT_READ_REG(&adapter->hw, REG_MB_PRIO_CONS_IDX, &data);
|
|
- hw_next_to_clean = (data >> shift) & MB_PRIO_PROD_IDX_MASK;
|
|
-
|
|
- while (next_to_clean != hw_next_to_clean) {
|
|
- buffer_info = &tpd_ring->buffer_info[next_to_clean];
|
|
- if (buffer_info->state == ATL1_BUFFER_BUSY) {
|
|
- pci_unmap_page(adapter->pdev, buffer_info->dma,
|
|
- buffer_info->length, PCI_DMA_TODEVICE);
|
|
- buffer_info->dma = 0;
|
|
- if (buffer_info->skb) {
|
|
- dev_kfree_skb_irq(buffer_info->skb);
|
|
- buffer_info->skb = NULL;
|
|
- }
|
|
- buffer_info->state = ATL1_BUFFER_FREE;
|
|
- }
|
|
- if (++next_to_clean == tpd_ring->count)
|
|
- next_to_clean = 0;
|
|
- atomic_set(&tpd_ring->next_to_clean, next_to_clean);
|
|
- }
|
|
-
|
|
- if (netif_queue_stopped(adapter->netdev) &&
|
|
- netif_carrier_ok(adapter->netdev)) {
|
|
- netif_wake_queue(adapter->netdev);
|
|
- }
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_intr - Interrupt Handler
|
|
- * @irq: interrupt number
|
|
- * @data: pointer to a network interface device structure
|
|
- * @pt_regs: CPU registers structure
|
|
- */
|
|
-static irqreturn_t atl1c_intr(int irq, void *data)
|
|
-{
|
|
- struct net_device *netdev = data;
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- int max_ints = AT_MAX_INT_WORK;
|
|
- int handled = IRQ_NONE;
|
|
- u32 status;
|
|
- u32 reg_data;
|
|
-
|
|
- do {
|
|
- AT_READ_REG(hw, REG_ISR, ®_data);
|
|
- status = reg_data & hw->intr_mask;
|
|
-
|
|
- if (status == 0 || (status & ISR_DIS_INT) != 0) {
|
|
- if (max_ints != AT_MAX_INT_WORK)
|
|
- handled = IRQ_HANDLED;
|
|
- break;
|
|
- }
|
|
- /* link event */
|
|
- if (status & ISR_GPHY)
|
|
- atl1c_clear_phy_int(adapter);
|
|
- /* Ack ISR */
|
|
- AT_WRITE_REG(hw, REG_ISR, status | ISR_DIS_INT);
|
|
- if (status & ISR_RX_PKT) {
|
|
- if (likely(napi_schedule_prep(&adapter->napi))) {
|
|
- hw->intr_mask &= ~ISR_RX_PKT;
|
|
- AT_WRITE_REG(hw, REG_IMR, hw->intr_mask);
|
|
- __napi_schedule(&adapter->napi);
|
|
- }
|
|
- }
|
|
- if (status & ISR_TX_PKT)
|
|
- atl1c_clean_tx_irq(adapter, atl1c_trans_normal);
|
|
-
|
|
- handled = IRQ_HANDLED;
|
|
- /* check if PCIE PHY Link down */
|
|
- if (status & ISR_ERROR) {
|
|
- if (netif_msg_hw(adapter))
|
|
- dev_err(&pdev->dev,
|
|
- "atl1c hardware error (status = 0x%x)\n",
|
|
- status & ISR_ERROR);
|
|
- /* reset MAC */
|
|
- hw->intr_mask &= ~ISR_ERROR;
|
|
- AT_WRITE_REG(hw, REG_IMR, hw->intr_mask);
|
|
- schedule_work(&adapter->reset_task);
|
|
- break;
|
|
- }
|
|
-
|
|
- if (status & ISR_OVER)
|
|
- if (netif_msg_intr(adapter))
|
|
- dev_warn(&pdev->dev,
|
|
- "TX/RX over flow (status = 0x%x)\n",
|
|
- status & ISR_OVER);
|
|
-
|
|
- /* link event */
|
|
- if (status & (ISR_GPHY | ISR_MANUAL)) {
|
|
- adapter->net_stats.tx_carrier_errors++;
|
|
- atl1c_link_chg_event(adapter);
|
|
- break;
|
|
- }
|
|
-
|
|
- } while (--max_ints > 0);
|
|
- /* re-enable Interrupt*/
|
|
- AT_WRITE_REG(&adapter->hw, REG_ISR, 0);
|
|
- return handled;
|
|
-}
|
|
-
|
|
-static inline void atl1c_rx_checksum(struct atl1c_adapter *adapter,
|
|
- struct sk_buff *skb, struct atl1c_recv_ret_status *prrs)
|
|
-{
|
|
- /*
|
|
- * The pid field in RRS in not correct sometimes, so we
|
|
- * cannot figure out if the packet is fragmented or not,
|
|
- * so we tell the KERNEL CHECKSUM_NONE
|
|
- */
|
|
- skb->ip_summed = CHECKSUM_NONE;
|
|
-}
|
|
-
|
|
-static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter, const int ringid)
|
|
-{
|
|
- struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring[ringid];
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- struct atl1c_buffer *buffer_info, *next_info;
|
|
- struct sk_buff *skb;
|
|
- void *vir_addr = NULL;
|
|
- u16 num_alloc = 0;
|
|
- u16 rfd_next_to_use, next_next;
|
|
- struct atl1c_rx_free_desc *rfd_desc;
|
|
-
|
|
- next_next = rfd_next_to_use = rfd_ring->next_to_use;
|
|
- if (++next_next == rfd_ring->count)
|
|
- next_next = 0;
|
|
- buffer_info = &rfd_ring->buffer_info[rfd_next_to_use];
|
|
- next_info = &rfd_ring->buffer_info[next_next];
|
|
-
|
|
- while (next_info->state == ATL1_BUFFER_FREE) {
|
|
- rfd_desc = ATL1C_RFD_DESC(rfd_ring, rfd_next_to_use);
|
|
-
|
|
- skb = dev_alloc_skb(adapter->rx_buffer_len);
|
|
- if (unlikely(!skb)) {
|
|
- if (netif_msg_rx_err(adapter))
|
|
- dev_warn(&pdev->dev, "alloc rx buffer failed\n");
|
|
- break;
|
|
- }
|
|
-
|
|
- /*
|
|
- * Make buffer alignment 2 beyond a 16 byte boundary
|
|
- * this will result in a 16 byte aligned IP header after
|
|
- * the 14 byte MAC header is removed
|
|
- */
|
|
- vir_addr = skb->data;
|
|
- buffer_info->state = ATL1_BUFFER_BUSY;
|
|
- buffer_info->skb = skb;
|
|
- buffer_info->length = adapter->rx_buffer_len;
|
|
- buffer_info->dma = pci_map_single(pdev, vir_addr,
|
|
- buffer_info->length,
|
|
- PCI_DMA_FROMDEVICE);
|
|
- rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
|
|
- rfd_next_to_use = next_next;
|
|
- if (++next_next == rfd_ring->count)
|
|
- next_next = 0;
|
|
- buffer_info = &rfd_ring->buffer_info[rfd_next_to_use];
|
|
- next_info = &rfd_ring->buffer_info[next_next];
|
|
- num_alloc++;
|
|
- }
|
|
-
|
|
- if (num_alloc) {
|
|
- /* TODO: update mailbox here */
|
|
- wmb();
|
|
- rfd_ring->next_to_use = rfd_next_to_use;
|
|
- AT_WRITE_REG(&adapter->hw, atl1c_rfd_prod_idx_regs[ringid],
|
|
- rfd_ring->next_to_use & MB_RFDX_PROD_IDX_MASK);
|
|
- }
|
|
-
|
|
- return num_alloc;
|
|
-}
|
|
-
|
|
-static void atl1c_clean_rrd(struct atl1c_rrd_ring *rrd_ring,
|
|
- struct atl1c_recv_ret_status *rrs, u16 num)
|
|
-{
|
|
- u16 i;
|
|
- /* the relationship between rrd and rfd is one map one */
|
|
- for (i = 0; i < num; i++, rrs = ATL1C_RRD_DESC(rrd_ring,
|
|
- rrd_ring->next_to_clean)) {
|
|
- rrs->word3 &= ~RRS_RXD_UPDATED;
|
|
- if (++rrd_ring->next_to_clean == rrd_ring->count)
|
|
- rrd_ring->next_to_clean = 0;
|
|
- }
|
|
-}
|
|
-
|
|
-static void atl1c_clean_rfd(struct atl1c_rfd_ring *rfd_ring,
|
|
- struct atl1c_recv_ret_status *rrs, u16 num)
|
|
-{
|
|
- u16 i;
|
|
- u16 rfd_index;
|
|
- struct atl1c_buffer *buffer_info = rfd_ring->buffer_info;
|
|
-
|
|
- rfd_index = (rrs->word0 >> RRS_RX_RFD_INDEX_SHIFT) &
|
|
- RRS_RX_RFD_INDEX_MASK;
|
|
- for (i = 0; i < num; i++) {
|
|
- buffer_info[rfd_index].skb = NULL;
|
|
- buffer_info[rfd_index].state = ATL1_BUFFER_FREE;
|
|
- if (++rfd_index == rfd_ring->count)
|
|
- rfd_index = 0;
|
|
- }
|
|
- rfd_ring->next_to_clean = rfd_index;
|
|
-}
|
|
-
|
|
-static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter, u8 que,
|
|
- int *work_done, int work_to_do)
|
|
-{
|
|
- u16 rfd_num, rfd_index;
|
|
- u16 count = 0;
|
|
- u16 length;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring[que];
|
|
- struct atl1c_rrd_ring *rrd_ring = &adapter->rrd_ring[que];
|
|
- struct sk_buff *skb;
|
|
- struct atl1c_recv_ret_status *rrs;
|
|
- struct atl1c_buffer *buffer_info;
|
|
-
|
|
- while (1) {
|
|
- if (*work_done >= work_to_do)
|
|
- break;
|
|
- rrs = ATL1C_RRD_DESC(rrd_ring, rrd_ring->next_to_clean);
|
|
- if (likely(RRS_RXD_IS_VALID(rrs->word3))) {
|
|
- rfd_num = (rrs->word0 >> RRS_RX_RFD_CNT_SHIFT) &
|
|
- RRS_RX_RFD_CNT_MASK;
|
|
- if (unlikely(rfd_num) != 1)
|
|
- /* TODO support mul rfd*/
|
|
- if (netif_msg_rx_err(adapter))
|
|
- dev_warn(&pdev->dev,
|
|
- "Multi rfd not support yet!\n");
|
|
- goto rrs_checked;
|
|
- } else {
|
|
- break;
|
|
- }
|
|
-rrs_checked:
|
|
- atl1c_clean_rrd(rrd_ring, rrs, rfd_num);
|
|
- if (rrs->word3 & (RRS_RX_ERR_SUM | RRS_802_3_LEN_ERR)) {
|
|
- atl1c_clean_rfd(rfd_ring, rrs, rfd_num);
|
|
- if (netif_msg_rx_err(adapter))
|
|
- dev_warn(&pdev->dev,
|
|
- "wrong packet! rrs word3 is %x\n",
|
|
- rrs->word3);
|
|
- continue;
|
|
- }
|
|
-
|
|
- length = le16_to_cpu((rrs->word3 >> RRS_PKT_SIZE_SHIFT) &
|
|
- RRS_PKT_SIZE_MASK);
|
|
- /* Good Receive */
|
|
- if (likely(rfd_num == 1)) {
|
|
- rfd_index = (rrs->word0 >> RRS_RX_RFD_INDEX_SHIFT) &
|
|
- RRS_RX_RFD_INDEX_MASK;
|
|
- buffer_info = &rfd_ring->buffer_info[rfd_index];
|
|
- pci_unmap_single(pdev, buffer_info->dma,
|
|
- buffer_info->length, PCI_DMA_FROMDEVICE);
|
|
- skb = buffer_info->skb;
|
|
- } else {
|
|
- /* TODO */
|
|
- if (netif_msg_rx_err(adapter))
|
|
- dev_warn(&pdev->dev,
|
|
- "Multi rfd not support yet!\n");
|
|
- break;
|
|
- }
|
|
- atl1c_clean_rfd(rfd_ring, rrs, rfd_num);
|
|
- skb_put(skb, length - ETH_FCS_LEN);
|
|
- skb->protocol = eth_type_trans(skb, netdev);
|
|
- skb->dev = netdev;
|
|
- atl1c_rx_checksum(adapter, skb, rrs);
|
|
- if (unlikely(adapter->vlgrp) && rrs->word3 & RRS_VLAN_INS) {
|
|
- u16 vlan;
|
|
-
|
|
- AT_TAG_TO_VLAN(rrs->vlan_tag, vlan);
|
|
- vlan = le16_to_cpu(vlan);
|
|
- vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vlan);
|
|
- } else
|
|
- netif_receive_skb(skb);
|
|
-
|
|
- netdev->last_rx = jiffies;
|
|
- (*work_done)++;
|
|
- count++;
|
|
- }
|
|
- if (count)
|
|
- atl1c_alloc_rx_buffer(adapter, que);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_clean - NAPI Rx polling callback
|
|
- * @adapter: board private structure
|
|
- */
|
|
-static int atl1c_clean(struct napi_struct *napi, int budget)
|
|
-{
|
|
- struct atl1c_adapter *adapter =
|
|
- container_of(napi, struct atl1c_adapter, napi);
|
|
- int work_done = 0;
|
|
-
|
|
- /* Keep link state information with original netdev */
|
|
- if (!netif_carrier_ok(adapter->netdev))
|
|
- goto quit_polling;
|
|
- /* just enable one RXQ */
|
|
- atl1c_clean_rx_irq(adapter, 0, &work_done, budget);
|
|
-
|
|
- if (work_done < budget) {
|
|
-quit_polling:
|
|
- napi_complete(napi);
|
|
- adapter->hw.intr_mask |= ISR_RX_PKT;
|
|
- AT_WRITE_REG(&adapter->hw, REG_IMR, adapter->hw.intr_mask);
|
|
- }
|
|
- return work_done;
|
|
-}
|
|
-
|
|
-#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
-
|
|
-/*
|
|
- * Polling 'interrupt' - used by things like netconsole to send skbs
|
|
- * without having to re-enable interrupts. It's not called while
|
|
- * the interrupt routine is executing.
|
|
- */
|
|
-static void atl1c_netpoll(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- disable_irq(adapter->pdev->irq);
|
|
- atl1c_intr(adapter->pdev->irq, netdev);
|
|
- enable_irq(adapter->pdev->irq);
|
|
-}
|
|
-#endif
|
|
-
|
|
-static inline u16 atl1c_tpd_avail(struct atl1c_adapter *adapter, enum atl1c_trans_queue type)
|
|
-{
|
|
- struct atl1c_tpd_ring *tpd_ring = &adapter->tpd_ring[type];
|
|
- u16 next_to_use = 0;
|
|
- u16 next_to_clean = 0;
|
|
-
|
|
- next_to_clean = atomic_read(&tpd_ring->next_to_clean);
|
|
- next_to_use = tpd_ring->next_to_use;
|
|
-
|
|
- return (u16)(next_to_clean > next_to_use) ?
|
|
- (next_to_clean - next_to_use - 1) :
|
|
- (tpd_ring->count + next_to_clean - next_to_use - 1);
|
|
-}
|
|
-
|
|
-/*
|
|
- * get next usable tpd
|
|
- * Note: should call atl1c_tdp_avail to make sure
|
|
- * there is enough tpd to use
|
|
- */
|
|
-static struct atl1c_tpd_desc *atl1c_get_tpd(struct atl1c_adapter *adapter,
|
|
- enum atl1c_trans_queue type)
|
|
-{
|
|
- struct atl1c_tpd_ring *tpd_ring = &adapter->tpd_ring[type];
|
|
- struct atl1c_tpd_desc *tpd_desc;
|
|
- u16 next_to_use = 0;
|
|
-
|
|
- next_to_use = tpd_ring->next_to_use;
|
|
- if (++tpd_ring->next_to_use == tpd_ring->count)
|
|
- tpd_ring->next_to_use = 0;
|
|
- tpd_desc = ATL1C_TPD_DESC(tpd_ring, next_to_use);
|
|
- memset(tpd_desc, 0, sizeof(struct atl1c_tpd_desc));
|
|
- return tpd_desc;
|
|
-}
|
|
-
|
|
-static struct atl1c_buffer *
|
|
-atl1c_get_tx_buffer(struct atl1c_adapter *adapter, struct atl1c_tpd_desc *tpd)
|
|
-{
|
|
- struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
|
|
-
|
|
- return &tpd_ring->buffer_info[tpd -
|
|
- (struct atl1c_tpd_desc *)tpd_ring->desc];
|
|
-}
|
|
-
|
|
-/* Calculate the transmit packet descript needed*/
|
|
-static u16 atl1c_cal_tpd_req(const struct sk_buff *skb)
|
|
-{
|
|
- u16 tpd_req;
|
|
- u16 proto_hdr_len = 0;
|
|
-
|
|
- tpd_req = skb_shinfo(skb)->nr_frags + 1;
|
|
-
|
|
- if (skb_is_gso(skb)) {
|
|
- proto_hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
|
|
- if (proto_hdr_len < skb_headlen(skb))
|
|
- tpd_req++;
|
|
- if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
|
|
- tpd_req++;
|
|
- }
|
|
- return tpd_req;
|
|
-}
|
|
-
|
|
-static int atl1c_tso_csum(struct atl1c_adapter *adapter,
|
|
- struct sk_buff *skb,
|
|
- struct atl1c_tpd_desc **tpd,
|
|
- enum atl1c_trans_queue type)
|
|
-{
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- u8 hdr_len;
|
|
- u32 real_len;
|
|
- unsigned short offload_type;
|
|
- int err;
|
|
-
|
|
- if (skb_is_gso(skb)) {
|
|
- if (skb_header_cloned(skb)) {
|
|
- err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
|
|
- if (unlikely(err))
|
|
- return -1;
|
|
- }
|
|
- offload_type = skb_shinfo(skb)->gso_type;
|
|
-
|
|
- if (offload_type & SKB_GSO_TCPV4) {
|
|
- real_len = (((unsigned char *)ip_hdr(skb) - skb->data)
|
|
- + ntohs(ip_hdr(skb)->tot_len));
|
|
-
|
|
- if (real_len < skb->len)
|
|
- pskb_trim(skb, real_len);
|
|
-
|
|
- hdr_len = (skb_transport_offset(skb) + tcp_hdrlen(skb));
|
|
- if (unlikely(skb->len == hdr_len)) {
|
|
- /* only xsum need */
|
|
- if (netif_msg_tx_queued(adapter))
|
|
- dev_warn(&pdev->dev,
|
|
- "IPV4 tso with zero data??\n");
|
|
- goto check_sum;
|
|
- } else {
|
|
- ip_hdr(skb)->check = 0;
|
|
- tcp_hdr(skb)->check = ~csum_tcpudp_magic(
|
|
- ip_hdr(skb)->saddr,
|
|
- ip_hdr(skb)->daddr,
|
|
- 0, IPPROTO_TCP, 0);
|
|
- (*tpd)->word1 |= 1 << TPD_IPV4_PACKET_SHIFT;
|
|
- }
|
|
- }
|
|
-
|
|
- if (offload_type & SKB_GSO_TCPV6) {
|
|
- struct atl1c_tpd_ext_desc *etpd =
|
|
- *(struct atl1c_tpd_ext_desc **)(tpd);
|
|
-
|
|
- memset(etpd, 0, sizeof(struct atl1c_tpd_ext_desc));
|
|
- *tpd = atl1c_get_tpd(adapter, type);
|
|
- ipv6_hdr(skb)->payload_len = 0;
|
|
- /* check payload == 0 byte ? */
|
|
- hdr_len = (skb_transport_offset(skb) + tcp_hdrlen(skb));
|
|
- if (unlikely(skb->len == hdr_len)) {
|
|
- /* only xsum need */
|
|
- if (netif_msg_tx_queued(adapter))
|
|
- dev_warn(&pdev->dev,
|
|
- "IPV6 tso with zero data??\n");
|
|
- goto check_sum;
|
|
- } else
|
|
- tcp_hdr(skb)->check = ~csum_ipv6_magic(
|
|
- &ipv6_hdr(skb)->saddr,
|
|
- &ipv6_hdr(skb)->daddr,
|
|
- 0, IPPROTO_TCP, 0);
|
|
- etpd->word1 |= 1 << TPD_LSO_EN_SHIFT;
|
|
- etpd->word1 |= 1 << TPD_LSO_VER_SHIFT;
|
|
- etpd->pkt_len = cpu_to_le32(skb->len);
|
|
- (*tpd)->word1 |= 1 << TPD_LSO_VER_SHIFT;
|
|
- }
|
|
-
|
|
- (*tpd)->word1 |= 1 << TPD_LSO_EN_SHIFT;
|
|
- (*tpd)->word1 |= (skb_transport_offset(skb) & TPD_TCPHDR_OFFSET_MASK) <<
|
|
- TPD_TCPHDR_OFFSET_SHIFT;
|
|
- (*tpd)->word1 |= (skb_shinfo(skb)->gso_size & TPD_MSS_MASK) <<
|
|
- TPD_MSS_SHIFT;
|
|
- return 0;
|
|
- }
|
|
-
|
|
-check_sum:
|
|
- if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
|
|
- u8 css, cso;
|
|
- cso = skb_transport_offset(skb);
|
|
-
|
|
- if (unlikely(cso & 0x1)) {
|
|
- if (netif_msg_tx_err(adapter))
|
|
- dev_err(&adapter->pdev->dev,
|
|
- "payload offset should not an event number\n");
|
|
- return -1;
|
|
- } else {
|
|
- css = cso + skb->csum_offset;
|
|
-
|
|
- (*tpd)->word1 |= ((cso >> 1) & TPD_PLOADOFFSET_MASK) <<
|
|
- TPD_PLOADOFFSET_SHIFT;
|
|
- (*tpd)->word1 |= ((css >> 1) & TPD_CCSUM_OFFSET_MASK) <<
|
|
- TPD_CCSUM_OFFSET_SHIFT;
|
|
- (*tpd)->word1 |= 1 << TPD_CCSUM_EN_SHIFT;
|
|
- }
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
|
- struct sk_buff *skb, struct atl1c_tpd_desc *tpd,
|
|
- enum atl1c_trans_queue type)
|
|
-{
|
|
- struct atl1c_tpd_desc *use_tpd = NULL;
|
|
- struct atl1c_buffer *buffer_info = NULL;
|
|
- u16 buf_len = skb_headlen(skb);
|
|
- u16 map_len = 0;
|
|
- u16 mapped_len = 0;
|
|
- u16 hdr_len = 0;
|
|
- u16 nr_frags;
|
|
- u16 f;
|
|
- int tso;
|
|
-
|
|
- nr_frags = skb_shinfo(skb)->nr_frags;
|
|
- tso = (tpd->word1 >> TPD_LSO_EN_SHIFT) & TPD_LSO_EN_MASK;
|
|
- if (tso) {
|
|
- /* TSO */
|
|
- map_len = hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
|
|
- use_tpd = tpd;
|
|
-
|
|
- buffer_info = atl1c_get_tx_buffer(adapter, use_tpd);
|
|
- buffer_info->length = map_len;
|
|
- buffer_info->dma = pci_map_single(adapter->pdev,
|
|
- skb->data, hdr_len, PCI_DMA_TODEVICE);
|
|
- buffer_info->state = ATL1_BUFFER_BUSY;
|
|
- mapped_len += map_len;
|
|
- use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
|
- use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
|
- }
|
|
-
|
|
- if (mapped_len < buf_len) {
|
|
- /* mapped_len == 0, means we should use the first tpd,
|
|
- which is given by caller */
|
|
- if (mapped_len == 0)
|
|
- use_tpd = tpd;
|
|
- else {
|
|
- use_tpd = atl1c_get_tpd(adapter, type);
|
|
- memcpy(use_tpd, tpd, sizeof(struct atl1c_tpd_desc));
|
|
- use_tpd = atl1c_get_tpd(adapter, type);
|
|
- memcpy(use_tpd, tpd, sizeof(struct atl1c_tpd_desc));
|
|
- }
|
|
- buffer_info = atl1c_get_tx_buffer(adapter, use_tpd);
|
|
- buffer_info->length = buf_len - mapped_len;
|
|
- buffer_info->dma =
|
|
- pci_map_single(adapter->pdev, skb->data + mapped_len,
|
|
- buffer_info->length, PCI_DMA_TODEVICE);
|
|
- buffer_info->state = ATL1_BUFFER_BUSY;
|
|
-
|
|
- use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
|
- use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
|
- }
|
|
-
|
|
- for (f = 0; f < nr_frags; f++) {
|
|
- struct skb_frag_struct *frag;
|
|
-
|
|
- frag = &skb_shinfo(skb)->frags[f];
|
|
-
|
|
- use_tpd = atl1c_get_tpd(adapter, type);
|
|
- memcpy(use_tpd, tpd, sizeof(struct atl1c_tpd_desc));
|
|
-
|
|
- buffer_info = atl1c_get_tx_buffer(adapter, use_tpd);
|
|
- buffer_info->length = frag->size;
|
|
- buffer_info->dma =
|
|
- pci_map_page(adapter->pdev, frag->page,
|
|
- frag->page_offset,
|
|
- buffer_info->length,
|
|
- PCI_DMA_TODEVICE);
|
|
- buffer_info->state = ATL1_BUFFER_BUSY;
|
|
-
|
|
- use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
|
|
- use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
|
|
- }
|
|
-
|
|
- /* The last tpd */
|
|
- use_tpd->word1 |= 1 << TPD_EOP_SHIFT;
|
|
- /* The last buffer info contain the skb address,
|
|
- so it will be free after unmap */
|
|
- buffer_info->skb = skb;
|
|
-}
|
|
-
|
|
-static void atl1c_tx_queue(struct atl1c_adapter *adapter, struct sk_buff *skb,
|
|
- struct atl1c_tpd_desc *tpd, enum atl1c_trans_queue type)
|
|
-{
|
|
- struct atl1c_tpd_ring *tpd_ring = &adapter->tpd_ring[type];
|
|
- u32 prod_data;
|
|
-
|
|
- AT_READ_REG(&adapter->hw, REG_MB_PRIO_PROD_IDX, &prod_data);
|
|
- switch (type) {
|
|
- case atl1c_trans_high:
|
|
- prod_data &= 0xFFFF0000;
|
|
- prod_data |= tpd_ring->next_to_use & 0xFFFF;
|
|
- break;
|
|
- case atl1c_trans_normal:
|
|
- prod_data &= 0x0000FFFF;
|
|
- prod_data |= (tpd_ring->next_to_use & 0xFFFF) << 16;
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
- wmb();
|
|
- AT_WRITE_REG(&adapter->hw, REG_MB_PRIO_PROD_IDX, prod_data);
|
|
-}
|
|
-
|
|
-static int atl1c_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- unsigned long flags;
|
|
- u16 tpd_req = 1;
|
|
- struct atl1c_tpd_desc *tpd;
|
|
- enum atl1c_trans_queue type = atl1c_trans_normal;
|
|
-
|
|
- if (test_bit(__AT_DOWN, &adapter->flags)) {
|
|
- dev_kfree_skb_any(skb);
|
|
- return NETDEV_TX_OK;
|
|
- }
|
|
-
|
|
- tpd_req = atl1c_cal_tpd_req(skb);
|
|
- if (!spin_trylock_irqsave(&adapter->tx_lock, flags)) {
|
|
- if (netif_msg_pktdata(adapter))
|
|
- dev_info(&adapter->pdev->dev, "tx locked\n");
|
|
- return NETDEV_TX_LOCKED;
|
|
- }
|
|
- if (skb->mark == 0x01)
|
|
- type = atl1c_trans_high;
|
|
- else
|
|
- type = atl1c_trans_normal;
|
|
-
|
|
- if (atl1c_tpd_avail(adapter, type) < tpd_req) {
|
|
- /* no enough descriptor, just stop queue */
|
|
- netif_stop_queue(netdev);
|
|
- spin_unlock_irqrestore(&adapter->tx_lock, flags);
|
|
- return NETDEV_TX_BUSY;
|
|
- }
|
|
-
|
|
- tpd = atl1c_get_tpd(adapter, type);
|
|
-
|
|
- /* do TSO and check sum */
|
|
- if (atl1c_tso_csum(adapter, skb, &tpd, type) != 0) {
|
|
- spin_unlock_irqrestore(&adapter->tx_lock, flags);
|
|
- dev_kfree_skb_any(skb);
|
|
- return NETDEV_TX_OK;
|
|
- }
|
|
-
|
|
- if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
|
|
- u16 vlan = vlan_tx_tag_get(skb);
|
|
- __le16 tag;
|
|
-
|
|
- vlan = cpu_to_le16(vlan);
|
|
- AT_VLAN_TO_TAG(vlan, tag);
|
|
- tpd->word1 |= 1 << TPD_INS_VTAG_SHIFT;
|
|
- tpd->vlan_tag = tag;
|
|
- }
|
|
-
|
|
- if (skb_network_offset(skb) != ETH_HLEN)
|
|
- tpd->word1 |= 1 << TPD_ETH_TYPE_SHIFT; /* Ethernet frame */
|
|
-
|
|
- atl1c_tx_map(adapter, skb, tpd, type);
|
|
- atl1c_tx_queue(adapter, skb, tpd, type);
|
|
-
|
|
- netdev->trans_start = jiffies;
|
|
- spin_unlock_irqrestore(&adapter->tx_lock, flags);
|
|
- return NETDEV_TX_OK;
|
|
-}
|
|
-
|
|
-static void atl1c_free_irq(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct net_device *netdev = adapter->netdev;
|
|
-
|
|
- free_irq(adapter->pdev->irq, netdev);
|
|
-
|
|
- if (adapter->have_msi)
|
|
- pci_disable_msi(adapter->pdev);
|
|
-}
|
|
-
|
|
-static int atl1c_request_irq(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- int flags = 0;
|
|
- int err = 0;
|
|
-
|
|
- adapter->have_msi = true;
|
|
- err = pci_enable_msi(adapter->pdev);
|
|
- if (err) {
|
|
- if (netif_msg_ifup(adapter))
|
|
- dev_err(&pdev->dev,
|
|
- "Unable to allocate MSI interrupt Error: %d\n",
|
|
- err);
|
|
- adapter->have_msi = false;
|
|
- } else
|
|
- netdev->irq = pdev->irq;
|
|
-
|
|
- if (!adapter->have_msi)
|
|
- flags |= IRQF_SHARED;
|
|
- err = request_irq(adapter->pdev->irq, &atl1c_intr, flags,
|
|
- netdev->name, netdev);
|
|
- if (err) {
|
|
- if (netif_msg_ifup(adapter))
|
|
- dev_err(&pdev->dev,
|
|
- "Unable to allocate interrupt Error: %d\n",
|
|
- err);
|
|
- if (adapter->have_msi)
|
|
- pci_disable_msi(adapter->pdev);
|
|
- return err;
|
|
- }
|
|
- if (netif_msg_ifup(adapter))
|
|
- dev_dbg(&pdev->dev, "atl1c_request_irq OK\n");
|
|
- return err;
|
|
-}
|
|
-
|
|
-int atl1c_up(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- int num;
|
|
- int err;
|
|
- int i;
|
|
-
|
|
- netif_carrier_off(netdev);
|
|
- atl1c_init_ring_ptrs(adapter);
|
|
- atl1c_set_multi(netdev);
|
|
- atl1c_restore_vlan(adapter);
|
|
-
|
|
- for (i = 0; i < adapter->num_rx_queues; i++) {
|
|
- num = atl1c_alloc_rx_buffer(adapter, i);
|
|
- if (unlikely(num == 0)) {
|
|
- err = -ENOMEM;
|
|
- goto err_alloc_rx;
|
|
- }
|
|
- }
|
|
-
|
|
- if (atl1c_configure(adapter)) {
|
|
- err = -EIO;
|
|
- goto err_up;
|
|
- }
|
|
-
|
|
- err = atl1c_request_irq(adapter);
|
|
- if (unlikely(err))
|
|
- goto err_up;
|
|
-
|
|
- clear_bit(__AT_DOWN, &adapter->flags);
|
|
- napi_enable(&adapter->napi);
|
|
- atl1c_irq_enable(adapter);
|
|
- atl1c_check_link_status(adapter);
|
|
- netif_start_queue(netdev);
|
|
- return err;
|
|
-
|
|
-err_up:
|
|
-err_alloc_rx:
|
|
- atl1c_clean_rx_ring(adapter);
|
|
- return err;
|
|
-}
|
|
-
|
|
-void atl1c_down(struct atl1c_adapter *adapter)
|
|
-{
|
|
- struct net_device *netdev = adapter->netdev;
|
|
-
|
|
- atl1c_del_timer(adapter);
|
|
- atl1c_cancel_work(adapter);
|
|
-
|
|
- /* signal that we're down so the interrupt handler does not
|
|
- * reschedule our watchdog timer */
|
|
- set_bit(__AT_DOWN, &adapter->flags);
|
|
- netif_carrier_off(netdev);
|
|
- napi_disable(&adapter->napi);
|
|
- atl1c_irq_disable(adapter);
|
|
- atl1c_free_irq(adapter);
|
|
- AT_WRITE_REG(&adapter->hw, REG_ISR, ISR_DIS_INT);
|
|
- /* reset MAC to disable all RX/TX */
|
|
- atl1c_reset_mac(&adapter->hw);
|
|
- msleep(1);
|
|
-
|
|
- adapter->link_speed = SPEED_0;
|
|
- adapter->link_duplex = -1;
|
|
- atl1c_clean_tx_ring(adapter, atl1c_trans_normal);
|
|
- atl1c_clean_tx_ring(adapter, atl1c_trans_high);
|
|
- atl1c_clean_rx_ring(adapter);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_open - Called when a network interface is made active
|
|
- * @netdev: network interface device structure
|
|
- *
|
|
- * Returns 0 on success, negative value on failure
|
|
- *
|
|
- * The open entry point is called when a network interface is made
|
|
- * active by the system (IFF_UP). At this point all resources needed
|
|
- * for transmit and receive operations are allocated, the interrupt
|
|
- * handler is registered with the OS, the watchdog timer is started,
|
|
- * and the stack is notified that the interface is ready.
|
|
- */
|
|
-static int atl1c_open(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- int err;
|
|
-
|
|
- /* disallow open during test */
|
|
- if (test_bit(__AT_TESTING, &adapter->flags))
|
|
- return -EBUSY;
|
|
-
|
|
- /* allocate rx/tx dma buffer & descriptors */
|
|
- err = atl1c_setup_ring_resources(adapter);
|
|
- if (unlikely(err))
|
|
- return err;
|
|
-
|
|
- err = atl1c_up(adapter);
|
|
- if (unlikely(err))
|
|
- goto err_up;
|
|
-
|
|
- if (adapter->hw.ctrl_flags & ATL1C_FPGA_VERSION) {
|
|
- u32 phy_data;
|
|
-
|
|
- AT_READ_REG(&adapter->hw, REG_MDIO_CTRL, &phy_data);
|
|
- phy_data |= MDIO_AP_EN;
|
|
- AT_WRITE_REG(&adapter->hw, REG_MDIO_CTRL, phy_data);
|
|
- }
|
|
- return 0;
|
|
-
|
|
-err_up:
|
|
- atl1c_free_irq(adapter);
|
|
- atl1c_free_ring_resources(adapter);
|
|
- atl1c_reset_mac(&adapter->hw);
|
|
- return err;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_close - Disables a network interface
|
|
- * @netdev: network interface device structure
|
|
- *
|
|
- * Returns 0, this is not allowed to fail
|
|
- *
|
|
- * The close entry point is called when an interface is de-activated
|
|
- * by the OS. The hardware is still under the drivers control, but
|
|
- * needs to be disabled. A global MAC reset is issued to stop the
|
|
- * hardware, and all transmit and receive resources are freed.
|
|
- */
|
|
-static int atl1c_close(struct net_device *netdev)
|
|
-{
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- WARN_ON(test_bit(__AT_RESETTING, &adapter->flags));
|
|
- atl1c_down(adapter);
|
|
- atl1c_free_ring_resources(adapter);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int atl1c_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
-{
|
|
- struct net_device *netdev = pci_get_drvdata(pdev);
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
- struct atl1c_hw *hw = &adapter->hw;
|
|
- u32 ctrl;
|
|
- u32 mac_ctrl_data;
|
|
- u32 master_ctrl_data;
|
|
- u32 wol_ctrl_data;
|
|
- u16 mii_bmsr_data;
|
|
- u16 save_autoneg_advertised;
|
|
- u16 mii_intr_status_data;
|
|
- u32 wufc = adapter->wol;
|
|
- u32 i;
|
|
- int retval = 0;
|
|
-
|
|
- if (netif_running(netdev)) {
|
|
- WARN_ON(test_bit(__AT_RESETTING, &adapter->flags));
|
|
- atl1c_down(adapter);
|
|
- }
|
|
- netif_device_detach(netdev);
|
|
- atl1c_disable_l0s_l1(hw);
|
|
- retval = pci_save_state(pdev);
|
|
- if (retval)
|
|
- return retval;
|
|
- if (wufc) {
|
|
- AT_READ_REG(hw, REG_MASTER_CTRL, &master_ctrl_data);
|
|
- master_ctrl_data &= ~MASTER_CTRL_CLK_SEL_DIS;
|
|
-
|
|
- /* get link status */
|
|
- atl1c_read_phy_reg(hw, MII_BMSR, (u16 *)&mii_bmsr_data);
|
|
- atl1c_read_phy_reg(hw, MII_BMSR, (u16 *)&mii_bmsr_data);
|
|
- save_autoneg_advertised = hw->autoneg_advertised;
|
|
- hw->autoneg_advertised = ADVERTISED_10baseT_Half;
|
|
- if (atl1c_restart_autoneg(hw) != 0)
|
|
- if (netif_msg_link(adapter))
|
|
- dev_warn(&pdev->dev, "phy autoneg failed\n");
|
|
- hw->phy_configured = false; /* re-init PHY when resume */
|
|
- hw->autoneg_advertised = save_autoneg_advertised;
|
|
- /* turn on magic packet wol */
|
|
- if (wufc & AT_WUFC_MAG)
|
|
- wol_ctrl_data = WOL_MAGIC_EN | WOL_MAGIC_PME_EN;
|
|
-
|
|
- if (wufc & AT_WUFC_LNKC) {
|
|
- for (i = 0; i < AT_SUSPEND_LINK_TIMEOUT; i++) {
|
|
- msleep(100);
|
|
- atl1c_read_phy_reg(hw, MII_BMSR,
|
|
- (u16 *)&mii_bmsr_data);
|
|
- if (mii_bmsr_data & BMSR_LSTATUS)
|
|
- break;
|
|
- }
|
|
- if ((mii_bmsr_data & BMSR_LSTATUS) == 0)
|
|
- if (netif_msg_link(adapter))
|
|
- dev_warn(&pdev->dev,
|
|
- "%s: Link may change"
|
|
- "when suspend\n",
|
|
- atl1c_driver_name);
|
|
- wol_ctrl_data |= WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN;
|
|
- /* only link up can wake up */
|
|
- if (atl1c_write_phy_reg(hw, MII_IER, IER_LINK_UP) != 0) {
|
|
- if (netif_msg_link(adapter))
|
|
- dev_err(&pdev->dev,
|
|
- "%s: read write phy "
|
|
- "register failed.\n",
|
|
- atl1c_driver_name);
|
|
- goto wol_dis;
|
|
- }
|
|
- }
|
|
- /* clear phy interrupt */
|
|
- atl1c_read_phy_reg(hw, MII_ISR, &mii_intr_status_data);
|
|
- /* Config MAC Ctrl register */
|
|
- mac_ctrl_data = MAC_CTRL_RX_EN;
|
|
- /* set to 10/100M halt duplex */
|
|
- mac_ctrl_data |= atl1c_mac_speed_10_100 << MAC_CTRL_SPEED_SHIFT;
|
|
- mac_ctrl_data |= (((u32)adapter->hw.preamble_len &
|
|
- MAC_CTRL_PRMLEN_MASK) <<
|
|
- MAC_CTRL_PRMLEN_SHIFT);
|
|
-
|
|
- if (adapter->vlgrp)
|
|
- mac_ctrl_data |= MAC_CTRL_RMV_VLAN;
|
|
-
|
|
- /* magic packet maybe Broadcast&multicast&Unicast frame */
|
|
- if (wufc & AT_WUFC_MAG)
|
|
- mac_ctrl_data |= MAC_CTRL_BC_EN;
|
|
-
|
|
- if (netif_msg_hw(adapter))
|
|
- dev_dbg(&pdev->dev,
|
|
- "%s: suspend MAC=0x%x\n",
|
|
- atl1c_driver_name, mac_ctrl_data);
|
|
- AT_WRITE_REG(hw, REG_MASTER_CTRL, master_ctrl_data);
|
|
- AT_WRITE_REG(hw, REG_WOL_CTRL, wol_ctrl_data);
|
|
- AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
|
|
-
|
|
- /* pcie patch */
|
|
- AT_READ_REG(hw, REG_PCIE_PHYMISC, &ctrl);
|
|
- ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
|
|
- AT_WRITE_REG(hw, REG_PCIE_PHYMISC, ctrl);
|
|
-
|
|
- pci_enable_wake(pdev, pci_choose_state(pdev, state), 1);
|
|
- goto suspend_exit;
|
|
- }
|
|
-wol_dis:
|
|
-
|
|
- /* WOL disabled */
|
|
- AT_WRITE_REG(hw, REG_WOL_CTRL, 0);
|
|
-
|
|
- /* pcie patch */
|
|
- AT_READ_REG(hw, REG_PCIE_PHYMISC, &ctrl);
|
|
- ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
|
|
- AT_WRITE_REG(hw, REG_PCIE_PHYMISC, ctrl);
|
|
-
|
|
- atl1c_phy_disable(hw);
|
|
- hw->phy_configured = false; /* re-init PHY when resume */
|
|
-
|
|
- pci_enable_wake(pdev, pci_choose_state(pdev, state), 0);
|
|
-suspend_exit:
|
|
-
|
|
- pci_disable_device(pdev);
|
|
- pci_set_power_state(pdev, pci_choose_state(pdev, state));
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int atl1c_resume(struct pci_dev *pdev)
|
|
-{
|
|
- struct net_device *netdev = pci_get_drvdata(pdev);
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- pci_set_power_state(pdev, PCI_D0);
|
|
- pci_restore_state(pdev);
|
|
- pci_enable_wake(pdev, PCI_D3hot, 0);
|
|
- pci_enable_wake(pdev, PCI_D3cold, 0);
|
|
-
|
|
- AT_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0);
|
|
-
|
|
- atl1c_phy_reset(&adapter->hw);
|
|
- atl1c_reset_mac(&adapter->hw);
|
|
- netif_device_attach(netdev);
|
|
- if (netif_running(netdev))
|
|
- atl1c_up(adapter);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void atl1c_shutdown(struct pci_dev *pdev)
|
|
-{
|
|
- atl1c_suspend(pdev, PMSG_SUSPEND);
|
|
-}
|
|
-
|
|
-static const struct net_device_ops atl1c_netdev_ops = {
|
|
- .ndo_open = atl1c_open,
|
|
- .ndo_stop = atl1c_close,
|
|
- .ndo_validate_addr = eth_validate_addr,
|
|
- .ndo_start_xmit = atl1c_xmit_frame,
|
|
- .ndo_set_mac_address = atl1c_set_mac_addr,
|
|
- .ndo_set_multicast_list = atl1c_set_multi,
|
|
- .ndo_change_mtu = atl1c_change_mtu,
|
|
- .ndo_do_ioctl = atl1c_ioctl,
|
|
- .ndo_tx_timeout = atl1c_tx_timeout,
|
|
- .ndo_get_stats = atl1c_get_stats,
|
|
- .ndo_vlan_rx_register = atl1c_vlan_rx_register,
|
|
-#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
- .ndo_poll_controller = atl1c_netpoll,
|
|
-#endif
|
|
-};
|
|
-
|
|
-static int atl1c_init_netdev(struct net_device *netdev, struct pci_dev *pdev)
|
|
-{
|
|
- SET_NETDEV_DEV(netdev, &pdev->dev);
|
|
- pci_set_drvdata(pdev, netdev);
|
|
-
|
|
- netdev->irq = pdev->irq;
|
|
- netdev->netdev_ops = &atl1c_netdev_ops;
|
|
- netdev->watchdog_timeo = AT_TX_WATCHDOG;
|
|
- atl1c_set_ethtool_ops(netdev);
|
|
-
|
|
- /* TODO: add when ready */
|
|
- netdev->features = NETIF_F_SG |
|
|
- NETIF_F_HW_CSUM |
|
|
- NETIF_F_HW_VLAN_TX |
|
|
- NETIF_F_HW_VLAN_RX |
|
|
- NETIF_F_TSO |
|
|
- NETIF_F_TSO6;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_probe - Device Initialization Routine
|
|
- * @pdev: PCI device information struct
|
|
- * @ent: entry in atl1c_pci_tbl
|
|
- *
|
|
- * Returns 0 on success, negative on failure
|
|
- *
|
|
- * atl1c_probe initializes an adapter identified by a pci_dev structure.
|
|
- * The OS initialization, configuring of the adapter private structure,
|
|
- * and a hardware reset occur.
|
|
- */
|
|
-static int __devinit atl1c_probe(struct pci_dev *pdev,
|
|
- const struct pci_device_id *ent)
|
|
-{
|
|
- struct net_device *netdev;
|
|
- struct atl1c_adapter *adapter;
|
|
- static int cards_found;
|
|
-
|
|
- int err = 0;
|
|
-
|
|
- /* enable device (incl. PCI PM wakeup and hotplug setup) */
|
|
- err = pci_enable_device_mem(pdev);
|
|
- if (err) {
|
|
- dev_err(&pdev->dev, "cannot enable PCI device\n");
|
|
- return err;
|
|
- }
|
|
-
|
|
- /*
|
|
- * The atl1c chip can DMA to 64-bit addresses, but it uses a single
|
|
- * shared register for the high 32 bits, so only a single, aligned,
|
|
- * 4 GB physical address range can be used at a time.
|
|
- *
|
|
- * Supporting 64-bit DMA on this hardware is more trouble than it's
|
|
- * worth. It is far easier to limit to 32-bit DMA than update
|
|
- * various kernel subsystems to support the mechanics required by a
|
|
- * fixed-high-32-bit system.
|
|
- */
|
|
- if ((pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) ||
|
|
- (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) != 0)) {
|
|
- dev_err(&pdev->dev, "No usable DMA configuration,aborting\n");
|
|
- goto err_dma;
|
|
- }
|
|
-
|
|
- err = pci_request_regions(pdev, atl1c_driver_name);
|
|
- if (err) {
|
|
- dev_err(&pdev->dev, "cannot obtain PCI resources\n");
|
|
- goto err_pci_reg;
|
|
- }
|
|
-
|
|
- pci_set_master(pdev);
|
|
-
|
|
- netdev = alloc_etherdev(sizeof(struct atl1c_adapter));
|
|
- if (netdev == NULL) {
|
|
- err = -ENOMEM;
|
|
- dev_err(&pdev->dev, "etherdev alloc failed\n");
|
|
- goto err_alloc_etherdev;
|
|
- }
|
|
-
|
|
- err = atl1c_init_netdev(netdev, pdev);
|
|
- if (err) {
|
|
- dev_err(&pdev->dev, "init netdevice failed\n");
|
|
- goto err_init_netdev;
|
|
- }
|
|
- adapter = netdev_priv(netdev);
|
|
- adapter->bd_number = cards_found;
|
|
- adapter->netdev = netdev;
|
|
- adapter->pdev = pdev;
|
|
- adapter->hw.adapter = adapter;
|
|
- adapter->msg_enable = netif_msg_init(-1, atl1c_default_msg);
|
|
- adapter->hw.hw_addr = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
|
|
- if (!adapter->hw.hw_addr) {
|
|
- err = -EIO;
|
|
- dev_err(&pdev->dev, "cannot map device registers\n");
|
|
- goto err_ioremap;
|
|
- }
|
|
- netdev->base_addr = (unsigned long)adapter->hw.hw_addr;
|
|
-
|
|
- /* init mii data */
|
|
- adapter->mii.dev = netdev;
|
|
- adapter->mii.mdio_read = atl1c_mdio_read;
|
|
- adapter->mii.mdio_write = atl1c_mdio_write;
|
|
- adapter->mii.phy_id_mask = 0x1f;
|
|
- adapter->mii.reg_num_mask = MDIO_REG_ADDR_MASK;
|
|
- netif_napi_add(netdev, &adapter->napi, atl1c_clean, 64);
|
|
- setup_timer(&adapter->phy_config_timer, atl1c_phy_config,
|
|
- (unsigned long)adapter);
|
|
- /* setup the private structure */
|
|
- err = atl1c_sw_init(adapter);
|
|
- if (err) {
|
|
- dev_err(&pdev->dev, "net device private data init failed\n");
|
|
- goto err_sw_init;
|
|
- }
|
|
- atl1c_reset_pcie(&adapter->hw, ATL1C_PCIE_L0S_L1_DISABLE |
|
|
- ATL1C_PCIE_PHY_RESET);
|
|
-
|
|
- /* Init GPHY as early as possible due to power saving issue */
|
|
- atl1c_phy_reset(&adapter->hw);
|
|
-
|
|
- err = atl1c_reset_mac(&adapter->hw);
|
|
- if (err) {
|
|
- err = -EIO;
|
|
- goto err_reset;
|
|
- }
|
|
-
|
|
- device_init_wakeup(&pdev->dev, 1);
|
|
- /* reset the controller to
|
|
- * put the device in a known good starting state */
|
|
- err = atl1c_phy_init(&adapter->hw);
|
|
- if (err) {
|
|
- err = -EIO;
|
|
- goto err_reset;
|
|
- }
|
|
- if (atl1c_read_mac_addr(&adapter->hw) != 0) {
|
|
- err = -EIO;
|
|
- dev_err(&pdev->dev, "get mac address failed\n");
|
|
- goto err_eeprom;
|
|
- }
|
|
- memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
|
|
- memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);
|
|
- if (netif_msg_probe(adapter))
|
|
- dev_dbg(&pdev->dev,
|
|
- "mac address : %02x-%02x-%02x-%02x-%02x-%02x\n",
|
|
- adapter->hw.mac_addr[0], adapter->hw.mac_addr[1],
|
|
- adapter->hw.mac_addr[2], adapter->hw.mac_addr[3],
|
|
- adapter->hw.mac_addr[4], adapter->hw.mac_addr[5]);
|
|
-
|
|
- atl1c_hw_set_mac_addr(&adapter->hw);
|
|
- INIT_WORK(&adapter->reset_task, atl1c_reset_task);
|
|
- INIT_WORK(&adapter->link_chg_task, atl1c_link_chg_task);
|
|
- err = register_netdev(netdev);
|
|
- if (err) {
|
|
- dev_err(&pdev->dev, "register netdevice failed\n");
|
|
- goto err_register;
|
|
- }
|
|
-
|
|
- if (netif_msg_probe(adapter))
|
|
- dev_info(&pdev->dev, "version %s\n", ATL1C_DRV_VERSION);
|
|
- cards_found++;
|
|
- return 0;
|
|
-
|
|
-err_reset:
|
|
-err_register:
|
|
-err_sw_init:
|
|
-err_eeprom:
|
|
- iounmap(adapter->hw.hw_addr);
|
|
-err_init_netdev:
|
|
-err_ioremap:
|
|
- free_netdev(netdev);
|
|
-err_alloc_etherdev:
|
|
- pci_release_regions(pdev);
|
|
-err_pci_reg:
|
|
-err_dma:
|
|
- pci_disable_device(pdev);
|
|
- return err;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_remove - Device Removal Routine
|
|
- * @pdev: PCI device information struct
|
|
- *
|
|
- * atl1c_remove is called by the PCI subsystem to alert the driver
|
|
- * that it should release a PCI device. The could be caused by a
|
|
- * Hot-Plug event, or because the driver is going to be removed from
|
|
- * memory.
|
|
- */
|
|
-static void __devexit atl1c_remove(struct pci_dev *pdev)
|
|
-{
|
|
- struct net_device *netdev = pci_get_drvdata(pdev);
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- unregister_netdev(netdev);
|
|
- atl1c_phy_disable(&adapter->hw);
|
|
-
|
|
- iounmap(adapter->hw.hw_addr);
|
|
-
|
|
- pci_release_regions(pdev);
|
|
- pci_disable_device(pdev);
|
|
- free_netdev(netdev);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_io_error_detected - called when PCI error is detected
|
|
- * @pdev: Pointer to PCI device
|
|
- * @state: The current pci connection state
|
|
- *
|
|
- * This function is called after a PCI bus error affecting
|
|
- * this device has been detected.
|
|
- */
|
|
-static pci_ers_result_t atl1c_io_error_detected(struct pci_dev *pdev,
|
|
- pci_channel_state_t state)
|
|
-{
|
|
- struct net_device *netdev = pci_get_drvdata(pdev);
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- netif_device_detach(netdev);
|
|
-
|
|
- if (netif_running(netdev))
|
|
- atl1c_down(adapter);
|
|
-
|
|
- pci_disable_device(pdev);
|
|
-
|
|
- /* Request a slot slot reset. */
|
|
- return PCI_ERS_RESULT_NEED_RESET;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_io_slot_reset - called after the pci bus has been reset.
|
|
- * @pdev: Pointer to PCI device
|
|
- *
|
|
- * Restart the card from scratch, as if from a cold-boot. Implementation
|
|
- * resembles the first-half of the e1000_resume routine.
|
|
- */
|
|
-static pci_ers_result_t atl1c_io_slot_reset(struct pci_dev *pdev)
|
|
-{
|
|
- struct net_device *netdev = pci_get_drvdata(pdev);
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- if (pci_enable_device(pdev)) {
|
|
- if (netif_msg_hw(adapter))
|
|
- dev_err(&pdev->dev,
|
|
- "Cannot re-enable PCI device after reset\n");
|
|
- return PCI_ERS_RESULT_DISCONNECT;
|
|
- }
|
|
- pci_set_master(pdev);
|
|
-
|
|
- pci_enable_wake(pdev, PCI_D3hot, 0);
|
|
- pci_enable_wake(pdev, PCI_D3cold, 0);
|
|
-
|
|
- atl1c_reset_mac(&adapter->hw);
|
|
-
|
|
- return PCI_ERS_RESULT_RECOVERED;
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_io_resume - called when traffic can start flowing again.
|
|
- * @pdev: Pointer to PCI device
|
|
- *
|
|
- * This callback is called when the error recovery driver tells us that
|
|
- * its OK to resume normal operation. Implementation resembles the
|
|
- * second-half of the atl1c_resume routine.
|
|
- */
|
|
-static void atl1c_io_resume(struct pci_dev *pdev)
|
|
-{
|
|
- struct net_device *netdev = pci_get_drvdata(pdev);
|
|
- struct atl1c_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- if (netif_running(netdev)) {
|
|
- if (atl1c_up(adapter)) {
|
|
- if (netif_msg_hw(adapter))
|
|
- dev_err(&pdev->dev,
|
|
- "Cannot bring device back up after reset\n");
|
|
- return;
|
|
- }
|
|
- }
|
|
-
|
|
- netif_device_attach(netdev);
|
|
-}
|
|
-
|
|
-static struct pci_error_handlers atl1c_err_handler = {
|
|
- .error_detected = atl1c_io_error_detected,
|
|
- .slot_reset = atl1c_io_slot_reset,
|
|
- .resume = atl1c_io_resume,
|
|
-};
|
|
-
|
|
-static struct pci_driver atl1c_driver = {
|
|
- .name = atl1c_driver_name,
|
|
- .id_table = atl1c_pci_tbl,
|
|
- .probe = atl1c_probe,
|
|
- .remove = __devexit_p(atl1c_remove),
|
|
- /* Power Managment Hooks */
|
|
- .suspend = atl1c_suspend,
|
|
- .resume = atl1c_resume,
|
|
- .shutdown = atl1c_shutdown,
|
|
- .err_handler = &atl1c_err_handler
|
|
-};
|
|
-
|
|
-/*
|
|
- * atl1c_init_module - Driver Registration Routine
|
|
- *
|
|
- * atl1c_init_module is the first routine called when the driver is
|
|
- * loaded. All it does is register with the PCI subsystem.
|
|
- */
|
|
-static int __init atl1c_init_module(void)
|
|
-{
|
|
- return pci_register_driver(&atl1c_driver);
|
|
-}
|
|
-
|
|
-/*
|
|
- * atl1c_exit_module - Driver Exit Cleanup Routine
|
|
- *
|
|
- * atl1c_exit_module is called just before the driver is removed
|
|
- * from memory.
|
|
- */
|
|
-static void __exit atl1c_exit_module(void)
|
|
-{
|
|
- pci_unregister_driver(&atl1c_driver);
|
|
-}
|
|
-
|
|
-module_init(atl1c_init_module);
|
|
-module_exit(atl1c_exit_module);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/atl1c/Makefile linux-2.6.29-rc3.owrt/drivers/net/atl1c/Makefile
|
|
--- linux-2.6.29.owrt/drivers/net/atl1c/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/Makefile 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,2 +0,0 @@
|
|
-obj-$(CONFIG_ATL1C) += atl1c.o
|
|
-atl1c-objs := atl1c_main.o atl1c_hw.o atl1c_ethtool.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/b44.c linux-2.6.29-rc3.owrt/drivers/net/b44.c
|
|
--- linux-2.6.29.owrt/drivers/net/b44.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/b44.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1264,14 +1264,8 @@
|
|
static void b44_chip_reset(struct b44 *bp, int reset_kind)
|
|
{
|
|
struct ssb_device *sdev = bp->sdev;
|
|
- bool was_enabled;
|
|
|
|
- was_enabled = ssb_device_is_enabled(bp->sdev);
|
|
-
|
|
- ssb_device_enable(bp->sdev, 0);
|
|
- ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
|
|
-
|
|
- if (was_enabled) {
|
|
+ if (ssb_device_is_enabled(bp->sdev)) {
|
|
bw32(bp, B44_RCV_LAZY, 0);
|
|
bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
|
|
b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 200, 1);
|
|
@@ -1283,8 +1277,10 @@
|
|
}
|
|
bw32(bp, B44_DMARX_CTRL, 0);
|
|
bp->rx_prod = bp->rx_cons = 0;
|
|
- }
|
|
+ } else
|
|
+ ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
|
|
|
|
+ ssb_device_enable(bp->sdev, 0);
|
|
b44_clear_stats(bp);
|
|
|
|
/*
|
|
@@ -2240,7 +2236,6 @@
|
|
struct net_device *dev = ssb_get_drvdata(sdev);
|
|
|
|
unregister_netdev(dev);
|
|
- ssb_device_disable(sdev, 0);
|
|
ssb_bus_may_powerdown(sdev->bus);
|
|
free_netdev(dev);
|
|
ssb_pcihost_set_power_state(sdev, PCI_D3hot);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/benet/be_cmds.c linux-2.6.29-rc3.owrt/drivers/net/benet/be_cmds.c
|
|
--- linux-2.6.29.owrt/drivers/net/benet/be_cmds.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_cmds.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,861 +0,0 @@
|
|
-/*
|
|
- * Copyright (C) 2005 - 2009 ServerEngines
|
|
- * All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or
|
|
- * modify it under the terms of the GNU General Public License version 2
|
|
- * as published by the Free Software Foundation. The full GNU General
|
|
- * Public License is included in this distribution in the file called COPYING.
|
|
- *
|
|
- * Contact Information:
|
|
- * linux-drivers@serverengines.com
|
|
- *
|
|
- * ServerEngines
|
|
- * 209 N. Fair Oaks Ave
|
|
- * Sunnyvale, CA 94085
|
|
- */
|
|
-
|
|
-#include "be.h"
|
|
-
|
|
-static int be_mbox_db_ready_wait(void __iomem *db)
|
|
-{
|
|
- int cnt = 0, wait = 5;
|
|
- u32 ready;
|
|
-
|
|
- do {
|
|
- ready = ioread32(db) & MPU_MAILBOX_DB_RDY_MASK;
|
|
- if (ready)
|
|
- break;
|
|
-
|
|
- if (cnt > 200000) {
|
|
- printk(KERN_WARNING DRV_NAME
|
|
- ": mbox_db poll timed out\n");
|
|
- return -1;
|
|
- }
|
|
-
|
|
- if (cnt > 50)
|
|
- wait = 200;
|
|
- cnt += wait;
|
|
- udelay(wait);
|
|
- } while (true);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Insert the mailbox address into the doorbell in two steps
|
|
- */
|
|
-static int be_mbox_db_ring(struct be_ctrl_info *ctrl)
|
|
-{
|
|
- int status;
|
|
- u16 compl_status, extd_status;
|
|
- u32 val = 0;
|
|
- void __iomem *db = ctrl->db + MPU_MAILBOX_DB_OFFSET;
|
|
- struct be_dma_mem *mbox_mem = &ctrl->mbox_mem;
|
|
- struct be_mcc_mailbox *mbox = mbox_mem->va;
|
|
- struct be_mcc_cq_entry *cqe = &mbox->cqe;
|
|
-
|
|
- memset(cqe, 0, sizeof(*cqe));
|
|
-
|
|
- val &= ~MPU_MAILBOX_DB_RDY_MASK;
|
|
- val |= MPU_MAILBOX_DB_HI_MASK;
|
|
- /* at bits 2 - 31 place mbox dma addr msb bits 34 - 63 */
|
|
- val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2;
|
|
- iowrite32(val, db);
|
|
-
|
|
- /* wait for ready to be set */
|
|
- status = be_mbox_db_ready_wait(db);
|
|
- if (status != 0)
|
|
- return status;
|
|
-
|
|
- val = 0;
|
|
- val &= ~MPU_MAILBOX_DB_RDY_MASK;
|
|
- val &= ~MPU_MAILBOX_DB_HI_MASK;
|
|
- /* at bits 2 - 31 place mbox dma addr lsb bits 4 - 33 */
|
|
- val |= (u32)(mbox_mem->dma >> 4) << 2;
|
|
- iowrite32(val, db);
|
|
-
|
|
- status = be_mbox_db_ready_wait(db);
|
|
- if (status != 0)
|
|
- return status;
|
|
-
|
|
- /* compl entry has been made now */
|
|
- be_dws_le_to_cpu(cqe, sizeof(*cqe));
|
|
- if (!(cqe->flags & CQE_FLAGS_VALID_MASK)) {
|
|
- printk(KERN_WARNING DRV_NAME ": ERROR invalid mbox compl\n");
|
|
- return -1;
|
|
- }
|
|
-
|
|
- compl_status = (cqe->status >> CQE_STATUS_COMPL_SHIFT) &
|
|
- CQE_STATUS_COMPL_MASK;
|
|
- if (compl_status != MCC_STATUS_SUCCESS) {
|
|
- extd_status = (cqe->status >> CQE_STATUS_EXTD_SHIFT) &
|
|
- CQE_STATUS_EXTD_MASK;
|
|
- printk(KERN_WARNING DRV_NAME
|
|
- ": ERROR in cmd compl. status(compl/extd)=%d/%d\n",
|
|
- compl_status, extd_status);
|
|
- }
|
|
-
|
|
- return compl_status;
|
|
-}
|
|
-
|
|
-static int be_POST_stage_get(struct be_ctrl_info *ctrl, u16 *stage)
|
|
-{
|
|
- u32 sem = ioread32(ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
|
|
-
|
|
- *stage = sem & EP_SEMAPHORE_POST_STAGE_MASK;
|
|
- if ((sem >> EP_SEMAPHORE_POST_ERR_SHIFT) & EP_SEMAPHORE_POST_ERR_MASK)
|
|
- return -1;
|
|
- else
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int be_POST_stage_poll(struct be_ctrl_info *ctrl, u16 poll_stage)
|
|
-{
|
|
- u16 stage, cnt, error;
|
|
- for (cnt = 0; cnt < 5000; cnt++) {
|
|
- error = be_POST_stage_get(ctrl, &stage);
|
|
- if (error)
|
|
- return -1;
|
|
-
|
|
- if (stage == poll_stage)
|
|
- break;
|
|
- udelay(1000);
|
|
- }
|
|
- if (stage != poll_stage)
|
|
- return -1;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-
|
|
-int be_cmd_POST(struct be_ctrl_info *ctrl)
|
|
-{
|
|
- u16 stage, error;
|
|
-
|
|
- error = be_POST_stage_get(ctrl, &stage);
|
|
- if (error)
|
|
- goto err;
|
|
-
|
|
- if (stage == POST_STAGE_ARMFW_RDY)
|
|
- return 0;
|
|
-
|
|
- if (stage != POST_STAGE_AWAITING_HOST_RDY)
|
|
- goto err;
|
|
-
|
|
- /* On awaiting host rdy, reset and again poll on awaiting host rdy */
|
|
- iowrite32(POST_STAGE_BE_RESET, ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
|
|
- error = be_POST_stage_poll(ctrl, POST_STAGE_AWAITING_HOST_RDY);
|
|
- if (error)
|
|
- goto err;
|
|
-
|
|
- /* Now kickoff POST and poll on armfw ready */
|
|
- iowrite32(POST_STAGE_HOST_RDY, ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
|
|
- error = be_POST_stage_poll(ctrl, POST_STAGE_ARMFW_RDY);
|
|
- if (error)
|
|
- goto err;
|
|
-
|
|
- return 0;
|
|
-err:
|
|
- printk(KERN_WARNING DRV_NAME ": ERROR, stage=%d\n", stage);
|
|
- return -1;
|
|
-}
|
|
-
|
|
-static inline void *embedded_payload(struct be_mcc_wrb *wrb)
|
|
-{
|
|
- return wrb->payload.embedded_payload;
|
|
-}
|
|
-
|
|
-static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
|
|
-{
|
|
- return &wrb->payload.sgl[0];
|
|
-}
|
|
-
|
|
-/* Don't touch the hdr after it's prepared */
|
|
-static void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len,
|
|
- bool embedded, u8 sge_cnt)
|
|
-{
|
|
- if (embedded)
|
|
- wrb->embedded |= MCC_WRB_EMBEDDED_MASK;
|
|
- else
|
|
- wrb->embedded |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) <<
|
|
- MCC_WRB_SGE_CNT_SHIFT;
|
|
- wrb->payload_length = payload_len;
|
|
- be_dws_cpu_to_le(wrb, 20);
|
|
-}
|
|
-
|
|
-/* Don't touch the hdr after it's prepared */
|
|
-static void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
|
|
- u8 subsystem, u8 opcode, int cmd_len)
|
|
-{
|
|
- req_hdr->opcode = opcode;
|
|
- req_hdr->subsystem = subsystem;
|
|
- req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr));
|
|
-}
|
|
-
|
|
-static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages,
|
|
- struct be_dma_mem *mem)
|
|
-{
|
|
- int i, buf_pages = min(PAGES_4K_SPANNED(mem->va, mem->size), max_pages);
|
|
- u64 dma = (u64)mem->dma;
|
|
-
|
|
- for (i = 0; i < buf_pages; i++) {
|
|
- pages[i].lo = cpu_to_le32(dma & 0xFFFFFFFF);
|
|
- pages[i].hi = cpu_to_le32(upper_32_bits(dma));
|
|
- dma += PAGE_SIZE_4K;
|
|
- }
|
|
-}
|
|
-
|
|
-/* Converts interrupt delay in microseconds to multiplier value */
|
|
-static u32 eq_delay_to_mult(u32 usec_delay)
|
|
-{
|
|
-#define MAX_INTR_RATE 651042
|
|
- const u32 round = 10;
|
|
- u32 multiplier;
|
|
-
|
|
- if (usec_delay == 0)
|
|
- multiplier = 0;
|
|
- else {
|
|
- u32 interrupt_rate = 1000000 / usec_delay;
|
|
- /* Max delay, corresponding to the lowest interrupt rate */
|
|
- if (interrupt_rate == 0)
|
|
- multiplier = 1023;
|
|
- else {
|
|
- multiplier = (MAX_INTR_RATE - interrupt_rate) * round;
|
|
- multiplier /= interrupt_rate;
|
|
- /* Round the multiplier to the closest value.*/
|
|
- multiplier = (multiplier + round/2) / round;
|
|
- multiplier = min(multiplier, (u32)1023);
|
|
- }
|
|
- }
|
|
- return multiplier;
|
|
-}
|
|
-
|
|
-static inline struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem)
|
|
-{
|
|
- return &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb;
|
|
-}
|
|
-
|
|
-int be_cmd_eq_create(struct be_ctrl_info *ctrl,
|
|
- struct be_queue_info *eq, int eq_delay)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_eq_create *req = embedded_payload(wrb);
|
|
- struct be_cmd_resp_eq_create *resp = embedded_payload(wrb);
|
|
- struct be_dma_mem *q_mem = &eq->dma_mem;
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_EQ_CREATE, sizeof(*req));
|
|
-
|
|
- req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
|
|
-
|
|
- AMAP_SET_BITS(struct amap_eq_context, func, req->context,
|
|
- ctrl->pci_func);
|
|
- AMAP_SET_BITS(struct amap_eq_context, valid, req->context, 1);
|
|
- /* 4byte eqe*/
|
|
- AMAP_SET_BITS(struct amap_eq_context, size, req->context, 0);
|
|
- AMAP_SET_BITS(struct amap_eq_context, count, req->context,
|
|
- __ilog2_u32(eq->len/256));
|
|
- AMAP_SET_BITS(struct amap_eq_context, delaymult, req->context,
|
|
- eq_delay_to_mult(eq_delay));
|
|
- be_dws_cpu_to_le(req->context, sizeof(req->context));
|
|
-
|
|
- be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- eq->id = le16_to_cpu(resp->eq_id);
|
|
- eq->created = true;
|
|
- }
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_mac_addr_query(struct be_ctrl_info *ctrl, u8 *mac_addr,
|
|
- u8 type, bool permanent, u32 if_handle)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_mac_query *req = embedded_payload(wrb);
|
|
- struct be_cmd_resp_mac_query *resp = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req));
|
|
-
|
|
- req->type = type;
|
|
- if (permanent) {
|
|
- req->permanent = 1;
|
|
- } else {
|
|
- req->if_id = cpu_to_le16((u16)if_handle);
|
|
- req->permanent = 0;
|
|
- }
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status)
|
|
- memcpy(mac_addr, resp->mac.addr, ETH_ALEN);
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_pmac_add(struct be_ctrl_info *ctrl, u8 *mac_addr,
|
|
- u32 if_id, u32 *pmac_id)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_pmac_add *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req));
|
|
-
|
|
- req->if_id = cpu_to_le32(if_id);
|
|
- memcpy(req->mac_address, mac_addr, ETH_ALEN);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_pmac_add *resp = embedded_payload(wrb);
|
|
- *pmac_id = le32_to_cpu(resp->pmac_id);
|
|
- }
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_pmac_del(struct be_ctrl_info *ctrl, u32 if_id, u32 pmac_id)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_pmac_del *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_NTWK_PMAC_DEL, sizeof(*req));
|
|
-
|
|
- req->if_id = cpu_to_le32(if_id);
|
|
- req->pmac_id = cpu_to_le32(pmac_id);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_cq_create(struct be_ctrl_info *ctrl,
|
|
- struct be_queue_info *cq, struct be_queue_info *eq,
|
|
- bool sol_evts, bool no_delay, int coalesce_wm)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_cq_create *req = embedded_payload(wrb);
|
|
- struct be_cmd_resp_cq_create *resp = embedded_payload(wrb);
|
|
- struct be_dma_mem *q_mem = &cq->dma_mem;
|
|
- void *ctxt = &req->context;
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_CQ_CREATE, sizeof(*req));
|
|
-
|
|
- req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
|
|
-
|
|
- AMAP_SET_BITS(struct amap_cq_context, coalescwm, ctxt, coalesce_wm);
|
|
- AMAP_SET_BITS(struct amap_cq_context, nodelay, ctxt, no_delay);
|
|
- AMAP_SET_BITS(struct amap_cq_context, count, ctxt,
|
|
- __ilog2_u32(cq->len/256));
|
|
- AMAP_SET_BITS(struct amap_cq_context, valid, ctxt, 1);
|
|
- AMAP_SET_BITS(struct amap_cq_context, solevent, ctxt, sol_evts);
|
|
- AMAP_SET_BITS(struct amap_cq_context, eventable, ctxt, 1);
|
|
- AMAP_SET_BITS(struct amap_cq_context, eqid, ctxt, eq->id);
|
|
- AMAP_SET_BITS(struct amap_cq_context, armed, ctxt, 0);
|
|
- AMAP_SET_BITS(struct amap_cq_context, func, ctxt, ctrl->pci_func);
|
|
- be_dws_cpu_to_le(ctxt, sizeof(req->context));
|
|
-
|
|
- be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- cq->id = le16_to_cpu(resp->cq_id);
|
|
- cq->created = true;
|
|
- }
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_txq_create(struct be_ctrl_info *ctrl,
|
|
- struct be_queue_info *txq,
|
|
- struct be_queue_info *cq)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_eth_tx_create *req = embedded_payload(wrb);
|
|
- struct be_dma_mem *q_mem = &txq->dma_mem;
|
|
- void *ctxt = &req->context;
|
|
- int status;
|
|
- u32 len_encoded;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_TX_CREATE,
|
|
- sizeof(*req));
|
|
-
|
|
- req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
|
|
- req->ulp_num = BE_ULP1_NUM;
|
|
- req->type = BE_ETH_TX_RING_TYPE_STANDARD;
|
|
-
|
|
- len_encoded = fls(txq->len); /* log2(len) + 1 */
|
|
- if (len_encoded == 16)
|
|
- len_encoded = 0;
|
|
- AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, len_encoded);
|
|
- AMAP_SET_BITS(struct amap_tx_context, pci_func_id, ctxt,
|
|
- ctrl->pci_func);
|
|
- AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1);
|
|
- AMAP_SET_BITS(struct amap_tx_context, cq_id_send, ctxt, cq->id);
|
|
-
|
|
- be_dws_cpu_to_le(ctxt, sizeof(req->context));
|
|
-
|
|
- be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb);
|
|
- txq->id = le16_to_cpu(resp->cid);
|
|
- txq->created = true;
|
|
- }
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_rxq_create(struct be_ctrl_info *ctrl,
|
|
- struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
|
|
- u16 max_frame_size, u32 if_id, u32 rss)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_eth_rx_create *req = embedded_payload(wrb);
|
|
- struct be_dma_mem *q_mem = &rxq->dma_mem;
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_RX_CREATE,
|
|
- sizeof(*req));
|
|
-
|
|
- req->cq_id = cpu_to_le16(cq_id);
|
|
- req->frag_size = fls(frag_size) - 1;
|
|
- req->num_pages = 2;
|
|
- be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
|
|
- req->interface_id = cpu_to_le32(if_id);
|
|
- req->max_frame_size = cpu_to_le16(max_frame_size);
|
|
- req->rss_queue = cpu_to_le32(rss);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb);
|
|
- rxq->id = le16_to_cpu(resp->id);
|
|
- rxq->created = true;
|
|
- }
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-/* Generic destroyer function for all types of queues */
|
|
-int be_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
|
|
- int queue_type)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_q_destroy *req = embedded_payload(wrb);
|
|
- u8 subsys = 0, opcode = 0;
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
-
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- switch (queue_type) {
|
|
- case QTYPE_EQ:
|
|
- subsys = CMD_SUBSYSTEM_COMMON;
|
|
- opcode = OPCODE_COMMON_EQ_DESTROY;
|
|
- break;
|
|
- case QTYPE_CQ:
|
|
- subsys = CMD_SUBSYSTEM_COMMON;
|
|
- opcode = OPCODE_COMMON_CQ_DESTROY;
|
|
- break;
|
|
- case QTYPE_TXQ:
|
|
- subsys = CMD_SUBSYSTEM_ETH;
|
|
- opcode = OPCODE_ETH_TX_DESTROY;
|
|
- break;
|
|
- case QTYPE_RXQ:
|
|
- subsys = CMD_SUBSYSTEM_ETH;
|
|
- opcode = OPCODE_ETH_RX_DESTROY;
|
|
- break;
|
|
- default:
|
|
- printk(KERN_WARNING DRV_NAME ":bad Q type in Q destroy cmd\n");
|
|
- status = -1;
|
|
- goto err;
|
|
- }
|
|
- be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req));
|
|
- req->id = cpu_to_le16(q->id);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
-err:
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-/* Create an rx filtering policy configuration on an i/f */
|
|
-int be_cmd_if_create(struct be_ctrl_info *ctrl, u32 flags, u8 *mac,
|
|
- bool pmac_invalid, u32 *if_handle, u32 *pmac_id)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_if_create *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req));
|
|
-
|
|
- req->capability_flags = cpu_to_le32(flags);
|
|
- req->enable_flags = cpu_to_le32(flags);
|
|
- if (!pmac_invalid)
|
|
- memcpy(req->mac_addr, mac, ETH_ALEN);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_if_create *resp = embedded_payload(wrb);
|
|
- *if_handle = le32_to_cpu(resp->interface_id);
|
|
- if (!pmac_invalid)
|
|
- *pmac_id = le32_to_cpu(resp->pmac_id);
|
|
- }
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_if_destroy(struct be_ctrl_info *ctrl, u32 interface_id)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_if_destroy *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req));
|
|
-
|
|
- req->interface_id = cpu_to_le32(interface_id);
|
|
- status = be_mbox_db_ring(ctrl);
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-/* Get stats is a non embedded command: the request is not embedded inside
|
|
- * WRB but is a separate dma memory block
|
|
- */
|
|
-int be_cmd_get_stats(struct be_ctrl_info *ctrl, struct be_dma_mem *nonemb_cmd)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_get_stats *req = nonemb_cmd->va;
|
|
- struct be_sge *sge = nonembedded_sgl(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- memset(req, 0, sizeof(*req));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
|
|
- OPCODE_ETH_GET_STATISTICS, sizeof(*req));
|
|
- sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
|
|
- sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
|
|
- sge->len = cpu_to_le32(nonemb_cmd->size);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_get_stats *resp = nonemb_cmd->va;
|
|
- be_dws_le_to_cpu(&resp->hw_stats, sizeof(resp->hw_stats));
|
|
- }
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_link_status_query(struct be_ctrl_info *ctrl,
|
|
- struct be_link_info *link)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_link_status *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req));
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_link_status *resp = embedded_payload(wrb);
|
|
- link->speed = resp->mac_speed;
|
|
- link->duplex = resp->mac_duplex;
|
|
- link->fault = resp->mac_fault;
|
|
- } else {
|
|
- link->speed = PHY_LINK_SPEED_ZERO;
|
|
- }
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_get_fw_ver(struct be_ctrl_info *ctrl, char *fw_ver)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_get_fw_version *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_GET_FW_VERSION, sizeof(*req));
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb);
|
|
- strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN);
|
|
- }
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-/* set the EQ delay interval of an EQ to specified value */
|
|
-int be_cmd_modify_eqd(struct be_ctrl_info *ctrl, u32 eq_id, u32 eqd)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_modify_eq_delay *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req));
|
|
-
|
|
- req->num_eq = cpu_to_le32(1);
|
|
- req->delay[0].eq_id = cpu_to_le32(eq_id);
|
|
- req->delay[0].phase = 0;
|
|
- req->delay[0].delay_multiplier = cpu_to_le32(eqd);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_vlan_config(struct be_ctrl_info *ctrl, u32 if_id, u16 *vtag_array,
|
|
- u32 num, bool untagged, bool promiscuous)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_vlan_config *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req));
|
|
-
|
|
- req->interface_id = if_id;
|
|
- req->promiscuous = promiscuous;
|
|
- req->untagged = untagged;
|
|
- req->num_vlan = num;
|
|
- if (!promiscuous) {
|
|
- memcpy(req->normal_vlan, vtag_array,
|
|
- req->num_vlan * sizeof(vtag_array[0]));
|
|
- }
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_promiscuous_config(struct be_ctrl_info *ctrl, u8 port_num, bool en)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_promiscuous_config *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
|
|
- OPCODE_ETH_PROMISCUOUS, sizeof(*req));
|
|
-
|
|
- if (port_num)
|
|
- req->port1_promiscuous = en;
|
|
- else
|
|
- req->port0_promiscuous = en;
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_mcast_mac_set(struct be_ctrl_info *ctrl, u32 if_id, u8 *mac_table,
|
|
- u32 num, bool promiscuous)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_mcast_mac_config *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_NTWK_MULTICAST_SET, sizeof(*req));
|
|
-
|
|
- req->interface_id = if_id;
|
|
- req->promiscuous = promiscuous;
|
|
- if (!promiscuous) {
|
|
- req->num_mac = cpu_to_le16(num);
|
|
- if (num)
|
|
- memcpy(req->mac, mac_table, ETH_ALEN * num);
|
|
- }
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_set_flow_control(struct be_ctrl_info *ctrl, u32 tx_fc, u32 rx_fc)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_set_flow_control *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
-
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req));
|
|
-
|
|
- req->tx_flow_control = cpu_to_le16((u16)tx_fc);
|
|
- req->rx_flow_control = cpu_to_le16((u16)rx_fc);
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_get_flow_control(struct be_ctrl_info *ctrl, u32 *tx_fc, u32 *rx_fc)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_get_flow_control *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
-
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req));
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_get_flow_control *resp =
|
|
- embedded_payload(wrb);
|
|
- *tx_fc = le16_to_cpu(resp->tx_flow_control);
|
|
- *rx_fc = le16_to_cpu(resp->rx_flow_control);
|
|
- }
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
-
|
|
-int be_cmd_query_fw_cfg(struct be_ctrl_info *ctrl, u32 *port_num)
|
|
-{
|
|
- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
|
- struct be_cmd_req_query_fw_cfg *req = embedded_payload(wrb);
|
|
- int status;
|
|
-
|
|
- spin_lock(&ctrl->cmd_lock);
|
|
-
|
|
- memset(wrb, 0, sizeof(*wrb));
|
|
-
|
|
- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
|
|
-
|
|
- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
|
- OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req));
|
|
-
|
|
- status = be_mbox_db_ring(ctrl);
|
|
- if (!status) {
|
|
- struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb);
|
|
- *port_num = le32_to_cpu(resp->phys_port);
|
|
- }
|
|
-
|
|
- spin_unlock(&ctrl->cmd_lock);
|
|
- return status;
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/benet/be_cmds.h linux-2.6.29-rc3.owrt/drivers/net/benet/be_cmds.h
|
|
--- linux-2.6.29.owrt/drivers/net/benet/be_cmds.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_cmds.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,688 +0,0 @@
|
|
-/*
|
|
- * Copyright (C) 2005 - 2009 ServerEngines
|
|
- * All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or
|
|
- * modify it under the terms of the GNU General Public License version 2
|
|
- * as published by the Free Software Foundation. The full GNU General
|
|
- * Public License is included in this distribution in the file called COPYING.
|
|
- *
|
|
- * Contact Information:
|
|
- * linux-drivers@serverengines.com
|
|
- *
|
|
- * ServerEngines
|
|
- * 209 N. Fair Oaks Ave
|
|
- * Sunnyvale, CA 94085
|
|
- */
|
|
-
|
|
-/*
|
|
- * The driver sends configuration and managements command requests to the
|
|
- * firmware in the BE. These requests are communicated to the processor
|
|
- * using Work Request Blocks (WRBs) submitted to the MCC-WRB ring or via one
|
|
- * WRB inside a MAILBOX.
|
|
- * The commands are serviced by the ARM processor in the BladeEngine's MPU.
|
|
- */
|
|
-
|
|
-struct be_sge {
|
|
- u32 pa_lo;
|
|
- u32 pa_hi;
|
|
- u32 len;
|
|
-};
|
|
-
|
|
-#define MCC_WRB_EMBEDDED_MASK 1 /* bit 0 of dword 0*/
|
|
-#define MCC_WRB_SGE_CNT_SHIFT 3 /* bits 3 - 7 of dword 0 */
|
|
-#define MCC_WRB_SGE_CNT_MASK 0x1F /* bits 3 - 7 of dword 0 */
|
|
-struct be_mcc_wrb {
|
|
- u32 embedded; /* dword 0 */
|
|
- u32 payload_length; /* dword 1 */
|
|
- u32 tag0; /* dword 2 */
|
|
- u32 tag1; /* dword 3 */
|
|
- u32 rsvd; /* dword 4 */
|
|
- union {
|
|
- u8 embedded_payload[236]; /* used by embedded cmds */
|
|
- struct be_sge sgl[19]; /* used by non-embedded cmds */
|
|
- } payload;
|
|
-};
|
|
-
|
|
-#define CQE_FLAGS_VALID_MASK (1 << 31)
|
|
-#define CQE_FLAGS_ASYNC_MASK (1 << 30)
|
|
-#define CQE_FLAGS_COMPLETED_MASK (1 << 28)
|
|
-#define CQE_FLAGS_CONSUMED_MASK (1 << 27)
|
|
-
|
|
-/* Completion Status */
|
|
-enum {
|
|
- MCC_STATUS_SUCCESS = 0x0,
|
|
-/* The client does not have sufficient privileges to execute the command */
|
|
- MCC_STATUS_INSUFFICIENT_PRIVILEGES = 0x1,
|
|
-/* A parameter in the command was invalid. */
|
|
- MCC_STATUS_INVALID_PARAMETER = 0x2,
|
|
-/* There are insufficient chip resources to execute the command */
|
|
- MCC_STATUS_INSUFFICIENT_RESOURCES = 0x3,
|
|
-/* The command is completing because the queue was getting flushed */
|
|
- MCC_STATUS_QUEUE_FLUSHING = 0x4,
|
|
-/* The command is completing with a DMA error */
|
|
- MCC_STATUS_DMA_FAILED = 0x5
|
|
-};
|
|
-
|
|
-#define CQE_STATUS_COMPL_MASK 0xFFFF
|
|
-#define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */
|
|
-#define CQE_STATUS_EXTD_MASK 0xFFFF
|
|
-#define CQE_STATUS_EXTD_SHIFT 0 /* bits 0 - 15 */
|
|
-
|
|
-struct be_mcc_cq_entry {
|
|
- u32 status; /* dword 0 */
|
|
- u32 tag0; /* dword 1 */
|
|
- u32 tag1; /* dword 2 */
|
|
- u32 flags; /* dword 3 */
|
|
-};
|
|
-
|
|
-struct be_mcc_mailbox {
|
|
- struct be_mcc_wrb wrb;
|
|
- struct be_mcc_cq_entry cqe;
|
|
-};
|
|
-
|
|
-#define CMD_SUBSYSTEM_COMMON 0x1
|
|
-#define CMD_SUBSYSTEM_ETH 0x3
|
|
-
|
|
-#define OPCODE_COMMON_NTWK_MAC_QUERY 1
|
|
-#define OPCODE_COMMON_NTWK_MAC_SET 2
|
|
-#define OPCODE_COMMON_NTWK_MULTICAST_SET 3
|
|
-#define OPCODE_COMMON_NTWK_VLAN_CONFIG 4
|
|
-#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5
|
|
-#define OPCODE_COMMON_CQ_CREATE 12
|
|
-#define OPCODE_COMMON_EQ_CREATE 13
|
|
-#define OPCODE_COMMON_MCC_CREATE 21
|
|
-#define OPCODE_COMMON_NTWK_RX_FILTER 34
|
|
-#define OPCODE_COMMON_GET_FW_VERSION 35
|
|
-#define OPCODE_COMMON_SET_FLOW_CONTROL 36
|
|
-#define OPCODE_COMMON_GET_FLOW_CONTROL 37
|
|
-#define OPCODE_COMMON_SET_FRAME_SIZE 39
|
|
-#define OPCODE_COMMON_MODIFY_EQ_DELAY 41
|
|
-#define OPCODE_COMMON_FIRMWARE_CONFIG 42
|
|
-#define OPCODE_COMMON_NTWK_INTERFACE_CREATE 50
|
|
-#define OPCODE_COMMON_NTWK_INTERFACE_DESTROY 51
|
|
-#define OPCODE_COMMON_CQ_DESTROY 54
|
|
-#define OPCODE_COMMON_EQ_DESTROY 55
|
|
-#define OPCODE_COMMON_QUERY_FIRMWARE_CONFIG 58
|
|
-#define OPCODE_COMMON_NTWK_PMAC_ADD 59
|
|
-#define OPCODE_COMMON_NTWK_PMAC_DEL 60
|
|
-
|
|
-#define OPCODE_ETH_ACPI_CONFIG 2
|
|
-#define OPCODE_ETH_PROMISCUOUS 3
|
|
-#define OPCODE_ETH_GET_STATISTICS 4
|
|
-#define OPCODE_ETH_TX_CREATE 7
|
|
-#define OPCODE_ETH_RX_CREATE 8
|
|
-#define OPCODE_ETH_TX_DESTROY 9
|
|
-#define OPCODE_ETH_RX_DESTROY 10
|
|
-
|
|
-struct be_cmd_req_hdr {
|
|
- u8 opcode; /* dword 0 */
|
|
- u8 subsystem; /* dword 0 */
|
|
- u8 port_number; /* dword 0 */
|
|
- u8 domain; /* dword 0 */
|
|
- u32 timeout; /* dword 1 */
|
|
- u32 request_length; /* dword 2 */
|
|
- u32 rsvd; /* dword 3 */
|
|
-};
|
|
-
|
|
-#define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */
|
|
-#define RESP_HDR_INFO_SUBSYS_SHIFT 8 /* bits 8 - 15 */
|
|
-struct be_cmd_resp_hdr {
|
|
- u32 info; /* dword 0 */
|
|
- u32 status; /* dword 1 */
|
|
- u32 response_length; /* dword 2 */
|
|
- u32 actual_resp_len; /* dword 3 */
|
|
-};
|
|
-
|
|
-struct phys_addr {
|
|
- u32 lo;
|
|
- u32 hi;
|
|
-};
|
|
-
|
|
-/**************************
|
|
- * BE Command definitions *
|
|
- **************************/
|
|
-
|
|
-/* Pseudo amap definition in which each bit of the actual structure is defined
|
|
- * as a byte: used to calculate offset/shift/mask of each field */
|
|
-struct amap_eq_context {
|
|
- u8 cidx[13]; /* dword 0*/
|
|
- u8 rsvd0[3]; /* dword 0*/
|
|
- u8 epidx[13]; /* dword 0*/
|
|
- u8 valid; /* dword 0*/
|
|
- u8 rsvd1; /* dword 0*/
|
|
- u8 size; /* dword 0*/
|
|
- u8 pidx[13]; /* dword 1*/
|
|
- u8 rsvd2[3]; /* dword 1*/
|
|
- u8 pd[10]; /* dword 1*/
|
|
- u8 count[3]; /* dword 1*/
|
|
- u8 solevent; /* dword 1*/
|
|
- u8 stalled; /* dword 1*/
|
|
- u8 armed; /* dword 1*/
|
|
- u8 rsvd3[4]; /* dword 2*/
|
|
- u8 func[8]; /* dword 2*/
|
|
- u8 rsvd4; /* dword 2*/
|
|
- u8 delaymult[10]; /* dword 2*/
|
|
- u8 rsvd5[2]; /* dword 2*/
|
|
- u8 phase[2]; /* dword 2*/
|
|
- u8 nodelay; /* dword 2*/
|
|
- u8 rsvd6[4]; /* dword 2*/
|
|
- u8 rsvd7[32]; /* dword 3*/
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_req_eq_create {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u16 num_pages; /* sword */
|
|
- u16 rsvd0; /* sword */
|
|
- u8 context[sizeof(struct amap_eq_context) / 8];
|
|
- struct phys_addr pages[8];
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_eq_create {
|
|
- struct be_cmd_resp_hdr resp_hdr;
|
|
- u16 eq_id; /* sword */
|
|
- u16 rsvd0; /* sword */
|
|
-} __packed;
|
|
-
|
|
-/******************** Mac query ***************************/
|
|
-enum {
|
|
- MAC_ADDRESS_TYPE_STORAGE = 0x0,
|
|
- MAC_ADDRESS_TYPE_NETWORK = 0x1,
|
|
- MAC_ADDRESS_TYPE_PD = 0x2,
|
|
- MAC_ADDRESS_TYPE_MANAGEMENT = 0x3
|
|
-};
|
|
-
|
|
-struct mac_addr {
|
|
- u16 size_of_struct;
|
|
- u8 addr[ETH_ALEN];
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_req_mac_query {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u8 type;
|
|
- u8 permanent;
|
|
- u16 if_id;
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_mac_query {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- struct mac_addr mac;
|
|
-};
|
|
-
|
|
-/******************** PMac Add ***************************/
|
|
-struct be_cmd_req_pmac_add {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u32 if_id;
|
|
- u8 mac_address[ETH_ALEN];
|
|
- u8 rsvd0[2];
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_pmac_add {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u32 pmac_id;
|
|
-};
|
|
-
|
|
-/******************** PMac Del ***************************/
|
|
-struct be_cmd_req_pmac_del {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u32 if_id;
|
|
- u32 pmac_id;
|
|
-};
|
|
-
|
|
-/******************** Create CQ ***************************/
|
|
-/* Pseudo amap definition in which each bit of the actual structure is defined
|
|
- * as a byte: used to calculate offset/shift/mask of each field */
|
|
-struct amap_cq_context {
|
|
- u8 cidx[11]; /* dword 0*/
|
|
- u8 rsvd0; /* dword 0*/
|
|
- u8 coalescwm[2]; /* dword 0*/
|
|
- u8 nodelay; /* dword 0*/
|
|
- u8 epidx[11]; /* dword 0*/
|
|
- u8 rsvd1; /* dword 0*/
|
|
- u8 count[2]; /* dword 0*/
|
|
- u8 valid; /* dword 0*/
|
|
- u8 solevent; /* dword 0*/
|
|
- u8 eventable; /* dword 0*/
|
|
- u8 pidx[11]; /* dword 1*/
|
|
- u8 rsvd2; /* dword 1*/
|
|
- u8 pd[10]; /* dword 1*/
|
|
- u8 eqid[8]; /* dword 1*/
|
|
- u8 stalled; /* dword 1*/
|
|
- u8 armed; /* dword 1*/
|
|
- u8 rsvd3[4]; /* dword 2*/
|
|
- u8 func[8]; /* dword 2*/
|
|
- u8 rsvd4[20]; /* dword 2*/
|
|
- u8 rsvd5[32]; /* dword 3*/
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_req_cq_create {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u16 num_pages;
|
|
- u16 rsvd0;
|
|
- u8 context[sizeof(struct amap_cq_context) / 8];
|
|
- struct phys_addr pages[8];
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_cq_create {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u16 cq_id;
|
|
- u16 rsvd0;
|
|
-} __packed;
|
|
-
|
|
-/******************** Create TxQ ***************************/
|
|
-#define BE_ETH_TX_RING_TYPE_STANDARD 2
|
|
-#define BE_ULP1_NUM 1
|
|
-
|
|
-/* Pseudo amap definition in which each bit of the actual structure is defined
|
|
- * as a byte: used to calculate offset/shift/mask of each field */
|
|
-struct amap_tx_context {
|
|
- u8 rsvd0[16]; /* dword 0 */
|
|
- u8 tx_ring_size[4]; /* dword 0 */
|
|
- u8 rsvd1[26]; /* dword 0 */
|
|
- u8 pci_func_id[8]; /* dword 1 */
|
|
- u8 rsvd2[9]; /* dword 1 */
|
|
- u8 ctx_valid; /* dword 1 */
|
|
- u8 cq_id_send[16]; /* dword 2 */
|
|
- u8 rsvd3[16]; /* dword 2 */
|
|
- u8 rsvd4[32]; /* dword 3 */
|
|
- u8 rsvd5[32]; /* dword 4 */
|
|
- u8 rsvd6[32]; /* dword 5 */
|
|
- u8 rsvd7[32]; /* dword 6 */
|
|
- u8 rsvd8[32]; /* dword 7 */
|
|
- u8 rsvd9[32]; /* dword 8 */
|
|
- u8 rsvd10[32]; /* dword 9 */
|
|
- u8 rsvd11[32]; /* dword 10 */
|
|
- u8 rsvd12[32]; /* dword 11 */
|
|
- u8 rsvd13[32]; /* dword 12 */
|
|
- u8 rsvd14[32]; /* dword 13 */
|
|
- u8 rsvd15[32]; /* dword 14 */
|
|
- u8 rsvd16[32]; /* dword 15 */
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_req_eth_tx_create {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u8 num_pages;
|
|
- u8 ulp_num;
|
|
- u8 type;
|
|
- u8 bound_port;
|
|
- u8 context[sizeof(struct amap_tx_context) / 8];
|
|
- struct phys_addr pages[8];
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_eth_tx_create {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u16 cid;
|
|
- u16 rsvd0;
|
|
-} __packed;
|
|
-
|
|
-/******************** Create RxQ ***************************/
|
|
-struct be_cmd_req_eth_rx_create {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u16 cq_id;
|
|
- u8 frag_size;
|
|
- u8 num_pages;
|
|
- struct phys_addr pages[2];
|
|
- u32 interface_id;
|
|
- u16 max_frame_size;
|
|
- u16 rsvd0;
|
|
- u32 rss_queue;
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_eth_rx_create {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u16 id;
|
|
- u8 cpu_id;
|
|
- u8 rsvd0;
|
|
-} __packed;
|
|
-
|
|
-/******************** Q Destroy ***************************/
|
|
-/* Type of Queue to be destroyed */
|
|
-enum {
|
|
- QTYPE_EQ = 1,
|
|
- QTYPE_CQ,
|
|
- QTYPE_TXQ,
|
|
- QTYPE_RXQ
|
|
-};
|
|
-
|
|
-struct be_cmd_req_q_destroy {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u16 id;
|
|
- u16 bypass_flush; /* valid only for rx q destroy */
|
|
-} __packed;
|
|
-
|
|
-/************ I/f Create (it's actually I/f Config Create)**********/
|
|
-
|
|
-/* Capability flags for the i/f */
|
|
-enum be_if_flags {
|
|
- BE_IF_FLAGS_RSS = 0x4,
|
|
- BE_IF_FLAGS_PROMISCUOUS = 0x8,
|
|
- BE_IF_FLAGS_BROADCAST = 0x10,
|
|
- BE_IF_FLAGS_UNTAGGED = 0x20,
|
|
- BE_IF_FLAGS_ULP = 0x40,
|
|
- BE_IF_FLAGS_VLAN_PROMISCUOUS = 0x80,
|
|
- BE_IF_FLAGS_VLAN = 0x100,
|
|
- BE_IF_FLAGS_MCAST_PROMISCUOUS = 0x200,
|
|
- BE_IF_FLAGS_PASS_L2_ERRORS = 0x400,
|
|
- BE_IF_FLAGS_PASS_L3L4_ERRORS = 0x800
|
|
-};
|
|
-
|
|
-/* An RX interface is an object with one or more MAC addresses and
|
|
- * filtering capabilities. */
|
|
-struct be_cmd_req_if_create {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u32 version; /* ignore currntly */
|
|
- u32 capability_flags;
|
|
- u32 enable_flags;
|
|
- u8 mac_addr[ETH_ALEN];
|
|
- u8 rsvd0;
|
|
- u8 pmac_invalid; /* if set, don't attach the mac addr to the i/f */
|
|
- u32 vlan_tag; /* not used currently */
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_if_create {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u32 interface_id;
|
|
- u32 pmac_id;
|
|
-};
|
|
-
|
|
-/****** I/f Destroy(it's actually I/f Config Destroy )**********/
|
|
-struct be_cmd_req_if_destroy {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u32 interface_id;
|
|
-};
|
|
-
|
|
-/*************** HW Stats Get **********************************/
|
|
-struct be_port_rxf_stats {
|
|
- u32 rx_bytes_lsd; /* dword 0*/
|
|
- u32 rx_bytes_msd; /* dword 1*/
|
|
- u32 rx_total_frames; /* dword 2*/
|
|
- u32 rx_unicast_frames; /* dword 3*/
|
|
- u32 rx_multicast_frames; /* dword 4*/
|
|
- u32 rx_broadcast_frames; /* dword 5*/
|
|
- u32 rx_crc_errors; /* dword 6*/
|
|
- u32 rx_alignment_symbol_errors; /* dword 7*/
|
|
- u32 rx_pause_frames; /* dword 8*/
|
|
- u32 rx_control_frames; /* dword 9*/
|
|
- u32 rx_in_range_errors; /* dword 10*/
|
|
- u32 rx_out_range_errors; /* dword 11*/
|
|
- u32 rx_frame_too_long; /* dword 12*/
|
|
- u32 rx_address_match_errors; /* dword 13*/
|
|
- u32 rx_vlan_mismatch; /* dword 14*/
|
|
- u32 rx_dropped_too_small; /* dword 15*/
|
|
- u32 rx_dropped_too_short; /* dword 16*/
|
|
- u32 rx_dropped_header_too_small; /* dword 17*/
|
|
- u32 rx_dropped_tcp_length; /* dword 18*/
|
|
- u32 rx_dropped_runt; /* dword 19*/
|
|
- u32 rx_64_byte_packets; /* dword 20*/
|
|
- u32 rx_65_127_byte_packets; /* dword 21*/
|
|
- u32 rx_128_256_byte_packets; /* dword 22*/
|
|
- u32 rx_256_511_byte_packets; /* dword 23*/
|
|
- u32 rx_512_1023_byte_packets; /* dword 24*/
|
|
- u32 rx_1024_1518_byte_packets; /* dword 25*/
|
|
- u32 rx_1519_2047_byte_packets; /* dword 26*/
|
|
- u32 rx_2048_4095_byte_packets; /* dword 27*/
|
|
- u32 rx_4096_8191_byte_packets; /* dword 28*/
|
|
- u32 rx_8192_9216_byte_packets; /* dword 29*/
|
|
- u32 rx_ip_checksum_errs; /* dword 30*/
|
|
- u32 rx_tcp_checksum_errs; /* dword 31*/
|
|
- u32 rx_udp_checksum_errs; /* dword 32*/
|
|
- u32 rx_non_rss_packets; /* dword 33*/
|
|
- u32 rx_ipv4_packets; /* dword 34*/
|
|
- u32 rx_ipv6_packets; /* dword 35*/
|
|
- u32 rx_ipv4_bytes_lsd; /* dword 36*/
|
|
- u32 rx_ipv4_bytes_msd; /* dword 37*/
|
|
- u32 rx_ipv6_bytes_lsd; /* dword 38*/
|
|
- u32 rx_ipv6_bytes_msd; /* dword 39*/
|
|
- u32 rx_chute1_packets; /* dword 40*/
|
|
- u32 rx_chute2_packets; /* dword 41*/
|
|
- u32 rx_chute3_packets; /* dword 42*/
|
|
- u32 rx_management_packets; /* dword 43*/
|
|
- u32 rx_switched_unicast_packets; /* dword 44*/
|
|
- u32 rx_switched_multicast_packets; /* dword 45*/
|
|
- u32 rx_switched_broadcast_packets; /* dword 46*/
|
|
- u32 tx_bytes_lsd; /* dword 47*/
|
|
- u32 tx_bytes_msd; /* dword 48*/
|
|
- u32 tx_unicastframes; /* dword 49*/
|
|
- u32 tx_multicastframes; /* dword 50*/
|
|
- u32 tx_broadcastframes; /* dword 51*/
|
|
- u32 tx_pauseframes; /* dword 52*/
|
|
- u32 tx_controlframes; /* dword 53*/
|
|
- u32 tx_64_byte_packets; /* dword 54*/
|
|
- u32 tx_65_127_byte_packets; /* dword 55*/
|
|
- u32 tx_128_256_byte_packets; /* dword 56*/
|
|
- u32 tx_256_511_byte_packets; /* dword 57*/
|
|
- u32 tx_512_1023_byte_packets; /* dword 58*/
|
|
- u32 tx_1024_1518_byte_packets; /* dword 59*/
|
|
- u32 tx_1519_2047_byte_packets; /* dword 60*/
|
|
- u32 tx_2048_4095_byte_packets; /* dword 61*/
|
|
- u32 tx_4096_8191_byte_packets; /* dword 62*/
|
|
- u32 tx_8192_9216_byte_packets; /* dword 63*/
|
|
- u32 rx_fifo_overflow; /* dword 64*/
|
|
- u32 rx_input_fifo_overflow; /* dword 65*/
|
|
-};
|
|
-
|
|
-struct be_rxf_stats {
|
|
- struct be_port_rxf_stats port[2];
|
|
- u32 rx_drops_no_pbuf; /* dword 132*/
|
|
- u32 rx_drops_no_txpb; /* dword 133*/
|
|
- u32 rx_drops_no_erx_descr; /* dword 134*/
|
|
- u32 rx_drops_no_tpre_descr; /* dword 135*/
|
|
- u32 management_rx_port_packets; /* dword 136*/
|
|
- u32 management_rx_port_bytes; /* dword 137*/
|
|
- u32 management_rx_port_pause_frames; /* dword 138*/
|
|
- u32 management_rx_port_errors; /* dword 139*/
|
|
- u32 management_tx_port_packets; /* dword 140*/
|
|
- u32 management_tx_port_bytes; /* dword 141*/
|
|
- u32 management_tx_port_pause; /* dword 142*/
|
|
- u32 management_rx_port_rxfifo_overflow; /* dword 143*/
|
|
- u32 rx_drops_too_many_frags; /* dword 144*/
|
|
- u32 rx_drops_invalid_ring; /* dword 145*/
|
|
- u32 forwarded_packets; /* dword 146*/
|
|
- u32 rx_drops_mtu; /* dword 147*/
|
|
- u32 rsvd0[15];
|
|
-};
|
|
-
|
|
-struct be_erx_stats {
|
|
- u32 rx_drops_no_fragments[44]; /* dwordS 0 to 43*/
|
|
- u32 debug_wdma_sent_hold; /* dword 44*/
|
|
- u32 debug_wdma_pbfree_sent_hold; /* dword 45*/
|
|
- u32 debug_wdma_zerobyte_pbfree_sent_hold; /* dword 46*/
|
|
- u32 debug_pmem_pbuf_dealloc; /* dword 47*/
|
|
-};
|
|
-
|
|
-struct be_hw_stats {
|
|
- struct be_rxf_stats rxf;
|
|
- u32 rsvd[48];
|
|
- struct be_erx_stats erx;
|
|
-};
|
|
-
|
|
-struct be_cmd_req_get_stats {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u8 rsvd[sizeof(struct be_hw_stats)];
|
|
-};
|
|
-
|
|
-struct be_cmd_resp_get_stats {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- struct be_hw_stats hw_stats;
|
|
-};
|
|
-
|
|
-struct be_cmd_req_vlan_config {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u8 interface_id;
|
|
- u8 promiscuous;
|
|
- u8 untagged;
|
|
- u8 num_vlan;
|
|
- u16 normal_vlan[64];
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_req_promiscuous_config {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u8 port0_promiscuous;
|
|
- u8 port1_promiscuous;
|
|
- u16 rsvd0;
|
|
-} __packed;
|
|
-
|
|
-struct macaddr {
|
|
- u8 byte[ETH_ALEN];
|
|
-};
|
|
-
|
|
-struct be_cmd_req_mcast_mac_config {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u16 num_mac;
|
|
- u8 promiscuous;
|
|
- u8 interface_id;
|
|
- struct macaddr mac[32];
|
|
-} __packed;
|
|
-
|
|
-static inline struct be_hw_stats *
|
|
-hw_stats_from_cmd(struct be_cmd_resp_get_stats *cmd)
|
|
-{
|
|
- return &cmd->hw_stats;
|
|
-}
|
|
-
|
|
-/******************** Link Status Query *******************/
|
|
-struct be_cmd_req_link_status {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u32 rsvd;
|
|
-};
|
|
-
|
|
-struct be_link_info {
|
|
- u8 duplex;
|
|
- u8 speed;
|
|
- u8 fault;
|
|
-};
|
|
-
|
|
-enum {
|
|
- PHY_LINK_DUPLEX_NONE = 0x0,
|
|
- PHY_LINK_DUPLEX_HALF = 0x1,
|
|
- PHY_LINK_DUPLEX_FULL = 0x2
|
|
-};
|
|
-
|
|
-enum {
|
|
- PHY_LINK_SPEED_ZERO = 0x0, /* => No link */
|
|
- PHY_LINK_SPEED_10MBPS = 0x1,
|
|
- PHY_LINK_SPEED_100MBPS = 0x2,
|
|
- PHY_LINK_SPEED_1GBPS = 0x3,
|
|
- PHY_LINK_SPEED_10GBPS = 0x4
|
|
-};
|
|
-
|
|
-struct be_cmd_resp_link_status {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u8 physical_port;
|
|
- u8 mac_duplex;
|
|
- u8 mac_speed;
|
|
- u8 mac_fault;
|
|
- u8 mgmt_mac_duplex;
|
|
- u8 mgmt_mac_speed;
|
|
- u16 rsvd0;
|
|
-} __packed;
|
|
-
|
|
-/******************** Get FW Version *******************/
|
|
-#define FW_VER_LEN 32
|
|
-struct be_cmd_req_get_fw_version {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u8 rsvd0[FW_VER_LEN];
|
|
- u8 rsvd1[FW_VER_LEN];
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_get_fw_version {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u8 firmware_version_string[FW_VER_LEN];
|
|
- u8 fw_on_flash_version_string[FW_VER_LEN];
|
|
-} __packed;
|
|
-
|
|
-/******************** Set Flow Contrl *******************/
|
|
-struct be_cmd_req_set_flow_control {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u16 tx_flow_control;
|
|
- u16 rx_flow_control;
|
|
-} __packed;
|
|
-
|
|
-/******************** Get Flow Contrl *******************/
|
|
-struct be_cmd_req_get_flow_control {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u32 rsvd;
|
|
-};
|
|
-
|
|
-struct be_cmd_resp_get_flow_control {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u16 tx_flow_control;
|
|
- u16 rx_flow_control;
|
|
-} __packed;
|
|
-
|
|
-/******************** Modify EQ Delay *******************/
|
|
-struct be_cmd_req_modify_eq_delay {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u32 num_eq;
|
|
- struct {
|
|
- u32 eq_id;
|
|
- u32 phase;
|
|
- u32 delay_multiplier;
|
|
- } delay[8];
|
|
-} __packed;
|
|
-
|
|
-struct be_cmd_resp_modify_eq_delay {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u32 rsvd0;
|
|
-} __packed;
|
|
-
|
|
-/******************** Get FW Config *******************/
|
|
-struct be_cmd_req_query_fw_cfg {
|
|
- struct be_cmd_req_hdr hdr;
|
|
- u32 rsvd[30];
|
|
-};
|
|
-
|
|
-struct be_cmd_resp_query_fw_cfg {
|
|
- struct be_cmd_resp_hdr hdr;
|
|
- u32 be_config_number;
|
|
- u32 asic_revision;
|
|
- u32 phys_port;
|
|
- u32 function_mode;
|
|
- u32 rsvd[26];
|
|
-};
|
|
-
|
|
-extern int be_pci_fnum_get(struct be_ctrl_info *ctrl);
|
|
-extern int be_cmd_POST(struct be_ctrl_info *ctrl);
|
|
-extern int be_cmd_mac_addr_query(struct be_ctrl_info *ctrl, u8 *mac_addr,
|
|
- u8 type, bool permanent, u32 if_handle);
|
|
-extern int be_cmd_pmac_add(struct be_ctrl_info *ctrl, u8 *mac_addr,
|
|
- u32 if_id, u32 *pmac_id);
|
|
-extern int be_cmd_pmac_del(struct be_ctrl_info *ctrl, u32 if_id, u32 pmac_id);
|
|
-extern int be_cmd_if_create(struct be_ctrl_info *ctrl, u32 if_flags, u8 *mac,
|
|
- bool pmac_invalid, u32 *if_handle, u32 *pmac_id);
|
|
-extern int be_cmd_if_destroy(struct be_ctrl_info *ctrl, u32 if_handle);
|
|
-extern int be_cmd_eq_create(struct be_ctrl_info *ctrl,
|
|
- struct be_queue_info *eq, int eq_delay);
|
|
-extern int be_cmd_cq_create(struct be_ctrl_info *ctrl,
|
|
- struct be_queue_info *cq, struct be_queue_info *eq,
|
|
- bool sol_evts, bool no_delay,
|
|
- int num_cqe_dma_coalesce);
|
|
-extern int be_cmd_txq_create(struct be_ctrl_info *ctrl,
|
|
- struct be_queue_info *txq,
|
|
- struct be_queue_info *cq);
|
|
-extern int be_cmd_rxq_create(struct be_ctrl_info *ctrl,
|
|
- struct be_queue_info *rxq, u16 cq_id,
|
|
- u16 frag_size, u16 max_frame_size, u32 if_id,
|
|
- u32 rss);
|
|
-extern int be_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
|
|
- int type);
|
|
-extern int be_cmd_link_status_query(struct be_ctrl_info *ctrl,
|
|
- struct be_link_info *link);
|
|
-extern int be_cmd_reset(struct be_ctrl_info *ctrl);
|
|
-extern int be_cmd_get_stats(struct be_ctrl_info *ctrl,
|
|
- struct be_dma_mem *nonemb_cmd);
|
|
-extern int be_cmd_get_fw_ver(struct be_ctrl_info *ctrl, char *fw_ver);
|
|
-
|
|
-extern int be_cmd_modify_eqd(struct be_ctrl_info *ctrl, u32 eq_id, u32 eqd);
|
|
-extern int be_cmd_vlan_config(struct be_ctrl_info *ctrl, u32 if_id,
|
|
- u16 *vtag_array, u32 num, bool untagged,
|
|
- bool promiscuous);
|
|
-extern int be_cmd_promiscuous_config(struct be_ctrl_info *ctrl,
|
|
- u8 port_num, bool en);
|
|
-extern int be_cmd_mcast_mac_set(struct be_ctrl_info *ctrl, u32 if_id,
|
|
- u8 *mac_table, u32 num, bool promiscuous);
|
|
-extern int be_cmd_set_flow_control(struct be_ctrl_info *ctrl,
|
|
- u32 tx_fc, u32 rx_fc);
|
|
-extern int be_cmd_get_flow_control(struct be_ctrl_info *ctrl,
|
|
- u32 *tx_fc, u32 *rx_fc);
|
|
-extern int be_cmd_query_fw_cfg(struct be_ctrl_info *ctrl, u32 *port_num);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/benet/be_ethtool.c linux-2.6.29-rc3.owrt/drivers/net/benet/be_ethtool.c
|
|
--- linux-2.6.29.owrt/drivers/net/benet/be_ethtool.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_ethtool.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,362 +0,0 @@
|
|
-/*
|
|
- * Copyright (C) 2005 - 2009 ServerEngines
|
|
- * All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or
|
|
- * modify it under the terms of the GNU General Public License version 2
|
|
- * as published by the Free Software Foundation. The full GNU General
|
|
- * Public License is included in this distribution in the file called COPYING.
|
|
- *
|
|
- * Contact Information:
|
|
- * linux-drivers@serverengines.com
|
|
- *
|
|
- * ServerEngines
|
|
- * 209 N. Fair Oaks Ave
|
|
- * Sunnyvale, CA 94085
|
|
- */
|
|
-
|
|
-#include "be.h"
|
|
-#include <linux/ethtool.h>
|
|
-
|
|
-struct be_ethtool_stat {
|
|
- char desc[ETH_GSTRING_LEN];
|
|
- int type;
|
|
- int size;
|
|
- int offset;
|
|
-};
|
|
-
|
|
-enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT, ERXSTAT};
|
|
-#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \
|
|
- offsetof(_struct, field)
|
|
-#define NETSTAT_INFO(field) #field, NETSTAT,\
|
|
- FIELDINFO(struct net_device_stats,\
|
|
- field)
|
|
-#define DRVSTAT_INFO(field) #field, DRVSTAT,\
|
|
- FIELDINFO(struct be_drvr_stats, field)
|
|
-#define MISCSTAT_INFO(field) #field, MISCSTAT,\
|
|
- FIELDINFO(struct be_rxf_stats, field)
|
|
-#define PORTSTAT_INFO(field) #field, PORTSTAT,\
|
|
- FIELDINFO(struct be_port_rxf_stats, \
|
|
- field)
|
|
-#define ERXSTAT_INFO(field) #field, ERXSTAT,\
|
|
- FIELDINFO(struct be_erx_stats, field)
|
|
-
|
|
-static const struct be_ethtool_stat et_stats[] = {
|
|
- {NETSTAT_INFO(rx_packets)},
|
|
- {NETSTAT_INFO(tx_packets)},
|
|
- {NETSTAT_INFO(rx_bytes)},
|
|
- {NETSTAT_INFO(tx_bytes)},
|
|
- {NETSTAT_INFO(rx_errors)},
|
|
- {NETSTAT_INFO(tx_errors)},
|
|
- {NETSTAT_INFO(rx_dropped)},
|
|
- {NETSTAT_INFO(tx_dropped)},
|
|
- {DRVSTAT_INFO(be_tx_reqs)},
|
|
- {DRVSTAT_INFO(be_tx_stops)},
|
|
- {DRVSTAT_INFO(be_fwd_reqs)},
|
|
- {DRVSTAT_INFO(be_tx_wrbs)},
|
|
- {DRVSTAT_INFO(be_polls)},
|
|
- {DRVSTAT_INFO(be_tx_events)},
|
|
- {DRVSTAT_INFO(be_rx_events)},
|
|
- {DRVSTAT_INFO(be_tx_compl)},
|
|
- {DRVSTAT_INFO(be_rx_compl)},
|
|
- {DRVSTAT_INFO(be_ethrx_post_fail)},
|
|
- {DRVSTAT_INFO(be_802_3_dropped_frames)},
|
|
- {DRVSTAT_INFO(be_802_3_malformed_frames)},
|
|
- {DRVSTAT_INFO(be_tx_rate)},
|
|
- {DRVSTAT_INFO(be_rx_rate)},
|
|
- {PORTSTAT_INFO(rx_unicast_frames)},
|
|
- {PORTSTAT_INFO(rx_multicast_frames)},
|
|
- {PORTSTAT_INFO(rx_broadcast_frames)},
|
|
- {PORTSTAT_INFO(rx_crc_errors)},
|
|
- {PORTSTAT_INFO(rx_alignment_symbol_errors)},
|
|
- {PORTSTAT_INFO(rx_pause_frames)},
|
|
- {PORTSTAT_INFO(rx_control_frames)},
|
|
- {PORTSTAT_INFO(rx_in_range_errors)},
|
|
- {PORTSTAT_INFO(rx_out_range_errors)},
|
|
- {PORTSTAT_INFO(rx_frame_too_long)},
|
|
- {PORTSTAT_INFO(rx_address_match_errors)},
|
|
- {PORTSTAT_INFO(rx_vlan_mismatch)},
|
|
- {PORTSTAT_INFO(rx_dropped_too_small)},
|
|
- {PORTSTAT_INFO(rx_dropped_too_short)},
|
|
- {PORTSTAT_INFO(rx_dropped_header_too_small)},
|
|
- {PORTSTAT_INFO(rx_dropped_tcp_length)},
|
|
- {PORTSTAT_INFO(rx_dropped_runt)},
|
|
- {PORTSTAT_INFO(rx_fifo_overflow)},
|
|
- {PORTSTAT_INFO(rx_input_fifo_overflow)},
|
|
- {PORTSTAT_INFO(rx_ip_checksum_errs)},
|
|
- {PORTSTAT_INFO(rx_tcp_checksum_errs)},
|
|
- {PORTSTAT_INFO(rx_udp_checksum_errs)},
|
|
- {PORTSTAT_INFO(rx_non_rss_packets)},
|
|
- {PORTSTAT_INFO(rx_ipv4_packets)},
|
|
- {PORTSTAT_INFO(rx_ipv6_packets)},
|
|
- {PORTSTAT_INFO(tx_unicastframes)},
|
|
- {PORTSTAT_INFO(tx_multicastframes)},
|
|
- {PORTSTAT_INFO(tx_broadcastframes)},
|
|
- {PORTSTAT_INFO(tx_pauseframes)},
|
|
- {PORTSTAT_INFO(tx_controlframes)},
|
|
- {MISCSTAT_INFO(rx_drops_no_pbuf)},
|
|
- {MISCSTAT_INFO(rx_drops_no_txpb)},
|
|
- {MISCSTAT_INFO(rx_drops_no_erx_descr)},
|
|
- {MISCSTAT_INFO(rx_drops_no_tpre_descr)},
|
|
- {MISCSTAT_INFO(rx_drops_too_many_frags)},
|
|
- {MISCSTAT_INFO(rx_drops_invalid_ring)},
|
|
- {MISCSTAT_INFO(forwarded_packets)},
|
|
- {MISCSTAT_INFO(rx_drops_mtu)},
|
|
- {ERXSTAT_INFO(rx_drops_no_fragments)},
|
|
-};
|
|
-#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats)
|
|
-
|
|
-static void
|
|
-be_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- strcpy(drvinfo->driver, DRV_NAME);
|
|
- strcpy(drvinfo->version, DRV_VER);
|
|
- strncpy(drvinfo->fw_version, adapter->fw_ver, FW_VER_LEN);
|
|
- strcpy(drvinfo->bus_info, pci_name(adapter->pdev));
|
|
- drvinfo->testinfo_len = 0;
|
|
- drvinfo->regdump_len = 0;
|
|
- drvinfo->eedump_len = 0;
|
|
-}
|
|
-
|
|
-static int
|
|
-be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
|
- struct be_eq_obj *tx_eq = &adapter->tx_eq;
|
|
-
|
|
- coalesce->rx_max_coalesced_frames = adapter->max_rx_coal;
|
|
-
|
|
- coalesce->rx_coalesce_usecs = rx_eq->cur_eqd;
|
|
- coalesce->rx_coalesce_usecs_high = rx_eq->max_eqd;
|
|
- coalesce->rx_coalesce_usecs_low = rx_eq->min_eqd;
|
|
-
|
|
- coalesce->tx_coalesce_usecs = tx_eq->cur_eqd;
|
|
- coalesce->tx_coalesce_usecs_high = tx_eq->max_eqd;
|
|
- coalesce->tx_coalesce_usecs_low = tx_eq->min_eqd;
|
|
-
|
|
- coalesce->use_adaptive_rx_coalesce = rx_eq->enable_aic;
|
|
- coalesce->use_adaptive_tx_coalesce = tx_eq->enable_aic;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * This routine is used to set interrup coalescing delay *as well as*
|
|
- * the number of pkts to coalesce for LRO.
|
|
- */
|
|
-static int
|
|
-be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
- struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
|
- struct be_eq_obj *tx_eq = &adapter->tx_eq;
|
|
- u32 tx_max, tx_min, tx_cur;
|
|
- u32 rx_max, rx_min, rx_cur;
|
|
- int status = 0;
|
|
-
|
|
- if (coalesce->use_adaptive_tx_coalesce == 1)
|
|
- return -EINVAL;
|
|
-
|
|
- adapter->max_rx_coal = coalesce->rx_max_coalesced_frames;
|
|
- if (adapter->max_rx_coal > MAX_SKB_FRAGS)
|
|
- adapter->max_rx_coal = MAX_SKB_FRAGS - 1;
|
|
-
|
|
- /* if AIC is being turned on now, start with an EQD of 0 */
|
|
- if (rx_eq->enable_aic == 0 &&
|
|
- coalesce->use_adaptive_rx_coalesce == 1) {
|
|
- rx_eq->cur_eqd = 0;
|
|
- }
|
|
- rx_eq->enable_aic = coalesce->use_adaptive_rx_coalesce;
|
|
-
|
|
- rx_max = coalesce->rx_coalesce_usecs_high;
|
|
- rx_min = coalesce->rx_coalesce_usecs_low;
|
|
- rx_cur = coalesce->rx_coalesce_usecs;
|
|
-
|
|
- tx_max = coalesce->tx_coalesce_usecs_high;
|
|
- tx_min = coalesce->tx_coalesce_usecs_low;
|
|
- tx_cur = coalesce->tx_coalesce_usecs;
|
|
-
|
|
- if (tx_cur > BE_MAX_EQD)
|
|
- tx_cur = BE_MAX_EQD;
|
|
- if (tx_eq->cur_eqd != tx_cur) {
|
|
- status = be_cmd_modify_eqd(ctrl, tx_eq->q.id, tx_cur);
|
|
- if (!status)
|
|
- tx_eq->cur_eqd = tx_cur;
|
|
- }
|
|
-
|
|
- if (rx_eq->enable_aic) {
|
|
- if (rx_max > BE_MAX_EQD)
|
|
- rx_max = BE_MAX_EQD;
|
|
- if (rx_min > rx_max)
|
|
- rx_min = rx_max;
|
|
- rx_eq->max_eqd = rx_max;
|
|
- rx_eq->min_eqd = rx_min;
|
|
- if (rx_eq->cur_eqd > rx_max)
|
|
- rx_eq->cur_eqd = rx_max;
|
|
- if (rx_eq->cur_eqd < rx_min)
|
|
- rx_eq->cur_eqd = rx_min;
|
|
- } else {
|
|
- if (rx_cur > BE_MAX_EQD)
|
|
- rx_cur = BE_MAX_EQD;
|
|
- if (rx_eq->cur_eqd != rx_cur) {
|
|
- status = be_cmd_modify_eqd(ctrl, rx_eq->q.id, rx_cur);
|
|
- if (!status)
|
|
- rx_eq->cur_eqd = rx_cur;
|
|
- }
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static u32 be_get_rx_csum(struct net_device *netdev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- return adapter->rx_csum;
|
|
-}
|
|
-
|
|
-static int be_set_rx_csum(struct net_device *netdev, uint32_t data)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- if (data)
|
|
- adapter->rx_csum = true;
|
|
- else
|
|
- adapter->rx_csum = false;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void
|
|
-be_get_ethtool_stats(struct net_device *netdev,
|
|
- struct ethtool_stats *stats, uint64_t *data)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct be_drvr_stats *drvr_stats = &adapter->stats.drvr_stats;
|
|
- struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va);
|
|
- struct be_rxf_stats *rxf_stats = &hw_stats->rxf;
|
|
- struct be_port_rxf_stats *port_stats =
|
|
- &rxf_stats->port[adapter->port_num];
|
|
- struct net_device_stats *net_stats = &adapter->stats.net_stats;
|
|
- struct be_erx_stats *erx_stats = &hw_stats->erx;
|
|
- void *p = NULL;
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < ETHTOOL_STATS_NUM; i++) {
|
|
- switch (et_stats[i].type) {
|
|
- case NETSTAT:
|
|
- p = net_stats;
|
|
- break;
|
|
- case DRVSTAT:
|
|
- p = drvr_stats;
|
|
- break;
|
|
- case PORTSTAT:
|
|
- p = port_stats;
|
|
- break;
|
|
- case MISCSTAT:
|
|
- p = rxf_stats;
|
|
- break;
|
|
- case ERXSTAT: /* Currently only one ERX stat is provided */
|
|
- p = (u32 *)erx_stats + adapter->rx_obj.q.id;
|
|
- break;
|
|
- }
|
|
-
|
|
- p = (u8 *)p + et_stats[i].offset;
|
|
- data[i] = (et_stats[i].size == sizeof(u64)) ?
|
|
- *(u64 *)p: *(u32 *)p;
|
|
- }
|
|
-
|
|
- return;
|
|
-}
|
|
-
|
|
-static void
|
|
-be_get_stat_strings(struct net_device *netdev, uint32_t stringset,
|
|
- uint8_t *data)
|
|
-{
|
|
- int i;
|
|
- switch (stringset) {
|
|
- case ETH_SS_STATS:
|
|
- for (i = 0; i < ETHTOOL_STATS_NUM; i++) {
|
|
- memcpy(data, et_stats[i].desc, ETH_GSTRING_LEN);
|
|
- data += ETH_GSTRING_LEN;
|
|
- }
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-static int be_get_stats_count(struct net_device *netdev)
|
|
-{
|
|
- return ETHTOOL_STATS_NUM;
|
|
-}
|
|
-
|
|
-static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
|
|
-{
|
|
- ecmd->speed = SPEED_10000;
|
|
- ecmd->duplex = DUPLEX_FULL;
|
|
- ecmd->autoneg = AUTONEG_DISABLE;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void
|
|
-be_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- ring->rx_max_pending = adapter->rx_obj.q.len;
|
|
- ring->tx_max_pending = adapter->tx_obj.q.len;
|
|
-
|
|
- ring->rx_pending = atomic_read(&adapter->rx_obj.q.used);
|
|
- ring->tx_pending = atomic_read(&adapter->tx_obj.q.used);
|
|
-}
|
|
-
|
|
-static void
|
|
-be_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- be_cmd_get_flow_control(&adapter->ctrl, &ecmd->tx_pause,
|
|
- &ecmd->rx_pause);
|
|
- ecmd->autoneg = AUTONEG_ENABLE;
|
|
-}
|
|
-
|
|
-static int
|
|
-be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- int status;
|
|
-
|
|
- if (ecmd->autoneg != AUTONEG_ENABLE)
|
|
- return -EINVAL;
|
|
-
|
|
- status = be_cmd_set_flow_control(&adapter->ctrl, ecmd->tx_pause,
|
|
- ecmd->rx_pause);
|
|
- if (!status)
|
|
- dev_warn(&adapter->pdev->dev, "Pause param set failed.\n");
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-struct ethtool_ops be_ethtool_ops = {
|
|
- .get_settings = be_get_settings,
|
|
- .get_drvinfo = be_get_drvinfo,
|
|
- .get_link = ethtool_op_get_link,
|
|
- .get_coalesce = be_get_coalesce,
|
|
- .set_coalesce = be_set_coalesce,
|
|
- .get_ringparam = be_get_ringparam,
|
|
- .get_pauseparam = be_get_pauseparam,
|
|
- .set_pauseparam = be_set_pauseparam,
|
|
- .get_rx_csum = be_get_rx_csum,
|
|
- .set_rx_csum = be_set_rx_csum,
|
|
- .get_tx_csum = ethtool_op_get_tx_csum,
|
|
- .set_tx_csum = ethtool_op_set_tx_csum,
|
|
- .get_sg = ethtool_op_get_sg,
|
|
- .set_sg = ethtool_op_set_sg,
|
|
- .get_tso = ethtool_op_get_tso,
|
|
- .set_tso = ethtool_op_set_tso,
|
|
- .get_strings = be_get_stat_strings,
|
|
- .get_stats_count = be_get_stats_count,
|
|
- .get_ethtool_stats = be_get_ethtool_stats,
|
|
-};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/benet/be.h linux-2.6.29-rc3.owrt/drivers/net/benet/be.h
|
|
--- linux-2.6.29.owrt/drivers/net/benet/be.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/benet/be.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,328 +0,0 @@
|
|
-/*
|
|
- * Copyright (C) 2005 - 2009 ServerEngines
|
|
- * All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or
|
|
- * modify it under the terms of the GNU General Public License version 2
|
|
- * as published by the Free Software Foundation. The full GNU General
|
|
- * Public License is included in this distribution in the file called COPYING.
|
|
- *
|
|
- * Contact Information:
|
|
- * linux-drivers@serverengines.com
|
|
- *
|
|
- * ServerEngines
|
|
- * 209 N. Fair Oaks Ave
|
|
- * Sunnyvale, CA 94085
|
|
- */
|
|
-
|
|
-#ifndef BE_H
|
|
-#define BE_H
|
|
-
|
|
-#include <linux/pci.h>
|
|
-#include <linux/etherdevice.h>
|
|
-#include <linux/version.h>
|
|
-#include <linux/delay.h>
|
|
-#include <net/tcp.h>
|
|
-#include <net/ip.h>
|
|
-#include <net/ipv6.h>
|
|
-#include <linux/if_vlan.h>
|
|
-#include <linux/workqueue.h>
|
|
-#include <linux/interrupt.h>
|
|
-#include <linux/inet_lro.h>
|
|
-
|
|
-#include "be_hw.h"
|
|
-
|
|
-#define DRV_VER "2.0.348"
|
|
-#define DRV_NAME "be2net"
|
|
-#define BE_NAME "ServerEngines BladeEngine2 10Gbps NIC"
|
|
-#define DRV_DESC BE_NAME "Driver"
|
|
-
|
|
-/* Number of bytes of an RX frame that are copied to skb->data */
|
|
-#define BE_HDR_LEN 64
|
|
-#define BE_MAX_JUMBO_FRAME_SIZE 9018
|
|
-#define BE_MIN_MTU 256
|
|
-
|
|
-#define BE_NUM_VLANS_SUPPORTED 64
|
|
-#define BE_MAX_EQD 96
|
|
-#define BE_MAX_TX_FRAG_COUNT 30
|
|
-
|
|
-#define EVNT_Q_LEN 1024
|
|
-#define TX_Q_LEN 2048
|
|
-#define TX_CQ_LEN 1024
|
|
-#define RX_Q_LEN 1024 /* Does not support any other value */
|
|
-#define RX_CQ_LEN 1024
|
|
-#define MCC_Q_LEN 64 /* total size not to exceed 8 pages */
|
|
-#define MCC_CQ_LEN 256
|
|
-
|
|
-#define BE_NAPI_WEIGHT 64
|
|
-#define MAX_RX_POST BE_NAPI_WEIGHT /* Frags posted at a time */
|
|
-#define RX_FRAGS_REFILL_WM (RX_Q_LEN - MAX_RX_POST)
|
|
-
|
|
-#define BE_MAX_LRO_DESCRIPTORS 16
|
|
-#define BE_MAX_FRAGS_PER_FRAME 16
|
|
-
|
|
-struct be_dma_mem {
|
|
- void *va;
|
|
- dma_addr_t dma;
|
|
- u32 size;
|
|
-};
|
|
-
|
|
-struct be_queue_info {
|
|
- struct be_dma_mem dma_mem;
|
|
- u16 len;
|
|
- u16 entry_size; /* Size of an element in the queue */
|
|
- u16 id;
|
|
- u16 tail, head;
|
|
- bool created;
|
|
- atomic_t used; /* Number of valid elements in the queue */
|
|
-};
|
|
-
|
|
-struct be_ctrl_info {
|
|
- u8 __iomem *csr;
|
|
- u8 __iomem *db; /* Door Bell */
|
|
- u8 __iomem *pcicfg; /* PCI config space */
|
|
- int pci_func;
|
|
-
|
|
- /* Mbox used for cmd request/response */
|
|
- spinlock_t cmd_lock; /* For serializing cmds to BE card */
|
|
- struct be_dma_mem mbox_mem;
|
|
- /* Mbox mem is adjusted to align to 16 bytes. The allocated addr
|
|
- * is stored for freeing purpose */
|
|
- struct be_dma_mem mbox_mem_alloced;
|
|
-};
|
|
-
|
|
-#include "be_cmds.h"
|
|
-
|
|
-struct be_drvr_stats {
|
|
- u32 be_tx_reqs; /* number of TX requests initiated */
|
|
- u32 be_tx_stops; /* number of times TX Q was stopped */
|
|
- u32 be_fwd_reqs; /* number of send reqs through forwarding i/f */
|
|
- u32 be_tx_wrbs; /* number of tx WRBs used */
|
|
- u32 be_tx_events; /* number of tx completion events */
|
|
- u32 be_tx_compl; /* number of tx completion entries processed */
|
|
- u64 be_tx_jiffies;
|
|
- ulong be_tx_bytes;
|
|
- ulong be_tx_bytes_prev;
|
|
- u32 be_tx_rate;
|
|
-
|
|
- u32 cache_barrier[16];
|
|
-
|
|
- u32 be_ethrx_post_fail;/* number of ethrx buffer alloc failures */
|
|
- u32 be_polls; /* number of times NAPI called poll function */
|
|
- u32 be_rx_events; /* number of ucast rx completion events */
|
|
- u32 be_rx_compl; /* number of rx completion entries processed */
|
|
- u32 be_lro_hgram_data[8]; /* histogram of LRO data packets */
|
|
- u32 be_lro_hgram_ack[8]; /* histogram of LRO ACKs */
|
|
- u64 be_rx_jiffies;
|
|
- ulong be_rx_bytes;
|
|
- ulong be_rx_bytes_prev;
|
|
- u32 be_rx_rate;
|
|
- /* number of non ether type II frames dropped where
|
|
- * frame len > length field of Mac Hdr */
|
|
- u32 be_802_3_dropped_frames;
|
|
- /* number of non ether type II frames malformed where
|
|
- * in frame len < length field of Mac Hdr */
|
|
- u32 be_802_3_malformed_frames;
|
|
- u32 be_rxcp_err; /* Num rx completion entries w/ err set. */
|
|
- ulong rx_fps_jiffies; /* jiffies at last FPS calc */
|
|
- u32 be_rx_frags;
|
|
- u32 be_prev_rx_frags;
|
|
- u32 be_rx_fps; /* Rx frags per second */
|
|
-};
|
|
-
|
|
-struct be_stats_obj {
|
|
- struct be_drvr_stats drvr_stats;
|
|
- struct net_device_stats net_stats;
|
|
- struct be_dma_mem cmd;
|
|
-};
|
|
-
|
|
-struct be_eq_obj {
|
|
- struct be_queue_info q;
|
|
- char desc[32];
|
|
-
|
|
- /* Adaptive interrupt coalescing (AIC) info */
|
|
- bool enable_aic;
|
|
- u16 min_eqd; /* in usecs */
|
|
- u16 max_eqd; /* in usecs */
|
|
- u16 cur_eqd; /* in usecs */
|
|
-
|
|
- struct napi_struct napi;
|
|
-};
|
|
-
|
|
-struct be_tx_obj {
|
|
- struct be_queue_info q;
|
|
- struct be_queue_info cq;
|
|
- /* Remember the skbs that were transmitted */
|
|
- struct sk_buff *sent_skb_list[TX_Q_LEN];
|
|
-};
|
|
-
|
|
-/* Struct to remember the pages posted for rx frags */
|
|
-struct be_rx_page_info {
|
|
- struct page *page;
|
|
- dma_addr_t bus;
|
|
- u16 page_offset;
|
|
- bool last_page_user;
|
|
-};
|
|
-
|
|
-struct be_rx_obj {
|
|
- struct be_queue_info q;
|
|
- struct be_queue_info cq;
|
|
- struct be_rx_page_info page_info_tbl[RX_Q_LEN];
|
|
- struct net_lro_mgr lro_mgr;
|
|
- struct net_lro_desc lro_desc[BE_MAX_LRO_DESCRIPTORS];
|
|
-};
|
|
-
|
|
-#define BE_NUM_MSIX_VECTORS 2 /* 1 each for Tx and Rx */
|
|
-struct be_adapter {
|
|
- struct pci_dev *pdev;
|
|
- struct net_device *netdev;
|
|
-
|
|
- /* Mbox, pci config, csr address information */
|
|
- struct be_ctrl_info ctrl;
|
|
-
|
|
- struct msix_entry msix_entries[BE_NUM_MSIX_VECTORS];
|
|
- bool msix_enabled;
|
|
- bool isr_registered;
|
|
-
|
|
- /* TX Rings */
|
|
- struct be_eq_obj tx_eq;
|
|
- struct be_tx_obj tx_obj;
|
|
-
|
|
- u32 cache_line_break[8];
|
|
-
|
|
- /* Rx rings */
|
|
- struct be_eq_obj rx_eq;
|
|
- struct be_rx_obj rx_obj;
|
|
- u32 big_page_size; /* Compounded page size shared by rx wrbs */
|
|
- bool rx_post_starved; /* Zero rx frags have been posted to BE */
|
|
-
|
|
- struct vlan_group *vlan_grp;
|
|
- u16 num_vlans;
|
|
- u8 vlan_tag[VLAN_GROUP_ARRAY_LEN];
|
|
-
|
|
- struct be_stats_obj stats;
|
|
- /* Work queue used to perform periodic tasks like getting statistics */
|
|
- struct delayed_work work;
|
|
-
|
|
- /* Ethtool knobs and info */
|
|
- bool rx_csum; /* BE card must perform rx-checksumming */
|
|
- u32 max_rx_coal;
|
|
- char fw_ver[FW_VER_LEN];
|
|
- u32 if_handle; /* Used to configure filtering */
|
|
- u32 pmac_id; /* MAC addr handle used by BE card */
|
|
-
|
|
- struct be_link_info link;
|
|
- u32 port_num;
|
|
-};
|
|
-
|
|
-extern struct ethtool_ops be_ethtool_ops;
|
|
-
|
|
-#define drvr_stats(adapter) (&adapter->stats.drvr_stats)
|
|
-
|
|
-#define BE_SET_NETDEV_OPS(netdev, ops) (netdev->netdev_ops = ops)
|
|
-
|
|
-static inline u32 MODULO(u16 val, u16 limit)
|
|
-{
|
|
- BUG_ON(limit & (limit - 1));
|
|
- return val & (limit - 1);
|
|
-}
|
|
-
|
|
-static inline void index_adv(u16 *index, u16 val, u16 limit)
|
|
-{
|
|
- *index = MODULO((*index + val), limit);
|
|
-}
|
|
-
|
|
-static inline void index_inc(u16 *index, u16 limit)
|
|
-{
|
|
- *index = MODULO((*index + 1), limit);
|
|
-}
|
|
-
|
|
-#define PAGE_SHIFT_4K 12
|
|
-#define PAGE_SIZE_4K (1 << PAGE_SHIFT_4K)
|
|
-
|
|
-/* Returns number of pages spanned by the data starting at the given addr */
|
|
-#define PAGES_4K_SPANNED(_address, size) \
|
|
- ((u32)((((size_t)(_address) & (PAGE_SIZE_4K - 1)) + \
|
|
- (size) + (PAGE_SIZE_4K - 1)) >> PAGE_SHIFT_4K))
|
|
-
|
|
-/* Byte offset into the page corresponding to given address */
|
|
-#define OFFSET_IN_PAGE(addr) \
|
|
- ((size_t)(addr) & (PAGE_SIZE_4K-1))
|
|
-
|
|
-/* Returns bit offset within a DWORD of a bitfield */
|
|
-#define AMAP_BIT_OFFSET(_struct, field) \
|
|
- (((size_t)&(((_struct *)0)->field))%32)
|
|
-
|
|
-/* Returns the bit mask of the field that is NOT shifted into location. */
|
|
-static inline u32 amap_mask(u32 bitsize)
|
|
-{
|
|
- return (bitsize == 32 ? 0xFFFFFFFF : (1 << bitsize) - 1);
|
|
-}
|
|
-
|
|
-static inline void
|
|
-amap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value)
|
|
-{
|
|
- u32 *dw = (u32 *) ptr + dw_offset;
|
|
- *dw &= ~(mask << offset);
|
|
- *dw |= (mask & value) << offset;
|
|
-}
|
|
-
|
|
-#define AMAP_SET_BITS(_struct, field, ptr, val) \
|
|
- amap_set(ptr, \
|
|
- offsetof(_struct, field)/32, \
|
|
- amap_mask(sizeof(((_struct *)0)->field)), \
|
|
- AMAP_BIT_OFFSET(_struct, field), \
|
|
- val)
|
|
-
|
|
-static inline u32 amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset)
|
|
-{
|
|
- u32 *dw = (u32 *) ptr;
|
|
- return mask & (*(dw + dw_offset) >> offset);
|
|
-}
|
|
-
|
|
-#define AMAP_GET_BITS(_struct, field, ptr) \
|
|
- amap_get(ptr, \
|
|
- offsetof(_struct, field)/32, \
|
|
- amap_mask(sizeof(((_struct *)0)->field)), \
|
|
- AMAP_BIT_OFFSET(_struct, field))
|
|
-
|
|
-#define be_dws_cpu_to_le(wrb, len) swap_dws(wrb, len)
|
|
-#define be_dws_le_to_cpu(wrb, len) swap_dws(wrb, len)
|
|
-static inline void swap_dws(void *wrb, int len)
|
|
-{
|
|
-#ifdef __BIG_ENDIAN
|
|
- u32 *dw = wrb;
|
|
- BUG_ON(len % 4);
|
|
- do {
|
|
- *dw = cpu_to_le32(*dw);
|
|
- dw++;
|
|
- len -= 4;
|
|
- } while (len);
|
|
-#endif /* __BIG_ENDIAN */
|
|
-}
|
|
-
|
|
-static inline u8 is_tcp_pkt(struct sk_buff *skb)
|
|
-{
|
|
- u8 val = 0;
|
|
-
|
|
- if (ip_hdr(skb)->version == 4)
|
|
- val = (ip_hdr(skb)->protocol == IPPROTO_TCP);
|
|
- else if (ip_hdr(skb)->version == 6)
|
|
- val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_TCP);
|
|
-
|
|
- return val;
|
|
-}
|
|
-
|
|
-static inline u8 is_udp_pkt(struct sk_buff *skb)
|
|
-{
|
|
- u8 val = 0;
|
|
-
|
|
- if (ip_hdr(skb)->version == 4)
|
|
- val = (ip_hdr(skb)->protocol == IPPROTO_UDP);
|
|
- else if (ip_hdr(skb)->version == 6)
|
|
- val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_UDP);
|
|
-
|
|
- return val;
|
|
-}
|
|
-
|
|
-#endif /* BE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/benet/be_hw.h linux-2.6.29-rc3.owrt/drivers/net/benet/be_hw.h
|
|
--- linux-2.6.29.owrt/drivers/net/benet/be_hw.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_hw.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,211 +0,0 @@
|
|
-/*
|
|
- * Copyright (C) 2005 - 2009 ServerEngines
|
|
- * All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or
|
|
- * modify it under the terms of the GNU General Public License version 2
|
|
- * as published by the Free Software Foundation. The full GNU General
|
|
- * Public License is included in this distribution in the file called COPYING.
|
|
- *
|
|
- * Contact Information:
|
|
- * linux-drivers@serverengines.com
|
|
- *
|
|
- * ServerEngines
|
|
- * 209 N. Fair Oaks Ave
|
|
- * Sunnyvale, CA 94085
|
|
- */
|
|
-
|
|
-/********* Mailbox door bell *************/
|
|
-/* Used for driver communication with the FW.
|
|
- * The software must write this register twice to post any command. First,
|
|
- * it writes the register with hi=1 and the upper bits of the physical address
|
|
- * for the MAILBOX structure. Software must poll the ready bit until this
|
|
- * is acknowledged. Then, sotware writes the register with hi=0 with the lower
|
|
- * bits in the address. It must poll the ready bit until the command is
|
|
- * complete. Upon completion, the MAILBOX will contain a valid completion
|
|
- * queue entry.
|
|
- */
|
|
-#define MPU_MAILBOX_DB_OFFSET 0x160
|
|
-#define MPU_MAILBOX_DB_RDY_MASK 0x1 /* bit 0 */
|
|
-#define MPU_MAILBOX_DB_HI_MASK 0x2 /* bit 1 */
|
|
-
|
|
-#define MPU_EP_CONTROL 0
|
|
-
|
|
-/********** MPU semphore ******************/
|
|
-#define MPU_EP_SEMAPHORE_OFFSET 0xac
|
|
-#define EP_SEMAPHORE_POST_STAGE_MASK 0x0000FFFF
|
|
-#define EP_SEMAPHORE_POST_ERR_MASK 0x1
|
|
-#define EP_SEMAPHORE_POST_ERR_SHIFT 31
|
|
-/* MPU semphore POST stage values */
|
|
-#define POST_STAGE_AWAITING_HOST_RDY 0x1 /* FW awaiting goahead from host */
|
|
-#define POST_STAGE_HOST_RDY 0x2 /* Host has given go-ahed to FW */
|
|
-#define POST_STAGE_BE_RESET 0x3 /* Host wants to reset chip */
|
|
-#define POST_STAGE_ARMFW_RDY 0xc000 /* FW is done with POST */
|
|
-
|
|
-/********* Memory BAR register ************/
|
|
-#define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET 0xfc
|
|
-/* Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt
|
|
- * Disable" may still globally block interrupts in addition to individual
|
|
- * interrupt masks; a mechanism for the device driver to block all interrupts
|
|
- * atomically without having to arbitrate for the PCI Interrupt Disable bit
|
|
- * with the OS.
|
|
- */
|
|
-#define MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK (1 << 29) /* bit 29 */
|
|
-/* PCI physical function number */
|
|
-#define MEMBAR_CTRL_INT_CTRL_PFUNC_MASK 0x7 /* bits 26 - 28 */
|
|
-#define MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT 26
|
|
-
|
|
-/********* Event Q door bell *************/
|
|
-#define DB_EQ_OFFSET DB_CQ_OFFSET
|
|
-#define DB_EQ_RING_ID_MASK 0x1FF /* bits 0 - 8 */
|
|
-/* Clear the interrupt for this eq */
|
|
-#define DB_EQ_CLR_SHIFT (9) /* bit 9 */
|
|
-/* Must be 1 */
|
|
-#define DB_EQ_EVNT_SHIFT (10) /* bit 10 */
|
|
-/* Number of event entries processed */
|
|
-#define DB_EQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */
|
|
-/* Rearm bit */
|
|
-#define DB_EQ_REARM_SHIFT (29) /* bit 29 */
|
|
-
|
|
-/********* Compl Q door bell *************/
|
|
-#define DB_CQ_OFFSET 0x120
|
|
-#define DB_CQ_RING_ID_MASK 0x3FF /* bits 0 - 9 */
|
|
-/* Number of event entries processed */
|
|
-#define DB_CQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */
|
|
-/* Rearm bit */
|
|
-#define DB_CQ_REARM_SHIFT (29) /* bit 29 */
|
|
-
|
|
-/********** TX ULP door bell *************/
|
|
-#define DB_TXULP1_OFFSET 0x60
|
|
-#define DB_TXULP_RING_ID_MASK 0x7FF /* bits 0 - 10 */
|
|
-/* Number of tx entries posted */
|
|
-#define DB_TXULP_NUM_POSTED_SHIFT (16) /* bits 16 - 29 */
|
|
-#define DB_TXULP_NUM_POSTED_MASK 0x3FFF /* bits 16 - 29 */
|
|
-
|
|
-/********** RQ(erx) door bell ************/
|
|
-#define DB_RQ_OFFSET 0x100
|
|
-#define DB_RQ_RING_ID_MASK 0x3FF /* bits 0 - 9 */
|
|
-/* Number of rx frags posted */
|
|
-#define DB_RQ_NUM_POSTED_SHIFT (24) /* bits 24 - 31 */
|
|
-
|
|
-/*
|
|
- * BE descriptors: host memory data structures whose formats
|
|
- * are hardwired in BE silicon.
|
|
- */
|
|
-/* Event Queue Descriptor */
|
|
-#define EQ_ENTRY_VALID_MASK 0x1 /* bit 0 */
|
|
-#define EQ_ENTRY_RES_ID_MASK 0xFFFF /* bits 16 - 31 */
|
|
-#define EQ_ENTRY_RES_ID_SHIFT 16
|
|
-struct be_eq_entry {
|
|
- u32 evt;
|
|
-};
|
|
-
|
|
-/* TX Queue Descriptor */
|
|
-#define ETH_WRB_FRAG_LEN_MASK 0xFFFF
|
|
-struct be_eth_wrb {
|
|
- u32 frag_pa_hi; /* dword 0 */
|
|
- u32 frag_pa_lo; /* dword 1 */
|
|
- u32 rsvd0; /* dword 2 */
|
|
- u32 frag_len; /* dword 3: bits 0 - 15 */
|
|
-} __packed;
|
|
-
|
|
-/* Pseudo amap definition for eth_hdr_wrb in which each bit of the
|
|
- * actual structure is defined as a byte : used to calculate
|
|
- * offset/shift/mask of each field */
|
|
-struct amap_eth_hdr_wrb {
|
|
- u8 rsvd0[32]; /* dword 0 */
|
|
- u8 rsvd1[32]; /* dword 1 */
|
|
- u8 complete; /* dword 2 */
|
|
- u8 event;
|
|
- u8 crc;
|
|
- u8 forward;
|
|
- u8 ipsec;
|
|
- u8 mgmt;
|
|
- u8 ipcs;
|
|
- u8 udpcs;
|
|
- u8 tcpcs;
|
|
- u8 lso;
|
|
- u8 vlan;
|
|
- u8 gso[2];
|
|
- u8 num_wrb[5];
|
|
- u8 lso_mss[14];
|
|
- u8 len[16]; /* dword 3 */
|
|
- u8 vlan_tag[16];
|
|
-} __packed;
|
|
-
|
|
-struct be_eth_hdr_wrb {
|
|
- u32 dw[4];
|
|
-};
|
|
-
|
|
-/* TX Compl Queue Descriptor */
|
|
-
|
|
-/* Pseudo amap definition for eth_tx_compl in which each bit of the
|
|
- * actual structure is defined as a byte: used to calculate
|
|
- * offset/shift/mask of each field */
|
|
-struct amap_eth_tx_compl {
|
|
- u8 wrb_index[16]; /* dword 0 */
|
|
- u8 ct[2]; /* dword 0 */
|
|
- u8 port[2]; /* dword 0 */
|
|
- u8 rsvd0[8]; /* dword 0 */
|
|
- u8 status[4]; /* dword 0 */
|
|
- u8 user_bytes[16]; /* dword 1 */
|
|
- u8 nwh_bytes[8]; /* dword 1 */
|
|
- u8 lso; /* dword 1 */
|
|
- u8 cast_enc[2]; /* dword 1 */
|
|
- u8 rsvd1[5]; /* dword 1 */
|
|
- u8 rsvd2[32]; /* dword 2 */
|
|
- u8 pkts[16]; /* dword 3 */
|
|
- u8 ringid[11]; /* dword 3 */
|
|
- u8 hash_val[4]; /* dword 3 */
|
|
- u8 valid; /* dword 3 */
|
|
-} __packed;
|
|
-
|
|
-struct be_eth_tx_compl {
|
|
- u32 dw[4];
|
|
-};
|
|
-
|
|
-/* RX Queue Descriptor */
|
|
-struct be_eth_rx_d {
|
|
- u32 fragpa_hi;
|
|
- u32 fragpa_lo;
|
|
-};
|
|
-
|
|
-/* RX Compl Queue Descriptor */
|
|
-
|
|
-/* Pseudo amap definition for eth_rx_compl in which each bit of the
|
|
- * actual structure is defined as a byte: used to calculate
|
|
- * offset/shift/mask of each field */
|
|
-struct amap_eth_rx_compl {
|
|
- u8 vlan_tag[16]; /* dword 0 */
|
|
- u8 pktsize[14]; /* dword 0 */
|
|
- u8 port; /* dword 0 */
|
|
- u8 ip_opt; /* dword 0 */
|
|
- u8 err; /* dword 1 */
|
|
- u8 rsshp; /* dword 1 */
|
|
- u8 ipf; /* dword 1 */
|
|
- u8 tcpf; /* dword 1 */
|
|
- u8 udpf; /* dword 1 */
|
|
- u8 ipcksm; /* dword 1 */
|
|
- u8 l4_cksm; /* dword 1 */
|
|
- u8 ip_version; /* dword 1 */
|
|
- u8 macdst[6]; /* dword 1 */
|
|
- u8 vtp; /* dword 1 */
|
|
- u8 rsvd0; /* dword 1 */
|
|
- u8 fragndx[10]; /* dword 1 */
|
|
- u8 ct[2]; /* dword 1 */
|
|
- u8 sw; /* dword 1 */
|
|
- u8 numfrags[3]; /* dword 1 */
|
|
- u8 rss_flush; /* dword 2 */
|
|
- u8 cast_enc[2]; /* dword 2 */
|
|
- u8 qnq; /* dword 2 */
|
|
- u8 rss_bank; /* dword 2 */
|
|
- u8 rsvd1[23]; /* dword 2 */
|
|
- u8 lro_pkt; /* dword 2 */
|
|
- u8 rsvd2[2]; /* dword 2 */
|
|
- u8 valid; /* dword 2 */
|
|
- u8 rsshash[32]; /* dword 3 */
|
|
-} __packed;
|
|
-
|
|
-struct be_eth_rx_compl {
|
|
- u32 dw[4];
|
|
-};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/benet/be_main.c linux-2.6.29-rc3.owrt/drivers/net/benet/be_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/benet/be_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_main.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,1911 +0,0 @@
|
|
-/*
|
|
- * Copyright (C) 2005 - 2009 ServerEngines
|
|
- * All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or
|
|
- * modify it under the terms of the GNU General Public License version 2
|
|
- * as published by the Free Software Foundation. The full GNU General
|
|
- * Public License is included in this distribution in the file called COPYING.
|
|
- *
|
|
- * Contact Information:
|
|
- * linux-drivers@serverengines.com
|
|
- *
|
|
- * ServerEngines
|
|
- * 209 N. Fair Oaks Ave
|
|
- * Sunnyvale, CA 94085
|
|
- */
|
|
-
|
|
-#include "be.h"
|
|
-
|
|
-MODULE_VERSION(DRV_VER);
|
|
-MODULE_DEVICE_TABLE(pci, be_dev_ids);
|
|
-MODULE_DESCRIPTION(DRV_DESC " " DRV_VER);
|
|
-MODULE_AUTHOR("ServerEngines Corporation");
|
|
-MODULE_LICENSE("GPL");
|
|
-
|
|
-static unsigned int rx_frag_size = 2048;
|
|
-module_param(rx_frag_size, uint, S_IRUGO);
|
|
-MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data.");
|
|
-
|
|
-#define BE_VENDOR_ID 0x19a2
|
|
-#define BE2_DEVICE_ID_1 0x0211
|
|
-static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = {
|
|
- { PCI_DEVICE(BE_VENDOR_ID, BE2_DEVICE_ID_1) },
|
|
- { 0 }
|
|
-};
|
|
-MODULE_DEVICE_TABLE(pci, be_dev_ids);
|
|
-
|
|
-static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q)
|
|
-{
|
|
- struct be_dma_mem *mem = &q->dma_mem;
|
|
- if (mem->va)
|
|
- pci_free_consistent(adapter->pdev, mem->size,
|
|
- mem->va, mem->dma);
|
|
-}
|
|
-
|
|
-static int be_queue_alloc(struct be_adapter *adapter, struct be_queue_info *q,
|
|
- u16 len, u16 entry_size)
|
|
-{
|
|
- struct be_dma_mem *mem = &q->dma_mem;
|
|
-
|
|
- memset(q, 0, sizeof(*q));
|
|
- q->len = len;
|
|
- q->entry_size = entry_size;
|
|
- mem->size = len * entry_size;
|
|
- mem->va = pci_alloc_consistent(adapter->pdev, mem->size, &mem->dma);
|
|
- if (!mem->va)
|
|
- return -1;
|
|
- memset(mem->va, 0, mem->size);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static inline void *queue_head_node(struct be_queue_info *q)
|
|
-{
|
|
- return q->dma_mem.va + q->head * q->entry_size;
|
|
-}
|
|
-
|
|
-static inline void *queue_tail_node(struct be_queue_info *q)
|
|
-{
|
|
- return q->dma_mem.va + q->tail * q->entry_size;
|
|
-}
|
|
-
|
|
-static inline void queue_head_inc(struct be_queue_info *q)
|
|
-{
|
|
- index_inc(&q->head, q->len);
|
|
-}
|
|
-
|
|
-static inline void queue_tail_inc(struct be_queue_info *q)
|
|
-{
|
|
- index_inc(&q->tail, q->len);
|
|
-}
|
|
-
|
|
-static void be_intr_set(struct be_ctrl_info *ctrl, bool enable)
|
|
-{
|
|
- u8 __iomem *addr = ctrl->pcicfg + PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET;
|
|
- u32 reg = ioread32(addr);
|
|
- u32 enabled = reg & MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
|
|
- if (!enabled && enable) {
|
|
- reg |= MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
|
|
- } else if (enabled && !enable) {
|
|
- reg &= ~MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
|
|
- } else {
|
|
- printk(KERN_WARNING DRV_NAME
|
|
- ": bad value in membar_int_ctrl reg=0x%x\n", reg);
|
|
- return;
|
|
- }
|
|
- iowrite32(reg, addr);
|
|
-}
|
|
-
|
|
-static void be_rxq_notify(struct be_ctrl_info *ctrl, u16 qid, u16 posted)
|
|
-{
|
|
- u32 val = 0;
|
|
- val |= qid & DB_RQ_RING_ID_MASK;
|
|
- val |= posted << DB_RQ_NUM_POSTED_SHIFT;
|
|
- iowrite32(val, ctrl->db + DB_RQ_OFFSET);
|
|
-}
|
|
-
|
|
-static void be_txq_notify(struct be_ctrl_info *ctrl, u16 qid, u16 posted)
|
|
-{
|
|
- u32 val = 0;
|
|
- val |= qid & DB_TXULP_RING_ID_MASK;
|
|
- val |= (posted & DB_TXULP_NUM_POSTED_MASK) << DB_TXULP_NUM_POSTED_SHIFT;
|
|
- iowrite32(val, ctrl->db + DB_TXULP1_OFFSET);
|
|
-}
|
|
-
|
|
-static void be_eq_notify(struct be_ctrl_info *ctrl, u16 qid,
|
|
- bool arm, bool clear_int, u16 num_popped)
|
|
-{
|
|
- u32 val = 0;
|
|
- val |= qid & DB_EQ_RING_ID_MASK;
|
|
- if (arm)
|
|
- val |= 1 << DB_EQ_REARM_SHIFT;
|
|
- if (clear_int)
|
|
- val |= 1 << DB_EQ_CLR_SHIFT;
|
|
- val |= 1 << DB_EQ_EVNT_SHIFT;
|
|
- val |= num_popped << DB_EQ_NUM_POPPED_SHIFT;
|
|
- iowrite32(val, ctrl->db + DB_EQ_OFFSET);
|
|
-}
|
|
-
|
|
-static void be_cq_notify(struct be_ctrl_info *ctrl, u16 qid,
|
|
- bool arm, u16 num_popped)
|
|
-{
|
|
- u32 val = 0;
|
|
- val |= qid & DB_CQ_RING_ID_MASK;
|
|
- if (arm)
|
|
- val |= 1 << DB_CQ_REARM_SHIFT;
|
|
- val |= num_popped << DB_CQ_NUM_POPPED_SHIFT;
|
|
- iowrite32(val, ctrl->db + DB_CQ_OFFSET);
|
|
-}
|
|
-
|
|
-
|
|
-static int be_mac_addr_set(struct net_device *netdev, void *p)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct sockaddr *addr = p;
|
|
- int status = 0;
|
|
-
|
|
- if (netif_running(netdev)) {
|
|
- status = be_cmd_pmac_del(&adapter->ctrl, adapter->if_handle,
|
|
- adapter->pmac_id);
|
|
- if (status)
|
|
- return status;
|
|
-
|
|
- status = be_cmd_pmac_add(&adapter->ctrl, (u8 *)addr->sa_data,
|
|
- adapter->if_handle, &adapter->pmac_id);
|
|
- }
|
|
-
|
|
- if (!status)
|
|
- memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-static void netdev_stats_update(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va);
|
|
- struct be_rxf_stats *rxf_stats = &hw_stats->rxf;
|
|
- struct be_port_rxf_stats *port_stats =
|
|
- &rxf_stats->port[adapter->port_num];
|
|
- struct net_device_stats *dev_stats = &adapter->stats.net_stats;
|
|
-
|
|
- dev_stats->rx_packets = port_stats->rx_total_frames;
|
|
- dev_stats->tx_packets = port_stats->tx_unicastframes +
|
|
- port_stats->tx_multicastframes + port_stats->tx_broadcastframes;
|
|
- dev_stats->rx_bytes = (u64) port_stats->rx_bytes_msd << 32 |
|
|
- (u64) port_stats->rx_bytes_lsd;
|
|
- dev_stats->tx_bytes = (u64) port_stats->tx_bytes_msd << 32 |
|
|
- (u64) port_stats->tx_bytes_lsd;
|
|
-
|
|
- /* bad pkts received */
|
|
- dev_stats->rx_errors = port_stats->rx_crc_errors +
|
|
- port_stats->rx_alignment_symbol_errors +
|
|
- port_stats->rx_in_range_errors +
|
|
- port_stats->rx_out_range_errors + port_stats->rx_frame_too_long;
|
|
-
|
|
- /* packet transmit problems */
|
|
- dev_stats->tx_errors = 0;
|
|
-
|
|
- /* no space in linux buffers */
|
|
- dev_stats->rx_dropped = 0;
|
|
-
|
|
- /* no space available in linux */
|
|
- dev_stats->tx_dropped = 0;
|
|
-
|
|
- dev_stats->multicast = port_stats->tx_multicastframes;
|
|
- dev_stats->collisions = 0;
|
|
-
|
|
- /* detailed rx errors */
|
|
- dev_stats->rx_length_errors = port_stats->rx_in_range_errors +
|
|
- port_stats->rx_out_range_errors + port_stats->rx_frame_too_long;
|
|
- /* receive ring buffer overflow */
|
|
- dev_stats->rx_over_errors = 0;
|
|
- dev_stats->rx_crc_errors = port_stats->rx_crc_errors;
|
|
-
|
|
- /* frame alignment errors */
|
|
- dev_stats->rx_frame_errors = port_stats->rx_alignment_symbol_errors;
|
|
- /* receiver fifo overrun */
|
|
- /* drops_no_pbuf is no per i/f, it's per BE card */
|
|
- dev_stats->rx_fifo_errors = port_stats->rx_fifo_overflow +
|
|
- port_stats->rx_input_fifo_overflow +
|
|
- rxf_stats->rx_drops_no_pbuf;
|
|
- /* receiver missed packetd */
|
|
- dev_stats->rx_missed_errors = 0;
|
|
- /* detailed tx_errors */
|
|
- dev_stats->tx_aborted_errors = 0;
|
|
- dev_stats->tx_carrier_errors = 0;
|
|
- dev_stats->tx_fifo_errors = 0;
|
|
- dev_stats->tx_heartbeat_errors = 0;
|
|
- dev_stats->tx_window_errors = 0;
|
|
-}
|
|
-
|
|
-static void be_link_status_update(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_link_info *prev = &adapter->link;
|
|
- struct be_link_info now = { 0 };
|
|
- struct net_device *netdev = adapter->netdev;
|
|
-
|
|
- be_cmd_link_status_query(&adapter->ctrl, &now);
|
|
-
|
|
- /* If link came up or went down */
|
|
- if (now.speed != prev->speed && (now.speed == PHY_LINK_SPEED_ZERO ||
|
|
- prev->speed == PHY_LINK_SPEED_ZERO)) {
|
|
- if (now.speed == PHY_LINK_SPEED_ZERO) {
|
|
- netif_stop_queue(netdev);
|
|
- netif_carrier_off(netdev);
|
|
- printk(KERN_INFO "%s: Link down\n", netdev->name);
|
|
- } else {
|
|
- netif_start_queue(netdev);
|
|
- netif_carrier_on(netdev);
|
|
- printk(KERN_INFO "%s: Link up\n", netdev->name);
|
|
- }
|
|
- }
|
|
- *prev = now;
|
|
-}
|
|
-
|
|
-/* Update the EQ delay n BE based on the RX frags consumed / sec */
|
|
-static void be_rx_eqd_update(struct be_adapter *adapter)
|
|
-{
|
|
- u32 eqd;
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
- struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
|
- struct be_drvr_stats *stats = &adapter->stats.drvr_stats;
|
|
-
|
|
- /* Update once a second */
|
|
- if (((jiffies - stats->rx_fps_jiffies) < HZ) || rx_eq->enable_aic == 0)
|
|
- return;
|
|
-
|
|
- stats->be_rx_fps = (stats->be_rx_frags - stats->be_prev_rx_frags) /
|
|
- ((jiffies - stats->rx_fps_jiffies) / HZ);
|
|
-
|
|
- stats->rx_fps_jiffies = jiffies;
|
|
- stats->be_prev_rx_frags = stats->be_rx_frags;
|
|
- eqd = stats->be_rx_fps / 110000;
|
|
- eqd = eqd << 3;
|
|
- if (eqd > rx_eq->max_eqd)
|
|
- eqd = rx_eq->max_eqd;
|
|
- if (eqd < rx_eq->min_eqd)
|
|
- eqd = rx_eq->min_eqd;
|
|
- if (eqd < 10)
|
|
- eqd = 0;
|
|
- if (eqd != rx_eq->cur_eqd)
|
|
- be_cmd_modify_eqd(ctrl, rx_eq->q.id, eqd);
|
|
-
|
|
- rx_eq->cur_eqd = eqd;
|
|
-}
|
|
-
|
|
-static struct net_device_stats *be_get_stats(struct net_device *dev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(dev);
|
|
-
|
|
- return &adapter->stats.net_stats;
|
|
-}
|
|
-
|
|
-static void be_tx_stats_update(struct be_adapter *adapter,
|
|
- u32 wrb_cnt, u32 copied, bool stopped)
|
|
-{
|
|
- struct be_drvr_stats *stats = &adapter->stats.drvr_stats;
|
|
- stats->be_tx_reqs++;
|
|
- stats->be_tx_wrbs += wrb_cnt;
|
|
- stats->be_tx_bytes += copied;
|
|
- if (stopped)
|
|
- stats->be_tx_stops++;
|
|
-
|
|
- /* Update tx rate once in two seconds */
|
|
- if ((jiffies - stats->be_tx_jiffies) > 2 * HZ) {
|
|
- u32 r;
|
|
- r = (stats->be_tx_bytes - stats->be_tx_bytes_prev) /
|
|
- ((u32) (jiffies - stats->be_tx_jiffies) / HZ);
|
|
- r = (r / 1000000); /* M bytes/s */
|
|
- stats->be_tx_rate = (r * 8); /* M bits/s */
|
|
- stats->be_tx_jiffies = jiffies;
|
|
- stats->be_tx_bytes_prev = stats->be_tx_bytes;
|
|
- }
|
|
-}
|
|
-
|
|
-/* Determine number of WRB entries needed to xmit data in an skb */
|
|
-static u32 wrb_cnt_for_skb(struct sk_buff *skb, bool *dummy)
|
|
-{
|
|
- int cnt = 0;
|
|
- while (skb) {
|
|
- if (skb->len > skb->data_len)
|
|
- cnt++;
|
|
- cnt += skb_shinfo(skb)->nr_frags;
|
|
- skb = skb_shinfo(skb)->frag_list;
|
|
- }
|
|
- /* to account for hdr wrb */
|
|
- cnt++;
|
|
- if (cnt & 1) {
|
|
- /* add a dummy to make it an even num */
|
|
- cnt++;
|
|
- *dummy = true;
|
|
- } else
|
|
- *dummy = false;
|
|
- BUG_ON(cnt > BE_MAX_TX_FRAG_COUNT);
|
|
- return cnt;
|
|
-}
|
|
-
|
|
-static inline void wrb_fill(struct be_eth_wrb *wrb, u64 addr, int len)
|
|
-{
|
|
- wrb->frag_pa_hi = upper_32_bits(addr);
|
|
- wrb->frag_pa_lo = addr & 0xFFFFFFFF;
|
|
- wrb->frag_len = len & ETH_WRB_FRAG_LEN_MASK;
|
|
-}
|
|
-
|
|
-static void wrb_fill_hdr(struct be_eth_hdr_wrb *hdr, struct sk_buff *skb,
|
|
- bool vlan, u32 wrb_cnt, u32 len)
|
|
-{
|
|
- memset(hdr, 0, sizeof(*hdr));
|
|
-
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, crc, hdr, 1);
|
|
-
|
|
- if (skb_shinfo(skb)->gso_segs > 1 && skb_shinfo(skb)->gso_size) {
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso, hdr, 1);
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso_mss,
|
|
- hdr, skb_shinfo(skb)->gso_size);
|
|
- } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
- if (is_tcp_pkt(skb))
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, tcpcs, hdr, 1);
|
|
- else if (is_udp_pkt(skb))
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, udpcs, hdr, 1);
|
|
- }
|
|
-
|
|
- if (vlan && vlan_tx_tag_present(skb)) {
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan, hdr, 1);
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan_tag,
|
|
- hdr, vlan_tx_tag_get(skb));
|
|
- }
|
|
-
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, event, hdr, 1);
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, complete, hdr, 1);
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, num_wrb, hdr, wrb_cnt);
|
|
- AMAP_SET_BITS(struct amap_eth_hdr_wrb, len, hdr, len);
|
|
-}
|
|
-
|
|
-
|
|
-static int make_tx_wrbs(struct be_adapter *adapter,
|
|
- struct sk_buff *skb, u32 wrb_cnt, bool dummy_wrb)
|
|
-{
|
|
- u64 busaddr;
|
|
- u32 i, copied = 0;
|
|
- struct pci_dev *pdev = adapter->pdev;
|
|
- struct sk_buff *first_skb = skb;
|
|
- struct be_queue_info *txq = &adapter->tx_obj.q;
|
|
- struct be_eth_wrb *wrb;
|
|
- struct be_eth_hdr_wrb *hdr;
|
|
-
|
|
- atomic_add(wrb_cnt, &txq->used);
|
|
- hdr = queue_head_node(txq);
|
|
- queue_head_inc(txq);
|
|
-
|
|
- while (skb) {
|
|
- if (skb->len > skb->data_len) {
|
|
- int len = skb->len - skb->data_len;
|
|
- busaddr = pci_map_single(pdev, skb->data, len,
|
|
- PCI_DMA_TODEVICE);
|
|
- wrb = queue_head_node(txq);
|
|
- wrb_fill(wrb, busaddr, len);
|
|
- be_dws_cpu_to_le(wrb, sizeof(*wrb));
|
|
- queue_head_inc(txq);
|
|
- copied += len;
|
|
- }
|
|
-
|
|
- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
|
- struct skb_frag_struct *frag =
|
|
- &skb_shinfo(skb)->frags[i];
|
|
- busaddr = pci_map_page(pdev, frag->page,
|
|
- frag->page_offset,
|
|
- frag->size, PCI_DMA_TODEVICE);
|
|
- wrb = queue_head_node(txq);
|
|
- wrb_fill(wrb, busaddr, frag->size);
|
|
- be_dws_cpu_to_le(wrb, sizeof(*wrb));
|
|
- queue_head_inc(txq);
|
|
- copied += frag->size;
|
|
- }
|
|
- skb = skb_shinfo(skb)->frag_list;
|
|
- }
|
|
-
|
|
- if (dummy_wrb) {
|
|
- wrb = queue_head_node(txq);
|
|
- wrb_fill(wrb, 0, 0);
|
|
- be_dws_cpu_to_le(wrb, sizeof(*wrb));
|
|
- queue_head_inc(txq);
|
|
- }
|
|
-
|
|
- wrb_fill_hdr(hdr, first_skb, adapter->vlan_grp ? true : false,
|
|
- wrb_cnt, copied);
|
|
- be_dws_cpu_to_le(hdr, sizeof(*hdr));
|
|
-
|
|
- return copied;
|
|
-}
|
|
-
|
|
-static int be_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct be_tx_obj *tx_obj = &adapter->tx_obj;
|
|
- struct be_queue_info *txq = &tx_obj->q;
|
|
- u32 wrb_cnt = 0, copied = 0;
|
|
- u32 start = txq->head;
|
|
- bool dummy_wrb, stopped = false;
|
|
-
|
|
- wrb_cnt = wrb_cnt_for_skb(skb, &dummy_wrb);
|
|
-
|
|
- copied = make_tx_wrbs(adapter, skb, wrb_cnt, dummy_wrb);
|
|
-
|
|
- /* record the sent skb in the sent_skb table */
|
|
- BUG_ON(tx_obj->sent_skb_list[start]);
|
|
- tx_obj->sent_skb_list[start] = skb;
|
|
-
|
|
- /* Ensure that txq has space for the next skb; Else stop the queue
|
|
- * *BEFORE* ringing the tx doorbell, so that we serialze the
|
|
- * tx compls of the current transmit which'll wake up the queue
|
|
- */
|
|
- if ((BE_MAX_TX_FRAG_COUNT + atomic_read(&txq->used)) >= txq->len) {
|
|
- netif_stop_queue(netdev);
|
|
- stopped = true;
|
|
- }
|
|
-
|
|
- be_txq_notify(&adapter->ctrl, txq->id, wrb_cnt);
|
|
-
|
|
- netdev->trans_start = jiffies;
|
|
-
|
|
- be_tx_stats_update(adapter, wrb_cnt, copied, stopped);
|
|
- return NETDEV_TX_OK;
|
|
-}
|
|
-
|
|
-static int be_change_mtu(struct net_device *netdev, int new_mtu)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- if (new_mtu < BE_MIN_MTU ||
|
|
- new_mtu > BE_MAX_JUMBO_FRAME_SIZE) {
|
|
- dev_info(&adapter->pdev->dev,
|
|
- "MTU must be between %d and %d bytes\n",
|
|
- BE_MIN_MTU, BE_MAX_JUMBO_FRAME_SIZE);
|
|
- return -EINVAL;
|
|
- }
|
|
- dev_info(&adapter->pdev->dev, "MTU changed from %d to %d bytes\n",
|
|
- netdev->mtu, new_mtu);
|
|
- netdev->mtu = new_mtu;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * if there are BE_NUM_VLANS_SUPPORTED or lesser number of VLANS configured,
|
|
- * program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured,
|
|
- * set the BE in promiscuous VLAN mode.
|
|
- */
|
|
-static void be_vid_config(struct net_device *netdev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- u16 vtag[BE_NUM_VLANS_SUPPORTED];
|
|
- u16 ntags = 0, i;
|
|
-
|
|
- if (adapter->num_vlans <= BE_NUM_VLANS_SUPPORTED) {
|
|
- /* Construct VLAN Table to give to HW */
|
|
- for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
|
|
- if (adapter->vlan_tag[i]) {
|
|
- vtag[ntags] = cpu_to_le16(i);
|
|
- ntags++;
|
|
- }
|
|
- }
|
|
- be_cmd_vlan_config(&adapter->ctrl, adapter->if_handle,
|
|
- vtag, ntags, 1, 0);
|
|
- } else {
|
|
- be_cmd_vlan_config(&adapter->ctrl, adapter->if_handle,
|
|
- NULL, 0, 1, 1);
|
|
- }
|
|
-}
|
|
-
|
|
-static void be_vlan_register(struct net_device *netdev, struct vlan_group *grp)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
|
- struct be_eq_obj *tx_eq = &adapter->tx_eq;
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
-
|
|
- be_eq_notify(ctrl, rx_eq->q.id, false, false, 0);
|
|
- be_eq_notify(ctrl, tx_eq->q.id, false, false, 0);
|
|
- adapter->vlan_grp = grp;
|
|
- be_eq_notify(ctrl, rx_eq->q.id, true, false, 0);
|
|
- be_eq_notify(ctrl, tx_eq->q.id, true, false, 0);
|
|
-}
|
|
-
|
|
-static void be_vlan_add_vid(struct net_device *netdev, u16 vid)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- adapter->num_vlans++;
|
|
- adapter->vlan_tag[vid] = 1;
|
|
-
|
|
- be_vid_config(netdev);
|
|
-}
|
|
-
|
|
-static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- adapter->num_vlans--;
|
|
- adapter->vlan_tag[vid] = 0;
|
|
-
|
|
- vlan_group_set_device(adapter->vlan_grp, vid, NULL);
|
|
- be_vid_config(netdev);
|
|
-}
|
|
-
|
|
-static void be_set_multicast_filter(struct net_device *netdev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct dev_mc_list *mc_ptr;
|
|
- u8 mac_addr[32][ETH_ALEN];
|
|
- int i = 0;
|
|
-
|
|
- if (netdev->flags & IFF_ALLMULTI) {
|
|
- /* set BE in Multicast promiscuous */
|
|
- be_cmd_mcast_mac_set(&adapter->ctrl,
|
|
- adapter->if_handle, NULL, 0, true);
|
|
- return;
|
|
- }
|
|
-
|
|
- for (mc_ptr = netdev->mc_list; mc_ptr; mc_ptr = mc_ptr->next) {
|
|
- memcpy(&mac_addr[i][0], mc_ptr->dmi_addr, ETH_ALEN);
|
|
- if (++i >= 32) {
|
|
- be_cmd_mcast_mac_set(&adapter->ctrl,
|
|
- adapter->if_handle, &mac_addr[0][0], i, false);
|
|
- i = 0;
|
|
- }
|
|
-
|
|
- }
|
|
-
|
|
- if (i) {
|
|
- /* reset the promiscuous mode also. */
|
|
- be_cmd_mcast_mac_set(&adapter->ctrl,
|
|
- adapter->if_handle, &mac_addr[0][0], i, false);
|
|
- }
|
|
-}
|
|
-
|
|
-static void be_set_multicast_list(struct net_device *netdev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- if (netdev->flags & IFF_PROMISC) {
|
|
- be_cmd_promiscuous_config(&adapter->ctrl, adapter->port_num, 1);
|
|
- } else {
|
|
- be_cmd_promiscuous_config(&adapter->ctrl, adapter->port_num, 0);
|
|
- be_set_multicast_filter(netdev);
|
|
- }
|
|
-}
|
|
-
|
|
-static void be_rx_rate_update(struct be_adapter *adapter, u32 pktsize,
|
|
- u16 numfrags)
|
|
-{
|
|
- struct be_drvr_stats *stats = &adapter->stats.drvr_stats;
|
|
- u32 rate;
|
|
-
|
|
- stats->be_rx_compl++;
|
|
- stats->be_rx_frags += numfrags;
|
|
- stats->be_rx_bytes += pktsize;
|
|
-
|
|
- /* Update the rate once in two seconds */
|
|
- if ((jiffies - stats->be_rx_jiffies) < 2 * HZ)
|
|
- return;
|
|
-
|
|
- rate = (stats->be_rx_bytes - stats->be_rx_bytes_prev) /
|
|
- ((u32) (jiffies - stats->be_rx_jiffies) / HZ);
|
|
- rate = (rate / 1000000); /* MB/Sec */
|
|
- stats->be_rx_rate = (rate * 8); /* Mega Bits/Sec */
|
|
- stats->be_rx_jiffies = jiffies;
|
|
- stats->be_rx_bytes_prev = stats->be_rx_bytes;
|
|
-}
|
|
-
|
|
-static struct be_rx_page_info *
|
|
-get_rx_page_info(struct be_adapter *adapter, u16 frag_idx)
|
|
-{
|
|
- struct be_rx_page_info *rx_page_info;
|
|
- struct be_queue_info *rxq = &adapter->rx_obj.q;
|
|
-
|
|
- rx_page_info = &adapter->rx_obj.page_info_tbl[frag_idx];
|
|
- BUG_ON(!rx_page_info->page);
|
|
-
|
|
- if (rx_page_info->last_page_user)
|
|
- pci_unmap_page(adapter->pdev, pci_unmap_addr(rx_page_info, bus),
|
|
- adapter->big_page_size, PCI_DMA_FROMDEVICE);
|
|
-
|
|
- atomic_dec(&rxq->used);
|
|
- return rx_page_info;
|
|
-}
|
|
-
|
|
-/* Throwaway the data in the Rx completion */
|
|
-static void be_rx_compl_discard(struct be_adapter *adapter,
|
|
- struct be_eth_rx_compl *rxcp)
|
|
-{
|
|
- struct be_queue_info *rxq = &adapter->rx_obj.q;
|
|
- struct be_rx_page_info *page_info;
|
|
- u16 rxq_idx, i, num_rcvd;
|
|
-
|
|
- rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
|
|
- num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
|
|
-
|
|
- for (i = 0; i < num_rcvd; i++) {
|
|
- page_info = get_rx_page_info(adapter, rxq_idx);
|
|
- put_page(page_info->page);
|
|
- memset(page_info, 0, sizeof(*page_info));
|
|
- index_inc(&rxq_idx, rxq->len);
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * skb_fill_rx_data forms a complete skb for an ether frame
|
|
- * indicated by rxcp.
|
|
- */
|
|
-static void skb_fill_rx_data(struct be_adapter *adapter,
|
|
- struct sk_buff *skb, struct be_eth_rx_compl *rxcp)
|
|
-{
|
|
- struct be_queue_info *rxq = &adapter->rx_obj.q;
|
|
- struct be_rx_page_info *page_info;
|
|
- u16 rxq_idx, i, num_rcvd;
|
|
- u32 pktsize, hdr_len, curr_frag_len;
|
|
- u8 *start;
|
|
-
|
|
- rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
|
|
- pktsize = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp);
|
|
- num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
|
|
-
|
|
- page_info = get_rx_page_info(adapter, rxq_idx);
|
|
-
|
|
- start = page_address(page_info->page) + page_info->page_offset;
|
|
- prefetch(start);
|
|
-
|
|
- /* Copy data in the first descriptor of this completion */
|
|
- curr_frag_len = min(pktsize, rx_frag_size);
|
|
-
|
|
- /* Copy the header portion into skb_data */
|
|
- hdr_len = min((u32)BE_HDR_LEN, curr_frag_len);
|
|
- memcpy(skb->data, start, hdr_len);
|
|
- skb->len = curr_frag_len;
|
|
- if (curr_frag_len <= BE_HDR_LEN) { /* tiny packet */
|
|
- /* Complete packet has now been moved to data */
|
|
- put_page(page_info->page);
|
|
- skb->data_len = 0;
|
|
- skb->tail += curr_frag_len;
|
|
- } else {
|
|
- skb_shinfo(skb)->nr_frags = 1;
|
|
- skb_shinfo(skb)->frags[0].page = page_info->page;
|
|
- skb_shinfo(skb)->frags[0].page_offset =
|
|
- page_info->page_offset + hdr_len;
|
|
- skb_shinfo(skb)->frags[0].size = curr_frag_len - hdr_len;
|
|
- skb->data_len = curr_frag_len - hdr_len;
|
|
- skb->tail += hdr_len;
|
|
- }
|
|
- memset(page_info, 0, sizeof(*page_info));
|
|
-
|
|
- if (pktsize <= rx_frag_size) {
|
|
- BUG_ON(num_rcvd != 1);
|
|
- return;
|
|
- }
|
|
-
|
|
- /* More frags present for this completion */
|
|
- pktsize -= curr_frag_len; /* account for above copied frag */
|
|
- for (i = 1; i < num_rcvd; i++) {
|
|
- index_inc(&rxq_idx, rxq->len);
|
|
- page_info = get_rx_page_info(adapter, rxq_idx);
|
|
-
|
|
- curr_frag_len = min(pktsize, rx_frag_size);
|
|
-
|
|
- skb_shinfo(skb)->frags[i].page = page_info->page;
|
|
- skb_shinfo(skb)->frags[i].page_offset = page_info->page_offset;
|
|
- skb_shinfo(skb)->frags[i].size = curr_frag_len;
|
|
- skb->len += curr_frag_len;
|
|
- skb->data_len += curr_frag_len;
|
|
- skb_shinfo(skb)->nr_frags++;
|
|
- pktsize -= curr_frag_len;
|
|
-
|
|
- memset(page_info, 0, sizeof(*page_info));
|
|
- }
|
|
-
|
|
- be_rx_rate_update(adapter, pktsize, num_rcvd);
|
|
- return;
|
|
-}
|
|
-
|
|
-/* Process the RX completion indicated by rxcp when LRO is disabled */
|
|
-static void be_rx_compl_process(struct be_adapter *adapter,
|
|
- struct be_eth_rx_compl *rxcp)
|
|
-{
|
|
- struct sk_buff *skb;
|
|
- u32 vtp, vid;
|
|
- int l4_cksm;
|
|
-
|
|
- l4_cksm = AMAP_GET_BITS(struct amap_eth_rx_compl, l4_cksm, rxcp);
|
|
- vtp = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp);
|
|
-
|
|
- skb = netdev_alloc_skb(adapter->netdev, BE_HDR_LEN + NET_IP_ALIGN);
|
|
- if (!skb) {
|
|
- if (net_ratelimit())
|
|
- dev_warn(&adapter->pdev->dev, "skb alloc failed\n");
|
|
- be_rx_compl_discard(adapter, rxcp);
|
|
- return;
|
|
- }
|
|
-
|
|
- skb_reserve(skb, NET_IP_ALIGN);
|
|
-
|
|
- skb_fill_rx_data(adapter, skb, rxcp);
|
|
-
|
|
- if (l4_cksm && adapter->rx_csum)
|
|
- skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
- else
|
|
- skb->ip_summed = CHECKSUM_NONE;
|
|
-
|
|
- skb->truesize = skb->len + sizeof(struct sk_buff);
|
|
- skb->protocol = eth_type_trans(skb, adapter->netdev);
|
|
- skb->dev = adapter->netdev;
|
|
-
|
|
- if (vtp) {
|
|
- if (!adapter->vlan_grp || adapter->num_vlans == 0) {
|
|
- kfree_skb(skb);
|
|
- return;
|
|
- }
|
|
- vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp);
|
|
- vid = be16_to_cpu(vid);
|
|
- vlan_hwaccel_receive_skb(skb, adapter->vlan_grp, vid);
|
|
- } else {
|
|
- netif_receive_skb(skb);
|
|
- }
|
|
-
|
|
- adapter->netdev->last_rx = jiffies;
|
|
-
|
|
- return;
|
|
-}
|
|
-
|
|
-/* Process the RX completion indicated by rxcp when LRO is enabled */
|
|
-static void be_rx_compl_process_lro(struct be_adapter *adapter,
|
|
- struct be_eth_rx_compl *rxcp)
|
|
-{
|
|
- struct be_rx_page_info *page_info;
|
|
- struct skb_frag_struct rx_frags[BE_MAX_FRAGS_PER_FRAME];
|
|
- struct be_queue_info *rxq = &adapter->rx_obj.q;
|
|
- u32 num_rcvd, pkt_size, remaining, vlanf, curr_frag_len;
|
|
- u16 i, rxq_idx = 0, vid;
|
|
-
|
|
- num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
|
|
- pkt_size = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp);
|
|
- vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp);
|
|
- rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
|
|
-
|
|
- remaining = pkt_size;
|
|
- for (i = 0; i < num_rcvd; i++) {
|
|
- page_info = get_rx_page_info(adapter, rxq_idx);
|
|
-
|
|
- curr_frag_len = min(remaining, rx_frag_size);
|
|
-
|
|
- rx_frags[i].page = page_info->page;
|
|
- rx_frags[i].page_offset = page_info->page_offset;
|
|
- rx_frags[i].size = curr_frag_len;
|
|
- remaining -= curr_frag_len;
|
|
-
|
|
- index_inc(&rxq_idx, rxq->len);
|
|
-
|
|
- memset(page_info, 0, sizeof(*page_info));
|
|
- }
|
|
-
|
|
- if (likely(!vlanf)) {
|
|
- lro_receive_frags(&adapter->rx_obj.lro_mgr, rx_frags, pkt_size,
|
|
- pkt_size, NULL, 0);
|
|
- } else {
|
|
- vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp);
|
|
- vid = be16_to_cpu(vid);
|
|
-
|
|
- if (!adapter->vlan_grp || adapter->num_vlans == 0)
|
|
- return;
|
|
-
|
|
- lro_vlan_hwaccel_receive_frags(&adapter->rx_obj.lro_mgr,
|
|
- rx_frags, pkt_size, pkt_size, adapter->vlan_grp,
|
|
- vid, NULL, 0);
|
|
- }
|
|
-
|
|
- be_rx_rate_update(adapter, pkt_size, num_rcvd);
|
|
- return;
|
|
-}
|
|
-
|
|
-static struct be_eth_rx_compl *be_rx_compl_get(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_eth_rx_compl *rxcp = queue_tail_node(&adapter->rx_obj.cq);
|
|
-
|
|
- if (rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] == 0)
|
|
- return NULL;
|
|
-
|
|
- be_dws_le_to_cpu(rxcp, sizeof(*rxcp));
|
|
-
|
|
- rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] = 0;
|
|
-
|
|
- queue_tail_inc(&adapter->rx_obj.cq);
|
|
- return rxcp;
|
|
-}
|
|
-
|
|
-static inline struct page *be_alloc_pages(u32 size)
|
|
-{
|
|
- gfp_t alloc_flags = GFP_ATOMIC;
|
|
- u32 order = get_order(size);
|
|
- if (order > 0)
|
|
- alloc_flags |= __GFP_COMP;
|
|
- return alloc_pages(alloc_flags, order);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Allocate a page, split it to fragments of size rx_frag_size and post as
|
|
- * receive buffers to BE
|
|
- */
|
|
-static void be_post_rx_frags(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_rx_page_info *page_info_tbl = adapter->rx_obj.page_info_tbl;
|
|
- struct be_rx_page_info *page_info = NULL;
|
|
- struct be_queue_info *rxq = &adapter->rx_obj.q;
|
|
- struct page *pagep = NULL;
|
|
- struct be_eth_rx_d *rxd;
|
|
- u64 page_dmaaddr = 0, frag_dmaaddr;
|
|
- u32 posted, page_offset = 0;
|
|
-
|
|
-
|
|
- page_info = &page_info_tbl[rxq->head];
|
|
- for (posted = 0; posted < MAX_RX_POST && !page_info->page; posted++) {
|
|
- if (!pagep) {
|
|
- pagep = be_alloc_pages(adapter->big_page_size);
|
|
- if (unlikely(!pagep)) {
|
|
- drvr_stats(adapter)->be_ethrx_post_fail++;
|
|
- break;
|
|
- }
|
|
- page_dmaaddr = pci_map_page(adapter->pdev, pagep, 0,
|
|
- adapter->big_page_size,
|
|
- PCI_DMA_FROMDEVICE);
|
|
- page_info->page_offset = 0;
|
|
- } else {
|
|
- get_page(pagep);
|
|
- page_info->page_offset = page_offset + rx_frag_size;
|
|
- }
|
|
- page_offset = page_info->page_offset;
|
|
- page_info->page = pagep;
|
|
- pci_unmap_addr_set(page_info, bus, page_dmaaddr);
|
|
- frag_dmaaddr = page_dmaaddr + page_info->page_offset;
|
|
-
|
|
- rxd = queue_head_node(rxq);
|
|
- rxd->fragpa_lo = cpu_to_le32(frag_dmaaddr & 0xFFFFFFFF);
|
|
- rxd->fragpa_hi = cpu_to_le32(upper_32_bits(frag_dmaaddr));
|
|
- queue_head_inc(rxq);
|
|
-
|
|
- /* Any space left in the current big page for another frag? */
|
|
- if ((page_offset + rx_frag_size + rx_frag_size) >
|
|
- adapter->big_page_size) {
|
|
- pagep = NULL;
|
|
- page_info->last_page_user = true;
|
|
- }
|
|
- page_info = &page_info_tbl[rxq->head];
|
|
- }
|
|
- if (pagep)
|
|
- page_info->last_page_user = true;
|
|
-
|
|
- if (posted) {
|
|
- atomic_add(posted, &rxq->used);
|
|
- be_rxq_notify(&adapter->ctrl, rxq->id, posted);
|
|
- } else if (atomic_read(&rxq->used) == 0) {
|
|
- /* Let be_worker replenish when memory is available */
|
|
- adapter->rx_post_starved = true;
|
|
- }
|
|
-
|
|
- return;
|
|
-}
|
|
-
|
|
-static struct be_eth_tx_compl *
|
|
-be_tx_compl_get(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_queue_info *tx_cq = &adapter->tx_obj.cq;
|
|
- struct be_eth_tx_compl *txcp = queue_tail_node(tx_cq);
|
|
-
|
|
- if (txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] == 0)
|
|
- return NULL;
|
|
-
|
|
- be_dws_le_to_cpu(txcp, sizeof(*txcp));
|
|
-
|
|
- txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] = 0;
|
|
-
|
|
- queue_tail_inc(tx_cq);
|
|
- return txcp;
|
|
-}
|
|
-
|
|
-static void be_tx_compl_process(struct be_adapter *adapter, u16 last_index)
|
|
-{
|
|
- struct be_queue_info *txq = &adapter->tx_obj.q;
|
|
- struct be_eth_wrb *wrb;
|
|
- struct sk_buff **sent_skbs = adapter->tx_obj.sent_skb_list;
|
|
- struct sk_buff *sent_skb;
|
|
- u64 busaddr;
|
|
- u16 cur_index, num_wrbs = 0;
|
|
-
|
|
- cur_index = txq->tail;
|
|
- sent_skb = sent_skbs[cur_index];
|
|
- BUG_ON(!sent_skb);
|
|
- sent_skbs[cur_index] = NULL;
|
|
-
|
|
- do {
|
|
- cur_index = txq->tail;
|
|
- wrb = queue_tail_node(txq);
|
|
- be_dws_le_to_cpu(wrb, sizeof(*wrb));
|
|
- busaddr = ((u64)wrb->frag_pa_hi << 32) | (u64)wrb->frag_pa_lo;
|
|
- if (busaddr != 0) {
|
|
- pci_unmap_single(adapter->pdev, busaddr,
|
|
- wrb->frag_len, PCI_DMA_TODEVICE);
|
|
- }
|
|
- num_wrbs++;
|
|
- queue_tail_inc(txq);
|
|
- } while (cur_index != last_index);
|
|
-
|
|
- atomic_sub(num_wrbs, &txq->used);
|
|
-
|
|
- kfree_skb(sent_skb);
|
|
-}
|
|
-
|
|
-static void be_rx_q_clean(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_rx_page_info *page_info;
|
|
- struct be_queue_info *rxq = &adapter->rx_obj.q;
|
|
- struct be_queue_info *rx_cq = &adapter->rx_obj.cq;
|
|
- struct be_eth_rx_compl *rxcp;
|
|
- u16 tail;
|
|
-
|
|
- /* First cleanup pending rx completions */
|
|
- while ((rxcp = be_rx_compl_get(adapter)) != NULL) {
|
|
- be_rx_compl_discard(adapter, rxcp);
|
|
- be_cq_notify(&adapter->ctrl, rx_cq->id, true, 1);
|
|
- }
|
|
-
|
|
- /* Then free posted rx buffer that were not used */
|
|
- tail = (rxq->head + rxq->len - atomic_read(&rxq->used)) % rxq->len;
|
|
- for (; tail != rxq->head; index_inc(&tail, rxq->len)) {
|
|
- page_info = get_rx_page_info(adapter, tail);
|
|
- put_page(page_info->page);
|
|
- memset(page_info, 0, sizeof(*page_info));
|
|
- }
|
|
- BUG_ON(atomic_read(&rxq->used));
|
|
-}
|
|
-
|
|
-static void be_tx_q_clean(struct be_adapter *adapter)
|
|
-{
|
|
- struct sk_buff **sent_skbs = adapter->tx_obj.sent_skb_list;
|
|
- struct sk_buff *sent_skb;
|
|
- struct be_queue_info *txq = &adapter->tx_obj.q;
|
|
- u16 last_index;
|
|
- bool dummy_wrb;
|
|
-
|
|
- while (atomic_read(&txq->used)) {
|
|
- sent_skb = sent_skbs[txq->tail];
|
|
- last_index = txq->tail;
|
|
- index_adv(&last_index,
|
|
- wrb_cnt_for_skb(sent_skb, &dummy_wrb) - 1, txq->len);
|
|
- be_tx_compl_process(adapter, last_index);
|
|
- }
|
|
-}
|
|
-
|
|
-static void be_tx_queues_destroy(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_queue_info *q;
|
|
-
|
|
- q = &adapter->tx_obj.q;
|
|
- if (q->created)
|
|
- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_TXQ);
|
|
- be_queue_free(adapter, q);
|
|
-
|
|
- q = &adapter->tx_obj.cq;
|
|
- if (q->created)
|
|
- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_CQ);
|
|
- be_queue_free(adapter, q);
|
|
-
|
|
- /* No more tx completions can be rcvd now; clean up if there are
|
|
- * any pending completions or pending tx requests */
|
|
- be_tx_q_clean(adapter);
|
|
-
|
|
- q = &adapter->tx_eq.q;
|
|
- if (q->created)
|
|
- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_EQ);
|
|
- be_queue_free(adapter, q);
|
|
-}
|
|
-
|
|
-static int be_tx_queues_create(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_queue_info *eq, *q, *cq;
|
|
-
|
|
- adapter->tx_eq.max_eqd = 0;
|
|
- adapter->tx_eq.min_eqd = 0;
|
|
- adapter->tx_eq.cur_eqd = 96;
|
|
- adapter->tx_eq.enable_aic = false;
|
|
- /* Alloc Tx Event queue */
|
|
- eq = &adapter->tx_eq.q;
|
|
- if (be_queue_alloc(adapter, eq, EVNT_Q_LEN, sizeof(struct be_eq_entry)))
|
|
- return -1;
|
|
-
|
|
- /* Ask BE to create Tx Event queue */
|
|
- if (be_cmd_eq_create(&adapter->ctrl, eq, adapter->tx_eq.cur_eqd))
|
|
- goto tx_eq_free;
|
|
- /* Alloc TX eth compl queue */
|
|
- cq = &adapter->tx_obj.cq;
|
|
- if (be_queue_alloc(adapter, cq, TX_CQ_LEN,
|
|
- sizeof(struct be_eth_tx_compl)))
|
|
- goto tx_eq_destroy;
|
|
-
|
|
- /* Ask BE to create Tx eth compl queue */
|
|
- if (be_cmd_cq_create(&adapter->ctrl, cq, eq, false, false, 3))
|
|
- goto tx_cq_free;
|
|
-
|
|
- /* Alloc TX eth queue */
|
|
- q = &adapter->tx_obj.q;
|
|
- if (be_queue_alloc(adapter, q, TX_Q_LEN, sizeof(struct be_eth_wrb)))
|
|
- goto tx_cq_destroy;
|
|
-
|
|
- /* Ask BE to create Tx eth queue */
|
|
- if (be_cmd_txq_create(&adapter->ctrl, q, cq))
|
|
- goto tx_q_free;
|
|
- return 0;
|
|
-
|
|
-tx_q_free:
|
|
- be_queue_free(adapter, q);
|
|
-tx_cq_destroy:
|
|
- be_cmd_q_destroy(&adapter->ctrl, cq, QTYPE_CQ);
|
|
-tx_cq_free:
|
|
- be_queue_free(adapter, cq);
|
|
-tx_eq_destroy:
|
|
- be_cmd_q_destroy(&adapter->ctrl, eq, QTYPE_EQ);
|
|
-tx_eq_free:
|
|
- be_queue_free(adapter, eq);
|
|
- return -1;
|
|
-}
|
|
-
|
|
-static void be_rx_queues_destroy(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_queue_info *q;
|
|
-
|
|
- q = &adapter->rx_obj.q;
|
|
- if (q->created) {
|
|
- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_RXQ);
|
|
- be_rx_q_clean(adapter);
|
|
- }
|
|
- be_queue_free(adapter, q);
|
|
-
|
|
- q = &adapter->rx_obj.cq;
|
|
- if (q->created)
|
|
- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_CQ);
|
|
- be_queue_free(adapter, q);
|
|
-
|
|
- q = &adapter->rx_eq.q;
|
|
- if (q->created)
|
|
- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_EQ);
|
|
- be_queue_free(adapter, q);
|
|
-}
|
|
-
|
|
-static int be_rx_queues_create(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_queue_info *eq, *q, *cq;
|
|
- int rc;
|
|
-
|
|
- adapter->max_rx_coal = BE_MAX_FRAGS_PER_FRAME;
|
|
- adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE;
|
|
- adapter->rx_eq.max_eqd = BE_MAX_EQD;
|
|
- adapter->rx_eq.min_eqd = 0;
|
|
- adapter->rx_eq.cur_eqd = 0;
|
|
- adapter->rx_eq.enable_aic = true;
|
|
-
|
|
- /* Alloc Rx Event queue */
|
|
- eq = &adapter->rx_eq.q;
|
|
- rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN,
|
|
- sizeof(struct be_eq_entry));
|
|
- if (rc)
|
|
- return rc;
|
|
-
|
|
- /* Ask BE to create Rx Event queue */
|
|
- rc = be_cmd_eq_create(&adapter->ctrl, eq, adapter->rx_eq.cur_eqd);
|
|
- if (rc)
|
|
- goto rx_eq_free;
|
|
-
|
|
- /* Alloc RX eth compl queue */
|
|
- cq = &adapter->rx_obj.cq;
|
|
- rc = be_queue_alloc(adapter, cq, RX_CQ_LEN,
|
|
- sizeof(struct be_eth_rx_compl));
|
|
- if (rc)
|
|
- goto rx_eq_destroy;
|
|
-
|
|
- /* Ask BE to create Rx eth compl queue */
|
|
- rc = be_cmd_cq_create(&adapter->ctrl, cq, eq, false, false, 3);
|
|
- if (rc)
|
|
- goto rx_cq_free;
|
|
-
|
|
- /* Alloc RX eth queue */
|
|
- q = &adapter->rx_obj.q;
|
|
- rc = be_queue_alloc(adapter, q, RX_Q_LEN, sizeof(struct be_eth_rx_d));
|
|
- if (rc)
|
|
- goto rx_cq_destroy;
|
|
-
|
|
- /* Ask BE to create Rx eth queue */
|
|
- rc = be_cmd_rxq_create(&adapter->ctrl, q, cq->id, rx_frag_size,
|
|
- BE_MAX_JUMBO_FRAME_SIZE, adapter->if_handle, false);
|
|
- if (rc)
|
|
- goto rx_q_free;
|
|
-
|
|
- return 0;
|
|
-rx_q_free:
|
|
- be_queue_free(adapter, q);
|
|
-rx_cq_destroy:
|
|
- be_cmd_q_destroy(&adapter->ctrl, cq, QTYPE_CQ);
|
|
-rx_cq_free:
|
|
- be_queue_free(adapter, cq);
|
|
-rx_eq_destroy:
|
|
- be_cmd_q_destroy(&adapter->ctrl, eq, QTYPE_EQ);
|
|
-rx_eq_free:
|
|
- be_queue_free(adapter, eq);
|
|
- return rc;
|
|
-}
|
|
-static bool event_get(struct be_eq_obj *eq_obj, u16 *rid)
|
|
-{
|
|
- struct be_eq_entry *entry = queue_tail_node(&eq_obj->q);
|
|
- u32 evt = entry->evt;
|
|
-
|
|
- if (!evt)
|
|
- return false;
|
|
-
|
|
- evt = le32_to_cpu(evt);
|
|
- *rid = (evt >> EQ_ENTRY_RES_ID_SHIFT) & EQ_ENTRY_RES_ID_MASK;
|
|
- entry->evt = 0;
|
|
- queue_tail_inc(&eq_obj->q);
|
|
- return true;
|
|
-}
|
|
-
|
|
-static int event_handle(struct be_ctrl_info *ctrl,
|
|
- struct be_eq_obj *eq_obj)
|
|
-{
|
|
- u16 rid = 0, num = 0;
|
|
-
|
|
- while (event_get(eq_obj, &rid))
|
|
- num++;
|
|
-
|
|
- /* We can see an interrupt and no event */
|
|
- be_eq_notify(ctrl, eq_obj->q.id, true, true, num);
|
|
- if (num)
|
|
- napi_schedule(&eq_obj->napi);
|
|
-
|
|
- return num;
|
|
-}
|
|
-
|
|
-static irqreturn_t be_intx(int irq, void *dev)
|
|
-{
|
|
- struct be_adapter *adapter = dev;
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
- int rx, tx;
|
|
-
|
|
- tx = event_handle(ctrl, &adapter->tx_eq);
|
|
- rx = event_handle(ctrl, &adapter->rx_eq);
|
|
-
|
|
- if (rx || tx)
|
|
- return IRQ_HANDLED;
|
|
- else
|
|
- return IRQ_NONE;
|
|
-}
|
|
-
|
|
-static irqreturn_t be_msix_rx(int irq, void *dev)
|
|
-{
|
|
- struct be_adapter *adapter = dev;
|
|
-
|
|
- event_handle(&adapter->ctrl, &adapter->rx_eq);
|
|
-
|
|
- return IRQ_HANDLED;
|
|
-}
|
|
-
|
|
-static irqreturn_t be_msix_tx(int irq, void *dev)
|
|
-{
|
|
- struct be_adapter *adapter = dev;
|
|
-
|
|
- event_handle(&adapter->ctrl, &adapter->tx_eq);
|
|
-
|
|
- return IRQ_HANDLED;
|
|
-}
|
|
-
|
|
-static inline bool do_lro(struct be_adapter *adapter,
|
|
- struct be_eth_rx_compl *rxcp)
|
|
-{
|
|
- int err = AMAP_GET_BITS(struct amap_eth_rx_compl, err, rxcp);
|
|
- int tcp_frame = AMAP_GET_BITS(struct amap_eth_rx_compl, tcpf, rxcp);
|
|
-
|
|
- if (err)
|
|
- drvr_stats(adapter)->be_rxcp_err++;
|
|
-
|
|
- return (!tcp_frame || err || (adapter->max_rx_coal <= 1)) ?
|
|
- false : true;
|
|
-}
|
|
-
|
|
-int be_poll_rx(struct napi_struct *napi, int budget)
|
|
-{
|
|
- struct be_eq_obj *rx_eq = container_of(napi, struct be_eq_obj, napi);
|
|
- struct be_adapter *adapter =
|
|
- container_of(rx_eq, struct be_adapter, rx_eq);
|
|
- struct be_queue_info *rx_cq = &adapter->rx_obj.cq;
|
|
- struct be_eth_rx_compl *rxcp;
|
|
- u32 work_done;
|
|
-
|
|
- for (work_done = 0; work_done < budget; work_done++) {
|
|
- rxcp = be_rx_compl_get(adapter);
|
|
- if (!rxcp)
|
|
- break;
|
|
-
|
|
- if (do_lro(adapter, rxcp))
|
|
- be_rx_compl_process_lro(adapter, rxcp);
|
|
- else
|
|
- be_rx_compl_process(adapter, rxcp);
|
|
- }
|
|
-
|
|
- lro_flush_all(&adapter->rx_obj.lro_mgr);
|
|
-
|
|
- /* Refill the queue */
|
|
- if (atomic_read(&adapter->rx_obj.q.used) < RX_FRAGS_REFILL_WM)
|
|
- be_post_rx_frags(adapter);
|
|
-
|
|
- /* All consumed */
|
|
- if (work_done < budget) {
|
|
- napi_complete(napi);
|
|
- be_cq_notify(&adapter->ctrl, rx_cq->id, true, work_done);
|
|
- } else {
|
|
- /* More to be consumed; continue with interrupts disabled */
|
|
- be_cq_notify(&adapter->ctrl, rx_cq->id, false, work_done);
|
|
- }
|
|
- return work_done;
|
|
-}
|
|
-
|
|
-/* For TX we don't honour budget; consume everything */
|
|
-int be_poll_tx(struct napi_struct *napi, int budget)
|
|
-{
|
|
- struct be_eq_obj *tx_eq = container_of(napi, struct be_eq_obj, napi);
|
|
- struct be_adapter *adapter =
|
|
- container_of(tx_eq, struct be_adapter, tx_eq);
|
|
- struct be_tx_obj *tx_obj = &adapter->tx_obj;
|
|
- struct be_queue_info *tx_cq = &tx_obj->cq;
|
|
- struct be_queue_info *txq = &tx_obj->q;
|
|
- struct be_eth_tx_compl *txcp;
|
|
- u32 num_cmpl = 0;
|
|
- u16 end_idx;
|
|
-
|
|
- while ((txcp = be_tx_compl_get(adapter))) {
|
|
- end_idx = AMAP_GET_BITS(struct amap_eth_tx_compl,
|
|
- wrb_index, txcp);
|
|
- be_tx_compl_process(adapter, end_idx);
|
|
- num_cmpl++;
|
|
- }
|
|
-
|
|
- /* As Tx wrbs have been freed up, wake up netdev queue if
|
|
- * it was stopped due to lack of tx wrbs.
|
|
- */
|
|
- if (netif_queue_stopped(adapter->netdev) &&
|
|
- atomic_read(&txq->used) < txq->len / 2) {
|
|
- netif_wake_queue(adapter->netdev);
|
|
- }
|
|
-
|
|
- napi_complete(napi);
|
|
-
|
|
- be_cq_notify(&adapter->ctrl, tx_cq->id, true, num_cmpl);
|
|
-
|
|
- drvr_stats(adapter)->be_tx_events++;
|
|
- drvr_stats(adapter)->be_tx_compl += num_cmpl;
|
|
-
|
|
- return 1;
|
|
-}
|
|
-
|
|
-static void be_worker(struct work_struct *work)
|
|
-{
|
|
- struct be_adapter *adapter =
|
|
- container_of(work, struct be_adapter, work.work);
|
|
- int status;
|
|
-
|
|
- /* Check link */
|
|
- be_link_status_update(adapter);
|
|
-
|
|
- /* Get Stats */
|
|
- status = be_cmd_get_stats(&adapter->ctrl, &adapter->stats.cmd);
|
|
- if (!status)
|
|
- netdev_stats_update(adapter);
|
|
-
|
|
- /* Set EQ delay */
|
|
- be_rx_eqd_update(adapter);
|
|
-
|
|
- if (adapter->rx_post_starved) {
|
|
- adapter->rx_post_starved = false;
|
|
- be_post_rx_frags(adapter);
|
|
- }
|
|
-
|
|
- schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
|
|
-}
|
|
-
|
|
-static void be_msix_enable(struct be_adapter *adapter)
|
|
-{
|
|
- int i, status;
|
|
-
|
|
- for (i = 0; i < BE_NUM_MSIX_VECTORS; i++)
|
|
- adapter->msix_entries[i].entry = i;
|
|
-
|
|
- status = pci_enable_msix(adapter->pdev, adapter->msix_entries,
|
|
- BE_NUM_MSIX_VECTORS);
|
|
- if (status == 0)
|
|
- adapter->msix_enabled = true;
|
|
- return;
|
|
-}
|
|
-
|
|
-static inline int be_msix_vec_get(struct be_adapter *adapter, u32 eq_id)
|
|
-{
|
|
- return adapter->msix_entries[eq_id -
|
|
- 8 * adapter->ctrl.pci_func].vector;
|
|
-}
|
|
-
|
|
-static int be_msix_register(struct be_adapter *adapter)
|
|
-{
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- struct be_eq_obj *tx_eq = &adapter->tx_eq;
|
|
- struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
|
- int status, vec;
|
|
-
|
|
- sprintf(tx_eq->desc, "%s-tx", netdev->name);
|
|
- vec = be_msix_vec_get(adapter, tx_eq->q.id);
|
|
- status = request_irq(vec, be_msix_tx, 0, tx_eq->desc, adapter);
|
|
- if (status)
|
|
- goto err;
|
|
-
|
|
- sprintf(rx_eq->desc, "%s-rx", netdev->name);
|
|
- vec = be_msix_vec_get(adapter, rx_eq->q.id);
|
|
- status = request_irq(vec, be_msix_rx, 0, rx_eq->desc, adapter);
|
|
- if (status) { /* Free TX IRQ */
|
|
- vec = be_msix_vec_get(adapter, tx_eq->q.id);
|
|
- free_irq(vec, adapter);
|
|
- goto err;
|
|
- }
|
|
- return 0;
|
|
-err:
|
|
- dev_warn(&adapter->pdev->dev,
|
|
- "MSIX Request IRQ failed - err %d\n", status);
|
|
- pci_disable_msix(adapter->pdev);
|
|
- adapter->msix_enabled = false;
|
|
- return status;
|
|
-}
|
|
-
|
|
-static int be_irq_register(struct be_adapter *adapter)
|
|
-{
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- int status;
|
|
-
|
|
- if (adapter->msix_enabled) {
|
|
- status = be_msix_register(adapter);
|
|
- if (status == 0)
|
|
- goto done;
|
|
- }
|
|
-
|
|
- /* INTx */
|
|
- netdev->irq = adapter->pdev->irq;
|
|
- status = request_irq(netdev->irq, be_intx, IRQF_SHARED, netdev->name,
|
|
- adapter);
|
|
- if (status) {
|
|
- dev_err(&adapter->pdev->dev,
|
|
- "INTx request IRQ failed - err %d\n", status);
|
|
- return status;
|
|
- }
|
|
-done:
|
|
- adapter->isr_registered = true;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void be_irq_unregister(struct be_adapter *adapter)
|
|
-{
|
|
- struct net_device *netdev = adapter->netdev;
|
|
- int vec;
|
|
-
|
|
- if (!adapter->isr_registered)
|
|
- return;
|
|
-
|
|
- /* INTx */
|
|
- if (!adapter->msix_enabled) {
|
|
- free_irq(netdev->irq, adapter);
|
|
- goto done;
|
|
- }
|
|
-
|
|
- /* MSIx */
|
|
- vec = be_msix_vec_get(adapter, adapter->tx_eq.q.id);
|
|
- free_irq(vec, adapter);
|
|
- vec = be_msix_vec_get(adapter, adapter->rx_eq.q.id);
|
|
- free_irq(vec, adapter);
|
|
-done:
|
|
- adapter->isr_registered = false;
|
|
- return;
|
|
-}
|
|
-
|
|
-static int be_open(struct net_device *netdev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
- struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
|
- struct be_eq_obj *tx_eq = &adapter->tx_eq;
|
|
- u32 if_flags;
|
|
- int status;
|
|
-
|
|
- if_flags = BE_IF_FLAGS_BROADCAST | BE_IF_FLAGS_PROMISCUOUS |
|
|
- BE_IF_FLAGS_MCAST_PROMISCUOUS | BE_IF_FLAGS_UNTAGGED |
|
|
- BE_IF_FLAGS_PASS_L3L4_ERRORS;
|
|
- status = be_cmd_if_create(ctrl, if_flags, netdev->dev_addr,
|
|
- false/* pmac_invalid */, &adapter->if_handle,
|
|
- &adapter->pmac_id);
|
|
- if (status != 0)
|
|
- goto do_none;
|
|
-
|
|
- be_vid_config(netdev);
|
|
-
|
|
- status = be_cmd_set_flow_control(ctrl, true, true);
|
|
- if (status != 0)
|
|
- goto if_destroy;
|
|
-
|
|
- status = be_tx_queues_create(adapter);
|
|
- if (status != 0)
|
|
- goto if_destroy;
|
|
-
|
|
- status = be_rx_queues_create(adapter);
|
|
- if (status != 0)
|
|
- goto tx_qs_destroy;
|
|
-
|
|
- /* First time posting */
|
|
- be_post_rx_frags(adapter);
|
|
-
|
|
- napi_enable(&rx_eq->napi);
|
|
- napi_enable(&tx_eq->napi);
|
|
-
|
|
- be_irq_register(adapter);
|
|
-
|
|
- be_intr_set(ctrl, true);
|
|
-
|
|
- /* The evt queues are created in the unarmed state; arm them */
|
|
- be_eq_notify(ctrl, rx_eq->q.id, true, false, 0);
|
|
- be_eq_notify(ctrl, tx_eq->q.id, true, false, 0);
|
|
-
|
|
- /* The compl queues are created in the unarmed state; arm them */
|
|
- be_cq_notify(ctrl, adapter->rx_obj.cq.id, true, 0);
|
|
- be_cq_notify(ctrl, adapter->tx_obj.cq.id, true, 0);
|
|
-
|
|
- be_link_status_update(adapter);
|
|
-
|
|
- schedule_delayed_work(&adapter->work, msecs_to_jiffies(100));
|
|
- return 0;
|
|
-
|
|
-tx_qs_destroy:
|
|
- be_tx_queues_destroy(adapter);
|
|
-if_destroy:
|
|
- be_cmd_if_destroy(ctrl, adapter->if_handle);
|
|
-do_none:
|
|
- return status;
|
|
-}
|
|
-
|
|
-static int be_close(struct net_device *netdev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
- struct be_eq_obj *rx_eq = &adapter->rx_eq;
|
|
- struct be_eq_obj *tx_eq = &adapter->tx_eq;
|
|
- int vec;
|
|
-
|
|
- cancel_delayed_work(&adapter->work);
|
|
-
|
|
- netif_stop_queue(netdev);
|
|
- netif_carrier_off(netdev);
|
|
- adapter->link.speed = PHY_LINK_SPEED_ZERO;
|
|
-
|
|
- be_intr_set(ctrl, false);
|
|
-
|
|
- if (adapter->msix_enabled) {
|
|
- vec = be_msix_vec_get(adapter, tx_eq->q.id);
|
|
- synchronize_irq(vec);
|
|
- vec = be_msix_vec_get(adapter, rx_eq->q.id);
|
|
- synchronize_irq(vec);
|
|
- } else {
|
|
- synchronize_irq(netdev->irq);
|
|
- }
|
|
- be_irq_unregister(adapter);
|
|
-
|
|
- napi_disable(&rx_eq->napi);
|
|
- napi_disable(&tx_eq->napi);
|
|
-
|
|
- be_rx_queues_destroy(adapter);
|
|
- be_tx_queues_destroy(adapter);
|
|
-
|
|
- be_cmd_if_destroy(ctrl, adapter->if_handle);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int be_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr,
|
|
- void **ip_hdr, void **tcpudp_hdr,
|
|
- u64 *hdr_flags, void *priv)
|
|
-{
|
|
- struct ethhdr *eh;
|
|
- struct vlan_ethhdr *veh;
|
|
- struct iphdr *iph;
|
|
- u8 *va = page_address(frag->page) + frag->page_offset;
|
|
- unsigned long ll_hlen;
|
|
-
|
|
- prefetch(va);
|
|
- eh = (struct ethhdr *)va;
|
|
- *mac_hdr = eh;
|
|
- ll_hlen = ETH_HLEN;
|
|
- if (eh->h_proto != htons(ETH_P_IP)) {
|
|
- if (eh->h_proto == htons(ETH_P_8021Q)) {
|
|
- veh = (struct vlan_ethhdr *)va;
|
|
- if (veh->h_vlan_encapsulated_proto != htons(ETH_P_IP))
|
|
- return -1;
|
|
-
|
|
- ll_hlen += VLAN_HLEN;
|
|
- } else {
|
|
- return -1;
|
|
- }
|
|
- }
|
|
- *hdr_flags = LRO_IPV4;
|
|
- iph = (struct iphdr *)(va + ll_hlen);
|
|
- *ip_hdr = iph;
|
|
- if (iph->protocol != IPPROTO_TCP)
|
|
- return -1;
|
|
- *hdr_flags |= LRO_TCP;
|
|
- *tcpudp_hdr = (u8 *) (*ip_hdr) + (iph->ihl << 2);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void be_lro_init(struct be_adapter *adapter, struct net_device *netdev)
|
|
-{
|
|
- struct net_lro_mgr *lro_mgr;
|
|
-
|
|
- lro_mgr = &adapter->rx_obj.lro_mgr;
|
|
- lro_mgr->dev = netdev;
|
|
- lro_mgr->features = LRO_F_NAPI;
|
|
- lro_mgr->ip_summed = CHECKSUM_UNNECESSARY;
|
|
- lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY;
|
|
- lro_mgr->max_desc = BE_MAX_LRO_DESCRIPTORS;
|
|
- lro_mgr->lro_arr = adapter->rx_obj.lro_desc;
|
|
- lro_mgr->get_frag_header = be_get_frag_header;
|
|
- lro_mgr->max_aggr = BE_MAX_FRAGS_PER_FRAME;
|
|
-}
|
|
-
|
|
-static struct net_device_ops be_netdev_ops = {
|
|
- .ndo_open = be_open,
|
|
- .ndo_stop = be_close,
|
|
- .ndo_start_xmit = be_xmit,
|
|
- .ndo_get_stats = be_get_stats,
|
|
- .ndo_set_rx_mode = be_set_multicast_list,
|
|
- .ndo_set_mac_address = be_mac_addr_set,
|
|
- .ndo_change_mtu = be_change_mtu,
|
|
- .ndo_validate_addr = eth_validate_addr,
|
|
- .ndo_vlan_rx_register = be_vlan_register,
|
|
- .ndo_vlan_rx_add_vid = be_vlan_add_vid,
|
|
- .ndo_vlan_rx_kill_vid = be_vlan_rem_vid,
|
|
-};
|
|
-
|
|
-static void be_netdev_init(struct net_device *netdev)
|
|
-{
|
|
- struct be_adapter *adapter = netdev_priv(netdev);
|
|
-
|
|
- netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
|
|
- NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM |
|
|
- NETIF_F_IPV6_CSUM | NETIF_F_TSO6;
|
|
-
|
|
- netdev->flags |= IFF_MULTICAST;
|
|
-
|
|
- BE_SET_NETDEV_OPS(netdev, &be_netdev_ops);
|
|
-
|
|
- SET_ETHTOOL_OPS(netdev, &be_ethtool_ops);
|
|
-
|
|
- be_lro_init(adapter, netdev);
|
|
-
|
|
- netif_napi_add(netdev, &adapter->rx_eq.napi, be_poll_rx,
|
|
- BE_NAPI_WEIGHT);
|
|
- netif_napi_add(netdev, &adapter->tx_eq.napi, be_poll_tx,
|
|
- BE_NAPI_WEIGHT);
|
|
-
|
|
- netif_carrier_off(netdev);
|
|
- netif_stop_queue(netdev);
|
|
-}
|
|
-
|
|
-static void be_unmap_pci_bars(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
- if (ctrl->csr)
|
|
- iounmap(ctrl->csr);
|
|
- if (ctrl->db)
|
|
- iounmap(ctrl->db);
|
|
- if (ctrl->pcicfg)
|
|
- iounmap(ctrl->pcicfg);
|
|
-}
|
|
-
|
|
-static int be_map_pci_bars(struct be_adapter *adapter)
|
|
-{
|
|
- u8 __iomem *addr;
|
|
-
|
|
- addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2),
|
|
- pci_resource_len(adapter->pdev, 2));
|
|
- if (addr == NULL)
|
|
- return -ENOMEM;
|
|
- adapter->ctrl.csr = addr;
|
|
-
|
|
- addr = ioremap_nocache(pci_resource_start(adapter->pdev, 4),
|
|
- 128 * 1024);
|
|
- if (addr == NULL)
|
|
- goto pci_map_err;
|
|
- adapter->ctrl.db = addr;
|
|
-
|
|
- addr = ioremap_nocache(pci_resource_start(adapter->pdev, 1),
|
|
- pci_resource_len(adapter->pdev, 1));
|
|
- if (addr == NULL)
|
|
- goto pci_map_err;
|
|
- adapter->ctrl.pcicfg = addr;
|
|
-
|
|
- return 0;
|
|
-pci_map_err:
|
|
- be_unmap_pci_bars(adapter);
|
|
- return -ENOMEM;
|
|
-}
|
|
-
|
|
-
|
|
-static void be_ctrl_cleanup(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_dma_mem *mem = &adapter->ctrl.mbox_mem_alloced;
|
|
-
|
|
- be_unmap_pci_bars(adapter);
|
|
-
|
|
- if (mem->va)
|
|
- pci_free_consistent(adapter->pdev, mem->size,
|
|
- mem->va, mem->dma);
|
|
-}
|
|
-
|
|
-/* Initialize the mbox required to send cmds to BE */
|
|
-static int be_ctrl_init(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
- struct be_dma_mem *mbox_mem_alloc = &ctrl->mbox_mem_alloced;
|
|
- struct be_dma_mem *mbox_mem_align = &ctrl->mbox_mem;
|
|
- int status;
|
|
- u32 val;
|
|
-
|
|
- status = be_map_pci_bars(adapter);
|
|
- if (status)
|
|
- return status;
|
|
-
|
|
- mbox_mem_alloc->size = sizeof(struct be_mcc_mailbox) + 16;
|
|
- mbox_mem_alloc->va = pci_alloc_consistent(adapter->pdev,
|
|
- mbox_mem_alloc->size, &mbox_mem_alloc->dma);
|
|
- if (!mbox_mem_alloc->va) {
|
|
- be_unmap_pci_bars(adapter);
|
|
- return -1;
|
|
- }
|
|
- mbox_mem_align->size = sizeof(struct be_mcc_mailbox);
|
|
- mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16);
|
|
- mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16);
|
|
- memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox));
|
|
- spin_lock_init(&ctrl->cmd_lock);
|
|
-
|
|
- val = ioread32(ctrl->pcicfg + PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET);
|
|
- ctrl->pci_func = (val >> MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT) &
|
|
- MEMBAR_CTRL_INT_CTRL_PFUNC_MASK;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void be_stats_cleanup(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_stats_obj *stats = &adapter->stats;
|
|
- struct be_dma_mem *cmd = &stats->cmd;
|
|
-
|
|
- if (cmd->va)
|
|
- pci_free_consistent(adapter->pdev, cmd->size,
|
|
- cmd->va, cmd->dma);
|
|
-}
|
|
-
|
|
-static int be_stats_init(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_stats_obj *stats = &adapter->stats;
|
|
- struct be_dma_mem *cmd = &stats->cmd;
|
|
-
|
|
- cmd->size = sizeof(struct be_cmd_req_get_stats);
|
|
- cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma);
|
|
- if (cmd->va == NULL)
|
|
- return -1;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void __devexit be_remove(struct pci_dev *pdev)
|
|
-{
|
|
- struct be_adapter *adapter = pci_get_drvdata(pdev);
|
|
- if (!adapter)
|
|
- return;
|
|
-
|
|
- unregister_netdev(adapter->netdev);
|
|
-
|
|
- be_stats_cleanup(adapter);
|
|
-
|
|
- be_ctrl_cleanup(adapter);
|
|
-
|
|
- if (adapter->msix_enabled) {
|
|
- pci_disable_msix(adapter->pdev);
|
|
- adapter->msix_enabled = false;
|
|
- }
|
|
-
|
|
- pci_set_drvdata(pdev, NULL);
|
|
- pci_release_regions(pdev);
|
|
- pci_disable_device(pdev);
|
|
-
|
|
- free_netdev(adapter->netdev);
|
|
-}
|
|
-
|
|
-static int be_hw_up(struct be_adapter *adapter)
|
|
-{
|
|
- struct be_ctrl_info *ctrl = &adapter->ctrl;
|
|
- int status;
|
|
-
|
|
- status = be_cmd_POST(ctrl);
|
|
- if (status)
|
|
- return status;
|
|
-
|
|
- status = be_cmd_get_fw_ver(ctrl, adapter->fw_ver);
|
|
- if (status)
|
|
- return status;
|
|
-
|
|
- status = be_cmd_query_fw_cfg(ctrl, &adapter->port_num);
|
|
- return status;
|
|
-}
|
|
-
|
|
-static int __devinit be_probe(struct pci_dev *pdev,
|
|
- const struct pci_device_id *pdev_id)
|
|
-{
|
|
- int status = 0;
|
|
- struct be_adapter *adapter;
|
|
- struct net_device *netdev;
|
|
- struct be_ctrl_info *ctrl;
|
|
- u8 mac[ETH_ALEN];
|
|
-
|
|
- status = pci_enable_device(pdev);
|
|
- if (status)
|
|
- goto do_none;
|
|
-
|
|
- status = pci_request_regions(pdev, DRV_NAME);
|
|
- if (status)
|
|
- goto disable_dev;
|
|
- pci_set_master(pdev);
|
|
-
|
|
- netdev = alloc_etherdev(sizeof(struct be_adapter));
|
|
- if (netdev == NULL) {
|
|
- status = -ENOMEM;
|
|
- goto rel_reg;
|
|
- }
|
|
- adapter = netdev_priv(netdev);
|
|
- adapter->pdev = pdev;
|
|
- pci_set_drvdata(pdev, adapter);
|
|
- adapter->netdev = netdev;
|
|
-
|
|
- be_msix_enable(adapter);
|
|
-
|
|
- status = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
|
|
- if (!status) {
|
|
- netdev->features |= NETIF_F_HIGHDMA;
|
|
- } else {
|
|
- status = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
|
|
- if (status) {
|
|
- dev_err(&pdev->dev, "Could not set PCI DMA Mask\n");
|
|
- goto free_netdev;
|
|
- }
|
|
- }
|
|
-
|
|
- ctrl = &adapter->ctrl;
|
|
- status = be_ctrl_init(adapter);
|
|
- if (status)
|
|
- goto free_netdev;
|
|
-
|
|
- status = be_stats_init(adapter);
|
|
- if (status)
|
|
- goto ctrl_clean;
|
|
-
|
|
- status = be_hw_up(adapter);
|
|
- if (status)
|
|
- goto stats_clean;
|
|
-
|
|
- status = be_cmd_mac_addr_query(ctrl, mac, MAC_ADDRESS_TYPE_NETWORK,
|
|
- true /* permanent */, 0);
|
|
- if (status)
|
|
- goto stats_clean;
|
|
- memcpy(netdev->dev_addr, mac, ETH_ALEN);
|
|
-
|
|
- INIT_DELAYED_WORK(&adapter->work, be_worker);
|
|
- be_netdev_init(netdev);
|
|
- SET_NETDEV_DEV(netdev, &adapter->pdev->dev);
|
|
-
|
|
- status = register_netdev(netdev);
|
|
- if (status != 0)
|
|
- goto stats_clean;
|
|
-
|
|
- dev_info(&pdev->dev, BE_NAME " port %d\n", adapter->port_num);
|
|
- return 0;
|
|
-
|
|
-stats_clean:
|
|
- be_stats_cleanup(adapter);
|
|
-ctrl_clean:
|
|
- be_ctrl_cleanup(adapter);
|
|
-free_netdev:
|
|
- free_netdev(adapter->netdev);
|
|
-rel_reg:
|
|
- pci_release_regions(pdev);
|
|
-disable_dev:
|
|
- pci_disable_device(pdev);
|
|
-do_none:
|
|
- dev_warn(&pdev->dev, BE_NAME " initialization failed\n");
|
|
- return status;
|
|
-}
|
|
-
|
|
-static int be_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
-{
|
|
- struct be_adapter *adapter = pci_get_drvdata(pdev);
|
|
- struct net_device *netdev = adapter->netdev;
|
|
-
|
|
- netif_device_detach(netdev);
|
|
- if (netif_running(netdev)) {
|
|
- rtnl_lock();
|
|
- be_close(netdev);
|
|
- rtnl_unlock();
|
|
- }
|
|
-
|
|
- pci_save_state(pdev);
|
|
- pci_disable_device(pdev);
|
|
- pci_set_power_state(pdev, pci_choose_state(pdev, state));
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int be_resume(struct pci_dev *pdev)
|
|
-{
|
|
- int status = 0;
|
|
- struct be_adapter *adapter = pci_get_drvdata(pdev);
|
|
- struct net_device *netdev = adapter->netdev;
|
|
-
|
|
- netif_device_detach(netdev);
|
|
-
|
|
- status = pci_enable_device(pdev);
|
|
- if (status)
|
|
- return status;
|
|
-
|
|
- pci_set_power_state(pdev, 0);
|
|
- pci_restore_state(pdev);
|
|
-
|
|
- if (netif_running(netdev)) {
|
|
- rtnl_lock();
|
|
- be_open(netdev);
|
|
- rtnl_unlock();
|
|
- }
|
|
- netif_device_attach(netdev);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static struct pci_driver be_driver = {
|
|
- .name = DRV_NAME,
|
|
- .id_table = be_dev_ids,
|
|
- .probe = be_probe,
|
|
- .remove = be_remove,
|
|
- .suspend = be_suspend,
|
|
- .resume = be_resume
|
|
-};
|
|
-
|
|
-static int __init be_init_module(void)
|
|
-{
|
|
- if (rx_frag_size != 8192 && rx_frag_size != 4096
|
|
- && rx_frag_size != 2048) {
|
|
- printk(KERN_WARNING DRV_NAME
|
|
- " : Module param rx_frag_size must be 2048/4096/8192."
|
|
- " Using 2048\n");
|
|
- rx_frag_size = 2048;
|
|
- }
|
|
- /* Ensure rx_frag_size is aligned to chache line */
|
|
- if (SKB_DATA_ALIGN(rx_frag_size) != rx_frag_size) {
|
|
- printk(KERN_WARNING DRV_NAME
|
|
- " : Bad module param rx_frag_size. Using 2048\n");
|
|
- rx_frag_size = 2048;
|
|
- }
|
|
-
|
|
- return pci_register_driver(&be_driver);
|
|
-}
|
|
-module_init(be_init_module);
|
|
-
|
|
-static void __exit be_exit_module(void)
|
|
-{
|
|
- pci_unregister_driver(&be_driver);
|
|
-}
|
|
-module_exit(be_exit_module);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/benet/Kconfig linux-2.6.29-rc3.owrt/drivers/net/benet/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/net/benet/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/benet/Kconfig 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,7 +0,0 @@
|
|
-config BE2NET
|
|
- tristate "ServerEngines' 10Gbps NIC - BladeEngine 2"
|
|
- depends on PCI && INET
|
|
- select INET_LRO
|
|
- help
|
|
- This driver implements the NIC functionality for ServerEngines'
|
|
- 10Gbps network adapter - BladeEngine 2.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/benet/Makefile linux-2.6.29-rc3.owrt/drivers/net/benet/Makefile
|
|
--- linux-2.6.29.owrt/drivers/net/benet/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/benet/Makefile 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,7 +0,0 @@
|
|
-#
|
|
-# Makefile to build the network driver for ServerEngine's BladeEngine.
|
|
-#
|
|
-
|
|
-obj-$(CONFIG_BE2NET) += be2net.o
|
|
-
|
|
-be2net-y := be_main.o be_cmds.o be_ethtool.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/bnx2.c linux-2.6.29-rc3.owrt/drivers/net/bnx2.c
|
|
--- linux-2.6.29.owrt/drivers/net/bnx2.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/bnx2.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,6 +1,6 @@
|
|
/* bnx2.c: Broadcom NX2 network driver.
|
|
*
|
|
- * Copyright (c) 2004-2009 Broadcom Corporation
|
|
+ * Copyright (c) 2004-2008 Broadcom Corporation
|
|
*
|
|
* 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
|
|
@@ -57,8 +57,8 @@
|
|
|
|
#define DRV_MODULE_NAME "bnx2"
|
|
#define PFX DRV_MODULE_NAME ": "
|
|
-#define DRV_MODULE_VERSION "1.9.3"
|
|
-#define DRV_MODULE_RELDATE "March 17, 2009"
|
|
+#define DRV_MODULE_VERSION "1.9.0"
|
|
+#define DRV_MODULE_RELDATE "Dec 16, 2008"
|
|
|
|
#define RUN_AT(x) (jiffies + (x))
|
|
|
|
@@ -2910,8 +2910,18 @@
|
|
|
|
rx_hdr = (struct l2_fhdr *) skb->data;
|
|
len = rx_hdr->l2_fhdr_pkt_len;
|
|
- status = rx_hdr->l2_fhdr_status;
|
|
|
|
+ if ((status = rx_hdr->l2_fhdr_status) &
|
|
+ (L2_FHDR_ERRORS_BAD_CRC |
|
|
+ L2_FHDR_ERRORS_PHY_DECODE |
|
|
+ L2_FHDR_ERRORS_ALIGNMENT |
|
|
+ L2_FHDR_ERRORS_TOO_SHORT |
|
|
+ L2_FHDR_ERRORS_GIANT_FRAME)) {
|
|
+
|
|
+ bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
|
|
+ sw_ring_prod);
|
|
+ goto next_rx;
|
|
+ }
|
|
hdr_len = 0;
|
|
if (status & L2_FHDR_STATUS_SPLIT) {
|
|
hdr_len = rx_hdr->l2_fhdr_ip_xsum;
|
|
@@ -2921,24 +2931,6 @@
|
|
pg_ring_used = 1;
|
|
}
|
|
|
|
- if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC |
|
|
- L2_FHDR_ERRORS_PHY_DECODE |
|
|
- L2_FHDR_ERRORS_ALIGNMENT |
|
|
- L2_FHDR_ERRORS_TOO_SHORT |
|
|
- L2_FHDR_ERRORS_GIANT_FRAME))) {
|
|
-
|
|
- bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
|
|
- sw_ring_prod);
|
|
- if (pg_ring_used) {
|
|
- int pages;
|
|
-
|
|
- pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT;
|
|
-
|
|
- bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
|
|
- }
|
|
- goto next_rx;
|
|
- }
|
|
-
|
|
len -= 4;
|
|
|
|
if (len <= bp->rx_copy_thresh) {
|
|
@@ -5843,6 +5835,9 @@
|
|
for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
|
|
msix_ent[i].entry = i;
|
|
msix_ent[i].vector = 0;
|
|
+
|
|
+ snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i);
|
|
+ bp->irq_tbl[i].handler = bnx2_msi_1shot;
|
|
}
|
|
|
|
rc = pci_enable_msix(bp->pdev, msix_ent, BNX2_MAX_MSIX_VEC);
|
|
@@ -5851,11 +5846,8 @@
|
|
|
|
bp->irq_nvecs = msix_vecs;
|
|
bp->flags |= BNX2_FLAG_USING_MSIX | BNX2_FLAG_ONE_SHOT_MSI;
|
|
- for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
|
|
+ for (i = 0; i < BNX2_MAX_MSIX_VEC; i++)
|
|
bp->irq_tbl[i].vector = msix_ent[i].vector;
|
|
- snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i);
|
|
- bp->irq_tbl[i].handler = bnx2_msi_1shot;
|
|
- }
|
|
}
|
|
|
|
static void
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/bnx2.h linux-2.6.29-rc3.owrt/drivers/net/bnx2.h
|
|
--- linux-2.6.29.owrt/drivers/net/bnx2.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/bnx2.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1,6 +1,6 @@
|
|
/* bnx2.h: Broadcom NX2 network driver.
|
|
*
|
|
- * Copyright (c) 2004-2009 Broadcom Corporation
|
|
+ * Copyright (c) 2004-2007 Broadcom Corporation
|
|
*
|
|
* 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
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/bnx2x.h linux-2.6.29-rc3.owrt/drivers/net/bnx2x.h
|
|
--- linux-2.6.29.owrt/drivers/net/bnx2x.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/bnx2x.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -152,7 +152,7 @@
|
|
#define PAGES_PER_SGE (1 << PAGES_PER_SGE_SHIFT)
|
|
#define SGE_PAGE_SIZE PAGE_SIZE
|
|
#define SGE_PAGE_SHIFT PAGE_SHIFT
|
|
-#define SGE_PAGE_ALIGN(addr) PAGE_ALIGN((typeof(PAGE_SIZE))addr)
|
|
+#define SGE_PAGE_ALIGN(addr) PAGE_ALIGN(addr)
|
|
|
|
#define BCM_RX_ETH_PAYLOAD_ALIGN 64
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/bnx2x_init.h linux-2.6.29-rc3.owrt/drivers/net/bnx2x_init.h
|
|
--- linux-2.6.29.owrt/drivers/net/bnx2x_init.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/bnx2x_init.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -150,6 +150,7 @@
|
|
|
|
static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len)
|
|
{
|
|
+#ifdef USE_DMAE
|
|
int offset = 0;
|
|
|
|
if (bp->dmae_ready) {
|
|
@@ -163,6 +164,9 @@
|
|
addr + offset, len);
|
|
} else
|
|
bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len);
|
|
+#else
|
|
+ bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len);
|
|
+#endif
|
|
}
|
|
|
|
static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/bnx2x_main.c linux-2.6.29-rc3.owrt/drivers/net/bnx2x_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/bnx2x_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/bnx2x_main.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -57,7 +57,7 @@
|
|
#include "bnx2x.h"
|
|
#include "bnx2x_init.h"
|
|
|
|
-#define DRV_MODULE_VERSION "1.45.27"
|
|
+#define DRV_MODULE_VERSION "1.45.26"
|
|
#define DRV_MODULE_RELDATE "2009/01/26"
|
|
#define BNX2X_BC_VER 0x040200
|
|
|
|
@@ -4035,10 +4035,10 @@
|
|
{
|
|
int port = BP_PORT(bp);
|
|
|
|
- bnx2x_init_fill(bp, USTORM_INTMEM_ADDR +
|
|
+ bnx2x_init_fill(bp, BAR_USTRORM_INTMEM +
|
|
USTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), 0,
|
|
sizeof(struct ustorm_status_block)/4);
|
|
- bnx2x_init_fill(bp, CSTORM_INTMEM_ADDR +
|
|
+ bnx2x_init_fill(bp, BAR_CSTRORM_INTMEM +
|
|
CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), 0,
|
|
sizeof(struct cstorm_status_block)/4);
|
|
}
|
|
@@ -4092,18 +4092,18 @@
|
|
{
|
|
int func = BP_FUNC(bp);
|
|
|
|
- bnx2x_init_fill(bp, TSTORM_INTMEM_ADDR +
|
|
- TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
|
|
- sizeof(struct tstorm_def_status_block)/4);
|
|
- bnx2x_init_fill(bp, USTORM_INTMEM_ADDR +
|
|
+ bnx2x_init_fill(bp, BAR_USTRORM_INTMEM +
|
|
USTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
|
|
sizeof(struct ustorm_def_status_block)/4);
|
|
- bnx2x_init_fill(bp, CSTORM_INTMEM_ADDR +
|
|
+ bnx2x_init_fill(bp, BAR_CSTRORM_INTMEM +
|
|
CSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
|
|
sizeof(struct cstorm_def_status_block)/4);
|
|
- bnx2x_init_fill(bp, XSTORM_INTMEM_ADDR +
|
|
+ bnx2x_init_fill(bp, BAR_XSTRORM_INTMEM +
|
|
XSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
|
|
sizeof(struct xstorm_def_status_block)/4);
|
|
+ bnx2x_init_fill(bp, BAR_TSTRORM_INTMEM +
|
|
+ TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
|
|
+ sizeof(struct tstorm_def_status_block)/4);
|
|
}
|
|
|
|
static void bnx2x_init_def_sb(struct bnx2x *bp,
|
|
@@ -4518,8 +4518,7 @@
|
|
(USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA |
|
|
USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING);
|
|
context->ustorm_st_context.common.sge_buff_size =
|
|
- (u16)min((u32)SGE_PAGE_SIZE*PAGES_PER_SGE,
|
|
- (u32)0xffff);
|
|
+ (u16)(BCM_PAGE_SIZE*PAGES_PER_SGE);
|
|
context->ustorm_st_context.common.sge_page_base_hi =
|
|
U64_HI(fp->rx_sge_mapping);
|
|
context->ustorm_st_context.common.sge_page_base_lo =
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/bonding/bond_main.c linux-2.6.29-rc3.owrt/drivers/net/bonding/bond_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/bonding/bond_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/bonding/bond_main.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3537,26 +3537,11 @@
|
|
}
|
|
break;
|
|
case NETDEV_CHANGE:
|
|
- if (bond->params.mode == BOND_MODE_8023AD || bond_is_lb(bond)) {
|
|
- struct slave *slave;
|
|
-
|
|
- slave = bond_get_slave_by_dev(bond, slave_dev);
|
|
- if (slave) {
|
|
- u16 old_speed = slave->speed;
|
|
- u16 old_duplex = slave->duplex;
|
|
-
|
|
- bond_update_speed_duplex(slave);
|
|
-
|
|
- if (bond_is_lb(bond))
|
|
- break;
|
|
-
|
|
- if (old_speed != slave->speed)
|
|
- bond_3ad_adapter_speed_changed(slave);
|
|
- if (old_duplex != slave->duplex)
|
|
- bond_3ad_adapter_duplex_changed(slave);
|
|
- }
|
|
- }
|
|
-
|
|
+ /*
|
|
+ * TODO: is this what we get if somebody
|
|
+ * sets up a hierarchical bond, then rmmod's
|
|
+ * one of the slave bonding devices?
|
|
+ */
|
|
break;
|
|
case NETDEV_DOWN:
|
|
/*
|
|
@@ -4128,7 +4113,7 @@
|
|
const struct net_device_ops *slave_ops
|
|
= slave->dev->netdev_ops;
|
|
if (slave_ops->ndo_neigh_setup)
|
|
- return slave_ops->ndo_neigh_setup(slave->dev, parms);
|
|
+ return slave_ops->ndo_neigh_setup(dev, parms);
|
|
}
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/cassini.c linux-2.6.29-rc3.owrt/drivers/net/cassini.c
|
|
--- linux-2.6.29.owrt/drivers/net/cassini.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/cassini.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -806,7 +806,7 @@
|
|
|
|
cas_phy_write(cp, MII_BMCR, BMCR_RESET);
|
|
udelay(100);
|
|
- while (--limit) {
|
|
+ while (limit--) {
|
|
val = cas_phy_read(cp, MII_BMCR);
|
|
if ((val & BMCR_RESET) == 0)
|
|
break;
|
|
@@ -979,7 +979,7 @@
|
|
writel(val, cp->regs + REG_PCS_MII_CTRL);
|
|
|
|
limit = STOP_TRIES;
|
|
- while (--limit > 0) {
|
|
+ while (limit-- > 0) {
|
|
udelay(10);
|
|
if ((readl(cp->regs + REG_PCS_MII_CTRL) &
|
|
PCS_MII_RESET) == 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/cxgb3/cxgb3_main.c linux-2.6.29-rc3.owrt/drivers/net/cxgb3/cxgb3_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/cxgb3/cxgb3_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/cxgb3/cxgb3_main.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -90,7 +90,6 @@
|
|
CH_DEVICE(0x30, 2), /* T3B10 */
|
|
CH_DEVICE(0x31, 3), /* T3B20 */
|
|
CH_DEVICE(0x32, 1), /* T3B02 */
|
|
- CH_DEVICE(0x35, 6), /* T3C20-derived T3C10 */
|
|
{0,}
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/cxgb3/sge.c linux-2.6.29-rc3.owrt/drivers/net/cxgb3/sge.c
|
|
--- linux-2.6.29.owrt/drivers/net/cxgb3/sge.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/cxgb3/sge.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2276,7 +2276,8 @@
|
|
} else if ((len = ntohl(r->len_cq)) != 0) {
|
|
struct sge_fl *fl;
|
|
|
|
- lro &= eth && is_eth_tcp(rss_hi);
|
|
+ if (eth)
|
|
+ lro = qs->lro_enabled && is_eth_tcp(rss_hi);
|
|
|
|
fl = (len & F_RSPD_FLQ) ? &qs->fl[1] : &qs->fl[0];
|
|
if (fl->use_pages) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/cxgb3/t3_hw.c linux-2.6.29-rc3.owrt/drivers/net/cxgb3/t3_hw.c
|
|
--- linux-2.6.29.owrt/drivers/net/cxgb3/t3_hw.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/cxgb3/t3_hw.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -512,13 +512,6 @@
|
|
F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
|
|
{ S_GPIO9, S_GPIO3 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
|
|
&mi1_mdio_ext_ops, "Chelsio T320"},
|
|
- {},
|
|
- {},
|
|
- {1, 0,
|
|
- F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO6_OEN | F_GPIO7_OEN |
|
|
- F_GPIO10_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
|
|
- { S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
|
|
- &mi1_mdio_ext_ops, "Chelsio T310" },
|
|
};
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/dm9000.c linux-2.6.29-rc3.owrt/drivers/net/dm9000.c
|
|
--- linux-2.6.29.owrt/drivers/net/dm9000.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/dm9000.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -930,15 +930,13 @@
|
|
struct net_device *dev = dev_id;
|
|
board_info_t *db = netdev_priv(dev);
|
|
int int_status;
|
|
- unsigned long flags;
|
|
u8 reg_save;
|
|
|
|
dm9000_dbg(db, 3, "entering %s\n", __func__);
|
|
|
|
/* A real interrupt coming */
|
|
|
|
- /* holders of db->lock must always block IRQs */
|
|
- spin_lock_irqsave(&db->lock, flags);
|
|
+ spin_lock(&db->lock);
|
|
|
|
/* Save previous register address */
|
|
reg_save = readb(db->io_addr);
|
|
@@ -974,7 +972,7 @@
|
|
/* Restore previous register address */
|
|
writeb(reg_save, db->io_addr);
|
|
|
|
- spin_unlock_irqrestore(&db->lock, flags);
|
|
+ spin_unlock(&db->lock);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/dnet.c linux-2.6.29-rc3.owrt/drivers/net/dnet.c
|
|
--- linux-2.6.29.owrt/drivers/net/dnet.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/dnet.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,994 +0,0 @@
|
|
-/*
|
|
- * Dave DNET Ethernet Controller driver
|
|
- *
|
|
- * Copyright (C) 2008 Dave S.r.l. <www.dave.eu>
|
|
- * Copyright (C) 2009 Ilya Yanok, Emcraft Systems Ltd, <yanok@emcraft.com>
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License version 2 as
|
|
- * published by the Free Software Foundation.
|
|
- */
|
|
-#include <linux/version.h>
|
|
-#include <linux/module.h>
|
|
-#include <linux/moduleparam.h>
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/types.h>
|
|
-#include <linux/slab.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/init.h>
|
|
-#include <linux/netdevice.h>
|
|
-#include <linux/etherdevice.h>
|
|
-#include <linux/dma-mapping.h>
|
|
-#include <linux/platform_device.h>
|
|
-#include <linux/phy.h>
|
|
-#include <linux/platform_device.h>
|
|
-
|
|
-#include "dnet.h"
|
|
-
|
|
-#undef DEBUG
|
|
-
|
|
-/* function for reading internal MAC register */
|
|
-u16 dnet_readw_mac(struct dnet *bp, u16 reg)
|
|
-{
|
|
- u16 data_read;
|
|
-
|
|
- /* issue a read */
|
|
- dnet_writel(bp, reg, MACREG_ADDR);
|
|
-
|
|
- /* since a read/write op to the MAC is very slow,
|
|
- * we must wait before reading the data */
|
|
- ndelay(500);
|
|
-
|
|
- /* read data read from the MAC register */
|
|
- data_read = dnet_readl(bp, MACREG_DATA);
|
|
-
|
|
- /* all done */
|
|
- return data_read;
|
|
-}
|
|
-
|
|
-/* function for writing internal MAC register */
|
|
-void dnet_writew_mac(struct dnet *bp, u16 reg, u16 val)
|
|
-{
|
|
- /* load data to write */
|
|
- dnet_writel(bp, val, MACREG_DATA);
|
|
-
|
|
- /* issue a write */
|
|
- dnet_writel(bp, reg | DNET_INTERNAL_WRITE, MACREG_ADDR);
|
|
-
|
|
- /* since a read/write op to the MAC is very slow,
|
|
- * we must wait before exiting */
|
|
- ndelay(500);
|
|
-}
|
|
-
|
|
-static void __dnet_set_hwaddr(struct dnet *bp)
|
|
-{
|
|
- u16 tmp;
|
|
-
|
|
- tmp = cpu_to_be16(*((u16 *) bp->dev->dev_addr));
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_0_REG, tmp);
|
|
- tmp = cpu_to_be16(*((u16 *) (bp->dev->dev_addr + 2)));
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_1_REG, tmp);
|
|
- tmp = cpu_to_be16(*((u16 *) (bp->dev->dev_addr + 4)));
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_2_REG, tmp);
|
|
-}
|
|
-
|
|
-static void __devinit dnet_get_hwaddr(struct dnet *bp)
|
|
-{
|
|
- u16 tmp;
|
|
- u8 addr[6];
|
|
-
|
|
- /*
|
|
- * from MAC docs:
|
|
- * "Note that the MAC address is stored in the registers in Hexadecimal
|
|
- * form. For example, to set the MAC Address to: AC-DE-48-00-00-80
|
|
- * would require writing 0xAC (octet 0) to address 0x0B (high byte of
|
|
- * Mac_addr[15:0]), 0xDE (octet 1) to address 0x0A (Low byte of
|
|
- * Mac_addr[15:0]), 0x48 (octet 2) to address 0x0D (high byte of
|
|
- * Mac_addr[15:0]), 0x00 (octet 3) to address 0x0C (Low byte of
|
|
- * Mac_addr[15:0]), 0x00 (octet 4) to address 0x0F (high byte of
|
|
- * Mac_addr[15:0]), and 0x80 (octet 5) to address * 0x0E (Low byte of
|
|
- * Mac_addr[15:0]).
|
|
- */
|
|
- tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_0_REG);
|
|
- *((u16 *) addr) = be16_to_cpu(tmp);
|
|
- tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_1_REG);
|
|
- *((u16 *) (addr + 2)) = be16_to_cpu(tmp);
|
|
- tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_2_REG);
|
|
- *((u16 *) (addr + 4)) = be16_to_cpu(tmp);
|
|
-
|
|
- if (is_valid_ether_addr(addr))
|
|
- memcpy(bp->dev->dev_addr, addr, sizeof(addr));
|
|
-}
|
|
-
|
|
-static int dnet_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
|
|
-{
|
|
- struct dnet *bp = bus->priv;
|
|
- u16 value;
|
|
-
|
|
- while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG)
|
|
- & DNET_INTERNAL_GMII_MNG_CMD_FIN))
|
|
- cpu_relax();
|
|
-
|
|
- /* only 5 bits allowed for phy-addr and reg_offset */
|
|
- mii_id &= 0x1f;
|
|
- regnum &= 0x1f;
|
|
-
|
|
- /* prepare reg_value for a read */
|
|
- value = (mii_id << 8);
|
|
- value |= regnum;
|
|
-
|
|
- /* write control word */
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG, value);
|
|
-
|
|
- /* wait for end of transfer */
|
|
- while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG)
|
|
- & DNET_INTERNAL_GMII_MNG_CMD_FIN))
|
|
- cpu_relax();
|
|
-
|
|
- value = dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_DAT_REG);
|
|
-
|
|
- pr_debug("mdio_read %02x:%02x <- %04x\n", mii_id, regnum, value);
|
|
-
|
|
- return value;
|
|
-}
|
|
-
|
|
-static int dnet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
|
|
- u16 value)
|
|
-{
|
|
- struct dnet *bp = bus->priv;
|
|
- u16 tmp;
|
|
-
|
|
- pr_debug("mdio_write %02x:%02x <- %04x\n", mii_id, regnum, value);
|
|
-
|
|
- while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG)
|
|
- & DNET_INTERNAL_GMII_MNG_CMD_FIN))
|
|
- cpu_relax();
|
|
-
|
|
- /* prepare for a write operation */
|
|
- tmp = (1 << 13);
|
|
-
|
|
- /* only 5 bits allowed for phy-addr and reg_offset */
|
|
- mii_id &= 0x1f;
|
|
- regnum &= 0x1f;
|
|
-
|
|
- /* only 16 bits on data */
|
|
- value &= 0xffff;
|
|
-
|
|
- /* prepare reg_value for a write */
|
|
- tmp |= (mii_id << 8);
|
|
- tmp |= regnum;
|
|
-
|
|
- /* write data to write first */
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_DAT_REG, value);
|
|
-
|
|
- /* write control word */
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG, tmp);
|
|
-
|
|
- while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG)
|
|
- & DNET_INTERNAL_GMII_MNG_CMD_FIN))
|
|
- cpu_relax();
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int dnet_mdio_reset(struct mii_bus *bus)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void dnet_handle_link_change(struct net_device *dev)
|
|
-{
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
- struct phy_device *phydev = bp->phy_dev;
|
|
- unsigned long flags;
|
|
- u32 mode_reg, ctl_reg;
|
|
-
|
|
- int status_change = 0;
|
|
-
|
|
- spin_lock_irqsave(&bp->lock, flags);
|
|
-
|
|
- mode_reg = dnet_readw_mac(bp, DNET_INTERNAL_MODE_REG);
|
|
- ctl_reg = dnet_readw_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG);
|
|
-
|
|
- if (phydev->link) {
|
|
- if (bp->duplex != phydev->duplex) {
|
|
- if (phydev->duplex)
|
|
- ctl_reg &=
|
|
- ~(DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP);
|
|
- else
|
|
- ctl_reg |=
|
|
- DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP;
|
|
-
|
|
- bp->duplex = phydev->duplex;
|
|
- status_change = 1;
|
|
- }
|
|
-
|
|
- if (bp->speed != phydev->speed) {
|
|
- status_change = 1;
|
|
- switch (phydev->speed) {
|
|
- case 1000:
|
|
- mode_reg |= DNET_INTERNAL_MODE_GBITEN;
|
|
- break;
|
|
- case 100:
|
|
- case 10:
|
|
- mode_reg &= ~DNET_INTERNAL_MODE_GBITEN;
|
|
- break;
|
|
- default:
|
|
- printk(KERN_WARNING
|
|
- "%s: Ack! Speed (%d) is not "
|
|
- "10/100/1000!\n", dev->name,
|
|
- phydev->speed);
|
|
- break;
|
|
- }
|
|
- bp->speed = phydev->speed;
|
|
- }
|
|
- }
|
|
-
|
|
- if (phydev->link != bp->link) {
|
|
- if (phydev->link) {
|
|
- mode_reg |=
|
|
- (DNET_INTERNAL_MODE_RXEN | DNET_INTERNAL_MODE_TXEN);
|
|
- } else {
|
|
- mode_reg &=
|
|
- ~(DNET_INTERNAL_MODE_RXEN |
|
|
- DNET_INTERNAL_MODE_TXEN);
|
|
- bp->speed = 0;
|
|
- bp->duplex = -1;
|
|
- }
|
|
- bp->link = phydev->link;
|
|
-
|
|
- status_change = 1;
|
|
- }
|
|
-
|
|
- if (status_change) {
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG, ctl_reg);
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_MODE_REG, mode_reg);
|
|
- }
|
|
-
|
|
- spin_unlock_irqrestore(&bp->lock, flags);
|
|
-
|
|
- if (status_change) {
|
|
- if (phydev->link)
|
|
- printk(KERN_INFO "%s: link up (%d/%s)\n",
|
|
- dev->name, phydev->speed,
|
|
- DUPLEX_FULL == phydev->duplex ? "Full" : "Half");
|
|
- else
|
|
- printk(KERN_INFO "%s: link down\n", dev->name);
|
|
- }
|
|
-}
|
|
-
|
|
-static int dnet_mii_probe(struct net_device *dev)
|
|
-{
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
- struct phy_device *phydev = NULL;
|
|
- int phy_addr;
|
|
-
|
|
- /* find the first phy */
|
|
- for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
|
|
- if (bp->mii_bus->phy_map[phy_addr]) {
|
|
- phydev = bp->mii_bus->phy_map[phy_addr];
|
|
- break;
|
|
- }
|
|
- }
|
|
-
|
|
- if (!phydev) {
|
|
- printk(KERN_ERR "%s: no PHY found\n", dev->name);
|
|
- return -ENODEV;
|
|
- }
|
|
-
|
|
- /* TODO : add pin_irq */
|
|
-
|
|
- /* attach the mac to the phy */
|
|
- if (bp->capabilities & DNET_HAS_RMII) {
|
|
- phydev = phy_connect(dev, dev_name(&phydev->dev),
|
|
- &dnet_handle_link_change, 0,
|
|
- PHY_INTERFACE_MODE_RMII);
|
|
- } else {
|
|
- phydev = phy_connect(dev, dev_name(&phydev->dev),
|
|
- &dnet_handle_link_change, 0,
|
|
- PHY_INTERFACE_MODE_MII);
|
|
- }
|
|
-
|
|
- if (IS_ERR(phydev)) {
|
|
- printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
|
|
- return PTR_ERR(phydev);
|
|
- }
|
|
-
|
|
- /* mask with MAC supported features */
|
|
- if (bp->capabilities & DNET_HAS_GIGABIT)
|
|
- phydev->supported &= PHY_GBIT_FEATURES;
|
|
- else
|
|
- phydev->supported &= PHY_BASIC_FEATURES;
|
|
-
|
|
- phydev->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause;
|
|
-
|
|
- phydev->advertising = phydev->supported;
|
|
-
|
|
- bp->link = 0;
|
|
- bp->speed = 0;
|
|
- bp->duplex = -1;
|
|
- bp->phy_dev = phydev;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int dnet_mii_init(struct dnet *bp)
|
|
-{
|
|
- int err, i;
|
|
-
|
|
- bp->mii_bus = mdiobus_alloc();
|
|
- if (bp->mii_bus == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
- bp->mii_bus->name = "dnet_mii_bus";
|
|
- bp->mii_bus->read = &dnet_mdio_read;
|
|
- bp->mii_bus->write = &dnet_mdio_write;
|
|
- bp->mii_bus->reset = &dnet_mdio_reset;
|
|
-
|
|
- snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0);
|
|
-
|
|
- bp->mii_bus->priv = bp;
|
|
-
|
|
- bp->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
|
|
- if (!bp->mii_bus->irq) {
|
|
- err = -ENOMEM;
|
|
- goto err_out;
|
|
- }
|
|
-
|
|
- for (i = 0; i < PHY_MAX_ADDR; i++)
|
|
- bp->mii_bus->irq[i] = PHY_POLL;
|
|
-
|
|
- platform_set_drvdata(bp->dev, bp->mii_bus);
|
|
-
|
|
- if (mdiobus_register(bp->mii_bus)) {
|
|
- err = -ENXIO;
|
|
- goto err_out_free_mdio_irq;
|
|
- }
|
|
-
|
|
- if (dnet_mii_probe(bp->dev) != 0) {
|
|
- err = -ENXIO;
|
|
- goto err_out_unregister_bus;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-
|
|
-err_out_unregister_bus:
|
|
- mdiobus_unregister(bp->mii_bus);
|
|
-err_out_free_mdio_irq:
|
|
- kfree(bp->mii_bus->irq);
|
|
-err_out:
|
|
- mdiobus_free(bp->mii_bus);
|
|
- return err;
|
|
-}
|
|
-
|
|
-/* For Neptune board: LINK1000 as Link LED and TX as activity LED */
|
|
-int dnet_phy_marvell_fixup(struct phy_device *phydev)
|
|
-{
|
|
- return phy_write(phydev, 0x18, 0x4148);
|
|
-}
|
|
-
|
|
-static void dnet_update_stats(struct dnet *bp)
|
|
-{
|
|
- u32 __iomem *reg = bp->regs + DNET_RX_PKT_IGNR_CNT;
|
|
- u32 *p = &bp->hw_stats.rx_pkt_ignr;
|
|
- u32 *end = &bp->hw_stats.rx_byte + 1;
|
|
-
|
|
- WARN_ON((unsigned long)(end - p - 1) !=
|
|
- (DNET_RX_BYTE_CNT - DNET_RX_PKT_IGNR_CNT) / 4);
|
|
-
|
|
- for (; p < end; p++, reg++)
|
|
- *p += readl(reg);
|
|
-
|
|
- reg = bp->regs + DNET_TX_UNICAST_CNT;
|
|
- p = &bp->hw_stats.tx_unicast;
|
|
- end = &bp->hw_stats.tx_byte + 1;
|
|
-
|
|
- WARN_ON((unsigned long)(end - p - 1) !=
|
|
- (DNET_TX_BYTE_CNT - DNET_TX_UNICAST_CNT) / 4);
|
|
-
|
|
- for (; p < end; p++, reg++)
|
|
- *p += readl(reg);
|
|
-}
|
|
-
|
|
-static int dnet_poll(struct napi_struct *napi, int budget)
|
|
-{
|
|
- struct dnet *bp = container_of(napi, struct dnet, napi);
|
|
- struct net_device *dev = bp->dev;
|
|
- int npackets = 0;
|
|
- unsigned int pkt_len;
|
|
- struct sk_buff *skb;
|
|
- unsigned int *data_ptr;
|
|
- u32 int_enable;
|
|
- u32 cmd_word;
|
|
- int i;
|
|
-
|
|
- while (npackets < budget) {
|
|
- /*
|
|
- * break out of while loop if there are no more
|
|
- * packets waiting
|
|
- */
|
|
- if (!(dnet_readl(bp, RX_FIFO_WCNT) >> 16)) {
|
|
- napi_complete(napi);
|
|
- int_enable = dnet_readl(bp, INTR_ENB);
|
|
- int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF;
|
|
- dnet_writel(bp, int_enable, INTR_ENB);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- cmd_word = dnet_readl(bp, RX_LEN_FIFO);
|
|
- pkt_len = cmd_word & 0xFFFF;
|
|
-
|
|
- if (cmd_word & 0xDF180000)
|
|
- printk(KERN_ERR "%s packet receive error %x\n",
|
|
- __func__, cmd_word);
|
|
-
|
|
- skb = dev_alloc_skb(pkt_len + 5);
|
|
- if (skb != NULL) {
|
|
- /* Align IP on 16 byte boundaries */
|
|
- skb_reserve(skb, 2);
|
|
- /*
|
|
- * 'skb_put()' points to the start of sk_buff
|
|
- * data area.
|
|
- */
|
|
- data_ptr = (unsigned int *)skb_put(skb, pkt_len);
|
|
- for (i = 0; i < (pkt_len + 3) >> 2; i++)
|
|
- *data_ptr++ = dnet_readl(bp, RX_DATA_FIFO);
|
|
- skb->protocol = eth_type_trans(skb, dev);
|
|
- netif_receive_skb(skb);
|
|
- npackets++;
|
|
- } else
|
|
- printk(KERN_NOTICE
|
|
- "%s: No memory to allocate a sk_buff of "
|
|
- "size %u.\n", dev->name, pkt_len);
|
|
- }
|
|
-
|
|
- budget -= npackets;
|
|
-
|
|
- if (npackets < budget) {
|
|
- /* We processed all packets available. Tell NAPI it can
|
|
- * stop polling then re-enable rx interrupts */
|
|
- napi_complete(napi);
|
|
- int_enable = dnet_readl(bp, INTR_ENB);
|
|
- int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF;
|
|
- dnet_writel(bp, int_enable, INTR_ENB);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- /* There are still packets waiting */
|
|
- return 1;
|
|
-}
|
|
-
|
|
-static irqreturn_t dnet_interrupt(int irq, void *dev_id)
|
|
-{
|
|
- struct net_device *dev = dev_id;
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
- u32 int_src, int_enable, int_current;
|
|
- unsigned long flags;
|
|
- unsigned int handled = 0;
|
|
-
|
|
- spin_lock_irqsave(&bp->lock, flags);
|
|
-
|
|
- /* read and clear the DNET irq (clear on read) */
|
|
- int_src = dnet_readl(bp, INTR_SRC);
|
|
- int_enable = dnet_readl(bp, INTR_ENB);
|
|
- int_current = int_src & int_enable;
|
|
-
|
|
- /* restart the queue if we had stopped it for TX fifo almost full */
|
|
- if (int_current & DNET_INTR_SRC_TX_FIFOAE) {
|
|
- int_enable = dnet_readl(bp, INTR_ENB);
|
|
- int_enable &= ~DNET_INTR_ENB_TX_FIFOAE;
|
|
- dnet_writel(bp, int_enable, INTR_ENB);
|
|
- netif_wake_queue(dev);
|
|
- handled = 1;
|
|
- }
|
|
-
|
|
- /* RX FIFO error checking */
|
|
- if (int_current &
|
|
- (DNET_INTR_SRC_RX_CMDFIFOFF | DNET_INTR_SRC_RX_DATAFIFOFF)) {
|
|
- printk(KERN_ERR "%s: RX fifo error %x, irq %x\n", __func__,
|
|
- dnet_readl(bp, RX_STATUS), int_current);
|
|
- /* we can only flush the RX FIFOs */
|
|
- dnet_writel(bp, DNET_SYS_CTL_RXFIFOFLUSH, SYS_CTL);
|
|
- ndelay(500);
|
|
- dnet_writel(bp, 0, SYS_CTL);
|
|
- handled = 1;
|
|
- }
|
|
-
|
|
- /* TX FIFO error checking */
|
|
- if (int_current &
|
|
- (DNET_INTR_SRC_TX_FIFOFULL | DNET_INTR_SRC_TX_DISCFRM)) {
|
|
- printk(KERN_ERR "%s: TX fifo error %x, irq %x\n", __func__,
|
|
- dnet_readl(bp, TX_STATUS), int_current);
|
|
- /* we can only flush the TX FIFOs */
|
|
- dnet_writel(bp, DNET_SYS_CTL_TXFIFOFLUSH, SYS_CTL);
|
|
- ndelay(500);
|
|
- dnet_writel(bp, 0, SYS_CTL);
|
|
- handled = 1;
|
|
- }
|
|
-
|
|
- if (int_current & DNET_INTR_SRC_RX_CMDFIFOAF) {
|
|
- if (napi_schedule_prep(&bp->napi)) {
|
|
- /*
|
|
- * There's no point taking any more interrupts
|
|
- * until we have processed the buffers
|
|
- */
|
|
- /* Disable Rx interrupts and schedule NAPI poll */
|
|
- int_enable = dnet_readl(bp, INTR_ENB);
|
|
- int_enable &= ~DNET_INTR_SRC_RX_CMDFIFOAF;
|
|
- dnet_writel(bp, int_enable, INTR_ENB);
|
|
- __napi_schedule(&bp->napi);
|
|
- }
|
|
- handled = 1;
|
|
- }
|
|
-
|
|
- if (!handled)
|
|
- pr_debug("%s: irq %x remains\n", __func__, int_current);
|
|
-
|
|
- spin_unlock_irqrestore(&bp->lock, flags);
|
|
-
|
|
- return IRQ_RETVAL(handled);
|
|
-}
|
|
-
|
|
-#ifdef DEBUG
|
|
-static inline void dnet_print_skb(struct sk_buff *skb)
|
|
-{
|
|
- int k;
|
|
- printk(KERN_DEBUG PFX "data:");
|
|
- for (k = 0; k < skb->len; k++)
|
|
- printk(" %02x", (unsigned int)skb->data[k]);
|
|
- printk("\n");
|
|
-}
|
|
-#else
|
|
-#define dnet_print_skb(skb) do {} while (0)
|
|
-#endif
|
|
-
|
|
-static int dnet_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
-{
|
|
-
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
- u32 tx_status, irq_enable;
|
|
- unsigned int len, i, tx_cmd, wrsz;
|
|
- unsigned long flags;
|
|
- unsigned int *bufp;
|
|
-
|
|
- tx_status = dnet_readl(bp, TX_STATUS);
|
|
-
|
|
- pr_debug("start_xmit: len %u head %p data %p\n",
|
|
- skb->len, skb->head, skb->data);
|
|
- dnet_print_skb(skb);
|
|
-
|
|
- /* frame size (words) */
|
|
- len = (skb->len + 3) >> 2;
|
|
-
|
|
- spin_lock_irqsave(&bp->lock, flags);
|
|
-
|
|
- tx_status = dnet_readl(bp, TX_STATUS);
|
|
-
|
|
- bufp = (unsigned int *)(((unsigned long) skb->data) & ~0x3UL);
|
|
- wrsz = (u32) skb->len + 3;
|
|
- wrsz += ((unsigned long) skb->data) & 0x3;
|
|
- wrsz >>= 2;
|
|
- tx_cmd = ((((unsigned long)(skb->data)) & 0x03) << 16) | (u32) skb->len;
|
|
-
|
|
- /* check if there is enough room for the current frame */
|
|
- if (wrsz < (DNET_FIFO_SIZE - dnet_readl(bp, TX_FIFO_WCNT))) {
|
|
- for (i = 0; i < wrsz; i++)
|
|
- dnet_writel(bp, *bufp++, TX_DATA_FIFO);
|
|
-
|
|
- /*
|
|
- * inform MAC that a packet's written and ready to be
|
|
- * shipped out
|
|
- */
|
|
- dnet_writel(bp, tx_cmd, TX_LEN_FIFO);
|
|
- }
|
|
-
|
|
- if (dnet_readl(bp, TX_FIFO_WCNT) > DNET_FIFO_TX_DATA_AF_TH) {
|
|
- netif_stop_queue(dev);
|
|
- tx_status = dnet_readl(bp, INTR_SRC);
|
|
- irq_enable = dnet_readl(bp, INTR_ENB);
|
|
- irq_enable |= DNET_INTR_ENB_TX_FIFOAE;
|
|
- dnet_writel(bp, irq_enable, INTR_ENB);
|
|
- }
|
|
-
|
|
- /* free the buffer */
|
|
- dev_kfree_skb(skb);
|
|
-
|
|
- spin_unlock_irqrestore(&bp->lock, flags);
|
|
-
|
|
- dev->trans_start = jiffies;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void dnet_reset_hw(struct dnet *bp)
|
|
-{
|
|
- /* put ts_mac in IDLE state i.e. disable rx/tx */
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_MODE_REG, DNET_INTERNAL_MODE_FCEN);
|
|
-
|
|
- /*
|
|
- * RX FIFO almost full threshold: only cmd FIFO almost full is
|
|
- * implemented for RX side
|
|
- */
|
|
- dnet_writel(bp, DNET_FIFO_RX_CMD_AF_TH, RX_FIFO_TH);
|
|
- /*
|
|
- * TX FIFO almost empty threshold: only data FIFO almost empty
|
|
- * is implemented for TX side
|
|
- */
|
|
- dnet_writel(bp, DNET_FIFO_TX_DATA_AE_TH, TX_FIFO_TH);
|
|
-
|
|
- /* flush rx/tx fifos */
|
|
- dnet_writel(bp, DNET_SYS_CTL_RXFIFOFLUSH | DNET_SYS_CTL_TXFIFOFLUSH,
|
|
- SYS_CTL);
|
|
- msleep(1);
|
|
- dnet_writel(bp, 0, SYS_CTL);
|
|
-}
|
|
-
|
|
-static void dnet_init_hw(struct dnet *bp)
|
|
-{
|
|
- u32 config;
|
|
-
|
|
- dnet_reset_hw(bp);
|
|
- __dnet_set_hwaddr(bp);
|
|
-
|
|
- config = dnet_readw_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG);
|
|
-
|
|
- if (bp->dev->flags & IFF_PROMISC)
|
|
- /* Copy All Frames */
|
|
- config |= DNET_INTERNAL_RXTX_CONTROL_ENPROMISC;
|
|
- if (!(bp->dev->flags & IFF_BROADCAST))
|
|
- /* No BroadCast */
|
|
- config |= DNET_INTERNAL_RXTX_CONTROL_RXMULTICAST;
|
|
-
|
|
- config |= DNET_INTERNAL_RXTX_CONTROL_RXPAUSE |
|
|
- DNET_INTERNAL_RXTX_CONTROL_RXBROADCAST |
|
|
- DNET_INTERNAL_RXTX_CONTROL_DROPCONTROL |
|
|
- DNET_INTERNAL_RXTX_CONTROL_DISCFXFCS;
|
|
-
|
|
- dnet_writew_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG, config);
|
|
-
|
|
- /* clear irq before enabling them */
|
|
- config = dnet_readl(bp, INTR_SRC);
|
|
-
|
|
- /* enable RX/TX interrupt, recv packet ready interrupt */
|
|
- dnet_writel(bp, DNET_INTR_ENB_GLOBAL_ENABLE | DNET_INTR_ENB_RX_SUMMARY |
|
|
- DNET_INTR_ENB_TX_SUMMARY | DNET_INTR_ENB_RX_FIFOERR |
|
|
- DNET_INTR_ENB_RX_ERROR | DNET_INTR_ENB_RX_FIFOFULL |
|
|
- DNET_INTR_ENB_TX_FIFOFULL | DNET_INTR_ENB_TX_DISCFRM |
|
|
- DNET_INTR_ENB_RX_PKTRDY, INTR_ENB);
|
|
-}
|
|
-
|
|
-static int dnet_open(struct net_device *dev)
|
|
-{
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
-
|
|
- /* if the phy is not yet register, retry later */
|
|
- if (!bp->phy_dev)
|
|
- return -EAGAIN;
|
|
-
|
|
- if (!is_valid_ether_addr(dev->dev_addr))
|
|
- return -EADDRNOTAVAIL;
|
|
-
|
|
- napi_enable(&bp->napi);
|
|
- dnet_init_hw(bp);
|
|
-
|
|
- phy_start_aneg(bp->phy_dev);
|
|
-
|
|
- /* schedule a link state check */
|
|
- phy_start(bp->phy_dev);
|
|
-
|
|
- netif_start_queue(dev);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int dnet_close(struct net_device *dev)
|
|
-{
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
-
|
|
- netif_stop_queue(dev);
|
|
- napi_disable(&bp->napi);
|
|
-
|
|
- if (bp->phy_dev)
|
|
- phy_stop(bp->phy_dev);
|
|
-
|
|
- dnet_reset_hw(bp);
|
|
- netif_carrier_off(dev);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static inline void dnet_print_pretty_hwstats(struct dnet_stats *hwstat)
|
|
-{
|
|
- pr_debug("%s\n", __func__);
|
|
- pr_debug("----------------------------- RX statistics "
|
|
- "-------------------------------\n");
|
|
- pr_debug("RX_PKT_IGNR_CNT %-8x\n", hwstat->rx_pkt_ignr);
|
|
- pr_debug("RX_LEN_CHK_ERR_CNT %-8x\n", hwstat->rx_len_chk_err);
|
|
- pr_debug("RX_LNG_FRM_CNT %-8x\n", hwstat->rx_lng_frm);
|
|
- pr_debug("RX_SHRT_FRM_CNT %-8x\n", hwstat->rx_shrt_frm);
|
|
- pr_debug("RX_IPG_VIOL_CNT %-8x\n", hwstat->rx_ipg_viol);
|
|
- pr_debug("RX_CRC_ERR_CNT %-8x\n", hwstat->rx_crc_err);
|
|
- pr_debug("RX_OK_PKT_CNT %-8x\n", hwstat->rx_ok_pkt);
|
|
- pr_debug("RX_CTL_FRM_CNT %-8x\n", hwstat->rx_ctl_frm);
|
|
- pr_debug("RX_PAUSE_FRM_CNT %-8x\n", hwstat->rx_pause_frm);
|
|
- pr_debug("RX_MULTICAST_CNT %-8x\n", hwstat->rx_multicast);
|
|
- pr_debug("RX_BROADCAST_CNT %-8x\n", hwstat->rx_broadcast);
|
|
- pr_debug("RX_VLAN_TAG_CNT %-8x\n", hwstat->rx_vlan_tag);
|
|
- pr_debug("RX_PRE_SHRINK_CNT %-8x\n", hwstat->rx_pre_shrink);
|
|
- pr_debug("RX_DRIB_NIB_CNT %-8x\n", hwstat->rx_drib_nib);
|
|
- pr_debug("RX_UNSUP_OPCD_CNT %-8x\n", hwstat->rx_unsup_opcd);
|
|
- pr_debug("RX_BYTE_CNT %-8x\n", hwstat->rx_byte);
|
|
- pr_debug("----------------------------- TX statistics "
|
|
- "-------------------------------\n");
|
|
- pr_debug("TX_UNICAST_CNT %-8x\n", hwstat->tx_unicast);
|
|
- pr_debug("TX_PAUSE_FRM_CNT %-8x\n", hwstat->tx_pause_frm);
|
|
- pr_debug("TX_MULTICAST_CNT %-8x\n", hwstat->tx_multicast);
|
|
- pr_debug("TX_BRDCAST_CNT %-8x\n", hwstat->tx_brdcast);
|
|
- pr_debug("TX_VLAN_TAG_CNT %-8x\n", hwstat->tx_vlan_tag);
|
|
- pr_debug("TX_BAD_FCS_CNT %-8x\n", hwstat->tx_bad_fcs);
|
|
- pr_debug("TX_JUMBO_CNT %-8x\n", hwstat->tx_jumbo);
|
|
- pr_debug("TX_BYTE_CNT %-8x\n", hwstat->tx_byte);
|
|
-}
|
|
-
|
|
-static struct net_device_stats *dnet_get_stats(struct net_device *dev)
|
|
-{
|
|
-
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
- struct net_device_stats *nstat = &dev->stats;
|
|
- struct dnet_stats *hwstat = &bp->hw_stats;
|
|
-
|
|
- /* read stats from hardware */
|
|
- dnet_update_stats(bp);
|
|
-
|
|
- /* Convert HW stats into netdevice stats */
|
|
- nstat->rx_errors = (hwstat->rx_len_chk_err +
|
|
- hwstat->rx_lng_frm + hwstat->rx_shrt_frm +
|
|
- /* ignore IGP violation error
|
|
- hwstat->rx_ipg_viol + */
|
|
- hwstat->rx_crc_err +
|
|
- hwstat->rx_pre_shrink +
|
|
- hwstat->rx_drib_nib + hwstat->rx_unsup_opcd);
|
|
- nstat->tx_errors = hwstat->tx_bad_fcs;
|
|
- nstat->rx_length_errors = (hwstat->rx_len_chk_err +
|
|
- hwstat->rx_lng_frm +
|
|
- hwstat->rx_shrt_frm + hwstat->rx_pre_shrink);
|
|
- nstat->rx_crc_errors = hwstat->rx_crc_err;
|
|
- nstat->rx_frame_errors = hwstat->rx_pre_shrink + hwstat->rx_drib_nib;
|
|
- nstat->rx_packets = hwstat->rx_ok_pkt;
|
|
- nstat->tx_packets = (hwstat->tx_unicast +
|
|
- hwstat->tx_multicast + hwstat->tx_brdcast);
|
|
- nstat->rx_bytes = hwstat->rx_byte;
|
|
- nstat->tx_bytes = hwstat->tx_byte;
|
|
- nstat->multicast = hwstat->rx_multicast;
|
|
- nstat->rx_missed_errors = hwstat->rx_pkt_ignr;
|
|
-
|
|
- dnet_print_pretty_hwstats(hwstat);
|
|
-
|
|
- return nstat;
|
|
-}
|
|
-
|
|
-static int dnet_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|
-{
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
- struct phy_device *phydev = bp->phy_dev;
|
|
-
|
|
- if (!phydev)
|
|
- return -ENODEV;
|
|
-
|
|
- return phy_ethtool_gset(phydev, cmd);
|
|
-}
|
|
-
|
|
-static int dnet_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|
-{
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
- struct phy_device *phydev = bp->phy_dev;
|
|
-
|
|
- if (!phydev)
|
|
- return -ENODEV;
|
|
-
|
|
- return phy_ethtool_sset(phydev, cmd);
|
|
-}
|
|
-
|
|
-static int dnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
|
-{
|
|
- struct dnet *bp = netdev_priv(dev);
|
|
- struct phy_device *phydev = bp->phy_dev;
|
|
-
|
|
- if (!netif_running(dev))
|
|
- return -EINVAL;
|
|
-
|
|
- if (!phydev)
|
|
- return -ENODEV;
|
|
-
|
|
- return phy_mii_ioctl(phydev, if_mii(rq), cmd);
|
|
-}
|
|
-
|
|
-static void dnet_get_drvinfo(struct net_device *dev,
|
|
- struct ethtool_drvinfo *info)
|
|
-{
|
|
- strcpy(info->driver, DRV_NAME);
|
|
- strcpy(info->version, DRV_VERSION);
|
|
- strcpy(info->bus_info, "0");
|
|
-}
|
|
-
|
|
-static const struct ethtool_ops dnet_ethtool_ops = {
|
|
- .get_settings = dnet_get_settings,
|
|
- .set_settings = dnet_set_settings,
|
|
- .get_drvinfo = dnet_get_drvinfo,
|
|
- .get_link = ethtool_op_get_link,
|
|
-};
|
|
-
|
|
-static const struct net_device_ops dnet_netdev_ops = {
|
|
- .ndo_open = dnet_open,
|
|
- .ndo_stop = dnet_close,
|
|
- .ndo_get_stats = dnet_get_stats,
|
|
- .ndo_start_xmit = dnet_start_xmit,
|
|
- .ndo_do_ioctl = dnet_ioctl,
|
|
- .ndo_set_mac_address = eth_mac_addr,
|
|
- .ndo_validate_addr = eth_validate_addr,
|
|
- .ndo_change_mtu = eth_change_mtu,
|
|
-};
|
|
-
|
|
-static int __devinit dnet_probe(struct platform_device *pdev)
|
|
-{
|
|
- struct resource *res;
|
|
- struct net_device *dev;
|
|
- struct dnet *bp;
|
|
- struct phy_device *phydev;
|
|
- int err = -ENXIO;
|
|
- unsigned int mem_base, mem_size, irq;
|
|
-
|
|
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
- if (!res) {
|
|
- dev_err(&pdev->dev, "no mmio resource defined\n");
|
|
- goto err_out;
|
|
- }
|
|
- mem_base = res->start;
|
|
- mem_size = resource_size(res);
|
|
- irq = platform_get_irq(pdev, 0);
|
|
-
|
|
- if (!request_mem_region(mem_base, mem_size, DRV_NAME)) {
|
|
- dev_err(&pdev->dev, "no memory region available\n");
|
|
- err = -EBUSY;
|
|
- goto err_out;
|
|
- }
|
|
-
|
|
- err = -ENOMEM;
|
|
- dev = alloc_etherdev(sizeof(*bp));
|
|
- if (!dev) {
|
|
- dev_err(&pdev->dev, "etherdev alloc failed, aborting.\n");
|
|
- goto err_out;
|
|
- }
|
|
-
|
|
- /* TODO: Actually, we have some interesting features... */
|
|
- dev->features |= 0;
|
|
-
|
|
- bp = netdev_priv(dev);
|
|
- bp->dev = dev;
|
|
-
|
|
- SET_NETDEV_DEV(dev, &pdev->dev);
|
|
-
|
|
- spin_lock_init(&bp->lock);
|
|
-
|
|
- bp->regs = ioremap(mem_base, mem_size);
|
|
- if (!bp->regs) {
|
|
- dev_err(&pdev->dev, "failed to map registers, aborting.\n");
|
|
- err = -ENOMEM;
|
|
- goto err_out_free_dev;
|
|
- }
|
|
-
|
|
- dev->irq = irq;
|
|
- err = request_irq(dev->irq, dnet_interrupt, 0, DRV_NAME, dev);
|
|
- if (err) {
|
|
- dev_err(&pdev->dev, "Unable to request IRQ %d (error %d)\n",
|
|
- irq, err);
|
|
- goto err_out_iounmap;
|
|
- }
|
|
-
|
|
- dev->netdev_ops = &dnet_netdev_ops;
|
|
- netif_napi_add(dev, &bp->napi, dnet_poll, 64);
|
|
- dev->ethtool_ops = &dnet_ethtool_ops;
|
|
-
|
|
- dev->base_addr = (unsigned long)bp->regs;
|
|
-
|
|
- bp->capabilities = dnet_readl(bp, VERCAPS) & DNET_CAPS_MASK;
|
|
-
|
|
- dnet_get_hwaddr(bp);
|
|
-
|
|
- if (!is_valid_ether_addr(dev->dev_addr)) {
|
|
- /* choose a random ethernet address */
|
|
- random_ether_addr(dev->dev_addr);
|
|
- __dnet_set_hwaddr(bp);
|
|
- }
|
|
-
|
|
- err = register_netdev(dev);
|
|
- if (err) {
|
|
- dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
|
|
- goto err_out_free_irq;
|
|
- }
|
|
-
|
|
- /* register the PHY board fixup (for Marvell 88E1111) */
|
|
- err = phy_register_fixup_for_uid(0x01410cc0, 0xfffffff0,
|
|
- dnet_phy_marvell_fixup);
|
|
- /* we can live without it, so just issue a warning */
|
|
- if (err)
|
|
- dev_warn(&pdev->dev, "Cannot register PHY board fixup.\n");
|
|
-
|
|
- if (dnet_mii_init(bp) != 0)
|
|
- goto err_out_unregister_netdev;
|
|
-
|
|
- dev_info(&pdev->dev, "Dave DNET at 0x%p (0x%08x) irq %d %pM\n",
|
|
- bp->regs, mem_base, dev->irq, dev->dev_addr);
|
|
- dev_info(&pdev->dev, "has %smdio, %sirq, %sgigabit, %sdma \n",
|
|
- (bp->capabilities & DNET_HAS_MDIO) ? "" : "no ",
|
|
- (bp->capabilities & DNET_HAS_IRQ) ? "" : "no ",
|
|
- (bp->capabilities & DNET_HAS_GIGABIT) ? "" : "no ",
|
|
- (bp->capabilities & DNET_HAS_DMA) ? "" : "no ");
|
|
- phydev = bp->phy_dev;
|
|
- dev_info(&pdev->dev, "attached PHY driver [%s] "
|
|
- "(mii_bus:phy_addr=%s, irq=%d)\n",
|
|
- phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
|
|
-
|
|
- return 0;
|
|
-
|
|
-err_out_unregister_netdev:
|
|
- unregister_netdev(dev);
|
|
-err_out_free_irq:
|
|
- free_irq(dev->irq, dev);
|
|
-err_out_iounmap:
|
|
- iounmap(bp->regs);
|
|
-err_out_free_dev:
|
|
- free_netdev(dev);
|
|
-err_out:
|
|
- return err;
|
|
-}
|
|
-
|
|
-static int __devexit dnet_remove(struct platform_device *pdev)
|
|
-{
|
|
-
|
|
- struct net_device *dev;
|
|
- struct dnet *bp;
|
|
-
|
|
- dev = platform_get_drvdata(pdev);
|
|
-
|
|
- if (dev) {
|
|
- bp = netdev_priv(dev);
|
|
- if (bp->phy_dev)
|
|
- phy_disconnect(bp->phy_dev);
|
|
- mdiobus_unregister(bp->mii_bus);
|
|
- kfree(bp->mii_bus->irq);
|
|
- mdiobus_free(bp->mii_bus);
|
|
- unregister_netdev(dev);
|
|
- free_irq(dev->irq, dev);
|
|
- iounmap(bp->regs);
|
|
- free_netdev(dev);
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static struct platform_driver dnet_driver = {
|
|
- .probe = dnet_probe,
|
|
- .remove = __devexit_p(dnet_remove),
|
|
- .driver = {
|
|
- .name = "dnet",
|
|
- },
|
|
-};
|
|
-
|
|
-static int __init dnet_init(void)
|
|
-{
|
|
- return platform_driver_register(&dnet_driver);
|
|
-}
|
|
-
|
|
-static void __exit dnet_exit(void)
|
|
-{
|
|
- platform_driver_unregister(&dnet_driver);
|
|
-}
|
|
-
|
|
-module_init(dnet_init);
|
|
-module_exit(dnet_exit);
|
|
-
|
|
-MODULE_LICENSE("GPL");
|
|
-MODULE_DESCRIPTION("Dave DNET Ethernet driver");
|
|
-MODULE_AUTHOR("Ilya Yanok <yanok@emcraft.com>, "
|
|
- "Matteo Vit <matteo.vit@dave.eu>");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/dnet.h linux-2.6.29-rc3.owrt/drivers/net/dnet.h
|
|
--- linux-2.6.29.owrt/drivers/net/dnet.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/dnet.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,225 +0,0 @@
|
|
-/*
|
|
- * Dave DNET Ethernet Controller driver
|
|
- *
|
|
- * Copyright (C) 2008 Dave S.r.l. <www.dave.eu>
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License version 2 as
|
|
- * published by the Free Software Foundation.
|
|
- */
|
|
-#ifndef _DNET_H
|
|
-#define _DNET_H
|
|
-
|
|
-#define DRV_NAME "dnet"
|
|
-#define DRV_VERSION "0.9.1"
|
|
-#define PFX DRV_NAME ": "
|
|
-
|
|
-/* Register access macros */
|
|
-#define dnet_writel(port, value, reg) \
|
|
- writel((value), (port)->regs + DNET_##reg)
|
|
-#define dnet_readl(port, reg) readl((port)->regs + DNET_##reg)
|
|
-
|
|
-/* ALL DNET FIFO REGISTERS */
|
|
-#define DNET_RX_LEN_FIFO 0x000 /* RX_LEN_FIFO */
|
|
-#define DNET_RX_DATA_FIFO 0x004 /* RX_DATA_FIFO */
|
|
-#define DNET_TX_LEN_FIFO 0x008 /* TX_LEN_FIFO */
|
|
-#define DNET_TX_DATA_FIFO 0x00C /* TX_DATA_FIFO */
|
|
-
|
|
-/* ALL DNET CONTROL/STATUS REGISTERS OFFSETS */
|
|
-#define DNET_VERCAPS 0x100 /* VERCAPS */
|
|
-#define DNET_INTR_SRC 0x104 /* INTR_SRC */
|
|
-#define DNET_INTR_ENB 0x108 /* INTR_ENB */
|
|
-#define DNET_RX_STATUS 0x10C /* RX_STATUS */
|
|
-#define DNET_TX_STATUS 0x110 /* TX_STATUS */
|
|
-#define DNET_RX_FRAMES_CNT 0x114 /* RX_FRAMES_CNT */
|
|
-#define DNET_TX_FRAMES_CNT 0x118 /* TX_FRAMES_CNT */
|
|
-#define DNET_RX_FIFO_TH 0x11C /* RX_FIFO_TH */
|
|
-#define DNET_TX_FIFO_TH 0x120 /* TX_FIFO_TH */
|
|
-#define DNET_SYS_CTL 0x124 /* SYS_CTL */
|
|
-#define DNET_PAUSE_TMR 0x128 /* PAUSE_TMR */
|
|
-#define DNET_RX_FIFO_WCNT 0x12C /* RX_FIFO_WCNT */
|
|
-#define DNET_TX_FIFO_WCNT 0x130 /* TX_FIFO_WCNT */
|
|
-
|
|
-/* ALL DNET MAC REGISTERS */
|
|
-#define DNET_MACREG_DATA 0x200 /* Mac-Reg Data */
|
|
-#define DNET_MACREG_ADDR 0x204 /* Mac-Reg Addr */
|
|
-
|
|
-/* ALL DNET RX STATISTICS COUNTERS */
|
|
-#define DNET_RX_PKT_IGNR_CNT 0x300
|
|
-#define DNET_RX_LEN_CHK_ERR_CNT 0x304
|
|
-#define DNET_RX_LNG_FRM_CNT 0x308
|
|
-#define DNET_RX_SHRT_FRM_CNT 0x30C
|
|
-#define DNET_RX_IPG_VIOL_CNT 0x310
|
|
-#define DNET_RX_CRC_ERR_CNT 0x314
|
|
-#define DNET_RX_OK_PKT_CNT 0x318
|
|
-#define DNET_RX_CTL_FRM_CNT 0x31C
|
|
-#define DNET_RX_PAUSE_FRM_CNT 0x320
|
|
-#define DNET_RX_MULTICAST_CNT 0x324
|
|
-#define DNET_RX_BROADCAST_CNT 0x328
|
|
-#define DNET_RX_VLAN_TAG_CNT 0x32C
|
|
-#define DNET_RX_PRE_SHRINK_CNT 0x330
|
|
-#define DNET_RX_DRIB_NIB_CNT 0x334
|
|
-#define DNET_RX_UNSUP_OPCD_CNT 0x338
|
|
-#define DNET_RX_BYTE_CNT 0x33C
|
|
-
|
|
-/* DNET TX STATISTICS COUNTERS */
|
|
-#define DNET_TX_UNICAST_CNT 0x400
|
|
-#define DNET_TX_PAUSE_FRM_CNT 0x404
|
|
-#define DNET_TX_MULTICAST_CNT 0x408
|
|
-#define DNET_TX_BRDCAST_CNT 0x40C
|
|
-#define DNET_TX_VLAN_TAG_CNT 0x410
|
|
-#define DNET_TX_BAD_FCS_CNT 0x414
|
|
-#define DNET_TX_JUMBO_CNT 0x418
|
|
-#define DNET_TX_BYTE_CNT 0x41C
|
|
-
|
|
-/* SOME INTERNAL MAC-CORE REGISTER */
|
|
-#define DNET_INTERNAL_MODE_REG 0x0
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_REG 0x2
|
|
-#define DNET_INTERNAL_MAX_PKT_SIZE_REG 0x4
|
|
-#define DNET_INTERNAL_IGP_REG 0x8
|
|
-#define DNET_INTERNAL_MAC_ADDR_0_REG 0xa
|
|
-#define DNET_INTERNAL_MAC_ADDR_1_REG 0xc
|
|
-#define DNET_INTERNAL_MAC_ADDR_2_REG 0xe
|
|
-#define DNET_INTERNAL_TX_RX_STS_REG 0x12
|
|
-#define DNET_INTERNAL_GMII_MNG_CTL_REG 0x14
|
|
-#define DNET_INTERNAL_GMII_MNG_DAT_REG 0x16
|
|
-
|
|
-#define DNET_INTERNAL_GMII_MNG_CMD_FIN (1 << 14)
|
|
-
|
|
-#define DNET_INTERNAL_WRITE (1 << 31)
|
|
-
|
|
-/* MAC-CORE REGISTER FIELDS */
|
|
-
|
|
-/* MAC-CORE MODE REGISTER FIELDS */
|
|
-#define DNET_INTERNAL_MODE_GBITEN (1 << 0)
|
|
-#define DNET_INTERNAL_MODE_FCEN (1 << 1)
|
|
-#define DNET_INTERNAL_MODE_RXEN (1 << 2)
|
|
-#define DNET_INTERNAL_MODE_TXEN (1 << 3)
|
|
-
|
|
-/* MAC-CORE RXTX CONTROL REGISTER FIELDS */
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_RXSHORTFRAME (1 << 8)
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_RXBROADCAST (1 << 7)
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_RXMULTICAST (1 << 4)
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_RXPAUSE (1 << 3)
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_DISTXFCS (1 << 2)
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_DISCFXFCS (1 << 1)
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_ENPROMISC (1 << 0)
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_DROPCONTROL (1 << 6)
|
|
-#define DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP (1 << 5)
|
|
-
|
|
-/* SYSTEM CONTROL REGISTER FIELDS */
|
|
-#define DNET_SYS_CTL_IGNORENEXTPKT (1 << 0)
|
|
-#define DNET_SYS_CTL_SENDPAUSE (1 << 2)
|
|
-#define DNET_SYS_CTL_RXFIFOFLUSH (1 << 3)
|
|
-#define DNET_SYS_CTL_TXFIFOFLUSH (1 << 4)
|
|
-
|
|
-/* TX STATUS REGISTER FIELDS */
|
|
-#define DNET_TX_STATUS_FIFO_ALMOST_EMPTY (1 << 2)
|
|
-#define DNET_TX_STATUS_FIFO_ALMOST_FULL (1 << 1)
|
|
-
|
|
-/* INTERRUPT SOURCE REGISTER FIELDS */
|
|
-#define DNET_INTR_SRC_TX_PKTSENT (1 << 0)
|
|
-#define DNET_INTR_SRC_TX_FIFOAF (1 << 1)
|
|
-#define DNET_INTR_SRC_TX_FIFOAE (1 << 2)
|
|
-#define DNET_INTR_SRC_TX_DISCFRM (1 << 3)
|
|
-#define DNET_INTR_SRC_TX_FIFOFULL (1 << 4)
|
|
-#define DNET_INTR_SRC_RX_CMDFIFOAF (1 << 8)
|
|
-#define DNET_INTR_SRC_RX_CMDFIFOFF (1 << 9)
|
|
-#define DNET_INTR_SRC_RX_DATAFIFOFF (1 << 10)
|
|
-#define DNET_INTR_SRC_TX_SUMMARY (1 << 16)
|
|
-#define DNET_INTR_SRC_RX_SUMMARY (1 << 17)
|
|
-#define DNET_INTR_SRC_PHY (1 << 19)
|
|
-
|
|
-/* INTERRUPT ENABLE REGISTER FIELDS */
|
|
-#define DNET_INTR_ENB_TX_PKTSENT (1 << 0)
|
|
-#define DNET_INTR_ENB_TX_FIFOAF (1 << 1)
|
|
-#define DNET_INTR_ENB_TX_FIFOAE (1 << 2)
|
|
-#define DNET_INTR_ENB_TX_DISCFRM (1 << 3)
|
|
-#define DNET_INTR_ENB_TX_FIFOFULL (1 << 4)
|
|
-#define DNET_INTR_ENB_RX_PKTRDY (1 << 8)
|
|
-#define DNET_INTR_ENB_RX_FIFOAF (1 << 9)
|
|
-#define DNET_INTR_ENB_RX_FIFOERR (1 << 10)
|
|
-#define DNET_INTR_ENB_RX_ERROR (1 << 11)
|
|
-#define DNET_INTR_ENB_RX_FIFOFULL (1 << 12)
|
|
-#define DNET_INTR_ENB_RX_FIFOAE (1 << 13)
|
|
-#define DNET_INTR_ENB_TX_SUMMARY (1 << 16)
|
|
-#define DNET_INTR_ENB_RX_SUMMARY (1 << 17)
|
|
-#define DNET_INTR_ENB_GLOBAL_ENABLE (1 << 18)
|
|
-
|
|
-/* default values:
|
|
- * almost empty = less than one full sized ethernet frame (no jumbo) inside
|
|
- * the fifo almost full = can write less than one full sized ethernet frame
|
|
- * (no jumbo) inside the fifo
|
|
- */
|
|
-#define DNET_CFG_TX_FIFO_FULL_THRES 25
|
|
-#define DNET_CFG_RX_FIFO_FULL_THRES 20
|
|
-
|
|
-/*
|
|
- * Capabilities. Used by the driver to know the capabilities that the ethernet
|
|
- * controller inside the FPGA have.
|
|
- */
|
|
-
|
|
-#define DNET_HAS_MDIO (1 << 0)
|
|
-#define DNET_HAS_IRQ (1 << 1)
|
|
-#define DNET_HAS_GIGABIT (1 << 2)
|
|
-#define DNET_HAS_DMA (1 << 3)
|
|
-
|
|
-#define DNET_HAS_MII (1 << 4) /* or GMII */
|
|
-#define DNET_HAS_RMII (1 << 5) /* or RGMII */
|
|
-
|
|
-#define DNET_CAPS_MASK 0xFFFF
|
|
-
|
|
-#define DNET_FIFO_SIZE 1024 /* 1K x 32 bit */
|
|
-#define DNET_FIFO_TX_DATA_AF_TH (DNET_FIFO_SIZE - 384) /* 384 = 1536 / 4 */
|
|
-#define DNET_FIFO_TX_DATA_AE_TH 384
|
|
-
|
|
-#define DNET_FIFO_RX_CMD_AF_TH (1 << 16) /* just one frame inside the FIFO */
|
|
-
|
|
-/*
|
|
- * Hardware-collected statistics.
|
|
- */
|
|
-struct dnet_stats {
|
|
- u32 rx_pkt_ignr;
|
|
- u32 rx_len_chk_err;
|
|
- u32 rx_lng_frm;
|
|
- u32 rx_shrt_frm;
|
|
- u32 rx_ipg_viol;
|
|
- u32 rx_crc_err;
|
|
- u32 rx_ok_pkt;
|
|
- u32 rx_ctl_frm;
|
|
- u32 rx_pause_frm;
|
|
- u32 rx_multicast;
|
|
- u32 rx_broadcast;
|
|
- u32 rx_vlan_tag;
|
|
- u32 rx_pre_shrink;
|
|
- u32 rx_drib_nib;
|
|
- u32 rx_unsup_opcd;
|
|
- u32 rx_byte;
|
|
- u32 tx_unicast;
|
|
- u32 tx_pause_frm;
|
|
- u32 tx_multicast;
|
|
- u32 tx_brdcast;
|
|
- u32 tx_vlan_tag;
|
|
- u32 tx_bad_fcs;
|
|
- u32 tx_jumbo;
|
|
- u32 tx_byte;
|
|
-};
|
|
-
|
|
-struct dnet {
|
|
- void __iomem *regs;
|
|
- spinlock_t lock;
|
|
- struct platform_device *pdev;
|
|
- struct net_device *dev;
|
|
- struct dnet_stats hw_stats;
|
|
- unsigned int capabilities; /* read from FPGA */
|
|
- struct napi_struct napi;
|
|
-
|
|
- /* PHY stuff */
|
|
- struct mii_bus *mii_bus;
|
|
- struct phy_device *phy_dev;
|
|
- unsigned int link;
|
|
- unsigned int speed;
|
|
- unsigned int duplex;
|
|
-};
|
|
-
|
|
-#endif /* _DNET_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/e1000/e1000_main.c linux-2.6.29-rc3.owrt/drivers/net/e1000/e1000_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/e1000/e1000_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/e1000/e1000_main.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -31,7 +31,7 @@
|
|
|
|
char e1000_driver_name[] = "e1000";
|
|
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
|
|
-#define DRV_VERSION "7.3.21-k3-NAPI"
|
|
+#define DRV_VERSION "7.3.20-k3-NAPI"
|
|
const char e1000_driver_version[] = DRV_VERSION;
|
|
static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
|
|
|
|
@@ -940,7 +940,7 @@
|
|
err = pci_enable_device(pdev);
|
|
} else {
|
|
bars = pci_select_bars(pdev, IORESOURCE_MEM);
|
|
- err = pci_enable_device_mem(pdev);
|
|
+ err = pci_enable_device(pdev);
|
|
}
|
|
if (err)
|
|
return err;
|
|
@@ -3712,7 +3712,7 @@
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
u32 rctl, icr = er32(ICR);
|
|
|
|
- if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags)))
|
|
+ if (unlikely(!icr))
|
|
return IRQ_NONE; /* Not our interrupt */
|
|
|
|
/* IMS will not auto-mask if INT_ASSERTED is not set, and if it is
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/forcedeth.c linux-2.6.29-rc3.owrt/drivers/net/forcedeth.c
|
|
--- linux-2.6.29.owrt/drivers/net/forcedeth.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/forcedeth.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -6011,20 +6011,9 @@
|
|
if (netif_running(dev))
|
|
nv_close(dev);
|
|
|
|
- /*
|
|
- * Restore the MAC so a kernel started by kexec won't get confused.
|
|
- * If we really go for poweroff, we must not restore the MAC,
|
|
- * otherwise the MAC for WOL will be reversed at least on some boards.
|
|
- */
|
|
- if (system_state != SYSTEM_POWER_OFF) {
|
|
- nv_restore_mac_addr(pdev);
|
|
- }
|
|
+ nv_restore_mac_addr(pdev);
|
|
|
|
pci_disable_device(pdev);
|
|
- /*
|
|
- * Apparently it is not possible to reinitialise from D3 hot,
|
|
- * only put the device into D3 if we really go for poweroff.
|
|
- */
|
|
if (system_state == SYSTEM_POWER_OFF) {
|
|
if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled))
|
|
pci_enable_wake(pdev, PCI_D3hot, np->wolenabled);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/gianfar.c linux-2.6.29-rc3.owrt/drivers/net/gianfar.c
|
|
--- linux-2.6.29.owrt/drivers/net/gianfar.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/gianfar.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -351,9 +351,6 @@
|
|
/* Reset MAC layer */
|
|
gfar_write(&priv->regs->maccfg1, MACCFG1_SOFT_RESET);
|
|
|
|
- /* We need to delay at least 3 TX clocks */
|
|
- udelay(2);
|
|
-
|
|
tempval = (MACCFG1_TX_FLOW | MACCFG1_RX_FLOW);
|
|
gfar_write(&priv->regs->maccfg1, tempval);
|
|
|
|
@@ -1284,7 +1281,7 @@
|
|
spin_lock_irqsave(&priv->txlock, flags);
|
|
|
|
/* check if there is space to queue this packet */
|
|
- if ((nr_frags+1) > priv->num_txbdfree) {
|
|
+ if (nr_frags > priv->num_txbdfree) {
|
|
/* no space, stop the queue */
|
|
netif_stop_queue(dev);
|
|
dev->stats.tx_fifo_errors++;
|
|
@@ -1629,12 +1626,6 @@
|
|
if (netif_rx_schedule_prep(&priv->napi)) {
|
|
gfar_write(&priv->regs->imask, IMASK_RTX_DISABLED);
|
|
__netif_rx_schedule(&priv->napi);
|
|
- } else {
|
|
- /*
|
|
- * Clear IEVENT, so interrupts aren't called again
|
|
- * because of the packets that have already arrived.
|
|
- */
|
|
- gfar_write(&priv->regs->ievent, IEVENT_RTX_MASK);
|
|
}
|
|
|
|
spin_unlock(&priv->rxlock);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/gianfar.h linux-2.6.29-rc3.owrt/drivers/net/gianfar.h
|
|
--- linux-2.6.29.owrt/drivers/net/gianfar.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/gianfar.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -312,7 +312,7 @@
|
|
#define ATTRELI_EI(x) (x)
|
|
|
|
#define BD_LFLAG(flags) ((flags) << 16)
|
|
-#define BD_LENGTH_MASK 0x0000ffff
|
|
+#define BD_LENGTH_MASK 0x00ff
|
|
|
|
/* TxBD status field bits */
|
|
#define TXBD_READY 0x8000
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/gianfar_mii.c linux-2.6.29-rc3.owrt/drivers/net/gianfar_mii.c
|
|
--- linux-2.6.29.owrt/drivers/net/gianfar_mii.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/gianfar_mii.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -234,8 +234,6 @@
|
|
if (NULL == new_bus)
|
|
return -ENOMEM;
|
|
|
|
- device_init_wakeup(&ofdev->dev, 1);
|
|
-
|
|
new_bus->name = "Gianfar MII Bus",
|
|
new_bus->read = &gfar_mdio_read,
|
|
new_bus->write = &gfar_mdio_write,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/hp-plus.c linux-2.6.29-rc3.owrt/drivers/net/hp-plus.c
|
|
--- linux-2.6.29.owrt/drivers/net/hp-plus.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/hp-plus.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -467,7 +467,7 @@
|
|
if (this_dev != 0) break; /* only autoprobe 1st one */
|
|
printk(KERN_NOTICE "hp-plus.c: Presently autoprobing (not recommended) for a single card.\n");
|
|
}
|
|
- dev = alloc_eip_netdev();
|
|
+ dev = alloc_ei_netdev();
|
|
if (!dev)
|
|
break;
|
|
dev->irq = irq[this_dev];
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/ibm_newemac/core.c linux-2.6.29-rc3.owrt/drivers/net/ibm_newemac/core.c
|
|
--- linux-2.6.29.owrt/drivers/net/ibm_newemac/core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/ibm_newemac/core.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -2594,9 +2594,6 @@
|
|
if (of_device_is_compatible(np, "ibm,emac-460ex") ||
|
|
of_device_is_compatible(np, "ibm,emac-460gt"))
|
|
dev->features |= EMAC_FTR_460EX_PHY_CLK_FIX;
|
|
- if (of_device_is_compatible(np, "ibm,emac-405ex") ||
|
|
- of_device_is_compatible(np, "ibm,emac-405exr"))
|
|
- dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX;
|
|
} else if (of_device_is_compatible(np, "ibm,emac4")) {
|
|
dev->features |= EMAC_FTR_EMAC4;
|
|
if (of_device_is_compatible(np, "ibm,emac-440gx"))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/ibm_newemac/phy.c linux-2.6.29-rc3.owrt/drivers/net/ibm_newemac/phy.c
|
|
--- linux-2.6.29.owrt/drivers/net/ibm_newemac/phy.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/ibm_newemac/phy.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -60,7 +60,7 @@
|
|
|
|
udelay(300);
|
|
|
|
- while (--limit) {
|
|
+ while (limit--) {
|
|
val = phy_read(phy, MII_BMCR);
|
|
if (val >= 0 && (val & BMCR_RESET) == 0)
|
|
break;
|
|
@@ -84,7 +84,7 @@
|
|
|
|
udelay(300);
|
|
|
|
- while (--limit) {
|
|
+ while (limit--) {
|
|
val = gpcs_phy_read(phy, MII_BMCR);
|
|
if (val >= 0 && (val & BMCR_RESET) == 0)
|
|
break;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/igb/e1000_82575.c linux-2.6.29-rc3.owrt/drivers/net/igb/e1000_82575.c
|
|
--- linux-2.6.29.owrt/drivers/net/igb/e1000_82575.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/igb/e1000_82575.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -699,18 +699,11 @@
|
|
|
|
/* SGMII link check is done through the PCS register. */
|
|
if ((hw->phy.media_type != e1000_media_type_copper) ||
|
|
- (igb_sgmii_active_82575(hw))) {
|
|
+ (igb_sgmii_active_82575(hw)))
|
|
ret_val = igb_get_pcs_speed_and_duplex_82575(hw, &speed,
|
|
&duplex);
|
|
- /*
|
|
- * Use this flag to determine if link needs to be checked or
|
|
- * not. If we have link clear the flag so that we do not
|
|
- * continue to check for link.
|
|
- */
|
|
- hw->mac.get_link_status = !hw->mac.serdes_has_link;
|
|
- } else {
|
|
+ else
|
|
ret_val = igb_check_for_copper_link(hw);
|
|
- }
|
|
|
|
return ret_val;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/igb/igb.h linux-2.6.29-rc3.owrt/drivers/net/igb/igb.h
|
|
--- linux-2.6.29.owrt/drivers/net/igb/igb.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/igb/igb.h 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -300,10 +300,11 @@
|
|
|
|
#define IGB_FLAG_HAS_MSI (1 << 0)
|
|
#define IGB_FLAG_MSI_ENABLE (1 << 1)
|
|
-#define IGB_FLAG_DCA_ENABLED (1 << 2)
|
|
-#define IGB_FLAG_IN_NETPOLL (1 << 3)
|
|
-#define IGB_FLAG_QUAD_PORT_A (1 << 4)
|
|
-#define IGB_FLAG_NEED_CTX_IDX (1 << 5)
|
|
+#define IGB_FLAG_HAS_DCA (1 << 2)
|
|
+#define IGB_FLAG_DCA_ENABLED (1 << 3)
|
|
+#define IGB_FLAG_IN_NETPOLL (1 << 5)
|
|
+#define IGB_FLAG_QUAD_PORT_A (1 << 6)
|
|
+#define IGB_FLAG_NEED_CTX_IDX (1 << 7)
|
|
|
|
enum e1000_state_t {
|
|
__IGB_TESTING,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/igb/igb_main.c linux-2.6.29-rc3.owrt/drivers/net/igb/igb_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/igb/igb_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/igb/igb_main.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -206,11 +206,10 @@
|
|
|
|
global_quad_port_a = 0;
|
|
|
|
+ ret = pci_register_driver(&igb_driver);
|
|
#ifdef CONFIG_IGB_DCA
|
|
dca_register_notify(&dca_notifier);
|
|
#endif
|
|
-
|
|
- ret = pci_register_driver(&igb_driver);
|
|
return ret;
|
|
}
|
|
|
|
@@ -1023,10 +1022,11 @@
|
|
struct net_device *netdev;
|
|
struct igb_adapter *adapter;
|
|
struct e1000_hw *hw;
|
|
+ struct pci_dev *us_dev;
|
|
const struct e1000_info *ei = igb_info_tbl[ent->driver_data];
|
|
unsigned long mmio_start, mmio_len;
|
|
- int i, err, pci_using_dac;
|
|
- u16 eeprom_data = 0;
|
|
+ int i, err, pci_using_dac, pos;
|
|
+ u16 eeprom_data = 0, state = 0;
|
|
u16 eeprom_apme_mask = IGB_EEPROM_APME;
|
|
u32 part_num;
|
|
int bars, need_ioport;
|
|
@@ -1061,6 +1061,27 @@
|
|
}
|
|
}
|
|
|
|
+ /* 82575 requires that the pci-e link partner disable the L0s state */
|
|
+ switch (pdev->device) {
|
|
+ case E1000_DEV_ID_82575EB_COPPER:
|
|
+ case E1000_DEV_ID_82575EB_FIBER_SERDES:
|
|
+ case E1000_DEV_ID_82575GB_QUAD_COPPER:
|
|
+ us_dev = pdev->bus->self;
|
|
+ pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP);
|
|
+ if (pos) {
|
|
+ pci_read_config_word(us_dev, pos + PCI_EXP_LNKCTL,
|
|
+ &state);
|
|
+ state &= ~PCIE_LINK_STATE_L0S;
|
|
+ pci_write_config_word(us_dev, pos + PCI_EXP_LNKCTL,
|
|
+ state);
|
|
+ dev_info(&pdev->dev,
|
|
+ "Disabling ASPM L0s upstream switch port %s\n",
|
|
+ pci_name(us_dev));
|
|
+ }
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
err = pci_request_selected_regions(pdev, bars, igb_driver_name);
|
|
if (err)
|
|
goto err_pci_reg;
|
|
@@ -1135,10 +1156,11 @@
|
|
|
|
/* set flags */
|
|
switch (hw->mac.type) {
|
|
+ case e1000_82576:
|
|
case e1000_82575:
|
|
+ adapter->flags |= IGB_FLAG_HAS_DCA;
|
|
adapter->flags |= IGB_FLAG_NEED_CTX_IDX;
|
|
break;
|
|
- case e1000_82576:
|
|
default:
|
|
break;
|
|
}
|
|
@@ -1288,7 +1310,8 @@
|
|
goto err_register;
|
|
|
|
#ifdef CONFIG_IGB_DCA
|
|
- if (dca_add_requester(&pdev->dev) == 0) {
|
|
+ if ((adapter->flags & IGB_FLAG_HAS_DCA) &&
|
|
+ (dca_add_requester(&pdev->dev) == 0)) {
|
|
adapter->flags |= IGB_FLAG_DCA_ENABLED;
|
|
dev_info(&pdev->dev, "DCA enabled\n");
|
|
/* Always use CB2 mode, difference is masked
|
|
@@ -1812,11 +1835,11 @@
|
|
rctl |= E1000_RCTL_SECRC;
|
|
|
|
/*
|
|
- * disable store bad packets and clear size bits.
|
|
+ * disable store bad packets, long packet enable, and clear size bits.
|
|
*/
|
|
- rctl &= ~(E1000_RCTL_SBP | E1000_RCTL_SZ_256);
|
|
+ rctl &= ~(E1000_RCTL_SBP | E1000_RCTL_LPE | E1000_RCTL_SZ_256);
|
|
|
|
- /* enable LPE when to prevent packets larger than max_frame_size */
|
|
+ if (adapter->netdev->mtu > ETH_DATA_LEN)
|
|
rctl |= E1000_RCTL_LPE;
|
|
|
|
/* Setup buffer sizes */
|
|
@@ -1842,7 +1865,7 @@
|
|
*/
|
|
/* allocations using alloc_page take too long for regular MTU
|
|
* so only enable packet split for jumbo frames */
|
|
- if (adapter->netdev->mtu > ETH_DATA_LEN) {
|
|
+ if (rctl & E1000_RCTL_LPE) {
|
|
adapter->rx_ps_hdr_size = IGB_RXBUFFER_128;
|
|
srrctl |= adapter->rx_ps_hdr_size <<
|
|
E1000_SRRCTL_BSIZEHDRSIZE_SHIFT;
|
|
@@ -3450,16 +3473,19 @@
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
unsigned long event = *(unsigned long *)data;
|
|
|
|
+ if (!(adapter->flags & IGB_FLAG_HAS_DCA))
|
|
+ goto out;
|
|
+
|
|
switch (event) {
|
|
case DCA_PROVIDER_ADD:
|
|
/* if already enabled, don't do it again */
|
|
if (adapter->flags & IGB_FLAG_DCA_ENABLED)
|
|
break;
|
|
+ adapter->flags |= IGB_FLAG_DCA_ENABLED;
|
|
/* Always use CB2 mode, difference is masked
|
|
* in the CB driver. */
|
|
wr32(E1000_DCA_CTRL, 2);
|
|
if (dca_add_requester(dev) == 0) {
|
|
- adapter->flags |= IGB_FLAG_DCA_ENABLED;
|
|
dev_info(&adapter->pdev->dev, "DCA enabled\n");
|
|
igb_setup_dca(adapter);
|
|
break;
|
|
@@ -3476,7 +3502,7 @@
|
|
}
|
|
break;
|
|
}
|
|
-
|
|
+out:
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/irda/mcs7780.c linux-2.6.29-rc3.owrt/drivers/net/irda/mcs7780.c
|
|
--- linux-2.6.29.owrt/drivers/net/irda/mcs7780.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/irda/mcs7780.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -585,7 +585,7 @@
|
|
mcs_get_reg(mcs, MCS_RESV_REG, &rval);
|
|
} while(cnt++ < 100 && (rval & MCS_IRINTX));
|
|
|
|
- if (cnt > 100) {
|
|
+ if(cnt >= 100) {
|
|
IRDA_ERROR("unable to change speed\n");
|
|
ret = -EIO;
|
|
goto error;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/ixgbe/ixgbe_main.c linux-2.6.29-rc3.owrt/drivers/net/ixgbe/ixgbe_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/ixgbe/ixgbe_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/ixgbe/ixgbe_main.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -3973,7 +3973,6 @@
|
|
.ndo_stop = ixgbe_close,
|
|
.ndo_start_xmit = ixgbe_xmit_frame,
|
|
.ndo_get_stats = ixgbe_get_stats,
|
|
- .ndo_set_rx_mode = ixgbe_set_rx_mode,
|
|
.ndo_set_multicast_list = ixgbe_set_rx_mode,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
.ndo_set_mac_address = ixgbe_set_mac,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/jme.c linux-2.6.29-rc3.owrt/drivers/net/jme.c
|
|
--- linux-2.6.29.owrt/drivers/net/jme.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/jme.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -957,14 +957,13 @@
|
|
goto out_inc;
|
|
|
|
i = atomic_read(&rxring->next_to_clean);
|
|
- while (limit > 0) {
|
|
+ while (limit-- > 0) {
|
|
rxdesc = rxring->desc;
|
|
rxdesc += i;
|
|
|
|
if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) ||
|
|
!(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL))
|
|
goto out;
|
|
- --limit;
|
|
|
|
desccnt = rxdesc->descwb.desccnt & RXWBDCNT_DCNT;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/Kconfig linux-2.6.29-rc3.owrt/drivers/net/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/net/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/Kconfig 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1163,17 +1163,6 @@
|
|
To compile this driver as a module, choose M here. The module
|
|
will be called ni65.
|
|
|
|
-config DNET
|
|
- tristate "Dave ethernet support (DNET)"
|
|
- depends on NET_ETHERNET && HAS_IOMEM
|
|
- select PHYLIB
|
|
- help
|
|
- The Dave ethernet interface (DNET) is found on Qong Board FPGA.
|
|
- Say Y to include support for the DNET chip.
|
|
-
|
|
- To compile this driver as a module, choose M here: the module
|
|
- will be called dnet.
|
|
-
|
|
source "drivers/net/tulip/Kconfig"
|
|
|
|
config AT1700
|
|
@@ -2476,17 +2465,6 @@
|
|
To compile this driver as a module, choose M here. The module
|
|
will be called atl1e.
|
|
|
|
-config ATL1C
|
|
- tristate "Atheros L1C Gigabit Ethernet support (EXPERIMENTAL)"
|
|
- depends on PCI && EXPERIMENTAL
|
|
- select CRC32
|
|
- select MII
|
|
- help
|
|
- This driver supports the Atheros L1C gigabit ethernet adapter.
|
|
-
|
|
- To compile this driver as a module, choose M here. The module
|
|
- will be called atl1c.
|
|
-
|
|
config JME
|
|
tristate "JMicron(R) PCI-Express Gigabit Ethernet support"
|
|
depends on PCI
|
|
@@ -2753,8 +2731,6 @@
|
|
|
|
source "drivers/net/sfc/Kconfig"
|
|
|
|
-source "drivers/net/benet/Kconfig"
|
|
-
|
|
endif # NETDEV_10000
|
|
|
|
source "drivers/net/tokenring/Kconfig"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/Makefile linux-2.6.29-rc3.owrt/drivers/net/Makefile
|
|
--- linux-2.6.29.owrt/drivers/net/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/Makefile 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -17,12 +17,10 @@
|
|
obj-$(CONFIG_ATL1) += atlx/
|
|
obj-$(CONFIG_ATL2) += atlx/
|
|
obj-$(CONFIG_ATL1E) += atl1e/
|
|
-obj-$(CONFIG_ATL1C) += atl1c/
|
|
obj-$(CONFIG_GIANFAR) += gianfar_driver.o
|
|
obj-$(CONFIG_TEHUTI) += tehuti.o
|
|
obj-$(CONFIG_ENIC) += enic/
|
|
obj-$(CONFIG_JME) += jme.o
|
|
-obj-$(CONFIG_BE2NET) += benet/
|
|
|
|
gianfar_driver-objs := gianfar.o \
|
|
gianfar_ethtool.o \
|
|
@@ -233,7 +231,6 @@
|
|
|
|
obj-$(CONFIG_XTENSA_XT2000_SONIC) += xtsonic.o
|
|
|
|
-obj-$(CONFIG_DNET) += dnet.o
|
|
obj-$(CONFIG_MACB) += macb.o
|
|
|
|
obj-$(CONFIG_ARM) += arm/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/mv643xx_eth.c linux-2.6.29-rc3.owrt/drivers/net/mv643xx_eth.c
|
|
--- linux-2.6.29.owrt/drivers/net/mv643xx_eth.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/mv643xx_eth.c 2009-05-10 23:48:28.000000000 +0200
|
|
@@ -1175,7 +1175,7 @@
|
|
{
|
|
struct mib_counters *p = &mp->mib_counters;
|
|
|
|
- spin_lock_bh(&mp->mib_counters_lock);
|
|
+ spin_lock(&mp->mib_counters_lock);
|
|
p->good_octets_received += mib_read(mp, 0x00);
|
|
p->good_octets_received += (u64)mib_read(mp, 0x04) << 32;
|
|
p->bad_octets_received += mib_read(mp, 0x08);
|
|
@@ -1208,7 +1208,7 @@
|
|
p->bad_crc_event += mib_read(mp, 0x74);
|
|
p->collision += mib_read(mp, 0x78);
|
|
p->late_collision += mib_read(mp, 0x7c);
|
|
- spin_unlock_bh(&mp->mib_counters_lock);
|
|
+ spin_unlock(&mp->mib_counters_lock);
|
|
|
|
mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ);
|
|
}
|
|
@@ -1575,7 +1575,7 @@
|
|
return;
|
|
}
|
|
|
|
- mc_spec = kmalloc(0x200, GFP_ATOMIC);
|
|
+ mc_spec = kmalloc(0x200, GFP_KERNEL);
|
|
if (mc_spec == NULL)
|
|
goto oom;
|
|
mc_other = mc_spec + (0x100 >> 2);
|
|
@@ -2030,6 +2030,11 @@
|
|
}
|
|
|
|
/*
|
|
+ * Add configured unicast address to address filter table.
|
|
+ */
|
|
+ mv643xx_eth_program_unicast_filter(mp->dev);
|
|
+
|
|
+ /*
|
|
* Receive all unmatched unicast, TCP, UDP, BPDU and broadcast
|
|
* frames to RX queue #0, and include the pseudo-header when
|
|
* calculating receive checksums.
|
|
@@ -2042,11 +2047,6 @@
|
|
wrlp(mp, PORT_CONFIG_EXT, 0x00000000);
|
|
|
|
/*
|
|
- * Add configured unicast addresses to address filter table.
|
|
- */
|
|
- mv643xx_eth_program_unicast_filter(mp->dev);
|
|
-
|
|
- /*
|
|
* Enable the receive queues.
|
|
*/
|
|
for (i = 0; i < mp->rxq_count; i++) {
|
|
@@ -2216,6 +2216,8 @@
|
|
wrlp(mp, INT_MASK, 0x00000000);
|
|
rdlp(mp, INT_MASK);
|
|
|
|
+ del_timer_sync(&mp->mib_counters_timer);
|
|
+
|
|
napi_disable(&mp->napi);
|
|
|
|
del_timer_sync(&mp->rx_oom);
|
|
@@ -2227,7 +2229,6 @@
|
|
port_reset(mp);
|
|
mv643xx_eth_get_stats(dev);
|
|
mib_counters_update(mp);
|
|
- del_timer_sync(&mp->mib_counters_timer);
|
|
|
|
skb_queue_purge(&mp->rx_recycle);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/netxen/netxen_nic.h linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic.h
|
|
--- linux-2.6.29.owrt/drivers/net/netxen/netxen_nic.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -210,7 +210,7 @@
|
|
#define MAX_CMD_DESCRIPTORS_HOST 1024
|
|
#define MAX_RCV_DESCRIPTORS_1G 2048
|
|
#define MAX_RCV_DESCRIPTORS_10G 4096
|
|
-#define MAX_JUMBO_RCV_DESCRIPTORS 1024
|
|
+#define MAX_JUMBO_RCV_DESCRIPTORS 512
|
|
#define MAX_LRO_RCV_DESCRIPTORS 8
|
|
#define MAX_RCVSTATUS_DESCRIPTORS MAX_RCV_DESCRIPTORS
|
|
#define MAX_JUMBO_RCV_DESC MAX_JUMBO_RCV_DESCRIPTORS
|
|
@@ -1203,7 +1203,7 @@
|
|
#define NETXEN_IS_MSI_FAMILY(adapter) \
|
|
((adapter)->flags & (NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED))
|
|
|
|
-#define MSIX_ENTRIES_PER_ADAPTER 1
|
|
+#define MSIX_ENTRIES_PER_ADAPTER 8
|
|
#define NETXEN_MSIX_TBL_SPACE 8192
|
|
#define NETXEN_PCI_REG_MSIX_TBL 0x44
|
|
|
|
@@ -1595,6 +1595,7 @@
|
|
}
|
|
|
|
|
|
+int netxen_is_flash_supported(struct netxen_adapter *adapter);
|
|
int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac);
|
|
int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac);
|
|
extern void netxen_change_ringparam(struct netxen_adapter *adapter);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_hw.c linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_hw.c
|
|
--- linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_hw.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_hw.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -706,6 +706,28 @@
|
|
return rc;
|
|
}
|
|
|
|
+int netxen_is_flash_supported(struct netxen_adapter *adapter)
|
|
+{
|
|
+ const int locs[] = { 0, 0x4, 0x100, 0x4000, 0x4128 };
|
|
+ int addr, val01, val02, i, j;
|
|
+
|
|
+ /* if the flash size less than 4Mb, make huge war cry and die */
|
|
+ for (j = 1; j < 4; j++) {
|
|
+ addr = j * NETXEN_NIC_WINDOW_MARGIN;
|
|
+ for (i = 0; i < ARRAY_SIZE(locs); i++) {
|
|
+ if (netxen_rom_fast_read(adapter, locs[i], &val01) == 0
|
|
+ && netxen_rom_fast_read(adapter, (addr + locs[i]),
|
|
+ &val02) == 0) {
|
|
+ if (val01 == val02)
|
|
+ return -1;
|
|
+ } else
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int netxen_get_flash_block(struct netxen_adapter *adapter, int base,
|
|
int size, __le32 * buf)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_init.c linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_init.c
|
|
--- linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_init.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_init.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -947,10 +947,8 @@
|
|
}
|
|
for (i = 0; i < n; i++) {
|
|
if (netxen_rom_fast_read(adapter, 8*i + 4*offset, &val) != 0 ||
|
|
- netxen_rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0) {
|
|
- kfree(buf);
|
|
+ netxen_rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0)
|
|
return -EIO;
|
|
- }
|
|
|
|
buf[i].addr = addr;
|
|
buf[i].data = val;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_main.c linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_main.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -76,7 +76,6 @@
|
|
#endif
|
|
static irqreturn_t netxen_intr(int irq, void *data);
|
|
static irqreturn_t netxen_msi_intr(int irq, void *data);
|
|
-static irqreturn_t netxen_msix_intr(int irq, void *data);
|
|
|
|
/* PCI Device ID Table */
|
|
#define ENTRY(device) \
|
|
@@ -201,9 +200,9 @@
|
|
adapter->pci_using_dac = 1;
|
|
return 0;
|
|
}
|
|
-set_32_bit_mask:
|
|
#endif /* CONFIG_IA64 */
|
|
|
|
+set_32_bit_mask:
|
|
err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
|
|
if (!err)
|
|
err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
|
|
@@ -372,6 +371,67 @@
|
|
}
|
|
}
|
|
|
|
+#define PCI_CAP_ID_GEN 0x10
|
|
+
|
|
+static void netxen_pcie_strap_init(struct netxen_adapter *adapter)
|
|
+{
|
|
+ u32 pdevfuncsave;
|
|
+ u32 c8c9value = 0;
|
|
+ u32 chicken = 0;
|
|
+ u32 control = 0;
|
|
+ int i, pos;
|
|
+ struct pci_dev *pdev;
|
|
+
|
|
+ pdev = adapter->pdev;
|
|
+
|
|
+ adapter->hw_read_wx(adapter,
|
|
+ NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
|
|
+ /* clear chicken3.25:24 */
|
|
+ chicken &= 0xFCFFFFFF;
|
|
+ /*
|
|
+ * if gen1 and B0, set F1020 - if gen 2, do nothing
|
|
+ * if gen2 set to F1000
|
|
+ */
|
|
+ pos = pci_find_capability(pdev, PCI_CAP_ID_GEN);
|
|
+ if (pos == 0xC0) {
|
|
+ pci_read_config_dword(pdev, pos + 0x10, &control);
|
|
+ if ((control & 0x000F0000) != 0x00020000) {
|
|
+ /* set chicken3.24 if gen1 */
|
|
+ chicken |= 0x01000000;
|
|
+ }
|
|
+ printk(KERN_INFO "%s Gen2 strapping detected\n",
|
|
+ netxen_nic_driver_name);
|
|
+ c8c9value = 0xF1000;
|
|
+ } else {
|
|
+ /* set chicken3.24 if gen1 */
|
|
+ chicken |= 0x01000000;
|
|
+ printk(KERN_INFO "%s Gen1 strapping detected\n",
|
|
+ netxen_nic_driver_name);
|
|
+ if (adapter->ahw.revision_id == NX_P3_B0)
|
|
+ c8c9value = 0xF1020;
|
|
+ else
|
|
+ c8c9value = 0;
|
|
+
|
|
+ }
|
|
+ adapter->hw_write_wx(adapter,
|
|
+ NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
|
|
+
|
|
+ if (!c8c9value)
|
|
+ return;
|
|
+
|
|
+ pdevfuncsave = pdev->devfn;
|
|
+ if (pdevfuncsave & 0x07)
|
|
+ return;
|
|
+
|
|
+ for (i = 0; i < 8; i++) {
|
|
+ pci_read_config_dword(pdev, pos + 8, &control);
|
|
+ pci_read_config_dword(pdev, pos + 8, &control);
|
|
+ pci_write_config_dword(pdev, pos + 8, c8c9value);
|
|
+ pdev->devfn++;
|
|
+ }
|
|
+ pdev->devfn = pdevfuncsave;
|
|
+}
|
|
+
|
|
static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
|
|
{
|
|
u32 control;
|
|
@@ -405,6 +465,9 @@
|
|
struct net_device *netdev = adapter->netdev;
|
|
struct pci_dev *pdev = adapter->pdev;
|
|
|
|
+ if (netxen_is_flash_supported(adapter) != 0)
|
|
+ return -EIO;
|
|
+
|
|
if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
|
|
if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0)
|
|
return -EIO;
|
|
@@ -585,12 +648,7 @@
|
|
adapter->pci_mem_read = netxen_nic_pci_mem_read_2M;
|
|
adapter->pci_mem_write = netxen_nic_pci_mem_write_2M;
|
|
|
|
- mem_ptr0 = pci_ioremap_bar(pdev, 0);
|
|
- if (mem_ptr0 == NULL) {
|
|
- dev_err(&pdev->dev, "failed to map PCI bar 0\n");
|
|
- return -EIO;
|
|
- }
|
|
-
|
|
+ mem_ptr0 = ioremap(mem_base, mem_len);
|
|
pci_len0 = mem_len;
|
|
first_page_group_start = 0;
|
|
first_page_group_end = 0;
|
|
@@ -753,6 +811,9 @@
|
|
}
|
|
netxen_load_firmware(adapter);
|
|
|
|
+ if (NX_IS_REVISION_P3(revision_id))
|
|
+ netxen_pcie_strap_init(adapter);
|
|
+
|
|
if (NX_IS_REVISION_P2(revision_id)) {
|
|
|
|
/* Initialize multicast addr pool owners */
|
|
@@ -797,12 +858,9 @@
|
|
* See if the firmware gave us a virtual-physical port mapping.
|
|
*/
|
|
adapter->physical_port = adapter->portnum;
|
|
- if (adapter->fw_major < 4) {
|
|
- i = adapter->pci_read_normalize(adapter,
|
|
- CRB_V2P(adapter->portnum));
|
|
- if (i != 0x55555555)
|
|
- adapter->physical_port = i;
|
|
- }
|
|
+ i = adapter->pci_read_normalize(adapter, CRB_V2P(adapter->portnum));
|
|
+ if (i != 0x55555555)
|
|
+ adapter->physical_port = i;
|
|
|
|
adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
|
|
|
|
@@ -1026,9 +1084,7 @@
|
|
for (ring = 0; ring < adapter->max_rds_rings; ring++)
|
|
netxen_post_rx_buffers(adapter, ctx, ring);
|
|
}
|
|
- if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
|
|
- handler = netxen_msix_intr;
|
|
- else if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
|
|
+ if (NETXEN_IS_MSI_FAMILY(adapter))
|
|
handler = netxen_msi_intr;
|
|
else {
|
|
flags |= IRQF_SHARED;
|
|
@@ -1556,14 +1612,6 @@
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
-static irqreturn_t netxen_msix_intr(int irq, void *data)
|
|
-{
|
|
- struct netxen_adapter *adapter = data;
|
|
-
|
|
- napi_schedule(&adapter->napi);
|
|
- return IRQ_HANDLED;
|
|
-}
|
|
-
|
|
static int netxen_nic_poll(struct napi_struct *napi, int budget)
|
|
{
|
|
struct netxen_adapter *adapter = container_of(napi, struct netxen_adapter, napi);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/pcmcia/3c574_cs.c linux-2.6.29-rc3.owrt/drivers/net/pcmcia/3c574_cs.c
|
|
--- linux-2.6.29.owrt/drivers/net/pcmcia/3c574_cs.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/pcmcia/3c574_cs.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1035,8 +1035,7 @@
|
|
DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
|
|
dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
|
|
while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
|
|
- worklimit > 0) {
|
|
- worklimit--;
|
|
+ (--worklimit >= 0)) {
|
|
if (rx_status & 0x4000) { /* Error, update stats. */
|
|
short error = rx_status & 0x3800;
|
|
dev->stats.rx_errors++;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/pcmcia/3c589_cs.c linux-2.6.29-rc3.owrt/drivers/net/pcmcia/3c589_cs.c
|
|
--- linux-2.6.29.owrt/drivers/net/pcmcia/3c589_cs.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/pcmcia/3c589_cs.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -857,8 +857,7 @@
|
|
DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
|
|
dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
|
|
while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) &&
|
|
- worklimit > 0) {
|
|
- worklimit--;
|
|
+ (--worklimit >= 0)) {
|
|
if (rx_status & 0x4000) { /* Error, update stats. */
|
|
short error = rx_status & 0x3800;
|
|
dev->stats.rx_errors++;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/pcmcia/pcnet_cs.c linux-2.6.29-rc3.owrt/drivers/net/pcmcia/pcnet_cs.c
|
|
--- linux-2.6.29.owrt/drivers/net/pcmcia/pcnet_cs.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/pcmcia/pcnet_cs.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -586,7 +586,7 @@
|
|
}
|
|
|
|
if ((link->conf.ConfigBase == 0x03c0)
|
|
- && (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) {
|
|
+ && (link->manf_id == 0x149) && (link->card_id = 0xc1ab)) {
|
|
printk(KERN_INFO "pcnet_cs: this is an AX88190 card!\n");
|
|
printk(KERN_INFO "pcnet_cs: use axnet_cs instead.\n");
|
|
goto failed;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/phy/mdio-gpio.c linux-2.6.29-rc3.owrt/drivers/net/phy/mdio-gpio.c
|
|
--- linux-2.6.29.owrt/drivers/net/phy/mdio-gpio.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/phy/mdio-gpio.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -125,8 +125,6 @@
|
|
if (gpio_request(bitbang->mdio, "mdio"))
|
|
goto out_free_mdc;
|
|
|
|
- gpio_direction_output(bitbang->mdc, 0);
|
|
-
|
|
dev_set_drvdata(dev, new_bus);
|
|
|
|
ret = mdiobus_register(new_bus);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/ps3_gelic_wireless.c linux-2.6.29-rc3.owrt/drivers/net/ps3_gelic_wireless.c
|
|
--- linux-2.6.29.owrt/drivers/net/ps3_gelic_wireless.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/ps3_gelic_wireless.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2168,7 +2168,7 @@
|
|
complete(&wl->assoc_done);
|
|
netif_carrier_on(port_to_netdev(wl_port(wl)));
|
|
} else
|
|
- pr_debug("%s: event %#llx under wpa\n",
|
|
+ pr_debug("%s: event %#lx under wpa\n",
|
|
__func__, event);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/qlge/qlge.h linux-2.6.29-rc3.owrt/drivers/net/qlge/qlge.h
|
|
--- linux-2.6.29.owrt/drivers/net/qlge/qlge.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/qlge/qlge.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -787,12 +787,12 @@
|
|
|
|
struct flash_params {
|
|
u8 dev_id_str[4];
|
|
- __le16 size;
|
|
- __le16 csum;
|
|
- __le16 ver;
|
|
- __le16 sub_dev_id;
|
|
+ u16 size;
|
|
+ u16 csum;
|
|
+ u16 ver;
|
|
+ u16 sub_dev_id;
|
|
u8 mac_addr[6];
|
|
- __le16 res;
|
|
+ u16 res;
|
|
};
|
|
|
|
|
|
@@ -927,7 +927,6 @@
|
|
u8 flags1;
|
|
#define IB_MAC_IOCB_RSP_OI 0x01 /* Overide intr delay */
|
|
#define IB_MAC_IOCB_RSP_I 0x02 /* Disble Intr Generation */
|
|
-#define IB_MAC_CSUM_ERR_MASK 0x1c /* A mask to use for csum errs */
|
|
#define IB_MAC_IOCB_RSP_TE 0x04 /* Checksum error */
|
|
#define IB_MAC_IOCB_RSP_NU 0x08 /* No checksum rcvd */
|
|
#define IB_MAC_IOCB_RSP_IE 0x10 /* IPv4 checksum error */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/qlge/qlge_main.c linux-2.6.29-rc3.owrt/drivers/net/qlge/qlge_main.c
|
|
--- linux-2.6.29.owrt/drivers/net/qlge/qlge_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/qlge/qlge_main.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -641,7 +641,7 @@
|
|
|
|
}
|
|
|
|
-static int ql_read_flash_word(struct ql_adapter *qdev, int offset, __le32 *data)
|
|
+static int ql_read_flash_word(struct ql_adapter *qdev, int offset, u32 *data)
|
|
{
|
|
int status = 0;
|
|
/* wait for reg to come ready */
|
|
@@ -656,11 +656,8 @@
|
|
FLASH_ADDR, FLASH_ADDR_RDY, FLASH_ADDR_ERR);
|
|
if (status)
|
|
goto exit;
|
|
- /* This data is stored on flash as an array of
|
|
- * __le32. Since ql_read32() returns cpu endian
|
|
- * we need to swap it back.
|
|
- */
|
|
- *data = cpu_to_le32(ql_read32(qdev, FLASH_DATA));
|
|
+ /* get the data */
|
|
+ *data = ql_read32(qdev, FLASH_DATA);
|
|
exit:
|
|
return status;
|
|
}
|
|
@@ -669,20 +666,13 @@
|
|
{
|
|
int i;
|
|
int status;
|
|
- __le32 *p = (__le32 *)&qdev->flash;
|
|
- u32 offset = 0;
|
|
-
|
|
- /* Second function's parameters follow the first
|
|
- * function's.
|
|
- */
|
|
- if (qdev->func)
|
|
- offset = sizeof(qdev->flash) / sizeof(u32);
|
|
+ u32 *p = (u32 *)&qdev->flash;
|
|
|
|
if (ql_sem_spinlock(qdev, SEM_FLASH_MASK))
|
|
return -ETIMEDOUT;
|
|
|
|
for (i = 0; i < sizeof(qdev->flash) / sizeof(u32); i++, p++) {
|
|
- status = ql_read_flash_word(qdev, i+offset, p);
|
|
+ status = ql_read_flash_word(qdev, i, p);
|
|
if (status) {
|
|
QPRINTK(qdev, IFUP, ERR, "Error reading flash.\n");
|
|
goto exit;
|
|
@@ -898,7 +888,6 @@
|
|
lbq_desc->index);
|
|
lbq_desc->p.lbq_page = alloc_page(GFP_ATOMIC);
|
|
if (lbq_desc->p.lbq_page == NULL) {
|
|
- rx_ring->lbq_clean_idx = clean_idx;
|
|
QPRINTK(qdev, RX_STATUS, ERR,
|
|
"Couldn't get a page.\n");
|
|
return;
|
|
@@ -908,9 +897,6 @@
|
|
0, PAGE_SIZE,
|
|
PCI_DMA_FROMDEVICE);
|
|
if (pci_dma_mapping_error(qdev->pdev, map)) {
|
|
- rx_ring->lbq_clean_idx = clean_idx;
|
|
- put_page(lbq_desc->p.lbq_page);
|
|
- lbq_desc->p.lbq_page = NULL;
|
|
QPRINTK(qdev, RX_STATUS, ERR,
|
|
"PCI mapping failed.\n");
|
|
return;
|
|
@@ -972,8 +958,6 @@
|
|
if (pci_dma_mapping_error(qdev->pdev, map)) {
|
|
QPRINTK(qdev, IFUP, ERR, "PCI mapping failed.\n");
|
|
rx_ring->sbq_clean_idx = clean_idx;
|
|
- dev_kfree_skb_any(sbq_desc->p.skb);
|
|
- sbq_desc->p.skb = NULL;
|
|
return;
|
|
}
|
|
pci_unmap_addr_set(sbq_desc, mapaddr, map);
|
|
@@ -1436,32 +1420,18 @@
|
|
if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_P) {
|
|
QPRINTK(qdev, RX_STATUS, DEBUG, "Promiscuous Packet.\n");
|
|
}
|
|
-
|
|
- skb->protocol = eth_type_trans(skb, ndev);
|
|
- skb->ip_summed = CHECKSUM_NONE;
|
|
-
|
|
- /* If rx checksum is on, and there are no
|
|
- * csum or frame errors.
|
|
- */
|
|
- if (qdev->rx_csum &&
|
|
- !(ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) &&
|
|
- !(ib_mac_rsp->flags1 & IB_MAC_CSUM_ERR_MASK)) {
|
|
- /* TCP frame. */
|
|
- if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) {
|
|
- QPRINTK(qdev, RX_STATUS, DEBUG,
|
|
- "TCP checksum done!\n");
|
|
- skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
- } else if ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) &&
|
|
- (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_V4)) {
|
|
- /* Unfragmented ipv4 UDP frame. */
|
|
- struct iphdr *iph = (struct iphdr *) skb->data;
|
|
- if (!(iph->frag_off &
|
|
- cpu_to_be16(IP_MF|IP_OFFSET))) {
|
|
- skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
- QPRINTK(qdev, RX_STATUS, DEBUG,
|
|
- "TCP checksum done!\n");
|
|
- }
|
|
- }
|
|
+ if (ib_mac_rsp->flags1 & (IB_MAC_IOCB_RSP_IE | IB_MAC_IOCB_RSP_TE)) {
|
|
+ QPRINTK(qdev, RX_STATUS, ERR,
|
|
+ "Bad checksum for this %s packet.\n",
|
|
+ ((ib_mac_rsp->
|
|
+ flags2 & IB_MAC_IOCB_RSP_T) ? "TCP" : "UDP"));
|
|
+ skb->ip_summed = CHECKSUM_NONE;
|
|
+ } else if (qdev->rx_csum &&
|
|
+ ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) ||
|
|
+ ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) &&
|
|
+ !(ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_NU)))) {
|
|
+ QPRINTK(qdev, RX_STATUS, DEBUG, "RX checksum done!\n");
|
|
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
}
|
|
qdev->stats.rx_packets++;
|
|
qdev->stats.rx_bytes += skb->len;
|
|
@@ -1469,12 +1439,12 @@
|
|
if (qdev->vlgrp && (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V)) {
|
|
QPRINTK(qdev, RX_STATUS, DEBUG,
|
|
"Passing a VLAN packet upstream.\n");
|
|
- vlan_hwaccel_receive_skb(skb, qdev->vlgrp,
|
|
+ vlan_hwaccel_rx(skb, qdev->vlgrp,
|
|
le16_to_cpu(ib_mac_rsp->vlan_id));
|
|
} else {
|
|
QPRINTK(qdev, RX_STATUS, DEBUG,
|
|
"Passing a normal packet upstream.\n");
|
|
- netif_receive_skb(skb);
|
|
+ netif_rx(skb);
|
|
}
|
|
}
|
|
|
|
@@ -1531,11 +1501,6 @@
|
|
netif_stop_queue(qdev->ndev);
|
|
netif_carrier_off(qdev->ndev);
|
|
ql_disable_interrupts(qdev);
|
|
- /* Clear adapter up bit to signal the recovery
|
|
- * process that it shouldn't kill the reset worker
|
|
- * thread
|
|
- */
|
|
- clear_bit(QL_ADAPTER_UP, &qdev->flags);
|
|
queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0);
|
|
}
|
|
|
|
@@ -1941,9 +1906,6 @@
|
|
|
|
tx_ring = &qdev->tx_ring[tx_ring_idx];
|
|
|
|
- if (skb_padto(skb, ETH_ZLEN))
|
|
- return NETDEV_TX_OK;
|
|
-
|
|
if (unlikely(atomic_read(&tx_ring->tx_count) < 2)) {
|
|
QPRINTK(qdev, TX_QUEUED, INFO,
|
|
"%s: shutting down tx queue %d du to lack of resources.\n",
|
|
@@ -1955,6 +1917,10 @@
|
|
tx_ring_desc = &tx_ring->q[tx_ring->prod_idx];
|
|
mac_iocb_ptr = tx_ring_desc->queue_entry;
|
|
memset((void *)mac_iocb_ptr, 0, sizeof(mac_iocb_ptr));
|
|
+ if (ql_map_send(qdev, mac_iocb_ptr, skb, tx_ring_desc) != NETDEV_TX_OK) {
|
|
+ QPRINTK(qdev, TX_QUEUED, ERR, "Could not map the segments.\n");
|
|
+ return NETDEV_TX_BUSY;
|
|
+ }
|
|
|
|
mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB;
|
|
mac_iocb_ptr->tid = tx_ring_desc->index;
|
|
@@ -1980,12 +1946,6 @@
|
|
ql_hw_csum_setup(skb,
|
|
(struct ob_mac_tso_iocb_req *)mac_iocb_ptr);
|
|
}
|
|
- if (ql_map_send(qdev, mac_iocb_ptr, skb, tx_ring_desc) !=
|
|
- NETDEV_TX_OK) {
|
|
- QPRINTK(qdev, TX_QUEUED, ERR,
|
|
- "Could not map the segments.\n");
|
|
- return NETDEV_TX_BUSY;
|
|
- }
|
|
QL_DUMP_OB_MAC_IOCB(mac_iocb_ptr);
|
|
tx_ring->prod_idx++;
|
|
if (tx_ring->prod_idx == tx_ring->wq_len)
|
|
@@ -2903,8 +2863,8 @@
|
|
/*
|
|
* Fill out the Indirection Table.
|
|
*/
|
|
- for (i = 0; i < 256; i++)
|
|
- hash_id[i] = i & (qdev->rss_ring_count - 1);
|
|
+ for (i = 0; i < 32; i++)
|
|
+ hash_id[i] = i & 1;
|
|
|
|
/*
|
|
* Random values for the IPv6 and IPv4 Hash Keys.
|
|
@@ -2987,9 +2947,9 @@
|
|
mask = value << 16;
|
|
ql_write32(qdev, SYS, mask | value);
|
|
|
|
- /* Set the default queue, and VLAN behavior. */
|
|
- value = NIC_RCV_CFG_DFQ | NIC_RCV_CFG_RV;
|
|
- mask = NIC_RCV_CFG_DFQ_MASK | (NIC_RCV_CFG_RV << 16);
|
|
+ /* Set the default queue. */
|
|
+ value = NIC_RCV_CFG_DFQ;
|
|
+ mask = NIC_RCV_CFG_DFQ_MASK;
|
|
ql_write32(qdev, NIC_RCV_CFG, (mask | value));
|
|
|
|
/* Set the MPI interrupt to enabled. */
|
|
@@ -3130,11 +3090,7 @@
|
|
netif_stop_queue(ndev);
|
|
netif_carrier_off(ndev);
|
|
|
|
- /* Don't kill the reset worker thread if we
|
|
- * are in the process of recovery.
|
|
- */
|
|
- if (test_bit(QL_ADAPTER_UP, &qdev->flags))
|
|
- cancel_delayed_work_sync(&qdev->asic_reset_work);
|
|
+ cancel_delayed_work_sync(&qdev->asic_reset_work);
|
|
cancel_delayed_work_sync(&qdev->mpi_reset_work);
|
|
cancel_delayed_work_sync(&qdev->mpi_work);
|
|
|
|
@@ -3166,11 +3122,6 @@
|
|
|
|
ql_tx_ring_clean(qdev);
|
|
|
|
- /* Call netif_napi_del() from common point.
|
|
- */
|
|
- for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++)
|
|
- netif_napi_del(&qdev->rx_ring[i].napi);
|
|
-
|
|
spin_lock(&qdev->hw_lock);
|
|
status = ql_adapter_reset(qdev);
|
|
if (status)
|
|
@@ -3540,7 +3491,7 @@
|
|
static void qlge_tx_timeout(struct net_device *ndev)
|
|
{
|
|
struct ql_adapter *qdev = (struct ql_adapter *)netdev_priv(ndev);
|
|
- ql_queue_asic_error(qdev);
|
|
+ queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0);
|
|
}
|
|
|
|
static void ql_asic_reset_work(struct work_struct *work)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/r6040.c linux-2.6.29-rc3.owrt/drivers/net/r6040.c
|
|
--- linux-2.6.29.owrt/drivers/net/r6040.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/r6040.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -438,6 +438,7 @@
|
|
{
|
|
struct r6040_private *lp = netdev_priv(dev);
|
|
void __iomem *ioaddr = lp->base;
|
|
+ struct pci_dev *pdev = lp->pdev;
|
|
int limit = 2048;
|
|
u16 *adrp;
|
|
u16 cmd;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/r8169.c linux-2.6.29-rc3.owrt/drivers/net/r8169.c
|
|
--- linux-2.6.29.owrt/drivers/net/r8169.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/r8169.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -437,22 +437,6 @@
|
|
RTL_FEATURE_GMII = (1 << 2),
|
|
};
|
|
|
|
-struct rtl8169_counters {
|
|
- __le64 tx_packets;
|
|
- __le64 rx_packets;
|
|
- __le64 tx_errors;
|
|
- __le32 rx_errors;
|
|
- __le16 rx_missed;
|
|
- __le16 align_errors;
|
|
- __le32 tx_one_collision;
|
|
- __le32 tx_multi_collision;
|
|
- __le64 rx_unicast;
|
|
- __le64 rx_broadcast;
|
|
- __le32 rx_multicast;
|
|
- __le16 tx_aborted;
|
|
- __le16 tx_underun;
|
|
-};
|
|
-
|
|
struct rtl8169_private {
|
|
void __iomem *mmio_addr; /* memory map physical address */
|
|
struct pci_dev *pci_dev; /* Index of PCI device */
|
|
@@ -496,7 +480,6 @@
|
|
unsigned features;
|
|
|
|
struct mii_if_info mii;
|
|
- struct rtl8169_counters counters;
|
|
};
|
|
|
|
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
|
|
@@ -1117,6 +1100,22 @@
|
|
"tx_underrun",
|
|
};
|
|
|
|
+struct rtl8169_counters {
|
|
+ __le64 tx_packets;
|
|
+ __le64 rx_packets;
|
|
+ __le64 tx_errors;
|
|
+ __le32 rx_errors;
|
|
+ __le16 rx_missed;
|
|
+ __le16 align_errors;
|
|
+ __le32 tx_one_collision;
|
|
+ __le32 tx_multi_collision;
|
|
+ __le64 rx_unicast;
|
|
+ __le64 rx_broadcast;
|
|
+ __le32 rx_multicast;
|
|
+ __le16 tx_aborted;
|
|
+ __le16 tx_underun;
|
|
+};
|
|
+
|
|
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
|
|
{
|
|
switch (sset) {
|
|
@@ -1127,21 +1126,16 @@
|
|
}
|
|
}
|
|
|
|
-static void rtl8169_update_counters(struct net_device *dev)
|
|
+static void rtl8169_get_ethtool_stats(struct net_device *dev,
|
|
+ struct ethtool_stats *stats, u64 *data)
|
|
{
|
|
struct rtl8169_private *tp = netdev_priv(dev);
|
|
void __iomem *ioaddr = tp->mmio_addr;
|
|
struct rtl8169_counters *counters;
|
|
dma_addr_t paddr;
|
|
u32 cmd;
|
|
- int wait = 1000;
|
|
|
|
- /*
|
|
- * Some chips are unable to dump tally counters when the receiver
|
|
- * is disabled.
|
|
- */
|
|
- if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
|
|
- return;
|
|
+ ASSERT_RTNL();
|
|
|
|
counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
|
|
if (!counters)
|
|
@@ -1152,43 +1146,29 @@
|
|
RTL_W32(CounterAddrLow, cmd);
|
|
RTL_W32(CounterAddrLow, cmd | CounterDump);
|
|
|
|
- while (wait--) {
|
|
- if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
|
|
- /* copy updated counters */
|
|
- memcpy(&tp->counters, counters, sizeof(*counters));
|
|
+ while (RTL_R32(CounterAddrLow) & CounterDump) {
|
|
+ if (msleep_interruptible(1))
|
|
break;
|
|
- }
|
|
- udelay(10);
|
|
}
|
|
|
|
RTL_W32(CounterAddrLow, 0);
|
|
RTL_W32(CounterAddrHigh, 0);
|
|
|
|
- pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
|
|
-}
|
|
+ data[0] = le64_to_cpu(counters->tx_packets);
|
|
+ data[1] = le64_to_cpu(counters->rx_packets);
|
|
+ data[2] = le64_to_cpu(counters->tx_errors);
|
|
+ data[3] = le32_to_cpu(counters->rx_errors);
|
|
+ data[4] = le16_to_cpu(counters->rx_missed);
|
|
+ data[5] = le16_to_cpu(counters->align_errors);
|
|
+ data[6] = le32_to_cpu(counters->tx_one_collision);
|
|
+ data[7] = le32_to_cpu(counters->tx_multi_collision);
|
|
+ data[8] = le64_to_cpu(counters->rx_unicast);
|
|
+ data[9] = le64_to_cpu(counters->rx_broadcast);
|
|
+ data[10] = le32_to_cpu(counters->rx_multicast);
|
|
+ data[11] = le16_to_cpu(counters->tx_aborted);
|
|
+ data[12] = le16_to_cpu(counters->tx_underun);
|
|
|
|
-static void rtl8169_get_ethtool_stats(struct net_device *dev,
|
|
- struct ethtool_stats *stats, u64 *data)
|
|
-{
|
|
- struct rtl8169_private *tp = netdev_priv(dev);
|
|
-
|
|
- ASSERT_RTNL();
|
|
-
|
|
- rtl8169_update_counters(dev);
|
|
-
|
|
- data[0] = le64_to_cpu(tp->counters.tx_packets);
|
|
- data[1] = le64_to_cpu(tp->counters.rx_packets);
|
|
- data[2] = le64_to_cpu(tp->counters.tx_errors);
|
|
- data[3] = le32_to_cpu(tp->counters.rx_errors);
|
|
- data[4] = le16_to_cpu(tp->counters.rx_missed);
|
|
- data[5] = le16_to_cpu(tp->counters.align_errors);
|
|
- data[6] = le32_to_cpu(tp->counters.tx_one_collision);
|
|
- data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
|
|
- data[8] = le64_to_cpu(tp->counters.rx_unicast);
|
|
- data[9] = le64_to_cpu(tp->counters.rx_broadcast);
|
|
- data[10] = le32_to_cpu(tp->counters.rx_multicast);
|
|
- data[11] = le16_to_cpu(tp->counters.tx_aborted);
|
|
- data[12] = le16_to_cpu(tp->counters.tx_underun);
|
|
+ pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
|
|
}
|
|
|
|
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
|
|
@@ -3253,6 +3233,13 @@
|
|
opts1 |= FirstFrag;
|
|
} else {
|
|
len = skb->len;
|
|
+
|
|
+ if (unlikely(len < ETH_ZLEN)) {
|
|
+ if (skb_padto(skb, ETH_ZLEN))
|
|
+ goto err_update_stats;
|
|
+ len = ETH_ZLEN;
|
|
+ }
|
|
+
|
|
opts1 |= FirstFrag | LastFrag;
|
|
tp->tx_skb[entry].skb = skb;
|
|
}
|
|
@@ -3290,6 +3277,7 @@
|
|
err_stop:
|
|
netif_stop_queue(dev);
|
|
ret = NETDEV_TX_BUSY;
|
|
+err_update_stats:
|
|
dev->stats.tx_dropped++;
|
|
goto out;
|
|
}
|
|
@@ -3696,9 +3684,6 @@
|
|
struct rtl8169_private *tp = netdev_priv(dev);
|
|
struct pci_dev *pdev = tp->pci_dev;
|
|
|
|
- /* update counters before going down */
|
|
- rtl8169_update_counters(dev);
|
|
-
|
|
rtl8169_down(dev);
|
|
|
|
free_irq(dev->irq, dev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/efx.c linux-2.6.29-rc3.owrt/drivers/net/sfc/efx.c
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/efx.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/efx.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -676,8 +676,9 @@
|
|
rc = efx->phy_op->init(efx);
|
|
if (rc)
|
|
return rc;
|
|
- mutex_lock(&efx->mac_lock);
|
|
efx->phy_op->reconfigure(efx);
|
|
+
|
|
+ mutex_lock(&efx->mac_lock);
|
|
rc = falcon_switch_mac(efx);
|
|
mutex_unlock(&efx->mac_lock);
|
|
if (rc)
|
|
@@ -685,7 +686,7 @@
|
|
efx->mac_op->reconfigure(efx);
|
|
|
|
efx->port_initialized = true;
|
|
- efx_stats_enable(efx);
|
|
+ efx->stats_enabled = true;
|
|
return 0;
|
|
|
|
fail:
|
|
@@ -734,7 +735,6 @@
|
|
if (!efx->port_initialized)
|
|
return;
|
|
|
|
- efx_stats_disable(efx);
|
|
efx->phy_op->fini(efx);
|
|
efx->port_initialized = false;
|
|
|
|
@@ -1361,20 +1361,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-void efx_stats_disable(struct efx_nic *efx)
|
|
-{
|
|
- spin_lock(&efx->stats_lock);
|
|
- ++efx->stats_disable_count;
|
|
- spin_unlock(&efx->stats_lock);
|
|
-}
|
|
-
|
|
-void efx_stats_enable(struct efx_nic *efx)
|
|
-{
|
|
- spin_lock(&efx->stats_lock);
|
|
- --efx->stats_disable_count;
|
|
- spin_unlock(&efx->stats_lock);
|
|
-}
|
|
-
|
|
/* Context: process, dev_base_lock or RTNL held, non-blocking. */
|
|
static struct net_device_stats *efx_net_stats(struct net_device *net_dev)
|
|
{
|
|
@@ -1383,12 +1369,12 @@
|
|
struct net_device_stats *stats = &net_dev->stats;
|
|
|
|
/* Update stats if possible, but do not wait if another thread
|
|
- * is updating them or if MAC stats fetches are temporarily
|
|
- * disabled; slightly stale stats are acceptable.
|
|
+ * is updating them (or resetting the NIC); slightly stale
|
|
+ * stats are acceptable.
|
|
*/
|
|
if (!spin_trylock(&efx->stats_lock))
|
|
return stats;
|
|
- if (!efx->stats_disable_count) {
|
|
+ if (efx->stats_enabled) {
|
|
efx->mac_op->update_stats(efx);
|
|
falcon_update_nic_stats(efx);
|
|
}
|
|
@@ -1636,12 +1622,16 @@
|
|
|
|
/* Tears down the entire software state and most of the hardware state
|
|
* before reset. */
|
|
-void efx_reset_down(struct efx_nic *efx, enum reset_type method,
|
|
- struct ethtool_cmd *ecmd)
|
|
+void efx_reset_down(struct efx_nic *efx, struct ethtool_cmd *ecmd)
|
|
{
|
|
EFX_ASSERT_RESET_SERIALISED(efx);
|
|
|
|
- efx_stats_disable(efx);
|
|
+ /* The net_dev->get_stats handler is quite slow, and will fail
|
|
+ * if a fetch is pending over reset. Serialise against it. */
|
|
+ spin_lock(&efx->stats_lock);
|
|
+ efx->stats_enabled = false;
|
|
+ spin_unlock(&efx->stats_lock);
|
|
+
|
|
efx_stop_all(efx);
|
|
mutex_lock(&efx->mac_lock);
|
|
mutex_lock(&efx->spi_lock);
|
|
@@ -1649,8 +1639,6 @@
|
|
efx->phy_op->get_settings(efx, ecmd);
|
|
|
|
efx_fini_channels(efx);
|
|
- if (efx->port_initialized && method != RESET_TYPE_INVISIBLE)
|
|
- efx->phy_op->fini(efx);
|
|
}
|
|
|
|
/* This function will always ensure that the locks acquired in
|
|
@@ -1658,8 +1646,7 @@
|
|
* that we were unable to reinitialise the hardware, and the
|
|
* driver should be disabled. If ok is false, then the rx and tx
|
|
* engines are not restarted, pending a RESET_DISABLE. */
|
|
-int efx_reset_up(struct efx_nic *efx, enum reset_type method,
|
|
- struct ethtool_cmd *ecmd, bool ok)
|
|
+int efx_reset_up(struct efx_nic *efx, struct ethtool_cmd *ecmd, bool ok)
|
|
{
|
|
int rc;
|
|
|
|
@@ -1671,15 +1658,6 @@
|
|
ok = false;
|
|
}
|
|
|
|
- if (efx->port_initialized && method != RESET_TYPE_INVISIBLE) {
|
|
- if (ok) {
|
|
- rc = efx->phy_op->init(efx);
|
|
- if (rc)
|
|
- ok = false;
|
|
- } else
|
|
- efx->port_initialized = false;
|
|
- }
|
|
-
|
|
if (ok) {
|
|
efx_init_channels(efx);
|
|
|
|
@@ -1692,7 +1670,7 @@
|
|
|
|
if (ok) {
|
|
efx_start_all(efx);
|
|
- efx_stats_enable(efx);
|
|
+ efx->stats_enabled = true;
|
|
}
|
|
return rc;
|
|
}
|
|
@@ -1724,7 +1702,7 @@
|
|
|
|
EFX_INFO(efx, "resetting (%d)\n", method);
|
|
|
|
- efx_reset_down(efx, method, &ecmd);
|
|
+ efx_reset_down(efx, &ecmd);
|
|
|
|
rc = falcon_reset_hw(efx, method);
|
|
if (rc) {
|
|
@@ -1743,10 +1721,10 @@
|
|
|
|
/* Leave device stopped if necessary */
|
|
if (method == RESET_TYPE_DISABLE) {
|
|
- efx_reset_up(efx, method, &ecmd, false);
|
|
+ efx_reset_up(efx, &ecmd, false);
|
|
rc = -EIO;
|
|
} else {
|
|
- rc = efx_reset_up(efx, method, &ecmd, true);
|
|
+ rc = efx_reset_up(efx, &ecmd, true);
|
|
}
|
|
|
|
out_disable:
|
|
@@ -1898,7 +1876,6 @@
|
|
efx->rx_checksum_enabled = true;
|
|
spin_lock_init(&efx->netif_stop_lock);
|
|
spin_lock_init(&efx->stats_lock);
|
|
- efx->stats_disable_count = 1;
|
|
mutex_init(&efx->mac_lock);
|
|
efx->mac_op = &efx_dummy_mac_operations;
|
|
efx->phy_op = &efx_dummy_phy_operations;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/efx.h linux-2.6.29-rc3.owrt/drivers/net/sfc/efx.h
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/efx.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/efx.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -36,16 +36,13 @@
|
|
extern void efx_flush_queues(struct efx_nic *efx);
|
|
|
|
/* Ports */
|
|
-extern void efx_stats_disable(struct efx_nic *efx);
|
|
-extern void efx_stats_enable(struct efx_nic *efx);
|
|
extern void efx_reconfigure_port(struct efx_nic *efx);
|
|
extern void __efx_reconfigure_port(struct efx_nic *efx);
|
|
|
|
/* Reset handling */
|
|
-extern void efx_reset_down(struct efx_nic *efx, enum reset_type method,
|
|
- struct ethtool_cmd *ecmd);
|
|
-extern int efx_reset_up(struct efx_nic *efx, enum reset_type method,
|
|
- struct ethtool_cmd *ecmd, bool ok);
|
|
+extern void efx_reset_down(struct efx_nic *efx, struct ethtool_cmd *ecmd);
|
|
+extern int efx_reset_up(struct efx_nic *efx, struct ethtool_cmd *ecmd,
|
|
+ bool ok);
|
|
|
|
/* Global */
|
|
extern void efx_schedule_reset(struct efx_nic *efx, enum reset_type type);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/ethtool.c linux-2.6.29-rc3.owrt/drivers/net/sfc/ethtool.c
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/ethtool.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/ethtool.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -219,6 +219,9 @@
|
|
struct efx_nic *efx = netdev_priv(net_dev);
|
|
int rc;
|
|
|
|
+ if (EFX_WORKAROUND_13963(efx) && !ecmd->autoneg)
|
|
+ return -EINVAL;
|
|
+
|
|
/* Falcon GMAC does not support 1000Mbps HD */
|
|
if (ecmd->speed == SPEED_1000 && ecmd->duplex != DUPLEX_FULL) {
|
|
EFX_LOG(efx, "rejecting unsupported 1000Mbps HD"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/falcon.c linux-2.6.29-rc3.owrt/drivers/net/sfc/falcon.c
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/falcon.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/falcon.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -824,6 +824,10 @@
|
|
rx_ev_pause_frm ? " [PAUSE]" : "");
|
|
}
|
|
#endif
|
|
+
|
|
+ if (unlikely(rx_ev_eth_crc_err && EFX_WORKAROUND_10750(efx) &&
|
|
+ efx->phy_type == PHY_TYPE_SFX7101))
|
|
+ tenxpress_crc_err(efx);
|
|
}
|
|
|
|
/* Handle receive events that are not in-order. */
|
|
@@ -1883,7 +1887,7 @@
|
|
|
|
/* MAC stats will fail whilst the TX fifo is draining. Serialise
|
|
* the drain sequence with the statistics fetch */
|
|
- efx_stats_disable(efx);
|
|
+ spin_lock(&efx->stats_lock);
|
|
|
|
falcon_read(efx, ®, MAC0_CTRL_REG_KER);
|
|
EFX_SET_OWORD_FIELD(reg, TXFIFO_DRAIN_EN_B0, 1);
|
|
@@ -1913,7 +1917,7 @@
|
|
udelay(10);
|
|
}
|
|
|
|
- efx_stats_enable(efx);
|
|
+ spin_unlock(&efx->stats_lock);
|
|
|
|
/* If we've reset the EM block and the link is up, then
|
|
* we'll have to kick the XAUI link so the PHY can recover */
|
|
@@ -2273,10 +2277,6 @@
|
|
struct efx_mac_operations *old_mac_op = efx->mac_op;
|
|
efx_oword_t nic_stat;
|
|
unsigned strap_val;
|
|
- int rc = 0;
|
|
-
|
|
- /* Don't try to fetch MAC stats while we're switching MACs */
|
|
- efx_stats_disable(efx);
|
|
|
|
/* Internal loopbacks override the phy speed setting */
|
|
if (efx->loopback_mode == LOOPBACK_GMAC) {
|
|
@@ -2287,12 +2287,16 @@
|
|
efx->link_fd = true;
|
|
}
|
|
|
|
- WARN_ON(!mutex_is_locked(&efx->mac_lock));
|
|
efx->mac_op = (EFX_IS10G(efx) ?
|
|
&falcon_xmac_operations : &falcon_gmac_operations);
|
|
+ if (old_mac_op == efx->mac_op)
|
|
+ return 0;
|
|
+
|
|
+ WARN_ON(!mutex_is_locked(&efx->mac_lock));
|
|
+
|
|
+ /* Not all macs support a mac-level link state */
|
|
+ efx->mac_up = true;
|
|
|
|
- /* Always push the NIC_STAT_REG setting even if the mac hasn't
|
|
- * changed, because this function is run post online reset */
|
|
falcon_read(efx, &nic_stat, NIC_STAT_REG);
|
|
strap_val = EFX_IS10G(efx) ? 5 : 3;
|
|
if (falcon_rev(efx) >= FALCON_REV_B0) {
|
|
@@ -2305,17 +2309,9 @@
|
|
BUG_ON(EFX_OWORD_FIELD(nic_stat, STRAP_PINS) != strap_val);
|
|
}
|
|
|
|
- if (old_mac_op == efx->mac_op)
|
|
- goto out;
|
|
|
|
EFX_LOG(efx, "selected %cMAC\n", EFX_IS10G(efx) ? 'X' : 'G');
|
|
- /* Not all macs support a mac-level link state */
|
|
- efx->mac_up = true;
|
|
-
|
|
- rc = falcon_reset_macs(efx);
|
|
-out:
|
|
- efx_stats_enable(efx);
|
|
- return rc;
|
|
+ return falcon_reset_macs(efx);
|
|
}
|
|
|
|
/* This call is responsible for hooking in the MAC and PHY operations */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/mdio_10g.c linux-2.6.29-rc3.owrt/drivers/net/sfc/mdio_10g.c
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/mdio_10g.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/mdio_10g.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -15,7 +15,6 @@
|
|
#include "net_driver.h"
|
|
#include "mdio_10g.h"
|
|
#include "boards.h"
|
|
-#include "workarounds.h"
|
|
|
|
int mdio_clause45_reset_mmd(struct efx_nic *port, int mmd,
|
|
int spins, int spintime)
|
|
@@ -180,12 +179,17 @@
|
|
return false;
|
|
else if (efx_phy_mode_disabled(efx->phy_mode))
|
|
return false;
|
|
- else if (efx->loopback_mode == LOOPBACK_PHYXS)
|
|
+ else if (efx->loopback_mode == LOOPBACK_PHYXS) {
|
|
mmd_mask &= ~(MDIO_MMDREG_DEVS_PHYXS |
|
|
MDIO_MMDREG_DEVS_PCS |
|
|
MDIO_MMDREG_DEVS_PMAPMD |
|
|
MDIO_MMDREG_DEVS_AN);
|
|
- else if (efx->loopback_mode == LOOPBACK_PCS)
|
|
+ if (!mmd_mask) {
|
|
+ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PHYXS,
|
|
+ MDIO_PHYXS_STATUS2);
|
|
+ return !(reg & (1 << MDIO_PHYXS_STATUS2_RX_FAULT_LBN));
|
|
+ }
|
|
+ } else if (efx->loopback_mode == LOOPBACK_PCS)
|
|
mmd_mask &= ~(MDIO_MMDREG_DEVS_PCS |
|
|
MDIO_MMDREG_DEVS_PMAPMD |
|
|
MDIO_MMDREG_DEVS_AN);
|
|
@@ -193,13 +197,6 @@
|
|
mmd_mask &= ~(MDIO_MMDREG_DEVS_PMAPMD |
|
|
MDIO_MMDREG_DEVS_AN);
|
|
|
|
- if (!mmd_mask) {
|
|
- /* Use presence of XGMII faults in leui of link state */
|
|
- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PHYXS,
|
|
- MDIO_PHYXS_STATUS2);
|
|
- return !(reg & (1 << MDIO_PHYXS_STATUS2_RX_FAULT_LBN));
|
|
- }
|
|
-
|
|
while (mmd_mask) {
|
|
if (mmd_mask & 1) {
|
|
/* Double reads because link state is latched, and a
|
|
@@ -266,7 +263,7 @@
|
|
}
|
|
}
|
|
|
|
-static u32 mdio_clause45_get_an(struct efx_nic *efx, u16 addr)
|
|
+static u32 mdio_clause45_get_an(struct efx_nic *efx, u16 addr, u32 xnp)
|
|
{
|
|
int phy_id = efx->mii.phy_id;
|
|
u32 result = 0;
|
|
@@ -281,6 +278,9 @@
|
|
result |= ADVERTISED_100baseT_Half;
|
|
if (reg & ADVERTISE_100FULL)
|
|
result |= ADVERTISED_100baseT_Full;
|
|
+ if (reg & LPA_RESV)
|
|
+ result |= xnp;
|
|
+
|
|
return result;
|
|
}
|
|
|
|
@@ -310,7 +310,7 @@
|
|
*/
|
|
void mdio_clause45_get_settings_ext(struct efx_nic *efx,
|
|
struct ethtool_cmd *ecmd,
|
|
- u32 npage_adv, u32 npage_lpa)
|
|
+ u32 xnp, u32 xnp_lpa)
|
|
{
|
|
int phy_id = efx->mii.phy_id;
|
|
int reg;
|
|
@@ -361,8 +361,8 @@
|
|
ecmd->autoneg = AUTONEG_ENABLE;
|
|
ecmd->advertising |=
|
|
ADVERTISED_Autoneg |
|
|
- mdio_clause45_get_an(efx, MDIO_AN_ADVERTISE) |
|
|
- npage_adv;
|
|
+ mdio_clause45_get_an(efx,
|
|
+ MDIO_AN_ADVERTISE, xnp);
|
|
} else
|
|
ecmd->autoneg = AUTONEG_DISABLE;
|
|
} else
|
|
@@ -371,30 +371,27 @@
|
|
if (ecmd->autoneg) {
|
|
/* If AN is complete, report best common mode,
|
|
* otherwise report best advertised mode. */
|
|
- u32 modes = 0;
|
|
+ u32 common = ecmd->advertising;
|
|
if (mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
|
|
MDIO_MMDREG_STAT1) &
|
|
- (1 << MDIO_AN_STATUS_AN_DONE_LBN))
|
|
- modes = (ecmd->advertising &
|
|
- (mdio_clause45_get_an(efx, MDIO_AN_LPA) |
|
|
- npage_lpa));
|
|
- if (modes == 0)
|
|
- modes = ecmd->advertising;
|
|
-
|
|
- if (modes & ADVERTISED_10000baseT_Full) {
|
|
+ (1 << MDIO_AN_STATUS_AN_DONE_LBN)) {
|
|
+ common &= mdio_clause45_get_an(efx, MDIO_AN_LPA,
|
|
+ xnp_lpa);
|
|
+ }
|
|
+ if (common & ADVERTISED_10000baseT_Full) {
|
|
ecmd->speed = SPEED_10000;
|
|
ecmd->duplex = DUPLEX_FULL;
|
|
- } else if (modes & (ADVERTISED_1000baseT_Full |
|
|
- ADVERTISED_1000baseT_Half)) {
|
|
+ } else if (common & (ADVERTISED_1000baseT_Full |
|
|
+ ADVERTISED_1000baseT_Half)) {
|
|
ecmd->speed = SPEED_1000;
|
|
- ecmd->duplex = !!(modes & ADVERTISED_1000baseT_Full);
|
|
- } else if (modes & (ADVERTISED_100baseT_Full |
|
|
- ADVERTISED_100baseT_Half)) {
|
|
+ ecmd->duplex = !!(common & ADVERTISED_1000baseT_Full);
|
|
+ } else if (common & (ADVERTISED_100baseT_Full |
|
|
+ ADVERTISED_100baseT_Half)) {
|
|
ecmd->speed = SPEED_100;
|
|
- ecmd->duplex = !!(modes & ADVERTISED_100baseT_Full);
|
|
+ ecmd->duplex = !!(common & ADVERTISED_100baseT_Full);
|
|
} else {
|
|
ecmd->speed = SPEED_10;
|
|
- ecmd->duplex = !!(modes & ADVERTISED_10baseT_Full);
|
|
+ ecmd->duplex = !!(common & ADVERTISED_10baseT_Full);
|
|
}
|
|
} else {
|
|
/* Report forced settings */
|
|
@@ -418,7 +415,7 @@
|
|
int phy_id = efx->mii.phy_id;
|
|
struct ethtool_cmd prev;
|
|
u32 required;
|
|
- int reg;
|
|
+ int ctrl1_bits, reg;
|
|
|
|
efx->phy_op->get_settings(efx, &prev);
|
|
|
|
@@ -433,83 +430,99 @@
|
|
if (prev.port != PORT_TP || ecmd->port != PORT_TP)
|
|
return -EINVAL;
|
|
|
|
- /* Check that PHY supports these settings */
|
|
- if (ecmd->autoneg) {
|
|
- required = SUPPORTED_Autoneg;
|
|
- } else if (ecmd->duplex) {
|
|
+ /* Check that PHY supports these settings and work out the
|
|
+ * basic control bits */
|
|
+ if (ecmd->duplex) {
|
|
switch (ecmd->speed) {
|
|
- case SPEED_10: required = SUPPORTED_10baseT_Full; break;
|
|
- case SPEED_100: required = SUPPORTED_100baseT_Full; break;
|
|
- default: return -EINVAL;
|
|
+ case SPEED_10:
|
|
+ ctrl1_bits = BMCR_FULLDPLX;
|
|
+ required = SUPPORTED_10baseT_Full;
|
|
+ break;
|
|
+ case SPEED_100:
|
|
+ ctrl1_bits = BMCR_SPEED100 | BMCR_FULLDPLX;
|
|
+ required = SUPPORTED_100baseT_Full;
|
|
+ break;
|
|
+ case SPEED_1000:
|
|
+ ctrl1_bits = BMCR_SPEED1000 | BMCR_FULLDPLX;
|
|
+ required = SUPPORTED_1000baseT_Full;
|
|
+ break;
|
|
+ case SPEED_10000:
|
|
+ ctrl1_bits = (BMCR_SPEED1000 | BMCR_SPEED100 |
|
|
+ BMCR_FULLDPLX);
|
|
+ required = SUPPORTED_10000baseT_Full;
|
|
+ break;
|
|
+ default:
|
|
+ return -EINVAL;
|
|
}
|
|
} else {
|
|
switch (ecmd->speed) {
|
|
- case SPEED_10: required = SUPPORTED_10baseT_Half; break;
|
|
- case SPEED_100: required = SUPPORTED_100baseT_Half; break;
|
|
- default: return -EINVAL;
|
|
+ case SPEED_10:
|
|
+ ctrl1_bits = 0;
|
|
+ required = SUPPORTED_10baseT_Half;
|
|
+ break;
|
|
+ case SPEED_100:
|
|
+ ctrl1_bits = BMCR_SPEED100;
|
|
+ required = SUPPORTED_100baseT_Half;
|
|
+ break;
|
|
+ case SPEED_1000:
|
|
+ ctrl1_bits = BMCR_SPEED1000;
|
|
+ required = SUPPORTED_1000baseT_Half;
|
|
+ break;
|
|
+ default:
|
|
+ return -EINVAL;
|
|
}
|
|
}
|
|
+ if (ecmd->autoneg)
|
|
+ required |= SUPPORTED_Autoneg;
|
|
required |= ecmd->advertising;
|
|
if (required & ~prev.supported)
|
|
return -EINVAL;
|
|
|
|
- if (ecmd->autoneg) {
|
|
- bool xnp = (ecmd->advertising & ADVERTISED_10000baseT_Full
|
|
- || EFX_WORKAROUND_13204(efx));
|
|
-
|
|
- /* Set up the base page */
|
|
- reg = ADVERTISE_CSMA;
|
|
- if (ecmd->advertising & ADVERTISED_10baseT_Half)
|
|
- reg |= ADVERTISE_10HALF;
|
|
- if (ecmd->advertising & ADVERTISED_10baseT_Full)
|
|
- reg |= ADVERTISE_10FULL;
|
|
- if (ecmd->advertising & ADVERTISED_100baseT_Half)
|
|
- reg |= ADVERTISE_100HALF;
|
|
- if (ecmd->advertising & ADVERTISED_100baseT_Full)
|
|
- reg |= ADVERTISE_100FULL;
|
|
- if (xnp)
|
|
- reg |= ADVERTISE_RESV;
|
|
- else if (ecmd->advertising & (ADVERTISED_1000baseT_Half |
|
|
- ADVERTISED_1000baseT_Full))
|
|
- reg |= ADVERTISE_NPAGE;
|
|
- reg |= efx_fc_advertise(efx->wanted_fc);
|
|
- mdio_clause45_write(efx, phy_id, MDIO_MMD_AN,
|
|
- MDIO_AN_ADVERTISE, reg);
|
|
-
|
|
- /* Set up the (extended) next page if necessary */
|
|
- if (efx->phy_op->set_npage_adv)
|
|
- efx->phy_op->set_npage_adv(efx, ecmd->advertising);
|
|
+ /* Set the basic control bits */
|
|
+ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
|
|
+ MDIO_MMDREG_CTRL1);
|
|
+ reg &= ~(BMCR_SPEED1000 | BMCR_SPEED100 | BMCR_FULLDPLX | 0x003c);
|
|
+ reg |= ctrl1_bits;
|
|
+ mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD, MDIO_MMDREG_CTRL1,
|
|
+ reg);
|
|
+
|
|
+ /* Set the AN registers */
|
|
+ if (ecmd->autoneg != prev.autoneg ||
|
|
+ ecmd->advertising != prev.advertising) {
|
|
+ bool xnp = false;
|
|
+
|
|
+ if (efx->phy_op->set_xnp_advertise)
|
|
+ xnp = efx->phy_op->set_xnp_advertise(efx,
|
|
+ ecmd->advertising);
|
|
+
|
|
+ if (ecmd->autoneg) {
|
|
+ reg = 0;
|
|
+ if (ecmd->advertising & ADVERTISED_10baseT_Half)
|
|
+ reg |= ADVERTISE_10HALF;
|
|
+ if (ecmd->advertising & ADVERTISED_10baseT_Full)
|
|
+ reg |= ADVERTISE_10FULL;
|
|
+ if (ecmd->advertising & ADVERTISED_100baseT_Half)
|
|
+ reg |= ADVERTISE_100HALF;
|
|
+ if (ecmd->advertising & ADVERTISED_100baseT_Full)
|
|
+ reg |= ADVERTISE_100FULL;
|
|
+ if (xnp)
|
|
+ reg |= ADVERTISE_RESV;
|
|
+ mdio_clause45_write(efx, phy_id, MDIO_MMD_AN,
|
|
+ MDIO_AN_ADVERTISE, reg);
|
|
+ }
|
|
|
|
- /* Enable and restart AN */
|
|
reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
|
|
MDIO_MMDREG_CTRL1);
|
|
- reg |= BMCR_ANENABLE;
|
|
- if (!(EFX_WORKAROUND_15195(efx) &&
|
|
- LOOPBACK_MASK(efx) & efx->phy_op->loopbacks))
|
|
- reg |= BMCR_ANRESTART;
|
|
+ if (ecmd->autoneg)
|
|
+ reg |= BMCR_ANENABLE | BMCR_ANRESTART;
|
|
+ else
|
|
+ reg &= ~BMCR_ANENABLE;
|
|
if (xnp)
|
|
reg |= 1 << MDIO_AN_CTRL_XNP_LBN;
|
|
else
|
|
reg &= ~(1 << MDIO_AN_CTRL_XNP_LBN);
|
|
mdio_clause45_write(efx, phy_id, MDIO_MMD_AN,
|
|
MDIO_MMDREG_CTRL1, reg);
|
|
- } else {
|
|
- /* Disable AN */
|
|
- mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_AN,
|
|
- MDIO_MMDREG_CTRL1,
|
|
- __ffs(BMCR_ANENABLE), false);
|
|
-
|
|
- /* Set the basic control bits */
|
|
- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
|
|
- MDIO_MMDREG_CTRL1);
|
|
- reg &= ~(BMCR_SPEED1000 | BMCR_SPEED100 | BMCR_FULLDPLX |
|
|
- 0x003c);
|
|
- if (ecmd->speed == SPEED_100)
|
|
- reg |= BMCR_SPEED100;
|
|
- if (ecmd->duplex)
|
|
- reg |= BMCR_FULLDPLX;
|
|
- mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
|
|
- MDIO_MMDREG_CTRL1, reg);
|
|
}
|
|
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/mdio_10g.h linux-2.6.29-rc3.owrt/drivers/net/sfc/mdio_10g.h
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/mdio_10g.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/mdio_10g.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -155,8 +155,7 @@
|
|
#define MDIO_AN_XNP 22
|
|
#define MDIO_AN_LPA_XNP 25
|
|
|
|
-#define MDIO_AN_10GBT_CTRL 32
|
|
-#define MDIO_AN_10GBT_CTRL_ADV_10G_LBN 12
|
|
+#define MDIO_AN_10GBT_ADVERTISE 32
|
|
#define MDIO_AN_10GBT_STATUS (33)
|
|
#define MDIO_AN_10GBT_STATUS_MS_FLT_LBN (15) /* MASTER/SLAVE config fault */
|
|
#define MDIO_AN_10GBT_STATUS_MS_LBN (14) /* MASTER/SLAVE config */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/net_driver.h linux-2.6.29-rc3.owrt/drivers/net/sfc/net_driver.h
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/net_driver.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/net_driver.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -566,7 +566,7 @@
|
|
* @poll: Poll for hardware state. Serialised by the mac_lock.
|
|
* @get_settings: Get ethtool settings. Serialised by the mac_lock.
|
|
* @set_settings: Set ethtool settings. Serialised by the mac_lock.
|
|
- * @set_npage_adv: Set abilities advertised in (Extended) Next Page
|
|
+ * @set_xnp_advertise: Set abilities advertised in Extended Next Page
|
|
* (only needed where AN bit is set in mmds)
|
|
* @num_tests: Number of PHY-specific tests/results
|
|
* @test_names: Names of the tests/results
|
|
@@ -586,7 +586,7 @@
|
|
struct ethtool_cmd *ecmd);
|
|
int (*set_settings) (struct efx_nic *efx,
|
|
struct ethtool_cmd *ecmd);
|
|
- void (*set_npage_adv) (struct efx_nic *efx, u32);
|
|
+ bool (*set_xnp_advertise) (struct efx_nic *efx, u32);
|
|
u32 num_tests;
|
|
const char *const *test_names;
|
|
int (*run_tests) (struct efx_nic *efx, int *results, unsigned flags);
|
|
@@ -754,7 +754,8 @@
|
|
* &struct net_device_stats.
|
|
* @stats_buffer: DMA buffer for statistics
|
|
* @stats_lock: Statistics update lock. Serialises statistics fetches
|
|
- * @stats_disable_count: Nest count for disabling statistics fetches
|
|
+ * @stats_enabled: Temporarily disable statistics fetches.
|
|
+ * Serialised by @stats_lock
|
|
* @mac_op: MAC interface
|
|
* @mac_address: Permanent MAC address
|
|
* @phy_type: PHY type
|
|
@@ -836,7 +837,7 @@
|
|
struct efx_mac_stats mac_stats;
|
|
struct efx_buffer stats_buffer;
|
|
spinlock_t stats_lock;
|
|
- unsigned int stats_disable_count;
|
|
+ bool stats_enabled;
|
|
|
|
struct efx_mac_operations *mac_op;
|
|
unsigned char mac_address[ETH_ALEN];
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/phy.h linux-2.6.29-rc3.owrt/drivers/net/sfc/phy.h
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/phy.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/phy.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -17,6 +17,7 @@
|
|
extern struct efx_phy_operations falcon_sft9001_phy_ops;
|
|
|
|
extern void tenxpress_phy_blink(struct efx_nic *efx, bool blink);
|
|
+extern void tenxpress_crc_err(struct efx_nic *efx);
|
|
|
|
/****************************************************************************
|
|
* Exported functions from the driver for XFP optical PHYs
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/selftest.c linux-2.6.29-rc3.owrt/drivers/net/sfc/selftest.c
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/selftest.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/selftest.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -665,7 +665,6 @@
|
|
{
|
|
enum efx_loopback_mode loopback_mode = efx->loopback_mode;
|
|
int phy_mode = efx->phy_mode;
|
|
- enum reset_type reset_method = RESET_TYPE_INVISIBLE;
|
|
struct ethtool_cmd ecmd;
|
|
struct efx_channel *channel;
|
|
int rc_test = 0, rc_reset = 0, rc;
|
|
@@ -719,21 +718,21 @@
|
|
mutex_unlock(&efx->mac_lock);
|
|
|
|
/* free up all consumers of SRAM (including all the queues) */
|
|
- efx_reset_down(efx, reset_method, &ecmd);
|
|
+ efx_reset_down(efx, &ecmd);
|
|
|
|
rc = efx_test_chip(efx, tests);
|
|
if (rc && !rc_test)
|
|
rc_test = rc;
|
|
|
|
/* reset the chip to recover from the register test */
|
|
- rc_reset = falcon_reset_hw(efx, reset_method);
|
|
+ rc_reset = falcon_reset_hw(efx, RESET_TYPE_ALL);
|
|
|
|
/* Ensure that the phy is powered and out of loopback
|
|
* for the bist and loopback tests */
|
|
efx->phy_mode &= ~PHY_MODE_LOW_POWER;
|
|
efx->loopback_mode = LOOPBACK_NONE;
|
|
|
|
- rc = efx_reset_up(efx, reset_method, &ecmd, rc_reset == 0);
|
|
+ rc = efx_reset_up(efx, &ecmd, rc_reset == 0);
|
|
if (rc && !rc_reset)
|
|
rc_reset = rc;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/sfe4001.c linux-2.6.29-rc3.owrt/drivers/net/sfc/sfe4001.c
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/sfe4001.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/sfe4001.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -186,22 +186,19 @@
|
|
{
|
|
efx_oword_t reg;
|
|
|
|
- /* GPIO 3 and the GPIO register are shared with I2C, so block that */
|
|
+ /* GPIO pins are also used for I2C, so block that temporarily */
|
|
mutex_lock(&efx->i2c_adap.bus_lock);
|
|
|
|
- /* Pull RST_N (GPIO 2) low then let it up again, setting the
|
|
- * FLASH_CFG_1 strap (GPIO 3) appropriately. Only change the
|
|
- * output enables; the output levels should always be 0 (low)
|
|
- * and we rely on external pull-ups. */
|
|
falcon_read(efx, ®, GPIO_CTL_REG_KER);
|
|
EFX_SET_OWORD_FIELD(reg, GPIO2_OEN, true);
|
|
+ EFX_SET_OWORD_FIELD(reg, GPIO2_OUT, false);
|
|
falcon_write(efx, ®, GPIO_CTL_REG_KER);
|
|
msleep(1000);
|
|
- EFX_SET_OWORD_FIELD(reg, GPIO2_OEN, false);
|
|
- EFX_SET_OWORD_FIELD(reg, GPIO3_OEN,
|
|
- !!(efx->phy_mode & PHY_MODE_SPECIAL));
|
|
+ EFX_SET_OWORD_FIELD(reg, GPIO2_OUT, true);
|
|
+ EFX_SET_OWORD_FIELD(reg, GPIO3_OEN, true);
|
|
+ EFX_SET_OWORD_FIELD(reg, GPIO3_OUT,
|
|
+ !(efx->phy_mode & PHY_MODE_SPECIAL));
|
|
falcon_write(efx, ®, GPIO_CTL_REG_KER);
|
|
- msleep(1);
|
|
|
|
mutex_unlock(&efx->i2c_adap.bus_lock);
|
|
|
|
@@ -235,18 +232,12 @@
|
|
} else if (efx->state != STATE_RUNNING || netif_running(efx->net_dev)) {
|
|
err = -EBUSY;
|
|
} else {
|
|
- /* Reset the PHY, reconfigure the MAC and enable/disable
|
|
- * MAC stats accordingly. */
|
|
efx->phy_mode = new_mode;
|
|
- if (new_mode & PHY_MODE_SPECIAL)
|
|
- efx_stats_disable(efx);
|
|
if (efx->board_info.type == EFX_BOARD_SFE4001)
|
|
err = sfe4001_poweron(efx);
|
|
else
|
|
err = sfn4111t_reset(efx);
|
|
efx_reconfigure_port(efx);
|
|
- if (!(new_mode & PHY_MODE_SPECIAL))
|
|
- efx_stats_enable(efx);
|
|
}
|
|
rtnl_unlock();
|
|
|
|
@@ -335,11 +326,6 @@
|
|
efx->board_info.monitor = sfe4001_check_hw;
|
|
efx->board_info.fini = sfe4001_fini;
|
|
|
|
- if (efx->phy_mode & PHY_MODE_SPECIAL) {
|
|
- /* PHY won't generate a 156.25 MHz clock and MAC stats fetch
|
|
- * will fail. */
|
|
- efx_stats_disable(efx);
|
|
- }
|
|
rc = sfe4001_poweron(efx);
|
|
if (rc)
|
|
goto fail_ioexp;
|
|
@@ -386,25 +372,17 @@
|
|
i2c_unregister_device(efx->board_info.hwmon_client);
|
|
}
|
|
|
|
-static struct i2c_board_info sfn4111t_a0_hwmon_info = {
|
|
+static struct i2c_board_info sfn4111t_hwmon_info = {
|
|
I2C_BOARD_INFO("max6647", 0x4e),
|
|
.irq = -1,
|
|
};
|
|
|
|
-static struct i2c_board_info sfn4111t_r5_hwmon_info = {
|
|
- I2C_BOARD_INFO("max6646", 0x4d),
|
|
- .irq = -1,
|
|
-};
|
|
-
|
|
int sfn4111t_init(struct efx_nic *efx)
|
|
{
|
|
int rc;
|
|
|
|
efx->board_info.hwmon_client =
|
|
- i2c_new_device(&efx->i2c_adap,
|
|
- (efx->board_info.minor < 5) ?
|
|
- &sfn4111t_a0_hwmon_info :
|
|
- &sfn4111t_r5_hwmon_info);
|
|
+ i2c_new_device(&efx->i2c_adap, &sfn4111t_hwmon_info);
|
|
if (!efx->board_info.hwmon_client)
|
|
return -EIO;
|
|
|
|
@@ -416,10 +394,8 @@
|
|
if (rc)
|
|
goto fail_hwmon;
|
|
|
|
- if (efx->phy_mode & PHY_MODE_SPECIAL) {
|
|
- efx_stats_disable(efx);
|
|
+ if (efx->phy_mode & PHY_MODE_SPECIAL)
|
|
sfn4111t_reset(efx);
|
|
- }
|
|
|
|
return 0;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/tenxpress.c linux-2.6.29-rc3.owrt/drivers/net/sfc/tenxpress.c
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/tenxpress.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/tenxpress.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -67,8 +67,6 @@
|
|
#define PMA_PMD_EXT_CLK312_WIDTH 1
|
|
#define PMA_PMD_EXT_LPOWER_LBN 12
|
|
#define PMA_PMD_EXT_LPOWER_WIDTH 1
|
|
-#define PMA_PMD_EXT_ROBUST_LBN 14
|
|
-#define PMA_PMD_EXT_ROBUST_WIDTH 1
|
|
#define PMA_PMD_EXT_SSR_LBN 15
|
|
#define PMA_PMD_EXT_SSR_WIDTH 1
|
|
|
|
@@ -179,24 +177,35 @@
|
|
#define C22EXT_STATUS_LINK_LBN 2
|
|
#define C22EXT_STATUS_LINK_WIDTH 1
|
|
|
|
-#define C22EXT_MSTSLV_CTRL 49161
|
|
-#define C22EXT_MSTSLV_CTRL_ADV_1000_HD_LBN 8
|
|
-#define C22EXT_MSTSLV_CTRL_ADV_1000_FD_LBN 9
|
|
-
|
|
-#define C22EXT_MSTSLV_STATUS 49162
|
|
-#define C22EXT_MSTSLV_STATUS_LP_1000_HD_LBN 10
|
|
-#define C22EXT_MSTSLV_STATUS_LP_1000_FD_LBN 11
|
|
+#define C22EXT_MSTSLV_REG 49162
|
|
+#define C22EXT_MSTSLV_1000_HD_LBN 10
|
|
+#define C22EXT_MSTSLV_1000_HD_WIDTH 1
|
|
+#define C22EXT_MSTSLV_1000_FD_LBN 11
|
|
+#define C22EXT_MSTSLV_1000_FD_WIDTH 1
|
|
|
|
/* Time to wait between powering down the LNPGA and turning off the power
|
|
* rails */
|
|
#define LNPGA_PDOWN_WAIT (HZ / 5)
|
|
|
|
+static int crc_error_reset_threshold = 100;
|
|
+module_param(crc_error_reset_threshold, int, 0644);
|
|
+MODULE_PARM_DESC(crc_error_reset_threshold,
|
|
+ "Max number of CRC errors before XAUI reset");
|
|
+
|
|
struct tenxpress_phy_data {
|
|
enum efx_loopback_mode loopback_mode;
|
|
+ atomic_t bad_crc_count;
|
|
enum efx_phy_mode phy_mode;
|
|
int bad_lp_tries;
|
|
};
|
|
|
|
+void tenxpress_crc_err(struct efx_nic *efx)
|
|
+{
|
|
+ struct tenxpress_phy_data *phy_data = efx->phy_data;
|
|
+ if (phy_data != NULL)
|
|
+ atomic_inc(&phy_data->bad_crc_count);
|
|
+}
|
|
+
|
|
static ssize_t show_phy_short_reach(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
@@ -275,9 +284,7 @@
|
|
PMA_PMD_XCONTROL_REG);
|
|
reg |= ((1 << PMA_PMD_EXT_GMII_EN_LBN) |
|
|
(1 << PMA_PMD_EXT_CLK_OUT_LBN) |
|
|
- (1 << PMA_PMD_EXT_CLK312_LBN) |
|
|
- (1 << PMA_PMD_EXT_ROBUST_LBN));
|
|
-
|
|
+ (1 << PMA_PMD_EXT_CLK312_LBN));
|
|
mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
|
|
PMA_PMD_XCONTROL_REG, reg);
|
|
mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
|
|
@@ -339,7 +346,6 @@
|
|
rc = tenxpress_init(efx);
|
|
if (rc < 0)
|
|
goto fail;
|
|
- mdio_clause45_set_pause(efx);
|
|
|
|
if (efx->phy_type == PHY_TYPE_SFT9001B) {
|
|
rc = device_create_file(&efx->pci_dev->dev,
|
|
@@ -370,8 +376,8 @@
|
|
|
|
/* The XGMAC clock is driven from the SFC7101/SFT9001 312MHz clock, so
|
|
* a special software reset can glitch the XGMAC sufficiently for stats
|
|
- * requests to fail. */
|
|
- efx_stats_disable(efx);
|
|
+ * requests to fail. Since we don't often special_reset, just lock. */
|
|
+ spin_lock(&efx->stats_lock);
|
|
|
|
/* Initiate reset */
|
|
reg = mdio_clause45_read(efx, efx->mii.phy_id,
|
|
@@ -386,17 +392,17 @@
|
|
rc = mdio_clause45_wait_reset_mmds(efx,
|
|
TENXPRESS_REQUIRED_DEVS);
|
|
if (rc < 0)
|
|
- goto out;
|
|
+ goto unlock;
|
|
|
|
/* Try and reconfigure the device */
|
|
rc = tenxpress_init(efx);
|
|
if (rc < 0)
|
|
- goto out;
|
|
+ goto unlock;
|
|
|
|
/* Wait for the XGXS state machine to churn */
|
|
mdelay(10);
|
|
-out:
|
|
- efx_stats_enable(efx);
|
|
+unlock:
|
|
+ spin_unlock(&efx->stats_lock);
|
|
return rc;
|
|
}
|
|
|
|
@@ -514,7 +520,7 @@
|
|
{
|
|
struct tenxpress_phy_data *phy_data = efx->phy_data;
|
|
struct ethtool_cmd ecmd;
|
|
- bool phy_mode_change, loop_reset;
|
|
+ bool phy_mode_change, loop_reset, loop_toggle, loopback;
|
|
|
|
if (efx->phy_mode & (PHY_MODE_OFF | PHY_MODE_SPECIAL)) {
|
|
phy_data->phy_mode = efx->phy_mode;
|
|
@@ -525,10 +531,12 @@
|
|
|
|
phy_mode_change = (efx->phy_mode == PHY_MODE_NORMAL &&
|
|
phy_data->phy_mode != PHY_MODE_NORMAL);
|
|
+ loopback = LOOPBACK_MASK(efx) & efx->phy_op->loopbacks;
|
|
+ loop_toggle = LOOPBACK_CHANGED(phy_data, efx, efx->phy_op->loopbacks);
|
|
loop_reset = (LOOPBACK_OUT_OF(phy_data, efx, efx->phy_op->loopbacks) ||
|
|
LOOPBACK_CHANGED(phy_data, efx, 1 << LOOPBACK_GPHY));
|
|
|
|
- if (loop_reset || phy_mode_change) {
|
|
+ if (loop_reset || loop_toggle || loopback || phy_mode_change) {
|
|
int rc;
|
|
|
|
efx->phy_op->get_settings(efx, &ecmd);
|
|
@@ -543,6 +551,20 @@
|
|
falcon_reset_xaui(efx);
|
|
}
|
|
|
|
+ if (efx->phy_type != PHY_TYPE_SFX7101) {
|
|
+ /* Only change autoneg once, on coming out or
|
|
+ * going into loopback */
|
|
+ if (loop_toggle)
|
|
+ ecmd.autoneg = !loopback;
|
|
+ if (loopback) {
|
|
+ ecmd.duplex = DUPLEX_FULL;
|
|
+ if (efx->loopback_mode == LOOPBACK_GPHY)
|
|
+ ecmd.speed = SPEED_1000;
|
|
+ else
|
|
+ ecmd.speed = SPEED_10000;
|
|
+ }
|
|
+ }
|
|
+
|
|
rc = efx->phy_op->set_settings(efx, &ecmd);
|
|
WARN_ON(rc);
|
|
}
|
|
@@ -601,6 +623,13 @@
|
|
|
|
if (phy_data->phy_mode != PHY_MODE_NORMAL)
|
|
return;
|
|
+
|
|
+ if (EFX_WORKAROUND_10750(efx) &&
|
|
+ atomic_read(&phy_data->bad_crc_count) > crc_error_reset_threshold) {
|
|
+ EFX_ERR(efx, "Resetting XAUI due to too many CRC errors\n");
|
|
+ falcon_reset_xaui(efx);
|
|
+ atomic_set(&phy_data->bad_crc_count, 0);
|
|
+ }
|
|
}
|
|
|
|
static void tenxpress_phy_fini(struct efx_nic *efx)
|
|
@@ -743,76 +772,107 @@
|
|
return rc;
|
|
}
|
|
|
|
-static void
|
|
-tenxpress_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
|
|
+static u32 tenxpress_get_xnp_lpa(struct efx_nic *efx)
|
|
{
|
|
- int phy_id = efx->mii.phy_id;
|
|
- u32 adv = 0, lpa = 0;
|
|
+ int phy = efx->mii.phy_id;
|
|
+ u32 lpa = 0;
|
|
int reg;
|
|
|
|
if (efx->phy_type != PHY_TYPE_SFX7101) {
|
|
- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_C22EXT,
|
|
- C22EXT_MSTSLV_CTRL);
|
|
- if (reg & (1 << C22EXT_MSTSLV_CTRL_ADV_1000_FD_LBN))
|
|
- adv |= ADVERTISED_1000baseT_Full;
|
|
- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_C22EXT,
|
|
- C22EXT_MSTSLV_STATUS);
|
|
- if (reg & (1 << C22EXT_MSTSLV_STATUS_LP_1000_HD_LBN))
|
|
+ reg = mdio_clause45_read(efx, phy, MDIO_MMD_C22EXT,
|
|
+ C22EXT_MSTSLV_REG);
|
|
+ if (reg & (1 << C22EXT_MSTSLV_1000_HD_LBN))
|
|
lpa |= ADVERTISED_1000baseT_Half;
|
|
- if (reg & (1 << C22EXT_MSTSLV_STATUS_LP_1000_FD_LBN))
|
|
+ if (reg & (1 << C22EXT_MSTSLV_1000_FD_LBN))
|
|
lpa |= ADVERTISED_1000baseT_Full;
|
|
}
|
|
- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
|
|
- MDIO_AN_10GBT_CTRL);
|
|
- if (reg & (1 << MDIO_AN_10GBT_CTRL_ADV_10G_LBN))
|
|
- adv |= ADVERTISED_10000baseT_Full;
|
|
- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
|
|
- MDIO_AN_10GBT_STATUS);
|
|
+ reg = mdio_clause45_read(efx, phy, MDIO_MMD_AN, MDIO_AN_10GBT_STATUS);
|
|
if (reg & (1 << MDIO_AN_10GBT_STATUS_LP_10G_LBN))
|
|
lpa |= ADVERTISED_10000baseT_Full;
|
|
-
|
|
- mdio_clause45_get_settings_ext(efx, ecmd, adv, lpa);
|
|
-
|
|
- if (efx->phy_type != PHY_TYPE_SFX7101)
|
|
- ecmd->supported |= (SUPPORTED_100baseT_Full |
|
|
- SUPPORTED_1000baseT_Full);
|
|
-
|
|
- /* In loopback, the PHY automatically brings up the correct interface,
|
|
- * but doesn't advertise the correct speed. So override it */
|
|
- if (efx->loopback_mode == LOOPBACK_GPHY)
|
|
- ecmd->speed = SPEED_1000;
|
|
- else if (LOOPBACK_MASK(efx) & efx->phy_op->loopbacks)
|
|
- ecmd->speed = SPEED_10000;
|
|
+ return lpa;
|
|
}
|
|
|
|
-static int tenxpress_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
|
|
+static void sfx7101_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
|
|
{
|
|
- if (!ecmd->autoneg)
|
|
- return -EINVAL;
|
|
-
|
|
- return mdio_clause45_set_settings(efx, ecmd);
|
|
+ mdio_clause45_get_settings_ext(efx, ecmd, ADVERTISED_10000baseT_Full,
|
|
+ tenxpress_get_xnp_lpa(efx));
|
|
+ ecmd->supported |= SUPPORTED_10000baseT_Full;
|
|
+ ecmd->advertising |= ADVERTISED_10000baseT_Full;
|
|
}
|
|
|
|
-static void sfx7101_set_npage_adv(struct efx_nic *efx, u32 advertising)
|
|
+static void sft9001_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
|
|
{
|
|
- mdio_clause45_set_flag(efx, efx->mii.phy_id, MDIO_MMD_AN,
|
|
- MDIO_AN_10GBT_CTRL,
|
|
- MDIO_AN_10GBT_CTRL_ADV_10G_LBN,
|
|
- advertising & ADVERTISED_10000baseT_Full);
|
|
+ int phy_id = efx->mii.phy_id;
|
|
+ u32 xnp_adv = 0;
|
|
+ int reg;
|
|
+
|
|
+ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
|
|
+ PMA_PMD_SPEED_ENABLE_REG);
|
|
+ if (EFX_WORKAROUND_13204(efx) && (reg & (1 << PMA_PMD_100TX_ADV_LBN)))
|
|
+ xnp_adv |= ADVERTISED_100baseT_Full;
|
|
+ if (reg & (1 << PMA_PMD_1000T_ADV_LBN))
|
|
+ xnp_adv |= ADVERTISED_1000baseT_Full;
|
|
+ if (reg & (1 << PMA_PMD_10000T_ADV_LBN))
|
|
+ xnp_adv |= ADVERTISED_10000baseT_Full;
|
|
+
|
|
+ mdio_clause45_get_settings_ext(efx, ecmd, xnp_adv,
|
|
+ tenxpress_get_xnp_lpa(efx));
|
|
+
|
|
+ ecmd->supported |= (SUPPORTED_100baseT_Half |
|
|
+ SUPPORTED_100baseT_Full |
|
|
+ SUPPORTED_1000baseT_Full);
|
|
+
|
|
+ /* Use the vendor defined C22ext register for duplex settings */
|
|
+ if (ecmd->speed != SPEED_10000 && !ecmd->autoneg) {
|
|
+ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_C22EXT,
|
|
+ GPHY_XCONTROL_REG);
|
|
+ ecmd->duplex = (reg & (1 << GPHY_DUPLEX_LBN) ?
|
|
+ DUPLEX_FULL : DUPLEX_HALF);
|
|
+ }
|
|
}
|
|
|
|
-static void sft9001_set_npage_adv(struct efx_nic *efx, u32 advertising)
|
|
+static int sft9001_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
|
|
{
|
|
int phy_id = efx->mii.phy_id;
|
|
+ int rc;
|
|
|
|
- mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
|
|
- C22EXT_MSTSLV_CTRL,
|
|
- C22EXT_MSTSLV_CTRL_ADV_1000_FD_LBN,
|
|
- advertising & ADVERTISED_1000baseT_Full);
|
|
- mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_AN,
|
|
- MDIO_AN_10GBT_CTRL,
|
|
- MDIO_AN_10GBT_CTRL_ADV_10G_LBN,
|
|
- advertising & ADVERTISED_10000baseT_Full);
|
|
+ rc = mdio_clause45_set_settings(efx, ecmd);
|
|
+ if (rc)
|
|
+ return rc;
|
|
+
|
|
+ if (ecmd->speed != SPEED_10000 && !ecmd->autoneg)
|
|
+ mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
|
|
+ GPHY_XCONTROL_REG, GPHY_DUPLEX_LBN,
|
|
+ ecmd->duplex == DUPLEX_FULL);
|
|
+
|
|
+ return rc;
|
|
+}
|
|
+
|
|
+static bool sft9001_set_xnp_advertise(struct efx_nic *efx, u32 advertising)
|
|
+{
|
|
+ int phy = efx->mii.phy_id;
|
|
+ int reg = mdio_clause45_read(efx, phy, MDIO_MMD_PMAPMD,
|
|
+ PMA_PMD_SPEED_ENABLE_REG);
|
|
+ bool enabled;
|
|
+
|
|
+ reg &= ~((1 << 2) | (1 << 3));
|
|
+ if (EFX_WORKAROUND_13204(efx) &&
|
|
+ (advertising & ADVERTISED_100baseT_Full))
|
|
+ reg |= 1 << PMA_PMD_100TX_ADV_LBN;
|
|
+ if (advertising & ADVERTISED_1000baseT_Full)
|
|
+ reg |= 1 << PMA_PMD_1000T_ADV_LBN;
|
|
+ if (advertising & ADVERTISED_10000baseT_Full)
|
|
+ reg |= 1 << PMA_PMD_10000T_ADV_LBN;
|
|
+ mdio_clause45_write(efx, phy, MDIO_MMD_PMAPMD,
|
|
+ PMA_PMD_SPEED_ENABLE_REG, reg);
|
|
+
|
|
+ enabled = (advertising &
|
|
+ (ADVERTISED_1000baseT_Half |
|
|
+ ADVERTISED_1000baseT_Full |
|
|
+ ADVERTISED_10000baseT_Full));
|
|
+ if (EFX_WORKAROUND_13204(efx))
|
|
+ enabled |= (advertising & ADVERTISED_100baseT_Full);
|
|
+ return enabled;
|
|
}
|
|
|
|
struct efx_phy_operations falcon_sfx7101_phy_ops = {
|
|
@@ -822,9 +882,8 @@
|
|
.poll = tenxpress_phy_poll,
|
|
.fini = tenxpress_phy_fini,
|
|
.clear_interrupt = efx_port_dummy_op_void,
|
|
- .get_settings = tenxpress_get_settings,
|
|
- .set_settings = tenxpress_set_settings,
|
|
- .set_npage_adv = sfx7101_set_npage_adv,
|
|
+ .get_settings = sfx7101_get_settings,
|
|
+ .set_settings = mdio_clause45_set_settings,
|
|
.num_tests = ARRAY_SIZE(sfx7101_test_names),
|
|
.test_names = sfx7101_test_names,
|
|
.run_tests = sfx7101_run_tests,
|
|
@@ -839,9 +898,9 @@
|
|
.poll = tenxpress_phy_poll,
|
|
.fini = tenxpress_phy_fini,
|
|
.clear_interrupt = efx_port_dummy_op_void,
|
|
- .get_settings = tenxpress_get_settings,
|
|
- .set_settings = tenxpress_set_settings,
|
|
- .set_npage_adv = sft9001_set_npage_adv,
|
|
+ .get_settings = sft9001_get_settings,
|
|
+ .set_settings = sft9001_set_settings,
|
|
+ .set_xnp_advertise = sft9001_set_xnp_advertise,
|
|
.num_tests = ARRAY_SIZE(sft9001_test_names),
|
|
.test_names = sft9001_test_names,
|
|
.run_tests = sft9001_run_tests,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sfc/workarounds.h linux-2.6.29-rc3.owrt/drivers/net/sfc/workarounds.h
|
|
--- linux-2.6.29.owrt/drivers/net/sfc/workarounds.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sfc/workarounds.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -18,8 +18,8 @@
|
|
#define EFX_WORKAROUND_ALWAYS(efx) 1
|
|
#define EFX_WORKAROUND_FALCON_A(efx) (falcon_rev(efx) <= FALCON_REV_A1)
|
|
#define EFX_WORKAROUND_10G(efx) EFX_IS10G(efx)
|
|
-#define EFX_WORKAROUND_SFT9001(efx) ((efx)->phy_type == PHY_TYPE_SFT9001A || \
|
|
- (efx)->phy_type == PHY_TYPE_SFT9001B)
|
|
+#define EFX_WORKAROUND_SFX7101(efx) ((efx)->phy_type == PHY_TYPE_SFX7101)
|
|
+#define EFX_WORKAROUND_SFT9001A(efx) ((efx)->phy_type == PHY_TYPE_SFT9001A)
|
|
|
|
/* XAUI resets if link not detected */
|
|
#define EFX_WORKAROUND_5147 EFX_WORKAROUND_ALWAYS
|
|
@@ -29,6 +29,8 @@
|
|
#define EFX_WORKAROUND_7884 EFX_WORKAROUND_10G
|
|
/* TX pkt parser problem with <= 16 byte TXes */
|
|
#define EFX_WORKAROUND_9141 EFX_WORKAROUND_ALWAYS
|
|
+/* Low rate CRC errors require XAUI reset */
|
|
+#define EFX_WORKAROUND_10750 EFX_WORKAROUND_SFX7101
|
|
/* TX_EV_PKT_ERR can be caused by a dangling TX descriptor
|
|
* or a PCIe error (bug 11028) */
|
|
#define EFX_WORKAROUND_10727 EFX_WORKAROUND_ALWAYS
|
|
@@ -53,8 +55,8 @@
|
|
#define EFX_WORKAROUND_8071 EFX_WORKAROUND_FALCON_A
|
|
|
|
/* Need to send XNP pages for 100BaseT */
|
|
-#define EFX_WORKAROUND_13204 EFX_WORKAROUND_SFT9001
|
|
-/* Don't restart AN in near-side loopback */
|
|
-#define EFX_WORKAROUND_15195 EFX_WORKAROUND_SFT9001
|
|
+#define EFX_WORKAROUND_13204 EFX_WORKAROUND_SFT9001A
|
|
+/* Need to keep AN enabled */
|
|
+#define EFX_WORKAROUND_13963 EFX_WORKAROUND_SFT9001A
|
|
|
|
#endif /* EFX_WORKAROUNDS_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sh_eth.c linux-2.6.29-rc3.owrt/drivers/net/sh_eth.c
|
|
--- linux-2.6.29.owrt/drivers/net/sh_eth.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sh_eth.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -687,7 +687,6 @@
|
|
{
|
|
struct net_device *ndev = netdev;
|
|
struct sh_eth_private *mdp = netdev_priv(ndev);
|
|
- irqreturn_t ret = IRQ_NONE;
|
|
u32 ioaddr, boguscnt = RX_RING_SIZE;
|
|
u32 intr_status = 0;
|
|
|
|
@@ -697,13 +696,7 @@
|
|
/* Get interrpt stat */
|
|
intr_status = ctrl_inl(ioaddr + EESR);
|
|
/* Clear interrupt */
|
|
- if (intr_status & (EESR_FRC | EESR_RMAF | EESR_RRF |
|
|
- EESR_RTLF | EESR_RTSF | EESR_PRE | EESR_CERF |
|
|
- TX_CHECK | EESR_ERR_CHECK)) {
|
|
- ctrl_outl(intr_status, ioaddr + EESR);
|
|
- ret = IRQ_HANDLED;
|
|
- } else
|
|
- goto other_irq;
|
|
+ ctrl_outl(intr_status, ioaddr + EESR);
|
|
|
|
if (intr_status & (EESR_FRC | /* Frame recv*/
|
|
EESR_RMAF | /* Multi cast address recv*/
|
|
@@ -730,10 +723,9 @@
|
|
ndev->name, intr_status);
|
|
}
|
|
|
|
-other_irq:
|
|
spin_unlock(&mdp->lock);
|
|
|
|
- return ret;
|
|
+ return IRQ_HANDLED;
|
|
}
|
|
|
|
static void sh_eth_timer(unsigned long data)
|
|
@@ -852,13 +844,7 @@
|
|
int ret = 0;
|
|
struct sh_eth_private *mdp = netdev_priv(ndev);
|
|
|
|
- ret = request_irq(ndev->irq, &sh_eth_interrupt,
|
|
-#if defined(CONFIG_CPU_SUBTYPE_SH7763) || defined(CONFIG_CPU_SUBTYPE_SH7764)
|
|
- IRQF_SHARED,
|
|
-#else
|
|
- 0,
|
|
-#endif
|
|
- ndev->name, ndev);
|
|
+ ret = request_irq(ndev->irq, &sh_eth_interrupt, 0, ndev->name, ndev);
|
|
if (ret) {
|
|
printk(KERN_ERR "Can not assign IRQ number to %s\n", CARDNAME);
|
|
return ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sh_eth.h linux-2.6.29-rc3.owrt/drivers/net/sh_eth.h
|
|
--- linux-2.6.29.owrt/drivers/net/sh_eth.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sh_eth.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -43,8 +43,8 @@
|
|
|
|
#define SH7763_SKB_ALIGN 32
|
|
/* Chip Base Address */
|
|
-# define SH_TSU_ADDR 0xFEE01800
|
|
-# define ARSTR SH_TSU_ADDR
|
|
+# define SH_TSU_ADDR 0xFFE01800
|
|
+# define ARSTR 0xFFE01800
|
|
|
|
/* Chip Registers */
|
|
/* E-DMAC */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/skfp/skfddi.c linux-2.6.29-rc3.owrt/drivers/net/skfp/skfddi.c
|
|
--- linux-2.6.29.owrt/drivers/net/skfp/skfddi.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/skfp/skfddi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1003,9 +1003,9 @@
|
|
break;
|
|
case SKFP_CLR_STATS: /* Zero out the driver statistics */
|
|
if (!capable(CAP_NET_ADMIN)) {
|
|
- status = -EPERM;
|
|
- } else {
|
|
memset(&lp->MacStat, 0, sizeof(lp->MacStat));
|
|
+ } else {
|
|
+ status = -EPERM;
|
|
}
|
|
break;
|
|
default:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sky2.c linux-2.6.29-rc3.owrt/drivers/net/sky2.c
|
|
--- linux-2.6.29.owrt/drivers/net/sky2.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sky2.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1403,6 +1403,9 @@
|
|
|
|
}
|
|
|
|
+ if (netif_msg_ifup(sky2))
|
|
+ printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
|
|
+
|
|
netif_carrier_off(dev);
|
|
|
|
/* must be power of 2 */
|
|
@@ -1481,9 +1484,6 @@
|
|
sky2_write32(hw, B0_IMSK, imask);
|
|
|
|
sky2_set_multicast(dev);
|
|
-
|
|
- if (netif_msg_ifup(sky2))
|
|
- printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
|
|
return 0;
|
|
|
|
err_out:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/smc911x.c linux-2.6.29-rc3.owrt/drivers/net/smc911x.c
|
|
--- linux-2.6.29.owrt/drivers/net/smc911x.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/smc911x.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -220,9 +220,9 @@
|
|
|
|
/* make sure EEPROM has finished loading before setting GPIO_CFG */
|
|
timeout=1000;
|
|
- while (--timeout && (SMC_GET_E2P_CMD(lp) & E2P_CMD_EPC_BUSY_))
|
|
+ while ( timeout-- && (SMC_GET_E2P_CMD(lp) & E2P_CMD_EPC_BUSY_)) {
|
|
udelay(10);
|
|
-
|
|
+ }
|
|
if (timeout == 0){
|
|
PRINTK("%s: smc911x_reset timeout waiting for EEPROM busy\n", dev->name);
|
|
return;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/smc911x.h linux-2.6.29-rc3.owrt/drivers/net/smc911x.h
|
|
--- linux-2.6.29.owrt/drivers/net/smc911x.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/smc911x.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -42,16 +42,6 @@
|
|
#define SMC_USE_16BIT 0
|
|
#define SMC_USE_32BIT 1
|
|
#define SMC_IRQ_SENSE IRQF_TRIGGER_LOW
|
|
-#elif defined(CONFIG_ARCH_OMAP34XX)
|
|
- #define SMC_USE_16BIT 0
|
|
- #define SMC_USE_32BIT 1
|
|
- #define SMC_IRQ_SENSE IRQF_TRIGGER_LOW
|
|
- #define SMC_MEM_RESERVED 1
|
|
-#elif defined(CONFIG_ARCH_OMAP24XX)
|
|
- #define SMC_USE_16BIT 0
|
|
- #define SMC_USE_32BIT 1
|
|
- #define SMC_IRQ_SENSE IRQF_TRIGGER_LOW
|
|
- #define SMC_MEM_RESERVED 1
|
|
#else
|
|
/*
|
|
* Default configuration
|
|
@@ -685,7 +675,6 @@
|
|
#define CHIP_9116 0x0116
|
|
#define CHIP_9117 0x0117
|
|
#define CHIP_9118 0x0118
|
|
-#define CHIP_9211 0x9211
|
|
#define CHIP_9215 0x115A
|
|
#define CHIP_9217 0x117A
|
|
#define CHIP_9218 0x118A
|
|
@@ -700,7 +689,6 @@
|
|
{ CHIP_9116, "LAN9116" },
|
|
{ CHIP_9117, "LAN9117" },
|
|
{ CHIP_9118, "LAN9118" },
|
|
- { CHIP_9211, "LAN9211" },
|
|
{ CHIP_9215, "LAN9215" },
|
|
{ CHIP_9217, "LAN9217" },
|
|
{ CHIP_9218, "LAN9218" },
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/smsc911x.c linux-2.6.29-rc3.owrt/drivers/net/smsc911x.c
|
|
--- linux-2.6.29.owrt/drivers/net/smsc911x.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/smsc911x.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -953,7 +953,7 @@
|
|
do {
|
|
udelay(1);
|
|
val = smsc911x_reg_read(pdata, RX_DP_CTRL);
|
|
- } while (--timeout && (val & RX_DP_CTRL_RX_FFWD_));
|
|
+ } while (timeout-- && (val & RX_DP_CTRL_RX_FFWD_));
|
|
|
|
if (unlikely(timeout == 0))
|
|
SMSC_WARNING(HW, "Timed out waiting for "
|
|
@@ -1225,10 +1225,6 @@
|
|
dev_info(&dev->dev, "SMSC911x/921x identified at %#08lx, IRQ: %d\n",
|
|
(unsigned long)pdata->ioaddr, dev->irq);
|
|
|
|
- /* Reset the last known duplex and carrier */
|
|
- pdata->last_duplex = -1;
|
|
- pdata->last_carrier = -1;
|
|
-
|
|
/* Bring the PHY up */
|
|
phy_start(pdata->phy_dev);
|
|
|
|
@@ -1628,7 +1624,7 @@
|
|
do {
|
|
msleep(1);
|
|
e2cmd = smsc911x_reg_read(pdata, E2P_CMD);
|
|
- } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (--timeout));
|
|
+ } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (timeout--));
|
|
|
|
if (!timeout) {
|
|
SMSC_TRACE(DRV, "TIMED OUT");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/smsc9420.c linux-2.6.29-rc3.owrt/drivers/net/smsc9420.c
|
|
--- linux-2.6.29.owrt/drivers/net/smsc9420.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/smsc9420.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -341,7 +341,7 @@
|
|
do {
|
|
msleep(1);
|
|
e2cmd = smsc9420_reg_read(pd, E2P_CMD);
|
|
- } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (--timeout));
|
|
+ } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (timeout--));
|
|
|
|
if (!timeout) {
|
|
smsc_info(HW, "TIMED OUT");
|
|
@@ -413,7 +413,6 @@
|
|
}
|
|
|
|
memcpy(data, &eeprom_data[eeprom->offset], len);
|
|
- eeprom->magic = SMSC9420_EEPROM_MAGIC;
|
|
eeprom->len = len;
|
|
return 0;
|
|
}
|
|
@@ -424,9 +423,6 @@
|
|
struct smsc9420_pdata *pd = netdev_priv(dev);
|
|
int ret;
|
|
|
|
- if (eeprom->magic != SMSC9420_EEPROM_MAGIC)
|
|
- return -EINVAL;
|
|
-
|
|
smsc9420_eeprom_enable_access(pd);
|
|
smsc9420_eeprom_send_cmd(pd, E2P_CMD_EPC_CMD_EWEN_);
|
|
ret = smsc9420_eeprom_write_location(pd, eeprom->offset, *data);
|
|
@@ -502,7 +498,7 @@
|
|
static void smsc9420_stop_tx(struct smsc9420_pdata *pd)
|
|
{
|
|
u32 dmac_control, mac_cr, dma_intr_ena;
|
|
- int timeout = 1000;
|
|
+ int timeOut = 1000;
|
|
|
|
/* disable TX DMAC */
|
|
dmac_control = smsc9420_reg_read(pd, DMAC_CONTROL);
|
|
@@ -510,13 +506,13 @@
|
|
smsc9420_reg_write(pd, DMAC_CONTROL, dmac_control);
|
|
|
|
/* Wait max 10ms for transmit process to stop */
|
|
- while (--timeout) {
|
|
+ while (timeOut--) {
|
|
if (smsc9420_reg_read(pd, DMAC_STATUS) & DMAC_STS_TS_)
|
|
break;
|
|
udelay(10);
|
|
}
|
|
|
|
- if (!timeout)
|
|
+ if (!timeOut)
|
|
smsc_warn(IFDOWN, "TX DMAC failed to stop");
|
|
|
|
/* ACK Tx DMAC stop bit */
|
|
@@ -600,7 +596,7 @@
|
|
|
|
static void smsc9420_stop_rx(struct smsc9420_pdata *pd)
|
|
{
|
|
- int timeout = 1000;
|
|
+ int timeOut = 1000;
|
|
u32 mac_cr, dmac_control, dma_intr_ena;
|
|
|
|
/* mask RX DMAC interrupts */
|
|
@@ -621,13 +617,13 @@
|
|
smsc9420_pci_flush_write(pd);
|
|
|
|
/* wait up to 10ms for receive to stop */
|
|
- while (--timeout) {
|
|
+ while (timeOut--) {
|
|
if (smsc9420_reg_read(pd, DMAC_STATUS) & DMAC_STS_RS_)
|
|
break;
|
|
udelay(10);
|
|
}
|
|
|
|
- if (!timeout)
|
|
+ if (!timeOut)
|
|
smsc_warn(IFDOWN, "RX DMAC did not stop! timeout.");
|
|
|
|
/* ACK the Rx DMAC stop bit */
|
|
@@ -1382,7 +1378,6 @@
|
|
|
|
/* test the IRQ connection to the ISR */
|
|
smsc_dbg(IFUP, "Testing ISR using IRQ %d", dev->irq);
|
|
- pd->software_irq_signal = false;
|
|
|
|
spin_lock_irqsave(&pd->int_lock, flags);
|
|
/* configure interrupt deassertion timer and enable interrupts */
|
|
@@ -1398,6 +1393,8 @@
|
|
smsc9420_pci_flush_write(pd);
|
|
|
|
timeout = 1000;
|
|
+ pd->software_irq_signal = false;
|
|
+ smp_wmb();
|
|
while (timeout--) {
|
|
if (pd->software_irq_signal)
|
|
break;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/smsc9420.h linux-2.6.29-rc3.owrt/drivers/net/smsc9420.h
|
|
--- linux-2.6.29.owrt/drivers/net/smsc9420.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/smsc9420.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -44,7 +44,6 @@
|
|
#define LAN_REGISTER_EXTENT (0x400)
|
|
|
|
#define SMSC9420_EEPROM_SIZE ((u32)11)
|
|
-#define SMSC9420_EEPROM_MAGIC (0x9420)
|
|
|
|
#define PKT_BUF_SZ (VLAN_ETH_FRAME_LEN + NET_IP_ALIGN + 4)
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sun3lance.c linux-2.6.29-rc3.owrt/drivers/net/sun3lance.c
|
|
--- linux-2.6.29.owrt/drivers/net/sun3lance.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sun3lance.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -428,7 +428,7 @@
|
|
while (--i > 0)
|
|
if (DREG & CSR0_IDON)
|
|
break;
|
|
- if (i <= 0 || (DREG & CSR0_ERR)) {
|
|
+ if (i < 0 || (DREG & CSR0_ERR)) {
|
|
DPRINTK( 2, ( "lance_open(): opening %s failed, i=%d, csr0=%04x\n",
|
|
dev->name, i, DREG ));
|
|
DREG = CSR0_STOP;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sundance.c linux-2.6.29-rc3.owrt/drivers/net/sundance.c
|
|
--- linux-2.6.29.owrt/drivers/net/sundance.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sundance.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -909,7 +909,7 @@
|
|
printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d "
|
|
"negotiated capability %4.4x.\n", dev->name,
|
|
duplex ? "full" : "half", np->phys[0], negotiated);
|
|
- iowrite16(ioread16(ioaddr + MACCtrl0) | (duplex ? 0x20 : 0), ioaddr + MACCtrl0);
|
|
+ iowrite16(ioread16(ioaddr + MACCtrl0) | duplex ? 0x20 : 0, ioaddr + MACCtrl0);
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sungem.c linux-2.6.29-rc3.owrt/drivers/net/sungem.c
|
|
--- linux-2.6.29.owrt/drivers/net/sungem.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sungem.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -148,7 +148,7 @@
|
|
cmd |= (MIF_FRAME_TAMSB);
|
|
writel(cmd, gp->regs + MIF_FRAME);
|
|
|
|
- while (--limit) {
|
|
+ while (limit--) {
|
|
cmd = readl(gp->regs + MIF_FRAME);
|
|
if (cmd & MIF_FRAME_TALSB)
|
|
break;
|
|
@@ -1157,7 +1157,7 @@
|
|
if (limit-- <= 0)
|
|
break;
|
|
}
|
|
- if (limit < 0)
|
|
+ if (limit <= 0)
|
|
printk(KERN_WARNING "%s: PCS reset bit would not clear.\n",
|
|
gp->dev->name);
|
|
}
|
|
@@ -1229,7 +1229,7 @@
|
|
break;
|
|
} while (val & (GREG_SWRST_TXRST | GREG_SWRST_RXRST));
|
|
|
|
- if (limit < 0)
|
|
+ if (limit <= 0)
|
|
printk(KERN_ERR "%s: SW reset is ghetto.\n", gp->dev->name);
|
|
|
|
if (gp->phy_type == phy_serialink || gp->phy_type == phy_serdes)
|
|
@@ -2221,8 +2221,6 @@
|
|
|
|
gp->running = 1;
|
|
|
|
- napi_enable(&gp->napi);
|
|
-
|
|
if (gp->lstate == link_up) {
|
|
netif_carrier_on(gp->dev);
|
|
gem_set_link_modes(gp);
|
|
@@ -2240,8 +2238,6 @@
|
|
spin_lock_irqsave(&gp->lock, flags);
|
|
spin_lock(&gp->tx_lock);
|
|
|
|
- napi_disable(&gp->napi);
|
|
-
|
|
gp->running = 0;
|
|
gem_reset(gp);
|
|
gem_clean_rings(gp);
|
|
@@ -2342,6 +2338,8 @@
|
|
if (!gp->asleep)
|
|
rc = gem_do_start(dev);
|
|
gp->opened = (rc == 0);
|
|
+ if (gp->opened)
|
|
+ napi_enable(&gp->napi);
|
|
|
|
mutex_unlock(&gp->pm_mutex);
|
|
|
|
@@ -2478,6 +2476,8 @@
|
|
|
|
/* Re-attach net device */
|
|
netif_device_attach(dev);
|
|
+
|
|
+ napi_enable(&gp->napi);
|
|
}
|
|
|
|
spin_lock_irqsave(&gp->lock, flags);
|
|
@@ -2998,11 +2998,8 @@
|
|
.ndo_do_ioctl = gem_ioctl,
|
|
.ndo_tx_timeout = gem_tx_timeout,
|
|
.ndo_change_mtu = gem_change_mtu,
|
|
+ .ndo_set_mac_address = eth_mac_addr,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
- .ndo_set_mac_address = gem_set_mac_address,
|
|
-#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
- .ndo_poll_controller = gem_poll_controller,
|
|
-#endif
|
|
};
|
|
|
|
static int __devinit gem_init_one(struct pci_dev *pdev,
|
|
@@ -3164,6 +3161,10 @@
|
|
dev->watchdog_timeo = 5 * HZ;
|
|
dev->irq = pdev->irq;
|
|
dev->dma = 0;
|
|
+ dev->set_mac_address = gem_set_mac_address;
|
|
+#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
+ dev->poll_controller = gem_poll_controller;
|
|
+#endif
|
|
|
|
/* Set that now, in case PM kicks in now */
|
|
pci_set_drvdata(pdev, dev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sungem_phy.c linux-2.6.29-rc3.owrt/drivers/net/sungem_phy.c
|
|
--- linux-2.6.29.owrt/drivers/net/sungem_phy.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sungem_phy.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -79,7 +79,7 @@
|
|
|
|
udelay(100);
|
|
|
|
- while (--limit) {
|
|
+ while (limit--) {
|
|
val = __phy_read(phy, phy_id, MII_BMCR);
|
|
if ((val & BMCR_RESET) == 0)
|
|
break;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sunhme.c linux-2.6.29-rc3.owrt/drivers/net/sunhme.c
|
|
--- linux-2.6.29.owrt/drivers/net/sunhme.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sunhme.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2543,36 +2543,25 @@
|
|
}
|
|
|
|
/* After all quattro cards have been probed, we call these functions
|
|
- * to register the IRQ handlers for the cards that have been
|
|
- * successfully probed and skip the cards that failed to initialize
|
|
+ * to register the IRQ handlers.
|
|
*/
|
|
-static int __init quattro_sbus_register_irqs(void)
|
|
+static void __init quattro_sbus_register_irqs(void)
|
|
{
|
|
struct quattro *qp;
|
|
|
|
for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) {
|
|
struct of_device *op = qp->quattro_dev;
|
|
- int err, qfe_slot, skip = 0;
|
|
-
|
|
- for (qfe_slot = 0; qfe_slot < 4; qfe_slot++) {
|
|
- if (!qp->happy_meals[qfe_slot])
|
|
- skip = 1;
|
|
- }
|
|
- if (skip)
|
|
- continue;
|
|
+ int err;
|
|
|
|
err = request_irq(op->irqs[0],
|
|
quattro_sbus_interrupt,
|
|
IRQF_SHARED, "Quattro",
|
|
qp);
|
|
if (err != 0) {
|
|
- printk(KERN_ERR "Quattro HME: IRQ registration "
|
|
- "error %d.\n", err);
|
|
- return err;
|
|
+ printk(KERN_ERR "Quattro: Fatal IRQ registery error %d.\n", err);
|
|
+ panic("QFE request irq");
|
|
}
|
|
}
|
|
-
|
|
- return 0;
|
|
}
|
|
|
|
static void quattro_sbus_free_irqs(void)
|
|
@@ -2581,14 +2570,6 @@
|
|
|
|
for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) {
|
|
struct of_device *op = qp->quattro_dev;
|
|
- int qfe_slot, skip = 0;
|
|
-
|
|
- for (qfe_slot = 0; qfe_slot < 4; qfe_slot++) {
|
|
- if (!qp->happy_meals[qfe_slot])
|
|
- skip = 1;
|
|
- }
|
|
- if (skip)
|
|
- continue;
|
|
|
|
free_irq(op->irqs[0], qp);
|
|
}
|
|
@@ -2648,12 +2629,6 @@
|
|
int i, qfe_slot = -1;
|
|
int err = -ENODEV;
|
|
|
|
- sbus_dp = to_of_device(op->dev.parent)->node;
|
|
-
|
|
- /* We can match PCI devices too, do not accept those here. */
|
|
- if (strcmp(sbus_dp->name, "sbus"))
|
|
- return err;
|
|
-
|
|
if (is_qfe) {
|
|
qp = quattro_sbus_find(op);
|
|
if (qp == NULL)
|
|
@@ -2759,6 +2734,10 @@
|
|
if (qp != NULL)
|
|
hp->happy_flags |= HFLAG_QUATTRO;
|
|
|
|
+ sbus_dp = to_of_device(op->dev.parent)->node;
|
|
+ if (is_qfe)
|
|
+ sbus_dp = to_of_device(op->dev.parent->parent)->node;
|
|
+
|
|
/* Get the supported DVMA burst sizes from our Happy SBUS. */
|
|
hp->happy_bursts = of_getintprop_default(sbus_dp,
|
|
"burst-sizes", 0x00);
|
|
@@ -2845,9 +2824,6 @@
|
|
if (hp->tcvregs)
|
|
of_iounmap(&op->resource[4], hp->tcvregs, TCVR_REG_SIZE);
|
|
|
|
- if (qp)
|
|
- qp->happy_meals[qfe_slot] = NULL;
|
|
-
|
|
err_out_free_netdev:
|
|
free_netdev(dev);
|
|
|
|
@@ -3305,7 +3281,7 @@
|
|
|
|
err = of_register_driver(&hme_sbus_driver, &of_bus_type);
|
|
if (!err)
|
|
- err = quattro_sbus_register_irqs();
|
|
+ quattro_sbus_register_irqs();
|
|
|
|
return err;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sunlance.c linux-2.6.29-rc3.owrt/drivers/net/sunlance.c
|
|
--- linux-2.6.29.owrt/drivers/net/sunlance.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sunlance.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -343,7 +343,7 @@
|
|
ib->phys_addr [5] = dev->dev_addr [4];
|
|
|
|
/* Setup the Tx ring entries */
|
|
- for (i = 0; i < TX_RING_SIZE; i++) {
|
|
+ for (i = 0; i <= TX_RING_SIZE; i++) {
|
|
leptr = LANCE_ADDR(aib + libbuff_offset(tx_buf, i));
|
|
ib->btx_ring [i].tmd0 = leptr;
|
|
ib->btx_ring [i].tmd1_hadr = leptr >> 16;
|
|
@@ -399,7 +399,7 @@
|
|
sbus_writeb(dev->dev_addr[4], &ib->phys_addr[5]);
|
|
|
|
/* Setup the Tx ring entries */
|
|
- for (i = 0; i < TX_RING_SIZE; i++) {
|
|
+ for (i = 0; i <= TX_RING_SIZE; i++) {
|
|
leptr = libbuff_offset(tx_buf, i);
|
|
sbus_writew(leptr, &ib->btx_ring [i].tmd0);
|
|
sbus_writeb(leptr >> 16,&ib->btx_ring [i].tmd1_hadr);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/sunqe.c linux-2.6.29-rc3.owrt/drivers/net/sunqe.c
|
|
--- linux-2.6.29.owrt/drivers/net/sunqe.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/sunqe.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -227,7 +227,7 @@
|
|
if (!(sbus_readb(mregs + MREGS_PHYCONFIG) & MREGS_PHYCONFIG_LTESTDIS)) {
|
|
int tries = 50;
|
|
|
|
- while (--tries) {
|
|
+ while (tries--) {
|
|
u8 tmp;
|
|
|
|
mdelay(5);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/tg3.c linux-2.6.29-rc3.owrt/drivers/net/tg3.c
|
|
--- linux-2.6.29.owrt/drivers/net/tg3.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/tg3.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -852,7 +852,7 @@
|
|
}
|
|
udelay(10);
|
|
}
|
|
- if (limit < 0)
|
|
+ if (limit <= 0)
|
|
return -EBUSY;
|
|
|
|
return 0;
|
|
@@ -1473,8 +1473,7 @@
|
|
{
|
|
u32 reg;
|
|
|
|
- if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ||
|
|
- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
|
|
+ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
|
|
return;
|
|
|
|
reg = MII_TG3_MISC_SHDW_WREN |
|
|
@@ -1604,7 +1603,7 @@
|
|
break;
|
|
}
|
|
}
|
|
- if (limit < 0)
|
|
+ if (limit <= 0)
|
|
return -EBUSY;
|
|
|
|
return 0;
|
|
@@ -2238,8 +2237,8 @@
|
|
phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask;
|
|
if (phyid != TG3_PHY_ID_BCMAC131) {
|
|
phyid &= TG3_PHY_OUI_MASK;
|
|
- if (phyid == TG3_PHY_OUI_1 ||
|
|
- phyid == TG3_PHY_OUI_2 ||
|
|
+ if (phyid == TG3_PHY_OUI_1 &&
|
|
+ phyid == TG3_PHY_OUI_2 &&
|
|
phyid == TG3_PHY_OUI_3)
|
|
do_low_power = true;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/tokenring/tmspci.c linux-2.6.29-rc3.owrt/drivers/net/tokenring/tmspci.c
|
|
--- linux-2.6.29.owrt/drivers/net/tokenring/tmspci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/tokenring/tmspci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -121,6 +121,11 @@
|
|
goto err_out_trdev;
|
|
}
|
|
|
|
+ ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED,
|
|
+ dev->name, dev);
|
|
+ if (ret)
|
|
+ goto err_out_region;
|
|
+
|
|
dev->base_addr = pci_ioaddr;
|
|
dev->irq = pci_irq_line;
|
|
dev->dma = 0;
|
|
@@ -137,7 +142,7 @@
|
|
ret = tmsdev_init(dev, &pdev->dev);
|
|
if (ret) {
|
|
printk("%s: unable to get memory for dev->priv.\n", dev->name);
|
|
- goto err_out_region;
|
|
+ goto err_out_irq;
|
|
}
|
|
|
|
tp = netdev_priv(dev);
|
|
@@ -152,11 +157,6 @@
|
|
|
|
tp->tmspriv = cardinfo;
|
|
|
|
- ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED,
|
|
- dev->name, dev);
|
|
- if (ret)
|
|
- goto err_out_tmsdev;
|
|
-
|
|
dev->open = tms380tr_open;
|
|
dev->stop = tms380tr_close;
|
|
pci_set_drvdata(pdev, dev);
|
|
@@ -164,15 +164,15 @@
|
|
|
|
ret = register_netdev(dev);
|
|
if (ret)
|
|
- goto err_out_irq;
|
|
+ goto err_out_tmsdev;
|
|
|
|
return 0;
|
|
|
|
-err_out_irq:
|
|
- free_irq(pdev->irq, dev);
|
|
err_out_tmsdev:
|
|
pci_set_drvdata(pdev, NULL);
|
|
tmsdev_term(dev);
|
|
+err_out_irq:
|
|
+ free_irq(pdev->irq, dev);
|
|
err_out_region:
|
|
release_region(pci_ioaddr, TMS_PCI_IO_EXTENT);
|
|
err_out_trdev:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/tsi108_eth.c linux-2.6.29-rc3.owrt/drivers/net/tsi108_eth.c
|
|
--- linux-2.6.29.owrt/drivers/net/tsi108_eth.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/tsi108_eth.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1237,7 +1237,7 @@
|
|
spin_lock_irqsave(&phy_lock, flags);
|
|
|
|
tsi108_write_mii(data, MII_BMCR, BMCR_RESET);
|
|
- while (--i) {
|
|
+ while (i--){
|
|
if(!(tsi108_read_mii(data, MII_BMCR) & BMCR_RESET))
|
|
break;
|
|
udelay(10);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/tulip/21142.c linux-2.6.29-rc3.owrt/drivers/net/tulip/21142.c
|
|
--- linux-2.6.29.owrt/drivers/net/tulip/21142.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/tulip/21142.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -9,11 +9,6 @@
|
|
|
|
Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
|
|
for more information on this driver.
|
|
-
|
|
- DC21143 manual "21143 PCI/CardBus 10/100Mb/s Ethernet LAN Controller
|
|
- Hardware Reference Manual" is currently available at :
|
|
- http://developer.intel.com/design/network/manuals/278074.htm
|
|
-
|
|
Please submit bugs to http://bugzilla.kernel.org/ .
|
|
*/
|
|
|
|
@@ -37,11 +32,7 @@
|
|
int csr12 = ioread32(ioaddr + CSR12);
|
|
int next_tick = 60*HZ;
|
|
int new_csr6 = 0;
|
|
- int csr14 = ioread32(ioaddr + CSR14);
|
|
|
|
- /* CSR12[LS10,LS100] are not reliable during autonegotiation */
|
|
- if ((csr14 & 0x80) && (csr12 & 0x7000) != 0x5000)
|
|
- csr12 |= 6;
|
|
if (tulip_debug > 2)
|
|
printk(KERN_INFO"%s: 21143 negotiation status %8.8x, %s.\n",
|
|
dev->name, csr12, medianame[dev->if_port]);
|
|
@@ -85,7 +76,7 @@
|
|
new_csr6 = 0x83860000;
|
|
dev->if_port = 3;
|
|
iowrite32(0, ioaddr + CSR13);
|
|
- iowrite32(0x0003FFFF, ioaddr + CSR14);
|
|
+ iowrite32(0x0003FF7F, ioaddr + CSR14);
|
|
iowrite16(8, ioaddr + CSR15);
|
|
iowrite32(1, ioaddr + CSR13);
|
|
}
|
|
@@ -141,14 +132,10 @@
|
|
struct tulip_private *tp = netdev_priv(dev);
|
|
void __iomem *ioaddr = tp->base_addr;
|
|
int csr12 = ioread32(ioaddr + CSR12);
|
|
- int csr14 = ioread32(ioaddr + CSR14);
|
|
|
|
- /* CSR12[LS10,LS100] are not reliable during autonegotiation */
|
|
- if ((csr14 & 0x80) && (csr12 & 0x7000) != 0x5000)
|
|
- csr12 |= 6;
|
|
if (tulip_debug > 1)
|
|
printk(KERN_INFO"%s: 21143 link status interrupt %8.8x, CSR5 %x, "
|
|
- "%8.8x.\n", dev->name, csr12, csr5, csr14);
|
|
+ "%8.8x.\n", dev->name, csr12, csr5, ioread32(ioaddr + CSR14));
|
|
|
|
/* If NWay finished and we have a negotiated partner capability. */
|
|
if (tp->nway && !tp->nwayset && (csr12 & 0x7000) == 0x5000) {
|
|
@@ -156,9 +143,7 @@
|
|
int negotiated = tp->sym_advertise & (csr12 >> 16);
|
|
tp->lpar = csr12 >> 16;
|
|
tp->nwayset = 1;
|
|
- /* If partner cannot negotiate, it is 10Mbps Half Duplex */
|
|
- if (!(csr12 & 0x8000)) dev->if_port = 0;
|
|
- else if (negotiated & 0x0100) dev->if_port = 5;
|
|
+ if (negotiated & 0x0100) dev->if_port = 5;
|
|
else if (negotiated & 0x0080) dev->if_port = 3;
|
|
else if (negotiated & 0x0040) dev->if_port = 4;
|
|
else if (negotiated & 0x0020) dev->if_port = 0;
|
|
@@ -229,7 +214,7 @@
|
|
tp->timer.expires = RUN_AT(3*HZ);
|
|
add_timer(&tp->timer);
|
|
} else if (dev->if_port == 5)
|
|
- iowrite32(csr14 & ~0x080, ioaddr + CSR14);
|
|
+ iowrite32(ioread32(ioaddr + CSR14) & ~0x080, ioaddr + CSR14);
|
|
} else if (dev->if_port == 0 || dev->if_port == 4) {
|
|
if ((csr12 & 4) == 0)
|
|
printk(KERN_INFO"%s: 21143 10baseT link beat good.\n",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/tulip/de2104x.c linux-2.6.29-rc3.owrt/drivers/net/tulip/de2104x.c
|
|
--- linux-2.6.29.owrt/drivers/net/tulip/de2104x.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/tulip/de2104x.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -392,7 +392,7 @@
|
|
unsigned drop = 0;
|
|
int rc;
|
|
|
|
- while (--rx_work) {
|
|
+ while (rx_work--) {
|
|
u32 status, len;
|
|
dma_addr_t mapping;
|
|
struct sk_buff *skb, *copy_skb;
|
|
@@ -464,14 +464,13 @@
|
|
drop = 1;
|
|
|
|
rx_next:
|
|
+ de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
|
|
if (rx_tail == (DE_RX_RING_SIZE - 1))
|
|
de->rx_ring[rx_tail].opts2 =
|
|
cpu_to_le32(RingEnd | de->rx_buf_sz);
|
|
else
|
|
de->rx_ring[rx_tail].opts2 = cpu_to_le32(de->rx_buf_sz);
|
|
de->rx_ring[rx_tail].addr1 = cpu_to_le32(mapping);
|
|
- wmb();
|
|
- de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
|
|
rx_tail = NEXT_RX(rx_tail);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/tulip/tulip_core.c linux-2.6.29-rc3.owrt/drivers/net/tulip/tulip_core.c
|
|
--- linux-2.6.29.owrt/drivers/net/tulip/tulip_core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/tulip/tulip_core.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -255,7 +255,6 @@
|
|
|
|
static void tulip_tx_timeout(struct net_device *dev);
|
|
static void tulip_init_ring(struct net_device *dev);
|
|
-static void tulip_free_ring(struct net_device *dev);
|
|
static int tulip_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
|
static int tulip_open(struct net_device *dev);
|
|
static int tulip_close(struct net_device *dev);
|
|
@@ -503,21 +502,16 @@
|
|
{
|
|
int retval;
|
|
|
|
- tulip_init_ring (dev);
|
|
+ if ((retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev)))
|
|
+ return retval;
|
|
|
|
- retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev);
|
|
- if (retval)
|
|
- goto free_ring;
|
|
+ tulip_init_ring (dev);
|
|
|
|
tulip_up (dev);
|
|
|
|
netif_start_queue (dev);
|
|
|
|
return 0;
|
|
-
|
|
-free_ring:
|
|
- tulip_free_ring (dev);
|
|
- return retval;
|
|
}
|
|
|
|
|
|
@@ -774,11 +768,23 @@
|
|
tulip_set_power_state (tp, 0, 1);
|
|
}
|
|
|
|
-static void tulip_free_ring (struct net_device *dev)
|
|
+
|
|
+static int tulip_close (struct net_device *dev)
|
|
{
|
|
struct tulip_private *tp = netdev_priv(dev);
|
|
+ void __iomem *ioaddr = tp->base_addr;
|
|
int i;
|
|
|
|
+ netif_stop_queue (dev);
|
|
+
|
|
+ tulip_down (dev);
|
|
+
|
|
+ if (tulip_debug > 1)
|
|
+ printk (KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
|
|
+ dev->name, ioread32 (ioaddr + CSR5));
|
|
+
|
|
+ free_irq (dev->irq, dev);
|
|
+
|
|
/* Free all the skbuffs in the Rx queue. */
|
|
for (i = 0; i < RX_RING_SIZE; i++) {
|
|
struct sk_buff *skb = tp->rx_buffers[i].skb;
|
|
@@ -797,7 +803,6 @@
|
|
dev_kfree_skb (skb);
|
|
}
|
|
}
|
|
-
|
|
for (i = 0; i < TX_RING_SIZE; i++) {
|
|
struct sk_buff *skb = tp->tx_buffers[i].skb;
|
|
|
|
@@ -809,24 +814,6 @@
|
|
tp->tx_buffers[i].skb = NULL;
|
|
tp->tx_buffers[i].mapping = 0;
|
|
}
|
|
-}
|
|
-
|
|
-static int tulip_close (struct net_device *dev)
|
|
-{
|
|
- struct tulip_private *tp = netdev_priv(dev);
|
|
- void __iomem *ioaddr = tp->base_addr;
|
|
-
|
|
- netif_stop_queue (dev);
|
|
-
|
|
- tulip_down (dev);
|
|
-
|
|
- if (tulip_debug > 1)
|
|
- printk (KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
|
|
- dev->name, ioread32 (ioaddr + CSR5));
|
|
-
|
|
- free_irq (dev->irq, dev);
|
|
-
|
|
- tulip_free_ring (dev);
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/tun.c linux-2.6.29-rc3.owrt/drivers/net/tun.c
|
|
--- linux-2.6.29.owrt/drivers/net/tun.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/tun.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -157,16 +157,10 @@
|
|
|
|
nexact = n;
|
|
|
|
- /* Remaining multicast addresses are hashed,
|
|
- * unicast will leave the filter disabled. */
|
|
+ /* The rest is hashed */
|
|
memset(filter->mask, 0, sizeof(filter->mask));
|
|
- for (; n < uf.count; n++) {
|
|
- if (!is_multicast_ether_addr(addr[n].u)) {
|
|
- err = 0; /* no filter */
|
|
- goto done;
|
|
- }
|
|
+ for (; n < uf.count; n++)
|
|
addr_hash_set(filter->mask, addr[n].u);
|
|
- }
|
|
|
|
/* For ALLMULTI just set the mask to all ones.
|
|
* This overrides the mask populated above. */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/ucc_geth.c linux-2.6.29-rc3.owrt/drivers/net/ucc_geth.c
|
|
--- linux-2.6.29.owrt/drivers/net/ucc_geth.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/ucc_geth.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1536,15 +1536,17 @@
|
|
static int init_phy(struct net_device *dev)
|
|
{
|
|
struct ucc_geth_private *priv = netdev_priv(dev);
|
|
- struct ucc_geth_info *ug_info = priv->ug_info;
|
|
struct phy_device *phydev;
|
|
+ char phy_id[BUS_ID_SIZE];
|
|
|
|
priv->oldlink = 0;
|
|
priv->oldspeed = 0;
|
|
priv->oldduplex = -1;
|
|
|
|
- phydev = phy_connect(dev, ug_info->phy_bus_id, &adjust_link, 0,
|
|
- priv->phy_interface);
|
|
+ snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, priv->ug_info->mdio_bus,
|
|
+ priv->ug_info->phy_address);
|
|
+
|
|
+ phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface);
|
|
|
|
if (IS_ERR(phydev)) {
|
|
printk("%s: Could not attach to PHY\n", dev->name);
|
|
@@ -3612,12 +3614,10 @@
|
|
ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
|
|
fixed_link = of_get_property(np, "fixed-link", NULL);
|
|
if (fixed_link) {
|
|
- snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id),
|
|
- PHY_ID_FMT, "0", fixed_link[0]);
|
|
+ snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "0");
|
|
+ ug_info->phy_address = fixed_link[0];
|
|
phy = NULL;
|
|
} else {
|
|
- char bus_name[MII_BUS_ID_SIZE];
|
|
-
|
|
ph = of_get_property(np, "phy-handle", NULL);
|
|
phy = of_find_node_by_phandle(*ph);
|
|
|
|
@@ -3628,6 +3628,7 @@
|
|
prop = of_get_property(phy, "reg", NULL);
|
|
if (prop == NULL)
|
|
return -1;
|
|
+ ug_info->phy_address = *prop;
|
|
|
|
/* Set the bus id */
|
|
mdio = of_get_parent(phy);
|
|
@@ -3641,9 +3642,7 @@
|
|
if (err)
|
|
return -1;
|
|
|
|
- uec_mdio_bus_name(bus_name, mdio);
|
|
- snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id),
|
|
- "%s:%02x", bus_name, *prop);
|
|
+ snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "%x", res.start);
|
|
}
|
|
|
|
/* get the phy interface type, or default to MII */
|
|
@@ -3749,7 +3748,6 @@
|
|
|
|
ugeth->ug_info = ug_info;
|
|
ugeth->dev = dev;
|
|
- ugeth->node = np;
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/ucc_geth.h linux-2.6.29-rc3.owrt/drivers/net/ucc_geth.h
|
|
--- linux-2.6.29.owrt/drivers/net/ucc_geth.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/ucc_geth.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1091,7 +1091,8 @@
|
|
u32 eventRegMask;
|
|
u16 pausePeriod;
|
|
u16 extensionField;
|
|
- char phy_bus_id[BUS_ID_SIZE];
|
|
+ u8 phy_address;
|
|
+ char mdio_bus[MII_BUS_ID_SIZE];
|
|
u8 weightfactor[NUM_TX_QUEUES];
|
|
u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES];
|
|
u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX];
|
|
@@ -1185,8 +1186,6 @@
|
|
int oldspeed;
|
|
int oldduplex;
|
|
int oldlink;
|
|
-
|
|
- struct device_node *node;
|
|
};
|
|
|
|
void uec_set_ethtool_ops(struct net_device *netdev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/ucc_geth_mii.c linux-2.6.29-rc3.owrt/drivers/net/ucc_geth_mii.c
|
|
--- linux-2.6.29.owrt/drivers/net/ucc_geth_mii.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/ucc_geth_mii.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -107,7 +107,7 @@
|
|
static int uec_mdio_reset(struct mii_bus *bus)
|
|
{
|
|
struct ucc_mii_mng __iomem *regs = (void __iomem *)bus->priv;
|
|
- int timeout = PHY_INIT_TIMEOUT;
|
|
+ unsigned int timeout = PHY_INIT_TIMEOUT;
|
|
|
|
mutex_lock(&bus->mdio_lock);
|
|
|
|
@@ -123,7 +123,7 @@
|
|
|
|
mutex_unlock(&bus->mdio_lock);
|
|
|
|
- if (timeout < 0) {
|
|
+ if (timeout <= 0) {
|
|
printk(KERN_ERR "%s: The MII Bus is stuck!\n", bus->name);
|
|
return -EBUSY;
|
|
}
|
|
@@ -156,7 +156,7 @@
|
|
if (err)
|
|
goto reg_map_fail;
|
|
|
|
- uec_mdio_bus_name(new_bus->id, np);
|
|
+ snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", res.start);
|
|
|
|
new_bus->irq = kmalloc(32 * sizeof(int), GFP_KERNEL);
|
|
|
|
@@ -283,13 +283,3 @@
|
|
{
|
|
of_unregister_platform_driver(&uec_mdio_driver);
|
|
}
|
|
-
|
|
-void uec_mdio_bus_name(char *name, struct device_node *np)
|
|
-{
|
|
- const u32 *reg;
|
|
-
|
|
- reg = of_get_property(np, "reg", NULL);
|
|
-
|
|
- snprintf(name, MII_BUS_ID_SIZE, "%s@%x", np->name, reg ? *reg : 0);
|
|
-}
|
|
-
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/ucc_geth_mii.h linux-2.6.29-rc3.owrt/drivers/net/ucc_geth_mii.h
|
|
--- linux-2.6.29.owrt/drivers/net/ucc_geth_mii.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/ucc_geth_mii.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -97,5 +97,4 @@
|
|
int uec_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value);
|
|
int __init uec_mdio_init(void);
|
|
void uec_mdio_exit(void);
|
|
-void uec_mdio_bus_name(char *name, struct device_node *np);
|
|
#endif /* __UEC_MII_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/usb/asix.c linux-2.6.29-rc3.owrt/drivers/net/usb/asix.c
|
|
--- linux-2.6.29.owrt/drivers/net/usb/asix.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/usb/asix.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1451,14 +1451,6 @@
|
|
// Cables-to-Go USB Ethernet Adapter
|
|
USB_DEVICE(0x0b95, 0x772a),
|
|
.driver_info = (unsigned long) &ax88772_info,
|
|
-}, {
|
|
- // ABOCOM for pci
|
|
- USB_DEVICE(0x14ea, 0xab11),
|
|
- .driver_info = (unsigned long) &ax88178_info,
|
|
-}, {
|
|
- // ASIX 88772a
|
|
- USB_DEVICE(0x0db0, 0xa877),
|
|
- .driver_info = (unsigned long) &ax88772_info,
|
|
},
|
|
{ }, // END
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/usb/cdc_ether.c linux-2.6.29-rc3.owrt/drivers/net/usb/cdc_ether.c
|
|
--- linux-2.6.29.owrt/drivers/net/usb/cdc_ether.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/usb/cdc_ether.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -559,11 +559,6 @@
|
|
USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
|
|
USB_CDC_PROTO_NONE),
|
|
.driver_info = (unsigned long) &cdc_info,
|
|
-}, {
|
|
- /* Ericsson F3507g */
|
|
- USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM,
|
|
- USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
- .driver_info = (unsigned long) &cdc_info,
|
|
},
|
|
{ }, // END
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/usb/dm9601.c linux-2.6.29-rc3.owrt/drivers/net/usb/dm9601.c
|
|
--- linux-2.6.29.owrt/drivers/net/usb/dm9601.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/usb/dm9601.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -635,10 +635,6 @@
|
|
USB_DEVICE(0x0a47, 0x9601), /* Hirose USB-100 */
|
|
.driver_info = (unsigned long)&dm9601_info,
|
|
},
|
|
- {
|
|
- USB_DEVICE(0x0fe6, 0x8101), /* DM9601 USB to Fast Ethernet Adapter */
|
|
- .driver_info = (unsigned long)&dm9601_info,
|
|
- },
|
|
{}, // END
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/usb/hso.c linux-2.6.29-rc3.owrt/drivers/net/usb/hso.c
|
|
--- linux-2.6.29.owrt/drivers/net/usb/hso.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/usb/hso.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -455,7 +455,6 @@
|
|
{icon321_port_device(0x0af0, 0xd033)}, /* Icon-322 */
|
|
{USB_DEVICE(0x0af0, 0x7301)}, /* GE40x */
|
|
{USB_DEVICE(0x0af0, 0x7361)}, /* GE40x */
|
|
- {USB_DEVICE(0x0af0, 0x7381)}, /* GE40x */
|
|
{USB_DEVICE(0x0af0, 0x7401)}, /* GI 0401 */
|
|
{USB_DEVICE(0x0af0, 0x7501)}, /* GTM 382 */
|
|
{USB_DEVICE(0x0af0, 0x7601)}, /* GE40x */
|
|
@@ -463,8 +462,7 @@
|
|
{USB_DEVICE(0x0af0, 0x7801)},
|
|
{USB_DEVICE(0x0af0, 0x7901)},
|
|
{USB_DEVICE(0x0af0, 0x7361)},
|
|
- {USB_DEVICE(0x0af0, 0xd057)},
|
|
- {USB_DEVICE(0x0af0, 0xd055)},
|
|
+ {icon321_port_device(0x0af0, 0xd051)},
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(usb, hso_ids);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/usb/usbnet.c linux-2.6.29-rc3.owrt/drivers/net/usb/usbnet.c
|
|
--- linux-2.6.29.owrt/drivers/net/usb/usbnet.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/usb/usbnet.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -723,8 +723,8 @@
|
|
if (dev->mii.mdio_read)
|
|
return mii_link_ok(&dev->mii);
|
|
|
|
- /* Otherwise, dtrt for drivers calling netif_carrier_{on,off} */
|
|
- return ethtool_op_get_link(net);
|
|
+ /* Otherwise, say we're up (to avoid breaking scripts) */
|
|
+ return 1;
|
|
}
|
|
EXPORT_SYMBOL_GPL(usbnet_get_link);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/usb/zaurus.c linux-2.6.29-rc3.owrt/drivers/net/usb/zaurus.c
|
|
--- linux-2.6.29.owrt/drivers/net/usb/zaurus.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/usb/zaurus.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -341,11 +341,6 @@
|
|
USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
|
|
USB_CDC_PROTO_NONE),
|
|
.driver_info = (unsigned long) &bogus_mdlm_info,
|
|
-}, {
|
|
- /* Motorola MOTOMAGX phones */
|
|
- USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM,
|
|
- USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
|
|
- .driver_info = (unsigned long) &bogus_mdlm_info,
|
|
},
|
|
|
|
/* Olympus has some models with a Zaurus-compatible option.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/veth.c linux-2.6.29-rc3.owrt/drivers/net/veth.c
|
|
--- linux-2.6.29.owrt/drivers/net/veth.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/veth.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -239,16 +239,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-static int veth_close(struct net_device *dev)
|
|
-{
|
|
- struct veth_priv *priv = netdev_priv(dev);
|
|
-
|
|
- netif_carrier_off(dev);
|
|
- netif_carrier_off(priv->peer);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
static int veth_dev_init(struct net_device *dev)
|
|
{
|
|
struct veth_net_stats *stats;
|
|
@@ -273,12 +263,10 @@
|
|
}
|
|
|
|
static const struct net_device_ops veth_netdev_ops = {
|
|
- .ndo_init = veth_dev_init,
|
|
- .ndo_open = veth_open,
|
|
- .ndo_stop = veth_close,
|
|
- .ndo_start_xmit = veth_xmit,
|
|
- .ndo_get_stats = veth_get_stats,
|
|
- .ndo_set_mac_address = eth_mac_addr,
|
|
+ .ndo_init = veth_dev_init,
|
|
+ .ndo_open = veth_open,
|
|
+ .ndo_start_xmit = veth_xmit,
|
|
+ .ndo_get_stats = veth_get_stats,
|
|
};
|
|
|
|
static void veth_setup(struct net_device *dev)
|
|
@@ -291,6 +279,44 @@
|
|
dev->destructor = veth_dev_free;
|
|
}
|
|
|
|
+static void veth_change_state(struct net_device *dev)
|
|
+{
|
|
+ struct net_device *peer;
|
|
+ struct veth_priv *priv;
|
|
+
|
|
+ priv = netdev_priv(dev);
|
|
+ peer = priv->peer;
|
|
+
|
|
+ if (netif_carrier_ok(peer)) {
|
|
+ if (!netif_carrier_ok(dev))
|
|
+ netif_carrier_on(dev);
|
|
+ } else {
|
|
+ if (netif_carrier_ok(dev))
|
|
+ netif_carrier_off(dev);
|
|
+ }
|
|
+}
|
|
+
|
|
+static int veth_device_event(struct notifier_block *unused,
|
|
+ unsigned long event, void *ptr)
|
|
+{
|
|
+ struct net_device *dev = ptr;
|
|
+
|
|
+ if (dev->netdev_ops->ndo_open != veth_open)
|
|
+ goto out;
|
|
+
|
|
+ switch (event) {
|
|
+ case NETDEV_CHANGE:
|
|
+ veth_change_state(dev);
|
|
+ break;
|
|
+ }
|
|
+out:
|
|
+ return NOTIFY_DONE;
|
|
+}
|
|
+
|
|
+static struct notifier_block veth_notifier_block __read_mostly = {
|
|
+ .notifier_call = veth_device_event,
|
|
+};
|
|
+
|
|
/*
|
|
* netlink interface
|
|
*/
|
|
@@ -441,12 +467,14 @@
|
|
|
|
static __init int veth_init(void)
|
|
{
|
|
+ register_netdevice_notifier(&veth_notifier_block);
|
|
return rtnl_link_register(&veth_link_ops);
|
|
}
|
|
|
|
static __exit void veth_exit(void)
|
|
{
|
|
rtnl_link_unregister(&veth_link_ops);
|
|
+ unregister_netdevice_notifier(&veth_notifier_block);
|
|
}
|
|
|
|
module_init(veth_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/via-velocity.c linux-2.6.29-rc3.owrt/drivers/net/via-velocity.c
|
|
--- linux-2.6.29.owrt/drivers/net/via-velocity.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/via-velocity.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1838,19 +1838,17 @@
|
|
{
|
|
struct sk_buff *skb = tdinfo->skb;
|
|
int i;
|
|
- int pktlen;
|
|
|
|
/*
|
|
* Don't unmap the pre-allocated tx_bufs
|
|
*/
|
|
if (tdinfo->skb_dma) {
|
|
|
|
- pktlen = (skb->len > ETH_ZLEN ? : ETH_ZLEN);
|
|
for (i = 0; i < tdinfo->nskb_dma; i++) {
|
|
#ifdef VELOCITY_ZERO_COPY_SUPPORT
|
|
pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], le16_to_cpu(td->tdesc1.len), PCI_DMA_TODEVICE);
|
|
#else
|
|
- pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], pktlen, PCI_DMA_TODEVICE);
|
|
+ pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], skb->len, PCI_DMA_TODEVICE);
|
|
#endif
|
|
tdinfo->skb_dma[i] = 0;
|
|
}
|
|
@@ -2082,14 +2080,17 @@
|
|
struct tx_desc *td_ptr;
|
|
struct velocity_td_info *tdinfo;
|
|
unsigned long flags;
|
|
- int pktlen;
|
|
+ int pktlen = skb->len;
|
|
__le16 len;
|
|
int index;
|
|
|
|
|
|
- if (skb_padto(skb, ETH_ZLEN))
|
|
- goto out;
|
|
- pktlen = max_t(unsigned int, skb->len, ETH_ZLEN);
|
|
+
|
|
+ if (skb->len < ETH_ZLEN) {
|
|
+ if (skb_padto(skb, ETH_ZLEN))
|
|
+ goto out;
|
|
+ pktlen = ETH_ZLEN;
|
|
+ }
|
|
|
|
len = cpu_to_le16(pktlen);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/virtio_net.c linux-2.6.29-rc3.owrt/drivers/net/virtio_net.c
|
|
--- linux-2.6.29.owrt/drivers/net/virtio_net.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/virtio_net.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -287,7 +287,7 @@
|
|
skb_put(skb, MAX_PACKET_LEN);
|
|
|
|
hdr = skb_vnet_hdr(skb);
|
|
- sg_set_buf(sg, hdr, sizeof(*hdr));
|
|
+ sg_init_one(sg, hdr, sizeof(*hdr));
|
|
|
|
if (vi->big_packets) {
|
|
for (i = 0; i < MAX_SKB_FRAGS; i++) {
|
|
@@ -488,9 +488,9 @@
|
|
|
|
/* Encode metadata header at front. */
|
|
if (vi->mergeable_rx_bufs)
|
|
- sg_set_buf(sg, mhdr, sizeof(*mhdr));
|
|
+ sg_init_one(sg, mhdr, sizeof(*mhdr));
|
|
else
|
|
- sg_set_buf(sg, hdr, sizeof(*hdr));
|
|
+ sg_init_one(sg, hdr, sizeof(*hdr));
|
|
|
|
num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1;
|
|
|
|
@@ -612,7 +612,6 @@
|
|
.set_tx_csum = virtnet_set_tx_csum,
|
|
.set_sg = ethtool_op_set_sg,
|
|
.set_tso = ethtool_op_set_tso,
|
|
- .get_link = ethtool_op_get_link,
|
|
};
|
|
|
|
#define MIN_MTU 68
|
|
@@ -740,8 +739,6 @@
|
|
goto unregister;
|
|
}
|
|
|
|
- netif_carrier_on(dev);
|
|
-
|
|
pr_debug("virtnet: registered device %s\n", dev->name);
|
|
return 0;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wimax/i2400m/debugfs.c linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/debugfs.c
|
|
--- linux-2.6.29.owrt/drivers/net/wimax/i2400m/debugfs.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/debugfs.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -234,6 +234,20 @@
|
|
&fops_i2400m_reset);
|
|
}
|
|
|
|
+/*
|
|
+ * Debug levels control; see debug.h
|
|
+ */
|
|
+struct d_level D_LEVEL[] = {
|
|
+ D_SUBMODULE_DEFINE(control),
|
|
+ D_SUBMODULE_DEFINE(driver),
|
|
+ D_SUBMODULE_DEFINE(debugfs),
|
|
+ D_SUBMODULE_DEFINE(fw),
|
|
+ D_SUBMODULE_DEFINE(netdev),
|
|
+ D_SUBMODULE_DEFINE(rfkill),
|
|
+ D_SUBMODULE_DEFINE(rx),
|
|
+ D_SUBMODULE_DEFINE(tx),
|
|
+};
|
|
+size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
|
|
|
|
#define __debugfs_register(prefix, name, parent) \
|
|
do { \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wimax/i2400m/driver.c linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/driver.c
|
|
--- linux-2.6.29.owrt/drivers/net/wimax/i2400m/driver.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/driver.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -707,22 +707,6 @@
|
|
EXPORT_SYMBOL_GPL(i2400m_release);
|
|
|
|
|
|
-/*
|
|
- * Debug levels control; see debug.h
|
|
- */
|
|
-struct d_level D_LEVEL[] = {
|
|
- D_SUBMODULE_DEFINE(control),
|
|
- D_SUBMODULE_DEFINE(driver),
|
|
- D_SUBMODULE_DEFINE(debugfs),
|
|
- D_SUBMODULE_DEFINE(fw),
|
|
- D_SUBMODULE_DEFINE(netdev),
|
|
- D_SUBMODULE_DEFINE(rfkill),
|
|
- D_SUBMODULE_DEFINE(rx),
|
|
- D_SUBMODULE_DEFINE(tx),
|
|
-};
|
|
-size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
|
|
-
|
|
-
|
|
static
|
|
int __init i2400m_driver_init(void)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wimax/i2400m/i2400m.h linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/i2400m.h
|
|
--- linux-2.6.29.owrt/drivers/net/wimax/i2400m/i2400m.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/i2400m.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -157,7 +157,7 @@
|
|
|
|
|
|
/* Firmware version we request when pulling the fw image file */
|
|
-#define I2400M_FW_VERSION "1.4"
|
|
+#define I2400M_FW_VERSION "1.3"
|
|
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/ath5k/base.c linux-2.6.29-rc3.owrt/drivers/net/wireless/ath5k/base.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/ath5k/base.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath5k/base.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1028,8 +1028,6 @@
|
|
* it's done by reseting the chip. To accomplish this we must
|
|
* first cleanup any pending DMA, then restart stuff after a la
|
|
* ath5k_init.
|
|
- *
|
|
- * Called with sc->lock.
|
|
*/
|
|
static int
|
|
ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan)
|
|
@@ -1098,42 +1096,6 @@
|
|
* Buffers setup *
|
|
\***************/
|
|
|
|
-static
|
|
-struct sk_buff *ath5k_rx_skb_alloc(struct ath5k_softc *sc, dma_addr_t *skb_addr)
|
|
-{
|
|
- struct sk_buff *skb;
|
|
- unsigned int off;
|
|
-
|
|
- /*
|
|
- * Allocate buffer with headroom_needed space for the
|
|
- * fake physical layer header at the start.
|
|
- */
|
|
- skb = dev_alloc_skb(sc->rxbufsize + sc->cachelsz - 1);
|
|
-
|
|
- if (!skb) {
|
|
- ATH5K_ERR(sc, "can't alloc skbuff of size %u\n",
|
|
- sc->rxbufsize + sc->cachelsz - 1);
|
|
- return NULL;
|
|
- }
|
|
- /*
|
|
- * Cache-line-align. This is important (for the
|
|
- * 5210 at least) as not doing so causes bogus data
|
|
- * in rx'd frames.
|
|
- */
|
|
- off = ((unsigned long)skb->data) % sc->cachelsz;
|
|
- if (off != 0)
|
|
- skb_reserve(skb, sc->cachelsz - off);
|
|
-
|
|
- *skb_addr = pci_map_single(sc->pdev,
|
|
- skb->data, sc->rxbufsize, PCI_DMA_FROMDEVICE);
|
|
- if (unlikely(pci_dma_mapping_error(sc->pdev, *skb_addr))) {
|
|
- ATH5K_ERR(sc, "%s: DMA mapping failed\n", __func__);
|
|
- dev_kfree_skb(skb);
|
|
- return NULL;
|
|
- }
|
|
- return skb;
|
|
-}
|
|
-
|
|
static int
|
|
ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|
{
|
|
@@ -1141,11 +1103,37 @@
|
|
struct sk_buff *skb = bf->skb;
|
|
struct ath5k_desc *ds;
|
|
|
|
- if (!skb) {
|
|
- skb = ath5k_rx_skb_alloc(sc, &bf->skbaddr);
|
|
- if (!skb)
|
|
+ if (likely(skb == NULL)) {
|
|
+ unsigned int off;
|
|
+
|
|
+ /*
|
|
+ * Allocate buffer with headroom_needed space for the
|
|
+ * fake physical layer header at the start.
|
|
+ */
|
|
+ skb = dev_alloc_skb(sc->rxbufsize + sc->cachelsz - 1);
|
|
+ if (unlikely(skb == NULL)) {
|
|
+ ATH5K_ERR(sc, "can't alloc skbuff of size %u\n",
|
|
+ sc->rxbufsize + sc->cachelsz - 1);
|
|
return -ENOMEM;
|
|
+ }
|
|
+ /*
|
|
+ * Cache-line-align. This is important (for the
|
|
+ * 5210 at least) as not doing so causes bogus data
|
|
+ * in rx'd frames.
|
|
+ */
|
|
+ off = ((unsigned long)skb->data) % sc->cachelsz;
|
|
+ if (off != 0)
|
|
+ skb_reserve(skb, sc->cachelsz - off);
|
|
+
|
|
bf->skb = skb;
|
|
+ bf->skbaddr = pci_map_single(sc->pdev,
|
|
+ skb->data, sc->rxbufsize, PCI_DMA_FROMDEVICE);
|
|
+ if (unlikely(pci_dma_mapping_error(sc->pdev, bf->skbaddr))) {
|
|
+ ATH5K_ERR(sc, "%s: DMA mapping failed\n", __func__);
|
|
+ dev_kfree_skb(skb);
|
|
+ bf->skb = NULL;
|
|
+ return -ENOMEM;
|
|
+ }
|
|
}
|
|
|
|
/*
|
|
@@ -1674,8 +1662,7 @@
|
|
{
|
|
struct ieee80211_rx_status rxs = {};
|
|
struct ath5k_rx_status rs = {};
|
|
- struct sk_buff *skb, *next_skb;
|
|
- dma_addr_t next_skb_addr;
|
|
+ struct sk_buff *skb;
|
|
struct ath5k_softc *sc = (void *)data;
|
|
struct ath5k_buf *bf, *bf_last;
|
|
struct ath5k_desc *ds;
|
|
@@ -1760,17 +1747,10 @@
|
|
goto next;
|
|
}
|
|
accept:
|
|
- next_skb = ath5k_rx_skb_alloc(sc, &next_skb_addr);
|
|
-
|
|
- /*
|
|
- * If we can't replace bf->skb with a new skb under memory
|
|
- * pressure, just skip this packet
|
|
- */
|
|
- if (!next_skb)
|
|
- goto next;
|
|
-
|
|
pci_unmap_single(sc->pdev, bf->skbaddr, sc->rxbufsize,
|
|
PCI_DMA_FROMDEVICE);
|
|
+ bf->skb = NULL;
|
|
+
|
|
skb_put(skb, rs.rs_datalen);
|
|
|
|
/* The MAC header is padded to have 32-bit boundary if the
|
|
@@ -1843,9 +1823,6 @@
|
|
ath5k_check_ibss_tsf(sc, skb, &rxs);
|
|
|
|
__ieee80211_rx(sc->hw, skb, &rxs);
|
|
-
|
|
- bf->skb = next_skb;
|
|
- bf->skbaddr = next_skb_addr;
|
|
next:
|
|
list_move_tail(&bf->list, &sc->rxbuf);
|
|
} while (ath5k_rxbuf_setup(sc, bf) == 0);
|
|
@@ -2837,17 +2814,11 @@
|
|
{
|
|
struct ath5k_softc *sc = hw->priv;
|
|
struct ieee80211_conf *conf = &hw->conf;
|
|
- int ret;
|
|
-
|
|
- mutex_lock(&sc->lock);
|
|
|
|
sc->bintval = conf->beacon_int;
|
|
sc->power_level = conf->power_level;
|
|
|
|
- ret = ath5k_chan_set(sc, conf->channel);
|
|
-
|
|
- mutex_unlock(&sc->lock);
|
|
- return ret;
|
|
+ return ath5k_chan_set(sc, conf->channel);
|
|
}
|
|
|
|
static int
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/ath9k/ath9k.h linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/ath9k.h
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/ath9k/ath9k.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/ath9k.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -587,8 +587,8 @@
|
|
u8 iso[3];
|
|
};
|
|
|
|
-#define REG_WRITE(_ah, _reg, _val) ath9k_iowrite32((_ah), (_reg), (_val))
|
|
-#define REG_READ(_ah, _reg) ath9k_ioread32((_ah), (_reg))
|
|
+#define REG_WRITE(_ah, _reg, _val) iowrite32(_val, _ah->ah_sh + _reg)
|
|
+#define REG_READ(_ah, _reg) ioread32(_ah->ah_sh + _reg)
|
|
|
|
#define SM(_v, _f) (((_v) << _f##_S) & _f)
|
|
#define MS(_v, _f) (((_v) & _f) >> _f##_S)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/ath9k/core.h linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/core.h
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/ath9k/core.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/core.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -701,7 +701,6 @@
|
|
struct ath_hal *sc_ah;
|
|
void __iomem *mem;
|
|
spinlock_t sc_resetlock;
|
|
- spinlock_t sc_serial_rw;
|
|
struct mutex mutex;
|
|
|
|
u8 sc_curbssid[ETH_ALEN];
|
|
@@ -752,36 +751,4 @@
|
|
int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc);
|
|
int ath_cabq_update(struct ath_softc *);
|
|
|
|
-/*
|
|
- * Read and write, they both share the same lock. We do this to serialize
|
|
- * reads and writes on Atheros 802.11n PCI devices only. This is required
|
|
- * as the FIFO on these devices can only accept sanely 2 requests. After
|
|
- * that the device goes bananas. Serializing the reads/writes prevents this
|
|
- * from happening.
|
|
- */
|
|
-
|
|
-static inline void ath9k_iowrite32(struct ath_hal *ah, u32 reg_offset, u32 val)
|
|
-{
|
|
- if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
|
|
- unsigned long flags;
|
|
- spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
|
|
- iowrite32(val, ah->ah_sc->mem + reg_offset);
|
|
- spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
|
|
- } else
|
|
- iowrite32(val, ah->ah_sc->mem + reg_offset);
|
|
-}
|
|
-
|
|
-static inline unsigned int ath9k_ioread32(struct ath_hal *ah, u32 reg_offset)
|
|
-{
|
|
- u32 val;
|
|
- if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
|
|
- unsigned long flags;
|
|
- spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
|
|
- val = ioread32(ah->ah_sc->mem + reg_offset);
|
|
- spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
|
|
- } else
|
|
- val = ioread32(ah->ah_sc->mem + reg_offset);
|
|
- return val;
|
|
-}
|
|
-
|
|
#endif /* CORE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/ath9k/hw.c linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/hw.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/ath9k/hw.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/hw.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -437,25 +437,6 @@
|
|
}
|
|
|
|
ah->ah_config.intr_mitigation = 1;
|
|
-
|
|
- /*
|
|
- * We need this for PCI devices only (Cardbus, PCI, miniPCI)
|
|
- * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
|
|
- * This means we use it for all AR5416 devices, and the few
|
|
- * minor PCI AR9280 devices out there.
|
|
- *
|
|
- * Serialization is required because these devices do not handle
|
|
- * well the case of two concurrent reads/writes due to the latency
|
|
- * involved. During one read/write another read/write can be issued
|
|
- * on another CPU while the previous read/write may still be working
|
|
- * on our hardware, if we hit this case the hardware poops in a loop.
|
|
- * We prevent this by serializing reads and writes.
|
|
- *
|
|
- * This issue is not present on PCI-Express devices or pre-AR5416
|
|
- * devices (legacy, 802.11abg).
|
|
- */
|
|
- if (num_possible_cpus() > 1)
|
|
- ah->ah_config.serialize_regmode = SER_REG_MODE_AUTO;
|
|
}
|
|
|
|
static struct ath_hal_5416 *ath9k_hw_newstate(u16 devid,
|
|
@@ -687,8 +668,7 @@
|
|
}
|
|
|
|
if (ah->ah_config.serialize_regmode == SER_REG_MODE_AUTO) {
|
|
- if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI ||
|
|
- (AR_SREV_9280(ah) && !ah->ah_isPciExpress)) {
|
|
+ if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI) {
|
|
ah->ah_config.serialize_regmode =
|
|
SER_REG_MODE_ON;
|
|
} else {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/ath9k/main.c linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/main.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/ath9k/main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/main.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1336,7 +1336,6 @@
|
|
printk(KERN_ERR "Unable to create debugfs files\n");
|
|
|
|
spin_lock_init(&sc->sc_resetlock);
|
|
- spin_lock_init(&sc->sc_serial_rw);
|
|
mutex_init(&sc->mutex);
|
|
tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
|
|
tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet,
|
|
@@ -1539,7 +1538,6 @@
|
|
bad:
|
|
if (ah)
|
|
ath9k_hw_detach(ah);
|
|
- ath9k_exit_debug(sc);
|
|
|
|
return error;
|
|
}
|
|
@@ -1547,7 +1545,7 @@
|
|
static int ath_attach(u16 devid, struct ath_softc *sc)
|
|
{
|
|
struct ieee80211_hw *hw = sc->hw;
|
|
- int error = 0, i;
|
|
+ int error = 0;
|
|
|
|
DPRINTF(sc, ATH_DBG_CONFIG, "Attach ATH hw\n");
|
|
|
|
@@ -1591,11 +1589,11 @@
|
|
/* initialize tx/rx engine */
|
|
error = ath_tx_init(sc, ATH_TXBUF);
|
|
if (error != 0)
|
|
- goto error_attach;
|
|
+ goto detach;
|
|
|
|
error = ath_rx_init(sc, ATH_RXBUF);
|
|
if (error != 0)
|
|
- goto error_attach;
|
|
+ goto detach;
|
|
|
|
#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
|
|
/* Initialze h/w Rfkill */
|
|
@@ -1603,9 +1601,8 @@
|
|
INIT_DELAYED_WORK(&sc->rf_kill.rfkill_poll, ath_rfkill_poll);
|
|
|
|
/* Initialize s/w rfkill */
|
|
- error = ath_init_sw_rfkill(sc);
|
|
- if (error)
|
|
- goto error_attach;
|
|
+ if (ath_init_sw_rfkill(sc))
|
|
+ goto detach;
|
|
#endif
|
|
|
|
error = ieee80211_register_hw(hw);
|
|
@@ -1614,16 +1611,8 @@
|
|
ath_init_leds(sc);
|
|
|
|
return 0;
|
|
-
|
|
-error_attach:
|
|
- /* cleanup tx queues */
|
|
- for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
|
|
- if (ATH_TXQ_SETUP(sc, i))
|
|
- ath_tx_cleanupq(sc, &sc->tx.txq[i]);
|
|
-
|
|
- ath9k_hw_detach(sc->sc_ah);
|
|
- ath9k_exit_debug(sc);
|
|
-
|
|
+detach:
|
|
+ ath_detach(sc);
|
|
return error;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl3945-base.c linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl3945-base.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl3945-base.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -7911,7 +7911,7 @@
|
|
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000);
|
|
if (err < 0) {
|
|
IWL_DEBUG_INFO("Failed to init the card\n");
|
|
- goto out_iounmap;
|
|
+ goto out_remove_sysfs;
|
|
}
|
|
|
|
/***********************
|
|
@@ -7921,7 +7921,7 @@
|
|
err = iwl3945_eeprom_init(priv);
|
|
if (err) {
|
|
IWL_ERROR("Unable to init EEPROM\n");
|
|
- goto out_iounmap;
|
|
+ goto out_remove_sysfs;
|
|
}
|
|
/* MAC Address location in EEPROM same for 3945/4965 */
|
|
get_eeprom_mac(priv, priv->mac_addr);
|
|
@@ -7975,7 +7975,7 @@
|
|
err = iwl3945_init_channel_map(priv);
|
|
if (err) {
|
|
IWL_ERROR("initializing regulatory failed: %d\n", err);
|
|
- goto out_unset_hw_setting;
|
|
+ goto out_release_irq;
|
|
}
|
|
|
|
err = iwl3945_init_geos(priv);
|
|
@@ -8045,22 +8045,25 @@
|
|
return 0;
|
|
|
|
out_remove_sysfs:
|
|
- destroy_workqueue(priv->workqueue);
|
|
- priv->workqueue = NULL;
|
|
sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
|
|
out_free_geos:
|
|
iwl3945_free_geos(priv);
|
|
out_free_channel_map:
|
|
iwl3945_free_channel_map(priv);
|
|
- out_unset_hw_setting:
|
|
+
|
|
+
|
|
+ out_release_irq:
|
|
+ destroy_workqueue(priv->workqueue);
|
|
+ priv->workqueue = NULL;
|
|
iwl3945_unset_hw_setting(priv);
|
|
+
|
|
out_iounmap:
|
|
pci_iounmap(pdev, priv->hw_base);
|
|
out_pci_release_regions:
|
|
pci_release_regions(pdev);
|
|
out_pci_disable_device:
|
|
- pci_set_drvdata(pdev, NULL);
|
|
pci_disable_device(pdev);
|
|
+ pci_set_drvdata(pdev, NULL);
|
|
out_ieee80211_free_hw:
|
|
ieee80211_free_hw(priv->hw);
|
|
out:
|
|
@@ -8140,19 +8143,6 @@
|
|
priv->is_open = 1;
|
|
}
|
|
|
|
- /* pci driver assumes state will be saved in this function.
|
|
- * pci state is saved and device disabled when interface is
|
|
- * stopped, so at this time pci device will always be disabled -
|
|
- * whether interface was started or not. saving pci state now will
|
|
- * cause saved state be that of a disabled device, which will cause
|
|
- * problems during resume in that we will end up with a disabled device.
|
|
- *
|
|
- * indicate that the current saved state (from when interface was
|
|
- * stopped) is valid. if interface was never up at time of suspend
|
|
- * then the saved state will still be valid as it was saved during
|
|
- * .probe. */
|
|
- pdev->state_saved = true;
|
|
-
|
|
pci_set_power_state(pdev, PCI_D3hot);
|
|
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-agn.c linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-agn.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-agn.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-agn.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1719,10 +1719,6 @@
|
|
priv->ucode_data_backup.len = data_size;
|
|
iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_data_backup);
|
|
|
|
- if (!priv->ucode_code.v_addr || !priv->ucode_data.v_addr ||
|
|
- !priv->ucode_data_backup.v_addr)
|
|
- goto err_pci_alloc;
|
|
-
|
|
/* Initialization instructions and data */
|
|
if (init_size && init_data_size) {
|
|
priv->ucode_init.len = init_size;
|
|
@@ -3868,7 +3864,7 @@
|
|
}
|
|
err = iwl_eeprom_check_version(priv);
|
|
if (err)
|
|
- goto out_free_eeprom;
|
|
+ goto out_iounmap;
|
|
|
|
/* extract MAC Address */
|
|
iwl_eeprom_get_mac(priv, priv->mac_addr);
|
|
@@ -3945,8 +3941,6 @@
|
|
return 0;
|
|
|
|
out_remove_sysfs:
|
|
- destroy_workqueue(priv->workqueue);
|
|
- priv->workqueue = NULL;
|
|
sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group);
|
|
out_uninit_drv:
|
|
iwl_uninit_drv(priv);
|
|
@@ -3955,8 +3949,8 @@
|
|
out_iounmap:
|
|
pci_iounmap(pdev, priv->hw_base);
|
|
out_pci_release_regions:
|
|
- pci_set_drvdata(pdev, NULL);
|
|
pci_release_regions(pdev);
|
|
+ pci_set_drvdata(pdev, NULL);
|
|
out_pci_disable_device:
|
|
pci_disable_device(pdev);
|
|
out_ieee80211_free_hw:
|
|
@@ -4044,19 +4038,6 @@
|
|
priv->is_open = 1;
|
|
}
|
|
|
|
- /* pci driver assumes state will be saved in this function.
|
|
- * pci state is saved and device disabled when interface is
|
|
- * stopped, so at this time pci device will always be disabled -
|
|
- * whether interface was started or not. saving pci state now will
|
|
- * cause saved state be that of a disabled device, which will cause
|
|
- * problems during resume in that we will end up with a disabled device.
|
|
- *
|
|
- * indicate that the current saved state (from when interface was
|
|
- * stopped) is valid. if interface was never up at time of suspend
|
|
- * then the saved state will still be valid as it was saved during
|
|
- * .probe. */
|
|
- pdev->state_saved = true;
|
|
-
|
|
pci_set_power_state(pdev, PCI_D3hot);
|
|
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-sta.c linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-sta.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-sta.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-sta.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -480,9 +480,6 @@
|
|
priv->num_stations = 0;
|
|
memset(priv->stations, 0, sizeof(priv->stations));
|
|
|
|
- /* clean ucode key table bit map */
|
|
- priv->ucode_key_table = 0;
|
|
-
|
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
}
|
|
EXPORT_SYMBOL(iwl_clear_stations_table);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-tx.c linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-tx.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-tx.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-tx.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -148,7 +148,7 @@
|
|
pci_unmap_single(dev,
|
|
pci_unmap_addr(&txq->cmd[index]->meta, mapping),
|
|
pci_unmap_len(&txq->cmd[index]->meta, len),
|
|
- PCI_DMA_BIDIRECTIONAL);
|
|
+ PCI_DMA_TODEVICE);
|
|
|
|
/* Unmap chunks, if any. */
|
|
for (i = 1; i < num_tbs; i++) {
|
|
@@ -964,7 +964,7 @@
|
|
* within command buffer array. */
|
|
txcmd_phys = pci_map_single(priv->pci_dev,
|
|
out_cmd, sizeof(struct iwl_cmd),
|
|
- PCI_DMA_BIDIRECTIONAL);
|
|
+ PCI_DMA_TODEVICE);
|
|
pci_unmap_addr_set(&out_cmd->meta, mapping, txcmd_phys);
|
|
pci_unmap_len_set(&out_cmd->meta, len, sizeof(struct iwl_cmd));
|
|
/* Add buffer containing Tx command and MAC(!) header to TFD's
|
|
@@ -1115,7 +1115,7 @@
|
|
IWL_MAX_SCAN_SIZE : sizeof(struct iwl_cmd);
|
|
|
|
phys_addr = pci_map_single(priv->pci_dev, out_cmd,
|
|
- len, PCI_DMA_BIDIRECTIONAL);
|
|
+ len, PCI_DMA_TODEVICE);
|
|
pci_unmap_addr_set(&out_cmd->meta, mapping, phys_addr);
|
|
pci_unmap_len_set(&out_cmd->meta, len, len);
|
|
phys_addr += offsetof(struct iwl_cmd, hdr);
|
|
@@ -1212,7 +1212,7 @@
|
|
pci_unmap_single(priv->pci_dev,
|
|
pci_unmap_addr(&txq->cmd[cmd_idx]->meta, mapping),
|
|
pci_unmap_len(&txq->cmd[cmd_idx]->meta, len),
|
|
- PCI_DMA_BIDIRECTIONAL);
|
|
+ PCI_DMA_TODEVICE);
|
|
|
|
for (idx = iwl_queue_inc_wrap(idx, q->n_bd); q->read_ptr != idx;
|
|
q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/libertas/ethtool.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/ethtool.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/libertas/ethtool.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/ethtool.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -23,7 +23,7 @@
|
|
static void lbs_ethtool_get_drvinfo(struct net_device *dev,
|
|
struct ethtool_drvinfo *info)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
snprintf(info->fw_version, 32, "%u.%u.%u.p%u",
|
|
priv->fwrelease >> 24 & 0xff,
|
|
@@ -47,7 +47,7 @@
|
|
static int lbs_ethtool_get_eeprom(struct net_device *dev,
|
|
struct ethtool_eeprom *eeprom, u8 * bytes)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct cmd_ds_802_11_eeprom_access cmd;
|
|
int ret;
|
|
|
|
@@ -76,7 +76,7 @@
|
|
static void lbs_ethtool_get_stats(struct net_device *dev,
|
|
struct ethtool_stats *stats, uint64_t *data)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct cmd_ds_mesh_access mesh_access;
|
|
int ret;
|
|
|
|
@@ -113,7 +113,7 @@
|
|
|
|
static int lbs_ethtool_get_sset_count(struct net_device *dev, int sset)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
if (sset == ETH_SS_STATS && dev == priv->mesh_dev)
|
|
return MESH_STATS_NUM;
|
|
@@ -143,7 +143,7 @@
|
|
static void lbs_ethtool_get_wol(struct net_device *dev,
|
|
struct ethtool_wolinfo *wol)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
if (priv->wol_criteria == 0xffffffff) {
|
|
/* Interface driver didn't configure wake */
|
|
@@ -166,7 +166,7 @@
|
|
static int lbs_ethtool_set_wol(struct net_device *dev,
|
|
struct ethtool_wolinfo *wol)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
uint32_t criteria = 0;
|
|
|
|
if (priv->wol_criteria == 0xffffffff && wol->wolopts)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/libertas/if_usb.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/if_usb.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/libertas/if_usb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/if_usb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -59,7 +59,7 @@
|
|
static ssize_t if_usb_firmware_set(struct device *dev,
|
|
struct device_attribute *attr, const char *buf, size_t count)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct if_usb_card *cardp = priv->card;
|
|
char fwname[FIRMWARE_NAME_MAX];
|
|
int ret;
|
|
@@ -86,7 +86,7 @@
|
|
static ssize_t if_usb_boot2_set(struct device *dev,
|
|
struct device_attribute *attr, const char *buf, size_t count)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct if_usb_card *cardp = priv->card;
|
|
char fwname[FIRMWARE_NAME_MAX];
|
|
int ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/libertas/main.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/main.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/libertas/main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/main.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -222,7 +222,7 @@
|
|
static ssize_t lbs_anycast_get(struct device *dev,
|
|
struct device_attribute *attr, char * buf)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct cmd_ds_mesh_access mesh_access;
|
|
int ret;
|
|
|
|
@@ -241,7 +241,7 @@
|
|
static ssize_t lbs_anycast_set(struct device *dev,
|
|
struct device_attribute *attr, const char * buf, size_t count)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct cmd_ds_mesh_access mesh_access;
|
|
uint32_t datum;
|
|
int ret;
|
|
@@ -263,7 +263,7 @@
|
|
static ssize_t lbs_prb_rsp_limit_get(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct cmd_ds_mesh_access mesh_access;
|
|
int ret;
|
|
u32 retry_limit;
|
|
@@ -286,7 +286,7 @@
|
|
static ssize_t lbs_prb_rsp_limit_set(struct device *dev,
|
|
struct device_attribute *attr, const char *buf, size_t count)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct cmd_ds_mesh_access mesh_access;
|
|
int ret;
|
|
unsigned long retry_limit;
|
|
@@ -321,7 +321,7 @@
|
|
static ssize_t lbs_rtap_get(struct device *dev,
|
|
struct device_attribute *attr, char * buf)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
return snprintf(buf, 5, "0x%X\n", priv->monitormode);
|
|
}
|
|
|
|
@@ -332,7 +332,7 @@
|
|
struct device_attribute *attr, const char * buf, size_t count)
|
|
{
|
|
int monitor_mode;
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
|
|
sscanf(buf, "%x", &monitor_mode);
|
|
if (monitor_mode) {
|
|
@@ -383,7 +383,7 @@
|
|
static ssize_t lbs_mesh_get(struct device *dev,
|
|
struct device_attribute *attr, char * buf)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
return snprintf(buf, 5, "0x%X\n", !!priv->mesh_dev);
|
|
}
|
|
|
|
@@ -393,7 +393,7 @@
|
|
static ssize_t lbs_mesh_set(struct device *dev,
|
|
struct device_attribute *attr, const char * buf, size_t count)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
int enable;
|
|
int ret, action = CMD_ACT_MESH_CONFIG_STOP;
|
|
|
|
@@ -452,7 +452,7 @@
|
|
*/
|
|
static int lbs_dev_open(struct net_device *dev)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev) ;
|
|
int ret = 0;
|
|
|
|
lbs_deb_enter(LBS_DEB_NET);
|
|
@@ -521,7 +521,7 @@
|
|
*/
|
|
static int lbs_eth_stop(struct net_device *dev)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_NET);
|
|
|
|
@@ -538,7 +538,7 @@
|
|
|
|
static void lbs_tx_timeout(struct net_device *dev)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_TX);
|
|
|
|
@@ -590,7 +590,7 @@
|
|
*/
|
|
static struct net_device_stats *lbs_get_stats(struct net_device *dev)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_NET);
|
|
return &priv->stats;
|
|
@@ -599,7 +599,7 @@
|
|
static int lbs_set_mac_address(struct net_device *dev, void *addr)
|
|
{
|
|
int ret = 0;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct sockaddr *phwaddr = addr;
|
|
struct cmd_ds_802_11_mac_address cmd;
|
|
|
|
@@ -732,7 +732,7 @@
|
|
|
|
static void lbs_set_multicast_list(struct net_device *dev)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
schedule_work(&priv->mcast_work);
|
|
}
|
|
@@ -748,7 +748,7 @@
|
|
static int lbs_thread(void *data)
|
|
{
|
|
struct net_device *dev = data;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
wait_queue_t wait;
|
|
|
|
lbs_deb_enter(LBS_DEB_THREAD);
|
|
@@ -1184,7 +1184,6 @@
|
|
goto done;
|
|
}
|
|
priv = netdev_priv(dev);
|
|
- dev->ml_priv = priv;
|
|
|
|
if (lbs_init_adapter(priv)) {
|
|
lbs_pr_err("failed to initialize adapter structure.\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/libertas/persistcfg.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/persistcfg.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/libertas/persistcfg.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/persistcfg.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -18,7 +18,7 @@
|
|
static int mesh_get_default_parameters(struct device *dev,
|
|
struct mrvl_mesh_defaults *defs)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct cmd_ds_mesh_config cmd;
|
|
int ret;
|
|
|
|
@@ -57,7 +57,7 @@
|
|
static ssize_t bootflag_set(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct cmd_ds_mesh_config cmd;
|
|
uint32_t datum;
|
|
int ret;
|
|
@@ -100,7 +100,7 @@
|
|
static ssize_t boottime_set(struct device *dev,
|
|
struct device_attribute *attr, const char *buf, size_t count)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct cmd_ds_mesh_config cmd;
|
|
uint32_t datum;
|
|
int ret;
|
|
@@ -152,7 +152,7 @@
|
|
static ssize_t channel_set(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
struct cmd_ds_mesh_config cmd;
|
|
uint32_t datum;
|
|
int ret;
|
|
@@ -210,7 +210,7 @@
|
|
struct cmd_ds_mesh_config cmd;
|
|
struct mrvl_mesh_defaults defs;
|
|
struct mrvl_meshie *ie;
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
int len;
|
|
int ret;
|
|
|
|
@@ -269,7 +269,7 @@
|
|
struct cmd_ds_mesh_config cmd;
|
|
struct mrvl_mesh_defaults defs;
|
|
struct mrvl_meshie *ie;
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
uint32_t datum;
|
|
int ret;
|
|
|
|
@@ -323,7 +323,7 @@
|
|
struct cmd_ds_mesh_config cmd;
|
|
struct mrvl_mesh_defaults defs;
|
|
struct mrvl_meshie *ie;
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
uint32_t datum;
|
|
int ret;
|
|
|
|
@@ -377,7 +377,7 @@
|
|
struct cmd_ds_mesh_config cmd;
|
|
struct mrvl_mesh_defaults defs;
|
|
struct mrvl_meshie *ie;
|
|
- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
|
|
uint32_t datum;
|
|
int ret;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/libertas/scan.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/scan.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/libertas/scan.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/scan.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -945,7 +945,7 @@
|
|
union iwreq_data *wrqu, char *extra)
|
|
{
|
|
DECLARE_SSID_BUF(ssid);
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
@@ -1008,7 +1008,7 @@
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
#define SCAN_ITEM_SIZE 128
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int err = 0;
|
|
char *ev = extra;
|
|
char *stop = ev + dwrq->length;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/libertas/tx.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/tx.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/libertas/tx.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/tx.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -60,7 +60,7 @@
|
|
int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
{
|
|
unsigned long flags;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct txpd *txpd;
|
|
char *p802x_hdr;
|
|
uint16_t pkt_len;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/libertas/wext.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/wext.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/libertas/wext.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/wext.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -163,7 +163,7 @@
|
|
static int lbs_get_freq(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_freq *fwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct chan_freq_power *cfp;
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
@@ -189,7 +189,7 @@
|
|
static int lbs_get_wap(struct net_device *dev, struct iw_request_info *info,
|
|
struct sockaddr *awrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -207,7 +207,7 @@
|
|
static int lbs_set_nick(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -231,7 +231,7 @@
|
|
static int lbs_get_nick(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -248,7 +248,7 @@
|
|
static int mesh_get_nick(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -273,7 +273,7 @@
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
int ret = 0;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
u32 val = vwrq->value;
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
@@ -293,7 +293,7 @@
|
|
static int lbs_get_rts(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
u16 val = 0;
|
|
|
|
@@ -315,7 +315,7 @@
|
|
static int lbs_set_frag(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
u32 val = vwrq->value;
|
|
|
|
@@ -336,7 +336,7 @@
|
|
static int lbs_get_frag(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
u16 val = 0;
|
|
|
|
@@ -359,7 +359,7 @@
|
|
static int lbs_get_mode(struct net_device *dev,
|
|
struct iw_request_info *info, u32 * uwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -385,7 +385,7 @@
|
|
struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
s16 curlevel = 0;
|
|
int ret = 0;
|
|
|
|
@@ -418,7 +418,7 @@
|
|
static int lbs_set_retry(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
u16 slimit = 0, llimit = 0;
|
|
|
|
@@ -466,7 +466,7 @@
|
|
static int lbs_get_retry(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
u16 val = 0;
|
|
|
|
@@ -542,7 +542,7 @@
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
int i, j;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct iw_range *range = (struct iw_range *)extra;
|
|
struct chan_freq_power *cfp;
|
|
u8 rates[MAX_RATES + 1];
|
|
@@ -708,7 +708,7 @@
|
|
static int lbs_set_power(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -758,7 +758,7 @@
|
|
static int lbs_get_power(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -781,7 +781,7 @@
|
|
EXCELLENT = 95,
|
|
PERFECT = 100
|
|
};
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
u32 rssi_qual;
|
|
u32 tx_qual;
|
|
u32 quality = 0;
|
|
@@ -886,7 +886,7 @@
|
|
struct iw_freq *fwrq, char *extra)
|
|
{
|
|
int ret = -EINVAL;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct chan_freq_power *cfp;
|
|
struct assoc_request * assoc_req;
|
|
|
|
@@ -943,7 +943,7 @@
|
|
struct iw_request_info *info,
|
|
struct iw_freq *fwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct chan_freq_power *cfp;
|
|
int ret = -EINVAL;
|
|
|
|
@@ -994,7 +994,7 @@
|
|
static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
u8 new_rate = 0;
|
|
int ret = -EINVAL;
|
|
u8 rates[MAX_RATES + 1];
|
|
@@ -1054,7 +1054,7 @@
|
|
static int lbs_get_rate(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -1079,7 +1079,7 @@
|
|
struct iw_request_info *info, u32 * uwrq, char *extra)
|
|
{
|
|
int ret = 0;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct assoc_request * assoc_req;
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
@@ -1124,7 +1124,7 @@
|
|
struct iw_request_info *info,
|
|
struct iw_point *dwrq, u8 * extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
@@ -1319,7 +1319,7 @@
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
int ret = 0;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct assoc_request * assoc_req;
|
|
u16 is_default = 0, index = 0, set_tx_key = 0;
|
|
|
|
@@ -1395,7 +1395,7 @@
|
|
char *extra)
|
|
{
|
|
int ret = -EINVAL;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
|
|
int index, max_key_len;
|
|
|
|
@@ -1501,7 +1501,7 @@
|
|
char *extra)
|
|
{
|
|
int ret = 0;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
|
|
int alg = ext->alg;
|
|
struct assoc_request * assoc_req;
|
|
@@ -1639,7 +1639,7 @@
|
|
struct iw_point *dwrq,
|
|
char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
struct assoc_request * assoc_req;
|
|
|
|
@@ -1685,7 +1685,7 @@
|
|
char *extra)
|
|
{
|
|
int ret = 0;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -1713,7 +1713,7 @@
|
|
struct iw_param *dwrq,
|
|
char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct assoc_request * assoc_req;
|
|
int ret = 0;
|
|
int updated = 0;
|
|
@@ -1816,7 +1816,7 @@
|
|
char *extra)
|
|
{
|
|
int ret = 0;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -1857,7 +1857,7 @@
|
|
struct iw_param *vwrq, char *extra)
|
|
{
|
|
int ret = 0;
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
s16 dbm = (s16) vwrq->value;
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
@@ -1936,7 +1936,7 @@
|
|
static int lbs_get_essid(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -1971,7 +1971,7 @@
|
|
static int lbs_set_essid(struct net_device *dev, struct iw_request_info *info,
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
u8 ssid[IW_ESSID_MAX_SIZE];
|
|
u8 ssid_len = 0;
|
|
@@ -2040,7 +2040,7 @@
|
|
struct iw_request_info *info,
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
@@ -2058,7 +2058,7 @@
|
|
struct iw_request_info *info,
|
|
struct iw_point *dwrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
int ret = 0;
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
@@ -2102,7 +2102,7 @@
|
|
static int lbs_set_wap(struct net_device *dev, struct iw_request_info *info,
|
|
struct sockaddr *awrq, char *extra)
|
|
{
|
|
- struct lbs_private *priv = dev->ml_priv;
|
|
+ struct lbs_private *priv = netdev_priv(dev);
|
|
struct assoc_request * assoc_req;
|
|
int ret = 0;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/orinoco/orinoco.c linux-2.6.29-rc3.owrt/drivers/net/wireless/orinoco/orinoco.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/orinoco/orinoco.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/orinoco/orinoco.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -3157,20 +3157,8 @@
|
|
|
|
return NOTIFY_DONE;
|
|
}
|
|
-
|
|
-static void orinoco_register_pm_notifier(struct orinoco_private *priv)
|
|
-{
|
|
- priv->pm_notifier.notifier_call = orinoco_pm_notifier;
|
|
- register_pm_notifier(&priv->pm_notifier);
|
|
-}
|
|
-
|
|
-static void orinoco_unregister_pm_notifier(struct orinoco_private *priv)
|
|
-{
|
|
- unregister_pm_notifier(&priv->pm_notifier);
|
|
-}
|
|
#else /* !PM_SLEEP || HERMES_CACHE_FW_ON_INIT */
|
|
-#define orinoco_register_pm_notifier(priv) do { } while(0)
|
|
-#define orinoco_unregister_pm_notifier(priv) do { } while(0)
|
|
+#define orinoco_pm_notifier NULL
|
|
#endif
|
|
|
|
/********************************************************************/
|
|
@@ -3660,7 +3648,8 @@
|
|
priv->cached_fw = NULL;
|
|
|
|
/* Register PM notifiers */
|
|
- orinoco_register_pm_notifier(priv);
|
|
+ priv->pm_notifier.notifier_call = orinoco_pm_notifier;
|
|
+ register_pm_notifier(&priv->pm_notifier);
|
|
|
|
return dev;
|
|
}
|
|
@@ -3684,7 +3673,7 @@
|
|
kfree(rx_data);
|
|
}
|
|
|
|
- orinoco_unregister_pm_notifier(priv);
|
|
+ unregister_pm_notifier(&priv->pm_notifier);
|
|
orinoco_uncache_fw(priv);
|
|
|
|
priv->wpa_ie_len = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/p54/p54common.c linux-2.6.29-rc3.owrt/drivers/net/wireless/p54/p54common.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/p54/p54common.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/p54/p54common.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -710,11 +710,10 @@
|
|
__le32 req_id)
|
|
{
|
|
struct p54_common *priv = dev->priv;
|
|
- struct sk_buff *entry;
|
|
+ struct sk_buff *entry = priv->tx_queue.next;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&priv->tx_queue.lock, flags);
|
|
- entry = priv->tx_queue.next;
|
|
while (entry != (struct sk_buff *)&priv->tx_queue) {
|
|
struct p54_hdr *hdr = (struct p54_hdr *) entry->data;
|
|
|
|
@@ -733,7 +732,7 @@
|
|
struct p54_common *priv = dev->priv;
|
|
struct p54_hdr *hdr = (struct p54_hdr *) skb->data;
|
|
struct p54_frame_sent *payload = (struct p54_frame_sent *) hdr->data;
|
|
- struct sk_buff *entry;
|
|
+ struct sk_buff *entry = (struct sk_buff *) priv->tx_queue.next;
|
|
u32 addr = le32_to_cpu(hdr->req_id) - priv->headroom;
|
|
struct memrecord *range = NULL;
|
|
u32 freed = 0;
|
|
@@ -742,7 +741,6 @@
|
|
int count, idx;
|
|
|
|
spin_lock_irqsave(&priv->tx_queue.lock, flags);
|
|
- entry = (struct sk_buff *) priv->tx_queue.next;
|
|
while (entry != (struct sk_buff *)&priv->tx_queue) {
|
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
|
|
struct p54_hdr *entry_hdr;
|
|
@@ -978,7 +976,7 @@
|
|
struct p54_hdr *data, u32 len)
|
|
{
|
|
struct p54_common *priv = dev->priv;
|
|
- struct sk_buff *entry;
|
|
+ struct sk_buff *entry = priv->tx_queue.next;
|
|
struct sk_buff *target_skb = NULL;
|
|
struct ieee80211_tx_info *info;
|
|
struct memrecord *range;
|
|
@@ -1016,7 +1014,6 @@
|
|
}
|
|
}
|
|
|
|
- entry = priv->tx_queue.next;
|
|
while (left--) {
|
|
u32 hole_size;
|
|
info = IEEE80211_SKB_CB(entry);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/rt2x00/rt2500usb.c linux-2.6.29-rc3.owrt/drivers/net/wireless/rt2x00/rt2500usb.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/rt2x00/rt2500usb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/rt2x00/rt2500usb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1952,8 +1952,6 @@
|
|
{ USB_DEVICE(0x13b1, 0x000d), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
{ USB_DEVICE(0x13b1, 0x0011), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
{ USB_DEVICE(0x13b1, 0x001a), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
- /* CNet */
|
|
- { USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
/* Conceptronic */
|
|
{ USB_DEVICE(0x14b2, 0x3c02), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
/* D-LINK */
|
|
@@ -1978,20 +1976,14 @@
|
|
{ USB_DEVICE(0x148f, 0x2570), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
{ USB_DEVICE(0x148f, 0x9020), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
- /* Sagem */
|
|
- { USB_DEVICE(0x079b, 0x004b), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
/* Siemens */
|
|
{ USB_DEVICE(0x0681, 0x3c06), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
/* SMC */
|
|
{ USB_DEVICE(0x0707, 0xee13), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
/* Spairon */
|
|
{ USB_DEVICE(0x114b, 0x0110), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
- /* SURECOM */
|
|
- { USB_DEVICE(0x0769, 0x11f3), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
/* Trust */
|
|
{ USB_DEVICE(0x0eb0, 0x9020), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
- /* VTech */
|
|
- { USB_DEVICE(0x0f88, 0x3012), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
/* Zinwell */
|
|
{ USB_DEVICE(0x5a57, 0x0260), USB_DEVICE_DATA(&rt2500usb_ops) },
|
|
{ 0, }
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/rt2x00/rt73usb.c linux-2.6.29-rc3.owrt/drivers/net/wireless/rt2x00/rt73usb.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/rt2x00/rt73usb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/rt2x00/rt73usb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2281,18 +2281,7 @@
|
|
*/
|
|
static struct usb_device_id rt73usb_device_table[] = {
|
|
/* AboCom */
|
|
- { USB_DEVICE(0x07b8, 0xb21b), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x07b8, 0xb21c), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x07b8, 0xb21d), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x07b8, 0xb21e), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x07b8, 0xb21f), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* AL */
|
|
- { USB_DEVICE(0x14b2, 0x3c10), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* Amigo */
|
|
- { USB_DEVICE(0x148f, 0x9021), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x0eb0, 0x9021), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* AMIT */
|
|
- { USB_DEVICE(0x18c5, 0x0002), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Askey */
|
|
{ USB_DEVICE(0x1690, 0x0722), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* ASUS */
|
|
@@ -2305,9 +2294,7 @@
|
|
{ USB_DEVICE(0x050d, 0x905c), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Billionton */
|
|
{ USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x08dd, 0x0120), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Buffalo */
|
|
- { USB_DEVICE(0x0411, 0x00d8), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* CNet */
|
|
{ USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
@@ -2321,11 +2308,6 @@
|
|
{ USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x07d1, 0x3c06), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* Edimax */
|
|
- { USB_DEVICE(0x7392, 0x7318), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x7392, 0x7618), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* EnGenius */
|
|
- { USB_DEVICE(0x1740, 0x3701), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Gemtek */
|
|
{ USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Gigabyte */
|
|
@@ -2346,34 +2328,22 @@
|
|
{ USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Ralink */
|
|
- { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Qcom */
|
|
{ USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x18e8, 0x6238), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* Samsung */
|
|
- { USB_DEVICE(0x04e8, 0x4471), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Senao */
|
|
{ USB_DEVICE(0x1740, 0x7100), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Sitecom */
|
|
- { USB_DEVICE(0x0df6, 0x0024), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x0df6, 0x0027), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x0df6, 0x002f), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- { USB_DEVICE(0x0df6, 0x90ac), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x0df6, 0x9712), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
+ { USB_DEVICE(0x0df6, 0x90ac), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Surecom */
|
|
{ USB_DEVICE(0x0769, 0x31f3), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* Philips */
|
|
- { USB_DEVICE(0x0471, 0x200a), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
/* Planex */
|
|
{ USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* Zcom */
|
|
- { USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
- /* ZyXEL */
|
|
- { USB_DEVICE(0x0586, 0x3415), USB_DEVICE_DATA(&rt73usb_ops) },
|
|
{ 0, }
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/rtl818x/rtl8187_dev.c linux-2.6.29-rc3.owrt/drivers/net/wireless/rtl818x/rtl8187_dev.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/rtl818x/rtl8187_dev.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/rtl818x/rtl8187_dev.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -48,10 +48,6 @@
|
|
{USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B},
|
|
{USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B},
|
|
{USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B},
|
|
- /* Surecom */
|
|
- {USB_DEVICE(0x0769, 0x11F2), .driver_info = DEVICE_RTL8187},
|
|
- /* Logitech */
|
|
- {USB_DEVICE(0x0789, 0x010C), .driver_info = DEVICE_RTL8187},
|
|
/* Netgear */
|
|
{USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187},
|
|
{USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187},
|
|
@@ -61,16 +57,8 @@
|
|
/* Sitecom */
|
|
{USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187},
|
|
{USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B},
|
|
- /* Sphairon Access Systems GmbH */
|
|
- {USB_DEVICE(0x114B, 0x0150), .driver_info = DEVICE_RTL8187},
|
|
- /* Dick Smith Electronics */
|
|
- {USB_DEVICE(0x1371, 0x9401), .driver_info = DEVICE_RTL8187},
|
|
/* Abocom */
|
|
{USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187},
|
|
- /* Qcom */
|
|
- {USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187},
|
|
- /* AirLive */
|
|
- {USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187},
|
|
{}
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c linux-2.6.29-rc3.owrt/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -285,10 +285,7 @@
|
|
ofdm_power = priv->channels[channel - 1].hw_value >> 4;
|
|
|
|
cck_power = min(cck_power, (u8)11);
|
|
- if (ofdm_power > (u8)15)
|
|
- ofdm_power = 25;
|
|
- else
|
|
- ofdm_power += 10;
|
|
+ ofdm_power = min(ofdm_power, (u8)35);
|
|
|
|
rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK,
|
|
rtl8225_tx_gain_cck_ofdm[cck_power / 6] >> 1);
|
|
@@ -539,10 +536,7 @@
|
|
cck_power += priv->txpwr_base & 0xF;
|
|
cck_power = min(cck_power, (u8)35);
|
|
|
|
- if (ofdm_power > (u8)15)
|
|
- ofdm_power = 25;
|
|
- else
|
|
- ofdm_power += 10;
|
|
+ ofdm_power = min(ofdm_power, (u8)15);
|
|
ofdm_power += priv->txpwr_base >> 4;
|
|
ofdm_power = min(ofdm_power, (u8)35);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_mac.c linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_mac.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_mac.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_mac.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -575,17 +575,13 @@
|
|
|
|
r = fill_ctrlset(mac, skb);
|
|
if (r)
|
|
- goto fail;
|
|
+ return r;
|
|
|
|
info->rate_driver_data[0] = hw;
|
|
|
|
r = zd_usb_tx(&mac->chip.usb, skb);
|
|
if (r)
|
|
- goto fail;
|
|
- return 0;
|
|
-
|
|
-fail:
|
|
- dev_kfree_skb(skb);
|
|
+ return r;
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_rf.c linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_rf.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_rf.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_rf.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -86,7 +86,6 @@
|
|
case AL7230B_RF:
|
|
r = zd_rf_init_al7230b(rf);
|
|
break;
|
|
- case MAXIM_NEW_RF:
|
|
case UW2453_RF:
|
|
r = zd_rf_init_uw2453(rf);
|
|
break;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_usb.c linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_usb.c
|
|
--- linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_usb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_usb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -37,7 +37,6 @@
|
|
static struct usb_device_id usb_ids[] = {
|
|
/* ZD1211 */
|
|
{ USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 },
|
|
- { USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 },
|
|
{ USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 },
|
|
{ USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 },
|
|
{ USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 },
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/parisc/dino.c linux-2.6.29-rc3.owrt/drivers/parisc/dino.c
|
|
--- linux-2.6.29.owrt/drivers/parisc/dino.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/parisc/dino.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -479,7 +479,7 @@
|
|
res = &dino_dev->hba.lmmio_space;
|
|
res->flags = IORESOURCE_MEM;
|
|
size = scnprintf(name, sizeof(name), "Dino LMMIO (%s)",
|
|
- dev_name(bus->bridge));
|
|
+ bus->bridge->bus_id);
|
|
res->name = kmalloc(size+1, GFP_KERNEL);
|
|
if(res->name)
|
|
strcpy((char *)res->name, name);
|
|
@@ -493,7 +493,7 @@
|
|
struct list_head *ln, *tmp_ln;
|
|
|
|
printk(KERN_ERR "Dino: cannot attach bus %s\n",
|
|
- dev_name(bus->bridge));
|
|
+ bus->bridge->bus_id);
|
|
/* kill the bus, we can't do anything with it */
|
|
list_for_each_safe(ln, tmp_ln, &bus->devices) {
|
|
struct pci_dev *dev = pci_dev_b(ln);
|
|
@@ -587,7 +587,7 @@
|
|
bus->resource[i+1] = &res[i];
|
|
}
|
|
|
|
- } else if (bus->parent) {
|
|
+ } else if(bus->self) {
|
|
int i;
|
|
|
|
pci_read_bridge_bases(bus);
|
|
@@ -611,12 +611,12 @@
|
|
}
|
|
|
|
DBG("DEBUG %s assigning %d [0x%lx,0x%lx]\n",
|
|
- dev_name(&bus->self->dev), i,
|
|
+ bus->self->dev.bus_id, i,
|
|
bus->self->resource[i].start,
|
|
bus->self->resource[i].end);
|
|
pci_assign_resource(bus->self, i);
|
|
DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n",
|
|
- dev_name(&bus->self->dev), i,
|
|
+ bus->self->dev.bus_id, i,
|
|
bus->self->resource[i].start,
|
|
bus->self->resource[i].end);
|
|
}
|
|
@@ -1026,8 +1026,7 @@
|
|
dino_current_bus = bus->subordinate + 1;
|
|
pci_bus_assign_resources(bus);
|
|
} else {
|
|
- printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n",
|
|
- dev_name(&dev->dev), dino_current_bus);
|
|
+ printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n", dev->dev.bus_id, dino_current_bus);
|
|
/* increment the bus number in case of duplicates */
|
|
dino_current_bus++;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/parisc/gsc.c linux-2.6.29-rc3.owrt/drivers/parisc/gsc.c
|
|
--- linux-2.6.29.owrt/drivers/parisc/gsc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/parisc/gsc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -186,34 +186,29 @@
|
|
*irqp = irq;
|
|
}
|
|
|
|
-struct gsc_fixup_struct {
|
|
- void (*choose_irq)(struct parisc_device *, void *);
|
|
- void *ctrl;
|
|
-};
|
|
-
|
|
-static int gsc_fixup_irqs_callback(struct device *dev, void *data)
|
|
+static struct device *next_device(struct klist_iter *i)
|
|
{
|
|
- struct parisc_device *padev = to_parisc_device(dev);
|
|
- struct gsc_fixup_struct *gf = data;
|
|
-
|
|
- /* work-around for 715/64 and others which have parent
|
|
- at path [5] and children at path [5/0/x] */
|
|
- if (padev->id.hw_type == HPHW_FAULTY)
|
|
- gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq);
|
|
- gf->choose_irq(padev, gf->ctrl);
|
|
-
|
|
- return 0;
|
|
+ struct klist_node * n = klist_next(i);
|
|
+ return n ? container_of(n, struct device, knode_parent) : NULL;
|
|
}
|
|
|
|
void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
|
|
void (*choose_irq)(struct parisc_device *, void *))
|
|
{
|
|
- struct gsc_fixup_struct data = {
|
|
- .choose_irq = choose_irq,
|
|
- .ctrl = ctrl,
|
|
- };
|
|
+ struct device *dev;
|
|
+ struct klist_iter i;
|
|
|
|
- device_for_each_child(&parent->dev, &data, gsc_fixup_irqs_callback);
|
|
+ klist_iter_init(&parent->dev.klist_children, &i);
|
|
+ while ((dev = next_device(&i))) {
|
|
+ struct parisc_device *padev = to_parisc_device(dev);
|
|
+
|
|
+ /* work-around for 715/64 and others which have parent
|
|
+ at path [5] and children at path [5/0/x] */
|
|
+ if (padev->id.hw_type == HPHW_FAULTY)
|
|
+ return gsc_fixup_irqs(padev, ctrl, choose_irq);
|
|
+ choose_irq(padev, ctrl);
|
|
+ }
|
|
+ klist_iter_exit(&i);
|
|
}
|
|
|
|
int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/parisc/iosapic.c linux-2.6.29-rc3.owrt/drivers/parisc/iosapic.c
|
|
--- linux-2.6.29.owrt/drivers/parisc/iosapic.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/parisc/iosapic.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -487,7 +487,7 @@
|
|
}
|
|
|
|
/* Check if pcidev behind a PPB */
|
|
- if (pcidev->bus->parent) {
|
|
+ if (NULL != pcidev->bus->self) {
|
|
/* Convert pcidev INTR_PIN into something we
|
|
** can lookup in the IRT.
|
|
*/
|
|
@@ -523,9 +523,10 @@
|
|
#endif /* PCI_BRIDGE_FUNCS */
|
|
|
|
/*
|
|
- * Locate the host slot of the PPB.
|
|
- */
|
|
- while (p->parent->parent)
|
|
+ ** Locate the host slot the PPB nearest the Host bus
|
|
+ ** adapter.
|
|
+ */
|
|
+ while (NULL != p->parent->self)
|
|
p = p->parent;
|
|
|
|
intr_slot = PCI_SLOT(p->self->devfn);
|
|
@@ -708,14 +709,11 @@
|
|
struct vector_info *vi = iosapic_get_vector(irq);
|
|
u32 d0, d1, dummy_d0;
|
|
unsigned long flags;
|
|
- int dest_cpu;
|
|
|
|
- dest_cpu = cpu_check_affinity(irq, dest);
|
|
- if (dest_cpu < 0)
|
|
+ if (cpu_check_affinity(irq, dest))
|
|
return;
|
|
|
|
- irq_desc[irq].affinity = cpumask_of_cpu(dest_cpu);
|
|
- vi->txn_addr = txn_affinity_addr(irq, dest_cpu);
|
|
+ vi->txn_addr = txn_affinity_addr(irq, cpumask_first(dest));
|
|
|
|
spin_lock_irqsave(&iosapic_lock, flags);
|
|
/* d1 contains the destination CPU, so only want to set that
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/parisc/lba_pci.c linux-2.6.29-rc3.owrt/drivers/parisc/lba_pci.c
|
|
--- linux-2.6.29.owrt/drivers/parisc/lba_pci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/parisc/lba_pci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -644,7 +644,7 @@
|
|
** Properly Setup MMIO resources for this bus.
|
|
** pci_alloc_primary_bus() mangles this.
|
|
*/
|
|
- if (bus->parent) {
|
|
+ if (bus->self) {
|
|
int i;
|
|
/* PCI-PCI Bridge */
|
|
pci_read_bridge_bases(bus);
|
|
@@ -802,7 +802,7 @@
|
|
** Can't fixup here anyway....garr...
|
|
*/
|
|
if (fbb_enable) {
|
|
- if (bus->parent) {
|
|
+ if (bus->self) {
|
|
u8 control;
|
|
/* enable on PPB */
|
|
(void) pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &control);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/parisc/sba_iommu.c linux-2.6.29-rc3.owrt/drivers/parisc/sba_iommu.c
|
|
--- linux-2.6.29.owrt/drivers/parisc/sba_iommu.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/parisc/sba_iommu.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -668,7 +668,7 @@
|
|
* @dev: instance of PCI owned by the driver that's asking
|
|
* @mask: number of address bits this PCI device can handle
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
static int sba_dma_supported( struct device *dev, u64 mask)
|
|
{
|
|
@@ -680,8 +680,8 @@
|
|
return(0);
|
|
}
|
|
|
|
- /* Documentation/PCI/PCI-DMA-mapping.txt tells drivers to try 64-bit
|
|
- * first, then fall back to 32-bit if that fails.
|
|
+ /* Documentation/DMA-mapping.txt tells drivers to try 64-bit first,
|
|
+ * then fall back to 32-bit if that fails.
|
|
* We are just "encouraging" 32-bit DMA masks here since we can
|
|
* never allow IOMMU bypass unless we add special support for ZX1.
|
|
*/
|
|
@@ -706,7 +706,7 @@
|
|
* @size: number of bytes to map in driver buffer.
|
|
* @direction: R/W or both.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
static dma_addr_t
|
|
sba_map_single(struct device *dev, void *addr, size_t size,
|
|
@@ -785,7 +785,7 @@
|
|
* @size: number of bytes mapped in driver buffer.
|
|
* @direction: R/W or both.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
static void
|
|
sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size,
|
|
@@ -861,7 +861,7 @@
|
|
* @size: number of bytes mapped in driver buffer.
|
|
* @dma_handle: IOVA of new buffer.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
static void *sba_alloc_consistent(struct device *hwdev, size_t size,
|
|
dma_addr_t *dma_handle, gfp_t gfp)
|
|
@@ -892,7 +892,7 @@
|
|
* @vaddr: virtual address IOVA of "consistent" buffer.
|
|
* @dma_handler: IO virtual address of "consistent" buffer.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
static void
|
|
sba_free_consistent(struct device *hwdev, size_t size, void *vaddr,
|
|
@@ -927,7 +927,7 @@
|
|
* @nents: number of entries in list
|
|
* @direction: R/W or both.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
static int
|
|
sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
|
|
@@ -1011,7 +1011,7 @@
|
|
* @nents: number of entries in list
|
|
* @direction: R/W or both.
|
|
*
|
|
- * See Documentation/PCI/PCI-DMA-mapping.txt
|
|
+ * See Documentation/DMA-mapping.txt
|
|
*/
|
|
static void
|
|
sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
|
|
@@ -1206,48 +1206,30 @@
|
|
return (void *) pdir_base;
|
|
}
|
|
|
|
-struct ibase_data_struct {
|
|
- struct ioc *ioc;
|
|
- int ioc_num;
|
|
-};
|
|
-
|
|
-static int setup_ibase_imask_callback(struct device *dev, void *data)
|
|
+static struct device *next_device(struct klist_iter *i)
|
|
{
|
|
- /* lba_set_iregs() is in drivers/parisc/lba_pci.c */
|
|
- extern void lba_set_iregs(struct parisc_device *, u32, u32);
|
|
- struct parisc_device *lba = to_parisc_device(dev);
|
|
- struct ibase_data_struct *ibd = data;
|
|
- int rope_num = (lba->hpa.start >> 13) & 0xf;
|
|
- if (rope_num >> 3 == ibd->ioc_num)
|
|
- lba_set_iregs(lba, ibd->ioc->ibase, ibd->ioc->imask);
|
|
- return 0;
|
|
+ struct klist_node * n = klist_next(i);
|
|
+ return n ? container_of(n, struct device, knode_parent) : NULL;
|
|
}
|
|
|
|
/* setup Mercury or Elroy IBASE/IMASK registers. */
|
|
static void
|
|
setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
|
|
{
|
|
- struct ibase_data_struct ibase_data = {
|
|
- .ioc = ioc,
|
|
- .ioc_num = ioc_num,
|
|
- };
|
|
-
|
|
- device_for_each_child(&sba->dev, &ibase_data,
|
|
- setup_ibase_imask_callback);
|
|
-}
|
|
-
|
|
-#ifdef SBA_AGP_SUPPORT
|
|
-static int
|
|
-sba_ioc_find_quicksilver(struct device *dev, void *data)
|
|
-{
|
|
- int *agp_found = data;
|
|
- struct parisc_device *lba = to_parisc_device(dev);
|
|
+ /* lba_set_iregs() is in drivers/parisc/lba_pci.c */
|
|
+ extern void lba_set_iregs(struct parisc_device *, u32, u32);
|
|
+ struct device *dev;
|
|
+ struct klist_iter i;
|
|
|
|
- if (IS_QUICKSILVER(lba))
|
|
- *agp_found = 1;
|
|
- return 0;
|
|
+ klist_iter_init(&sba->dev.klist_children, &i);
|
|
+ while ((dev = next_device(&i))) {
|
|
+ struct parisc_device *lba = to_parisc_device(dev);
|
|
+ int rope_num = (lba->hpa.start >> 13) & 0xf;
|
|
+ if (rope_num >> 3 == ioc_num)
|
|
+ lba_set_iregs(lba, ioc->ibase, ioc->imask);
|
|
+ }
|
|
+ klist_iter_exit(&i);
|
|
}
|
|
-#endif
|
|
|
|
static void
|
|
sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
|
|
@@ -1350,6 +1332,9 @@
|
|
WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM);
|
|
|
|
#ifdef SBA_AGP_SUPPORT
|
|
+{
|
|
+ struct klist_iter i;
|
|
+ struct device *dev = NULL;
|
|
|
|
/*
|
|
** If an AGP device is present, only use half of the IOV space
|
|
@@ -1359,7 +1344,13 @@
|
|
** We program the next pdir index after we stop w/ a key for
|
|
** the GART code to handshake on.
|
|
*/
|
|
- device_for_each_child(&sba->dev, &agp_found, sba_ioc_find_quicksilver);
|
|
+ klist_iter_init(&sba->dev.klist_children, &i);
|
|
+ while ((dev = next_device(&i))) {
|
|
+ struct parisc_device *lba = to_parisc_device(dev);
|
|
+ if (IS_QUICKSILVER(lba))
|
|
+ agp_found = 1;
|
|
+ }
|
|
+ klist_iter_exit(&i);
|
|
|
|
if (agp_found && sba_reserve_agpgart) {
|
|
printk(KERN_INFO "%s: reserving %dMb of IOVA space for agpgart\n",
|
|
@@ -1367,7 +1358,9 @@
|
|
ioc->pdir_size /= 2;
|
|
ioc->pdir_base[PDIR_INDEX(iova_space_size/2)] = SBA_AGPGART_COOKIE;
|
|
}
|
|
+}
|
|
#endif /*SBA_AGP_SUPPORT*/
|
|
+
|
|
}
|
|
|
|
static void
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/parport/parport_atari.c linux-2.6.29-rc3.owrt/drivers/parport/parport_atari.c
|
|
--- linux-2.6.29.owrt/drivers/parport/parport_atari.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/parport/parport_atari.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -84,7 +84,7 @@
|
|
static unsigned char
|
|
parport_atari_read_status(struct parport *p)
|
|
{
|
|
- return ((st_mfp.par_dt_reg & 1 ? 0 : PARPORT_STATUS_BUSY) |
|
|
+ return ((mfp.par_dt_reg & 1 ? 0 : PARPORT_STATUS_BUSY) |
|
|
PARPORT_STATUS_SELECT | PARPORT_STATUS_ERROR);
|
|
}
|
|
|
|
@@ -193,9 +193,9 @@
|
|
sound_ym.wd_data = sound_ym.rd_data_reg_sel | (1 << 5);
|
|
local_irq_restore(flags);
|
|
/* MFP port I0 as input. */
|
|
- st_mfp.data_dir &= ~1;
|
|
+ mfp.data_dir &= ~1;
|
|
/* MFP port I0 interrupt on high->low edge. */
|
|
- st_mfp.active_edge &= ~1;
|
|
+ mfp.active_edge &= ~1;
|
|
p = parport_register_port((unsigned long)&sound_ym.wd_data,
|
|
IRQ_MFP_BUSY, PARPORT_DMA_NONE,
|
|
&parport_atari_ops);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/parport/parport_serial.c linux-2.6.29-rc3.owrt/drivers/parport/parport_serial.c
|
|
--- linux-2.6.29.owrt/drivers/parport/parport_serial.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/parport/parport_serial.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -64,11 +64,6 @@
|
|
|
|
static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *card, int autoirq, int autodma)
|
|
{
|
|
- /* the rule described below doesn't hold for this device */
|
|
- if (dev->device == PCI_DEVICE_ID_NETMOS_9835 &&
|
|
- dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
|
|
- dev->subsystem_device == 0x0299)
|
|
- return -ENODEV;
|
|
/*
|
|
* Netmos uses the subdevice ID to indicate the number of parallel
|
|
* and serial ports. The form is 0x00PS, where <P> is the number of
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/dmar.c linux-2.6.29-rc3.owrt/drivers/pci/dmar.c
|
|
--- linux-2.6.29.owrt/drivers/pci/dmar.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/dmar.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -330,14 +330,6 @@
|
|
entry_header = (struct acpi_dmar_header *)(dmar + 1);
|
|
while (((unsigned long)entry_header) <
|
|
(((unsigned long)dmar) + dmar_tbl->length)) {
|
|
- /* Avoid looping forever on bad ACPI tables */
|
|
- if (entry_header->length == 0) {
|
|
- printk(KERN_WARNING PREFIX
|
|
- "Invalid 0-length structure\n");
|
|
- ret = -EINVAL;
|
|
- break;
|
|
- }
|
|
-
|
|
dmar_table_print_dmar_entry(entry_header);
|
|
|
|
switch (entry_header->type) {
|
|
@@ -499,7 +491,7 @@
|
|
int map_size;
|
|
u32 ver;
|
|
static int iommu_allocated = 0;
|
|
- int agaw = 0;
|
|
+ int agaw;
|
|
|
|
iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
|
|
if (!iommu)
|
|
@@ -515,7 +507,6 @@
|
|
iommu->cap = dmar_readq(iommu->reg + DMAR_CAP_REG);
|
|
iommu->ecap = dmar_readq(iommu->reg + DMAR_ECAP_REG);
|
|
|
|
-#ifdef CONFIG_DMAR
|
|
agaw = iommu_calculate_agaw(iommu);
|
|
if (agaw < 0) {
|
|
printk(KERN_ERR
|
|
@@ -523,7 +514,6 @@
|
|
iommu->seq_id);
|
|
goto error;
|
|
}
|
|
-#endif
|
|
iommu->agaw = agaw;
|
|
|
|
/* the registers might be more than one page */
|
|
@@ -581,49 +571,19 @@
|
|
}
|
|
}
|
|
|
|
-static int qi_check_fault(struct intel_iommu *iommu, int index)
|
|
-{
|
|
- u32 fault;
|
|
- int head;
|
|
- struct q_inval *qi = iommu->qi;
|
|
- int wait_index = (index + 1) % QI_LENGTH;
|
|
-
|
|
- fault = readl(iommu->reg + DMAR_FSTS_REG);
|
|
-
|
|
- /*
|
|
- * If IQE happens, the head points to the descriptor associated
|
|
- * with the error. No new descriptors are fetched until the IQE
|
|
- * is cleared.
|
|
- */
|
|
- if (fault & DMA_FSTS_IQE) {
|
|
- head = readl(iommu->reg + DMAR_IQH_REG);
|
|
- if ((head >> 4) == index) {
|
|
- memcpy(&qi->desc[index], &qi->desc[wait_index],
|
|
- sizeof(struct qi_desc));
|
|
- __iommu_flush_cache(iommu, &qi->desc[index],
|
|
- sizeof(struct qi_desc));
|
|
- writel(DMA_FSTS_IQE, iommu->reg + DMAR_FSTS_REG);
|
|
- return -EINVAL;
|
|
- }
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
/*
|
|
* Submit the queued invalidation descriptor to the remapping
|
|
* hardware unit and wait for its completion.
|
|
*/
|
|
-int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
|
|
+void qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
|
|
{
|
|
- int rc = 0;
|
|
struct q_inval *qi = iommu->qi;
|
|
struct qi_desc *hw, wait_desc;
|
|
int wait_index, index;
|
|
unsigned long flags;
|
|
|
|
if (!qi)
|
|
- return 0;
|
|
+ return;
|
|
|
|
hw = qi->desc;
|
|
|
|
@@ -641,8 +601,7 @@
|
|
|
|
hw[index] = *desc;
|
|
|
|
- wait_desc.low = QI_IWD_STATUS_DATA(QI_DONE) |
|
|
- QI_IWD_STATUS_WRITE | QI_IWD_TYPE;
|
|
+ wait_desc.low = QI_IWD_STATUS_DATA(2) | QI_IWD_STATUS_WRITE | QI_IWD_TYPE;
|
|
wait_desc.high = virt_to_phys(&qi->desc_status[wait_index]);
|
|
|
|
hw[wait_index] = wait_desc;
|
|
@@ -653,11 +612,13 @@
|
|
qi->free_head = (qi->free_head + 2) % QI_LENGTH;
|
|
qi->free_cnt -= 2;
|
|
|
|
+ spin_lock(&iommu->register_lock);
|
|
/*
|
|
* update the HW tail register indicating the presence of
|
|
* new descriptors.
|
|
*/
|
|
writel(qi->free_head << 4, iommu->reg + DMAR_IQT_REG);
|
|
+ spin_unlock(&iommu->register_lock);
|
|
|
|
while (qi->desc_status[wait_index] != QI_DONE) {
|
|
/*
|
|
@@ -667,21 +628,15 @@
|
|
* a deadlock where the interrupt context can wait indefinitely
|
|
* for free slots in the queue.
|
|
*/
|
|
- rc = qi_check_fault(iommu, index);
|
|
- if (rc)
|
|
- goto out;
|
|
-
|
|
spin_unlock(&qi->q_lock);
|
|
cpu_relax();
|
|
spin_lock(&qi->q_lock);
|
|
}
|
|
-out:
|
|
- qi->desc_status[index] = qi->desc_status[wait_index] = QI_DONE;
|
|
+
|
|
+ qi->desc_status[index] = QI_DONE;
|
|
|
|
reclaim_free_desc(qi);
|
|
spin_unlock_irqrestore(&qi->q_lock, flags);
|
|
-
|
|
- return rc;
|
|
}
|
|
|
|
/*
|
|
@@ -694,13 +649,13 @@
|
|
desc.low = QI_IEC_TYPE;
|
|
desc.high = 0;
|
|
|
|
- /* should never fail */
|
|
qi_submit_sync(&desc, iommu);
|
|
}
|
|
|
|
int qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid, u8 fm,
|
|
u64 type, int non_present_entry_flush)
|
|
{
|
|
+
|
|
struct qi_desc desc;
|
|
|
|
if (non_present_entry_flush) {
|
|
@@ -714,7 +669,10 @@
|
|
| QI_CC_GRAN(type) | QI_CC_TYPE;
|
|
desc.high = 0;
|
|
|
|
- return qi_submit_sync(&desc, iommu);
|
|
+ qi_submit_sync(&desc, iommu);
|
|
+
|
|
+ return 0;
|
|
+
|
|
}
|
|
|
|
int qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr,
|
|
@@ -744,7 +702,10 @@
|
|
desc.high = QI_IOTLB_ADDR(addr) | QI_IOTLB_IH(ih)
|
|
| QI_IOTLB_AM(size_order);
|
|
|
|
- return qi_submit_sync(&desc, iommu);
|
|
+ qi_submit_sync(&desc, iommu);
|
|
+
|
|
+ return 0;
|
|
+
|
|
}
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/hotplug/fakephp.c linux-2.6.29-rc3.owrt/drivers/pci/hotplug/fakephp.c
|
|
--- linux-2.6.29.owrt/drivers/pci/hotplug/fakephp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/fakephp.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -195,13 +195,13 @@
|
|
* Tries hard not to re-enable already existing devices;
|
|
* also handles scanning of subfunctions.
|
|
*/
|
|
-static int pci_rescan_slot(struct pci_dev *temp)
|
|
+static void pci_rescan_slot(struct pci_dev *temp)
|
|
{
|
|
struct pci_bus *bus = temp->bus;
|
|
struct pci_dev *dev;
|
|
int func;
|
|
+ int retval;
|
|
u8 hdr_type;
|
|
- int count = 0;
|
|
|
|
if (!pci_read_config_byte(temp, PCI_HEADER_TYPE, &hdr_type)) {
|
|
temp->hdr_type = hdr_type & 0x7f;
|
|
@@ -213,12 +213,17 @@
|
|
dbg("New device on %s function %x:%x\n",
|
|
bus->name, temp->devfn >> 3,
|
|
temp->devfn & 7);
|
|
- count++;
|
|
+ retval = pci_bus_add_device(dev);
|
|
+ if (retval)
|
|
+ dev_err(&dev->dev, "error adding "
|
|
+ "device, continuing.\n");
|
|
+ else
|
|
+ add_slot(dev);
|
|
}
|
|
}
|
|
/* multifunction device? */
|
|
if (!(hdr_type & 0x80))
|
|
- return count;
|
|
+ return;
|
|
|
|
/* continue scanning for other functions */
|
|
for (func = 1, temp->devfn++; func < 8; func++, temp->devfn++) {
|
|
@@ -234,13 +239,16 @@
|
|
dbg("New device on %s function %x:%x\n",
|
|
bus->name, temp->devfn >> 3,
|
|
temp->devfn & 7);
|
|
- count++;
|
|
+ retval = pci_bus_add_device(dev);
|
|
+ if (retval)
|
|
+ dev_err(&dev->dev, "error adding "
|
|
+ "device, continuing.\n");
|
|
+ else
|
|
+ add_slot(dev);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
- return count;
|
|
}
|
|
|
|
|
|
@@ -254,8 +262,6 @@
|
|
{
|
|
unsigned int devfn;
|
|
struct pci_dev *dev;
|
|
- int retval;
|
|
- int found = 0;
|
|
dev = alloc_pci_dev();
|
|
if (!dev)
|
|
return;
|
|
@@ -264,23 +270,7 @@
|
|
dev->sysdata = bus->sysdata;
|
|
for (devfn = 0; devfn < 0x100; devfn += 8) {
|
|
dev->devfn = devfn;
|
|
- found += pci_rescan_slot(dev);
|
|
- }
|
|
-
|
|
- if (found) {
|
|
- pci_bus_assign_resources(bus);
|
|
- list_for_each_entry(dev, &bus->devices, bus_list) {
|
|
- /* Skip already-added devices */
|
|
- if (dev->is_added)
|
|
- continue;
|
|
- retval = pci_bus_add_device(dev);
|
|
- if (retval)
|
|
- dev_err(&dev->dev,
|
|
- "Error adding device, continuing\n");
|
|
- else
|
|
- add_slot(dev);
|
|
- }
|
|
- pci_bus_add_devices(bus);
|
|
+ pci_rescan_slot(dev);
|
|
}
|
|
kfree(dev);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/hotplug/Kconfig linux-2.6.29-rc3.owrt/drivers/pci/hotplug/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/pci/hotplug/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -143,7 +143,7 @@
|
|
|
|
config HOTPLUG_PCI_RPA
|
|
tristate "RPA PCI Hotplug driver"
|
|
- depends on PPC_PSERIES && EEH && !HOTPLUG_PCI_FAKE
|
|
+ depends on PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE
|
|
help
|
|
Say Y here if you have a RPA system that supports PCI Hotplug.
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/hotplug/Makefile linux-2.6.29-rc3.owrt/drivers/pci/hotplug/Makefile
|
|
--- linux-2.6.29.owrt/drivers/pci/hotplug/Makefile 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -5,15 +5,11 @@
|
|
obj-$(CONFIG_HOTPLUG_PCI) += pci_hotplug.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_COMPAQ) += cpqphp.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_IBM) += ibmphp.o
|
|
-
|
|
-# pciehp should be linked before acpiphp in order to allow the native driver
|
|
-# to attempt to bind first. We can then fall back to generic support.
|
|
-
|
|
-obj-$(CONFIG_HOTPLUG_PCI_PCIE) += pciehp.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_ACPI) += acpiphp.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_ACPI_IBM) += acpiphp_ibm.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_CPCI_ZT5550) += cpcihp_zt5550.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_CPCI_GENERIC) += cpcihp_generic.o
|
|
+obj-$(CONFIG_HOTPLUG_PCI_PCIE) += pciehp.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_SHPC) += shpchp.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_RPA) += rpaphp.o
|
|
obj-$(CONFIG_HOTPLUG_PCI_RPA_DLPAR) += rpadlpar_io.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/hotplug/pciehp_core.c linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp_core.c
|
|
--- linux-2.6.29.owrt/drivers/pci/hotplug/pciehp_core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp_core.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -434,13 +434,6 @@
|
|
goto err_out_release_ctlr;
|
|
}
|
|
|
|
- /* Enable events after we have setup the data structures */
|
|
- rc = pcie_init_notification(ctrl);
|
|
- if (rc) {
|
|
- ctrl_err(ctrl, "Notification initialization failed\n");
|
|
- goto err_out_release_ctlr;
|
|
- }
|
|
-
|
|
/* Check if slot is occupied */
|
|
t_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);
|
|
t_slot->hpc_ops->get_adapter_status(t_slot, &value);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/hotplug/pciehp.h linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp.h
|
|
--- linux-2.6.29.owrt/drivers/pci/hotplug/pciehp.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -111,7 +111,6 @@
|
|
int cmd_busy;
|
|
unsigned int no_cmd_complete:1;
|
|
unsigned int link_active_reporting:1;
|
|
- unsigned int notification_enabled:1;
|
|
};
|
|
|
|
#define INT_BUTTON_IGNORE 0
|
|
@@ -171,7 +170,6 @@
|
|
extern int pciehp_unconfigure_device(struct slot *p_slot);
|
|
extern void pciehp_queue_pushbutton_work(struct work_struct *work);
|
|
struct controller *pcie_init(struct pcie_device *dev);
|
|
-int pcie_init_notification(struct controller *ctrl);
|
|
int pciehp_enable_slot(struct slot *p_slot);
|
|
int pciehp_disable_slot(struct slot *p_slot);
|
|
int pcie_enable_notification(struct controller *ctrl);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/hotplug/pciehp_hpc.c linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp_hpc.c
|
|
--- linux-2.6.29.owrt/drivers/pci/hotplug/pciehp_hpc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp_hpc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -934,7 +934,7 @@
|
|
ctrl_warn(ctrl, "Cannot disable software notification\n");
|
|
}
|
|
|
|
-int pcie_init_notification(struct controller *ctrl)
|
|
+static int pcie_init_notification(struct controller *ctrl)
|
|
{
|
|
if (pciehp_request_irq(ctrl))
|
|
return -1;
|
|
@@ -942,17 +942,13 @@
|
|
pciehp_free_irq(ctrl);
|
|
return -1;
|
|
}
|
|
- ctrl->notification_enabled = 1;
|
|
return 0;
|
|
}
|
|
|
|
static void pcie_shutdown_notification(struct controller *ctrl)
|
|
{
|
|
- if (ctrl->notification_enabled) {
|
|
- pcie_disable_notification(ctrl);
|
|
- pciehp_free_irq(ctrl);
|
|
- ctrl->notification_enabled = 0;
|
|
- }
|
|
+ pcie_disable_notification(ctrl);
|
|
+ pciehp_free_irq(ctrl);
|
|
}
|
|
|
|
static int pcie_init_slot(struct controller *ctrl)
|
|
@@ -1114,8 +1110,13 @@
|
|
if (pcie_init_slot(ctrl))
|
|
goto abort_ctrl;
|
|
|
|
+ if (pcie_init_notification(ctrl))
|
|
+ goto abort_slot;
|
|
+
|
|
return ctrl;
|
|
|
|
+abort_slot:
|
|
+ pcie_cleanup_slot(ctrl);
|
|
abort_ctrl:
|
|
kfree(ctrl);
|
|
abort:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/intel-iommu.c linux-2.6.29-rc3.owrt/drivers/pci/intel-iommu.c
|
|
--- linux-2.6.29.owrt/drivers/pci/intel-iommu.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/intel-iommu.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -61,8 +61,6 @@
|
|
/* global iommu list, set NULL for ignored DMAR units */
|
|
static struct intel_iommu **g_iommus;
|
|
|
|
-static int rwbf_quirk;
|
|
-
|
|
/*
|
|
* 0: Present
|
|
* 1-11: Reserved
|
|
@@ -270,12 +268,7 @@
|
|
|
|
static void domain_remove_dev_info(struct dmar_domain *domain);
|
|
|
|
-#ifdef CONFIG_DMAR_DEFAULT_ON
|
|
-int dmar_disabled = 0;
|
|
-#else
|
|
-int dmar_disabled = 1;
|
|
-#endif /*CONFIG_DMAR_DEFAULT_ON*/
|
|
-
|
|
+int dmar_disabled;
|
|
static int __initdata dmar_map_gfx = 1;
|
|
static int dmar_forcedac;
|
|
static int intel_iommu_strict;
|
|
@@ -291,12 +284,9 @@
|
|
if (!str)
|
|
return -EINVAL;
|
|
while (*str) {
|
|
- if (!strncmp(str, "on", 2)) {
|
|
- dmar_disabled = 0;
|
|
- printk(KERN_INFO "Intel-IOMMU: enabled\n");
|
|
- } else if (!strncmp(str, "off", 3)) {
|
|
+ if (!strncmp(str, "off", 3)) {
|
|
dmar_disabled = 1;
|
|
- printk(KERN_INFO "Intel-IOMMU: disabled\n");
|
|
+ printk(KERN_INFO"Intel-IOMMU: disabled\n");
|
|
} else if (!strncmp(str, "igfx_off", 8)) {
|
|
dmar_map_gfx = 0;
|
|
printk(KERN_INFO
|
|
@@ -787,7 +777,7 @@
|
|
u32 val;
|
|
unsigned long flag;
|
|
|
|
- if (!rwbf_quirk && !cap_rwbf(iommu->cap))
|
|
+ if (!cap_rwbf(iommu->cap))
|
|
return;
|
|
val = iommu->gcmd | DMA_GCMD_WBF;
|
|
|
|
@@ -3139,15 +3129,3 @@
|
|
.unmap = intel_iommu_unmap_range,
|
|
.iova_to_phys = intel_iommu_iova_to_phys,
|
|
};
|
|
-
|
|
-static void __devinit quirk_iommu_rwbf(struct pci_dev *dev)
|
|
-{
|
|
- /*
|
|
- * Mobile 4 Series Chipset neglects to set RWBF capability,
|
|
- * but needs it:
|
|
- */
|
|
- printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
|
|
- rwbf_quirk = 1;
|
|
-}
|
|
-
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/intr_remapping.c linux-2.6.29-rc3.owrt/drivers/pci/intr_remapping.c
|
|
--- linux-2.6.29.owrt/drivers/pci/intr_remapping.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/intr_remapping.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -207,7 +207,7 @@
|
|
return index;
|
|
}
|
|
|
|
-static int qi_flush_iec(struct intel_iommu *iommu, int index, int mask)
|
|
+static void qi_flush_iec(struct intel_iommu *iommu, int index, int mask)
|
|
{
|
|
struct qi_desc desc;
|
|
|
|
@@ -215,7 +215,7 @@
|
|
| QI_IEC_SELECTIVE;
|
|
desc.high = 0;
|
|
|
|
- return qi_submit_sync(&desc, iommu);
|
|
+ qi_submit_sync(&desc, iommu);
|
|
}
|
|
|
|
int map_irq_to_irte_handle(int irq, u16 *sub_handle)
|
|
@@ -283,7 +283,6 @@
|
|
|
|
int modify_irte(int irq, struct irte *irte_modified)
|
|
{
|
|
- int rc;
|
|
int index;
|
|
struct irte *irte;
|
|
struct intel_iommu *iommu;
|
|
@@ -304,15 +303,14 @@
|
|
set_64bit((unsigned long *)irte, irte_modified->low | (1 << 1));
|
|
__iommu_flush_cache(iommu, irte, sizeof(*irte));
|
|
|
|
- rc = qi_flush_iec(iommu, index, 0);
|
|
- spin_unlock(&irq_2_ir_lock);
|
|
+ qi_flush_iec(iommu, index, 0);
|
|
|
|
- return rc;
|
|
+ spin_unlock(&irq_2_ir_lock);
|
|
+ return 0;
|
|
}
|
|
|
|
int flush_irte(int irq)
|
|
{
|
|
- int rc;
|
|
int index;
|
|
struct intel_iommu *iommu;
|
|
struct irq_2_iommu *irq_iommu;
|
|
@@ -328,10 +326,10 @@
|
|
|
|
index = irq_iommu->irte_index + irq_iommu->sub_handle;
|
|
|
|
- rc = qi_flush_iec(iommu, index, irq_iommu->irte_mask);
|
|
+ qi_flush_iec(iommu, index, irq_iommu->irte_mask);
|
|
spin_unlock(&irq_2_ir_lock);
|
|
|
|
- return rc;
|
|
+ return 0;
|
|
}
|
|
|
|
struct intel_iommu *map_ioapic_to_ir(int apic)
|
|
@@ -357,7 +355,6 @@
|
|
|
|
int free_irte(int irq)
|
|
{
|
|
- int rc = 0;
|
|
int index, i;
|
|
struct irte *irte;
|
|
struct intel_iommu *iommu;
|
|
@@ -378,7 +375,7 @@
|
|
if (!irq_iommu->sub_handle) {
|
|
for (i = 0; i < (1 << irq_iommu->irte_mask); i++)
|
|
set_64bit((unsigned long *)irte, 0);
|
|
- rc = qi_flush_iec(iommu, index, irq_iommu->irte_mask);
|
|
+ qi_flush_iec(iommu, index, irq_iommu->irte_mask);
|
|
}
|
|
|
|
irq_iommu->iommu = NULL;
|
|
@@ -388,7 +385,7 @@
|
|
|
|
spin_unlock(&irq_2_ir_lock);
|
|
|
|
- return rc;
|
|
+ return 0;
|
|
}
|
|
|
|
static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/msi.c linux-2.6.29-rc3.owrt/drivers/pci/msi.c
|
|
--- linux-2.6.29.owrt/drivers/pci/msi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/msi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -103,14 +103,6 @@
|
|
}
|
|
}
|
|
|
|
-static inline __attribute_const__ u32 msi_mask(unsigned x)
|
|
-{
|
|
- /* Don't shift by >= width of type */
|
|
- if (x >= 5)
|
|
- return 0xffffffff;
|
|
- return (1 << (1 << x)) - 1;
|
|
-}
|
|
-
|
|
static void msix_flush_writes(struct irq_desc *desc)
|
|
{
|
|
struct msi_desc *entry;
|
|
@@ -415,7 +407,8 @@
|
|
|
|
/* All MSIs are unmasked by default, Mask them all */
|
|
pci_read_config_dword(dev, base, &maskbits);
|
|
- temp = msi_mask((control & PCI_MSI_FLAGS_QMASK) >> 1);
|
|
+ temp = (1 << multi_msi_capable(control));
|
|
+ temp = ((temp - 1) & ~temp);
|
|
maskbits |= temp;
|
|
pci_write_config_dword(dev, base, maskbits);
|
|
entry->msi_attrib.maskbits_mask = temp;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/pci.c linux-2.6.29-rc3.owrt/drivers/pci/pci.c
|
|
--- linux-2.6.29.owrt/drivers/pci/pci.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/pci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1393,35 +1393,35 @@
|
|
pci_power_t prev_state;
|
|
int error;
|
|
|
|
+ pci_restore_state(dev);
|
|
pci_update_current_state(dev, PCI_D0);
|
|
|
|
prev_state = dev->current_state;
|
|
if (prev_state == PCI_D0)
|
|
- goto Restore;
|
|
+ return 0;
|
|
|
|
error = pci_raw_set_power_state(dev, PCI_D0, false);
|
|
if (error)
|
|
return error;
|
|
|
|
- /*
|
|
- * This assumes that we won't get a bus in B2 or B3 from the BIOS, but
|
|
- * we've made this assumption forever and it appears to be universally
|
|
- * satisfied.
|
|
- */
|
|
- switch(prev_state) {
|
|
- case PCI_D3cold:
|
|
- case PCI_D3hot:
|
|
- mdelay(pci_pm_d3_delay);
|
|
- break;
|
|
- case PCI_D2:
|
|
- udelay(PCI_PM_D2_DELAY);
|
|
- break;
|
|
+ if (pci_is_bridge(dev)) {
|
|
+ if (prev_state > PCI_D1)
|
|
+ mdelay(PCI_PM_BUS_WAIT);
|
|
+ } else {
|
|
+ switch(prev_state) {
|
|
+ case PCI_D3cold:
|
|
+ case PCI_D3hot:
|
|
+ mdelay(pci_pm_d3_delay);
|
|
+ break;
|
|
+ case PCI_D2:
|
|
+ udelay(PCI_PM_D2_DELAY);
|
|
+ break;
|
|
+ }
|
|
}
|
|
|
|
- pci_update_current_state(dev, PCI_D0);
|
|
+ dev->current_state = PCI_D0;
|
|
|
|
- Restore:
|
|
- return dev->state_saved ? pci_restore_state(dev) : 0;
|
|
+ return 0;
|
|
}
|
|
|
|
/**
|
|
@@ -1540,21 +1540,16 @@
|
|
}
|
|
|
|
/**
|
|
- * __pci_request_region - Reserved PCI I/O and memory resource
|
|
+ * pci_request_region - Reserved PCI I/O and memory resource
|
|
* @pdev: PCI device whose resources are to be reserved
|
|
* @bar: BAR to be reserved
|
|
* @res_name: Name to be associated with resource.
|
|
- * @exclusive: whether the region access is exclusive or not
|
|
*
|
|
* Mark the PCI region associated with PCI device @pdev BR @bar as
|
|
* being reserved by owner @res_name. Do not access any
|
|
* address inside the PCI regions unless this call returns
|
|
* successfully.
|
|
*
|
|
- * If @exclusive is set, then the region is marked so that userspace
|
|
- * is explicitly not allowed to map the resource via /dev/mem or
|
|
- * sysfs MMIO access.
|
|
- *
|
|
* Returns 0 on success, or %EBUSY on error. A warning
|
|
* message is also printed on failure.
|
|
*/
|
|
@@ -1593,12 +1588,12 @@
|
|
}
|
|
|
|
/**
|
|
- * pci_request_region - Reserve PCI I/O and memory resource
|
|
+ * pci_request_region - Reserved PCI I/O and memory resource
|
|
* @pdev: PCI device whose resources are to be reserved
|
|
* @bar: BAR to be reserved
|
|
- * @res_name: Name to be associated with resource
|
|
+ * @res_name: Name to be associated with resource.
|
|
*
|
|
- * Mark the PCI region associated with PCI device @pdev BAR @bar as
|
|
+ * Mark the PCI region associated with PCI device @pdev BR @bar as
|
|
* being reserved by owner @res_name. Do not access any
|
|
* address inside the PCI regions unless this call returns
|
|
* successfully.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/pci-driver.c linux-2.6.29-rc3.owrt/drivers/pci/pci-driver.c
|
|
--- linux-2.6.29.owrt/drivers/pci/pci-driver.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/pci-driver.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -355,8 +355,6 @@
|
|
int i = 0;
|
|
|
|
if (drv && drv->suspend) {
|
|
- pci_power_t prev = pci_dev->current_state;
|
|
-
|
|
pci_dev->state_saved = false;
|
|
|
|
i = drv->suspend(pci_dev, state);
|
|
@@ -367,13 +365,8 @@
|
|
if (pci_dev->state_saved)
|
|
goto Fixup;
|
|
|
|
- if (pci_dev->current_state != PCI_D0
|
|
- && pci_dev->current_state != PCI_UNKNOWN) {
|
|
- WARN_ONCE(pci_dev->current_state != prev,
|
|
- "PCI PM: Device state not saved by %pF\n",
|
|
- drv->suspend);
|
|
+ if (WARN_ON_ONCE(pci_dev->current_state != PCI_D0))
|
|
goto Fixup;
|
|
- }
|
|
}
|
|
|
|
pci_save_state(pci_dev);
|
|
@@ -426,24 +419,38 @@
|
|
static void pci_pm_default_resume_noirq(struct pci_dev *pci_dev)
|
|
{
|
|
pci_restore_standard_config(pci_dev);
|
|
- pci_dev->state_saved = false;
|
|
pci_fixup_device(pci_fixup_resume_early, pci_dev);
|
|
}
|
|
|
|
-static void pci_pm_default_resume(struct pci_dev *pci_dev)
|
|
+static int pci_pm_default_resume(struct pci_dev *pci_dev)
|
|
{
|
|
pci_fixup_device(pci_fixup_resume, pci_dev);
|
|
|
|
if (!pci_is_bridge(pci_dev))
|
|
pci_enable_wake(pci_dev, PCI_D0, false);
|
|
+
|
|
+ return pci_pm_reenable_device(pci_dev);
|
|
+}
|
|
+
|
|
+static void pci_pm_default_suspend_generic(struct pci_dev *pci_dev)
|
|
+{
|
|
+ /* If device is enabled at this point, disable it */
|
|
+ pci_disable_enabled_device(pci_dev);
|
|
+ /*
|
|
+ * Save state with interrupts enabled, because in principle the bus the
|
|
+ * device is on may be put into a low power state after this code runs.
|
|
+ */
|
|
+ pci_save_state(pci_dev);
|
|
}
|
|
|
|
static void pci_pm_default_suspend(struct pci_dev *pci_dev)
|
|
{
|
|
- /* Disable non-bridge devices without PM support */
|
|
+ pci_pm_default_suspend_generic(pci_dev);
|
|
+
|
|
if (!pci_is_bridge(pci_dev))
|
|
- pci_disable_enabled_device(pci_dev);
|
|
- pci_save_state(pci_dev);
|
|
+ pci_prepare_to_sleep(pci_dev);
|
|
+
|
|
+ pci_fixup_device(pci_fixup_suspend, pci_dev);
|
|
}
|
|
|
|
static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
|
|
@@ -488,49 +495,21 @@
|
|
static int pci_pm_suspend(struct device *dev)
|
|
{
|
|
struct pci_dev *pci_dev = to_pci_dev(dev);
|
|
- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
|
+ struct device_driver *drv = dev->driver;
|
|
+ int error = 0;
|
|
|
|
if (pci_has_legacy_pm_support(pci_dev))
|
|
return pci_legacy_suspend(dev, PMSG_SUSPEND);
|
|
|
|
- if (!pm) {
|
|
- pci_pm_default_suspend(pci_dev);
|
|
- goto Fixup;
|
|
- }
|
|
-
|
|
- pci_dev->state_saved = false;
|
|
-
|
|
- if (pm->suspend) {
|
|
- pci_power_t prev = pci_dev->current_state;
|
|
- int error;
|
|
-
|
|
- error = pm->suspend(dev);
|
|
- suspend_report_result(pm->suspend, error);
|
|
- if (error)
|
|
- return error;
|
|
-
|
|
- if (pci_dev->state_saved)
|
|
- goto Fixup;
|
|
-
|
|
- if (pci_dev->current_state != PCI_D0
|
|
- && pci_dev->current_state != PCI_UNKNOWN) {
|
|
- WARN_ONCE(pci_dev->current_state != prev,
|
|
- "PCI PM: State of device not saved by %pF\n",
|
|
- pm->suspend);
|
|
- goto Fixup;
|
|
- }
|
|
- }
|
|
-
|
|
- if (!pci_dev->state_saved) {
|
|
- pci_save_state(pci_dev);
|
|
- if (!pci_is_bridge(pci_dev))
|
|
- pci_prepare_to_sleep(pci_dev);
|
|
+ if (drv && drv->pm && drv->pm->suspend) {
|
|
+ error = drv->pm->suspend(dev);
|
|
+ suspend_report_result(drv->pm->suspend, error);
|
|
}
|
|
|
|
- Fixup:
|
|
- pci_fixup_device(pci_fixup_suspend, pci_dev);
|
|
+ if (!error)
|
|
+ pci_pm_default_suspend(pci_dev);
|
|
|
|
- return 0;
|
|
+ return error;
|
|
}
|
|
|
|
static int pci_pm_suspend_noirq(struct device *dev)
|
|
@@ -573,29 +552,18 @@
|
|
static int pci_pm_resume(struct device *dev)
|
|
{
|
|
struct pci_dev *pci_dev = to_pci_dev(dev);
|
|
- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
|
+ struct device_driver *drv = dev->driver;
|
|
int error = 0;
|
|
|
|
- /*
|
|
- * This is necessary for the suspend error path in which resume is
|
|
- * called without restoring the standard config registers of the device.
|
|
- */
|
|
- if (pci_dev->state_saved)
|
|
- pci_restore_standard_config(pci_dev);
|
|
-
|
|
if (pci_has_legacy_pm_support(pci_dev))
|
|
return pci_legacy_resume(dev);
|
|
|
|
- pci_pm_default_resume(pci_dev);
|
|
+ error = pci_pm_default_resume(pci_dev);
|
|
|
|
- if (pm) {
|
|
- if (pm->resume)
|
|
- error = pm->resume(dev);
|
|
- } else {
|
|
- pci_pm_reenable_device(pci_dev);
|
|
- }
|
|
+ if (!error && drv && drv->pm && drv->pm->resume)
|
|
+ error = drv->pm->resume(dev);
|
|
|
|
- return 0;
|
|
+ return error;
|
|
}
|
|
|
|
#else /* !CONFIG_SUSPEND */
|
|
@@ -612,31 +580,21 @@
|
|
static int pci_pm_freeze(struct device *dev)
|
|
{
|
|
struct pci_dev *pci_dev = to_pci_dev(dev);
|
|
- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
|
+ struct device_driver *drv = dev->driver;
|
|
+ int error = 0;
|
|
|
|
if (pci_has_legacy_pm_support(pci_dev))
|
|
return pci_legacy_suspend(dev, PMSG_FREEZE);
|
|
|
|
- if (!pm) {
|
|
- pci_pm_default_suspend(pci_dev);
|
|
- return 0;
|
|
+ if (drv && drv->pm && drv->pm->freeze) {
|
|
+ error = drv->pm->freeze(dev);
|
|
+ suspend_report_result(drv->pm->freeze, error);
|
|
}
|
|
|
|
- pci_dev->state_saved = false;
|
|
-
|
|
- if (pm->freeze) {
|
|
- int error;
|
|
-
|
|
- error = pm->freeze(dev);
|
|
- suspend_report_result(pm->freeze, error);
|
|
- if (error)
|
|
- return error;
|
|
- }
|
|
-
|
|
- if (!pci_dev->state_saved)
|
|
- pci_save_state(pci_dev);
|
|
+ if (!error)
|
|
+ pci_pm_default_suspend_generic(pci_dev);
|
|
|
|
- return 0;
|
|
+ return error;
|
|
}
|
|
|
|
static int pci_pm_freeze_noirq(struct device *dev)
|
|
@@ -679,18 +637,16 @@
|
|
static int pci_pm_thaw(struct device *dev)
|
|
{
|
|
struct pci_dev *pci_dev = to_pci_dev(dev);
|
|
- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
|
+ struct device_driver *drv = dev->driver;
|
|
int error = 0;
|
|
|
|
if (pci_has_legacy_pm_support(pci_dev))
|
|
return pci_legacy_resume(dev);
|
|
|
|
- if (pm) {
|
|
- if (pm->thaw)
|
|
- error = pm->thaw(dev);
|
|
- } else {
|
|
- pci_pm_reenable_device(pci_dev);
|
|
- }
|
|
+ pci_pm_reenable_device(pci_dev);
|
|
+
|
|
+ if (drv && drv->pm && drv->pm->thaw)
|
|
+ error = drv->pm->thaw(dev);
|
|
|
|
return error;
|
|
}
|
|
@@ -698,29 +654,19 @@
|
|
static int pci_pm_poweroff(struct device *dev)
|
|
{
|
|
struct pci_dev *pci_dev = to_pci_dev(dev);
|
|
- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
|
+ struct device_driver *drv = dev->driver;
|
|
int error = 0;
|
|
|
|
if (pci_has_legacy_pm_support(pci_dev))
|
|
return pci_legacy_suspend(dev, PMSG_HIBERNATE);
|
|
|
|
- if (!pm) {
|
|
- pci_pm_default_suspend(pci_dev);
|
|
- goto Fixup;
|
|
+ if (drv && drv->pm && drv->pm->poweroff) {
|
|
+ error = drv->pm->poweroff(dev);
|
|
+ suspend_report_result(drv->pm->poweroff, error);
|
|
}
|
|
|
|
- pci_dev->state_saved = false;
|
|
-
|
|
- if (pm->poweroff) {
|
|
- error = pm->poweroff(dev);
|
|
- suspend_report_result(pm->poweroff, error);
|
|
- }
|
|
-
|
|
- if (!pci_dev->state_saved && !pci_is_bridge(pci_dev))
|
|
- pci_prepare_to_sleep(pci_dev);
|
|
-
|
|
- Fixup:
|
|
- pci_fixup_device(pci_fixup_suspend, pci_dev);
|
|
+ if (!error)
|
|
+ pci_pm_default_suspend(pci_dev);
|
|
|
|
return error;
|
|
}
|
|
@@ -761,27 +707,16 @@
|
|
static int pci_pm_restore(struct device *dev)
|
|
{
|
|
struct pci_dev *pci_dev = to_pci_dev(dev);
|
|
- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
|
+ struct device_driver *drv = dev->driver;
|
|
int error = 0;
|
|
|
|
- /*
|
|
- * This is necessary for the hibernation error path in which restore is
|
|
- * called without restoring the standard config registers of the device.
|
|
- */
|
|
- if (pci_dev->state_saved)
|
|
- pci_restore_standard_config(pci_dev);
|
|
-
|
|
if (pci_has_legacy_pm_support(pci_dev))
|
|
return pci_legacy_resume(dev);
|
|
|
|
- pci_pm_default_resume(pci_dev);
|
|
+ error = pci_pm_default_resume(pci_dev);
|
|
|
|
- if (pm) {
|
|
- if (pm->restore)
|
|
- error = pm->restore(dev);
|
|
- } else {
|
|
- pci_pm_reenable_device(pci_dev);
|
|
- }
|
|
+ if (!error && drv && drv->pm && drv->pm->restore)
|
|
+ error = drv->pm->restore(dev);
|
|
|
|
return error;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/pcie/aer/aerdrv_core.c linux-2.6.29-rc3.owrt/drivers/pci/pcie/aer/aerdrv_core.c
|
|
--- linux-2.6.29.owrt/drivers/pci/pcie/aer/aerdrv_core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/pcie/aer/aerdrv_core.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -108,37 +108,6 @@
|
|
}
|
|
#endif /* 0 */
|
|
|
|
-
|
|
-static void set_device_error_reporting(struct pci_dev *dev, void *data)
|
|
-{
|
|
- bool enable = *((bool *)data);
|
|
-
|
|
- if (dev->pcie_type != PCIE_RC_PORT &&
|
|
- dev->pcie_type != PCIE_SW_UPSTREAM_PORT &&
|
|
- dev->pcie_type != PCIE_SW_DOWNSTREAM_PORT)
|
|
- return;
|
|
-
|
|
- if (enable)
|
|
- pci_enable_pcie_error_reporting(dev);
|
|
- else
|
|
- pci_disable_pcie_error_reporting(dev);
|
|
-}
|
|
-
|
|
-/**
|
|
- * set_downstream_devices_error_reporting - enable/disable the error reporting bits on the root port and its downstream ports.
|
|
- * @dev: pointer to root port's pci_dev data structure
|
|
- * @enable: true = enable error reporting, false = disable error reporting.
|
|
- */
|
|
-static void set_downstream_devices_error_reporting(struct pci_dev *dev,
|
|
- bool enable)
|
|
-{
|
|
- set_device_error_reporting(dev, &enable);
|
|
-
|
|
- if (!dev->subordinate)
|
|
- return;
|
|
- pci_walk_bus(dev->subordinate, set_device_error_reporting, &enable);
|
|
-}
|
|
-
|
|
static int find_device_iter(struct device *device, void *data)
|
|
{
|
|
struct pci_dev *dev;
|
|
@@ -556,11 +525,15 @@
|
|
pci_read_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, ®32);
|
|
pci_write_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, reg32);
|
|
|
|
- /*
|
|
- * Enable error reporting for the root port device and downstream port
|
|
- * devices.
|
|
- */
|
|
- set_downstream_devices_error_reporting(pdev, true);
|
|
+ /* Enable Root Port device reporting error itself */
|
|
+ pci_read_config_word(pdev, pos+PCI_EXP_DEVCTL, ®16);
|
|
+ reg16 = reg16 |
|
|
+ PCI_EXP_DEVCTL_CERE |
|
|
+ PCI_EXP_DEVCTL_NFERE |
|
|
+ PCI_EXP_DEVCTL_FERE |
|
|
+ PCI_EXP_DEVCTL_URRE;
|
|
+ pci_write_config_word(pdev, pos+PCI_EXP_DEVCTL,
|
|
+ reg16);
|
|
|
|
/* Enable Root Port's interrupt in response to error messages */
|
|
pci_write_config_dword(pdev,
|
|
@@ -580,12 +553,6 @@
|
|
u32 reg32;
|
|
int pos;
|
|
|
|
- /*
|
|
- * Disable error reporting for the root port device and downstream port
|
|
- * devices.
|
|
- */
|
|
- set_downstream_devices_error_reporting(pdev, false);
|
|
-
|
|
pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
|
|
/* Disable Root's interrupt in response to error messages */
|
|
pci_write_config_dword(pdev, pos + PCI_ERR_ROOT_COMMAND, 0);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/pcie/aspm.c linux-2.6.29-rc3.owrt/drivers/pci/pcie/aspm.c
|
|
--- linux-2.6.29.owrt/drivers/pci/pcie/aspm.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/pcie/aspm.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -718,9 +718,9 @@
|
|
|
|
/*
|
|
* All PCIe functions are in one slot, remove one function will remove
|
|
- * the whole slot, so just wait until we are the last function left.
|
|
+ * the the whole slot, so just wait
|
|
*/
|
|
- if (!list_is_last(&pdev->bus_list, &parent->subordinate->devices))
|
|
+ if (!list_empty(&parent->subordinate->devices))
|
|
goto out;
|
|
|
|
/* All functions are removed, so just disable ASPM for the link */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/pcie/portdrv_pci.c linux-2.6.29-rc3.owrt/drivers/pci/pcie/portdrv_pci.c
|
|
--- linux-2.6.29.owrt/drivers/pci/pcie/portdrv_pci.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/pcie/portdrv_pci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -55,13 +55,25 @@
|
|
|
|
}
|
|
|
|
+static int pcie_portdrv_suspend_late(struct pci_dev *dev, pm_message_t state)
|
|
+{
|
|
+ return pci_save_state(dev);
|
|
+}
|
|
+
|
|
+static int pcie_portdrv_resume_early(struct pci_dev *dev)
|
|
+{
|
|
+ return pci_restore_state(dev);
|
|
+}
|
|
+
|
|
static int pcie_portdrv_resume(struct pci_dev *dev)
|
|
{
|
|
- pci_set_master(dev);
|
|
+ pcie_portdrv_restore_config(dev);
|
|
return pcie_port_device_resume(dev);
|
|
}
|
|
#else
|
|
#define pcie_portdrv_suspend NULL
|
|
+#define pcie_portdrv_suspend_late NULL
|
|
+#define pcie_portdrv_resume_early NULL
|
|
#define pcie_portdrv_resume NULL
|
|
#endif
|
|
|
|
@@ -97,13 +109,14 @@
|
|
|
|
pcie_portdrv_save_config(dev);
|
|
|
|
+ pci_enable_pcie_error_reporting(dev);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
static void pcie_portdrv_remove (struct pci_dev *dev)
|
|
{
|
|
pcie_port_device_remove(dev);
|
|
- pci_disable_device(dev);
|
|
kfree(pci_get_drvdata(dev));
|
|
}
|
|
|
|
@@ -279,6 +292,8 @@
|
|
.remove = pcie_portdrv_remove,
|
|
|
|
.suspend = pcie_portdrv_suspend,
|
|
+ .suspend_late = pcie_portdrv_suspend_late,
|
|
+ .resume_early = pcie_portdrv_resume_early,
|
|
.resume = pcie_portdrv_resume,
|
|
|
|
.err_handler = &pcie_portdrv_err_handler,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/pci.h linux-2.6.29-rc3.owrt/drivers/pci/pci.h
|
|
--- linux-2.6.29.owrt/drivers/pci/pci.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/pci.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -16,21 +16,21 @@
|
|
#endif
|
|
|
|
/**
|
|
- * struct pci_platform_pm_ops - Firmware PM callbacks
|
|
+ * Firmware PM callbacks
|
|
*
|
|
- * @is_manageable: returns 'true' if given device is power manageable by the
|
|
- * platform firmware
|
|
+ * @is_manageable - returns 'true' if given device is power manageable by the
|
|
+ * platform firmware
|
|
*
|
|
- * @set_state: invokes the platform firmware to set the device's power state
|
|
+ * @set_state - invokes the platform firmware to set the device's power state
|
|
*
|
|
- * @choose_state: returns PCI power state of given device preferred by the
|
|
- * platform; to be used during system-wide transitions from a
|
|
- * sleeping state to the working state and vice versa
|
|
+ * @choose_state - returns PCI power state of given device preferred by the
|
|
+ * platform; to be used during system-wide transitions from a
|
|
+ * sleeping state to the working state and vice versa
|
|
*
|
|
- * @can_wakeup: returns 'true' if given device is capable of waking up the
|
|
- * system from a sleeping state
|
|
+ * @can_wakeup - returns 'true' if given device is capable of waking up the
|
|
+ * system from a sleeping state
|
|
*
|
|
- * @sleep_wake: enables/disables the system wake up capability of given device
|
|
+ * @sleep_wake - enables/disables the system wake up capability of given device
|
|
*
|
|
* If given platform is generally capable of power managing PCI devices, all of
|
|
* these callbacks are mandatory.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/pci-sysfs.c linux-2.6.29-rc3.owrt/drivers/pci/pci-sysfs.c
|
|
--- linux-2.6.29.owrt/drivers/pci/pci-sysfs.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/pci-sysfs.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -768,8 +768,8 @@
|
|
return -EINVAL;
|
|
|
|
rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */
|
|
- if (!rom || !size)
|
|
- return -EIO;
|
|
+ if (!rom)
|
|
+ return 0;
|
|
|
|
if (off >= size)
|
|
count = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/quirks.c linux-2.6.29-rc3.owrt/drivers/pci/quirks.c
|
|
--- linux-2.6.29.owrt/drivers/pci/quirks.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/quirks.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -23,7 +23,6 @@
|
|
#include <linux/acpi.h>
|
|
#include <linux/kallsyms.h>
|
|
#include <linux/dmi.h>
|
|
-#include <linux/pci-aspm.h>
|
|
#include "pci.h"
|
|
|
|
int isa_dma_bridge_buggy;
|
|
@@ -1585,7 +1584,6 @@
|
|
*/
|
|
#define AMD_813X_MISC 0x40
|
|
#define AMD_813X_NOIOAMODE (1<<0)
|
|
-#define AMD_813X_REV_B2 0x13
|
|
|
|
static void quirk_disable_amd_813x_boot_interrupt(struct pci_dev *dev)
|
|
{
|
|
@@ -1593,8 +1591,6 @@
|
|
|
|
if (noioapicquirk)
|
|
return;
|
|
- if (dev->revision == AMD_813X_REV_B2)
|
|
- return;
|
|
|
|
pci_read_config_dword(dev, AMD_813X_MISC, &pci_config_dword);
|
|
pci_config_dword &= ~AMD_813X_NOIOAMODE;
|
|
@@ -1750,30 +1746,6 @@
|
|
}
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt);
|
|
|
|
-/*
|
|
- * The 82575 and 82598 may experience data corruption issues when transitioning
|
|
- * out of L0S. To prevent this we need to disable L0S on the pci-e link
|
|
- */
|
|
-static void __devinit quirk_disable_aspm_l0s(struct pci_dev *dev)
|
|
-{
|
|
- dev_info(&dev->dev, "Disabling L0s\n");
|
|
- pci_disable_link_state(dev, PCIE_LINK_STATE_L0S);
|
|
-}
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a7, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a9, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10b6, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c6, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c7, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c8, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10d6, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10db, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10dd, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10e1, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10ec, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f1, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f4, quirk_disable_aspm_l0s);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1508, quirk_disable_aspm_l0s);
|
|
-
|
|
static void __devinit fixup_rev1_53c810(struct pci_dev* dev)
|
|
{
|
|
/* rev 1 ncr53c810 chips don't set the class at all which means
|
|
@@ -2009,6 +1981,7 @@
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE,
|
|
quirk_msi_ht_cap);
|
|
|
|
+
|
|
/* The nVidia CK804 chipset may have 2 HT MSI mappings.
|
|
* MSI are supported if the MSI capability set in any of these mappings.
|
|
*/
|
|
@@ -2059,9 +2032,6 @@
|
|
PCI_DEVICE_ID_SERVERWORKS_HT1000_PXB,
|
|
ht_enable_msi_mapping);
|
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8132_BRIDGE,
|
|
- ht_enable_msi_mapping);
|
|
-
|
|
/* The P5N32-SLI Premium motherboard from Asus has a problem with msi
|
|
* for the MCP55 NIC. It is not yet determined whether the msi problem
|
|
* also affects other devices. As for now, turn off msi for this device.
|
|
@@ -2078,104 +2048,10 @@
|
|
PCI_DEVICE_ID_NVIDIA_NVENET_15,
|
|
nvenet_msi_disable);
|
|
|
|
-static void __devinit nv_ht_enable_msi_mapping(struct pci_dev *dev)
|
|
-{
|
|
- struct pci_dev *host_bridge;
|
|
- int pos;
|
|
- int i, dev_no;
|
|
- int found = 0;
|
|
-
|
|
- dev_no = dev->devfn >> 3;
|
|
- for (i = dev_no; i >= 0; i--) {
|
|
- host_bridge = pci_get_slot(dev->bus, PCI_DEVFN(i, 0));
|
|
- if (!host_bridge)
|
|
- continue;
|
|
-
|
|
- pos = pci_find_ht_capability(host_bridge, HT_CAPTYPE_SLAVE);
|
|
- if (pos != 0) {
|
|
- found = 1;
|
|
- break;
|
|
- }
|
|
- pci_dev_put(host_bridge);
|
|
- }
|
|
-
|
|
- if (!found)
|
|
- return;
|
|
-
|
|
- /* root did that ! */
|
|
- if (msi_ht_cap_enabled(host_bridge))
|
|
- goto out;
|
|
-
|
|
- ht_enable_msi_mapping(dev);
|
|
-
|
|
-out:
|
|
- pci_dev_put(host_bridge);
|
|
-}
|
|
-
|
|
-static void __devinit ht_disable_msi_mapping(struct pci_dev *dev)
|
|
-{
|
|
- int pos, ttl = 48;
|
|
-
|
|
- pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
|
|
- while (pos && ttl--) {
|
|
- u8 flags;
|
|
-
|
|
- if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
|
|
- &flags) == 0) {
|
|
- dev_info(&dev->dev, "Disabling HT MSI Mapping\n");
|
|
-
|
|
- pci_write_config_byte(dev, pos + HT_MSI_FLAGS,
|
|
- flags & ~HT_MSI_FLAGS_ENABLE);
|
|
- }
|
|
- pos = pci_find_next_ht_capability(dev, pos,
|
|
- HT_CAPTYPE_MSI_MAPPING);
|
|
- }
|
|
-}
|
|
-
|
|
-static int __devinit ht_check_msi_mapping(struct pci_dev *dev)
|
|
-{
|
|
- int pos, ttl = 48;
|
|
- int found = 0;
|
|
-
|
|
- /* check if there is HT MSI cap or enabled on this device */
|
|
- pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
|
|
- while (pos && ttl--) {
|
|
- u8 flags;
|
|
-
|
|
- if (found < 1)
|
|
- found = 1;
|
|
- if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
|
|
- &flags) == 0) {
|
|
- if (flags & HT_MSI_FLAGS_ENABLE) {
|
|
- if (found < 2) {
|
|
- found = 2;
|
|
- break;
|
|
- }
|
|
- }
|
|
- }
|
|
- pos = pci_find_next_ht_capability(dev, pos,
|
|
- HT_CAPTYPE_MSI_MAPPING);
|
|
- }
|
|
-
|
|
- return found;
|
|
-}
|
|
-
|
|
static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev)
|
|
{
|
|
struct pci_dev *host_bridge;
|
|
- int pos;
|
|
- int found;
|
|
-
|
|
- /* Enabling HT MSI mapping on this device breaks MCP51 */
|
|
- if (dev->device == 0x270)
|
|
- return;
|
|
-
|
|
- /* check if there is HT MSI cap or enabled on this device */
|
|
- found = ht_check_msi_mapping(dev);
|
|
-
|
|
- /* no HT MSI CAP */
|
|
- if (found == 0)
|
|
- return;
|
|
+ int pos, ttl = 48;
|
|
|
|
/*
|
|
* HT MSI mapping should be disabled on devices that are below
|
|
@@ -2191,19 +2067,24 @@
|
|
pos = pci_find_ht_capability(host_bridge, HT_CAPTYPE_SLAVE);
|
|
if (pos != 0) {
|
|
/* Host bridge is to HT */
|
|
- if (found == 1) {
|
|
- /* it is not enabled, try to enable it */
|
|
- nv_ht_enable_msi_mapping(dev);
|
|
- }
|
|
+ ht_enable_msi_mapping(dev);
|
|
return;
|
|
}
|
|
|
|
- /* HT MSI is not enabled */
|
|
- if (found == 1)
|
|
- return;
|
|
-
|
|
/* Host bridge is not to HT, disable HT MSI mapping on this device */
|
|
- ht_disable_msi_mapping(dev);
|
|
+ pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
|
|
+ while (pos && ttl--) {
|
|
+ u8 flags;
|
|
+
|
|
+ if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
|
|
+ &flags) == 0) {
|
|
+ dev_info(&dev->dev, "Disabling HT MSI mapping");
|
|
+ pci_write_config_byte(dev, pos + HT_MSI_FLAGS,
|
|
+ flags & ~HT_MSI_FLAGS_ENABLE);
|
|
+ }
|
|
+ pos = pci_find_next_ht_capability(dev, pos,
|
|
+ HT_CAPTYPE_MSI_MAPPING);
|
|
+ }
|
|
}
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk);
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/pci/rom.c linux-2.6.29-rc3.owrt/drivers/pci/rom.c
|
|
--- linux-2.6.29.owrt/drivers/pci/rom.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/pci/rom.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -55,7 +55,6 @@
|
|
|
|
/**
|
|
* pci_get_rom_size - obtain the actual size of the ROM image
|
|
- * @pdev: target PCI device
|
|
* @rom: kernel virtual pointer to image of ROM
|
|
* @size: size of PCI window
|
|
* return: size of actual ROM image
|
|
@@ -64,7 +63,7 @@
|
|
* The PCI window size could be much larger than the
|
|
* actual image size.
|
|
*/
|
|
-size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
|
|
+size_t pci_get_rom_size(void __iomem *rom, size_t size)
|
|
{
|
|
void __iomem *image;
|
|
int last_image;
|
|
@@ -73,10 +72,8 @@
|
|
do {
|
|
void __iomem *pds;
|
|
/* Standard PCI ROMs start out with these bytes 55 AA */
|
|
- if (readb(image) != 0x55) {
|
|
- dev_err(&pdev->dev, "Invalid ROM contents\n");
|
|
+ if (readb(image) != 0x55)
|
|
break;
|
|
- }
|
|
if (readb(image + 1) != 0xAA)
|
|
break;
|
|
/* get the PCI data structure and check its signature */
|
|
@@ -162,7 +159,7 @@
|
|
* size is much larger than the actual size of the ROM.
|
|
* True size is important if the ROM is going to be copied.
|
|
*/
|
|
- *size = pci_get_rom_size(pdev, rom, *size);
|
|
+ *size = pci_get_rom_size(rom, *size);
|
|
return rom;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/acer-wmi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/acer-wmi.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/acer-wmi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/acer-wmi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1026,7 +1026,7 @@
|
|
kfree(wireless_rfkill->data);
|
|
rfkill_unregister(wireless_rfkill);
|
|
if (has_cap(ACER_CAP_BLUETOOTH)) {
|
|
- kfree(bluetooth_rfkill->data);
|
|
+ kfree(wireless_rfkill->data);
|
|
rfkill_unregister(bluetooth_rfkill);
|
|
}
|
|
return;
|
|
@@ -1297,7 +1297,7 @@
|
|
|
|
set_quirks();
|
|
|
|
- if (acpi_video_backlight_support() && has_cap(ACER_CAP_BRIGHTNESS)) {
|
|
+ if (!acpi_video_backlight_support() && has_cap(ACER_CAP_BRIGHTNESS)) {
|
|
interface->capability &= ~ACER_CAP_BRIGHTNESS;
|
|
printk(ACER_INFO "Brightness must be controlled by "
|
|
"generic video driver\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/asus_acpi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/asus_acpi.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/asus_acpi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/asus_acpi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -143,7 +143,6 @@
|
|
S1300N, S5200N*/
|
|
A4S, /* Z81sp */
|
|
F3Sa, /* (Centrino) */
|
|
- R1F,
|
|
END_MODEL
|
|
} model; /* Models currently supported */
|
|
u16 event_count[128]; /* Count for each event TODO make this better */
|
|
@@ -421,18 +420,7 @@
|
|
.display_get = "\\ADVG",
|
|
.display_set = "SDSP",
|
|
},
|
|
- {
|
|
- .name = "R1F",
|
|
- .mt_bt_switch = "BLED",
|
|
- .mt_mled = "MLED",
|
|
- .mt_wled = "WLED",
|
|
- .mt_lcd_switch = "\\Q10",
|
|
- .lcd_status = "\\GP06",
|
|
- .brightness_set = "SPLV",
|
|
- .brightness_get = "GPLV",
|
|
- .display_set = "SDSP",
|
|
- .display_get = "\\INFB"
|
|
- }
|
|
+
|
|
};
|
|
|
|
/* procdir we use */
|
|
@@ -1177,8 +1165,6 @@
|
|
return W3V;
|
|
else if (strncmp(model, "W5A", 3) == 0)
|
|
return W5A;
|
|
- else if (strncmp(model, "R1F", 3) == 0)
|
|
- return R1F;
|
|
else if (strncmp(model, "A4S", 3) == 0)
|
|
return A4S;
|
|
else if (strncmp(model, "F3Sa", 4) == 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/asus-laptop.c linux-2.6.29-rc3.owrt/drivers/platform/x86/asus-laptop.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/asus-laptop.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/asus-laptop.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -46,7 +46,6 @@
|
|
#include <acpi/acpi_drivers.h>
|
|
#include <acpi/acpi_bus.h>
|
|
#include <asm/uaccess.h>
|
|
-#include <linux/input.h>
|
|
|
|
#define ASUS_LAPTOP_VERSION "0.42"
|
|
|
|
@@ -182,8 +181,6 @@
|
|
u8 light_level; //light sensor level
|
|
u8 light_switch; //light sensor switch value
|
|
u16 event_count[128]; //count for each event TODO make this better
|
|
- struct input_dev *inputdev;
|
|
- u16 *keycode_map;
|
|
};
|
|
|
|
/*
|
|
@@ -253,37 +250,6 @@
|
|
ASUS_LED(pled, "phone");
|
|
ASUS_LED(gled, "gaming");
|
|
|
|
-struct key_entry {
|
|
- char type;
|
|
- u8 code;
|
|
- u16 keycode;
|
|
-};
|
|
-
|
|
-enum { KE_KEY, KE_END };
|
|
-
|
|
-static struct key_entry asus_keymap[] = {
|
|
- {KE_KEY, 0x30, KEY_VOLUMEUP},
|
|
- {KE_KEY, 0x31, KEY_VOLUMEDOWN},
|
|
- {KE_KEY, 0x32, KEY_MUTE},
|
|
- {KE_KEY, 0x33, KEY_SWITCHVIDEOMODE},
|
|
- {KE_KEY, 0x34, KEY_SWITCHVIDEOMODE},
|
|
- {KE_KEY, 0x40, KEY_PREVIOUSSONG},
|
|
- {KE_KEY, 0x41, KEY_NEXTSONG},
|
|
- {KE_KEY, 0x43, KEY_STOP},
|
|
- {KE_KEY, 0x45, KEY_PLAYPAUSE},
|
|
- {KE_KEY, 0x50, KEY_EMAIL},
|
|
- {KE_KEY, 0x51, KEY_WWW},
|
|
- {KE_KEY, 0x5C, BTN_EXTRA}, /* Performance */
|
|
- {KE_KEY, 0x5D, KEY_WLAN},
|
|
- {KE_KEY, 0x61, KEY_SWITCHVIDEOMODE},
|
|
- {KE_KEY, 0x6B, BTN_TOUCH}, /* Lock Mouse */
|
|
- {KE_KEY, 0x82, KEY_CAMERA},
|
|
- {KE_KEY, 0x8A, KEY_TV},
|
|
- {KE_KEY, 0x95, KEY_MEDIA},
|
|
- {KE_KEY, 0x99, KEY_PHONE},
|
|
- {KE_END, 0},
|
|
-};
|
|
-
|
|
/*
|
|
* This function evaluates an ACPI method, given an int as parameter, the
|
|
* method is searched within the scope of the handle, can be NULL. The output
|
|
@@ -754,69 +720,8 @@
|
|
return store_status(buf, count, NULL, GPS_ON);
|
|
}
|
|
|
|
-/*
|
|
- * Hotkey functions
|
|
- */
|
|
-static struct key_entry *asus_get_entry_by_scancode(int code)
|
|
-{
|
|
- struct key_entry *key;
|
|
-
|
|
- for (key = asus_keymap; key->type != KE_END; key++)
|
|
- if (code == key->code)
|
|
- return key;
|
|
-
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-static struct key_entry *asus_get_entry_by_keycode(int code)
|
|
-{
|
|
- struct key_entry *key;
|
|
-
|
|
- for (key = asus_keymap; key->type != KE_END; key++)
|
|
- if (code == key->keycode && key->type == KE_KEY)
|
|
- return key;
|
|
-
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-static int asus_getkeycode(struct input_dev *dev, int scancode, int *keycode)
|
|
-{
|
|
- struct key_entry *key = asus_get_entry_by_scancode(scancode);
|
|
-
|
|
- if (key && key->type == KE_KEY) {
|
|
- *keycode = key->keycode;
|
|
- return 0;
|
|
- }
|
|
-
|
|
- return -EINVAL;
|
|
-}
|
|
-
|
|
-static int asus_setkeycode(struct input_dev *dev, int scancode, int keycode)
|
|
-{
|
|
- struct key_entry *key;
|
|
- int old_keycode;
|
|
-
|
|
- if (keycode < 0 || keycode > KEY_MAX)
|
|
- return -EINVAL;
|
|
-
|
|
- key = asus_get_entry_by_scancode(scancode);
|
|
- if (key && key->type == KE_KEY) {
|
|
- old_keycode = key->keycode;
|
|
- key->keycode = keycode;
|
|
- set_bit(keycode, dev->keybit);
|
|
- if (!asus_get_entry_by_keycode(old_keycode))
|
|
- clear_bit(old_keycode, dev->keybit);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- return -EINVAL;
|
|
-}
|
|
-
|
|
static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
|
|
{
|
|
- static struct key_entry *key;
|
|
- u16 count;
|
|
-
|
|
/* TODO Find a better way to handle events count. */
|
|
if (!hotk)
|
|
return;
|
|
@@ -833,26 +738,10 @@
|
|
lcd_blank(FB_BLANK_POWERDOWN);
|
|
}
|
|
|
|
- count = hotk->event_count[event % 128]++;
|
|
- acpi_bus_generate_proc_event(hotk->device, event, count);
|
|
- acpi_bus_generate_netlink_event(hotk->device->pnp.device_class,
|
|
- dev_name(&hotk->device->dev), event,
|
|
- count);
|
|
-
|
|
- if (hotk->inputdev) {
|
|
- key = asus_get_entry_by_scancode(event);
|
|
- if (!key)
|
|
- return ;
|
|
-
|
|
- switch (key->type) {
|
|
- case KE_KEY:
|
|
- input_report_key(hotk->inputdev, key->keycode, 1);
|
|
- input_sync(hotk->inputdev);
|
|
- input_report_key(hotk->inputdev, key->keycode, 0);
|
|
- input_sync(hotk->inputdev);
|
|
- break;
|
|
- }
|
|
- }
|
|
+ acpi_bus_generate_proc_event(hotk->device, event,
|
|
+ hotk->event_count[event % 128]++);
|
|
+
|
|
+ return;
|
|
}
|
|
|
|
#define ASUS_CREATE_DEVICE_ATTR(_name) \
|
|
@@ -1070,38 +959,6 @@
|
|
return AE_OK;
|
|
}
|
|
|
|
-static int asus_input_init(void)
|
|
-{
|
|
- const struct key_entry *key;
|
|
- int result;
|
|
-
|
|
- hotk->inputdev = input_allocate_device();
|
|
- if (!hotk->inputdev) {
|
|
- printk(ASUS_INFO "Unable to allocate input device\n");
|
|
- return 0;
|
|
- }
|
|
- hotk->inputdev->name = "Asus Laptop extra buttons";
|
|
- hotk->inputdev->phys = ASUS_HOTK_FILE "/input0";
|
|
- hotk->inputdev->id.bustype = BUS_HOST;
|
|
- hotk->inputdev->getkeycode = asus_getkeycode;
|
|
- hotk->inputdev->setkeycode = asus_setkeycode;
|
|
-
|
|
- for (key = asus_keymap; key->type != KE_END; key++) {
|
|
- switch (key->type) {
|
|
- case KE_KEY:
|
|
- set_bit(EV_KEY, hotk->inputdev->evbit);
|
|
- set_bit(key->keycode, hotk->inputdev->keybit);
|
|
- break;
|
|
- }
|
|
- }
|
|
- result = input_register_device(hotk->inputdev);
|
|
- if (result) {
|
|
- printk(ASUS_INFO "Unable to register input device\n");
|
|
- input_free_device(hotk->inputdev);
|
|
- }
|
|
- return result;
|
|
-}
|
|
-
|
|
static int asus_hotk_check(void)
|
|
{
|
|
int result = 0;
|
|
@@ -1187,7 +1044,7 @@
|
|
/* GPS is on by default */
|
|
write_status(NULL, 1, GPS_ON);
|
|
|
|
-end:
|
|
+ end:
|
|
if (result) {
|
|
kfree(hotk->name);
|
|
kfree(hotk);
|
|
@@ -1234,17 +1091,10 @@
|
|
ASUS_LED_UNREGISTER(gled);
|
|
}
|
|
|
|
-static void asus_input_exit(void)
|
|
-{
|
|
- if (hotk->inputdev)
|
|
- input_unregister_device(hotk->inputdev);
|
|
-}
|
|
-
|
|
static void __exit asus_laptop_exit(void)
|
|
{
|
|
asus_backlight_exit();
|
|
asus_led_exit();
|
|
- asus_input_exit();
|
|
|
|
acpi_bus_unregister_driver(&asus_hotk_driver);
|
|
sysfs_remove_group(&asuspf_device->dev.kobj, &asuspf_attribute_group);
|
|
@@ -1366,10 +1216,6 @@
|
|
printk(ASUS_INFO "Brightness ignored, must be controlled by "
|
|
"ACPI video driver\n");
|
|
|
|
- result = asus_input_init();
|
|
- if (result)
|
|
- goto fail_input;
|
|
-
|
|
result = asus_led_init(dev);
|
|
if (result)
|
|
goto fail_led;
|
|
@@ -1396,25 +1242,22 @@
|
|
|
|
return 0;
|
|
|
|
-fail_sysfs:
|
|
+ fail_sysfs:
|
|
platform_device_del(asuspf_device);
|
|
|
|
-fail_platform_device2:
|
|
+ fail_platform_device2:
|
|
platform_device_put(asuspf_device);
|
|
|
|
-fail_platform_device1:
|
|
+ fail_platform_device1:
|
|
platform_driver_unregister(&asuspf_driver);
|
|
|
|
-fail_platform_driver:
|
|
+ fail_platform_driver:
|
|
asus_led_exit();
|
|
|
|
-fail_led:
|
|
- asus_input_exit();
|
|
-
|
|
-fail_input:
|
|
+ fail_led:
|
|
asus_backlight_exit();
|
|
|
|
-fail_backlight:
|
|
+ fail_backlight:
|
|
|
|
return result;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/eeepc-laptop.c linux-2.6.29-rc3.owrt/drivers/platform/x86/eeepc-laptop.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/eeepc-laptop.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/eeepc-laptop.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -30,7 +30,6 @@
|
|
#include <linux/uaccess.h>
|
|
#include <linux/input.h>
|
|
#include <linux/rfkill.h>
|
|
-#include <linux/pci.h>
|
|
|
|
#define EEEPC_LAPTOP_VERSION "0.1"
|
|
|
|
@@ -162,10 +161,6 @@
|
|
{KE_KEY, 0x13, KEY_MUTE },
|
|
{KE_KEY, 0x14, KEY_VOLUMEDOWN },
|
|
{KE_KEY, 0x15, KEY_VOLUMEUP },
|
|
- {KE_KEY, 0x1a, KEY_COFFEE },
|
|
- {KE_KEY, 0x1b, KEY_ZOOM },
|
|
- {KE_KEY, 0x1c, KEY_PROG2 },
|
|
- {KE_KEY, 0x1d, KEY_PROG3 },
|
|
{KE_KEY, 0x30, KEY_SWITCHVIDEOMODE },
|
|
{KE_KEY, 0x31, KEY_SWITCHVIDEOMODE },
|
|
{KE_KEY, 0x32, KEY_SWITCHVIDEOMODE },
|
|
@@ -515,59 +510,18 @@
|
|
static void notify_brn(void)
|
|
{
|
|
struct backlight_device *bd = eeepc_backlight_device;
|
|
- if (bd)
|
|
- bd->props.brightness = read_brightness(bd);
|
|
-}
|
|
-
|
|
-static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
|
|
-{
|
|
- struct pci_dev *dev;
|
|
- struct pci_bus *bus = pci_find_bus(0, 1);
|
|
-
|
|
- if (event != ACPI_NOTIFY_BUS_CHECK)
|
|
- return;
|
|
-
|
|
- if (!bus) {
|
|
- printk(EEEPC_WARNING "Unable to find PCI bus 1?\n");
|
|
- return;
|
|
- }
|
|
-
|
|
- if (get_acpi(CM_ASL_WLAN) == 1) {
|
|
- dev = pci_get_slot(bus, 0);
|
|
- if (dev) {
|
|
- /* Device already present */
|
|
- pci_dev_put(dev);
|
|
- return;
|
|
- }
|
|
- dev = pci_scan_single_device(bus, 0);
|
|
- if (dev) {
|
|
- pci_bus_assign_resources(bus);
|
|
- if (pci_bus_add_device(dev))
|
|
- printk(EEEPC_ERR "Unable to hotplug wifi\n");
|
|
- }
|
|
- } else {
|
|
- dev = pci_get_slot(bus, 0);
|
|
- if (dev) {
|
|
- pci_remove_bus_device(dev);
|
|
- pci_dev_put(dev);
|
|
- }
|
|
- }
|
|
+ bd->props.brightness = read_brightness(bd);
|
|
}
|
|
|
|
static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data)
|
|
{
|
|
static struct key_entry *key;
|
|
- u16 count;
|
|
-
|
|
if (!ehotk)
|
|
return;
|
|
if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)
|
|
notify_brn();
|
|
- count = ehotk->event_count[event % 128]++;
|
|
- acpi_bus_generate_proc_event(ehotk->device, event, count);
|
|
- acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,
|
|
- dev_name(&ehotk->device->dev), event,
|
|
- count);
|
|
+ acpi_bus_generate_proc_event(ehotk->device, event,
|
|
+ ehotk->event_count[event % 128]++);
|
|
if (ehotk->inputdev) {
|
|
key = eepc_get_entry_by_scancode(event);
|
|
if (key) {
|
|
@@ -585,45 +539,6 @@
|
|
}
|
|
}
|
|
|
|
-static int eeepc_register_rfkill_notifier(char *node)
|
|
-{
|
|
- acpi_status status = AE_OK;
|
|
- acpi_handle handle;
|
|
-
|
|
- status = acpi_get_handle(NULL, node, &handle);
|
|
-
|
|
- if (ACPI_SUCCESS(status)) {
|
|
- status = acpi_install_notify_handler(handle,
|
|
- ACPI_SYSTEM_NOTIFY,
|
|
- eeepc_rfkill_notify,
|
|
- NULL);
|
|
- if (ACPI_FAILURE(status))
|
|
- printk(EEEPC_WARNING
|
|
- "Failed to register notify on %s\n", node);
|
|
- } else
|
|
- return -ENODEV;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void eeepc_unregister_rfkill_notifier(char *node)
|
|
-{
|
|
- acpi_status status = AE_OK;
|
|
- acpi_handle handle;
|
|
-
|
|
- status = acpi_get_handle(NULL, node, &handle);
|
|
-
|
|
- if (ACPI_SUCCESS(status)) {
|
|
- status = acpi_remove_notify_handler(handle,
|
|
- ACPI_SYSTEM_NOTIFY,
|
|
- eeepc_rfkill_notify);
|
|
- if (ACPI_FAILURE(status))
|
|
- printk(EEEPC_ERR
|
|
- "Error removing rfkill notify handler %s\n",
|
|
- node);
|
|
- }
|
|
-}
|
|
-
|
|
static int eeepc_hotk_add(struct acpi_device *device)
|
|
{
|
|
acpi_status status = AE_OK;
|
|
@@ -643,7 +558,7 @@
|
|
ehotk->device = device;
|
|
result = eeepc_hotk_check();
|
|
if (result)
|
|
- goto ehotk_fail;
|
|
+ goto end;
|
|
status = acpi_install_notify_handler(ehotk->handle, ACPI_SYSTEM_NOTIFY,
|
|
eeepc_hotk_notify, ehotk);
|
|
if (ACPI_FAILURE(status))
|
|
@@ -654,25 +569,18 @@
|
|
RFKILL_TYPE_WLAN);
|
|
|
|
if (!ehotk->eeepc_wlan_rfkill)
|
|
- goto wlan_fail;
|
|
+ goto end;
|
|
|
|
ehotk->eeepc_wlan_rfkill->name = "eeepc-wlan";
|
|
ehotk->eeepc_wlan_rfkill->toggle_radio = eeepc_wlan_rfkill_set;
|
|
ehotk->eeepc_wlan_rfkill->get_state = eeepc_wlan_rfkill_state;
|
|
- if (get_acpi(CM_ASL_WLAN) == 1) {
|
|
+ if (get_acpi(CM_ASL_WLAN) == 1)
|
|
ehotk->eeepc_wlan_rfkill->state =
|
|
RFKILL_STATE_UNBLOCKED;
|
|
- rfkill_set_default(RFKILL_TYPE_WLAN,
|
|
- RFKILL_STATE_UNBLOCKED);
|
|
- } else {
|
|
+ else
|
|
ehotk->eeepc_wlan_rfkill->state =
|
|
RFKILL_STATE_SOFT_BLOCKED;
|
|
- rfkill_set_default(RFKILL_TYPE_WLAN,
|
|
- RFKILL_STATE_SOFT_BLOCKED);
|
|
- }
|
|
- result = rfkill_register(ehotk->eeepc_wlan_rfkill);
|
|
- if (result)
|
|
- goto wlan_fail;
|
|
+ rfkill_register(ehotk->eeepc_wlan_rfkill);
|
|
}
|
|
|
|
if (get_acpi(CM_ASL_BLUETOOTH) != -1) {
|
|
@@ -680,47 +588,27 @@
|
|
rfkill_allocate(&device->dev, RFKILL_TYPE_BLUETOOTH);
|
|
|
|
if (!ehotk->eeepc_bluetooth_rfkill)
|
|
- goto bluetooth_fail;
|
|
+ goto end;
|
|
|
|
ehotk->eeepc_bluetooth_rfkill->name = "eeepc-bluetooth";
|
|
ehotk->eeepc_bluetooth_rfkill->toggle_radio =
|
|
eeepc_bluetooth_rfkill_set;
|
|
ehotk->eeepc_bluetooth_rfkill->get_state =
|
|
eeepc_bluetooth_rfkill_state;
|
|
- if (get_acpi(CM_ASL_BLUETOOTH) == 1) {
|
|
+ if (get_acpi(CM_ASL_BLUETOOTH) == 1)
|
|
ehotk->eeepc_bluetooth_rfkill->state =
|
|
RFKILL_STATE_UNBLOCKED;
|
|
- rfkill_set_default(RFKILL_TYPE_BLUETOOTH,
|
|
- RFKILL_STATE_UNBLOCKED);
|
|
- } else {
|
|
+ else
|
|
ehotk->eeepc_bluetooth_rfkill->state =
|
|
RFKILL_STATE_SOFT_BLOCKED;
|
|
- rfkill_set_default(RFKILL_TYPE_BLUETOOTH,
|
|
- RFKILL_STATE_SOFT_BLOCKED);
|
|
- }
|
|
-
|
|
- result = rfkill_register(ehotk->eeepc_bluetooth_rfkill);
|
|
- if (result)
|
|
- goto bluetooth_fail;
|
|
+ rfkill_register(ehotk->eeepc_bluetooth_rfkill);
|
|
}
|
|
|
|
- eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6");
|
|
- eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7");
|
|
-
|
|
- return 0;
|
|
-
|
|
- bluetooth_fail:
|
|
- if (ehotk->eeepc_bluetooth_rfkill)
|
|
- rfkill_free(ehotk->eeepc_bluetooth_rfkill);
|
|
- rfkill_unregister(ehotk->eeepc_wlan_rfkill);
|
|
- ehotk->eeepc_wlan_rfkill = NULL;
|
|
- wlan_fail:
|
|
- if (ehotk->eeepc_wlan_rfkill)
|
|
- rfkill_free(ehotk->eeepc_wlan_rfkill);
|
|
- ehotk_fail:
|
|
- kfree(ehotk);
|
|
- ehotk = NULL;
|
|
-
|
|
+ end:
|
|
+ if (result) {
|
|
+ kfree(ehotk);
|
|
+ ehotk = NULL;
|
|
+ }
|
|
return result;
|
|
}
|
|
|
|
@@ -734,10 +622,6 @@
|
|
eeepc_hotk_notify);
|
|
if (ACPI_FAILURE(status))
|
|
printk(EEEPC_ERR "Error removing notify handler\n");
|
|
-
|
|
- eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P6");
|
|
- eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P7");
|
|
-
|
|
kfree(ehotk);
|
|
return 0;
|
|
}
|
|
@@ -853,21 +737,13 @@
|
|
{
|
|
if (eeepc_backlight_device)
|
|
backlight_device_unregister(eeepc_backlight_device);
|
|
- eeepc_backlight_device = NULL;
|
|
-}
|
|
-
|
|
-static void eeepc_rfkill_exit(void)
|
|
-{
|
|
+ if (ehotk->inputdev)
|
|
+ input_unregister_device(ehotk->inputdev);
|
|
if (ehotk->eeepc_wlan_rfkill)
|
|
rfkill_unregister(ehotk->eeepc_wlan_rfkill);
|
|
if (ehotk->eeepc_bluetooth_rfkill)
|
|
rfkill_unregister(ehotk->eeepc_bluetooth_rfkill);
|
|
-}
|
|
-
|
|
-static void eeepc_input_exit(void)
|
|
-{
|
|
- if (ehotk->inputdev)
|
|
- input_unregister_device(ehotk->inputdev);
|
|
+ eeepc_backlight_device = NULL;
|
|
}
|
|
|
|
static void eeepc_hwmon_exit(void)
|
|
@@ -886,8 +762,6 @@
|
|
static void __exit eeepc_laptop_exit(void)
|
|
{
|
|
eeepc_backlight_exit();
|
|
- eeepc_rfkill_exit();
|
|
- eeepc_input_exit();
|
|
eeepc_hwmon_exit();
|
|
acpi_bus_unregister_driver(&eeepc_hotk_driver);
|
|
sysfs_remove_group(&platform_device->dev.kobj,
|
|
@@ -991,8 +865,6 @@
|
|
fail_hwmon:
|
|
eeepc_backlight_exit();
|
|
fail_backlight:
|
|
- eeepc_input_exit();
|
|
- eeepc_rfkill_exit();
|
|
return result;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/fujitsu-laptop.c linux-2.6.29-rc3.owrt/drivers/platform/x86/fujitsu-laptop.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/fujitsu-laptop.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/fujitsu-laptop.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -166,7 +166,6 @@
|
|
struct platform_device *pf_device;
|
|
struct kfifo *fifo;
|
|
spinlock_t fifo_lock;
|
|
- int rfkill_supported;
|
|
int rfkill_state;
|
|
int logolamp_registered;
|
|
int kblamps_registered;
|
|
@@ -527,7 +526,7 @@
|
|
show_lid_state(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
- if (!(fujitsu_hotkey->rfkill_supported & 0x100))
|
|
+ if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD)
|
|
return sprintf(buf, "unknown\n");
|
|
if (fujitsu_hotkey->rfkill_state & 0x100)
|
|
return sprintf(buf, "open\n");
|
|
@@ -539,7 +538,7 @@
|
|
show_dock_state(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
- if (!(fujitsu_hotkey->rfkill_supported & 0x200))
|
|
+ if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD)
|
|
return sprintf(buf, "unknown\n");
|
|
if (fujitsu_hotkey->rfkill_state & 0x200)
|
|
return sprintf(buf, "docked\n");
|
|
@@ -551,7 +550,7 @@
|
|
show_radios_state(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
- if (!(fujitsu_hotkey->rfkill_supported & 0x20))
|
|
+ if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD)
|
|
return sprintf(buf, "unknown\n");
|
|
if (fujitsu_hotkey->rfkill_state & 0x20)
|
|
return sprintf(buf, "on\n");
|
|
@@ -929,17 +928,8 @@
|
|
; /* No action, result is discarded */
|
|
vdbg_printk(FUJLAPTOP_DBG_INFO, "Discarded %i ringbuffer entries\n", i);
|
|
|
|
- fujitsu_hotkey->rfkill_supported =
|
|
- call_fext_func(FUNC_RFKILL, 0x0, 0x0, 0x0);
|
|
-
|
|
- /* Make sure our bitmask of supported functions is cleared if the
|
|
- RFKILL function block is not implemented, like on the S7020. */
|
|
- if (fujitsu_hotkey->rfkill_supported == UNSUPPORTED_CMD)
|
|
- fujitsu_hotkey->rfkill_supported = 0;
|
|
-
|
|
- if (fujitsu_hotkey->rfkill_supported)
|
|
- fujitsu_hotkey->rfkill_state =
|
|
- call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0);
|
|
+ fujitsu_hotkey->rfkill_state =
|
|
+ call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0);
|
|
|
|
/* Suspect this is a keymap of the application panel, print it */
|
|
printk(KERN_INFO "fujitsu-laptop: BTNI: [0x%x]\n",
|
|
@@ -1015,9 +1005,8 @@
|
|
|
|
input = fujitsu_hotkey->input;
|
|
|
|
- if (fujitsu_hotkey->rfkill_supported)
|
|
- fujitsu_hotkey->rfkill_state =
|
|
- call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0);
|
|
+ fujitsu_hotkey->rfkill_state =
|
|
+ call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0);
|
|
|
|
switch (event) {
|
|
case ACPI_FUJITSU_NOTIFY_CODE1:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/hp-wmi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/hp-wmi.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/hp-wmi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/hp-wmi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -382,11 +382,6 @@
|
|
case KE_SW:
|
|
set_bit(EV_SW, hp_wmi_input_dev->evbit);
|
|
set_bit(key->keycode, hp_wmi_input_dev->swbit);
|
|
-
|
|
- /* Set initial dock state */
|
|
- input_report_switch(hp_wmi_input_dev, key->keycode,
|
|
- hp_wmi_dock_state());
|
|
- input_sync(hp_wmi_input_dev);
|
|
break;
|
|
}
|
|
}
|
|
@@ -446,7 +441,6 @@
|
|
bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set;
|
|
bluetooth_rfkill->user_claim_unsupported = 1;
|
|
err = rfkill_register(bluetooth_rfkill);
|
|
- if (err)
|
|
goto register_bluetooth_error;
|
|
}
|
|
|
|
@@ -463,11 +457,9 @@
|
|
|
|
return 0;
|
|
register_wwan_err:
|
|
- if (bluetooth_rfkill)
|
|
- rfkill_unregister(bluetooth_rfkill);
|
|
+ rfkill_unregister(bluetooth_rfkill);
|
|
register_bluetooth_error:
|
|
- if (wifi_rfkill)
|
|
- rfkill_unregister(wifi_rfkill);
|
|
+ rfkill_unregister(wifi_rfkill);
|
|
add_sysfs_error:
|
|
cleanup_sysfs(device);
|
|
return err;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/Kconfig linux-2.6.29-rc3.owrt/drivers/platform/x86/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -15,7 +15,8 @@
|
|
if X86_PLATFORM_DEVICES
|
|
|
|
config ACER_WMI
|
|
- tristate "Acer WMI Laptop Extras"
|
|
+ tristate "Acer WMI Laptop Extras (EXPERIMENTAL)"
|
|
+ depends on EXPERIMENTAL
|
|
depends on ACPI
|
|
depends on LEDS_CLASS
|
|
depends on NEW_LEDS
|
|
@@ -38,10 +39,9 @@
|
|
tristate "Asus Laptop Extras (EXPERIMENTAL)"
|
|
depends on ACPI
|
|
depends on EXPERIMENTAL && !ACPI_ASUS
|
|
- select LEDS_CLASS
|
|
- select NEW_LEDS
|
|
- select BACKLIGHT_CLASS_DEVICE
|
|
- depends on INPUT
|
|
+ depends on LEDS_CLASS
|
|
+ depends on NEW_LEDS
|
|
+ depends on BACKLIGHT_CLASS_DEVICE
|
|
---help---
|
|
This is the new Linux driver for Asus laptops. It may also support some
|
|
MEDION, JVC or VICTOR laptops. It makes all the extra buttons generate
|
|
@@ -61,7 +61,6 @@
|
|
depends on EXPERIMENTAL
|
|
depends on BACKLIGHT_CLASS_DEVICE
|
|
depends on RFKILL
|
|
- depends on POWER_SUPPLY
|
|
default n
|
|
---help---
|
|
This driver adds support for rfkill and backlight control to Dell
|
|
@@ -184,11 +183,11 @@
|
|
config THINKPAD_ACPI
|
|
tristate "ThinkPad ACPI Laptop Extras"
|
|
depends on ACPI
|
|
- depends on INPUT
|
|
select BACKLIGHT_LCD_SUPPORT
|
|
select BACKLIGHT_CLASS_DEVICE
|
|
select HWMON
|
|
select NVRAM
|
|
+ select INPUT
|
|
select NEW_LEDS
|
|
select LEDS_CLASS
|
|
select NET
|
|
@@ -301,7 +300,6 @@
|
|
config EEEPC_LAPTOP
|
|
tristate "Eee PC Hotkey Driver (EXPERIMENTAL)"
|
|
depends on ACPI
|
|
- depends on INPUT
|
|
depends on EXPERIMENTAL
|
|
select BACKLIGHT_CLASS_DEVICE
|
|
select HWMON
|
|
@@ -314,8 +312,9 @@
|
|
|
|
|
|
config ACPI_WMI
|
|
- tristate "WMI"
|
|
+ tristate "WMI (EXPERIMENTAL)"
|
|
depends on ACPI
|
|
+ depends on EXPERIMENTAL
|
|
help
|
|
This driver adds support for the ACPI-WMI (Windows Management
|
|
Instrumentation) mapper device (PNP0C14) found on some systems.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/panasonic-laptop.c linux-2.6.29-rc3.owrt/drivers/platform/x86/panasonic-laptop.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/panasonic-laptop.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/panasonic-laptop.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -507,7 +507,7 @@
|
|
|
|
hkey_num = result & 0xf;
|
|
|
|
- if (hkey_num < 0 || hkey_num >= ARRAY_SIZE(pcc->keymap)) {
|
|
+ if (hkey_num < 0 || hkey_num > ARRAY_SIZE(pcc->keymap)) {
|
|
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
|
"hotkey number out of range: %d\n",
|
|
hkey_num));
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/thinkpad_acpi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/thinkpad_acpi.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/thinkpad_acpi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/thinkpad_acpi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -7532,7 +7532,7 @@
|
|
* if it is not there yet.
|
|
*/
|
|
#define IBM_BIOS_MODULE_ALIAS(__type) \
|
|
- MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*")
|
|
+ MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW")
|
|
|
|
/* Non-ancient thinkpads */
|
|
MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*");
|
|
@@ -7541,9 +7541,9 @@
|
|
/* Ancient thinkpad BIOSes have to be identified by
|
|
* BIOS type or model number, and there are far less
|
|
* BIOS types than model numbers... */
|
|
-IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]");
|
|
-IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]");
|
|
-IBM_BIOS_MODULE_ALIAS("K[UX-Z]");
|
|
+IBM_BIOS_MODULE_ALIAS("I[B,D,H,I,M,N,O,T,W,V,Y,Z]");
|
|
+IBM_BIOS_MODULE_ALIAS("1[0,3,6,8,A-G,I,K,M-P,S,T]");
|
|
+IBM_BIOS_MODULE_ALIAS("K[U,X-Z]");
|
|
|
|
MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh");
|
|
MODULE_DESCRIPTION(TPACPI_DESC);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/platform/x86/wmi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/wmi.c
|
|
--- linux-2.6.29.owrt/drivers/platform/x86/wmi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/platform/x86/wmi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -708,7 +708,7 @@
|
|
|
|
static int __init acpi_wmi_init(void)
|
|
{
|
|
- int result;
|
|
+ acpi_status result;
|
|
|
|
INIT_LIST_HEAD(&wmi_blocks.list);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/power/ds2760_battery.c linux-2.6.29-rc3.owrt/drivers/power/ds2760_battery.c
|
|
--- linux-2.6.29.owrt/drivers/power/ds2760_battery.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/power/ds2760_battery.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -180,13 +180,10 @@
|
|
di->empty_uAh = battery_interpolate(scale, di->temp_C / 10);
|
|
di->empty_uAh *= 1000; /* convert to µAh */
|
|
|
|
- if (di->full_active_uAh == di->empty_uAh)
|
|
- di->rem_capacity = 0;
|
|
- else
|
|
- /* From Maxim Application Note 131: remaining capacity =
|
|
- * ((ICA - Empty Value) / (Full Value - Empty Value)) x 100% */
|
|
- di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) /
|
|
- (di->full_active_uAh - di->empty_uAh);
|
|
+ /* From Maxim Application Note 131: remaining capacity =
|
|
+ * ((ICA - Empty Value) / (Full Value - Empty Value)) x 100% */
|
|
+ di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) /
|
|
+ (di->full_active_uAh - di->empty_uAh);
|
|
|
|
if (di->rem_capacity < 0)
|
|
di->rem_capacity = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/power/pcf50633-charger.c linux-2.6.29-rc3.owrt/drivers/power/pcf50633-charger.c
|
|
--- linux-2.6.29.owrt/drivers/power/pcf50633-charger.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/power/pcf50633-charger.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -199,8 +199,7 @@
|
|
enum power_supply_property psp,
|
|
union power_supply_propval *val)
|
|
{
|
|
- struct pcf50633_mbc *mbc = container_of(psy,
|
|
- struct pcf50633_mbc, adapter);
|
|
+ struct pcf50633_mbc *mbc = container_of(psy, struct pcf50633_mbc, usb);
|
|
int ret = 0;
|
|
|
|
switch (psp) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/regulator/bq24022.c linux-2.6.29-rc3.owrt/drivers/regulator/bq24022.c
|
|
--- linux-2.6.29.owrt/drivers/regulator/bq24022.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/regulator/bq24022.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -152,7 +152,11 @@
|
|
platform_driver_unregister(&bq24022_driver);
|
|
}
|
|
|
|
-module_init(bq24022_init);
|
|
+/*
|
|
+ * make sure this is probed before gpio_vbus and pda_power,
|
|
+ * but after asic3 or other GPIO expander drivers.
|
|
+ */
|
|
+subsys_initcall(bq24022_init);
|
|
module_exit(bq24022_exit);
|
|
|
|
MODULE_AUTHOR("Philipp Zabel");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/regulator/wm8350-regulator.c linux-2.6.29-rc3.owrt/drivers/regulator/wm8350-regulator.c
|
|
--- linux-2.6.29.owrt/drivers/regulator/wm8350-regulator.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/regulator/wm8350-regulator.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1435,7 +1435,7 @@
|
|
struct platform_device *pdev;
|
|
int ret;
|
|
|
|
- if (lednum >= ARRAY_SIZE(wm8350->pmic.led) || lednum < 0) {
|
|
+ if (lednum > ARRAY_SIZE(wm8350->pmic.led) || lednum < 0) {
|
|
dev_err(wm8350->dev, "Invalid LED index %d\n", lednum);
|
|
return -ENODEV;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/rtc/Kconfig linux-2.6.29-rc3.owrt/drivers/rtc/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/rtc/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/rtc/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -241,12 +241,6 @@
|
|
If you say Y here you will get support for the
|
|
watchdog timer in the ST M41T60 and M41T80 RTC chips series.
|
|
|
|
-config RTC_DRV_DM355EVM
|
|
- tristate "TI DaVinci DM355 EVM RTC"
|
|
- depends on MFD_DM355EVM_MSP
|
|
- help
|
|
- Supports the RTC firmware in the MSP430 on the DM355 EVM.
|
|
-
|
|
config RTC_DRV_TWL92330
|
|
boolean "TI TWL92330/Menelaus"
|
|
depends on MENELAUS
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/rtc/Makefile linux-2.6.29-rc3.owrt/drivers/rtc/Makefile
|
|
--- linux-2.6.29.owrt/drivers/rtc/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/rtc/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -23,7 +23,6 @@
|
|
obj-$(CONFIG_RTC_DRV_AU1XXX) += rtc-au1xxx.o
|
|
obj-$(CONFIG_RTC_DRV_BFIN) += rtc-bfin.o
|
|
obj-$(CONFIG_RTC_DRV_CMOS) += rtc-cmos.o
|
|
-obj-$(CONFIG_RTC_DRV_DM355EVM) += rtc-dm355evm.o
|
|
obj-$(CONFIG_RTC_DRV_DS1216) += rtc-ds1216.o
|
|
obj-$(CONFIG_RTC_DRV_DS1286) += rtc-ds1286.o
|
|
obj-$(CONFIG_RTC_DRV_DS1302) += rtc-ds1302.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/rtc/rtc-au1xxx.c linux-2.6.29-rc3.owrt/drivers/rtc/rtc-au1xxx.c
|
|
--- linux-2.6.29.owrt/drivers/rtc/rtc-au1xxx.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/rtc/rtc-au1xxx.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -81,7 +81,7 @@
|
|
if (au_readl(SYS_TOYTRIM) != 32767) {
|
|
/* wait until hardware gives access to TRIM register */
|
|
t = 0x00100000;
|
|
- while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T0S) && --t)
|
|
+ while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T0S) && t--)
|
|
msleep(1);
|
|
|
|
if (!t) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/rtc/rtc-dm355evm.c linux-2.6.29-rc3.owrt/drivers/rtc/rtc-dm355evm.c
|
|
--- linux-2.6.29.owrt/drivers/rtc/rtc-dm355evm.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/rtc/rtc-dm355evm.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,175 +0,0 @@
|
|
-/*
|
|
- * rtc-dm355evm.c - access battery-backed counter in MSP430 firmware
|
|
- *
|
|
- * Copyright (c) 2008 by David Brownell
|
|
- *
|
|
- * 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.
|
|
- */
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/init.h>
|
|
-#include <linux/rtc.h>
|
|
-#include <linux/platform_device.h>
|
|
-
|
|
-#include <linux/i2c/dm355evm_msp.h>
|
|
-
|
|
-
|
|
-/*
|
|
- * The MSP430 firmware on the DM355 EVM uses a watch crystal to feed
|
|
- * a 1 Hz counter. When a backup battery is supplied, that makes a
|
|
- * reasonable RTC for applications where alarms and non-NTP drift
|
|
- * compensation aren't important.
|
|
- *
|
|
- * The only real glitch is the inability to read or write all four
|
|
- * counter bytes atomically: the count may increment in the middle
|
|
- * of an operation, causing trouble when the LSB rolls over.
|
|
- *
|
|
- * This driver was tested with firmware revision A4.
|
|
- */
|
|
-union evm_time {
|
|
- u8 bytes[4];
|
|
- u32 value;
|
|
-};
|
|
-
|
|
-static int dm355evm_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
|
-{
|
|
- union evm_time time;
|
|
- int status;
|
|
- int tries = 0;
|
|
-
|
|
- do {
|
|
- /*
|
|
- * Read LSB(0) to MSB(3) bytes. Defend against the counter
|
|
- * rolling over by re-reading until the value is stable,
|
|
- * and assuming the four reads take at most a few seconds.
|
|
- */
|
|
- status = dm355evm_msp_read(DM355EVM_MSP_RTC_0);
|
|
- if (status < 0)
|
|
- return status;
|
|
- if (tries && time.bytes[0] == status)
|
|
- break;
|
|
- time.bytes[0] = status;
|
|
-
|
|
- status = dm355evm_msp_read(DM355EVM_MSP_RTC_1);
|
|
- if (status < 0)
|
|
- return status;
|
|
- if (tries && time.bytes[1] == status)
|
|
- break;
|
|
- time.bytes[1] = status;
|
|
-
|
|
- status = dm355evm_msp_read(DM355EVM_MSP_RTC_2);
|
|
- if (status < 0)
|
|
- return status;
|
|
- if (tries && time.bytes[2] == status)
|
|
- break;
|
|
- time.bytes[2] = status;
|
|
-
|
|
- status = dm355evm_msp_read(DM355EVM_MSP_RTC_3);
|
|
- if (status < 0)
|
|
- return status;
|
|
- if (tries && time.bytes[3] == status)
|
|
- break;
|
|
- time.bytes[3] = status;
|
|
-
|
|
- } while (++tries < 5);
|
|
-
|
|
- dev_dbg(dev, "read timestamp %08x\n", time.value);
|
|
-
|
|
- rtc_time_to_tm(le32_to_cpu(time.value), tm);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int dm355evm_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
|
-{
|
|
- union evm_time time;
|
|
- unsigned long value;
|
|
- int status;
|
|
-
|
|
- rtc_tm_to_time(tm, &value);
|
|
- time.value = cpu_to_le32(value);
|
|
-
|
|
- dev_dbg(dev, "write timestamp %08x\n", time.value);
|
|
-
|
|
- /*
|
|
- * REVISIT handle non-atomic writes ... maybe just retry until
|
|
- * byte[1] sticks (no rollover)?
|
|
- */
|
|
- status = dm355evm_msp_write(time.bytes[0], DM355EVM_MSP_RTC_0);
|
|
- if (status < 0)
|
|
- return status;
|
|
-
|
|
- status = dm355evm_msp_write(time.bytes[1], DM355EVM_MSP_RTC_1);
|
|
- if (status < 0)
|
|
- return status;
|
|
-
|
|
- status = dm355evm_msp_write(time.bytes[2], DM355EVM_MSP_RTC_2);
|
|
- if (status < 0)
|
|
- return status;
|
|
-
|
|
- status = dm355evm_msp_write(time.bytes[3], DM355EVM_MSP_RTC_3);
|
|
- if (status < 0)
|
|
- return status;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static struct rtc_class_ops dm355evm_rtc_ops = {
|
|
- .read_time = dm355evm_rtc_read_time,
|
|
- .set_time = dm355evm_rtc_set_time,
|
|
-};
|
|
-
|
|
-/*----------------------------------------------------------------------*/
|
|
-
|
|
-static int __devinit dm355evm_rtc_probe(struct platform_device *pdev)
|
|
-{
|
|
- struct rtc_device *rtc;
|
|
-
|
|
- rtc = rtc_device_register(pdev->name,
|
|
- &pdev->dev, &dm355evm_rtc_ops, THIS_MODULE);
|
|
- if (IS_ERR(rtc)) {
|
|
- dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
|
|
- PTR_ERR(rtc));
|
|
- return PTR_ERR(rtc);
|
|
- }
|
|
- platform_set_drvdata(pdev, rtc);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int __devexit dm355evm_rtc_remove(struct platform_device *pdev)
|
|
-{
|
|
- struct rtc_device *rtc = platform_get_drvdata(pdev);
|
|
-
|
|
- rtc_device_unregister(rtc);
|
|
- platform_set_drvdata(pdev, NULL);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * I2C is used to talk to the MSP430, but this platform device is
|
|
- * exposed by an MFD driver that manages I2C communications.
|
|
- */
|
|
-static struct platform_driver rtc_dm355evm_driver = {
|
|
- .probe = dm355evm_rtc_probe,
|
|
- .remove = __devexit_p(dm355evm_rtc_remove),
|
|
- .driver = {
|
|
- .owner = THIS_MODULE,
|
|
- .name = "rtc-dm355evm",
|
|
- },
|
|
-};
|
|
-
|
|
-static int __init dm355evm_rtc_init(void)
|
|
-{
|
|
- return platform_driver_register(&rtc_dm355evm_driver);
|
|
-}
|
|
-module_init(dm355evm_rtc_init);
|
|
-
|
|
-static void __exit dm355evm_rtc_exit(void)
|
|
-{
|
|
- platform_driver_unregister(&rtc_dm355evm_driver);
|
|
-}
|
|
-module_exit(dm355evm_rtc_exit);
|
|
-
|
|
-MODULE_LICENSE("GPL");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/rtc/rtc-ds1390.c linux-2.6.29-rc3.owrt/drivers/rtc/rtc-ds1390.c
|
|
--- linux-2.6.29.owrt/drivers/rtc/rtc-ds1390.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/rtc/rtc-ds1390.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -122,6 +122,7 @@
|
|
|
|
static int __devinit ds1390_probe(struct spi_device *spi)
|
|
{
|
|
+ struct rtc_device *rtc;
|
|
unsigned char tmp;
|
|
struct ds1390 *chip;
|
|
int res;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/rtc/rtc-pxa.c linux-2.6.29-rc3.owrt/drivers/rtc/rtc-pxa.c
|
|
--- linux-2.6.29.owrt/drivers/rtc/rtc-pxa.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/rtc/rtc-pxa.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -485,7 +485,7 @@
|
|
module_init(pxa_rtc_init);
|
|
module_exit(pxa_rtc_exit);
|
|
|
|
-MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
|
|
+MODULE_AUTHOR("Robert Jarzmik");
|
|
MODULE_DESCRIPTION("PXA27x/PXA3xx Realtime Clock Driver (RTC)");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_ALIAS("platform:pxa-rtc");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/s390/block/dasd.c linux-2.6.29-rc3.owrt/drivers/s390/block/dasd.c
|
|
--- linux-2.6.29.owrt/drivers/s390/block/dasd.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/s390/block/dasd.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -57,8 +57,6 @@
|
|
static void dasd_block_tasklet(struct dasd_block *);
|
|
static void do_kick_device(struct work_struct *);
|
|
static void dasd_return_cqr_cb(struct dasd_ccw_req *, void *);
|
|
-static void dasd_device_timeout(unsigned long);
|
|
-static void dasd_block_timeout(unsigned long);
|
|
|
|
/*
|
|
* SECTION: Operations on the device structure.
|
|
@@ -101,8 +99,6 @@
|
|
(unsigned long) device);
|
|
INIT_LIST_HEAD(&device->ccw_queue);
|
|
init_timer(&device->timer);
|
|
- device->timer.function = dasd_device_timeout;
|
|
- device->timer.data = (unsigned long) device;
|
|
INIT_WORK(&device->kick_work, do_kick_device);
|
|
device->state = DASD_STATE_NEW;
|
|
device->target = DASD_STATE_NEW;
|
|
@@ -142,8 +138,6 @@
|
|
INIT_LIST_HEAD(&block->ccw_queue);
|
|
spin_lock_init(&block->queue_lock);
|
|
init_timer(&block->timer);
|
|
- block->timer.function = dasd_block_timeout;
|
|
- block->timer.data = (unsigned long) block;
|
|
|
|
return block;
|
|
}
|
|
@@ -921,10 +915,19 @@
|
|
*/
|
|
void dasd_device_set_timer(struct dasd_device *device, int expires)
|
|
{
|
|
- if (expires == 0)
|
|
- del_timer(&device->timer);
|
|
- else
|
|
- mod_timer(&device->timer, jiffies + expires);
|
|
+ if (expires == 0) {
|
|
+ if (timer_pending(&device->timer))
|
|
+ del_timer(&device->timer);
|
|
+ return;
|
|
+ }
|
|
+ if (timer_pending(&device->timer)) {
|
|
+ if (mod_timer(&device->timer, jiffies + expires))
|
|
+ return;
|
|
+ }
|
|
+ device->timer.function = dasd_device_timeout;
|
|
+ device->timer.data = (unsigned long) device;
|
|
+ device->timer.expires = jiffies + expires;
|
|
+ add_timer(&device->timer);
|
|
}
|
|
|
|
/*
|
|
@@ -932,7 +935,8 @@
|
|
*/
|
|
void dasd_device_clear_timer(struct dasd_device *device)
|
|
{
|
|
- del_timer(&device->timer);
|
|
+ if (timer_pending(&device->timer))
|
|
+ del_timer(&device->timer);
|
|
}
|
|
|
|
static void dasd_handle_killed_request(struct ccw_device *cdev,
|
|
@@ -1582,10 +1586,19 @@
|
|
*/
|
|
void dasd_block_set_timer(struct dasd_block *block, int expires)
|
|
{
|
|
- if (expires == 0)
|
|
- del_timer(&block->timer);
|
|
- else
|
|
- mod_timer(&block->timer, jiffies + expires);
|
|
+ if (expires == 0) {
|
|
+ if (timer_pending(&block->timer))
|
|
+ del_timer(&block->timer);
|
|
+ return;
|
|
+ }
|
|
+ if (timer_pending(&block->timer)) {
|
|
+ if (mod_timer(&block->timer, jiffies + expires))
|
|
+ return;
|
|
+ }
|
|
+ block->timer.function = dasd_block_timeout;
|
|
+ block->timer.data = (unsigned long) block;
|
|
+ block->timer.expires = jiffies + expires;
|
|
+ add_timer(&block->timer);
|
|
}
|
|
|
|
/*
|
|
@@ -1593,7 +1606,8 @@
|
|
*/
|
|
void dasd_block_clear_timer(struct dasd_block *block)
|
|
{
|
|
- del_timer(&block->timer);
|
|
+ if (timer_pending(&block->timer))
|
|
+ del_timer(&block->timer);
|
|
}
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/s390/block/dasd_devmap.c linux-2.6.29-rc3.owrt/drivers/s390/block/dasd_devmap.c
|
|
--- linux-2.6.29.owrt/drivers/s390/block/dasd_devmap.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/s390/block/dasd_devmap.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -677,7 +677,7 @@
|
|
struct dasd_devmap *devmap;
|
|
int ff_flag;
|
|
|
|
- devmap = dasd_find_busid(dev_name(dev));
|
|
+ devmap = dasd_find_busid(dev->bus_id);
|
|
if (!IS_ERR(devmap))
|
|
ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0;
|
|
else
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/s390/char/sclp.c linux-2.6.29-rc3.owrt/drivers/s390/char/sclp.c
|
|
--- linux-2.6.29.owrt/drivers/s390/char/sclp.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/s390/char/sclp.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -280,11 +280,8 @@
|
|
rc = 0;
|
|
for (offset = sizeof(struct sccb_header); offset < sccb->length;
|
|
offset += evbuf->length) {
|
|
- evbuf = (struct evbuf_header *) ((addr_t) sccb + offset);
|
|
- /* Check for malformed hardware response */
|
|
- if (evbuf->length == 0)
|
|
- break;
|
|
/* Search for event handler */
|
|
+ evbuf = (struct evbuf_header *) ((addr_t) sccb + offset);
|
|
reg = NULL;
|
|
list_for_each(l, &sclp_reg_list) {
|
|
reg = list_entry(l, struct sclp_register, list);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/s390/char/sclp_cmd.c linux-2.6.29-rc3.owrt/drivers/s390/char/sclp_cmd.c
|
|
--- linux-2.6.29.owrt/drivers/s390/char/sclp_cmd.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/s390/char/sclp_cmd.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
#include <linux/memory.h>
|
|
#include <asm/chpid.h>
|
|
#include <asm/sclp.h>
|
|
-#include <asm/setup.h>
|
|
|
|
#include "sclp.h"
|
|
|
|
@@ -475,10 +474,6 @@
|
|
goto skip_add;
|
|
if (start + size > VMEM_MAX_PHYS)
|
|
size = VMEM_MAX_PHYS - start;
|
|
- if (memory_end_set && (start >= memory_end))
|
|
- goto skip_add;
|
|
- if (memory_end_set && (start + size > memory_end))
|
|
- size = memory_end - start;
|
|
add_memory(0, start, size);
|
|
skip_add:
|
|
first_rn = rn;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/sbus/char/bbc_i2c.c linux-2.6.29-rc3.owrt/drivers/sbus/char/bbc_i2c.c
|
|
--- linux-2.6.29.owrt/drivers/sbus/char/bbc_i2c.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/sbus/char/bbc_i2c.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -129,7 +129,7 @@
|
|
bp->waiting = 1;
|
|
add_wait_queue(&bp->wq, &wait);
|
|
while (limit-- > 0) {
|
|
- long val;
|
|
+ unsigned long val;
|
|
|
|
val = wait_event_interruptible_timeout(
|
|
bp->wq,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/sbus/char/jsflash.c linux-2.6.29-rc3.owrt/drivers/sbus/char/jsflash.c
|
|
--- linux-2.6.29.owrt/drivers/sbus/char/jsflash.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/sbus/char/jsflash.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -38,6 +38,9 @@
|
|
#include <linux/string.h>
|
|
#include <linux/genhd.h>
|
|
#include <linux/blkdev.h>
|
|
+
|
|
+#define MAJOR_NR JSFD_MAJOR
|
|
+
|
|
#include <asm/uaccess.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/io.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/sbus/char/openprom.c linux-2.6.29-rc3.owrt/drivers/sbus/char/openprom.c
|
|
--- linux-2.6.29.owrt/drivers/sbus/char/openprom.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/sbus/char/openprom.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -51,7 +51,6 @@
|
|
MODULE_DESCRIPTION("OPENPROM Configuration Driver");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_VERSION("1.0");
|
|
-MODULE_ALIAS_MISCDEV(SUN_OPENPROM_MINOR);
|
|
|
|
/* Private data kept by the driver for each descriptor. */
|
|
typedef struct openprom_private_data
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -639,11 +639,10 @@
|
|
write_unlock(&cxgb3i_ddp_rwlock);
|
|
|
|
ddp_log_info("nppods %u (0x%x ~ 0x%x), bits %u, mask 0x%x,0x%x "
|
|
- "pkt %u/%u, %u/%u.\n",
|
|
+ "pkt %u,%u.\n",
|
|
ppmax, ddp->llimit, ddp->ulimit, ddp->idx_bits,
|
|
ddp->idx_mask, ddp->rsvd_tag_mask,
|
|
- ddp->max_txsz, uinfo.max_txsz,
|
|
- ddp->max_rxsz, uinfo.max_rxsz);
|
|
+ ddp->max_txsz, ddp->max_rxsz);
|
|
return 0;
|
|
|
|
free_ddp_map:
|
|
@@ -655,8 +654,8 @@
|
|
* cxgb3i_adapter_ddp_init - initialize the adapter's ddp resource
|
|
* @tdev: t3cdev adapter
|
|
* @tformat: tag format
|
|
- * @txsz: max tx pdu payload size, filled in by this func.
|
|
- * @rxsz: max rx pdu payload size, filled in by this func.
|
|
+ * @txsz: max tx pkt size, filled in by this func.
|
|
+ * @rxsz: max rx pkt size, filled in by this func.
|
|
* initialize the ddp pagepod manager for a given adapter if needed and
|
|
* setup the tag format for a given iscsi entity
|
|
*/
|
|
@@ -686,12 +685,10 @@
|
|
tformat->sw_bits, tformat->rsvd_bits,
|
|
tformat->rsvd_shift, tformat->rsvd_mask);
|
|
|
|
- *txsz = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
|
|
- ddp->max_txsz - ISCSI_PDU_NONPAYLOAD_LEN);
|
|
- *rxsz = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
|
|
- ddp->max_rxsz - ISCSI_PDU_NONPAYLOAD_LEN);
|
|
- ddp_log_info("max payload size: %u/%u, %u/%u.\n",
|
|
- *txsz, ddp->max_txsz, *rxsz, ddp->max_rxsz);
|
|
+ *txsz = ddp->max_txsz;
|
|
+ *rxsz = ddp->max_rxsz;
|
|
+ ddp_log_info("ddp max pkt size: %u, %u.\n",
|
|
+ ddp->max_txsz, ddp->max_rxsz);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(cxgb3i_adapter_ddp_init);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.h linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -13,8 +13,6 @@
|
|
#ifndef __CXGB3I_ULP2_DDP_H__
|
|
#define __CXGB3I_ULP2_DDP_H__
|
|
|
|
-#include <linux/vmalloc.h>
|
|
-
|
|
/**
|
|
* struct cxgb3i_tag_format - cxgb3i ulp tag format for an iscsi entity
|
|
*
|
|
@@ -87,9 +85,8 @@
|
|
struct sk_buff **gl_skb;
|
|
};
|
|
|
|
-#define ISCSI_PDU_NONPAYLOAD_LEN 312 /* bhs(48) + ahs(256) + digest(8) */
|
|
#define ULP2_MAX_PKT_SIZE 16224
|
|
-#define ULP2_MAX_PDU_PAYLOAD (ULP2_MAX_PKT_SIZE - ISCSI_PDU_NONPAYLOAD_LEN)
|
|
+#define ULP2_MAX_PDU_PAYLOAD (ULP2_MAX_PKT_SIZE - ISCSI_PDU_NONPAYLOAD_MAX)
|
|
#define PPOD_PAGES_MAX 4
|
|
#define PPOD_PAGES_SHIFT 2 /* 4 pages per pod */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -20,7 +20,6 @@
|
|
#include <linux/list.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/scatterlist.h>
|
|
-#include <linux/skbuff.h>
|
|
#include <scsi/libiscsi_tcp.h>
|
|
|
|
/* from cxgb3 LLD */
|
|
@@ -114,26 +113,6 @@
|
|
struct cxgb3i_conn *cconn;
|
|
};
|
|
|
|
-/**
|
|
- * struct cxgb3i_task_data - private iscsi task data
|
|
- *
|
|
- * @nr_frags: # of coalesced page frags (from scsi sgl)
|
|
- * @frags: coalesced page frags (from scsi sgl)
|
|
- * @skb: tx pdu skb
|
|
- * @offset: data offset for the next pdu
|
|
- * @count: max. possible pdu payload
|
|
- * @sgoffset: offset to the first sg entry for a given offset
|
|
- */
|
|
-#define MAX_PDU_FRAGS ((ULP2_MAX_PDU_PAYLOAD + 512 - 1) / 512)
|
|
-struct cxgb3i_task_data {
|
|
- unsigned short nr_frags;
|
|
- skb_frag_t frags[MAX_PDU_FRAGS];
|
|
- struct sk_buff *skb;
|
|
- unsigned int offset;
|
|
- unsigned int count;
|
|
- unsigned int sgoffset;
|
|
-};
|
|
-
|
|
int cxgb3i_iscsi_init(void);
|
|
void cxgb3i_iscsi_cleanup(void);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_init.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_init.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_init.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_init.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -12,8 +12,8 @@
|
|
#include "cxgb3i.h"
|
|
|
|
#define DRV_MODULE_NAME "cxgb3i"
|
|
-#define DRV_MODULE_VERSION "1.0.1"
|
|
-#define DRV_MODULE_RELDATE "Jan. 2009"
|
|
+#define DRV_MODULE_VERSION "1.0.0"
|
|
+#define DRV_MODULE_RELDATE "Jun. 1, 2008"
|
|
|
|
static char version[] =
|
|
"Chelsio S3xx iSCSI Driver " DRV_MODULE_NAME
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_iscsi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_iscsi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -364,8 +364,7 @@
|
|
|
|
cls_session = iscsi_session_setup(&cxgb3i_iscsi_transport, shost,
|
|
cmds_max,
|
|
- sizeof(struct iscsi_tcp_task) +
|
|
- sizeof(struct cxgb3i_task_data),
|
|
+ sizeof(struct iscsi_tcp_task),
|
|
initial_cmdsn, ISCSI_MAX_TARGET);
|
|
if (!cls_session)
|
|
return NULL;
|
|
@@ -403,15 +402,17 @@
|
|
{
|
|
struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
|
|
struct cxgb3i_conn *cconn = tcp_conn->dd_data;
|
|
- unsigned int max = max(512 * MAX_SKB_FRAGS, SKB_TX_HEADROOM);
|
|
+ unsigned int max = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
|
|
+ cconn->hba->snic->tx_max_size -
|
|
+ ISCSI_PDU_NONPAYLOAD_MAX);
|
|
|
|
- max = min(cconn->hba->snic->tx_max_size, max);
|
|
if (conn->max_xmit_dlength)
|
|
- conn->max_xmit_dlength = min(conn->max_xmit_dlength, max);
|
|
+ conn->max_xmit_dlength = min_t(unsigned int,
|
|
+ conn->max_xmit_dlength, max);
|
|
else
|
|
conn->max_xmit_dlength = max;
|
|
align_pdu_size(conn->max_xmit_dlength);
|
|
- cxgb3i_api_debug("conn 0x%p, max xmit %u.\n",
|
|
+ cxgb3i_log_info("conn 0x%p, max xmit %u.\n",
|
|
conn, conn->max_xmit_dlength);
|
|
return 0;
|
|
}
|
|
@@ -426,7 +427,9 @@
|
|
{
|
|
struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
|
|
struct cxgb3i_conn *cconn = tcp_conn->dd_data;
|
|
- unsigned int max = cconn->hba->snic->rx_max_size;
|
|
+ unsigned int max = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
|
|
+ cconn->hba->snic->rx_max_size -
|
|
+ ISCSI_PDU_NONPAYLOAD_MAX);
|
|
|
|
align_pdu_size(max);
|
|
if (conn->max_recv_dlength) {
|
|
@@ -436,7 +439,8 @@
|
|
conn->max_recv_dlength, max);
|
|
return -EINVAL;
|
|
}
|
|
- conn->max_recv_dlength = min(conn->max_recv_dlength, max);
|
|
+ conn->max_recv_dlength = min_t(unsigned int,
|
|
+ conn->max_recv_dlength, max);
|
|
align_pdu_size(conn->max_recv_dlength);
|
|
} else
|
|
conn->max_recv_dlength = max;
|
|
@@ -840,7 +844,7 @@
|
|
.proc_name = "cxgb3i",
|
|
.queuecommand = iscsi_queuecommand,
|
|
.change_queue_depth = iscsi_change_queue_depth,
|
|
- .can_queue = CXGB3I_SCSI_QDEPTH_DFLT - 1,
|
|
+ .can_queue = 128 * (ISCSI_DEF_XMIT_CMDS_MAX - 1),
|
|
.sg_tablesize = SG_ALL,
|
|
.max_sectors = 0xFFFF,
|
|
.cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -23,19 +23,19 @@
|
|
#include "cxgb3i_ddp.h"
|
|
|
|
#ifdef __DEBUG_C3CN_CONN__
|
|
-#define c3cn_conn_debug cxgb3i_log_debug
|
|
+#define c3cn_conn_debug cxgb3i_log_info
|
|
#else
|
|
#define c3cn_conn_debug(fmt...)
|
|
#endif
|
|
|
|
#ifdef __DEBUG_C3CN_TX__
|
|
-#define c3cn_tx_debug cxgb3i_log_debug
|
|
+#define c3cn_tx_debug cxgb3i_log_debug
|
|
#else
|
|
#define c3cn_tx_debug(fmt...)
|
|
#endif
|
|
|
|
#ifdef __DEBUG_C3CN_RX__
|
|
-#define c3cn_rx_debug cxgb3i_log_debug
|
|
+#define c3cn_rx_debug cxgb3i_log_debug
|
|
#else
|
|
#define c3cn_rx_debug(fmt...)
|
|
#endif
|
|
@@ -47,9 +47,9 @@
|
|
module_param(cxgb3_rcv_win, int, 0644);
|
|
MODULE_PARM_DESC(cxgb3_rcv_win, "TCP receive window in bytes (default=256KB)");
|
|
|
|
-static int cxgb3_snd_win = 128 * 1024;
|
|
+static int cxgb3_snd_win = 64 * 1024;
|
|
module_param(cxgb3_snd_win, int, 0644);
|
|
-MODULE_PARM_DESC(cxgb3_snd_win, "TCP send window in bytes (default=128KB)");
|
|
+MODULE_PARM_DESC(cxgb3_snd_win, "TCP send window in bytes (default=64KB)");
|
|
|
|
static int cxgb3_rx_credit_thres = 10 * 1024;
|
|
module_param(cxgb3_rx_credit_thres, int, 0644);
|
|
@@ -301,8 +301,8 @@
|
|
static void skb_entail(struct s3_conn *c3cn, struct sk_buff *skb,
|
|
int flags)
|
|
{
|
|
- skb_tcp_seq(skb) = c3cn->write_seq;
|
|
- skb_flags(skb) = flags;
|
|
+ CXGB3_SKB_CB(skb)->seq = c3cn->write_seq;
|
|
+ CXGB3_SKB_CB(skb)->flags = flags;
|
|
__skb_queue_tail(&c3cn->write_queue, skb);
|
|
}
|
|
|
|
@@ -457,9 +457,12 @@
|
|
* The number of WRs needed for an skb depends on the number of fragments
|
|
* in the skb and whether it has any payload in its main body. This maps the
|
|
* length of the gather list represented by an skb into the # of necessary WRs.
|
|
- * The extra two fragments are for iscsi bhs and payload padding.
|
|
+ *
|
|
+ * The max. length of an skb is controlled by the max pdu size which is ~16K.
|
|
+ * Also, assume the min. fragment length is the sector size (512), then add
|
|
+ * extra fragment counts for iscsi bhs and payload padding.
|
|
*/
|
|
-#define SKB_WR_LIST_SIZE (MAX_SKB_FRAGS + 2)
|
|
+#define SKB_WR_LIST_SIZE (16384/512 + 3)
|
|
static unsigned int skb_wrs[SKB_WR_LIST_SIZE] __read_mostly;
|
|
|
|
static void s3_init_wr_tab(unsigned int wr_len)
|
|
@@ -482,7 +485,7 @@
|
|
|
|
static inline void reset_wr_list(struct s3_conn *c3cn)
|
|
{
|
|
- c3cn->wr_pending_head = c3cn->wr_pending_tail = NULL;
|
|
+ c3cn->wr_pending_head = NULL;
|
|
}
|
|
|
|
/*
|
|
@@ -493,7 +496,7 @@
|
|
static inline void enqueue_wr(struct s3_conn *c3cn,
|
|
struct sk_buff *skb)
|
|
{
|
|
- skb_tx_wr_next(skb) = NULL;
|
|
+ skb_wr_data(skb) = NULL;
|
|
|
|
/*
|
|
* We want to take an extra reference since both us and the driver
|
|
@@ -506,22 +509,10 @@
|
|
if (!c3cn->wr_pending_head)
|
|
c3cn->wr_pending_head = skb;
|
|
else
|
|
- skb_tx_wr_next(c3cn->wr_pending_tail) = skb;
|
|
+ skb_wr_data(skb) = skb;
|
|
c3cn->wr_pending_tail = skb;
|
|
}
|
|
|
|
-static int count_pending_wrs(struct s3_conn *c3cn)
|
|
-{
|
|
- int n = 0;
|
|
- const struct sk_buff *skb = c3cn->wr_pending_head;
|
|
-
|
|
- while (skb) {
|
|
- n += skb->csum;
|
|
- skb = skb_tx_wr_next(skb);
|
|
- }
|
|
- return n;
|
|
-}
|
|
-
|
|
static inline struct sk_buff *peek_wr(const struct s3_conn *c3cn)
|
|
{
|
|
return c3cn->wr_pending_head;
|
|
@@ -538,8 +529,8 @@
|
|
|
|
if (likely(skb)) {
|
|
/* Don't bother clearing the tail */
|
|
- c3cn->wr_pending_head = skb_tx_wr_next(skb);
|
|
- skb_tx_wr_next(skb) = NULL;
|
|
+ c3cn->wr_pending_head = skb_wr_data(skb);
|
|
+ skb_wr_data(skb) = NULL;
|
|
}
|
|
return skb;
|
|
}
|
|
@@ -552,14 +543,13 @@
|
|
}
|
|
|
|
static inline void make_tx_data_wr(struct s3_conn *c3cn, struct sk_buff *skb,
|
|
- int len, int req_completion)
|
|
+ int len)
|
|
{
|
|
struct tx_data_wr *req;
|
|
|
|
skb_reset_transport_header(skb);
|
|
req = (struct tx_data_wr *)__skb_push(skb, sizeof(*req));
|
|
- req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA) |
|
|
- (req_completion ? F_WR_COMPL : 0));
|
|
+ req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
|
|
req->wr_lo = htonl(V_WR_TID(c3cn->tid));
|
|
req->sndseq = htonl(c3cn->snd_nxt);
|
|
/* len includes the length of any HW ULP additions */
|
|
@@ -602,7 +592,7 @@
|
|
|
|
if (unlikely(c3cn->state == C3CN_STATE_CONNECTING ||
|
|
c3cn->state == C3CN_STATE_CLOSE_WAIT_1 ||
|
|
- c3cn->state >= C3CN_STATE_ABORTING)) {
|
|
+ c3cn->state == C3CN_STATE_ABORTING)) {
|
|
c3cn_tx_debug("c3cn 0x%p, in closing state %u.\n",
|
|
c3cn, c3cn->state);
|
|
return 0;
|
|
@@ -625,7 +615,7 @@
|
|
if (c3cn->wr_avail < wrs_needed) {
|
|
c3cn_tx_debug("c3cn 0x%p, skb len %u/%u, frag %u, "
|
|
"wr %d < %u.\n",
|
|
- c3cn, skb->len, skb->data_len, frags,
|
|
+ c3cn, skb->len, skb->datalen, frags,
|
|
wrs_needed, c3cn->wr_avail);
|
|
break;
|
|
}
|
|
@@ -637,24 +627,20 @@
|
|
c3cn->wr_unacked += wrs_needed;
|
|
enqueue_wr(c3cn, skb);
|
|
|
|
- c3cn_tx_debug("c3cn 0x%p, enqueue, skb len %u/%u, frag %u, "
|
|
- "wr %d, left %u, unack %u.\n",
|
|
- c3cn, skb->len, skb->data_len, frags,
|
|
- wrs_needed, c3cn->wr_avail, c3cn->wr_unacked);
|
|
-
|
|
+ if (likely(CXGB3_SKB_CB(skb)->flags & C3CB_FLAG_NEED_HDR)) {
|
|
+ len += ulp_extra_len(skb);
|
|
+ make_tx_data_wr(c3cn, skb, len);
|
|
+ c3cn->snd_nxt += len;
|
|
+ if ((req_completion
|
|
+ && c3cn->wr_unacked == wrs_needed)
|
|
+ || (CXGB3_SKB_CB(skb)->flags & C3CB_FLAG_COMPL)
|
|
+ || c3cn->wr_unacked >= c3cn->wr_max / 2) {
|
|
+ struct work_request_hdr *wr = cplhdr(skb);
|
|
|
|
- if (likely(skb_flags(skb) & C3CB_FLAG_NEED_HDR)) {
|
|
- if ((req_completion &&
|
|
- c3cn->wr_unacked == wrs_needed) ||
|
|
- (skb_flags(skb) & C3CB_FLAG_COMPL) ||
|
|
- c3cn->wr_unacked >= c3cn->wr_max / 2) {
|
|
- req_completion = 1;
|
|
+ wr->wr_hi |= htonl(F_WR_COMPL);
|
|
c3cn->wr_unacked = 0;
|
|
}
|
|
- len += ulp_extra_len(skb);
|
|
- make_tx_data_wr(c3cn, skb, len, req_completion);
|
|
- c3cn->snd_nxt += len;
|
|
- skb_flags(skb) &= ~C3CB_FLAG_NEED_HDR;
|
|
+ CXGB3_SKB_CB(skb)->flags &= ~C3CB_FLAG_NEED_HDR;
|
|
}
|
|
|
|
total_size += skb->truesize;
|
|
@@ -749,11 +735,8 @@
|
|
if (unlikely(c3cn_flag(c3cn, C3CN_ACTIVE_CLOSE_NEEDED)))
|
|
/* upper layer has requested closing */
|
|
send_abort_req(c3cn);
|
|
- else {
|
|
- if (skb_queue_len(&c3cn->write_queue))
|
|
- c3cn_push_tx_frames(c3cn, 1);
|
|
+ else if (c3cn_push_tx_frames(c3cn, 1))
|
|
cxgb3i_conn_tx_open(c3cn);
|
|
- }
|
|
}
|
|
|
|
static int do_act_establish(struct t3cdev *cdev, struct sk_buff *skb,
|
|
@@ -1099,8 +1082,8 @@
|
|
return;
|
|
}
|
|
|
|
- skb_tcp_seq(skb) = ntohl(hdr_cpl->seq);
|
|
- skb_flags(skb) = 0;
|
|
+ CXGB3_SKB_CB(skb)->seq = ntohl(hdr_cpl->seq);
|
|
+ CXGB3_SKB_CB(skb)->flags = 0;
|
|
|
|
skb_reset_transport_header(skb);
|
|
__skb_pull(skb, sizeof(struct cpl_iscsi_hdr));
|
|
@@ -1120,12 +1103,12 @@
|
|
goto abort_conn;
|
|
|
|
skb_ulp_mode(skb) = ULP2_FLAG_DATA_READY;
|
|
- skb_rx_pdulen(skb) = ntohs(ddp_cpl.len);
|
|
- skb_rx_ddigest(skb) = ntohl(ddp_cpl.ulp_crc);
|
|
+ skb_ulp_pdulen(skb) = ntohs(ddp_cpl.len);
|
|
+ skb_ulp_ddigest(skb) = ntohl(ddp_cpl.ulp_crc);
|
|
status = ntohl(ddp_cpl.ddp_status);
|
|
|
|
c3cn_rx_debug("rx skb 0x%p, len %u, pdulen %u, ddp status 0x%x.\n",
|
|
- skb, skb->len, skb_rx_pdulen(skb), status);
|
|
+ skb, skb->len, skb_ulp_pdulen(skb), status);
|
|
|
|
if (status & (1 << RX_DDP_STATUS_HCRC_SHIFT))
|
|
skb_ulp_mode(skb) |= ULP2_FLAG_HCRC_ERROR;
|
|
@@ -1143,7 +1126,7 @@
|
|
} else if (status & (1 << RX_DDP_STATUS_DDP_SHIFT))
|
|
skb_ulp_mode(skb) |= ULP2_FLAG_DATA_DDPED;
|
|
|
|
- c3cn->rcv_nxt = ntohl(ddp_cpl.seq) + skb_rx_pdulen(skb);
|
|
+ c3cn->rcv_nxt = ntohl(ddp_cpl.seq) + skb_ulp_pdulen(skb);
|
|
__pskb_trim(skb, len);
|
|
__skb_queue_tail(&c3cn->receive_queue, skb);
|
|
cxgb3i_conn_pdu_ready(c3cn);
|
|
@@ -1168,27 +1151,12 @@
|
|
* Process an acknowledgment of WR completion. Advance snd_una and send the
|
|
* next batch of work requests from the write queue.
|
|
*/
|
|
-static void check_wr_invariants(struct s3_conn *c3cn)
|
|
-{
|
|
- int pending = count_pending_wrs(c3cn);
|
|
-
|
|
- if (unlikely(c3cn->wr_avail + pending != c3cn->wr_max))
|
|
- cxgb3i_log_error("TID %u: credit imbalance: avail %u, "
|
|
- "pending %u, total should be %u\n",
|
|
- c3cn->tid, c3cn->wr_avail, pending,
|
|
- c3cn->wr_max);
|
|
-}
|
|
-
|
|
static void process_wr_ack(struct s3_conn *c3cn, struct sk_buff *skb)
|
|
{
|
|
struct cpl_wr_ack *hdr = cplhdr(skb);
|
|
unsigned int credits = ntohs(hdr->credits);
|
|
u32 snd_una = ntohl(hdr->snd_una);
|
|
|
|
- c3cn_tx_debug("%u WR credits, avail %u, unack %u, TID %u, state %u.\n",
|
|
- credits, c3cn->wr_avail, c3cn->wr_unacked,
|
|
- c3cn->tid, c3cn->state);
|
|
-
|
|
c3cn->wr_avail += credits;
|
|
if (c3cn->wr_unacked > c3cn->wr_max - c3cn->wr_avail)
|
|
c3cn->wr_unacked = c3cn->wr_max - c3cn->wr_avail;
|
|
@@ -1203,17 +1171,6 @@
|
|
break;
|
|
}
|
|
if (unlikely(credits < p->csum)) {
|
|
- struct tx_data_wr *w = cplhdr(p);
|
|
- cxgb3i_log_error("TID %u got %u WR credits need %u, "
|
|
- "len %u, main body %u, frags %u, "
|
|
- "seq # %u, ACK una %u, ACK nxt %u, "
|
|
- "WR_AVAIL %u, WRs pending %u\n",
|
|
- c3cn->tid, credits, p->csum, p->len,
|
|
- p->len - p->data_len,
|
|
- skb_shinfo(p)->nr_frags,
|
|
- ntohl(w->sndseq), snd_una,
|
|
- ntohl(hdr->snd_nxt), c3cn->wr_avail,
|
|
- count_pending_wrs(c3cn) - credits);
|
|
p->csum -= credits;
|
|
break;
|
|
} else {
|
|
@@ -1223,24 +1180,15 @@
|
|
}
|
|
}
|
|
|
|
- check_wr_invariants(c3cn);
|
|
-
|
|
- if (unlikely(before(snd_una, c3cn->snd_una))) {
|
|
- cxgb3i_log_error("TID %u, unexpected sequence # %u in WR_ACK "
|
|
- "snd_una %u\n",
|
|
- c3cn->tid, snd_una, c3cn->snd_una);
|
|
+ if (unlikely(before(snd_una, c3cn->snd_una)))
|
|
goto out_free;
|
|
- }
|
|
|
|
if (c3cn->snd_una != snd_una) {
|
|
c3cn->snd_una = snd_una;
|
|
dst_confirm(c3cn->dst_cache);
|
|
}
|
|
|
|
- if (skb_queue_len(&c3cn->write_queue)) {
|
|
- if (c3cn_push_tx_frames(c3cn, 0))
|
|
- cxgb3i_conn_tx_open(c3cn);
|
|
- } else
|
|
+ if (skb_queue_len(&c3cn->write_queue) && c3cn_push_tx_frames(c3cn, 0))
|
|
cxgb3i_conn_tx_open(c3cn);
|
|
out_free:
|
|
__kfree_skb(skb);
|
|
@@ -1504,7 +1452,7 @@
|
|
struct dst_entry *dst)
|
|
{
|
|
BUG_ON(c3cn->cdev != cdev);
|
|
- c3cn->wr_max = c3cn->wr_avail = T3C_DATA(cdev)->max_wrs - 1;
|
|
+ c3cn->wr_max = c3cn->wr_avail = T3C_DATA(cdev)->max_wrs;
|
|
c3cn->wr_unacked = 0;
|
|
c3cn->mss_idx = select_mss(c3cn, dst_mtu(dst));
|
|
|
|
@@ -1723,17 +1671,9 @@
|
|
goto out_err;
|
|
}
|
|
|
|
+ err = -EPIPE;
|
|
if (c3cn->err) {
|
|
c3cn_tx_debug("c3cn 0x%p, err %d.\n", c3cn, c3cn->err);
|
|
- err = -EPIPE;
|
|
- goto out_err;
|
|
- }
|
|
-
|
|
- if (c3cn->write_seq - c3cn->snd_una >= cxgb3_snd_win) {
|
|
- c3cn_tx_debug("c3cn 0x%p, snd %u - %u > %u.\n",
|
|
- c3cn, c3cn->write_seq, c3cn->snd_una,
|
|
- cxgb3_snd_win);
|
|
- err = -EAGAIN;
|
|
goto out_err;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.h linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -178,33 +178,25 @@
|
|
* @flag: see C3CB_FLAG_* below
|
|
* @ulp_mode: ULP mode/submode of sk_buff
|
|
* @seq: tcp sequence number
|
|
+ * @ddigest: pdu data digest
|
|
+ * @pdulen: recovered pdu length
|
|
+ * @wr_data: scratch area for tx wr
|
|
*/
|
|
-struct cxgb3_skb_rx_cb {
|
|
- __u32 ddigest; /* data digest */
|
|
- __u32 pdulen; /* recovered pdu length */
|
|
-};
|
|
-
|
|
-struct cxgb3_skb_tx_cb {
|
|
- struct sk_buff *wr_next; /* next wr */
|
|
-};
|
|
-
|
|
struct cxgb3_skb_cb {
|
|
__u8 flags;
|
|
__u8 ulp_mode;
|
|
__u32 seq;
|
|
- union {
|
|
- struct cxgb3_skb_rx_cb rx;
|
|
- struct cxgb3_skb_tx_cb tx;
|
|
- };
|
|
+ __u32 ddigest;
|
|
+ __u32 pdulen;
|
|
+ struct sk_buff *wr_data;
|
|
};
|
|
|
|
#define CXGB3_SKB_CB(skb) ((struct cxgb3_skb_cb *)&((skb)->cb[0]))
|
|
-#define skb_flags(skb) (CXGB3_SKB_CB(skb)->flags)
|
|
+
|
|
#define skb_ulp_mode(skb) (CXGB3_SKB_CB(skb)->ulp_mode)
|
|
-#define skb_tcp_seq(skb) (CXGB3_SKB_CB(skb)->seq)
|
|
-#define skb_rx_ddigest(skb) (CXGB3_SKB_CB(skb)->rx.ddigest)
|
|
-#define skb_rx_pdulen(skb) (CXGB3_SKB_CB(skb)->rx.pdulen)
|
|
-#define skb_tx_wr_next(skb) (CXGB3_SKB_CB(skb)->tx.wr_next)
|
|
+#define skb_ulp_ddigest(skb) (CXGB3_SKB_CB(skb)->ddigest)
|
|
+#define skb_ulp_pdulen(skb) (CXGB3_SKB_CB(skb)->pdulen)
|
|
+#define skb_wr_data(skb) (CXGB3_SKB_CB(skb)->wr_data)
|
|
|
|
enum c3cb_flags {
|
|
C3CB_FLAG_NEED_HDR = 1 << 0, /* packet needs a TX_DATA_WR header */
|
|
@@ -225,7 +217,6 @@
|
|
/* for TX: a skb must have a headroom of at least TX_HEADER_LEN bytes */
|
|
#define TX_HEADER_LEN \
|
|
(sizeof(struct tx_data_wr) + sizeof(struct sge_opaque_hdr))
|
|
-#define SKB_TX_HEADROOM SKB_MAX_HEAD(TX_HEADER_LEN)
|
|
|
|
/*
|
|
* get and set private ip for iscsi traffic
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -32,10 +32,6 @@
|
|
#define cxgb3i_tx_debug(fmt...)
|
|
#endif
|
|
|
|
-/* always allocate rooms for AHS */
|
|
-#define SKB_TX_PDU_HEADER_LEN \
|
|
- (sizeof(struct iscsi_hdr) + ISCSI_MAX_AHS_SIZE)
|
|
-static unsigned int skb_extra_headroom;
|
|
static struct page *pad_page;
|
|
|
|
/*
|
|
@@ -150,13 +146,12 @@
|
|
|
|
void cxgb3i_conn_cleanup_task(struct iscsi_task *task)
|
|
{
|
|
- struct cxgb3i_task_data *tdata = task->dd_data +
|
|
- sizeof(struct iscsi_tcp_task);
|
|
+ struct iscsi_tcp_task *tcp_task = task->dd_data;
|
|
|
|
/* never reached the xmit task callout */
|
|
- if (tdata->skb)
|
|
- __kfree_skb(tdata->skb);
|
|
- memset(tdata, 0, sizeof(struct cxgb3i_task_data));
|
|
+ if (tcp_task->dd_data)
|
|
+ kfree_skb(tcp_task->dd_data);
|
|
+ tcp_task->dd_data = NULL;
|
|
|
|
/* MNC - Do we need a check in case this is called but
|
|
* cxgb3i_conn_alloc_pdu has never been called on the task */
|
|
@@ -164,102 +159,28 @@
|
|
iscsi_tcp_cleanup_task(task);
|
|
}
|
|
|
|
-static int sgl_seek_offset(struct scatterlist *sgl, unsigned int sgcnt,
|
|
- unsigned int offset, unsigned int *off,
|
|
- struct scatterlist **sgp)
|
|
-{
|
|
- int i;
|
|
- struct scatterlist *sg;
|
|
-
|
|
- for_each_sg(sgl, sg, sgcnt, i) {
|
|
- if (offset < sg->length) {
|
|
- *off = offset;
|
|
- *sgp = sg;
|
|
- return 0;
|
|
- }
|
|
- offset -= sg->length;
|
|
- }
|
|
- return -EFAULT;
|
|
-}
|
|
-
|
|
-static int sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
|
|
- unsigned int dlen, skb_frag_t *frags,
|
|
- int frag_max)
|
|
-{
|
|
- unsigned int datalen = dlen;
|
|
- unsigned int sglen = sg->length - sgoffset;
|
|
- struct page *page = sg_page(sg);
|
|
- int i;
|
|
-
|
|
- i = 0;
|
|
- do {
|
|
- unsigned int copy;
|
|
-
|
|
- if (!sglen) {
|
|
- sg = sg_next(sg);
|
|
- if (!sg) {
|
|
- cxgb3i_log_error("%s, sg NULL, len %u/%u.\n",
|
|
- __func__, datalen, dlen);
|
|
- return -EINVAL;
|
|
- }
|
|
- sgoffset = 0;
|
|
- sglen = sg->length;
|
|
- page = sg_page(sg);
|
|
-
|
|
- }
|
|
- copy = min(datalen, sglen);
|
|
- if (i && page == frags[i - 1].page &&
|
|
- sgoffset + sg->offset ==
|
|
- frags[i - 1].page_offset + frags[i - 1].size) {
|
|
- frags[i - 1].size += copy;
|
|
- } else {
|
|
- if (i >= frag_max) {
|
|
- cxgb3i_log_error("%s, too many pages %u, "
|
|
- "dlen %u.\n", __func__,
|
|
- frag_max, dlen);
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- frags[i].page = page;
|
|
- frags[i].page_offset = sg->offset + sgoffset;
|
|
- frags[i].size = copy;
|
|
- i++;
|
|
- }
|
|
- datalen -= copy;
|
|
- sgoffset += copy;
|
|
- sglen -= copy;
|
|
- } while (datalen);
|
|
-
|
|
- return i;
|
|
-}
|
|
-
|
|
+/*
|
|
+ * We do not support ahs yet
|
|
+ */
|
|
int cxgb3i_conn_alloc_pdu(struct iscsi_task *task, u8 opcode)
|
|
{
|
|
- struct iscsi_conn *conn = task->conn;
|
|
struct iscsi_tcp_task *tcp_task = task->dd_data;
|
|
- struct cxgb3i_task_data *tdata = task->dd_data + sizeof(*tcp_task);
|
|
- struct scsi_cmnd *sc = task->sc;
|
|
- int headroom = SKB_TX_PDU_HEADER_LEN;
|
|
+ struct sk_buff *skb;
|
|
|
|
- tcp_task->dd_data = tdata;
|
|
task->hdr = NULL;
|
|
-
|
|
- /* write command, need to send data pdus */
|
|
- if (skb_extra_headroom && (opcode == ISCSI_OP_SCSI_DATA_OUT ||
|
|
- (opcode == ISCSI_OP_SCSI_CMD &&
|
|
- (scsi_bidi_cmnd(sc) || sc->sc_data_direction == DMA_TO_DEVICE))))
|
|
- headroom += min(skb_extra_headroom, conn->max_xmit_dlength);
|
|
-
|
|
- tdata->skb = alloc_skb(TX_HEADER_LEN + headroom, GFP_ATOMIC);
|
|
- if (!tdata->skb)
|
|
+ /* always allocate rooms for AHS */
|
|
+ skb = alloc_skb(sizeof(struct iscsi_hdr) + ISCSI_MAX_AHS_SIZE +
|
|
+ TX_HEADER_LEN, GFP_ATOMIC);
|
|
+ if (!skb)
|
|
return -ENOMEM;
|
|
- skb_reserve(tdata->skb, TX_HEADER_LEN);
|
|
|
|
cxgb3i_tx_debug("task 0x%p, opcode 0x%x, skb 0x%p.\n",
|
|
- task, opcode, tdata->skb);
|
|
+ task, opcode, skb);
|
|
|
|
- task->hdr = (struct iscsi_hdr *)tdata->skb->data;
|
|
- task->hdr_max = SKB_TX_PDU_HEADER_LEN;
|
|
+ tcp_task->dd_data = skb;
|
|
+ skb_reserve(skb, TX_HEADER_LEN);
|
|
+ task->hdr = (struct iscsi_hdr *)skb->data;
|
|
+ task->hdr_max = sizeof(struct iscsi_hdr);
|
|
|
|
/* data_out uses scsi_cmd's itt */
|
|
if (opcode != ISCSI_OP_SCSI_DATA_OUT)
|
|
@@ -271,13 +192,13 @@
|
|
int cxgb3i_conn_init_pdu(struct iscsi_task *task, unsigned int offset,
|
|
unsigned int count)
|
|
{
|
|
- struct iscsi_conn *conn = task->conn;
|
|
struct iscsi_tcp_task *tcp_task = task->dd_data;
|
|
- struct cxgb3i_task_data *tdata = tcp_task->dd_data;
|
|
- struct sk_buff *skb = tdata->skb;
|
|
+ struct sk_buff *skb = tcp_task->dd_data;
|
|
+ struct iscsi_conn *conn = task->conn;
|
|
+ struct page *pg;
|
|
unsigned int datalen = count;
|
|
int i, padlen = iscsi_padding(count);
|
|
- struct page *pg;
|
|
+ skb_frag_t *frag;
|
|
|
|
cxgb3i_tx_debug("task 0x%p,0x%p, offset %u, count %u, skb 0x%p.\n",
|
|
task, task->sc, offset, count, skb);
|
|
@@ -288,94 +209,90 @@
|
|
return 0;
|
|
|
|
if (task->sc) {
|
|
- struct scsi_data_buffer *sdb = scsi_out(task->sc);
|
|
- struct scatterlist *sg = NULL;
|
|
- int err;
|
|
-
|
|
- tdata->offset = offset;
|
|
- tdata->count = count;
|
|
- err = sgl_seek_offset(sdb->table.sgl, sdb->table.nents,
|
|
- tdata->offset, &tdata->sgoffset, &sg);
|
|
- if (err < 0) {
|
|
- cxgb3i_log_warn("tpdu, sgl %u, bad offset %u/%u.\n",
|
|
- sdb->table.nents, tdata->offset,
|
|
- sdb->length);
|
|
- return err;
|
|
+ struct scatterlist *sg;
|
|
+ struct scsi_data_buffer *sdb;
|
|
+ unsigned int sgoffset = offset;
|
|
+ struct page *sgpg;
|
|
+ unsigned int sglen;
|
|
+
|
|
+ sdb = scsi_out(task->sc);
|
|
+ sg = sdb->table.sgl;
|
|
+
|
|
+ for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
|
|
+ cxgb3i_tx_debug("sg %d, page 0x%p, len %u offset %u\n",
|
|
+ i, sg_page(sg), sg->length, sg->offset);
|
|
+
|
|
+ if (sgoffset < sg->length)
|
|
+ break;
|
|
+ sgoffset -= sg->length;
|
|
}
|
|
- err = sgl_read_to_frags(sg, tdata->sgoffset, tdata->count,
|
|
- tdata->frags, MAX_PDU_FRAGS);
|
|
- if (err < 0) {
|
|
- cxgb3i_log_warn("tpdu, sgl %u, bad offset %u + %u.\n",
|
|
- sdb->table.nents, tdata->offset,
|
|
- tdata->count);
|
|
- return err;
|
|
- }
|
|
- tdata->nr_frags = err;
|
|
+ sgpg = sg_page(sg);
|
|
+ sglen = sg->length - sgoffset;
|
|
|
|
- if (tdata->nr_frags > MAX_SKB_FRAGS ||
|
|
- (padlen && tdata->nr_frags == MAX_SKB_FRAGS)) {
|
|
- char *dst = skb->data + task->hdr_len;
|
|
- skb_frag_t *frag = tdata->frags;
|
|
-
|
|
- /* data fits in the skb's headroom */
|
|
- for (i = 0; i < tdata->nr_frags; i++, frag++) {
|
|
- char *src = kmap_atomic(frag->page,
|
|
- KM_SOFTIRQ0);
|
|
-
|
|
- memcpy(dst, src+frag->page_offset, frag->size);
|
|
- dst += frag->size;
|
|
- kunmap_atomic(src, KM_SOFTIRQ0);
|
|
+ do {
|
|
+ int j = skb_shinfo(skb)->nr_frags;
|
|
+ unsigned int copy;
|
|
+
|
|
+ if (!sglen) {
|
|
+ sg = sg_next(sg);
|
|
+ sgpg = sg_page(sg);
|
|
+ sgoffset = 0;
|
|
+ sglen = sg->length;
|
|
+ ++i;
|
|
}
|
|
- if (padlen) {
|
|
- memset(dst, 0, padlen);
|
|
- padlen = 0;
|
|
+ copy = min(sglen, datalen);
|
|
+ if (j && skb_can_coalesce(skb, j, sgpg,
|
|
+ sg->offset + sgoffset)) {
|
|
+ skb_shinfo(skb)->frags[j - 1].size += copy;
|
|
+ } else {
|
|
+ get_page(sgpg);
|
|
+ skb_fill_page_desc(skb, j, sgpg,
|
|
+ sg->offset + sgoffset, copy);
|
|
}
|
|
- skb_put(skb, count + padlen);
|
|
- } else {
|
|
- /* data fit into frag_list */
|
|
- for (i = 0; i < tdata->nr_frags; i++)
|
|
- get_page(tdata->frags[i].page);
|
|
-
|
|
- memcpy(skb_shinfo(skb)->frags, tdata->frags,
|
|
- sizeof(skb_frag_t) * tdata->nr_frags);
|
|
- skb_shinfo(skb)->nr_frags = tdata->nr_frags;
|
|
- skb->len += count;
|
|
- skb->data_len += count;
|
|
- skb->truesize += count;
|
|
- }
|
|
-
|
|
+ sgoffset += copy;
|
|
+ sglen -= copy;
|
|
+ datalen -= copy;
|
|
+ } while (datalen);
|
|
} else {
|
|
pg = virt_to_page(task->data);
|
|
|
|
- get_page(pg);
|
|
- skb_fill_page_desc(skb, 0, pg, offset_in_page(task->data),
|
|
- count);
|
|
- skb->len += count;
|
|
- skb->data_len += count;
|
|
- skb->truesize += count;
|
|
+ while (datalen) {
|
|
+ i = skb_shinfo(skb)->nr_frags;
|
|
+ frag = &skb_shinfo(skb)->frags[i];
|
|
+
|
|
+ get_page(pg);
|
|
+ frag->page = pg;
|
|
+ frag->page_offset = 0;
|
|
+ frag->size = min((unsigned int)PAGE_SIZE, datalen);
|
|
+
|
|
+ skb_shinfo(skb)->nr_frags++;
|
|
+ datalen -= frag->size;
|
|
+ pg++;
|
|
+ }
|
|
}
|
|
|
|
if (padlen) {
|
|
i = skb_shinfo(skb)->nr_frags;
|
|
- get_page(pad_page);
|
|
- skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, pad_page, 0,
|
|
- padlen);
|
|
-
|
|
- skb->data_len += padlen;
|
|
- skb->truesize += padlen;
|
|
- skb->len += padlen;
|
|
+ frag = &skb_shinfo(skb)->frags[i];
|
|
+ frag->page = pad_page;
|
|
+ frag->page_offset = 0;
|
|
+ frag->size = padlen;
|
|
+ skb_shinfo(skb)->nr_frags++;
|
|
}
|
|
|
|
+ datalen = count + padlen;
|
|
+ skb->data_len += datalen;
|
|
+ skb->truesize += datalen;
|
|
+ skb->len += datalen;
|
|
return 0;
|
|
}
|
|
|
|
int cxgb3i_conn_xmit_pdu(struct iscsi_task *task)
|
|
{
|
|
+ struct iscsi_tcp_task *tcp_task = task->dd_data;
|
|
+ struct sk_buff *skb = tcp_task->dd_data;
|
|
struct iscsi_tcp_conn *tcp_conn = task->conn->dd_data;
|
|
struct cxgb3i_conn *cconn = tcp_conn->dd_data;
|
|
- struct iscsi_tcp_task *tcp_task = task->dd_data;
|
|
- struct cxgb3i_task_data *tdata = tcp_task->dd_data;
|
|
- struct sk_buff *skb = tdata->skb;
|
|
unsigned int datalen;
|
|
int err;
|
|
|
|
@@ -383,13 +300,12 @@
|
|
return 0;
|
|
|
|
datalen = skb->data_len;
|
|
- tdata->skb = NULL;
|
|
+ tcp_task->dd_data = NULL;
|
|
err = cxgb3i_c3cn_send_pdus(cconn->cep->c3cn, skb);
|
|
- if (err > 0) {
|
|
- int pdulen = err;
|
|
-
|
|
cxgb3i_tx_debug("task 0x%p, skb 0x%p, len %u/%u, rv %d.\n",
|
|
task, skb, skb->len, skb->data_len, err);
|
|
+ if (err > 0) {
|
|
+ int pdulen = err;
|
|
|
|
if (task->conn->hdrdgst_en)
|
|
pdulen += ISCSI_DIGEST_SIZE;
|
|
@@ -409,14 +325,12 @@
|
|
return err;
|
|
}
|
|
/* reset skb to send when we are called again */
|
|
- tdata->skb = skb;
|
|
+ tcp_task->dd_data = skb;
|
|
return -EAGAIN;
|
|
}
|
|
|
|
int cxgb3i_pdu_init(void)
|
|
{
|
|
- if (SKB_TX_HEADROOM > (512 * MAX_SKB_FRAGS))
|
|
- skb_extra_headroom = SKB_TX_HEADROOM;
|
|
pad_page = alloc_page(GFP_KERNEL);
|
|
if (!pad_page)
|
|
return -ENOMEM;
|
|
@@ -452,9 +366,7 @@
|
|
skb = skb_peek(&c3cn->receive_queue);
|
|
while (!err && skb) {
|
|
__skb_unlink(skb, &c3cn->receive_queue);
|
|
- read += skb_rx_pdulen(skb);
|
|
- cxgb3i_rx_debug("conn 0x%p, cn 0x%p, rx skb 0x%p, pdulen %u.\n",
|
|
- conn, c3cn, skb, skb_rx_pdulen(skb));
|
|
+ read += skb_ulp_pdulen(skb);
|
|
err = cxgb3i_conn_read_pdu_skb(conn, skb);
|
|
__kfree_skb(skb);
|
|
skb = skb_peek(&c3cn->receive_queue);
|
|
@@ -465,11 +377,6 @@
|
|
cxgb3i_c3cn_rx_credits(c3cn, read);
|
|
}
|
|
conn->rxdata_octets += read;
|
|
-
|
|
- if (err) {
|
|
- cxgb3i_log_info("conn 0x%p rx failed err %d.\n", conn, err);
|
|
- iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
|
|
- }
|
|
}
|
|
|
|
void cxgb3i_conn_tx_open(struct s3_conn *c3cn)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.h linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -53,7 +53,7 @@
|
|
#define ULP2_FLAG_DCRC_ERROR 0x20
|
|
#define ULP2_FLAG_PAD_ERROR 0x40
|
|
|
|
-void cxgb3i_conn_closing(struct s3_conn *c3cn);
|
|
+void cxgb3i_conn_closing(struct s3_conn *);
|
|
void cxgb3i_conn_pdu_ready(struct s3_conn *c3cn);
|
|
void cxgb3i_conn_tx_open(struct s3_conn *c3cn);
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/fcoe/fcoe_sw.c linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/fcoe_sw.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/fcoe/fcoe_sw.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/fcoe_sw.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -104,19 +104,19 @@
|
|
.max_sectors = 0xffff,
|
|
};
|
|
|
|
-/**
|
|
- * fcoe_sw_lport_config() - sets up the fc_lport
|
|
+/*
|
|
+ * fcoe_sw_lport_config - sets up the fc_lport
|
|
* @lp: ptr to the fc_lport
|
|
* @shost: ptr to the parent scsi host
|
|
*
|
|
* Returns: 0 for success
|
|
+ *
|
|
*/
|
|
static int fcoe_sw_lport_config(struct fc_lport *lp)
|
|
{
|
|
int i = 0;
|
|
|
|
- lp->link_up = 0;
|
|
- lp->qfull = 0;
|
|
+ lp->link_status = 0;
|
|
lp->max_retry_count = 3;
|
|
lp->e_d_tov = 2 * 1000; /* FC-FS default */
|
|
lp->r_a_tov = 2 * 2 * 1000;
|
|
@@ -136,14 +136,16 @@
|
|
return 0;
|
|
}
|
|
|
|
-/**
|
|
- * fcoe_sw_netdev_config() - Set up netdev for SW FCoE
|
|
+/*
|
|
+ * fcoe_sw_netdev_config - sets up fcoe_softc for lport and network
|
|
+ * related properties
|
|
* @lp : ptr to the fc_lport
|
|
* @netdev : ptr to the associated netdevice struct
|
|
*
|
|
* Must be called after fcoe_sw_lport_config() as it will use lport mutex
|
|
*
|
|
* Returns : 0 for success
|
|
+ *
|
|
*/
|
|
static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)
|
|
{
|
|
@@ -179,8 +181,9 @@
|
|
if (fc_set_mfs(lp, mfs))
|
|
return -EINVAL;
|
|
|
|
+ lp->link_status = ~FC_PAUSE & ~FC_LINK_UP;
|
|
if (!fcoe_link_ok(lp))
|
|
- lp->link_up = 1;
|
|
+ lp->link_status |= FC_LINK_UP;
|
|
|
|
/* offload features support */
|
|
if (fc->real_dev->features & NETIF_F_SG)
|
|
@@ -188,7 +191,6 @@
|
|
|
|
|
|
skb_queue_head_init(&fc->fcoe_pending_queue);
|
|
- fc->fcoe_pending_queue_active = 0;
|
|
|
|
/* setup Source Mac Address */
|
|
memcpy(fc->ctl_src_addr, fc->real_dev->dev_addr,
|
|
@@ -222,15 +224,16 @@
|
|
return 0;
|
|
}
|
|
|
|
-/**
|
|
- * fcoe_sw_shost_config() - Sets up fc_lport->host
|
|
+/*
|
|
+ * fcoe_sw_shost_config - sets up fc_lport->host
|
|
* @lp : ptr to the fc_lport
|
|
* @shost : ptr to the associated scsi host
|
|
* @dev : device associated to scsi host
|
|
*
|
|
- * Must be called after fcoe_sw_lport_config() and fcoe_sw_netdev_config()
|
|
+ * Must be called after fcoe_sw_lport_config) and fcoe_sw_netdev_config()
|
|
*
|
|
* Returns : 0 for success
|
|
+ *
|
|
*/
|
|
static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost,
|
|
struct device *dev)
|
|
@@ -258,8 +261,8 @@
|
|
return 0;
|
|
}
|
|
|
|
-/**
|
|
- * fcoe_sw_em_config() - allocates em for this lport
|
|
+/*
|
|
+ * fcoe_sw_em_config - allocates em for this lport
|
|
* @lp: the port that em is to allocated for
|
|
*
|
|
* Returns : 0 on success
|
|
@@ -276,8 +279,8 @@
|
|
return 0;
|
|
}
|
|
|
|
-/**
|
|
- * fcoe_sw_destroy() - FCoE software HBA tear-down function
|
|
+/*
|
|
+ * fcoe_sw_destroy - FCoE software HBA tear-down function
|
|
* @netdev: ptr to the associated net_device
|
|
*
|
|
* Returns: 0 if link is OK for use by FCoE.
|
|
@@ -298,7 +301,7 @@
|
|
if (!lp)
|
|
return -ENODEV;
|
|
|
|
- fc = lport_priv(lp);
|
|
+ fc = fcoe_softc(lp);
|
|
|
|
/* Logout of the fabric */
|
|
fc_fabric_logoff(lp);
|
|
@@ -350,8 +353,8 @@
|
|
.frame_send = fcoe_xmit,
|
|
};
|
|
|
|
-/**
|
|
- * fcoe_sw_create() - this function creates the fcoe interface
|
|
+/*
|
|
+ * fcoe_sw_create - this function creates the fcoe interface
|
|
* @netdev: pointer the associated netdevice
|
|
*
|
|
* Creates fc_lport struct and scsi_host for lport, configures lport
|
|
@@ -437,8 +440,8 @@
|
|
return rc;
|
|
}
|
|
|
|
-/**
|
|
- * fcoe_sw_match() - The FCoE SW transport match function
|
|
+/*
|
|
+ * fcoe_sw_match - the fcoe sw transport match function
|
|
*
|
|
* Returns : false always
|
|
*/
|
|
@@ -458,8 +461,8 @@
|
|
.device = 0xffff,
|
|
};
|
|
|
|
-/**
|
|
- * fcoe_sw_init() - Registers fcoe_sw_transport
|
|
+/*
|
|
+ * fcoe_sw_init - registers fcoe_sw_transport
|
|
*
|
|
* Returns : 0 on success
|
|
*/
|
|
@@ -468,22 +471,17 @@
|
|
/* attach to scsi transport */
|
|
scsi_transport_fcoe_sw =
|
|
fc_attach_transport(&fcoe_sw_transport_function);
|
|
-
|
|
if (!scsi_transport_fcoe_sw) {
|
|
printk(KERN_ERR "fcoe_sw_init:fc_attach_transport() failed\n");
|
|
return -ENODEV;
|
|
}
|
|
-
|
|
- mutex_init(&fcoe_sw_transport.devlock);
|
|
- INIT_LIST_HEAD(&fcoe_sw_transport.devlist);
|
|
-
|
|
/* register sw transport */
|
|
fcoe_transport_register(&fcoe_sw_transport);
|
|
return 0;
|
|
}
|
|
|
|
-/**
|
|
- * fcoe_sw_exit() - Unregisters fcoe_sw_transport
|
|
+/*
|
|
+ * fcoe_sw_exit - unregisters fcoe_sw_transport
|
|
*
|
|
* Returns : 0 on success
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/fcoe/fc_transport_fcoe.c linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/fc_transport_fcoe.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/fcoe/fc_transport_fcoe.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/fc_transport_fcoe.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -33,19 +33,19 @@
|
|
static DEFINE_MUTEX(fcoe_transports_lock);
|
|
|
|
/**
|
|
- * fcoe_transport_default() - Returns ptr to the default transport fcoe_sw
|
|
- */
|
|
+ * fcoe_transport_default - returns ptr to the default transport fcoe_sw
|
|
+ **/
|
|
struct fcoe_transport *fcoe_transport_default(void)
|
|
{
|
|
return &fcoe_sw_transport;
|
|
}
|
|
|
|
/**
|
|
- * fcoe_transport_to_pcidev() - get the pci dev from a netdev
|
|
+ * fcoe_transport_to_pcidev - get the pci dev from a netdev
|
|
* @netdev: the netdev that pci dev will be retrived from
|
|
*
|
|
* Returns: NULL or the corrsponding pci_dev
|
|
- */
|
|
+ **/
|
|
struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev)
|
|
{
|
|
if (!netdev->dev.parent)
|
|
@@ -54,17 +54,18 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_transport_device_lookup() - Lookup a transport
|
|
+ * fcoe_transport_device_lookup - find out netdev is managed by the
|
|
+ * transport
|
|
+ * assign a transport to a device
|
|
* @netdev: the netdev the transport to be attached to
|
|
*
|
|
* This will look for existing offload driver, if not found, it falls back to
|
|
* the default sw hba (fcoe_sw) as its fcoe transport.
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
-static struct fcoe_transport_internal *
|
|
-fcoe_transport_device_lookup(struct fcoe_transport *t,
|
|
- struct net_device *netdev)
|
|
+ **/
|
|
+static struct fcoe_transport_internal *fcoe_transport_device_lookup(
|
|
+ struct fcoe_transport *t, struct net_device *netdev)
|
|
{
|
|
struct fcoe_transport_internal *ti;
|
|
|
|
@@ -80,14 +81,14 @@
|
|
return NULL;
|
|
}
|
|
/**
|
|
- * fcoe_transport_device_add() - Assign a transport to a device
|
|
+ * fcoe_transport_device_add - assign a transport to a device
|
|
* @netdev: the netdev the transport to be attached to
|
|
*
|
|
* This will look for existing offload driver, if not found, it falls back to
|
|
* the default sw hba (fcoe_sw) as its fcoe transport.
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static int fcoe_transport_device_add(struct fcoe_transport *t,
|
|
struct net_device *netdev)
|
|
{
|
|
@@ -122,14 +123,14 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_transport_device_remove() - Remove a device from its transport
|
|
+ * fcoe_transport_device_remove - remove a device from its transport
|
|
* @netdev: the netdev the transport to be attached to
|
|
*
|
|
- * This removes the device from the transport so the given transport will
|
|
+ * this removes the device from the transport so the given transport will
|
|
* not manage this device any more
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static int fcoe_transport_device_remove(struct fcoe_transport *t,
|
|
struct net_device *netdev)
|
|
{
|
|
@@ -154,13 +155,13 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_transport_device_remove_all() - Remove all from transport devlist
|
|
+ * fcoe_transport_device_remove_all - remove all from transport devlist
|
|
*
|
|
- * This removes the device from the transport so the given transport will
|
|
+ * this removes the device from the transport so the given transport will
|
|
* not manage this device any more
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static void fcoe_transport_device_remove_all(struct fcoe_transport *t)
|
|
{
|
|
struct fcoe_transport_internal *ti, *tmp;
|
|
@@ -174,18 +175,18 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_transport_match() - Use the bus device match function to match the hw
|
|
- * @t: The fcoe transport to check
|
|
- * @netdev: The netdev to match against
|
|
+ * fcoe_transport_match - use the bus device match function to match the hw
|
|
+ * @t: the fcoe transport
|
|
+ * @netdev:
|
|
*
|
|
- * This function is used to check if the given transport wants to manage the
|
|
+ * This function is used to check if the givne transport wants to manage the
|
|
* input netdev. if the transports implements the match function, it will be
|
|
* called, o.w. we just compare the pci vendor and device id.
|
|
*
|
|
* Returns: true for match up
|
|
- */
|
|
+ **/
|
|
static bool fcoe_transport_match(struct fcoe_transport *t,
|
|
- struct net_device *netdev)
|
|
+ struct net_device *netdev)
|
|
{
|
|
/* match transport by vendor and device id */
|
|
struct pci_dev *pci;
|
|
@@ -209,17 +210,17 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_transport_lookup() - Check if the transport is already registered
|
|
+ * fcoe_transport_lookup - check if the transport is already registered
|
|
* @t: the transport to be looked up
|
|
*
|
|
* This compares the parent device (pci) vendor and device id
|
|
*
|
|
* Returns: NULL if not found
|
|
*
|
|
- * TODO: return default sw transport if no other transport is found
|
|
- */
|
|
-static struct fcoe_transport *
|
|
-fcoe_transport_lookup(struct net_device *netdev)
|
|
+ * TODO - return default sw transport if no other transport is found
|
|
+ **/
|
|
+static struct fcoe_transport *fcoe_transport_lookup(
|
|
+ struct net_device *netdev)
|
|
{
|
|
struct fcoe_transport *t;
|
|
|
|
@@ -238,11 +239,11 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_transport_register() - Adds a fcoe transport to the fcoe transports list
|
|
+ * fcoe_transport_register - adds a fcoe transport to the fcoe transports list
|
|
* @t: ptr to the fcoe transport to be added
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
int fcoe_transport_register(struct fcoe_transport *t)
|
|
{
|
|
struct fcoe_transport *tt;
|
|
@@ -258,6 +259,9 @@
|
|
list_add_tail(&t->list, &fcoe_transports);
|
|
mutex_unlock(&fcoe_transports_lock);
|
|
|
|
+ mutex_init(&t->devlock);
|
|
+ INIT_LIST_HEAD(&t->devlist);
|
|
+
|
|
printk(KERN_DEBUG "fcoe_transport_register:%s\n", t->name);
|
|
|
|
return 0;
|
|
@@ -265,11 +269,11 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_transport_register);
|
|
|
|
/**
|
|
- * fcoe_transport_unregister() - Remove the tranport fro the fcoe transports list
|
|
+ * fcoe_transport_unregister - remove the tranport fro the fcoe transports list
|
|
* @t: ptr to the fcoe transport to be removed
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
int fcoe_transport_unregister(struct fcoe_transport *t)
|
|
{
|
|
struct fcoe_transport *tt, *tmp;
|
|
@@ -290,8 +294,8 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(fcoe_transport_unregister);
|
|
|
|
-/**
|
|
- * fcoe_load_transport_driver() - Load an offload driver by alias name
|
|
+/*
|
|
+ * fcoe_load_transport_driver - load an offload driver by alias name
|
|
* @netdev: the target net device
|
|
*
|
|
* Requests for an offload driver module as the fcoe transport, if fails, it
|
|
@@ -303,7 +307,7 @@
|
|
* 3. pure hw fcoe hba may not have netdev
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
int fcoe_load_transport_driver(struct net_device *netdev)
|
|
{
|
|
struct pci_dev *pci;
|
|
@@ -331,14 +335,14 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_load_transport_driver);
|
|
|
|
/**
|
|
- * fcoe_transport_attach() - Load transport to fcoe
|
|
+ * fcoe_transport_attach - load transport to fcoe
|
|
* @netdev: the netdev the transport to be attached to
|
|
*
|
|
* This will look for existing offload driver, if not found, it falls back to
|
|
* the default sw hba (fcoe_sw) as its fcoe transport.
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
int fcoe_transport_attach(struct net_device *netdev)
|
|
{
|
|
struct fcoe_transport *t;
|
|
@@ -369,11 +373,11 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_transport_attach);
|
|
|
|
/**
|
|
- * fcoe_transport_release() - Unload transport from fcoe
|
|
+ * fcoe_transport_release - unload transport from fcoe
|
|
* @netdev: the net device on which fcoe is to be released
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
int fcoe_transport_release(struct net_device *netdev)
|
|
{
|
|
struct fcoe_transport *t;
|
|
@@ -406,12 +410,12 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_transport_release);
|
|
|
|
/**
|
|
- * fcoe_transport_init() - Initializes fcoe transport layer
|
|
+ * fcoe_transport_init - initializes fcoe transport layer
|
|
*
|
|
* This prepares for the fcoe transport layer
|
|
*
|
|
* Returns: none
|
|
- */
|
|
+ **/
|
|
int __init fcoe_transport_init(void)
|
|
{
|
|
INIT_LIST_HEAD(&fcoe_transports);
|
|
@@ -420,13 +424,12 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_transport_exit() - Cleans up the fcoe transport layer
|
|
- *
|
|
+ * fcoe_transport_exit - cleans up the fcoe transport layer
|
|
* This cleans up the fcoe transport layer. removing any transport on the list,
|
|
* note that the transport destroy func is not called here.
|
|
*
|
|
* Returns: none
|
|
- */
|
|
+ **/
|
|
int __exit fcoe_transport_exit(void)
|
|
{
|
|
struct fcoe_transport *t, *tmp;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/fcoe/libfcoe.c linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/libfcoe.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/fcoe/libfcoe.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/libfcoe.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -49,7 +49,6 @@
|
|
static int debug_fcoe;
|
|
|
|
#define FCOE_MAX_QUEUE_DEPTH 256
|
|
-#define FCOE_LOW_QUEUE_DEPTH 32
|
|
|
|
/* destination address mode */
|
|
#define FCOE_GW_ADDR_MODE 0x00
|
|
@@ -70,6 +69,8 @@
|
|
|
|
/* Function Prototyes */
|
|
static int fcoe_check_wait_queue(struct fc_lport *);
|
|
+static void fcoe_insert_wait_queue_head(struct fc_lport *, struct sk_buff *);
|
|
+static void fcoe_insert_wait_queue(struct fc_lport *, struct sk_buff *);
|
|
static void fcoe_recv_flogi(struct fcoe_softc *, struct fc_frame *, u8 *);
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
static int fcoe_cpu_callback(struct notifier_block *, ulong, void *);
|
|
@@ -90,13 +91,13 @@
|
|
};
|
|
|
|
/**
|
|
- * fcoe_create_percpu_data() - creates the associated cpu data
|
|
+ * fcoe_create_percpu_data - creates the associated cpu data
|
|
* @cpu: index for the cpu where fcoe cpu data will be created
|
|
*
|
|
* create percpu stats block, from cpu add notifier
|
|
*
|
|
* Returns: none
|
|
- */
|
|
+ **/
|
|
static void fcoe_create_percpu_data(int cpu)
|
|
{
|
|
struct fc_lport *lp;
|
|
@@ -114,13 +115,13 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_destroy_percpu_data() - destroys the associated cpu data
|
|
+ * fcoe_destroy_percpu_data - destroys the associated cpu data
|
|
* @cpu: index for the cpu where fcoe cpu data will destroyed
|
|
*
|
|
* destroy percpu stats block called by cpu add/remove notifier
|
|
*
|
|
* Retuns: none
|
|
- */
|
|
+ **/
|
|
static void fcoe_destroy_percpu_data(int cpu)
|
|
{
|
|
struct fc_lport *lp;
|
|
@@ -136,7 +137,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_cpu_callback() - fcoe cpu hotplug event callback
|
|
+ * fcoe_cpu_callback - fcoe cpu hotplug event callback
|
|
* @nfb: callback data block
|
|
* @action: event triggering the callback
|
|
* @hcpu: index for the cpu of this event
|
|
@@ -144,7 +145,7 @@
|
|
* this creates or destroys per cpu data for fcoe
|
|
*
|
|
* Returns NOTIFY_OK always.
|
|
- */
|
|
+ **/
|
|
static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action,
|
|
void *hcpu)
|
|
{
|
|
@@ -165,7 +166,7 @@
|
|
#endif /* CONFIG_HOTPLUG_CPU */
|
|
|
|
/**
|
|
- * fcoe_rcv() - this is the fcoe receive function called by NET_RX_SOFTIRQ
|
|
+ * fcoe_rcv - this is the fcoe receive function called by NET_RX_SOFTIRQ
|
|
* @skb: the receive skb
|
|
* @dev: associated net device
|
|
* @ptype: context
|
|
@@ -174,7 +175,7 @@
|
|
* this function will receive the packet and build fc frame and pass it up
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
int fcoe_rcv(struct sk_buff *skb, struct net_device *dev,
|
|
struct packet_type *ptype, struct net_device *olddev)
|
|
{
|
|
@@ -264,11 +265,11 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_rcv);
|
|
|
|
/**
|
|
- * fcoe_start_io() - pass to netdev to start xmit for fcoe
|
|
+ * fcoe_start_io - pass to netdev to start xmit for fcoe
|
|
* @skb: the skb to be xmitted
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static inline int fcoe_start_io(struct sk_buff *skb)
|
|
{
|
|
int rc;
|
|
@@ -282,12 +283,12 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof
|
|
+ * fcoe_get_paged_crc_eof - in case we need alloc a page for crc_eof
|
|
* @skb: the skb to be xmitted
|
|
* @tlen: total len
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen)
|
|
{
|
|
struct fcoe_percpu_s *fps;
|
|
@@ -325,12 +326,13 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_fc_crc() - calculates FC CRC in this fcoe skb
|
|
+ * fcoe_fc_crc - calculates FC CRC in this fcoe skb
|
|
* @fp: the fc_frame containg data to be checksummed
|
|
*
|
|
* This uses crc32() to calculate the crc for fc frame
|
|
* Return : 32 bit crc
|
|
- */
|
|
+ *
|
|
+ **/
|
|
u32 fcoe_fc_crc(struct fc_frame *fp)
|
|
{
|
|
struct sk_buff *skb = fp_skb(fp);
|
|
@@ -361,12 +363,13 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_fc_crc);
|
|
|
|
/**
|
|
- * fcoe_xmit() - FCoE frame transmit function
|
|
+ * fcoe_xmit - FCoE frame transmit function
|
|
* @lp: the associated local port
|
|
* @fp: the fc_frame to be transmitted
|
|
*
|
|
* Return : 0 for success
|
|
- */
|
|
+ *
|
|
+ **/
|
|
int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
|
|
{
|
|
int wlen, rc = 0;
|
|
@@ -386,7 +389,7 @@
|
|
|
|
WARN_ON((fr_len(fp) % sizeof(u32)) != 0);
|
|
|
|
- fc = lport_priv(lp);
|
|
+ fc = fcoe_softc(lp);
|
|
/*
|
|
* if it is a flogi then we need to learn gw-addr
|
|
* and my own fcid
|
|
@@ -436,7 +439,7 @@
|
|
if (skb_is_nonlinear(skb)) {
|
|
skb_frag_t *frag;
|
|
if (fcoe_get_paged_crc_eof(skb, tlen)) {
|
|
- kfree_skb(skb);
|
|
+ kfree(skb);
|
|
return -ENOMEM;
|
|
}
|
|
frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
|
|
@@ -499,22 +502,21 @@
|
|
rc = fcoe_start_io(skb);
|
|
|
|
if (rc) {
|
|
- spin_lock_bh(&fc->fcoe_pending_queue.lock);
|
|
- __skb_queue_tail(&fc->fcoe_pending_queue, skb);
|
|
- spin_unlock_bh(&fc->fcoe_pending_queue.lock);
|
|
+ fcoe_insert_wait_queue(lp, skb);
|
|
if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
|
|
- lp->qfull = 1;
|
|
+ fc_pause(lp);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(fcoe_xmit);
|
|
|
|
-/**
|
|
- * fcoe_percpu_receive_thread() - recv thread per cpu
|
|
+/*
|
|
+ * fcoe_percpu_receive_thread - recv thread per cpu
|
|
* @arg: ptr to the fcoe per cpu struct
|
|
*
|
|
* Return: 0 for success
|
|
+ *
|
|
*/
|
|
int fcoe_percpu_receive_thread(void *arg)
|
|
{
|
|
@@ -531,7 +533,7 @@
|
|
struct fcoe_softc *fc;
|
|
struct fcoe_hdr *hp;
|
|
|
|
- set_user_nice(current, -20);
|
|
+ set_user_nice(current, 19);
|
|
|
|
while (!kthread_should_stop()) {
|
|
|
|
@@ -656,7 +658,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_recv_flogi() - flogi receive function
|
|
+ * fcoe_recv_flogi - flogi receive function
|
|
* @fc: associated fcoe_softc
|
|
* @fp: the recieved frame
|
|
* @sa: the source address of this flogi
|
|
@@ -665,7 +667,7 @@
|
|
* mac address for the initiator, eitehr OUI based or GW based.
|
|
*
|
|
* Returns: none
|
|
- */
|
|
+ **/
|
|
static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa)
|
|
{
|
|
struct fc_frame_header *fh;
|
|
@@ -713,23 +715,32 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_watchdog() - fcoe timer callback
|
|
+ * fcoe_watchdog - fcoe timer callback
|
|
* @vp:
|
|
*
|
|
- * This checks the pending queue length for fcoe and set lport qfull
|
|
+ * This checks the pending queue length for fcoe and put fcoe to be paused state
|
|
* if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the
|
|
* fcoe_hostlist.
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
void fcoe_watchdog(ulong vp)
|
|
{
|
|
+ struct fc_lport *lp;
|
|
struct fcoe_softc *fc;
|
|
+ int paused = 0;
|
|
|
|
read_lock(&fcoe_hostlist_lock);
|
|
list_for_each_entry(fc, &fcoe_hostlist, list) {
|
|
- if (fc->lp)
|
|
- fcoe_check_wait_queue(fc->lp);
|
|
+ lp = fc->lp;
|
|
+ if (lp) {
|
|
+ if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
|
|
+ paused = 1;
|
|
+ if (fcoe_check_wait_queue(lp) < FCOE_MAX_QUEUE_DEPTH) {
|
|
+ if (paused)
|
|
+ fc_unpause(lp);
|
|
+ }
|
|
+ }
|
|
}
|
|
read_unlock(&fcoe_hostlist_lock);
|
|
|
|
@@ -739,64 +750,96 @@
|
|
|
|
|
|
/**
|
|
- * fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue
|
|
+ * fcoe_check_wait_queue - put the skb into fcoe pending xmit queue
|
|
* @lp: the fc_port for this skb
|
|
* @skb: the associated skb to be xmitted
|
|
*
|
|
* This empties the wait_queue, dequeue the head of the wait_queue queue
|
|
* and calls fcoe_start_io() for each packet, if all skb have been
|
|
- * transmitted, return qlen or -1 if a error occurs, then restore
|
|
- * wait_queue and try again later.
|
|
+ * transmitted, return 0 if a error occurs, then restore wait_queue and
|
|
+ * try again later.
|
|
*
|
|
* The wait_queue is used when the skb transmit fails. skb will go
|
|
* in the wait_queue which will be emptied by the time function OR
|
|
* by the next skb transmit.
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static int fcoe_check_wait_queue(struct fc_lport *lp)
|
|
{
|
|
- struct fcoe_softc *fc = lport_priv(lp);
|
|
+ int rc, unpause = 0;
|
|
+ int paused = 0;
|
|
struct sk_buff *skb;
|
|
- int rc = -1;
|
|
+ struct fcoe_softc *fc;
|
|
|
|
+ fc = fcoe_softc(lp);
|
|
spin_lock_bh(&fc->fcoe_pending_queue.lock);
|
|
- if (fc->fcoe_pending_queue_active)
|
|
- goto out;
|
|
- fc->fcoe_pending_queue_active = 1;
|
|
-
|
|
- while (fc->fcoe_pending_queue.qlen) {
|
|
- /* keep qlen > 0 until fcoe_start_io succeeds */
|
|
- fc->fcoe_pending_queue.qlen++;
|
|
- skb = __skb_dequeue(&fc->fcoe_pending_queue);
|
|
-
|
|
- spin_unlock_bh(&fc->fcoe_pending_queue.lock);
|
|
- rc = fcoe_start_io(skb);
|
|
- spin_lock_bh(&fc->fcoe_pending_queue.lock);
|
|
|
|
- if (rc) {
|
|
- __skb_queue_head(&fc->fcoe_pending_queue, skb);
|
|
- /* undo temporary increment above */
|
|
- fc->fcoe_pending_queue.qlen--;
|
|
- break;
|
|
+ /*
|
|
+ * is this interface paused?
|
|
+ */
|
|
+ if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
|
|
+ paused = 1;
|
|
+ if (fc->fcoe_pending_queue.qlen) {
|
|
+ while ((skb = __skb_dequeue(&fc->fcoe_pending_queue)) != NULL) {
|
|
+ spin_unlock_bh(&fc->fcoe_pending_queue.lock);
|
|
+ rc = fcoe_start_io(skb);
|
|
+ if (rc) {
|
|
+ fcoe_insert_wait_queue_head(lp, skb);
|
|
+ return rc;
|
|
+ }
|
|
+ spin_lock_bh(&fc->fcoe_pending_queue.lock);
|
|
}
|
|
- /* undo temporary increment above */
|
|
- fc->fcoe_pending_queue.qlen--;
|
|
+ if (fc->fcoe_pending_queue.qlen < FCOE_MAX_QUEUE_DEPTH)
|
|
+ unpause = 1;
|
|
}
|
|
+ spin_unlock_bh(&fc->fcoe_pending_queue.lock);
|
|
+ if ((unpause) && (paused))
|
|
+ fc_unpause(lp);
|
|
+ return fc->fcoe_pending_queue.qlen;
|
|
+}
|
|
|
|
- if (fc->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH)
|
|
- lp->qfull = 0;
|
|
- fc->fcoe_pending_queue_active = 0;
|
|
- rc = fc->fcoe_pending_queue.qlen;
|
|
-out:
|
|
+/**
|
|
+ * fcoe_insert_wait_queue_head - puts skb to fcoe pending queue head
|
|
+ * @lp: the fc_port for this skb
|
|
+ * @skb: the associated skb to be xmitted
|
|
+ *
|
|
+ * Returns: none
|
|
+ **/
|
|
+static void fcoe_insert_wait_queue_head(struct fc_lport *lp,
|
|
+ struct sk_buff *skb)
|
|
+{
|
|
+ struct fcoe_softc *fc;
|
|
+
|
|
+ fc = fcoe_softc(lp);
|
|
+ spin_lock_bh(&fc->fcoe_pending_queue.lock);
|
|
+ __skb_queue_head(&fc->fcoe_pending_queue, skb);
|
|
spin_unlock_bh(&fc->fcoe_pending_queue.lock);
|
|
- return rc;
|
|
}
|
|
|
|
/**
|
|
- * fcoe_dev_setup() - setup link change notification interface
|
|
- */
|
|
-static void fcoe_dev_setup()
|
|
+ * fcoe_insert_wait_queue - put the skb into fcoe pending queue tail
|
|
+ * @lp: the fc_port for this skb
|
|
+ * @skb: the associated skb to be xmitted
|
|
+ *
|
|
+ * Returns: none
|
|
+ **/
|
|
+static void fcoe_insert_wait_queue(struct fc_lport *lp,
|
|
+ struct sk_buff *skb)
|
|
+{
|
|
+ struct fcoe_softc *fc;
|
|
+
|
|
+ fc = fcoe_softc(lp);
|
|
+ spin_lock_bh(&fc->fcoe_pending_queue.lock);
|
|
+ __skb_queue_tail(&fc->fcoe_pending_queue, skb);
|
|
+ spin_unlock_bh(&fc->fcoe_pending_queue.lock);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * fcoe_dev_setup - setup link change notification interface
|
|
+ *
|
|
+ **/
|
|
+static void fcoe_dev_setup(void)
|
|
{
|
|
/*
|
|
* here setup a interface specific wd time to
|
|
@@ -806,15 +849,15 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_dev_setup() - cleanup link change notification interface
|
|
- */
|
|
+ * fcoe_dev_setup - cleanup link change notification interface
|
|
+ **/
|
|
static void fcoe_dev_cleanup(void)
|
|
{
|
|
unregister_netdevice_notifier(&fcoe_notifier);
|
|
}
|
|
|
|
/**
|
|
- * fcoe_device_notification() - netdev event notification callback
|
|
+ * fcoe_device_notification - netdev event notification callback
|
|
* @notifier: context of the notification
|
|
* @event: type of event
|
|
* @ptr: fixed array for output parsed ifname
|
|
@@ -822,7 +865,7 @@
|
|
* This function is called by the ethernet driver in case of link change event
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static int fcoe_device_notification(struct notifier_block *notifier,
|
|
ulong event, void *ptr)
|
|
{
|
|
@@ -830,7 +873,7 @@
|
|
struct net_device *real_dev = ptr;
|
|
struct fcoe_softc *fc;
|
|
struct fcoe_dev_stats *stats;
|
|
- u32 new_link_up;
|
|
+ u16 new_status;
|
|
u32 mfs;
|
|
int rc = NOTIFY_OK;
|
|
|
|
@@ -847,15 +890,17 @@
|
|
goto out;
|
|
}
|
|
|
|
- new_link_up = lp->link_up;
|
|
+ new_status = lp->link_status;
|
|
switch (event) {
|
|
case NETDEV_DOWN:
|
|
case NETDEV_GOING_DOWN:
|
|
- new_link_up = 0;
|
|
+ new_status &= ~FC_LINK_UP;
|
|
break;
|
|
case NETDEV_UP:
|
|
case NETDEV_CHANGE:
|
|
- new_link_up = !fcoe_link_ok(lp);
|
|
+ new_status &= ~FC_LINK_UP;
|
|
+ if (!fcoe_link_ok(lp))
|
|
+ new_status |= FC_LINK_UP;
|
|
break;
|
|
case NETDEV_CHANGEMTU:
|
|
mfs = fc->real_dev->mtu -
|
|
@@ -863,15 +908,17 @@
|
|
sizeof(struct fcoe_crc_eof));
|
|
if (mfs >= FC_MIN_MAX_FRAME)
|
|
fc_set_mfs(lp, mfs);
|
|
- new_link_up = !fcoe_link_ok(lp);
|
|
+ new_status &= ~FC_LINK_UP;
|
|
+ if (!fcoe_link_ok(lp))
|
|
+ new_status |= FC_LINK_UP;
|
|
break;
|
|
case NETDEV_REGISTER:
|
|
break;
|
|
default:
|
|
FC_DBG("unknown event %ld call", event);
|
|
}
|
|
- if (lp->link_up != new_link_up) {
|
|
- if (new_link_up)
|
|
+ if (lp->link_status != new_status) {
|
|
+ if ((new_status & FC_LINK_UP) == FC_LINK_UP)
|
|
fc_linkup(lp);
|
|
else {
|
|
stats = lp->dev_stats[smp_processor_id()];
|
|
@@ -886,12 +933,12 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_if_to_netdev() - parse a name buffer to get netdev
|
|
+ * fcoe_if_to_netdev - parse a name buffer to get netdev
|
|
* @ifname: fixed array for output parsed ifname
|
|
* @buffer: incoming buffer to be copied
|
|
*
|
|
* Returns: NULL or ptr to netdeive
|
|
- */
|
|
+ **/
|
|
static struct net_device *fcoe_if_to_netdev(const char *buffer)
|
|
{
|
|
char *cp;
|
|
@@ -908,13 +955,13 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev
|
|
+ * fcoe_netdev_to_module_owner - finds out the nic drive moddule of the netdev
|
|
* @netdev: the target netdev
|
|
*
|
|
* Returns: ptr to the struct module, NULL for failure
|
|
- */
|
|
-static struct module *
|
|
-fcoe_netdev_to_module_owner(const struct net_device *netdev)
|
|
+ **/
|
|
+static struct module *fcoe_netdev_to_module_owner(
|
|
+ const struct net_device *netdev)
|
|
{
|
|
struct device *dev;
|
|
|
|
@@ -932,14 +979,12 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_ethdrv_get() - Hold the Ethernet driver
|
|
- * @netdev: the target netdev
|
|
- *
|
|
- * Holds the Ethernet driver module by try_module_get() for
|
|
+ * fcoe_ethdrv_get - holds the nic driver module by try_module_get() for
|
|
* the corresponding netdev.
|
|
+ * @netdev: the target netdev
|
|
*
|
|
* Returns: 0 for succsss
|
|
- */
|
|
+ **/
|
|
static int fcoe_ethdrv_get(const struct net_device *netdev)
|
|
{
|
|
struct module *owner;
|
|
@@ -954,14 +999,12 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_ethdrv_put() - Release the Ethernet driver
|
|
- * @netdev: the target netdev
|
|
- *
|
|
- * Releases the Ethernet driver module by module_put for
|
|
+ * fcoe_ethdrv_get - releases the nic driver module by module_put for
|
|
* the corresponding netdev.
|
|
+ * @netdev: the target netdev
|
|
*
|
|
* Returns: 0 for succsss
|
|
- */
|
|
+ **/
|
|
static int fcoe_ethdrv_put(const struct net_device *netdev)
|
|
{
|
|
struct module *owner;
|
|
@@ -977,12 +1020,12 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_destroy() - handles the destroy from sysfs
|
|
+ * fcoe_destroy- handles the destroy from sysfs
|
|
* @buffer: expcted to be a eth if name
|
|
* @kp: associated kernel param
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static int fcoe_destroy(const char *buffer, struct kernel_param *kp)
|
|
{
|
|
int rc;
|
|
@@ -1015,12 +1058,12 @@
|
|
}
|
|
|
|
/**
|
|
- * fcoe_create() - Handles the create call from sysfs
|
|
+ * fcoe_create - handles the create call from sysfs
|
|
* @buffer: expcted to be a eth if name
|
|
* @kp: associated kernel param
|
|
*
|
|
* Returns: 0 for success
|
|
- */
|
|
+ **/
|
|
static int fcoe_create(const char *buffer, struct kernel_param *kp)
|
|
{
|
|
int rc;
|
|
@@ -1061,8 +1104,8 @@
|
|
__MODULE_PARM_TYPE(destroy, "string");
|
|
MODULE_PARM_DESC(destroy, "Destroy fcoe port");
|
|
|
|
-/**
|
|
- * fcoe_link_ok() - Check if link is ok for the fc_lport
|
|
+/*
|
|
+ * fcoe_link_ok - check if link is ok for the fc_lport
|
|
* @lp: ptr to the fc_lport
|
|
*
|
|
* Any permanently-disqualifying conditions have been previously checked.
|
|
@@ -1077,7 +1120,7 @@
|
|
*/
|
|
int fcoe_link_ok(struct fc_lport *lp)
|
|
{
|
|
- struct fcoe_softc *fc = lport_priv(lp);
|
|
+ struct fcoe_softc *fc = fcoe_softc(lp);
|
|
struct net_device *dev = fc->real_dev;
|
|
struct ethtool_cmd ecmd = { ETHTOOL_GSET };
|
|
int rc = 0;
|
|
@@ -1106,8 +1149,9 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(fcoe_link_ok);
|
|
|
|
-/**
|
|
- * fcoe_percpu_clean() - Clear the pending skbs for an lport
|
|
+/*
|
|
+ * fcoe_percpu_clean - frees skb of the corresponding lport from the per
|
|
+ * cpu queue.
|
|
* @lp: the fc_lport
|
|
*/
|
|
void fcoe_percpu_clean(struct fc_lport *lp)
|
|
@@ -1141,11 +1185,11 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_percpu_clean);
|
|
|
|
/**
|
|
- * fcoe_clean_pending_queue() - Dequeue a skb and free it
|
|
+ * fcoe_clean_pending_queue - dequeue skb and free it
|
|
* @lp: the corresponding fc_lport
|
|
*
|
|
* Returns: none
|
|
- */
|
|
+ **/
|
|
void fcoe_clean_pending_queue(struct fc_lport *lp)
|
|
{
|
|
struct fcoe_softc *fc = lport_priv(lp);
|
|
@@ -1162,21 +1206,21 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue);
|
|
|
|
/**
|
|
- * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport
|
|
+ * libfc_host_alloc - allocate a Scsi_Host with room for the fc_lport
|
|
* @sht: ptr to the scsi host templ
|
|
* @priv_size: size of private data after fc_lport
|
|
*
|
|
* Returns: ptr to Scsi_Host
|
|
- * TODO: to libfc?
|
|
+ * TODO - to libfc?
|
|
*/
|
|
-static inline struct Scsi_Host *
|
|
-libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
|
|
+static inline struct Scsi_Host *libfc_host_alloc(
|
|
+ struct scsi_host_template *sht, int priv_size)
|
|
{
|
|
return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size);
|
|
}
|
|
|
|
/**
|
|
- * fcoe_host_alloc() - Allocate a Scsi_Host with room for the fcoe_softc
|
|
+ * fcoe_host_alloc - allocate a Scsi_Host with room for the fcoe_softc
|
|
* @sht: ptr to the scsi host templ
|
|
* @priv_size: size of private data after fc_lport
|
|
*
|
|
@@ -1188,8 +1232,8 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(fcoe_host_alloc);
|
|
|
|
-/**
|
|
- * fcoe_reset() - Resets the fcoe
|
|
+/*
|
|
+ * fcoe_reset - resets the fcoe
|
|
* @shost: shost the reset is from
|
|
*
|
|
* Returns: always 0
|
|
@@ -1202,8 +1246,8 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(fcoe_reset);
|
|
|
|
-/**
|
|
- * fcoe_wwn_from_mac() - Converts 48-bit IEEE MAC address to 64-bit FC WWN.
|
|
+/*
|
|
+ * fcoe_wwn_from_mac - converts 48-bit IEEE MAC address to 64-bit FC WWN.
|
|
* @mac: mac address
|
|
* @scheme: check port
|
|
* @port: port indicator for converting
|
|
@@ -1242,15 +1286,14 @@
|
|
return wwn;
|
|
}
|
|
EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac);
|
|
-
|
|
-/**
|
|
- * fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device
|
|
+/*
|
|
+ * fcoe_hostlist_lookup_softc - find the corresponding lport by a given device
|
|
* @device: this is currently ptr to net_device
|
|
*
|
|
* Returns: NULL or the located fcoe_softc
|
|
*/
|
|
-static struct fcoe_softc *
|
|
-fcoe_hostlist_lookup_softc(const struct net_device *dev)
|
|
+static struct fcoe_softc *fcoe_hostlist_lookup_softc(
|
|
+ const struct net_device *dev)
|
|
{
|
|
struct fcoe_softc *fc;
|
|
|
|
@@ -1265,8 +1308,8 @@
|
|
return NULL;
|
|
}
|
|
|
|
-/**
|
|
- * fcoe_hostlist_lookup() - Find the corresponding lport by netdev
|
|
+/*
|
|
+ * fcoe_hostlist_lookup - find the corresponding lport by netdev
|
|
* @netdev: ptr to net_device
|
|
*
|
|
* Returns: 0 for success
|
|
@@ -1281,8 +1324,8 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup);
|
|
|
|
-/**
|
|
- * fcoe_hostlist_add() - Add a lport to lports list
|
|
+/*
|
|
+ * fcoe_hostlist_add - add a lport to lports list
|
|
* @lp: ptr to the fc_lport to badded
|
|
*
|
|
* Returns: 0 for success
|
|
@@ -1293,7 +1336,7 @@
|
|
|
|
fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp));
|
|
if (!fc) {
|
|
- fc = lport_priv(lp);
|
|
+ fc = fcoe_softc(lp);
|
|
write_lock_bh(&fcoe_hostlist_lock);
|
|
list_add_tail(&fc->list, &fcoe_hostlist);
|
|
write_unlock_bh(&fcoe_hostlist_lock);
|
|
@@ -1302,8 +1345,8 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(fcoe_hostlist_add);
|
|
|
|
-/**
|
|
- * fcoe_hostlist_remove() - remove a lport from lports list
|
|
+/*
|
|
+ * fcoe_hostlist_remove - remove a lport from lports list
|
|
* @lp: ptr to the fc_lport to badded
|
|
*
|
|
* Returns: 0 for success
|
|
@@ -1323,12 +1366,12 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_hostlist_remove);
|
|
|
|
/**
|
|
- * fcoe_libfc_config() - sets up libfc related properties for lport
|
|
+ * fcoe_libfc_config - sets up libfc related properties for lport
|
|
* @lp: ptr to the fc_lport
|
|
* @tt: libfc function template
|
|
*
|
|
* Returns : 0 for success
|
|
- */
|
|
+ **/
|
|
int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt)
|
|
{
|
|
/* Set the function pointers set by the LLDD */
|
|
@@ -1346,14 +1389,14 @@
|
|
EXPORT_SYMBOL_GPL(fcoe_libfc_config);
|
|
|
|
/**
|
|
- * fcoe_init() - fcoe module loading initialization
|
|
+ * fcoe_init - fcoe module loading initialization
|
|
*
|
|
* Initialization routine
|
|
* 1. Will create fc transport software structure
|
|
* 2. initialize the link list of port information structure
|
|
*
|
|
* Returns 0 on success, negative on failure
|
|
- */
|
|
+ **/
|
|
static int __init fcoe_init(void)
|
|
{
|
|
int cpu;
|
|
@@ -1390,6 +1433,7 @@
|
|
} else {
|
|
fcoe_percpu[cpu] = NULL;
|
|
kfree(p);
|
|
+
|
|
}
|
|
}
|
|
}
|
|
@@ -1399,9 +1443,11 @@
|
|
*/
|
|
fcoe_dev_setup();
|
|
|
|
- setup_timer(&fcoe_timer, fcoe_watchdog, 0);
|
|
-
|
|
- mod_timer(&fcoe_timer, jiffies + (10 * HZ));
|
|
+ init_timer(&fcoe_timer);
|
|
+ fcoe_timer.data = 0;
|
|
+ fcoe_timer.function = fcoe_watchdog;
|
|
+ fcoe_timer.expires = (jiffies + (10 * HZ));
|
|
+ add_timer(&fcoe_timer);
|
|
|
|
/* initiatlize the fcoe transport */
|
|
fcoe_transport_init();
|
|
@@ -1413,10 +1459,10 @@
|
|
module_init(fcoe_init);
|
|
|
|
/**
|
|
- * fcoe_exit() - fcoe module unloading cleanup
|
|
+ * fcoe_exit - fcoe module unloading cleanup
|
|
*
|
|
* Returns 0 on success, negative on failure
|
|
- */
|
|
+ **/
|
|
static void __exit fcoe_exit(void)
|
|
{
|
|
u32 idx;
|
|
@@ -1437,7 +1483,7 @@
|
|
*/
|
|
del_timer_sync(&fcoe_timer);
|
|
|
|
- /* releases the associated fcoe transport for each lport */
|
|
+ /* releases the assocaited fcoe transport for each lport */
|
|
list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list)
|
|
fcoe_transport_release(fc->real_dev);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/hptiop.c linux-2.6.29-rc3.owrt/drivers/scsi/hptiop.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/hptiop.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/hptiop.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1251,7 +1251,6 @@
|
|
{ PCI_VDEVICE(TTI, 0x3530), (kernel_ulong_t)&hptiop_itl_ops },
|
|
{ PCI_VDEVICE(TTI, 0x3560), (kernel_ulong_t)&hptiop_itl_ops },
|
|
{ PCI_VDEVICE(TTI, 0x4322), (kernel_ulong_t)&hptiop_itl_ops },
|
|
- { PCI_VDEVICE(TTI, 0x4321), (kernel_ulong_t)&hptiop_itl_ops },
|
|
{ PCI_VDEVICE(TTI, 0x4210), (kernel_ulong_t)&hptiop_itl_ops },
|
|
{ PCI_VDEVICE(TTI, 0x4211), (kernel_ulong_t)&hptiop_itl_ops },
|
|
{ PCI_VDEVICE(TTI, 0x4310), (kernel_ulong_t)&hptiop_itl_ops },
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvfc.c linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvfc.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvfc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvfc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1573,6 +1573,9 @@
|
|
vfc_cmd->resp_len = sizeof(vfc_cmd->rsp);
|
|
vfc_cmd->cancel_key = (unsigned long)cmnd->device->hostdata;
|
|
vfc_cmd->tgt_scsi_id = rport->port_id;
|
|
+ if ((rport->supported_classes & FC_COS_CLASS3) &&
|
|
+ (fc_host_supported_classes(vhost->host) & FC_COS_CLASS3))
|
|
+ vfc_cmd->flags = IBMVFC_CLASS_3_ERR;
|
|
vfc_cmd->iu.xfer_len = scsi_bufflen(cmnd);
|
|
int_to_scsilun(cmnd->device->lun, &vfc_cmd->iu.lun);
|
|
memcpy(vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len);
|
|
@@ -3263,7 +3266,6 @@
|
|
return -ENOMEM;
|
|
}
|
|
|
|
- memset(tgt, 0, sizeof(*tgt));
|
|
tgt->scsi_id = scsi_id;
|
|
tgt->new_scsi_id = scsi_id;
|
|
tgt->vhost = vhost;
|
|
@@ -3574,18 +3576,9 @@
|
|
static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
|
|
{
|
|
struct ibmvfc_host *vhost = tgt->vhost;
|
|
- struct fc_rport *rport = tgt->rport;
|
|
+ struct fc_rport *rport;
|
|
unsigned long flags;
|
|
|
|
- if (rport) {
|
|
- tgt_dbg(tgt, "Setting rport roles\n");
|
|
- fc_remote_port_rolechg(rport, tgt->ids.roles);
|
|
- spin_lock_irqsave(vhost->host->host_lock, flags);
|
|
- ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
|
|
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
|
|
- return;
|
|
- }
|
|
-
|
|
tgt_dbg(tgt, "Adding rport\n");
|
|
rport = fc_remote_port_add(vhost->host, 0, &tgt->ids);
|
|
spin_lock_irqsave(vhost->host->host_lock, flags);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvfc.h linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvfc.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvfc.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvfc.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -32,7 +32,7 @@
|
|
#define IBMVFC_DRIVER_VERSION "1.0.4"
|
|
#define IBMVFC_DRIVER_DATE "(November 14, 2008)"
|
|
|
|
-#define IBMVFC_DEFAULT_TIMEOUT 60
|
|
+#define IBMVFC_DEFAULT_TIMEOUT 15
|
|
#define IBMVFC_INIT_TIMEOUT 120
|
|
#define IBMVFC_MAX_REQUESTS_DEFAULT 100
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvscsi.c linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvscsi.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvscsi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvscsi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -432,7 +432,6 @@
|
|
sdev_printk(KERN_ERR, cmd->device,
|
|
"Can't allocate memory "
|
|
"for indirect table\n");
|
|
- scsi_dma_unmap(cmd);
|
|
return 0;
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/lasi700.c linux-2.6.29-rc3.owrt/drivers/scsi/lasi700.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/lasi700.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/lasi700.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -103,7 +103,7 @@
|
|
|
|
hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);
|
|
if (!hostdata) {
|
|
- dev_printk(KERN_ERR, &dev->dev, "Failed to allocate host data\n");
|
|
+ dev_printk(KERN_ERR, dev, "Failed to allocate host data\n");
|
|
return -ENOMEM;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/libfc/fc_disc.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_disc.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_disc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_disc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -64,7 +64,7 @@
|
|
static void fc_disc_restart(struct fc_disc *);
|
|
|
|
/**
|
|
- * fc_disc_lookup_rport() - lookup a remote port by port_id
|
|
+ * fc_disc_lookup_rport - lookup a remote port by port_id
|
|
* @lport: Fibre Channel host port instance
|
|
* @port_id: remote port port_id to match
|
|
*/
|
|
@@ -92,7 +92,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_stop_rports() - delete all the remote ports associated with the lport
|
|
+ * fc_disc_stop_rports - delete all the remote ports associated with the lport
|
|
* @disc: The discovery job to stop rports on
|
|
*
|
|
* Locking Note: This function expects that the lport mutex is locked before
|
|
@@ -117,7 +117,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_rport_callback() - Event handler for rport events
|
|
+ * fc_disc_rport_callback - Event handler for rport events
|
|
* @lport: The lport which is receiving the event
|
|
* @rport: The rport which the event has occured on
|
|
* @event: The event that occured
|
|
@@ -151,7 +151,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_recv_rscn_req() - Handle Registered State Change Notification (RSCN)
|
|
+ * fc_disc_recv_rscn_req - Handle Registered State Change Notification (RSCN)
|
|
* @sp: Current sequence of the RSCN exchange
|
|
* @fp: RSCN Frame
|
|
* @lport: Fibre Channel host port instance
|
|
@@ -246,7 +246,7 @@
|
|
list_del(&dp->peers);
|
|
rport = lport->tt.rport_lookup(lport, dp->ids.port_id);
|
|
if (rport) {
|
|
- rdata = rport->dd_data;
|
|
+ rdata = RPORT_TO_PRIV(rport);
|
|
list_del(&rdata->peers);
|
|
lport->tt.rport_logoff(rport);
|
|
}
|
|
@@ -265,7 +265,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_recv_req() - Handle incoming requests
|
|
+ * fc_disc_recv_req - Handle incoming requests
|
|
* @sp: Current sequence of the request exchange
|
|
* @fp: The frame
|
|
* @lport: The FC local port
|
|
@@ -294,7 +294,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_restart() - Restart discovery
|
|
+ * fc_disc_restart - Restart discovery
|
|
* @lport: FC discovery context
|
|
*
|
|
* Locking Note: This function expects that the disc mutex
|
|
@@ -322,7 +322,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_start() - Fibre Channel Target discovery
|
|
+ * fc_disc_start - Fibre Channel Target discovery
|
|
* @lport: FC local port
|
|
*
|
|
* Returns non-zero if discovery cannot be started.
|
|
@@ -383,7 +383,7 @@
|
|
};
|
|
|
|
/**
|
|
- * fc_disc_new_target() - Handle new target found by discovery
|
|
+ * fc_disc_new_target - Handle new target found by discovery
|
|
* @lport: FC local port
|
|
* @rport: The previous FC remote port (NULL if new remote port)
|
|
* @ids: Identifiers for the new FC remote port
|
|
@@ -396,7 +396,7 @@
|
|
struct fc_rport_identifiers *ids)
|
|
{
|
|
struct fc_lport *lport = disc->lport;
|
|
- struct fc_rport_libfc_priv *rdata;
|
|
+ struct fc_rport_libfc_priv *rp;
|
|
int error = 0;
|
|
|
|
if (rport && ids->port_name) {
|
|
@@ -430,15 +430,15 @@
|
|
dp.ids.port_name = ids->port_name;
|
|
dp.ids.node_name = ids->node_name;
|
|
dp.ids.roles = ids->roles;
|
|
- rport = lport->tt.rport_create(&dp);
|
|
+ rport = fc_rport_rogue_create(&dp);
|
|
}
|
|
if (!rport)
|
|
error = -ENOMEM;
|
|
}
|
|
if (rport) {
|
|
- rdata = rport->dd_data;
|
|
- rdata->ops = &fc_disc_rport_ops;
|
|
- rdata->rp_state = RPORT_ST_INIT;
|
|
+ rp = rport->dd_data;
|
|
+ rp->ops = &fc_disc_rport_ops;
|
|
+ rp->rp_state = RPORT_ST_INIT;
|
|
lport->tt.rport_login(rport);
|
|
}
|
|
}
|
|
@@ -446,20 +446,20 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_del_target() - Delete a target
|
|
+ * fc_disc_del_target - Delete a target
|
|
* @disc: FC discovery context
|
|
* @rport: The remote port to be removed
|
|
*/
|
|
static void fc_disc_del_target(struct fc_disc *disc, struct fc_rport *rport)
|
|
{
|
|
struct fc_lport *lport = disc->lport;
|
|
- struct fc_rport_libfc_priv *rdata = rport->dd_data;
|
|
+ struct fc_rport_libfc_priv *rdata = RPORT_TO_PRIV(rport);
|
|
list_del(&rdata->peers);
|
|
lport->tt.rport_logoff(rport);
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_done() - Discovery has been completed
|
|
+ * fc_disc_done - Discovery has been completed
|
|
* @disc: FC discovery context
|
|
*/
|
|
static void fc_disc_done(struct fc_disc *disc)
|
|
@@ -479,7 +479,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_error() - Handle error on dNS request
|
|
+ * fc_disc_error - Handle error on dNS request
|
|
* @disc: FC discovery context
|
|
* @fp: The frame pointer
|
|
*/
|
|
@@ -519,7 +519,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_gpn_ft_req() - Send Get Port Names by FC-4 type (GPN_FT) request
|
|
+ * fc_disc_gpn_ft_req - Send Get Port Names by FC-4 type (GPN_FT) request
|
|
* @lport: FC discovery context
|
|
*
|
|
* Locking Note: This function expects that the disc_mutex is locked
|
|
@@ -553,7 +553,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_gpn_ft_parse() - Parse the list of IDs and names resulting from a request
|
|
+ * fc_disc_gpn_ft_parse - Parse the list of IDs and names resulting from a request
|
|
* @lport: Fibre Channel host port instance
|
|
* @buf: GPN_FT response buffer
|
|
* @len: size of response buffer
|
|
@@ -617,7 +617,7 @@
|
|
|
|
if ((dp.ids.port_id != fc_host_port_id(lport->host)) &&
|
|
(dp.ids.port_name != lport->wwpn)) {
|
|
- rport = lport->tt.rport_create(&dp);
|
|
+ rport = fc_rport_rogue_create(&dp);
|
|
if (rport) {
|
|
rdata = rport->dd_data;
|
|
rdata->ops = &fc_disc_rport_ops;
|
|
@@ -658,10 +658,7 @@
|
|
return error;
|
|
}
|
|
|
|
-/**
|
|
- * fc_disc_timeout() - Retry handler for the disc component
|
|
- * @work: Structure holding disc obj that needs retry discovery
|
|
- *
|
|
+/*
|
|
* Handle retry of memory allocation for remote ports.
|
|
*/
|
|
static void fc_disc_timeout(struct work_struct *work)
|
|
@@ -676,7 +673,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_gpn_ft_resp() - Handle a response frame from Get Port Names (GPN_FT)
|
|
+ * fc_disc_gpn_ft_resp - Handle a response frame from Get Port Names (GPN_FT)
|
|
* @sp: Current sequence of GPN_FT exchange
|
|
* @fp: response frame
|
|
* @lp_arg: Fibre Channel host port instance
|
|
@@ -715,7 +712,9 @@
|
|
fr_len(fp));
|
|
} else if (ntohs(cp->ct_cmd) == FC_FS_ACC) {
|
|
|
|
- /* Accepted, parse the response. */
|
|
+ /*
|
|
+ * Accepted. Parse response.
|
|
+ */
|
|
buf = cp + 1;
|
|
len -= sizeof(*cp);
|
|
} else if (ntohs(cp->ct_cmd) == FC_FS_RJT) {
|
|
@@ -747,7 +746,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_single() - Discover the directory information for a single target
|
|
+ * fc_disc_single - Discover the directory information for a single target
|
|
* @lport: FC local port
|
|
* @dp: The port to rediscover
|
|
*
|
|
@@ -770,7 +769,7 @@
|
|
if (rport)
|
|
fc_disc_del_target(disc, rport);
|
|
|
|
- new_rport = lport->tt.rport_create(dp);
|
|
+ new_rport = fc_rport_rogue_create(dp);
|
|
if (new_rport) {
|
|
rdata = new_rport->dd_data;
|
|
rdata->ops = &fc_disc_rport_ops;
|
|
@@ -783,7 +782,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_stop() - Stop discovery for a given lport
|
|
+ * fc_disc_stop - Stop discovery for a given lport
|
|
* @lport: The lport that discovery should stop for
|
|
*/
|
|
void fc_disc_stop(struct fc_lport *lport)
|
|
@@ -797,7 +796,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_stop_final() - Stop discovery for a given lport
|
|
+ * fc_disc_stop_final - Stop discovery for a given lport
|
|
* @lport: The lport that discovery should stop for
|
|
*
|
|
* This function will block until discovery has been
|
|
@@ -810,7 +809,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_disc_init() - Initialize the discovery block
|
|
+ * fc_disc_init - Initialize the discovery block
|
|
* @lport: FC local port
|
|
*/
|
|
int fc_disc_init(struct fc_lport *lport)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/libfc/fc_exch.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_exch.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_exch.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_exch.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -32,6 +32,8 @@
|
|
#include <scsi/libfc.h>
|
|
#include <scsi/fc_encode.h>
|
|
|
|
+#define FC_DEF_R_A_TOV (10 * 1000) /* resource allocation timeout */
|
|
+
|
|
/*
|
|
* fc_exch_debug can be set in debugger or at compile time to get more logs.
|
|
*/
|
|
@@ -625,6 +627,7 @@
|
|
{
|
|
struct fc_exch *ep;
|
|
struct fc_frame_header *fh;
|
|
+ u16 rxid;
|
|
|
|
ep = mp->lp->tt.exch_get(mp->lp, fp);
|
|
if (ep) {
|
|
@@ -651,6 +654,18 @@
|
|
if ((ntoh24(fh->fh_f_ctl) & FC_FC_SEQ_INIT) == 0)
|
|
ep->esb_stat &= ~ESB_ST_SEQ_INIT;
|
|
|
|
+ /*
|
|
+ * Set the responder ID in the frame header.
|
|
+ * The old one should've been 0xffff.
|
|
+ * If it isn't, don't assign one.
|
|
+ * Incoming basic link service frames may specify
|
|
+ * a referenced RX_ID.
|
|
+ */
|
|
+ if (fh->fh_type != FC_TYPE_BLS) {
|
|
+ rxid = ntohs(fh->fh_rx_id);
|
|
+ WARN_ON(rxid != FC_XID_UNKNOWN);
|
|
+ fh->fh_rx_id = htons(ep->rxid);
|
|
+ }
|
|
fc_exch_hold(ep); /* hold for caller */
|
|
spin_unlock_bh(&ep->ex_lock); /* lock from exch_get */
|
|
}
|
|
@@ -662,8 +677,8 @@
|
|
* If fc_pf_rjt_reason is FC_RJT_NONE then this function will have a hold
|
|
* on the ep that should be released by the caller.
|
|
*/
|
|
-static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_exch_mgr *mp,
|
|
- struct fc_frame *fp)
|
|
+static enum fc_pf_rjt_reason
|
|
+fc_seq_lookup_recip(struct fc_exch_mgr *mp, struct fc_frame *fp)
|
|
{
|
|
struct fc_frame_header *fh = fc_frame_header_get(fp);
|
|
struct fc_exch *ep = NULL;
|
|
@@ -981,9 +996,9 @@
|
|
* Send BLS Reject.
|
|
* This is for rejecting BA_ABTS only.
|
|
*/
|
|
-static void fc_exch_send_ba_rjt(struct fc_frame *rx_fp,
|
|
- enum fc_ba_rjt_reason reason,
|
|
- enum fc_ba_rjt_explan explan)
|
|
+static void
|
|
+fc_exch_send_ba_rjt(struct fc_frame *rx_fp, enum fc_ba_rjt_reason reason,
|
|
+ enum fc_ba_rjt_explan explan)
|
|
{
|
|
struct fc_frame *fp;
|
|
struct fc_frame_header *rx_fh;
|
|
@@ -1081,7 +1096,7 @@
|
|
ap->ba_high_seq_cnt = fh->fh_seq_cnt;
|
|
ap->ba_low_seq_cnt = htons(sp->cnt);
|
|
}
|
|
- sp = fc_seq_start_next_locked(sp);
|
|
+ sp = fc_seq_start_next(sp);
|
|
spin_unlock_bh(&ep->ex_lock);
|
|
fc_seq_send_last(sp, fp, FC_RCTL_BA_ACC, FC_TYPE_BLS);
|
|
fc_frame_free(rx_fp);
|
|
@@ -1465,11 +1480,10 @@
|
|
* If sid is non-zero, reset only exchanges we source from that FID.
|
|
* If did is non-zero, reset only exchanges destined to that FID.
|
|
*/
|
|
-void fc_exch_mgr_reset(struct fc_lport *lp, u32 sid, u32 did)
|
|
+void fc_exch_mgr_reset(struct fc_exch_mgr *mp, u32 sid, u32 did)
|
|
{
|
|
struct fc_exch *ep;
|
|
struct fc_exch *next;
|
|
- struct fc_exch_mgr *mp = lp->emp;
|
|
|
|
spin_lock_bh(&mp->em_lock);
|
|
restart:
|
|
@@ -1593,7 +1607,7 @@
|
|
if (IS_ERR(fp)) {
|
|
int err = PTR_ERR(fp);
|
|
|
|
- if (err == -FC_EX_CLOSED || err == -FC_EX_TIMEOUT)
|
|
+ if (err == -FC_EX_CLOSED)
|
|
goto cleanup;
|
|
FC_DBG("Cannot process RRQ, because of frame error %d\n", err);
|
|
return;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/libfc/fc_fcp.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_fcp.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_fcp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_fcp.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -161,7 +161,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_fcp_pkt_release() - release hold on scsi_pkt packet
|
|
+ * fc_fcp_pkt_release - release hold on scsi_pkt packet
|
|
* @fsp: fcp packet struct
|
|
*
|
|
* This is used by upper layer scsi driver.
|
|
@@ -183,7 +183,8 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_fcp_pkt_destory() - release hold on scsi_pkt packet
|
|
+ * fc_fcp_pkt_destory - release hold on scsi_pkt packet
|
|
+ *
|
|
* @seq: exchange sequence
|
|
* @fsp: fcp packet struct
|
|
*
|
|
@@ -198,7 +199,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_fcp_lock_pkt() - lock a packet and get a ref to it.
|
|
+ * fc_fcp_lock_pkt - lock a packet and get a ref to it.
|
|
* @fsp: fcp packet
|
|
*
|
|
* We should only return error if we return a command to scsi-ml before
|
|
@@ -290,7 +291,9 @@
|
|
buf = fc_frame_payload_get(fp, 0);
|
|
|
|
if (offset + len > fsp->data_len) {
|
|
- /* this should never happen */
|
|
+ /*
|
|
+ * this should never happen
|
|
+ */
|
|
if ((fr_flags(fp) & FCPHF_CRC_UNCHECKED) &&
|
|
fc_frame_crc_check(fp))
|
|
goto crc_err;
|
|
@@ -384,8 +387,8 @@
|
|
fc_fcp_complete_locked(fsp);
|
|
}
|
|
|
|
-/**
|
|
- * fc_fcp_send_data() - Send SCSI data to target.
|
|
+/*
|
|
+ * fc_fcp_send_data - Send SCSI data to target.
|
|
* @fsp: ptr to fc_fcp_pkt
|
|
* @sp: ptr to this sequence
|
|
* @offset: starting offset for this data request
|
|
@@ -607,8 +610,8 @@
|
|
}
|
|
}
|
|
|
|
-/**
|
|
- * fc_fcp_reduce_can_queue() - drop can_queue
|
|
+/*
|
|
+ * fc_fcp_reduce_can_queue - drop can_queue
|
|
* @lp: lport to drop queueing for
|
|
*
|
|
* If we are getting memory allocation failures, then we may
|
|
@@ -639,11 +642,9 @@
|
|
spin_unlock_irqrestore(lp->host->host_lock, flags);
|
|
}
|
|
|
|
-/**
|
|
- * fc_fcp_recv() - Reveive FCP frames
|
|
- * @seq: The sequence the frame is on
|
|
- * @fp: The FC frame
|
|
- * @arg: The related FCP packet
|
|
+/*
|
|
+ * exch mgr calls this routine to process scsi
|
|
+ * exchanges.
|
|
*
|
|
* Return : None
|
|
* Context : called from Soft IRQ context
|
|
@@ -831,7 +832,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_fcp_complete_locked() - complete processing of a fcp packet
|
|
+ * fc_fcp_complete_locked - complete processing of a fcp packet
|
|
* @fsp: fcp packet
|
|
*
|
|
* This function may sleep if a timer is pending. The packet lock must be
|
|
@@ -899,7 +900,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_fcp_cleanup_each_cmd() - Cleanup active commads
|
|
+ * fc_fcp_cleanup_each_cmd - run fn on each active command
|
|
* @lp: logical port
|
|
* @id: target id
|
|
* @lun: lun
|
|
@@ -951,7 +952,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_fcp_pkt_send() - send a fcp packet to the lower level.
|
|
+ * fc_fcp_pkt_send - send a fcp packet to the lower level.
|
|
* @lp: fc lport
|
|
* @fsp: fc packet.
|
|
*
|
|
@@ -1620,7 +1621,7 @@
|
|
static inline int fc_fcp_lport_queue_ready(struct fc_lport *lp)
|
|
{
|
|
/* lock ? */
|
|
- return (lp->state == LPORT_ST_READY) && lp->link_up && !lp->qfull;
|
|
+ return (lp->state == LPORT_ST_READY) && (lp->link_status & FC_LINK_UP);
|
|
}
|
|
|
|
/**
|
|
@@ -1726,7 +1727,7 @@
|
|
EXPORT_SYMBOL(fc_queuecommand);
|
|
|
|
/**
|
|
- * fc_io_compl() - Handle responses for completed commands
|
|
+ * fc_io_compl - Handle responses for completed commands
|
|
* @fsp: scsi packet
|
|
*
|
|
* Translates a error to a Linux SCSI error.
|
|
@@ -1809,12 +1810,12 @@
|
|
sc_cmd->result = DID_ERROR << 16;
|
|
break;
|
|
case FC_DATA_UNDRUN:
|
|
- if ((fsp->cdb_status == 0) && !(fsp->req_flags & FC_SRB_READ)) {
|
|
+ if (fsp->cdb_status == 0) {
|
|
/*
|
|
* scsi status is good but transport level
|
|
- * underrun.
|
|
+ * underrun. for read it should be an error??
|
|
*/
|
|
- sc_cmd->result = DID_OK << 16;
|
|
+ sc_cmd->result = (DID_OK << 16) | fsp->cdb_status;
|
|
} else {
|
|
/*
|
|
* scsi got underrun, this is an error
|
|
@@ -1856,7 +1857,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_fcp_complete() - complete processing of a fcp packet
|
|
+ * fc_fcp_complete - complete processing of a fcp packet
|
|
* @fsp: fcp packet
|
|
*
|
|
* This function may sleep if a fsp timer is pending.
|
|
@@ -1873,10 +1874,9 @@
|
|
EXPORT_SYMBOL(fc_fcp_complete);
|
|
|
|
/**
|
|
- * fc_eh_abort() - Abort a command
|
|
+ * fc_eh_abort - Abort a command...from scsi host template
|
|
* @sc_cmd: scsi command to abort
|
|
*
|
|
- * From scsi host template.
|
|
* send ABTS to the target device and wait for the response
|
|
* sc_cmd is the pointer to the command to be aborted.
|
|
*/
|
|
@@ -1890,7 +1890,7 @@
|
|
lp = shost_priv(sc_cmd->device->host);
|
|
if (lp->state != LPORT_ST_READY)
|
|
return rc;
|
|
- else if (!lp->link_up)
|
|
+ else if (!(lp->link_status & FC_LINK_UP))
|
|
return rc;
|
|
|
|
spin_lock_irqsave(lp->host->host_lock, flags);
|
|
@@ -1920,7 +1920,7 @@
|
|
EXPORT_SYMBOL(fc_eh_abort);
|
|
|
|
/**
|
|
- * fc_eh_device_reset() Reset a single LUN
|
|
+ * fc_eh_device_reset: Reset a single LUN
|
|
* @sc_cmd: scsi command
|
|
*
|
|
* Set from scsi host template to send tm cmd to the target and wait for the
|
|
@@ -1973,7 +1973,7 @@
|
|
EXPORT_SYMBOL(fc_eh_device_reset);
|
|
|
|
/**
|
|
- * fc_eh_host_reset() - The reset function will reset the ports on the host.
|
|
+ * fc_eh_host_reset - The reset function will reset the ports on the host.
|
|
* @sc_cmd: scsi command
|
|
*/
|
|
int fc_eh_host_reset(struct scsi_cmnd *sc_cmd)
|
|
@@ -1999,7 +1999,7 @@
|
|
EXPORT_SYMBOL(fc_eh_host_reset);
|
|
|
|
/**
|
|
- * fc_slave_alloc() - configure queue depth
|
|
+ * fc_slave_alloc - configure queue depth
|
|
* @sdev: scsi device
|
|
*
|
|
* Configures queue depth based on host's cmd_per_len. If not set
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/libfc/fc_lport.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_lport.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_lport.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_lport.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -139,7 +139,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_rport_callback() - Event handler for rport events
|
|
+ * fc_lport_rport_callback - Event handler for rport events
|
|
* @lport: The lport which is receiving the event
|
|
* @rport: The rport which the event has occured on
|
|
* @event: The event that occured
|
|
@@ -195,7 +195,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_state() - Return a string which represents the lport's state
|
|
+ * fc_lport_state - Return a string which represents the lport's state
|
|
* @lport: The lport whose state is to converted to a string
|
|
*/
|
|
static const char *fc_lport_state(struct fc_lport *lport)
|
|
@@ -209,7 +209,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_ptp_setup() - Create an rport for point-to-point mode
|
|
+ * fc_lport_ptp_setup - Create an rport for point-to-point mode
|
|
* @lport: The lport to attach the ptp rport to
|
|
* @fid: The FID of the ptp rport
|
|
* @remote_wwpn: The WWPN of the ptp rport
|
|
@@ -232,7 +232,7 @@
|
|
lport->ptp_rp = NULL;
|
|
}
|
|
|
|
- lport->ptp_rp = lport->tt.rport_create(&dp);
|
|
+ lport->ptp_rp = fc_rport_rogue_create(&dp);
|
|
|
|
lport->tt.rport_login(lport->ptp_rp);
|
|
|
|
@@ -250,7 +250,7 @@
|
|
{
|
|
struct fc_lport *lp = shost_priv(shost);
|
|
|
|
- if (lp->link_up)
|
|
+ if ((lp->link_status & FC_LINK_UP) == FC_LINK_UP)
|
|
fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
|
|
else
|
|
fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
|
|
@@ -351,7 +351,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_recv_rlir_req() - Handle received Registered Link Incident Report.
|
|
+ * fc_lport_recv_rlir_req - Handle received Registered Link Incident Report.
|
|
* @lport: Fibre Channel local port recieving the RLIR
|
|
* @sp: current sequence in the RLIR exchange
|
|
* @fp: RLIR request frame
|
|
@@ -370,7 +370,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_recv_echo_req() - Handle received ECHO request
|
|
+ * fc_lport_recv_echo_req - Handle received ECHO request
|
|
* @lport: Fibre Channel local port recieving the ECHO
|
|
* @sp: current sequence in the ECHO exchange
|
|
* @fp: ECHO request frame
|
|
@@ -412,7 +412,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_recv_echo_req() - Handle received Request Node ID data request
|
|
+ * fc_lport_recv_echo_req - Handle received Request Node ID data request
|
|
* @lport: Fibre Channel local port recieving the RNID
|
|
* @sp: current sequence in the RNID exchange
|
|
* @fp: RNID request frame
|
|
@@ -479,7 +479,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_recv_adisc_req() - Handle received Address Discovery Request
|
|
+ * fc_lport_recv_adisc_req - Handle received Address Discovery Request
|
|
* @lport: Fibre Channel local port recieving the ADISC
|
|
* @sp: current sequence in the ADISC exchange
|
|
* @fp: ADISC request frame
|
|
@@ -529,7 +529,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_recv_logo_req() - Handle received fabric LOGO request
|
|
+ * fc_lport_recv_logo_req - Handle received fabric LOGO request
|
|
* @lport: Fibre Channel local port recieving the LOGO
|
|
* @sp: current sequence in the LOGO exchange
|
|
* @fp: LOGO request frame
|
|
@@ -546,7 +546,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_fabric_login() - Start the lport state machine
|
|
+ * fc_fabric_login - Start the lport state machine
|
|
* @lport: The lport that should log into the fabric
|
|
*
|
|
* Locking Note: This function should not be called
|
|
@@ -568,7 +568,7 @@
|
|
EXPORT_SYMBOL(fc_fabric_login);
|
|
|
|
/**
|
|
- * fc_linkup() - Handler for transport linkup events
|
|
+ * fc_linkup - Handler for transport linkup events
|
|
* @lport: The lport whose link is up
|
|
*/
|
|
void fc_linkup(struct fc_lport *lport)
|
|
@@ -577,8 +577,8 @@
|
|
fc_host_port_id(lport->host));
|
|
|
|
mutex_lock(&lport->lp_mutex);
|
|
- if (!lport->link_up) {
|
|
- lport->link_up = 1;
|
|
+ if ((lport->link_status & FC_LINK_UP) != FC_LINK_UP) {
|
|
+ lport->link_status |= FC_LINK_UP;
|
|
|
|
if (lport->state == LPORT_ST_RESET)
|
|
fc_lport_enter_flogi(lport);
|
|
@@ -588,7 +588,7 @@
|
|
EXPORT_SYMBOL(fc_linkup);
|
|
|
|
/**
|
|
- * fc_linkdown() - Handler for transport linkdown events
|
|
+ * fc_linkdown - Handler for transport linkdown events
|
|
* @lport: The lport whose link is down
|
|
*/
|
|
void fc_linkdown(struct fc_lport *lport)
|
|
@@ -597,8 +597,8 @@
|
|
FC_DEBUG_LPORT("Link is down for port (%6x)\n",
|
|
fc_host_port_id(lport->host));
|
|
|
|
- if (lport->link_up) {
|
|
- lport->link_up = 0;
|
|
+ if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP) {
|
|
+ lport->link_status &= ~(FC_LINK_UP);
|
|
fc_lport_enter_reset(lport);
|
|
lport->tt.fcp_cleanup(lport);
|
|
}
|
|
@@ -607,25 +607,48 @@
|
|
EXPORT_SYMBOL(fc_linkdown);
|
|
|
|
/**
|
|
- * fc_fabric_logoff() - Logout of the fabric
|
|
+ * fc_pause - Pause the flow of frames
|
|
+ * @lport: The lport to be paused
|
|
+ */
|
|
+void fc_pause(struct fc_lport *lport)
|
|
+{
|
|
+ mutex_lock(&lport->lp_mutex);
|
|
+ lport->link_status |= FC_PAUSE;
|
|
+ mutex_unlock(&lport->lp_mutex);
|
|
+}
|
|
+EXPORT_SYMBOL(fc_pause);
|
|
+
|
|
+/**
|
|
+ * fc_unpause - Unpause the flow of frames
|
|
+ * @lport: The lport to be unpaused
|
|
+ */
|
|
+void fc_unpause(struct fc_lport *lport)
|
|
+{
|
|
+ mutex_lock(&lport->lp_mutex);
|
|
+ lport->link_status &= ~(FC_PAUSE);
|
|
+ mutex_unlock(&lport->lp_mutex);
|
|
+}
|
|
+EXPORT_SYMBOL(fc_unpause);
|
|
+
|
|
+/**
|
|
+ * fc_fabric_logoff - Logout of the fabric
|
|
* @lport: fc_lport pointer to logoff the fabric
|
|
*
|
|
* Return value:
|
|
* 0 for success, -1 for failure
|
|
- */
|
|
+ **/
|
|
int fc_fabric_logoff(struct fc_lport *lport)
|
|
{
|
|
lport->tt.disc_stop_final(lport);
|
|
mutex_lock(&lport->lp_mutex);
|
|
fc_lport_enter_logo(lport);
|
|
mutex_unlock(&lport->lp_mutex);
|
|
- cancel_delayed_work_sync(&lport->retry_work);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL(fc_fabric_logoff);
|
|
|
|
/**
|
|
- * fc_lport_destroy() - unregister a fc_lport
|
|
+ * fc_lport_destroy - unregister a fc_lport
|
|
* @lport: fc_lport pointer to unregister
|
|
*
|
|
* Return value:
|
|
@@ -635,25 +658,26 @@
|
|
* clean-up all the allocated memory
|
|
* and free up other system resources.
|
|
*
|
|
- */
|
|
+ **/
|
|
int fc_lport_destroy(struct fc_lport *lport)
|
|
{
|
|
lport->tt.frame_send = fc_frame_drop;
|
|
lport->tt.fcp_abort_io(lport);
|
|
- lport->tt.exch_mgr_reset(lport, 0, 0);
|
|
+ lport->tt.exch_mgr_reset(lport->emp, 0, 0);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL(fc_lport_destroy);
|
|
|
|
/**
|
|
- * fc_set_mfs() - sets up the mfs for the corresponding fc_lport
|
|
+ * fc_set_mfs - sets up the mfs for the corresponding fc_lport
|
|
* @lport: fc_lport pointer to unregister
|
|
* @mfs: the new mfs for fc_lport
|
|
*
|
|
* Set mfs for the given fc_lport to the new mfs.
|
|
*
|
|
* Return: 0 for success
|
|
- */
|
|
+ *
|
|
+ **/
|
|
int fc_set_mfs(struct fc_lport *lport, u32 mfs)
|
|
{
|
|
unsigned int old_mfs;
|
|
@@ -682,7 +706,7 @@
|
|
EXPORT_SYMBOL(fc_set_mfs);
|
|
|
|
/**
|
|
- * fc_lport_disc_callback() - Callback for discovery events
|
|
+ * fc_lport_disc_callback - Callback for discovery events
|
|
* @lport: FC local port
|
|
* @event: The discovery event
|
|
*/
|
|
@@ -707,7 +731,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_ready() - Enter the ready state and start discovery
|
|
+ * fc_rport_enter_ready - Enter the ready state and start discovery
|
|
* @lport: Fibre Channel local port that is ready
|
|
*
|
|
* Locking Note: The lport lock is expected to be held before calling
|
|
@@ -724,7 +748,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_recv_flogi_req() - Receive a FLOGI request
|
|
+ * fc_lport_recv_flogi_req - Receive a FLOGI request
|
|
* @sp_in: The sequence the FLOGI is on
|
|
* @rx_fp: The frame the FLOGI is in
|
|
* @lport: The lport that recieved the request
|
|
@@ -814,7 +838,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_recv_req() - The generic lport request handler
|
|
+ * fc_lport_recv_req - The generic lport request handler
|
|
* @lport: The lport that received the request
|
|
* @sp: The sequence the request is on
|
|
* @fp: The frame the request is in
|
|
@@ -910,7 +934,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_reset() - Reset an lport
|
|
+ * fc_lport_reset - Reset an lport
|
|
* @lport: The lport which should be reset
|
|
*
|
|
* Locking Note: This functions should not be called with the
|
|
@@ -918,7 +942,6 @@
|
|
*/
|
|
int fc_lport_reset(struct fc_lport *lport)
|
|
{
|
|
- cancel_delayed_work_sync(&lport->retry_work);
|
|
mutex_lock(&lport->lp_mutex);
|
|
fc_lport_enter_reset(lport);
|
|
mutex_unlock(&lport->lp_mutex);
|
|
@@ -927,7 +950,7 @@
|
|
EXPORT_SYMBOL(fc_lport_reset);
|
|
|
|
/**
|
|
- * fc_rport_enter_reset() - Reset the local port
|
|
+ * fc_rport_enter_reset - Reset the local port
|
|
* @lport: Fibre Channel local port to be reset
|
|
*
|
|
* Locking Note: The lport lock is expected to be held before calling
|
|
@@ -950,16 +973,16 @@
|
|
|
|
lport->tt.disc_stop(lport);
|
|
|
|
- lport->tt.exch_mgr_reset(lport, 0, 0);
|
|
+ lport->tt.exch_mgr_reset(lport->emp, 0, 0);
|
|
fc_host_fabric_name(lport->host) = 0;
|
|
fc_host_port_id(lport->host) = 0;
|
|
|
|
- if (lport->link_up)
|
|
+ if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP)
|
|
fc_lport_enter_flogi(lport);
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_error() - Handler for any errors
|
|
+ * fc_lport_error - Handler for any errors
|
|
* @lport: The fc_lport object
|
|
* @fp: The frame pointer
|
|
*
|
|
@@ -1006,8 +1029,8 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_rft_id_resp() - Handle response to Register Fibre
|
|
- * Channel Types by ID (RPN_ID) request
|
|
+ * fc_lport_rft_id_resp - Handle response to Register Fibre
|
|
+ * Channel Types by ID (RPN_ID) request
|
|
* @sp: current sequence in RPN_ID exchange
|
|
* @fp: response frame
|
|
* @lp_arg: Fibre Channel host port instance
|
|
@@ -1030,17 +1053,17 @@
|
|
|
|
FC_DEBUG_LPORT("Received a RFT_ID response\n");
|
|
|
|
- if (IS_ERR(fp)) {
|
|
- fc_lport_error(lport, fp);
|
|
- goto err;
|
|
- }
|
|
-
|
|
if (lport->state != LPORT_ST_RFT_ID) {
|
|
FC_DBG("Received a RFT_ID response, but in state %s\n",
|
|
fc_lport_state(lport));
|
|
goto out;
|
|
}
|
|
|
|
+ if (IS_ERR(fp)) {
|
|
+ fc_lport_error(lport, fp);
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
fh = fc_frame_header_get(fp);
|
|
ct = fc_frame_payload_get(fp, sizeof(*ct));
|
|
|
|
@@ -1058,8 +1081,8 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_rpn_id_resp() - Handle response to Register Port
|
|
- * Name by ID (RPN_ID) request
|
|
+ * fc_lport_rpn_id_resp - Handle response to Register Port
|
|
+ * Name by ID (RPN_ID) request
|
|
* @sp: current sequence in RPN_ID exchange
|
|
* @fp: response frame
|
|
* @lp_arg: Fibre Channel host port instance
|
|
@@ -1082,17 +1105,17 @@
|
|
|
|
FC_DEBUG_LPORT("Received a RPN_ID response\n");
|
|
|
|
- if (IS_ERR(fp)) {
|
|
- fc_lport_error(lport, fp);
|
|
- goto err;
|
|
- }
|
|
-
|
|
if (lport->state != LPORT_ST_RPN_ID) {
|
|
FC_DBG("Received a RPN_ID response, but in state %s\n",
|
|
fc_lport_state(lport));
|
|
goto out;
|
|
}
|
|
|
|
+ if (IS_ERR(fp)) {
|
|
+ fc_lport_error(lport, fp);
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
fh = fc_frame_header_get(fp);
|
|
ct = fc_frame_payload_get(fp, sizeof(*ct));
|
|
if (fh && ct && fh->fh_type == FC_TYPE_CT &&
|
|
@@ -1110,7 +1133,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_scr_resp() - Handle response to State Change Register (SCR) request
|
|
+ * fc_lport_scr_resp - Handle response to State Change Register (SCR) request
|
|
* @sp: current sequence in SCR exchange
|
|
* @fp: response frame
|
|
* @lp_arg: Fibre Channel lport port instance that sent the registration request
|
|
@@ -1132,17 +1155,17 @@
|
|
|
|
FC_DEBUG_LPORT("Received a SCR response\n");
|
|
|
|
- if (IS_ERR(fp)) {
|
|
- fc_lport_error(lport, fp);
|
|
- goto err;
|
|
- }
|
|
-
|
|
if (lport->state != LPORT_ST_SCR) {
|
|
FC_DBG("Received a SCR response, but in state %s\n",
|
|
fc_lport_state(lport));
|
|
goto out;
|
|
}
|
|
|
|
+ if (IS_ERR(fp)) {
|
|
+ fc_lport_error(lport, fp);
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
op = fc_frame_payload_op(fp);
|
|
if (op == ELS_LS_ACC)
|
|
fc_lport_enter_ready(lport);
|
|
@@ -1156,7 +1179,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_enter_scr() - Send a State Change Register (SCR) request
|
|
+ * fc_lport_enter_scr - Send a State Change Register (SCR) request
|
|
* @lport: Fibre Channel local port to register for state changes
|
|
*
|
|
* Locking Note: The lport lock is expected to be held before calling
|
|
@@ -1183,7 +1206,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_enter_rft_id() - Register FC4-types with the name server
|
|
+ * fc_lport_enter_rft_id - Register FC4-types with the name server
|
|
* @lport: Fibre Channel local port to register
|
|
*
|
|
* Locking Note: The lport lock is expected to be held before calling
|
|
@@ -1225,7 +1248,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_rft_id() - Register port name with the name server
|
|
+ * fc_rport_enter_rft_id - Register port name with the name server
|
|
* @lport: Fibre Channel local port to register
|
|
*
|
|
* Locking Note: The lport lock is expected to be held before calling
|
|
@@ -1258,7 +1281,7 @@
|
|
};
|
|
|
|
/**
|
|
- * fc_rport_enter_dns() - Create a rport to the name server
|
|
+ * fc_rport_enter_dns - Create a rport to the name server
|
|
* @lport: Fibre Channel local port requesting a rport for the name server
|
|
*
|
|
* Locking Note: The lport lock is expected to be held before calling
|
|
@@ -1281,7 +1304,7 @@
|
|
|
|
fc_lport_state_enter(lport, LPORT_ST_DNS);
|
|
|
|
- rport = lport->tt.rport_create(&dp);
|
|
+ rport = fc_rport_rogue_create(&dp);
|
|
if (!rport)
|
|
goto err;
|
|
|
|
@@ -1295,7 +1318,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_timeout() - Handler for the retry_work timer.
|
|
+ * fc_lport_timeout - Handler for the retry_work timer.
|
|
* @work: The work struct of the fc_lport
|
|
*/
|
|
static void fc_lport_timeout(struct work_struct *work)
|
|
@@ -1336,7 +1359,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_logo_resp() - Handle response to LOGO request
|
|
+ * fc_lport_logo_resp - Handle response to LOGO request
|
|
* @sp: current sequence in LOGO exchange
|
|
* @fp: response frame
|
|
* @lp_arg: Fibre Channel lport port instance that sent the LOGO request
|
|
@@ -1358,17 +1381,17 @@
|
|
|
|
FC_DEBUG_LPORT("Received a LOGO response\n");
|
|
|
|
- if (IS_ERR(fp)) {
|
|
- fc_lport_error(lport, fp);
|
|
- goto err;
|
|
- }
|
|
-
|
|
if (lport->state != LPORT_ST_LOGO) {
|
|
FC_DBG("Received a LOGO response, but in state %s\n",
|
|
fc_lport_state(lport));
|
|
goto out;
|
|
}
|
|
|
|
+ if (IS_ERR(fp)) {
|
|
+ fc_lport_error(lport, fp);
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
op = fc_frame_payload_op(fp);
|
|
if (op == ELS_LS_ACC)
|
|
fc_lport_enter_reset(lport);
|
|
@@ -1382,7 +1405,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_logo() - Logout of the fabric
|
|
+ * fc_rport_enter_logo - Logout of the fabric
|
|
* @lport: Fibre Channel local port to be logged out
|
|
*
|
|
* Locking Note: The lport lock is expected to be held before calling
|
|
@@ -1414,7 +1437,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_lport_flogi_resp() - Handle response to FLOGI request
|
|
+ * fc_lport_flogi_resp - Handle response to FLOGI request
|
|
* @sp: current sequence in FLOGI exchange
|
|
* @fp: response frame
|
|
* @lp_arg: Fibre Channel lport port instance that sent the FLOGI request
|
|
@@ -1442,17 +1465,17 @@
|
|
|
|
FC_DEBUG_LPORT("Received a FLOGI response\n");
|
|
|
|
- if (IS_ERR(fp)) {
|
|
- fc_lport_error(lport, fp);
|
|
- goto err;
|
|
- }
|
|
-
|
|
if (lport->state != LPORT_ST_FLOGI) {
|
|
FC_DBG("Received a FLOGI response, but in state %s\n",
|
|
fc_lport_state(lport));
|
|
goto out;
|
|
}
|
|
|
|
+ if (IS_ERR(fp)) {
|
|
+ fc_lport_error(lport, fp);
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
fh = fc_frame_header_get(fp);
|
|
did = ntoh24(fh->fh_d_id);
|
|
if (fc_frame_payload_op(fp) == ELS_LS_ACC && did != 0) {
|
|
@@ -1509,7 +1532,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_flogi() - Send a FLOGI request to the fabric manager
|
|
+ * fc_rport_enter_flogi - Send a FLOGI request to the fabric manager
|
|
* @lport: Fibre Channel local port to be logged in to the fabric
|
|
*
|
|
* Locking Note: The lport lock is expected to be held before calling
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/libfc/fc_rport.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_rport.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_rport.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_rport.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -81,7 +81,6 @@
|
|
struct fc_seq *, struct fc_frame *);
|
|
static void fc_rport_timeout(struct work_struct *);
|
|
static void fc_rport_error(struct fc_rport *, struct fc_frame *);
|
|
-static void fc_rport_error_retry(struct fc_rport *, struct fc_frame *);
|
|
static void fc_rport_work(struct work_struct *);
|
|
|
|
static const char *fc_rport_state_names[] = {
|
|
@@ -146,7 +145,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_state() - return a string for the state the rport is in
|
|
+ * fc_rport_state - return a string for the state the rport is in
|
|
* @rport: The rport whose state we want to get a string for
|
|
*/
|
|
static const char *fc_rport_state(struct fc_rport *rport)
|
|
@@ -161,7 +160,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_set_rport_loss_tmo() - Set the remote port loss timeout in seconds.
|
|
+ * fc_set_rport_loss_tmo - Set the remote port loss timeout in seconds.
|
|
* @rport: Pointer to Fibre Channel remote port structure
|
|
* @timeout: timeout in seconds
|
|
*/
|
|
@@ -175,12 +174,12 @@
|
|
EXPORT_SYMBOL(fc_set_rport_loss_tmo);
|
|
|
|
/**
|
|
- * fc_plogi_get_maxframe() - Get max payload from the common service parameters
|
|
+ * fc_plogi_get_maxframe - Get max payload from the common service parameters
|
|
* @flp: FLOGI payload structure
|
|
* @maxval: upper limit, may be less than what is in the service parameters
|
|
*/
|
|
-static unsigned int fc_plogi_get_maxframe(struct fc_els_flogi *flp,
|
|
- unsigned int maxval)
|
|
+static unsigned int
|
|
+fc_plogi_get_maxframe(struct fc_els_flogi *flp, unsigned int maxval)
|
|
{
|
|
unsigned int mfs;
|
|
|
|
@@ -198,7 +197,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_state_enter() - Change the rport's state
|
|
+ * fc_rport_state_enter - Change the rport's state
|
|
* @rport: The rport whose state should change
|
|
* @new: The new state of the rport
|
|
*
|
|
@@ -215,7 +214,6 @@
|
|
|
|
static void fc_rport_work(struct work_struct *work)
|
|
{
|
|
- u32 port_id;
|
|
struct fc_rport_libfc_priv *rdata =
|
|
container_of(work, struct fc_rport_libfc_priv, event_work);
|
|
enum fc_rport_event event;
|
|
@@ -281,18 +279,14 @@
|
|
rport_ops->event_callback(lport, rport, event);
|
|
if (trans_state == FC_PORTSTATE_ROGUE)
|
|
put_device(&rport->dev);
|
|
- else {
|
|
- port_id = rport->port_id;
|
|
+ else
|
|
fc_remote_port_delete(rport);
|
|
- lport->tt.exch_mgr_reset(lport, 0, port_id);
|
|
- lport->tt.exch_mgr_reset(lport, port_id, 0);
|
|
- }
|
|
} else
|
|
mutex_unlock(&rdata->rp_mutex);
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_login() - Start the remote port login state machine
|
|
+ * fc_rport_login - Start the remote port login state machine
|
|
* @rport: Fibre Channel remote port
|
|
*
|
|
* Locking Note: Called without the rport lock held. This
|
|
@@ -315,7 +309,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_logoff() - Logoff and remove an rport
|
|
+ * fc_rport_logoff - Logoff and remove an rport
|
|
* @rport: Fibre Channel remote port to be removed
|
|
*
|
|
* Locking Note: Called without the rport lock held. This
|
|
@@ -353,7 +347,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_ready() - The rport is ready
|
|
+ * fc_rport_enter_ready - The rport is ready
|
|
* @rport: Fibre Channel remote port that is ready
|
|
*
|
|
* Locking Note: The rport lock is expected to be held before calling
|
|
@@ -372,7 +366,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_timeout() - Handler for the retry_work timer.
|
|
+ * fc_rport_timeout - Handler for the retry_work timer.
|
|
* @work: The work struct of the fc_rport_libfc_priv
|
|
*
|
|
* Locking Note: Called without the rport lock held. This
|
|
@@ -411,75 +405,59 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_error() - Error handler, called once retries have been exhausted
|
|
+ * fc_rport_error - Handler for any errors
|
|
* @rport: The fc_rport object
|
|
* @fp: The frame pointer
|
|
*
|
|
+ * If the error was caused by a resource allocation failure
|
|
+ * then wait for half a second and retry, otherwise retry
|
|
+ * immediately.
|
|
+ *
|
|
* Locking Note: The rport lock is expected to be held before
|
|
* calling this routine
|
|
*/
|
|
static void fc_rport_error(struct fc_rport *rport, struct fc_frame *fp)
|
|
{
|
|
struct fc_rport_libfc_priv *rdata = rport->dd_data;
|
|
+ unsigned long delay = 0;
|
|
|
|
FC_DEBUG_RPORT("Error %ld in state %s, retries %d\n",
|
|
PTR_ERR(fp), fc_rport_state(rport), rdata->retries);
|
|
|
|
- switch (rdata->rp_state) {
|
|
- case RPORT_ST_PLOGI:
|
|
- case RPORT_ST_PRLI:
|
|
- case RPORT_ST_LOGO:
|
|
- rdata->event = RPORT_EV_FAILED;
|
|
- queue_work(rport_event_queue,
|
|
- &rdata->event_work);
|
|
- break;
|
|
- case RPORT_ST_RTV:
|
|
- fc_rport_enter_ready(rport);
|
|
- break;
|
|
- case RPORT_ST_NONE:
|
|
- case RPORT_ST_READY:
|
|
- case RPORT_ST_INIT:
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-/**
|
|
- * fc_rport_error_retry() - Error handler when retries are desired
|
|
- * @rport: The fc_rport object
|
|
- * @fp: The frame pointer
|
|
- *
|
|
- * If the error was an exchange timeout retry immediately,
|
|
- * otherwise wait for E_D_TOV.
|
|
- *
|
|
- * Locking Note: The rport lock is expected to be held before
|
|
- * calling this routine
|
|
- */
|
|
-static void fc_rport_error_retry(struct fc_rport *rport, struct fc_frame *fp)
|
|
-{
|
|
- struct fc_rport_libfc_priv *rdata = rport->dd_data;
|
|
- unsigned long delay = FC_DEF_E_D_TOV;
|
|
-
|
|
- /* make sure this isn't an FC_EX_CLOSED error, never retry those */
|
|
- if (PTR_ERR(fp) == -FC_EX_CLOSED)
|
|
- return fc_rport_error(rport, fp);
|
|
-
|
|
- if (rdata->retries < rdata->local_port->max_retry_count) {
|
|
- FC_DEBUG_RPORT("Error %ld in state %s, retrying\n",
|
|
- PTR_ERR(fp), fc_rport_state(rport));
|
|
- rdata->retries++;
|
|
- /* no additional delay on exchange timeouts */
|
|
- if (PTR_ERR(fp) == -FC_EX_TIMEOUT)
|
|
- delay = 0;
|
|
- get_device(&rport->dev);
|
|
- schedule_delayed_work(&rdata->retry_work, delay);
|
|
- return;
|
|
+ if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) {
|
|
+ /*
|
|
+ * Memory allocation failure, or the exchange timed out.
|
|
+ * Retry after delay
|
|
+ */
|
|
+ if (rdata->retries < rdata->local_port->max_retry_count) {
|
|
+ rdata->retries++;
|
|
+ if (!fp)
|
|
+ delay = msecs_to_jiffies(500);
|
|
+ get_device(&rport->dev);
|
|
+ schedule_delayed_work(&rdata->retry_work, delay);
|
|
+ } else {
|
|
+ switch (rdata->rp_state) {
|
|
+ case RPORT_ST_PLOGI:
|
|
+ case RPORT_ST_PRLI:
|
|
+ case RPORT_ST_LOGO:
|
|
+ rdata->event = RPORT_EV_FAILED;
|
|
+ queue_work(rport_event_queue,
|
|
+ &rdata->event_work);
|
|
+ break;
|
|
+ case RPORT_ST_RTV:
|
|
+ fc_rport_enter_ready(rport);
|
|
+ break;
|
|
+ case RPORT_ST_NONE:
|
|
+ case RPORT_ST_READY:
|
|
+ case RPORT_ST_INIT:
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
}
|
|
-
|
|
- return fc_rport_error(rport, fp);
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_plogi_recv_resp() - Handle incoming ELS PLOGI response
|
|
+ * fc_rport_plogi_recv_resp - Handle incoming ELS PLOGI response
|
|
* @sp: current sequence in the PLOGI exchange
|
|
* @fp: response frame
|
|
* @rp_arg: Fibre Channel remote port
|
|
@@ -505,17 +483,17 @@
|
|
FC_DEBUG_RPORT("Received a PLOGI response from port (%6x)\n",
|
|
rport->port_id);
|
|
|
|
- if (IS_ERR(fp)) {
|
|
- fc_rport_error_retry(rport, fp);
|
|
- goto err;
|
|
- }
|
|
-
|
|
if (rdata->rp_state != RPORT_ST_PLOGI) {
|
|
FC_DBG("Received a PLOGI response, but in state %s\n",
|
|
fc_rport_state(rport));
|
|
goto out;
|
|
}
|
|
|
|
+ if (IS_ERR(fp)) {
|
|
+ fc_rport_error(rport, fp);
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
op = fc_frame_payload_op(fp);
|
|
if (op == ELS_LS_ACC &&
|
|
(plp = fc_frame_payload_get(fp, sizeof(*plp))) != NULL) {
|
|
@@ -544,7 +522,7 @@
|
|
else
|
|
fc_rport_enter_prli(rport);
|
|
} else
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
|
|
out:
|
|
fc_frame_free(fp);
|
|
@@ -554,7 +532,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_plogi() - Send Port Login (PLOGI) request to peer
|
|
+ * fc_rport_enter_plogi - Send Port Login (PLOGI) request to peer
|
|
* @rport: Fibre Channel remote port to send PLOGI to
|
|
*
|
|
* Locking Note: The rport lock is expected to be held before calling
|
|
@@ -574,20 +552,20 @@
|
|
rport->maxframe_size = FC_MIN_MAX_PAYLOAD;
|
|
fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi));
|
|
if (!fp) {
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
return;
|
|
}
|
|
rdata->e_d_tov = lport->e_d_tov;
|
|
|
|
if (!lport->tt.elsct_send(lport, rport, fp, ELS_PLOGI,
|
|
fc_rport_plogi_resp, rport, lport->e_d_tov))
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
else
|
|
get_device(&rport->dev);
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_prli_resp() - Process Login (PRLI) response handler
|
|
+ * fc_rport_prli_resp - Process Login (PRLI) response handler
|
|
* @sp: current sequence in the PRLI exchange
|
|
* @fp: response frame
|
|
* @rp_arg: Fibre Channel remote port
|
|
@@ -614,17 +592,17 @@
|
|
FC_DEBUG_RPORT("Received a PRLI response from port (%6x)\n",
|
|
rport->port_id);
|
|
|
|
- if (IS_ERR(fp)) {
|
|
- fc_rport_error_retry(rport, fp);
|
|
- goto err;
|
|
- }
|
|
-
|
|
if (rdata->rp_state != RPORT_ST_PRLI) {
|
|
FC_DBG("Received a PRLI response, but in state %s\n",
|
|
fc_rport_state(rport));
|
|
goto out;
|
|
}
|
|
|
|
+ if (IS_ERR(fp)) {
|
|
+ fc_rport_error(rport, fp);
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
op = fc_frame_payload_op(fp);
|
|
if (op == ELS_LS_ACC) {
|
|
pp = fc_frame_payload_get(fp, sizeof(*pp));
|
|
@@ -657,7 +635,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_logo_resp() - Logout (LOGO) response handler
|
|
+ * fc_rport_logo_resp - Logout (LOGO) response handler
|
|
* @sp: current sequence in the LOGO exchange
|
|
* @fp: response frame
|
|
* @rp_arg: Fibre Channel remote port
|
|
@@ -679,7 +657,7 @@
|
|
rport->port_id);
|
|
|
|
if (IS_ERR(fp)) {
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
goto err;
|
|
}
|
|
|
|
@@ -706,7 +684,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_prli() - Send Process Login (PRLI) request to peer
|
|
+ * fc_rport_enter_prli - Send Process Login (PRLI) request to peer
|
|
* @rport: Fibre Channel remote port to send PRLI to
|
|
*
|
|
* Locking Note: The rport lock is expected to be held before calling
|
|
@@ -729,19 +707,19 @@
|
|
|
|
fp = fc_frame_alloc(lport, sizeof(*pp));
|
|
if (!fp) {
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
return;
|
|
}
|
|
|
|
if (!lport->tt.elsct_send(lport, rport, fp, ELS_PRLI,
|
|
fc_rport_prli_resp, rport, lport->e_d_tov))
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
else
|
|
get_device(&rport->dev);
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_els_rtv_resp() - Request Timeout Value response handler
|
|
+ * fc_rport_els_rtv_resp - Request Timeout Value response handler
|
|
* @sp: current sequence in the RTV exchange
|
|
* @fp: response frame
|
|
* @rp_arg: Fibre Channel remote port
|
|
@@ -764,17 +742,17 @@
|
|
FC_DEBUG_RPORT("Received a RTV response from port (%6x)\n",
|
|
rport->port_id);
|
|
|
|
- if (IS_ERR(fp)) {
|
|
- fc_rport_error(rport, fp);
|
|
- goto err;
|
|
- }
|
|
-
|
|
if (rdata->rp_state != RPORT_ST_RTV) {
|
|
FC_DBG("Received a RTV response, but in state %s\n",
|
|
fc_rport_state(rport));
|
|
goto out;
|
|
}
|
|
|
|
+ if (IS_ERR(fp)) {
|
|
+ fc_rport_error(rport, fp);
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
op = fc_frame_payload_op(fp);
|
|
if (op == ELS_LS_ACC) {
|
|
struct fc_els_rtv_acc *rtv;
|
|
@@ -807,7 +785,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_rtv() - Send Request Timeout Value (RTV) request to peer
|
|
+ * fc_rport_enter_rtv - Send Request Timeout Value (RTV) request to peer
|
|
* @rport: Fibre Channel remote port to send RTV to
|
|
*
|
|
* Locking Note: The rport lock is expected to be held before calling
|
|
@@ -826,19 +804,19 @@
|
|
|
|
fp = fc_frame_alloc(lport, sizeof(struct fc_els_rtv));
|
|
if (!fp) {
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
return;
|
|
}
|
|
|
|
if (!lport->tt.elsct_send(lport, rport, fp, ELS_RTV,
|
|
fc_rport_rtv_resp, rport, lport->e_d_tov))
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
else
|
|
get_device(&rport->dev);
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_enter_logo() - Send Logout (LOGO) request to peer
|
|
+ * fc_rport_enter_logo - Send Logout (LOGO) request to peer
|
|
* @rport: Fibre Channel remote port to send LOGO to
|
|
*
|
|
* Locking Note: The rport lock is expected to be held before calling
|
|
@@ -857,20 +835,20 @@
|
|
|
|
fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo));
|
|
if (!fp) {
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
return;
|
|
}
|
|
|
|
if (!lport->tt.elsct_send(lport, rport, fp, ELS_LOGO,
|
|
fc_rport_logo_resp, rport, lport->e_d_tov))
|
|
- fc_rport_error_retry(rport, fp);
|
|
+ fc_rport_error(rport, fp);
|
|
else
|
|
get_device(&rport->dev);
|
|
}
|
|
|
|
|
|
/**
|
|
- * fc_rport_recv_req() - Receive a request from a rport
|
|
+ * fc_rport_recv_req - Receive a request from a rport
|
|
* @sp: current sequence in the PLOGI exchange
|
|
* @fp: response frame
|
|
* @rp_arg: Fibre Channel remote port
|
|
@@ -931,7 +909,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_recv_plogi_req() - Handle incoming Port Login (PLOGI) request
|
|
+ * fc_rport_recv_plogi_req - Handle incoming Port Login (PLOGI) request
|
|
* @rport: Fibre Channel remote port that initiated PLOGI
|
|
* @sp: current sequence in the PLOGI exchange
|
|
* @fp: PLOGI request frame
|
|
@@ -1053,7 +1031,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_recv_prli_req() - Handle incoming Process Login (PRLI) request
|
|
+ * fc_rport_recv_prli_req - Handle incoming Process Login (PRLI) request
|
|
* @rport: Fibre Channel remote port that initiated PRLI
|
|
* @sp: current sequence in the PRLI exchange
|
|
* @fp: PRLI request frame
|
|
@@ -1204,7 +1182,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_recv_prlo_req() - Handle incoming Process Logout (PRLO) request
|
|
+ * fc_rport_recv_prlo_req - Handle incoming Process Logout (PRLO) request
|
|
* @rport: Fibre Channel remote port that initiated PRLO
|
|
* @sp: current sequence in the PRLO exchange
|
|
* @fp: PRLO request frame
|
|
@@ -1235,7 +1213,7 @@
|
|
}
|
|
|
|
/**
|
|
- * fc_rport_recv_logo_req() - Handle incoming Logout (LOGO) request
|
|
+ * fc_rport_recv_logo_req - Handle incoming Logout (LOGO) request
|
|
* @rport: Fibre Channel remote port that initiated LOGO
|
|
* @sp: current sequence in the LOGO exchange
|
|
* @fp: LOGO request frame
|
|
@@ -1271,9 +1249,6 @@
|
|
|
|
int fc_rport_init(struct fc_lport *lport)
|
|
{
|
|
- if (!lport->tt.rport_create)
|
|
- lport->tt.rport_create = fc_rport_rogue_create;
|
|
-
|
|
if (!lport->tt.rport_login)
|
|
lport->tt.rport_login = fc_rport_login;
|
|
|
|
@@ -1310,7 +1285,7 @@
|
|
struct fc_rport_libfc_priv *rdata = rport->dd_data;
|
|
struct fc_lport *lport = rdata->local_port;
|
|
|
|
- lport->tt.exch_mgr_reset(lport, 0, rport->port_id);
|
|
- lport->tt.exch_mgr_reset(lport, rport->port_id, 0);
|
|
+ lport->tt.exch_mgr_reset(lport->emp, 0, rport->port_id);
|
|
+ lport->tt.exch_mgr_reset(lport->emp, rport->port_id, 0);
|
|
}
|
|
EXPORT_SYMBOL(fc_rport_terminate_io);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/libiscsi.c linux-2.6.29-rc3.owrt/drivers/scsi/libiscsi.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/libiscsi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/libiscsi.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1998,8 +1998,6 @@
|
|
if (!shost->can_queue)
|
|
shost->can_queue = ISCSI_DEF_XMIT_CMDS_MAX;
|
|
|
|
- if (!shost->transportt->eh_timed_out)
|
|
- shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out;
|
|
return scsi_add_host(shost, pdev);
|
|
}
|
|
EXPORT_SYMBOL_GPL(iscsi_host_add);
|
|
@@ -2022,6 +2020,7 @@
|
|
shost = scsi_host_alloc(sht, sizeof(struct iscsi_host) + dd_data_size);
|
|
if (!shost)
|
|
return NULL;
|
|
+ shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out;
|
|
|
|
if (qdepth > ISCSI_MAX_CMD_PER_LUN || qdepth < 1) {
|
|
if (qdepth != 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/lpfc/lpfc_els.c linux-2.6.29-rc3.owrt/drivers/scsi/lpfc/lpfc_els.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/lpfc/lpfc_els.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/lpfc/lpfc_els.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -5258,7 +5258,6 @@
|
|
sizeof(struct lpfc_name));
|
|
break;
|
|
default:
|
|
- kfree(els_data);
|
|
return;
|
|
}
|
|
memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name));
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_attr.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_attr.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_attr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_attr.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -244,6 +244,12 @@
|
|
if (ha->optrom_state != QLA_SWAITING)
|
|
break;
|
|
|
|
+ if (start & 0xfff) {
|
|
+ qla_printk(KERN_WARNING, ha,
|
|
+ "Invalid start region 0x%x/0x%x.\n", start, size);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
ha->optrom_region_start = start;
|
|
ha->optrom_region_size = start + size > ha->optrom_size ?
|
|
ha->optrom_size - start : size;
|
|
@@ -297,7 +303,8 @@
|
|
else if (start == (ha->flt_region_boot * 4) ||
|
|
start == (ha->flt_region_fw * 4))
|
|
valid = 1;
|
|
- else if (IS_QLA25XX(ha) || IS_QLA81XX(ha))
|
|
+ else if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) &&
|
|
+ start == (ha->flt_region_vpd_nvram * 4))
|
|
valid = 1;
|
|
if (!valid) {
|
|
qla_printk(KERN_WARNING, ha,
|
|
@@ -1258,6 +1265,13 @@
|
|
test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags))
|
|
msleep(1000);
|
|
|
|
+ if (ha->mqenable) {
|
|
+ if (qla25xx_delete_queues(vha, 0) != QLA_SUCCESS)
|
|
+ qla_printk(KERN_WARNING, ha,
|
|
+ "Queue delete failed.\n");
|
|
+ vha->req_ques[0] = ha->req_q_map[0]->id;
|
|
+ }
|
|
+
|
|
qla24xx_disable_vp(vha);
|
|
|
|
fc_remove_host(vha->host);
|
|
@@ -1279,12 +1293,6 @@
|
|
vha->host_no, vha->vp_idx, vha));
|
|
}
|
|
|
|
- if (ha->mqenable) {
|
|
- if (qla25xx_delete_queues(vha, 0) != QLA_SUCCESS)
|
|
- qla_printk(KERN_WARNING, ha,
|
|
- "Queue delete failed.\n");
|
|
- }
|
|
-
|
|
scsi_host_put(vha->host);
|
|
qla_printk(KERN_INFO, ha, "vport %d deleted\n", id);
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_def.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_def.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_def.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_def.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2135,7 +2135,6 @@
|
|
/* Work events. */
|
|
enum qla_work_type {
|
|
QLA_EVT_AEN,
|
|
- QLA_EVT_IDC_ACK,
|
|
};
|
|
|
|
|
|
@@ -2150,10 +2149,6 @@
|
|
enum fc_host_event_code code;
|
|
u32 data;
|
|
} aen;
|
|
- struct {
|
|
-#define QLA_IDC_ACK_REGS 7
|
|
- uint16_t mb[QLA_IDC_ACK_REGS];
|
|
- } idc_ack;
|
|
} u;
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_devtbl.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_devtbl.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_devtbl.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_devtbl.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -72,7 +72,7 @@
|
|
"QLA2462", "Sun PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x141 */
|
|
"QLE2460", "Sun PCI-Express to 2Gb FC, Single Channel", /* 0x142 */
|
|
"QLE2462", "Sun PCI-Express to 4Gb FC, Single Channel", /* 0x143 */
|
|
- "QEM2462", "Server I/O Module 4Gb FC, Dual Channel", /* 0x144 */
|
|
+ "QEM2462" "Server I/O Module 4Gb FC, Dual Channel", /* 0x144 */
|
|
"QLE2440", "PCI-Express to 4Gb FC, Single Channel", /* 0x145 */
|
|
"QLE2464", "PCI-Express to 4Gb FC, Quad Channel", /* 0x146 */
|
|
"QLA2440", "PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x147 */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_fw.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_fw.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_fw.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_fw.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1402,8 +1402,6 @@
|
|
#define MBA_IDC_NOTIFY 0x8101
|
|
#define MBA_IDC_TIME_EXT 0x8102
|
|
|
|
-#define MBC_IDC_ACK 0x101
|
|
-
|
|
struct nvram_81xx {
|
|
/* NVRAM header. */
|
|
uint8_t id[4];
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_gbl.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_gbl.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_gbl.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_gbl.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -72,7 +72,6 @@
|
|
extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int);
|
|
extern int qla2x00_post_aen_work(struct scsi_qla_host *, enum
|
|
fc_host_event_code, u32);
|
|
-extern int qla2x00_post_idc_ack_work(struct scsi_qla_host *, uint16_t *);
|
|
|
|
extern void qla2x00_abort_fcport_cmds(fc_port_t *);
|
|
extern struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *,
|
|
@@ -267,8 +266,6 @@
|
|
|
|
extern int qla84xx_verify_chip(struct scsi_qla_host *, uint16_t *);
|
|
|
|
-extern int qla81xx_idc_ack(scsi_qla_host_t *, uint16_t *);
|
|
-
|
|
/*
|
|
* Global Function Prototypes in qla_isr.c source file.
|
|
*/
|
|
@@ -379,8 +376,10 @@
|
|
|
|
/* Globa function prototypes for multi-q */
|
|
extern int qla25xx_request_irq(struct rsp_que *);
|
|
-extern int qla25xx_init_req_que(struct scsi_qla_host *, struct req_que *);
|
|
-extern int qla25xx_init_rsp_que(struct scsi_qla_host *, struct rsp_que *);
|
|
+extern int qla25xx_init_req_que(struct scsi_qla_host *, struct req_que *,
|
|
+ uint8_t);
|
|
+extern int qla25xx_init_rsp_que(struct scsi_qla_host *, struct rsp_que *,
|
|
+ uint8_t);
|
|
extern int qla25xx_create_req_que(struct qla_hw_data *, uint16_t, uint8_t,
|
|
uint16_t, uint8_t, uint8_t);
|
|
extern int qla25xx_create_rsp_que(struct qla_hw_data *, uint16_t, uint8_t,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_init.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_init.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_init.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_init.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1226,8 +1226,9 @@
|
|
icb->firmware_options_2 |=
|
|
__constant_cpu_to_le32(BIT_18);
|
|
|
|
- icb->firmware_options_2 &= __constant_cpu_to_le32(~BIT_22);
|
|
+ icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_22);
|
|
icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_23);
|
|
+ ha->rsp_q_map[0]->options = icb->firmware_options_2;
|
|
|
|
WRT_REG_DWORD(®->isp25mq.req_q_in, 0);
|
|
WRT_REG_DWORD(®->isp25mq.req_q_out, 0);
|
|
@@ -1308,12 +1309,8 @@
|
|
|
|
DEBUG(printk("scsi(%ld): Issue init firmware.\n", vha->host_no));
|
|
|
|
- if (ha->flags.npiv_supported) {
|
|
- if (ha->operating_mode == LOOP)
|
|
- ha->max_npiv_vports = MIN_MULTI_ID_FABRIC - 1;
|
|
+ if (ha->flags.npiv_supported)
|
|
mid_init_cb->count = cpu_to_le16(ha->max_npiv_vports);
|
|
- }
|
|
-
|
|
|
|
mid_init_cb->options = __constant_cpu_to_le16(BIT_1);
|
|
|
|
@@ -2614,7 +2611,6 @@
|
|
port_id_t wrap, nxt_d_id;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev);
|
|
- struct scsi_qla_host *tvp;
|
|
|
|
rval = QLA_SUCCESS;
|
|
|
|
@@ -2714,7 +2710,7 @@
|
|
/* Bypass virtual ports of the same host. */
|
|
found = 0;
|
|
if (ha->num_vhosts) {
|
|
- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
|
|
+ list_for_each_entry(vp, &ha->vp_list, list) {
|
|
if (new_fcport->d_id.b24 == vp->d_id.b24) {
|
|
found = 1;
|
|
break;
|
|
@@ -2837,7 +2833,6 @@
|
|
uint16_t first_loop_id;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct scsi_qla_host *vp;
|
|
- struct scsi_qla_host *tvp;
|
|
|
|
rval = QLA_SUCCESS;
|
|
|
|
@@ -2862,7 +2857,7 @@
|
|
/* Check for loop ID being already in use. */
|
|
found = 0;
|
|
fcport = NULL;
|
|
- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
|
|
+ list_for_each_entry(vp, &ha->vp_list, list) {
|
|
list_for_each_entry(fcport, &vp->vp_fcports, list) {
|
|
if (fcport->loop_id == dev->loop_id &&
|
|
fcport != dev) {
|
|
@@ -3297,7 +3292,6 @@
|
|
uint8_t status = 0;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct scsi_qla_host *vp;
|
|
- struct scsi_qla_host *tvp;
|
|
struct req_que *req = ha->req_q_map[0];
|
|
|
|
if (vha->flags.online) {
|
|
@@ -3313,7 +3307,7 @@
|
|
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
|
atomic_set(&vha->loop_state, LOOP_DOWN);
|
|
qla2x00_mark_all_devices_lost(vha, 0);
|
|
- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list)
|
|
+ list_for_each_entry(vp, &ha->vp_list, list)
|
|
qla2x00_mark_all_devices_lost(vp, 0);
|
|
} else {
|
|
if (!atomic_read(&vha->loop_down_timer))
|
|
@@ -3410,7 +3404,7 @@
|
|
DEBUG(printk(KERN_INFO
|
|
"qla2x00_abort_isp(%ld): succeeded.\n",
|
|
vha->host_no));
|
|
- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
|
|
+ list_for_each_entry(vp, &ha->vp_list, list) {
|
|
if (vp->vp_idx)
|
|
qla2x00_vp_abort_isp(vp);
|
|
}
|
|
@@ -3435,7 +3429,7 @@
|
|
static int
|
|
qla2x00_restart_isp(scsi_qla_host_t *vha)
|
|
{
|
|
- int status = 0;
|
|
+ uint8_t status = 0;
|
|
uint32_t wait_time;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct req_que *req = ha->req_q_map[0];
|
|
@@ -3499,7 +3493,7 @@
|
|
rsp = ha->rsp_q_map[i];
|
|
if (rsp) {
|
|
rsp->options &= ~BIT_0;
|
|
- ret = qla25xx_init_rsp_que(base_vha, rsp);
|
|
+ ret = qla25xx_init_rsp_que(base_vha, rsp, rsp->options);
|
|
if (ret != QLA_SUCCESS)
|
|
DEBUG2_17(printk(KERN_WARNING
|
|
"%s Rsp que:%d init failed\n", __func__,
|
|
@@ -3513,7 +3507,7 @@
|
|
if (req) {
|
|
/* Clear outstanding commands array. */
|
|
req->options &= ~BIT_0;
|
|
- ret = qla25xx_init_req_que(base_vha, req);
|
|
+ ret = qla25xx_init_req_que(base_vha, req, req->options);
|
|
if (ret != QLA_SUCCESS)
|
|
DEBUG2_17(printk(KERN_WARNING
|
|
"%s Req que:%d init failed\n", __func__,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_isr.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_isr.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_isr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_isr.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -266,40 +266,6 @@
|
|
}
|
|
}
|
|
|
|
-static void
|
|
-qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
|
|
-{
|
|
- static char *event[] =
|
|
- { "Complete", "Request Notification", "Time Extension" };
|
|
- int rval;
|
|
- struct device_reg_24xx __iomem *reg24 = &vha->hw->iobase->isp24;
|
|
- uint16_t __iomem *wptr;
|
|
- uint16_t cnt, timeout, mb[QLA_IDC_ACK_REGS];
|
|
-
|
|
- /* Seed data -- mailbox1 -> mailbox7. */
|
|
- wptr = (uint16_t __iomem *)®24->mailbox1;
|
|
- for (cnt = 0; cnt < QLA_IDC_ACK_REGS; cnt++, wptr++)
|
|
- mb[cnt] = RD_REG_WORD(wptr);
|
|
-
|
|
- DEBUG2(printk("scsi(%ld): Inter-Driver Commucation %s -- "
|
|
- "%04x %04x %04x %04x %04x %04x %04x.\n", vha->host_no,
|
|
- event[aen & 0xff],
|
|
- mb[0], mb[1], mb[2], mb[3], mb[4], mb[5], mb[6]));
|
|
-
|
|
- /* Acknowledgement needed? [Notify && non-zero timeout]. */
|
|
- timeout = (descr >> 8) & 0xf;
|
|
- if (aen != MBA_IDC_NOTIFY || !timeout)
|
|
- return;
|
|
-
|
|
- DEBUG2(printk("scsi(%ld): Inter-Driver Commucation %s -- "
|
|
- "ACK timeout=%d.\n", vha->host_no, event[aen & 0xff], timeout));
|
|
-
|
|
- rval = qla2x00_post_idc_ack_work(vha, mb);
|
|
- if (rval != QLA_SUCCESS)
|
|
- qla_printk(KERN_WARNING, vha->hw,
|
|
- "IDC failed to post ACK.\n");
|
|
-}
|
|
-
|
|
/**
|
|
* qla2x00_async_event() - Process aynchronous events.
|
|
* @ha: SCSI driver HA context
|
|
@@ -748,9 +714,21 @@
|
|
"%04x %04x %04x\n", vha->host_no, mb[1], mb[2], mb[3]));
|
|
break;
|
|
case MBA_IDC_COMPLETE:
|
|
+ DEBUG2(printk("scsi(%ld): Inter-Driver Commucation "
|
|
+ "Complete -- %04x %04x %04x\n", vha->host_no, mb[1], mb[2],
|
|
+ mb[3]));
|
|
+ break;
|
|
case MBA_IDC_NOTIFY:
|
|
+ DEBUG2(printk("scsi(%ld): Inter-Driver Commucation "
|
|
+ "Request Notification -- %04x %04x %04x\n", vha->host_no,
|
|
+ mb[1], mb[2], mb[3]));
|
|
+ /**** Mailbox registers 4 - 7 valid!!! */
|
|
+ break;
|
|
case MBA_IDC_TIME_EXT:
|
|
- qla81xx_idc_event(vha, mb[0], mb[1]);
|
|
+ DEBUG2(printk("scsi(%ld): Inter-Driver Commucation "
|
|
+ "Time Extension -- %04x %04x %04x\n", vha->host_no, mb[1],
|
|
+ mb[2], mb[3]));
|
|
+ /**** Mailbox registers 4 - 7 valid!!! */
|
|
break;
|
|
}
|
|
|
|
@@ -1729,6 +1707,7 @@
|
|
struct qla_hw_data *ha;
|
|
struct rsp_que *rsp;
|
|
struct device_reg_24xx __iomem *reg;
|
|
+ uint16_t msix_disabled_hccr = 0;
|
|
|
|
rsp = (struct rsp_que *) dev_id;
|
|
if (!rsp) {
|
|
@@ -1741,8 +1720,17 @@
|
|
|
|
spin_lock_irq(&ha->hardware_lock);
|
|
|
|
+ msix_disabled_hccr = rsp->options;
|
|
+ if (!rsp->id)
|
|
+ msix_disabled_hccr &= __constant_cpu_to_le32(BIT_22);
|
|
+ else
|
|
+ msix_disabled_hccr &= __constant_cpu_to_le32(BIT_6);
|
|
+
|
|
qla24xx_process_response_queue(rsp);
|
|
|
|
+ if (!msix_disabled_hccr)
|
|
+ WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT);
|
|
+
|
|
spin_unlock_irq(&ha->hardware_lock);
|
|
|
|
return IRQ_HANDLED;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_mbx.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_mbx.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_mbx.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_mbx.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2685,7 +2685,6 @@
|
|
uint16_t stat = le16_to_cpu(rptid_entry->vp_idx);
|
|
struct qla_hw_data *ha = vha->hw;
|
|
scsi_qla_host_t *vp;
|
|
- scsi_qla_host_t *tvp;
|
|
|
|
if (rptid_entry->entry_status != 0)
|
|
return;
|
|
@@ -2711,7 +2710,7 @@
|
|
if (MSB(stat) == 1)
|
|
return;
|
|
|
|
- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list)
|
|
+ list_for_each_entry(vp, &ha->vp_list, list)
|
|
if (vp_idx == vp->vp_idx)
|
|
break;
|
|
if (!vp)
|
|
@@ -3091,7 +3090,8 @@
|
|
}
|
|
|
|
int
|
|
-qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
|
|
+qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req,
|
|
+ uint8_t options)
|
|
{
|
|
int rval;
|
|
unsigned long flags;
|
|
@@ -3101,7 +3101,7 @@
|
|
struct qla_hw_data *ha = vha->hw;
|
|
|
|
mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
|
|
- mcp->mb[1] = req->options;
|
|
+ mcp->mb[1] = options;
|
|
mcp->mb[2] = MSW(LSD(req->dma));
|
|
mcp->mb[3] = LSW(LSD(req->dma));
|
|
mcp->mb[6] = MSW(MSD(req->dma));
|
|
@@ -3128,7 +3128,7 @@
|
|
mcp->tov = 60;
|
|
|
|
spin_lock_irqsave(&ha->hardware_lock, flags);
|
|
- if (!(req->options & BIT_0)) {
|
|
+ if (!(options & BIT_0)) {
|
|
WRT_REG_DWORD(®->req_q_in, 0);
|
|
WRT_REG_DWORD(®->req_q_out, 0);
|
|
}
|
|
@@ -3142,7 +3142,8 @@
|
|
}
|
|
|
|
int
|
|
-qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
|
|
+qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp,
|
|
+ uint8_t options)
|
|
{
|
|
int rval;
|
|
unsigned long flags;
|
|
@@ -3152,7 +3153,7 @@
|
|
struct qla_hw_data *ha = vha->hw;
|
|
|
|
mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
|
|
- mcp->mb[1] = rsp->options;
|
|
+ mcp->mb[1] = options;
|
|
mcp->mb[2] = MSW(LSD(rsp->dma));
|
|
mcp->mb[3] = LSW(LSD(rsp->dma));
|
|
mcp->mb[6] = MSW(MSD(rsp->dma));
|
|
@@ -3177,7 +3178,7 @@
|
|
mcp->tov = 60;
|
|
|
|
spin_lock_irqsave(&ha->hardware_lock, flags);
|
|
- if (!(rsp->options & BIT_0)) {
|
|
+ if (!(options & BIT_0)) {
|
|
WRT_REG_DWORD(®->rsp_q_out, 0);
|
|
WRT_REG_DWORD(®->rsp_q_in, 0);
|
|
}
|
|
@@ -3192,29 +3193,3 @@
|
|
return rval;
|
|
}
|
|
|
|
-int
|
|
-qla81xx_idc_ack(scsi_qla_host_t *vha, uint16_t *mb)
|
|
-{
|
|
- int rval;
|
|
- mbx_cmd_t mc;
|
|
- mbx_cmd_t *mcp = &mc;
|
|
-
|
|
- DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
|
|
-
|
|
- mcp->mb[0] = MBC_IDC_ACK;
|
|
- memcpy(&mcp->mb[1], mb, QLA_IDC_ACK_REGS * sizeof(uint16_t));
|
|
- mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
|
|
- mcp->in_mb = MBX_0;
|
|
- mcp->tov = MBX_TOV_SECONDS;
|
|
- mcp->flags = 0;
|
|
- rval = qla2x00_mailbox_command(vha, mcp);
|
|
-
|
|
- if (rval != QLA_SUCCESS) {
|
|
- DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__,
|
|
- vha->host_no, rval, mcp->mb[0]));
|
|
- } else {
|
|
- DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no));
|
|
- }
|
|
-
|
|
- return rval;
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_mid.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_mid.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_mid.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_mid.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -69,10 +69,9 @@
|
|
qla24xx_find_vhost_by_name(struct qla_hw_data *ha, uint8_t *port_name)
|
|
{
|
|
scsi_qla_host_t *vha;
|
|
- struct scsi_qla_host *tvha;
|
|
|
|
/* Locate matching device in database. */
|
|
- list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) {
|
|
+ list_for_each_entry(vha, &ha->vp_list, list) {
|
|
if (!memcmp(port_name, vha->port_name, WWN_SIZE))
|
|
return vha;
|
|
}
|
|
@@ -195,11 +194,11 @@
|
|
void
|
|
qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb)
|
|
{
|
|
- scsi_qla_host_t *vha, *tvha;
|
|
+ scsi_qla_host_t *vha;
|
|
struct qla_hw_data *ha = rsp->hw;
|
|
int i = 0;
|
|
|
|
- list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) {
|
|
+ list_for_each_entry(vha, &ha->vp_list, list) {
|
|
if (vha->vp_idx) {
|
|
switch (mb[0]) {
|
|
case MBA_LIP_OCCURRED:
|
|
@@ -301,7 +300,6 @@
|
|
int ret;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
scsi_qla_host_t *vp;
|
|
- struct scsi_qla_host *tvp;
|
|
|
|
if (vha->vp_idx)
|
|
return;
|
|
@@ -310,7 +308,7 @@
|
|
|
|
clear_bit(VP_DPC_NEEDED, &vha->dpc_flags);
|
|
|
|
- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
|
|
+ list_for_each_entry(vp, &ha->vp_list, list) {
|
|
if (vp->vp_idx)
|
|
ret = qla2x00_do_dpc_vp(vp);
|
|
}
|
|
@@ -398,7 +396,7 @@
|
|
|
|
qla2x00_start_timer(vha, qla2x00_timer, WATCH_INTERVAL);
|
|
|
|
- memset(vha->req_ques, 0, sizeof(vha->req_ques));
|
|
+ memset(vha->req_ques, 0, sizeof(vha->req_ques) * QLA_MAX_HOST_QUES);
|
|
vha->req_ques[0] = ha->req_q_map[0]->id;
|
|
host->can_queue = ha->req_q_map[0]->length + 128;
|
|
host->this_id = 255;
|
|
@@ -473,7 +471,7 @@
|
|
|
|
if (req) {
|
|
req->options |= BIT_0;
|
|
- ret = qla25xx_init_req_que(vha, req);
|
|
+ ret = qla25xx_init_req_que(vha, req, req->options);
|
|
}
|
|
if (ret == QLA_SUCCESS)
|
|
qla25xx_free_req_que(vha, req);
|
|
@@ -488,7 +486,7 @@
|
|
|
|
if (rsp) {
|
|
rsp->options |= BIT_0;
|
|
- ret = qla25xx_init_rsp_que(vha, rsp);
|
|
+ ret = qla25xx_init_rsp_que(vha, rsp, rsp->options);
|
|
}
|
|
if (ret == QLA_SUCCESS)
|
|
qla25xx_free_rsp_que(vha, rsp);
|
|
@@ -504,7 +502,7 @@
|
|
|
|
req->options |= BIT_3;
|
|
req->qos = qos;
|
|
- ret = qla25xx_init_req_que(vha, req);
|
|
+ ret = qla25xx_init_req_que(vha, req, req->options);
|
|
if (ret != QLA_SUCCESS)
|
|
DEBUG2_17(printk(KERN_WARNING "%s failed\n", __func__));
|
|
/* restore options bit */
|
|
@@ -634,7 +632,7 @@
|
|
req->max_q_depth = ha->req_q_map[0]->max_q_depth;
|
|
mutex_unlock(&ha->vport_lock);
|
|
|
|
- ret = qla25xx_init_req_que(base_vha, req);
|
|
+ ret = qla25xx_init_req_que(base_vha, req, options);
|
|
if (ret != QLA_SUCCESS) {
|
|
qla_printk(KERN_WARNING, ha, "%s failed\n", __func__);
|
|
mutex_lock(&ha->vport_lock);
|
|
@@ -712,7 +710,7 @@
|
|
if (ret)
|
|
goto que_failed;
|
|
|
|
- ret = qla25xx_init_rsp_que(base_vha, rsp);
|
|
+ ret = qla25xx_init_rsp_que(base_vha, rsp, options);
|
|
if (ret != QLA_SUCCESS) {
|
|
qla_printk(KERN_WARNING, ha, "%s failed\n", __func__);
|
|
mutex_lock(&ha->vport_lock);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_os.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_os.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_os.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_os.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2222,6 +2222,10 @@
|
|
{
|
|
char name[16];
|
|
|
|
+ ha->init_cb_size = sizeof(init_cb_t);
|
|
+ if (IS_QLA2XXX_MIDTYPE(ha))
|
|
+ ha->init_cb_size = sizeof(struct mid_init_cb_24xx);
|
|
+
|
|
ha->init_cb = dma_alloc_coherent(&ha->pdev->dev, ha->init_cb_size,
|
|
&ha->init_cb_dma, GFP_KERNEL);
|
|
if (!ha->init_cb)
|
|
@@ -2518,19 +2522,6 @@
|
|
return qla2x00_post_work(vha, e, 1);
|
|
}
|
|
|
|
-int
|
|
-qla2x00_post_idc_ack_work(struct scsi_qla_host *vha, uint16_t *mb)
|
|
-{
|
|
- struct qla_work_evt *e;
|
|
-
|
|
- e = qla2x00_alloc_work(vha, QLA_EVT_IDC_ACK, 1);
|
|
- if (!e)
|
|
- return QLA_FUNCTION_FAILED;
|
|
-
|
|
- memcpy(e->u.idc_ack.mb, mb, QLA_IDC_ACK_REGS * sizeof(uint16_t));
|
|
- return qla2x00_post_work(vha, e, 1);
|
|
-}
|
|
-
|
|
static void
|
|
qla2x00_do_work(struct scsi_qla_host *vha)
|
|
{
|
|
@@ -2548,9 +2539,6 @@
|
|
fc_host_post_event(vha->host, fc_get_event_number(),
|
|
e->u.aen.code, e->u.aen.data);
|
|
break;
|
|
- case QLA_EVT_IDC_ACK:
|
|
- qla81xx_idc_ack(vha, e->u.idc_ack.mb);
|
|
- break;
|
|
}
|
|
if (e->flags & QLA_EVT_FLAG_FREE)
|
|
kfree(e);
|
|
@@ -2564,7 +2552,7 @@
|
|
void qla2x00_relogin(struct scsi_qla_host *vha)
|
|
{
|
|
fc_port_t *fcport;
|
|
- int status;
|
|
+ uint8_t status;
|
|
uint16_t next_loopid = 0;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_sup.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_sup.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_sup.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_sup.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -684,7 +684,7 @@
|
|
"end=0x%x size=0x%x.\n", le32_to_cpu(region->code), start,
|
|
le32_to_cpu(region->end) >> 2, le32_to_cpu(region->size)));
|
|
|
|
- switch (le32_to_cpu(region->code) & 0xff) {
|
|
+ switch (le32_to_cpu(region->code)) {
|
|
case FLT_REG_FW:
|
|
ha->flt_region_fw = start;
|
|
break;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_version.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_version.h
|
|
--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_version.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_version.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -7,7 +7,7 @@
|
|
/*
|
|
* Driver version
|
|
*/
|
|
-#define QLA2XXX_VERSION "8.03.00-k4"
|
|
+#define QLA2XXX_VERSION "8.03.00-k2"
|
|
|
|
#define QLA_DRIVER_MAJOR_VER 8
|
|
#define QLA_DRIVER_MINOR_VER 3
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/scsi_lib.c linux-2.6.29-rc3.owrt/drivers/scsi/scsi_lib.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/scsi_lib.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/scsi_lib.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1040,11 +1040,12 @@
|
|
action = ACTION_FAIL;
|
|
break;
|
|
case ABORTED_COMMAND:
|
|
- action = ACTION_FAIL;
|
|
if (sshdr.asc == 0x10) { /* DIF */
|
|
description = "Target Data Integrity Failure";
|
|
+ action = ACTION_FAIL;
|
|
error = -EILSEQ;
|
|
- }
|
|
+ } else
|
|
+ action = ACTION_RETRY;
|
|
break;
|
|
case NOT_READY:
|
|
/* If the device is in the process of becoming
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/scsi_scan.c linux-2.6.29-rc3.owrt/drivers/scsi/scsi_scan.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/scsi_scan.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/scsi_scan.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -317,7 +317,6 @@
|
|
return sdev;
|
|
|
|
out_device_destroy:
|
|
- scsi_device_set_state(sdev, SDEV_DEL);
|
|
transport_destroy_device(&sdev->sdev_gendev);
|
|
put_device(&sdev->sdev_gendev);
|
|
out:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/sd.c linux-2.6.29-rc3.owrt/drivers/scsi/sd.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/sd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/sd.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -107,7 +107,6 @@
|
|
static void sd_print_sense_hdr(struct scsi_disk *, struct scsi_sense_hdr *);
|
|
static void sd_print_result(struct scsi_disk *, int);
|
|
|
|
-static DEFINE_SPINLOCK(sd_index_lock);
|
|
static DEFINE_IDA(sd_index_ida);
|
|
|
|
/* This semaphore is used to mediate the 0->1 reference get in the
|
|
@@ -1167,19 +1166,23 @@
|
|
/*
|
|
* The device does not want the automatic start to be issued.
|
|
*/
|
|
- if (sdkp->device->no_start_on_add)
|
|
+ if (sdkp->device->no_start_on_add) {
|
|
break;
|
|
+ }
|
|
|
|
- if (sense_valid && sshdr.sense_key == NOT_READY) {
|
|
- if (sshdr.asc == 4 && sshdr.ascq == 3)
|
|
- break; /* manual intervention required */
|
|
- if (sshdr.asc == 4 && sshdr.ascq == 0xb)
|
|
- break; /* standby */
|
|
- if (sshdr.asc == 4 && sshdr.ascq == 0xc)
|
|
- break; /* unavailable */
|
|
- /*
|
|
- * Issue command to spin up drive when not ready
|
|
- */
|
|
+ /*
|
|
+ * If manual intervention is required, or this is an
|
|
+ * absent USB storage device, a spinup is meaningless.
|
|
+ */
|
|
+ if (sense_valid &&
|
|
+ sshdr.sense_key == NOT_READY &&
|
|
+ sshdr.asc == 4 && sshdr.ascq == 3) {
|
|
+ break; /* manual intervention required */
|
|
+
|
|
+ /*
|
|
+ * Issue command to spin up drive when not ready
|
|
+ */
|
|
+ } else if (sense_valid && sshdr.sense_key == NOT_READY) {
|
|
if (!spintime) {
|
|
sd_printk(KERN_NOTICE, sdkp, "Spinning up disk...");
|
|
cmd[0] = START_STOP;
|
|
@@ -1911,9 +1914,7 @@
|
|
if (!ida_pre_get(&sd_index_ida, GFP_KERNEL))
|
|
goto out_put;
|
|
|
|
- spin_lock(&sd_index_lock);
|
|
error = ida_get_new(&sd_index_ida, &index);
|
|
- spin_unlock(&sd_index_lock);
|
|
} while (error == -EAGAIN);
|
|
|
|
if (error)
|
|
@@ -1935,9 +1936,7 @@
|
|
return 0;
|
|
|
|
out_free_index:
|
|
- spin_lock(&sd_index_lock);
|
|
ida_remove(&sd_index_ida, index);
|
|
- spin_unlock(&sd_index_lock);
|
|
out_put:
|
|
put_disk(gd);
|
|
out_free:
|
|
@@ -1987,9 +1986,7 @@
|
|
struct scsi_disk *sdkp = to_scsi_disk(dev);
|
|
struct gendisk *disk = sdkp->disk;
|
|
|
|
- spin_lock(&sd_index_lock);
|
|
ida_remove(&sd_index_ida, sdkp->index);
|
|
- spin_unlock(&sd_index_lock);
|
|
|
|
disk->private_data = NULL;
|
|
put_disk(disk);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/sg.c linux-2.6.29-rc3.owrt/drivers/scsi/sg.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/sg.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/sg.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1078,7 +1078,7 @@
|
|
case BLKTRACESETUP:
|
|
return blk_trace_setup(sdp->device->request_queue,
|
|
sdp->disk->disk_name,
|
|
- MKDEV(SCSI_GENERIC_MAJOR, sdp->index),
|
|
+ sdp->device->sdev_gendev.devt,
|
|
(char *)arg);
|
|
case BLKTRACESTART:
|
|
return blk_trace_startstop(sdp->device->request_queue, 1);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/scsi/zalon.c linux-2.6.29-rc3.owrt/drivers/scsi/zalon.c
|
|
--- linux-2.6.29.owrt/drivers/scsi/zalon.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/scsi/zalon.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -137,7 +137,7 @@
|
|
goto fail;
|
|
|
|
if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) {
|
|
- dev_printk(KERN_ERR, &dev->dev, "irq problem with %d, detaching\n ",
|
|
+ dev_printk(KERN_ERR, dev, "irq problem with %d, detaching\n ",
|
|
dev->irq);
|
|
goto fail;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/serial/8250.c linux-2.6.29-rc3.owrt/drivers/serial/8250.c
|
|
--- linux-2.6.29.owrt/drivers/serial/8250.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/serial/8250.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2083,20 +2083,6 @@
|
|
|
|
serial8250_set_mctrl(&up->port, up->port.mctrl);
|
|
|
|
- /* Serial over Lan (SoL) hack:
|
|
- Intel 8257x Gigabit ethernet chips have a
|
|
- 16550 emulation, to be used for Serial Over Lan.
|
|
- Those chips take a longer time than a normal
|
|
- serial device to signalize that a transmission
|
|
- data was queued. Due to that, the above test generally
|
|
- fails. One solution would be to delay the reading of
|
|
- iir. However, this is not reliable, since the timeout
|
|
- is variable. So, let's just don't test if we receive
|
|
- TX irq. This way, we'll never enable UART_BUG_TXEN.
|
|
- */
|
|
- if (up->port.flags & UPF_NO_TXEN_TEST)
|
|
- goto dont_test_tx_en;
|
|
-
|
|
/*
|
|
* Do a quick test to see if we receive an
|
|
* interrupt when we enable the TX irq.
|
|
@@ -2116,7 +2102,6 @@
|
|
up->bugs &= ~UART_BUG_TXEN;
|
|
}
|
|
|
|
-dont_test_tx_en:
|
|
spin_unlock_irqrestore(&up->port.lock, flags);
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/serial/8250_pci.c linux-2.6.29-rc3.owrt/drivers/serial/8250_pci.c
|
|
--- linux-2.6.29.owrt/drivers/serial/8250_pci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/serial/8250_pci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -798,21 +798,6 @@
|
|
return setup_port(priv, port, bar, offset, board->reg_shift);
|
|
}
|
|
|
|
-static int skip_tx_en_setup(struct serial_private *priv,
|
|
- const struct pciserial_board *board,
|
|
- struct uart_port *port, int idx)
|
|
-{
|
|
- port->flags |= UPF_NO_TXEN_TEST;
|
|
- printk(KERN_DEBUG "serial8250: skipping TxEn test for device "
|
|
- "[%04x:%04x] subsystem [%04x:%04x]\n",
|
|
- priv->dev->vendor,
|
|
- priv->dev->device,
|
|
- priv->dev->subsystem_vendor,
|
|
- priv->dev->subsystem_device);
|
|
-
|
|
- return pci_default_setup(priv, board, port, idx);
|
|
-}
|
|
-
|
|
/* This should be in linux/pci_ids.h */
|
|
#define PCI_VENDOR_ID_SBSMODULARIO 0x124B
|
|
#define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B
|
|
@@ -879,27 +864,6 @@
|
|
.init = pci_inteli960ni_init,
|
|
.setup = pci_default_setup,
|
|
},
|
|
- {
|
|
- .vendor = PCI_VENDOR_ID_INTEL,
|
|
- .device = PCI_DEVICE_ID_INTEL_8257X_SOL,
|
|
- .subvendor = PCI_ANY_ID,
|
|
- .subdevice = PCI_ANY_ID,
|
|
- .setup = skip_tx_en_setup,
|
|
- },
|
|
- {
|
|
- .vendor = PCI_VENDOR_ID_INTEL,
|
|
- .device = PCI_DEVICE_ID_INTEL_82573L_SOL,
|
|
- .subvendor = PCI_ANY_ID,
|
|
- .subdevice = PCI_ANY_ID,
|
|
- .setup = skip_tx_en_setup,
|
|
- },
|
|
- {
|
|
- .vendor = PCI_VENDOR_ID_INTEL,
|
|
- .device = PCI_DEVICE_ID_INTEL_82573E_SOL,
|
|
- .subvendor = PCI_ANY_ID,
|
|
- .subdevice = PCI_ANY_ID,
|
|
- .setup = skip_tx_en_setup,
|
|
- },
|
|
/*
|
|
* ITE
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/serial/atmel_serial.c linux-2.6.29-rc3.owrt/drivers/serial/atmel_serial.c
|
|
--- linux-2.6.29.owrt/drivers/serial/atmel_serial.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/serial/atmel_serial.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -877,10 +877,6 @@
|
|
}
|
|
}
|
|
|
|
- /* Save current CSR for comparison in atmel_tasklet_func() */
|
|
- atmel_port->irq_status_prev = UART_GET_CSR(port);
|
|
- atmel_port->irq_status = atmel_port->irq_status_prev;
|
|
-
|
|
/*
|
|
* Finally, enable the serial port
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/serial/jsm/jsm_driver.c linux-2.6.29-rc3.owrt/drivers/serial/jsm/jsm_driver.c
|
|
--- linux-2.6.29.owrt/drivers/serial/jsm/jsm_driver.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/serial/jsm/jsm_driver.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -84,8 +84,6 @@
|
|
brd->pci_dev = pdev;
|
|
if (pdev->device == PCIE_DEVICE_ID_NEO_4_IBM)
|
|
brd->maxports = 4;
|
|
- else if (pdev->device == PCI_DEVICE_ID_DIGI_NEO_8)
|
|
- brd->maxports = 8;
|
|
else
|
|
brd->maxports = 2;
|
|
|
|
@@ -214,7 +212,6 @@
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 },
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 },
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 },
|
|
- { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_NEO_8), 0, 0, 5 },
|
|
{ 0, }
|
|
};
|
|
MODULE_DEVICE_TABLE(pci, jsm_pci_tbl);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/serial/jsm/jsm_tty.c linux-2.6.29-rc3.owrt/drivers/serial/jsm/jsm_tty.c
|
|
--- linux-2.6.29.owrt/drivers/serial/jsm/jsm_tty.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/serial/jsm/jsm_tty.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -161,11 +161,6 @@
|
|
channel->ch_bd->bd_ops->disable_receiver(channel);
|
|
}
|
|
|
|
-static void jsm_tty_enable_ms(struct uart_port *port)
|
|
-{
|
|
- /* Nothing needed */
|
|
-}
|
|
-
|
|
static void jsm_tty_break(struct uart_port *port, int break_state)
|
|
{
|
|
unsigned long lock_flags;
|
|
@@ -350,7 +345,6 @@
|
|
.start_tx = jsm_tty_start_tx,
|
|
.send_xchar = jsm_tty_send_xchar,
|
|
.stop_rx = jsm_tty_stop_rx,
|
|
- .enable_ms = jsm_tty_enable_ms,
|
|
.break_ctl = jsm_tty_break,
|
|
.startup = jsm_tty_open,
|
|
.shutdown = jsm_tty_close,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/serial/sh-sci.h linux-2.6.29-rc3.owrt/drivers/serial/sh-sci.h
|
|
--- linux-2.6.29.owrt/drivers/serial/sh-sci.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/serial/sh-sci.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -133,7 +133,7 @@
|
|
# define SCSPTR3 0xffed0024 /* 16 bit SCIF */
|
|
# define SCSPTR4 0xffee0024 /* 16 bit SCIF */
|
|
# define SCSPTR5 0xffef0024 /* 16 bit SCIF */
|
|
-# define SCIF_ORER 0x0001 /* Overrun error bit */
|
|
+# define SCIF_OPER 0x0001 /* Overrun error bit */
|
|
# define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
|
|
#elif defined(CONFIG_CPU_SUBTYPE_SH7201) || \
|
|
defined(CONFIG_CPU_SUBTYPE_SH7203) || \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/spi/spi_gpio.c linux-2.6.29-rc3.owrt/drivers/spi/spi_gpio.c
|
|
--- linux-2.6.29.owrt/drivers/spi/spi_gpio.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/spi/spi_gpio.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -117,7 +117,7 @@
|
|
|
|
static inline int getmiso(const struct spi_device *spi)
|
|
{
|
|
- return !!gpio_get_value(SPI_MISO_GPIO);
|
|
+ return gpio_get_value(SPI_MISO_GPIO);
|
|
}
|
|
|
|
#undef pdata
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/agnx/agnx.h linux-2.6.29-rc3.owrt/drivers/staging/agnx/agnx.h
|
|
--- linux-2.6.29.owrt/drivers/staging/agnx/agnx.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/agnx/agnx.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef AGNX_H_
|
|
#define AGNX_H_
|
|
|
|
-#include <linux/io.h>
|
|
-
|
|
#include "xmit.h"
|
|
|
|
#define PFX KBUILD_MODNAME ": "
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/altpciechdma/altpciechdma.c linux-2.6.29-rc3.owrt/drivers/staging/altpciechdma/altpciechdma.c
|
|
--- linux-2.6.29.owrt/drivers/staging/altpciechdma/altpciechdma.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/altpciechdma/altpciechdma.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -531,7 +531,7 @@
|
|
goto fail;
|
|
|
|
/* allocate and map coherently-cached memory for a DMA-able buffer */
|
|
- /* @see Documentation/PCI/PCI-DMA-mapping.txt, near line 318 */
|
|
+ /* @see 2.6.26.2/Documentation/DMA-mapping.txt line 318 */
|
|
buffer_virt = (u8 *)pci_alloc_consistent(dev, PAGE_SIZE * 4, &buffer_bus);
|
|
if (!buffer_virt) {
|
|
printk(KERN_DEBUG "Could not allocate coherent DMA buffer.\n");
|
|
@@ -846,7 +846,7 @@
|
|
|
|
#if 1 // @todo For now, disable 64-bit, because I do not understand the implications (DAC!)
|
|
/* query for DMA transfer */
|
|
- /* @see Documentation/PCI/PCI-DMA-mapping.txt */
|
|
+ /* @see Documentation/DMA-mapping.txt */
|
|
if (!pci_set_dma_mask(dev, DMA_64BIT_MASK)) {
|
|
pci_set_consistent_dma_mask(dev, DMA_64BIT_MASK);
|
|
/* use 64-bit DMA */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/android/binder.c linux-2.6.29-rc3.owrt/drivers/staging/android/binder.c
|
|
--- linux-2.6.29.owrt/drivers/staging/android/binder.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/android/binder.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -319,7 +319,6 @@
|
|
int fd, error;
|
|
struct fdtable *fdt;
|
|
unsigned long rlim_cur;
|
|
- unsigned long irqs;
|
|
|
|
if (files == NULL)
|
|
return -ESRCH;
|
|
@@ -336,11 +335,12 @@
|
|
* N.B. For clone tasks sharing a files structure, this test
|
|
* will limit the total number of files that can be opened.
|
|
*/
|
|
- rlim_cur = 0;
|
|
- if (lock_task_sighand(tsk, &irqs)) {
|
|
+ rcu_read_lock();
|
|
+ if (tsk->signal)
|
|
rlim_cur = tsk->signal->rlim[RLIMIT_NOFILE].rlim_cur;
|
|
- unlock_task_sighand(tsk, &irqs);
|
|
- }
|
|
+ else
|
|
+ rlim_cur = 0;
|
|
+ rcu_read_unlock();
|
|
if (fd >= rlim_cur)
|
|
goto out;
|
|
|
|
@@ -2649,14 +2649,14 @@
|
|
{
|
|
struct binder_proc *proc = vma->vm_private_data;
|
|
if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
|
|
- printk(KERN_INFO "binder: %d open vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, pgprot_val(vma->vm_page_prot));
|
|
+ printk(KERN_INFO "binder: %d open vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
|
|
dump_stack();
|
|
}
|
|
static void binder_vma_close(struct vm_area_struct *vma)
|
|
{
|
|
struct binder_proc *proc = vma->vm_private_data;
|
|
if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
|
|
- printk(KERN_INFO "binder: %d close vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, pgprot_val(vma->vm_page_prot));
|
|
+ printk(KERN_INFO "binder: %d close vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
|
|
proc->vma = NULL;
|
|
}
|
|
|
|
@@ -2677,7 +2677,7 @@
|
|
vma->vm_end = vma->vm_start + SZ_4M;
|
|
|
|
if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
|
|
- printk(KERN_INFO "binder_mmap: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, pgprot_val(vma->vm_page_prot));
|
|
+ printk(KERN_INFO "binder_mmap: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
|
|
|
|
if (vma->vm_flags & FORBIDDEN_MMAP_FLAGS) {
|
|
ret = -EPERM;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/android/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/android/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/staging/android/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/android/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -27,7 +27,6 @@
|
|
bool "Android RAM Console Enable error correction"
|
|
default n
|
|
depends on ANDROID_RAM_CONSOLE
|
|
- depends on !ANDROID_RAM_CONSOLE_EARLY_INIT
|
|
select REED_SOLOMON
|
|
select REED_SOLOMON_ENC8
|
|
select REED_SOLOMON_DEC8
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/android/lowmemorykiller.txt linux-2.6.29-rc3.owrt/drivers/staging/android/lowmemorykiller.txt
|
|
--- linux-2.6.29.owrt/drivers/staging/android/lowmemorykiller.txt 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/android/lowmemorykiller.txt 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,16 +0,0 @@
|
|
-The lowmemorykiller driver lets user-space specify a set of memory thresholds
|
|
-where processes with a range of oom_adj values will get killed. Specify the
|
|
-minimum oom_adj values in /sys/module/lowmemorykiller/parameters/adj and the
|
|
-number of free pages in /sys/module/lowmemorykiller/parameters/minfree. Both
|
|
-files take a comma separated list of numbers in ascending order.
|
|
-
|
|
-For example, write "0,8" to /sys/module/lowmemorykiller/parameters/adj and
|
|
-"1024,4096" to /sys/module/lowmemorykiller/parameters/minfree to kill processes
|
|
-with a oom_adj value of 8 or higher when the free memory drops below 4096 pages
|
|
-and kill processes with a oom_adj value of 0 or higher when the free memory
|
|
-drops below 1024 pages.
|
|
-
|
|
-The driver considers memory used for caches to be free, but if a large
|
|
-percentage of the cached memory is locked this can be very inaccurate
|
|
-and processes may not get killed until the normal oom killer is triggered.
|
|
-
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/android/ram_console.c linux-2.6.29-rc3.owrt/drivers/staging/android/ram_console.c
|
|
--- linux-2.6.29.owrt/drivers/staging/android/ram_console.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/android/ram_console.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -224,23 +224,9 @@
|
|
ram_console_buffer_size =
|
|
buffer_size - sizeof(struct ram_console_buffer);
|
|
|
|
- if (ram_console_buffer_size > buffer_size) {
|
|
- pr_err("ram_console: buffer %p, invalid size %d, datasize %d\n",
|
|
- buffer, buffer_size, ram_console_buffer_size);
|
|
- return 0;
|
|
- }
|
|
-
|
|
#ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
|
|
ram_console_buffer_size -= (DIV_ROUND_UP(ram_console_buffer_size,
|
|
ECC_BLOCK_SIZE) + 1) * ECC_SIZE;
|
|
-
|
|
- if (ram_console_buffer_size > buffer_size) {
|
|
- pr_err("ram_console: buffer %p, invalid size %d, "
|
|
- "non-ecc datasize %d\n",
|
|
- buffer, buffer_size, ram_console_buffer_size);
|
|
- return 0;
|
|
- }
|
|
-
|
|
ram_console_par_buffer = buffer->data + ram_console_buffer_size;
|
|
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/android/timed_gpio.c linux-2.6.29-rc3.owrt/drivers/staging/android/timed_gpio.c
|
|
--- linux-2.6.29.owrt/drivers/staging/android/timed_gpio.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/android/timed_gpio.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -18,7 +18,7 @@
|
|
#include <linux/platform_device.h>
|
|
#include <linux/hrtimer.h>
|
|
#include <linux/err.h>
|
|
-#include <linux/gpio.h>
|
|
+#include <asm/arch/gpio.h>
|
|
|
|
#include "timed_gpio.h"
|
|
|
|
@@ -49,8 +49,7 @@
|
|
|
|
if (hrtimer_active(&gpio_data->timer)) {
|
|
ktime_t r = hrtimer_get_remaining(&gpio_data->timer);
|
|
- struct timeval t = ktime_to_timeval(r);
|
|
- remaining = t.tv_sec * 1000 + t.tv_usec / 1000;
|
|
+ remaining = r.tv.sec * 1000 + r.tv.nsec / 1000000;
|
|
} else
|
|
remaining = 0;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/at76_usb/at76_usb.c linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/at76_usb.c
|
|
--- linux-2.6.29.owrt/drivers/staging/at76_usb/at76_usb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/at76_usb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -6,6 +6,7 @@
|
|
* Copyright (c) 2004 Nick Jones
|
|
* Copyright (c) 2004 Balint Seeber <n0_5p4m_p13453@hotmail.com>
|
|
* Copyright (c) 2007 Guido Guenther <agx@sigxcpu.org>
|
|
+ * Copyright (c) 2007 Kalle Valo <kalle.valo@iki.fi>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
@@ -16,6 +17,13 @@
|
|
* Atmel AT76C503A/505/505A.
|
|
*
|
|
* Some iw_handler code was taken from airo.c, (C) 1999 Benjamin Reed
|
|
+ *
|
|
+ * TODO for the mac80211 port:
|
|
+ * o adhoc support
|
|
+ * o RTS/CTS support
|
|
+ * o Power Save Mode support
|
|
+ * o support for short/long preambles
|
|
+ * o export variables through debugfs/sysfs
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
@@ -36,7 +44,7 @@
|
|
#include <net/ieee80211_radiotap.h>
|
|
#include <linux/firmware.h>
|
|
#include <linux/leds.h>
|
|
-#include <net/ieee80211.h>
|
|
+#include <net/mac80211.h>
|
|
|
|
#include "at76_usb.h"
|
|
|
|
@@ -76,31 +84,43 @@
|
|
#define DBG_WE_EVENTS 0x08000000 /* dump wireless events */
|
|
#define DBG_FW 0x10000000 /* firmware download */
|
|
#define DBG_DFU 0x20000000 /* device firmware upgrade */
|
|
+#define DBG_CMD 0x40000000
|
|
+#define DBG_MAC80211 0x80000000
|
|
|
|
#define DBG_DEFAULTS 0
|
|
|
|
/* Use our own dbg macro */
|
|
#define at76_dbg(bits, format, arg...) \
|
|
- do { \
|
|
- if (at76_debug & (bits)) \
|
|
+do { \
|
|
+ if (at76_debug & (bits)) \
|
|
+ printk(KERN_DEBUG DRIVER_NAME ": " format "\n" , ## arg); \
|
|
+} while (0)
|
|
+
|
|
+#define at76_dbg_dump(bits, buf, len, format, arg...) \
|
|
+do { \
|
|
+ if (at76_debug & (bits)) { \
|
|
printk(KERN_DEBUG DRIVER_NAME ": " format "\n" , ## arg); \
|
|
- } while (0)
|
|
+ print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, buf, len); \
|
|
+ } \
|
|
+} while (0)
|
|
|
|
static int at76_debug = DBG_DEFAULTS;
|
|
|
|
+#define FIRMWARE_IS_WPA(ver) ((ver.major == 1) && (ver.minor == 103))
|
|
+
|
|
/* Protect against concurrent firmware loading and parsing */
|
|
static struct mutex fw_mutex;
|
|
|
|
static struct fwentry firmwares[] = {
|
|
- [0] = {""},
|
|
- [BOARD_503_ISL3861] = {"atmel_at76c503-i3861.bin"},
|
|
- [BOARD_503_ISL3863] = {"atmel_at76c503-i3863.bin"},
|
|
- [BOARD_503] = {"atmel_at76c503-rfmd.bin"},
|
|
- [BOARD_503_ACC] = {"atmel_at76c503-rfmd-acc.bin"},
|
|
- [BOARD_505] = {"atmel_at76c505-rfmd.bin"},
|
|
- [BOARD_505_2958] = {"atmel_at76c505-rfmd2958.bin"},
|
|
- [BOARD_505A] = {"atmel_at76c505a-rfmd2958.bin"},
|
|
- [BOARD_505AMX] = {"atmel_at76c505amx-rfmd.bin"},
|
|
+ [0] = { "" },
|
|
+ [BOARD_503_ISL3861] = { "atmel_at76c503-i3861.bin" },
|
|
+ [BOARD_503_ISL3863] = { "atmel_at76c503-i3863.bin" },
|
|
+ [BOARD_503] = { "atmel_at76c503-rfmd.bin" },
|
|
+ [BOARD_503_ACC] = { "atmel_at76c503-rfmd-acc.bin" },
|
|
+ [BOARD_505] = { "atmel_at76c505-rfmd.bin" },
|
|
+ [BOARD_505_2958] = { "atmel_at76c505-rfmd2958.bin" },
|
|
+ [BOARD_505A] = { "atmel_at76c505a-rfmd2958.bin" },
|
|
+ [BOARD_505AMX] = { "atmel_at76c505amx-rfmd.bin" },
|
|
};
|
|
|
|
#define USB_DEVICE_DATA(__ops) .driver_info = (kernel_ulong_t)(__ops)
|
|
@@ -110,135 +130,133 @@
|
|
* at76c503-i3861
|
|
*/
|
|
/* Generic AT76C503/3861 device */
|
|
- {USB_DEVICE(0x03eb, 0x7603), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x03eb, 0x7603), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Linksys WUSB11 v2.1/v2.6 */
|
|
- {USB_DEVICE(0x066b, 0x2211), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x066b, 0x2211), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Netgear MA101 rev. A */
|
|
- {USB_DEVICE(0x0864, 0x4100), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x0864, 0x4100), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Tekram U300C / Allnet ALL0193 */
|
|
- {USB_DEVICE(0x0b3b, 0x1612), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x0b3b, 0x1612), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* HP HN210W J7801A */
|
|
- {USB_DEVICE(0x03f0, 0x011c), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x03f0, 0x011c), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Sitecom/Z-Com/Zyxel M4Y-750 */
|
|
- {USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Dynalink/Askey WLL013 (intersil) */
|
|
- {USB_DEVICE(0x069a, 0x0320), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x069a, 0x0320), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* EZ connect 11Mpbs Wireless USB Adapter SMC2662W v1 */
|
|
- {USB_DEVICE(0x0d5c, 0xa001), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x0d5c, 0xa001), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* BenQ AWL300 */
|
|
- {USB_DEVICE(0x04a5, 0x9000), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x04a5, 0x9000), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Addtron AWU-120, Compex WLU11 */
|
|
- {USB_DEVICE(0x05dd, 0xff31), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x05dd, 0xff31), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Intel AP310 AnyPoint II USB */
|
|
- {USB_DEVICE(0x8086, 0x0200), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x8086, 0x0200), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Dynalink L11U */
|
|
- {USB_DEVICE(0x0d8e, 0x7100), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x0d8e, 0x7100), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* Arescom WL-210, FCC id 07J-GL2411USB */
|
|
- {USB_DEVICE(0x0d8e, 0x7110), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x0d8e, 0x7110), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* I-O DATA WN-B11/USB */
|
|
- {USB_DEVICE(0x04bb, 0x0919), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x04bb, 0x0919), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/* BT Voyager 1010 */
|
|
- {USB_DEVICE(0x069a, 0x0821), USB_DEVICE_DATA(BOARD_503_ISL3861)},
|
|
+ { USB_DEVICE(0x069a, 0x0821), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
|
/*
|
|
* at76c503-i3863
|
|
*/
|
|
/* Generic AT76C503/3863 device */
|
|
- {USB_DEVICE(0x03eb, 0x7604), USB_DEVICE_DATA(BOARD_503_ISL3863)},
|
|
+ { USB_DEVICE(0x03eb, 0x7604), USB_DEVICE_DATA(BOARD_503_ISL3863) },
|
|
/* Samsung SWL-2100U */
|
|
- {USB_DEVICE(0x055d, 0xa000), USB_DEVICE_DATA(BOARD_503_ISL3863)},
|
|
+ { USB_DEVICE(0x055d, 0xa000), USB_DEVICE_DATA(BOARD_503_ISL3863) },
|
|
/*
|
|
* at76c503-rfmd
|
|
*/
|
|
/* Generic AT76C503/RFMD device */
|
|
- {USB_DEVICE(0x03eb, 0x7605), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x03eb, 0x7605), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Dynalink/Askey WLL013 (rfmd) */
|
|
- {USB_DEVICE(0x069a, 0x0321), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x069a, 0x0321), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Linksys WUSB11 v2.6 */
|
|
- {USB_DEVICE(0x077b, 0x2219), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x077b, 0x2219), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Network Everywhere NWU11B */
|
|
- {USB_DEVICE(0x077b, 0x2227), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x077b, 0x2227), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Netgear MA101 rev. B */
|
|
- {USB_DEVICE(0x0864, 0x4102), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x0864, 0x4102), USB_DEVICE_DATA(BOARD_503) },
|
|
/* D-Link DWL-120 rev. E */
|
|
- {USB_DEVICE(0x2001, 0x3200), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x2001, 0x3200), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Actiontec 802UAT1, HWU01150-01UK */
|
|
- {USB_DEVICE(0x1668, 0x7605), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x1668, 0x7605), USB_DEVICE_DATA(BOARD_503) },
|
|
/* AirVast W-Buddie WN210 */
|
|
- {USB_DEVICE(0x03eb, 0x4102), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x03eb, 0x4102), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Dick Smith Electronics XH1153 802.11b USB adapter */
|
|
- {USB_DEVICE(0x1371, 0x5743), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x1371, 0x5743), USB_DEVICE_DATA(BOARD_503) },
|
|
/* CNet CNUSB611 */
|
|
- {USB_DEVICE(0x1371, 0x0001), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x1371, 0x0001), USB_DEVICE_DATA(BOARD_503) },
|
|
/* FiberLine FL-WL200U */
|
|
- {USB_DEVICE(0x1371, 0x0002), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x1371, 0x0002), USB_DEVICE_DATA(BOARD_503) },
|
|
/* BenQ AWL400 USB stick */
|
|
- {USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503) },
|
|
/* 3Com 3CRSHEW696 */
|
|
- {USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Siemens Santis ADSL WLAN USB adapter WLL 013 */
|
|
- {USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Belkin F5D6050, version 2 */
|
|
- {USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503) },
|
|
/* iBlitzz, BWU613 (not *B or *SB) */
|
|
- {USB_DEVICE(0x07b8, 0xb000), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x07b8, 0xb000), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Gigabyte GN-WLBM101 */
|
|
- {USB_DEVICE(0x1044, 0x8003), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x1044, 0x8003), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Planex GW-US11S */
|
|
- {USB_DEVICE(0x2019, 0x3220), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x2019, 0x3220), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Internal WLAN adapter in h5[4,5]xx series iPAQs */
|
|
- {USB_DEVICE(0x049f, 0x0032), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x049f, 0x0032), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Corega Wireless LAN USB-11 mini */
|
|
- {USB_DEVICE(0x07aa, 0x0011), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x07aa, 0x0011), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Corega Wireless LAN USB-11 mini2 */
|
|
- {USB_DEVICE(0x07aa, 0x0018), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x07aa, 0x0018), USB_DEVICE_DATA(BOARD_503) },
|
|
/* Uniden PCW100 */
|
|
- {USB_DEVICE(0x05dd, 0xff35), USB_DEVICE_DATA(BOARD_503)},
|
|
+ { USB_DEVICE(0x05dd, 0xff35), USB_DEVICE_DATA(BOARD_503) },
|
|
/*
|
|
* at76c503-rfmd-acc
|
|
*/
|
|
/* SMC2664W */
|
|
- {USB_DEVICE(0x083a, 0x3501), USB_DEVICE_DATA(BOARD_503_ACC)},
|
|
+ { USB_DEVICE(0x083a, 0x3501), USB_DEVICE_DATA(BOARD_503_ACC) },
|
|
/* Belkin F5D6050, SMC2662W v2, SMC2662W-AR */
|
|
- {USB_DEVICE(0x0d5c, 0xa002), USB_DEVICE_DATA(BOARD_503_ACC)},
|
|
+ { USB_DEVICE(0x0d5c, 0xa002), USB_DEVICE_DATA(BOARD_503_ACC) },
|
|
/*
|
|
* at76c505-rfmd
|
|
*/
|
|
/* Generic AT76C505/RFMD */
|
|
- {USB_DEVICE(0x03eb, 0x7606), USB_DEVICE_DATA(BOARD_505)},
|
|
+ { USB_DEVICE(0x03eb, 0x7606), USB_DEVICE_DATA(BOARD_505) },
|
|
/*
|
|
* at76c505-rfmd2958
|
|
*/
|
|
/* Generic AT76C505/RFMD, OvisLink WL-1130USB */
|
|
- {USB_DEVICE(0x03eb, 0x7613), USB_DEVICE_DATA(BOARD_505_2958)},
|
|
+ { USB_DEVICE(0x03eb, 0x7613), USB_DEVICE_DATA(BOARD_505_2958) },
|
|
/* Fiberline FL-WL240U */
|
|
- {USB_DEVICE(0x1371, 0x0014), USB_DEVICE_DATA(BOARD_505_2958)},
|
|
+ { USB_DEVICE(0x1371, 0x0014), USB_DEVICE_DATA(BOARD_505_2958) },
|
|
/* CNet CNUSB-611G */
|
|
- {USB_DEVICE(0x1371, 0x0013), USB_DEVICE_DATA(BOARD_505_2958)},
|
|
+ { USB_DEVICE(0x1371, 0x0013), USB_DEVICE_DATA(BOARD_505_2958) },
|
|
/* Linksys WUSB11 v2.8 */
|
|
- {USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958)},
|
|
+ { USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958) },
|
|
/* Xterasys XN-2122B, IBlitzz BWU613B/BWU613SB */
|
|
- {USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958)},
|
|
+ { USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958) },
|
|
/* Corega WLAN USB Stick 11 */
|
|
- {USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958)},
|
|
+ { USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958) },
|
|
/* Microstar MSI Box MS6978 */
|
|
- {USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958)},
|
|
+ { USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958) },
|
|
/*
|
|
* at76c505a-rfmd2958
|
|
*/
|
|
/* Generic AT76C505A device */
|
|
- {USB_DEVICE(0x03eb, 0x7614), USB_DEVICE_DATA(BOARD_505A)},
|
|
+ { USB_DEVICE(0x03eb, 0x7614), USB_DEVICE_DATA(BOARD_505A) },
|
|
/* Generic AT76C505AS device */
|
|
- {USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A)},
|
|
+ { USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A) },
|
|
/* Siemens Gigaset USB WLAN Adapter 11 */
|
|
- {USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A)},
|
|
- /* OQO Model 01+ Internal Wi-Fi */
|
|
- {USB_DEVICE(0x1557, 0x0002), USB_DEVICE_DATA(BOARD_505A)},
|
|
+ { USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A) },
|
|
/*
|
|
* at76c505amx-rfmd
|
|
*/
|
|
/* Generic AT76C505AMX device */
|
|
- {USB_DEVICE(0x03eb, 0x7615), USB_DEVICE_DATA(BOARD_505AMX)},
|
|
- {}
|
|
+ { USB_DEVICE(0x03eb, 0x7615), USB_DEVICE_DATA(BOARD_505AMX) },
|
|
+ { }
|
|
};
|
|
|
|
MODULE_DEVICE_TABLE(usb, dev_table);
|
|
@@ -246,26 +264,8 @@
|
|
/* Supported rates of this hardware, bit 7 marks basic rates */
|
|
static const u8 hw_rates[] = { 0x82, 0x84, 0x0b, 0x16 };
|
|
|
|
-/* Frequency of each channel in MHz */
|
|
-static const long channel_frequency[] = {
|
|
- 2412, 2417, 2422, 2427, 2432, 2437, 2442,
|
|
- 2447, 2452, 2457, 2462, 2467, 2472, 2484
|
|
-};
|
|
-
|
|
-#define NUM_CHANNELS ARRAY_SIZE(channel_frequency)
|
|
-
|
|
static const char *const preambles[] = { "long", "short", "auto" };
|
|
|
|
-static const char *const mac_states[] = {
|
|
- [MAC_INIT] = "INIT",
|
|
- [MAC_SCANNING] = "SCANNING",
|
|
- [MAC_AUTH] = "AUTH",
|
|
- [MAC_ASSOC] = "ASSOC",
|
|
- [MAC_JOINING] = "JOINING",
|
|
- [MAC_CONNECTED] = "CONNECTED",
|
|
- [MAC_OWN_IBSS] = "OWN_IBSS"
|
|
-};
|
|
-
|
|
/* Firmware download */
|
|
/* DFU states */
|
|
#define STATE_IDLE 0x00
|
|
@@ -300,17 +300,30 @@
|
|
|
|
static inline int at76_is_intersil(enum board_type board)
|
|
{
|
|
- return (board == BOARD_503_ISL3861 || board == BOARD_503_ISL3863);
|
|
+ if (board == BOARD_503_ISL3861 || board == BOARD_503_ISL3863)
|
|
+ return 1;
|
|
+ return 0;
|
|
}
|
|
|
|
static inline int at76_is_503rfmd(enum board_type board)
|
|
{
|
|
- return (board == BOARD_503 || board == BOARD_503_ACC);
|
|
+ if (board == BOARD_503 || board == BOARD_503_ACC)
|
|
+ return 1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static inline int at76_is_505(enum board_type board)
|
|
+{
|
|
+ if (board == BOARD_505 || board == BOARD_505_2958)
|
|
+ return 1;
|
|
+ return 0;
|
|
}
|
|
|
|
static inline int at76_is_505a(enum board_type board)
|
|
{
|
|
- return (board == BOARD_505A || board == BOARD_505AMX);
|
|
+ if (board == BOARD_505A || board == BOARD_505AMX)
|
|
+ return 1;
|
|
+ return 0;
|
|
}
|
|
|
|
/* Load a block of the first (internal) part of the firmware */
|
|
@@ -491,41 +504,6 @@
|
|
return ret;
|
|
}
|
|
|
|
-/* Report that the scan results are ready */
|
|
-static inline void at76_iwevent_scan_complete(struct net_device *netdev)
|
|
-{
|
|
- union iwreq_data wrqu;
|
|
- wrqu.data.length = 0;
|
|
- wrqu.data.flags = 0;
|
|
- wireless_send_event(netdev, SIOCGIWSCAN, &wrqu, NULL);
|
|
- at76_dbg(DBG_WE_EVENTS, "%s: SIOCGIWSCAN sent", netdev->name);
|
|
-}
|
|
-
|
|
-static inline void at76_iwevent_bss_connect(struct net_device *netdev,
|
|
- u8 *bssid)
|
|
-{
|
|
- union iwreq_data wrqu;
|
|
- wrqu.data.length = 0;
|
|
- wrqu.data.flags = 0;
|
|
- memcpy(wrqu.ap_addr.sa_data, bssid, ETH_ALEN);
|
|
- wrqu.ap_addr.sa_family = ARPHRD_ETHER;
|
|
- wireless_send_event(netdev, SIOCGIWAP, &wrqu, NULL);
|
|
- at76_dbg(DBG_WE_EVENTS, "%s: %s: SIOCGIWAP sent", netdev->name,
|
|
- __func__);
|
|
-}
|
|
-
|
|
-static inline void at76_iwevent_bss_disconnect(struct net_device *netdev)
|
|
-{
|
|
- union iwreq_data wrqu;
|
|
- wrqu.data.length = 0;
|
|
- wrqu.data.flags = 0;
|
|
- memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
|
|
- wrqu.ap_addr.sa_family = ARPHRD_ETHER;
|
|
- wireless_send_event(netdev, SIOCGIWAP, &wrqu, NULL);
|
|
- at76_dbg(DBG_WE_EVENTS, "%s: %s: SIOCGIWAP sent", netdev->name,
|
|
- __func__);
|
|
-}
|
|
-
|
|
#define HEX2STR_BUFFERS 4
|
|
#define HEX2STR_MAX_LEN 64
|
|
#define BIN2HEX(x) ((x) < 10 ? '0' + (x) : (x) + 'A' - 10)
|
|
@@ -597,37 +575,6 @@
|
|
mod_timer(&ledtrig_tx_timer, jiffies + HZ / 4);
|
|
}
|
|
|
|
-/* Check if the given ssid is hidden */
|
|
-static inline int at76_is_hidden_ssid(u8 *ssid, int length)
|
|
-{
|
|
- static const u8 zeros[32];
|
|
-
|
|
- if (length == 0)
|
|
- return 1;
|
|
-
|
|
- if (length == 1 && ssid[0] == ' ')
|
|
- return 1;
|
|
-
|
|
- return (memcmp(ssid, zeros, length) == 0);
|
|
-}
|
|
-
|
|
-static inline void at76_free_bss_list(struct at76_priv *priv)
|
|
-{
|
|
- struct list_head *next, *ptr;
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
|
|
-
|
|
- priv->curr_bss = NULL;
|
|
-
|
|
- list_for_each_safe(ptr, next, &priv->bss_list) {
|
|
- list_del(ptr);
|
|
- kfree(list_entry(ptr, struct bss_info, list));
|
|
- }
|
|
-
|
|
- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
|
|
-}
|
|
-
|
|
static int at76_remap(struct usb_device *udev)
|
|
{
|
|
int ret;
|
|
@@ -651,7 +598,7 @@
|
|
return -ENOMEM;
|
|
ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x33,
|
|
USB_TYPE_VENDOR | USB_DIR_IN |
|
|
- USB_RECIP_INTERFACE, 0x01, 0, op_mode, 1,
|
|
+ USB_RECIP_INTERFACE, 0x01, 0, &op_mode, 1,
|
|
USB_CTRL_GET_TIMEOUT);
|
|
saved = *op_mode;
|
|
kfree(op_mode);
|
|
@@ -729,7 +676,7 @@
|
|
kfree(hwcfg);
|
|
if (ret < 0)
|
|
printk(KERN_ERR "%s: cannot get HW Config (error %d)\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
|
|
return ret;
|
|
}
|
|
@@ -738,15 +685,15 @@
|
|
{
|
|
int i;
|
|
static struct reg_domain const fd_tab[] = {
|
|
- {0x10, "FCC (USA)", 0x7ff}, /* ch 1-11 */
|
|
- {0x20, "IC (Canada)", 0x7ff}, /* ch 1-11 */
|
|
- {0x30, "ETSI (most of Europe)", 0x1fff}, /* ch 1-13 */
|
|
- {0x31, "Spain", 0x600}, /* ch 10-11 */
|
|
- {0x32, "France", 0x1e00}, /* ch 10-13 */
|
|
- {0x40, "MKK (Japan)", 0x2000}, /* ch 14 */
|
|
- {0x41, "MKK1 (Japan)", 0x3fff}, /* ch 1-14 */
|
|
- {0x50, "Israel", 0x3fc}, /* ch 3-9 */
|
|
- {0x00, "<unknown>", 0xffffffff} /* ch 1-32 */
|
|
+ { 0x10, "FCC (USA)", 0x7ff }, /* ch 1-11 */
|
|
+ { 0x20, "IC (Canada)", 0x7ff }, /* ch 1-11 */
|
|
+ { 0x30, "ETSI (most of Europe)", 0x1fff }, /* ch 1-13 */
|
|
+ { 0x31, "Spain", 0x600 }, /* ch 10-11 */
|
|
+ { 0x32, "France", 0x1e00 }, /* ch 10-13 */
|
|
+ { 0x40, "MKK (Japan)", 0x2000 }, /* ch 14 */
|
|
+ { 0x41, "MKK1 (Japan)", 0x3fff }, /* ch 1-14 */
|
|
+ { 0x50, "Israel", 0x3fc }, /* ch 3-9 */
|
|
+ { 0x00, "<unknown>", 0xffffffff } /* ch 1-32 */
|
|
};
|
|
|
|
/* Last entry is fallback for unknown domain code */
|
|
@@ -784,7 +731,7 @@
|
|
ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x22,
|
|
USB_TYPE_VENDOR | USB_DIR_IN |
|
|
USB_RECIP_INTERFACE, cmd, 0, stat_buf,
|
|
- 40, USB_CTRL_GET_TIMEOUT);
|
|
+ sizeof(stat_buf), USB_CTRL_GET_TIMEOUT);
|
|
if (ret >= 0)
|
|
ret = stat_buf[5];
|
|
kfree(stat_buf);
|
|
@@ -792,6 +739,24 @@
|
|
return ret;
|
|
}
|
|
|
|
+#define MAKE_CMD_CASE(c) case (c): return #c
|
|
+
|
|
+static const char *at76_get_cmd_string(u8 cmd_status)
|
|
+{
|
|
+ switch (cmd_status) {
|
|
+ MAKE_CMD_CASE(CMD_SET_MIB);
|
|
+ MAKE_CMD_CASE(CMD_GET_MIB);
|
|
+ MAKE_CMD_CASE(CMD_SCAN);
|
|
+ MAKE_CMD_CASE(CMD_JOIN);
|
|
+ MAKE_CMD_CASE(CMD_START_IBSS);
|
|
+ MAKE_CMD_CASE(CMD_RADIO_ON);
|
|
+ MAKE_CMD_CASE(CMD_RADIO_OFF);
|
|
+ MAKE_CMD_CASE(CMD_STARTUP);
|
|
+ }
|
|
+
|
|
+ return "UNKNOWN";
|
|
+}
|
|
+
|
|
static int at76_set_card_command(struct usb_device *udev, u8 cmd, void *buf,
|
|
int buf_size)
|
|
{
|
|
@@ -807,6 +772,10 @@
|
|
cmd_buf->size = cpu_to_le16(buf_size);
|
|
memcpy(cmd_buf->data, buf, buf_size);
|
|
|
|
+ at76_dbg_dump(DBG_CMD, cmd_buf, sizeof(struct at76_command) + buf_size,
|
|
+ "issuing command %s (0x%02x)",
|
|
+ at76_get_cmd_string(cmd), cmd);
|
|
+
|
|
ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x0e,
|
|
USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
|
|
0, 0, cmd_buf,
|
|
@@ -844,13 +813,13 @@
|
|
status = at76_get_cmd_status(priv->udev, cmd);
|
|
if (status < 0) {
|
|
printk(KERN_ERR "%s: at76_get_cmd_status failed: %d\n",
|
|
- priv->netdev->name, status);
|
|
+ wiphy_name(priv->hw->wiphy), status);
|
|
break;
|
|
}
|
|
|
|
at76_dbg(DBG_WAIT_COMPLETE,
|
|
"%s: Waiting on cmd %d, status = %d (%s)",
|
|
- priv->netdev->name, cmd, status,
|
|
+ wiphy_name(priv->hw->wiphy), cmd, status,
|
|
at76_get_cmd_status_string(status));
|
|
|
|
if (status != CMD_STATUS_IN_PROGRESS
|
|
@@ -861,7 +830,7 @@
|
|
if (time_after(jiffies, timeout)) {
|
|
printk(KERN_ERR
|
|
"%s: completion timeout for command %d\n",
|
|
- priv->netdev->name, cmd);
|
|
+ wiphy_name(priv->hw->wiphy), cmd);
|
|
status = -ETIMEDOUT;
|
|
break;
|
|
}
|
|
@@ -884,7 +853,7 @@
|
|
if (ret != CMD_STATUS_COMPLETE) {
|
|
printk(KERN_INFO
|
|
"%s: set_mib: at76_wait_completion failed "
|
|
- "with %d\n", priv->netdev->name, ret);
|
|
+ "with %d\n", wiphy_name(priv->hw->wiphy), ret);
|
|
ret = -EIO;
|
|
}
|
|
|
|
@@ -905,7 +874,7 @@
|
|
ret = at76_set_card_command(priv->udev, cmd, NULL, 0);
|
|
if (ret < 0)
|
|
printk(KERN_ERR "%s: at76_set_card_command(%d) failed: %d\n",
|
|
- priv->netdev->name, cmd, ret);
|
|
+ wiphy_name(priv->hw->wiphy), cmd, ret);
|
|
else
|
|
ret = 1;
|
|
|
|
@@ -926,44 +895,7 @@
|
|
ret = at76_set_mib(priv, &priv->mib_buf);
|
|
if (ret < 0)
|
|
printk(KERN_ERR "%s: set_mib (pm_mode) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-/* Set the association id for power save mode */
|
|
-static int at76_set_associd(struct at76_priv *priv, u16 id)
|
|
-{
|
|
- int ret = 0;
|
|
-
|
|
- priv->mib_buf.type = MIB_MAC_MGMT;
|
|
- priv->mib_buf.size = 2;
|
|
- priv->mib_buf.index = offsetof(struct mib_mac_mgmt, station_id);
|
|
- priv->mib_buf.data.word = cpu_to_le16(id);
|
|
-
|
|
- ret = at76_set_mib(priv, &priv->mib_buf);
|
|
- if (ret < 0)
|
|
- printk(KERN_ERR "%s: set_mib (associd) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-/* Set the listen interval for power save mode */
|
|
-static int at76_set_listen_interval(struct at76_priv *priv, u16 interval)
|
|
-{
|
|
- int ret = 0;
|
|
-
|
|
- priv->mib_buf.type = MIB_MAC;
|
|
- priv->mib_buf.size = 2;
|
|
- priv->mib_buf.index = offsetof(struct mib_mac, listen_interval);
|
|
- priv->mib_buf.data.word = cpu_to_le16(interval);
|
|
-
|
|
- ret = at76_set_mib(priv, &priv->mib_buf);
|
|
- if (ret < 0)
|
|
- printk(KERN_ERR
|
|
- "%s: set_mib (listen_interval) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
|
|
return ret;
|
|
}
|
|
@@ -980,7 +912,7 @@
|
|
ret = at76_set_mib(priv, &priv->mib_buf);
|
|
if (ret < 0)
|
|
printk(KERN_ERR "%s: set_mib (preamble) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
|
|
return ret;
|
|
}
|
|
@@ -997,7 +929,7 @@
|
|
ret = at76_set_mib(priv, &priv->mib_buf);
|
|
if (ret < 0)
|
|
printk(KERN_ERR "%s: set_mib (frag threshold) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
|
|
return ret;
|
|
}
|
|
@@ -1014,7 +946,7 @@
|
|
ret = at76_set_mib(priv, &priv->mib_buf);
|
|
if (ret < 0)
|
|
printk(KERN_ERR "%s: set_mib (rts) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
|
|
return ret;
|
|
}
|
|
@@ -1031,24 +963,41 @@
|
|
ret = at76_set_mib(priv, &priv->mib_buf);
|
|
if (ret < 0)
|
|
printk(KERN_ERR "%s: set_mib (autorate fallback) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
|
|
return ret;
|
|
}
|
|
|
|
-static int at76_add_mac_address(struct at76_priv *priv, void *addr)
|
|
+static int at76_set_tkip_bssid(struct at76_priv *priv, const void *addr)
|
|
{
|
|
int ret = 0;
|
|
|
|
- priv->mib_buf.type = MIB_MAC_ADDR;
|
|
+ priv->mib_buf.type = MIB_MAC_ENCRYPTION;
|
|
priv->mib_buf.size = ETH_ALEN;
|
|
- priv->mib_buf.index = offsetof(struct mib_mac_addr, mac_addr);
|
|
+ priv->mib_buf.index = offsetof(struct mib_mac_encryption, tkip_bssid);
|
|
memcpy(priv->mib_buf.data.addr, addr, ETH_ALEN);
|
|
|
|
ret = at76_set_mib(priv, &priv->mib_buf);
|
|
if (ret < 0)
|
|
- printk(KERN_ERR "%s: set_mib (MAC_ADDR, mac_addr) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ printk(KERN_ERR "%s: set_mib (MAC_ENCRYPTION, tkip_bssid) failed: %d\n",
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int at76_reset_rsc(struct at76_priv *priv)
|
|
+{
|
|
+ int ret = 0;
|
|
+
|
|
+ priv->mib_buf.type = MIB_MAC_ENCRYPTION;
|
|
+ priv->mib_buf.size = 4 * 8;
|
|
+ priv->mib_buf.index = offsetof(struct mib_mac_encryption, key_rsc);
|
|
+ memset(priv->mib_buf.data.data, 0 , priv->mib_buf.size);
|
|
+
|
|
+ ret = at76_set_mib(priv, &priv->mib_buf);
|
|
+ if (ret < 0)
|
|
+ printk(KERN_ERR "%s: set_mib (MAC_ENCRYPTION, key_rsc) failed: %d\n",
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
|
|
return ret;
|
|
}
|
|
@@ -1067,16 +1016,16 @@
|
|
sizeof(struct mib_mac_addr));
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "%s: at76_get_mib (MAC_ADDR) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
goto exit;
|
|
}
|
|
|
|
at76_dbg(DBG_MIB, "%s: MIB MAC_ADDR: mac_addr %s res 0x%x 0x%x",
|
|
- priv->netdev->name,
|
|
+ wiphy_name(priv->hw->wiphy),
|
|
mac2str(m->mac_addr), m->res[0], m->res[1]);
|
|
for (i = 0; i < ARRAY_SIZE(m->group_addr); i++)
|
|
at76_dbg(DBG_MIB, "%s: MIB MAC_ADDR: group addr %d: %s, "
|
|
- "status %d", priv->netdev->name, i,
|
|
+ "status %d", wiphy_name(priv->hw->wiphy), i,
|
|
mac2str(m->group_addr[i]), m->group_addr_status[i]);
|
|
exit:
|
|
kfree(m);
|
|
@@ -1096,13 +1045,13 @@
|
|
sizeof(struct mib_mac_wep));
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "%s: at76_get_mib (MAC_WEP) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
goto exit;
|
|
}
|
|
|
|
at76_dbg(DBG_MIB, "%s: MIB MAC_WEP: priv_invoked %u def_key_id %u "
|
|
"key_len %u excl_unencr %u wep_icv_err %u wep_excluded %u "
|
|
- "encr_level %u key %d", priv->netdev->name,
|
|
+ "encr_level %u key %d", wiphy_name(priv->hw->wiphy),
|
|
m->privacy_invoked, m->wep_default_key_id,
|
|
m->wep_key_mapping_len, m->exclude_unencrypted,
|
|
le32_to_cpu(m->wep_icv_error_count),
|
|
@@ -1114,12 +1063,55 @@
|
|
|
|
for (i = 0; i < WEP_KEYS; i++)
|
|
at76_dbg(DBG_MIB, "%s: MIB MAC_WEP: key %d: %s",
|
|
- priv->netdev->name, i,
|
|
+ wiphy_name(priv->hw->wiphy), i,
|
|
hex2str(m->wep_default_keyvalue[i], key_len));
|
|
exit:
|
|
kfree(m);
|
|
}
|
|
|
|
+static void at76_dump_mib_mac_encryption(struct at76_priv *priv)
|
|
+{
|
|
+ int i;
|
|
+ int ret;
|
|
+ /*int key_len;*/
|
|
+ struct mib_mac_encryption *m;
|
|
+
|
|
+ m = kmalloc(sizeof(struct mib_mac_encryption), GFP_KERNEL);
|
|
+ if (!m)
|
|
+ return;
|
|
+
|
|
+ ret = at76_get_mib(priv->udev, MIB_MAC_ENCRYPTION, m,
|
|
+ sizeof(struct mib_mac_encryption));
|
|
+ if (ret < 0) {
|
|
+ dev_err(&priv->udev->dev,
|
|
+ "%s: at76_get_mib (MAC_ENCRYPTION) failed: %d\n",
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
+ goto exit;
|
|
+ }
|
|
+
|
|
+ at76_dbg(DBG_MIB,
|
|
+ "%s: MIB MAC_ENCRYPTION: tkip_bssid %s priv_invoked %u "
|
|
+ "ciph_key_id %u grp_key_id %u excl_unencr %u "
|
|
+ "ckip_key_perm %u wep_icv_err %u wep_excluded %u",
|
|
+ wiphy_name(priv->hw->wiphy), mac2str(m->tkip_bssid),
|
|
+ m->privacy_invoked, m->cipher_default_key_id,
|
|
+ m->cipher_default_group_key_id, m->exclude_unencrypted,
|
|
+ m->ckip_key_permutation,
|
|
+ le32_to_cpu(m->wep_icv_error_count),
|
|
+ le32_to_cpu(m->wep_excluded_count));
|
|
+
|
|
+ /*key_len = (m->encryption_level == 1) ?
|
|
+ WEP_SMALL_KEY_LEN : WEP_LARGE_KEY_LEN;*/
|
|
+
|
|
+ for (i = 0; i < CIPHER_KEYS; i++)
|
|
+ at76_dbg(DBG_MIB, "%s: MIB MAC_ENCRYPTION: key %d: %s",
|
|
+ wiphy_name(priv->hw->wiphy), i,
|
|
+ hex2str(m->cipher_default_keyvalue[i],
|
|
+ CIPHER_KEY_LEN));
|
|
+exit:
|
|
+ kfree(m);
|
|
+}
|
|
+
|
|
static void at76_dump_mib_mac_mgmt(struct at76_priv *priv)
|
|
{
|
|
int ret;
|
|
@@ -1133,7 +1125,7 @@
|
|
sizeof(struct mib_mac_mgmt));
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "%s: at76_get_mib (MAC_MGMT) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
goto exit;
|
|
}
|
|
|
|
@@ -1144,7 +1136,7 @@
|
|
"pm_mode %d ibss_change %d res %d "
|
|
"multi_domain_capability_implemented %d "
|
|
"international_roaming %d country_string %.3s",
|
|
- priv->netdev->name, le16_to_cpu(m->beacon_period),
|
|
+ wiphy_name(priv->hw->wiphy), le16_to_cpu(m->beacon_period),
|
|
le16_to_cpu(m->CFP_max_duration),
|
|
le16_to_cpu(m->medium_occupancy_limit),
|
|
le16_to_cpu(m->station_id), le16_to_cpu(m->ATIM_window),
|
|
@@ -1169,7 +1161,7 @@
|
|
ret = at76_get_mib(priv->udev, MIB_MAC, m, sizeof(struct mib_mac));
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "%s: at76_get_mib (MAC) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
goto exit;
|
|
}
|
|
|
|
@@ -1179,7 +1171,8 @@
|
|
"scan_type %d scan_channel %d probe_delay %u "
|
|
"min_channel_time %d max_channel_time %d listen_int %d "
|
|
"desired_ssid %s desired_bssid %s desired_bsstype %d",
|
|
- priv->netdev->name, le32_to_cpu(m->max_tx_msdu_lifetime),
|
|
+ wiphy_name(priv->hw->wiphy),
|
|
+ le32_to_cpu(m->max_tx_msdu_lifetime),
|
|
le32_to_cpu(m->max_rx_lifetime),
|
|
le16_to_cpu(m->frag_threshold), le16_to_cpu(m->rts_threshold),
|
|
le16_to_cpu(m->cwmin), le16_to_cpu(m->cwmax),
|
|
@@ -1205,7 +1198,7 @@
|
|
ret = at76_get_mib(priv->udev, MIB_PHY, m, sizeof(struct mib_phy));
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "%s: at76_get_mib (PHY) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
goto exit;
|
|
}
|
|
|
|
@@ -1214,7 +1207,7 @@
|
|
"mpdu_max_length %d cca_mode_supported %d operation_rate_set "
|
|
"0x%x 0x%x 0x%x 0x%x channel_id %d current_cca_mode %d "
|
|
"phy_type %d current_reg_domain %d",
|
|
- priv->netdev->name, le32_to_cpu(m->ed_threshold),
|
|
+ wiphy_name(priv->hw->wiphy), le32_to_cpu(m->ed_threshold),
|
|
le16_to_cpu(m->slot_time), le16_to_cpu(m->sifs_time),
|
|
le16_to_cpu(m->preamble_length),
|
|
le16_to_cpu(m->plcp_header_length),
|
|
@@ -1238,13 +1231,14 @@
|
|
ret = at76_get_mib(priv->udev, MIB_LOCAL, m, sizeof(struct mib_local));
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "%s: at76_get_mib (LOCAL) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
goto exit;
|
|
}
|
|
|
|
at76_dbg(DBG_MIB, "%s: MIB LOCAL: beacon_enable %d "
|
|
"txautorate_fallback %d ssid_size %d promiscuous_mode %d "
|
|
- "preamble_type %d", priv->netdev->name, m->beacon_enable,
|
|
+ "preamble_type %d", wiphy_name(priv->hw->wiphy),
|
|
+ m->beacon_enable,
|
|
m->txautorate_fallback, m->ssid_size, m->promiscuous_mode,
|
|
m->preamble_type);
|
|
exit:
|
|
@@ -1263,118 +1257,21 @@
|
|
sizeof(struct mib_mdomain));
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "%s: at76_get_mib (MDOMAIN) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
goto exit;
|
|
}
|
|
|
|
at76_dbg(DBG_MIB, "%s: MIB MDOMAIN: channel_list %s",
|
|
- priv->netdev->name,
|
|
+ wiphy_name(priv->hw->wiphy),
|
|
hex2str(m->channel_list, sizeof(m->channel_list)));
|
|
|
|
at76_dbg(DBG_MIB, "%s: MIB MDOMAIN: tx_powerlevel %s",
|
|
- priv->netdev->name,
|
|
+ wiphy_name(priv->hw->wiphy),
|
|
hex2str(m->tx_powerlevel, sizeof(m->tx_powerlevel)));
|
|
exit:
|
|
kfree(m);
|
|
}
|
|
|
|
-static int at76_get_current_bssid(struct at76_priv *priv)
|
|
-{
|
|
- int ret = 0;
|
|
- struct mib_mac_mgmt *mac_mgmt =
|
|
- kmalloc(sizeof(struct mib_mac_mgmt), GFP_KERNEL);
|
|
-
|
|
- if (!mac_mgmt) {
|
|
- ret = -ENOMEM;
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- ret = at76_get_mib(priv->udev, MIB_MAC_MGMT, mac_mgmt,
|
|
- sizeof(struct mib_mac_mgmt));
|
|
- if (ret < 0) {
|
|
- printk(KERN_ERR "%s: at76_get_mib failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
- goto error;
|
|
- }
|
|
- memcpy(priv->bssid, mac_mgmt->current_bssid, ETH_ALEN);
|
|
- printk(KERN_INFO "%s: using BSSID %s\n", priv->netdev->name,
|
|
- mac2str(priv->bssid));
|
|
-error:
|
|
- kfree(mac_mgmt);
|
|
-exit:
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_get_current_channel(struct at76_priv *priv)
|
|
-{
|
|
- int ret = 0;
|
|
- struct mib_phy *phy = kmalloc(sizeof(struct mib_phy), GFP_KERNEL);
|
|
-
|
|
- if (!phy) {
|
|
- ret = -ENOMEM;
|
|
- goto exit;
|
|
- }
|
|
- ret = at76_get_mib(priv->udev, MIB_PHY, phy, sizeof(struct mib_phy));
|
|
- if (ret < 0) {
|
|
- printk(KERN_ERR "%s: at76_get_mib(MIB_PHY) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
- goto error;
|
|
- }
|
|
- priv->channel = phy->channel_id;
|
|
-error:
|
|
- kfree(phy);
|
|
-exit:
|
|
- return ret;
|
|
-}
|
|
-
|
|
-/**
|
|
- * at76_start_scan - start a scan
|
|
- *
|
|
- * @use_essid - use the configured ESSID in non passive mode
|
|
- */
|
|
-static int at76_start_scan(struct at76_priv *priv, int use_essid)
|
|
-{
|
|
- struct at76_req_scan scan;
|
|
-
|
|
- memset(&scan, 0, sizeof(struct at76_req_scan));
|
|
- memset(scan.bssid, 0xff, ETH_ALEN);
|
|
-
|
|
- if (use_essid) {
|
|
- memcpy(scan.essid, priv->essid, IW_ESSID_MAX_SIZE);
|
|
- scan.essid_size = priv->essid_size;
|
|
- } else
|
|
- scan.essid_size = 0;
|
|
-
|
|
- /* jal: why should we start at a certain channel? we do scan the whole
|
|
- range allowed by reg domain. */
|
|
- scan.channel = priv->channel;
|
|
-
|
|
- /* atmelwlandriver differs between scan type 0 and 1 (active/passive)
|
|
- For ad-hoc mode, it uses type 0 only. */
|
|
- scan.scan_type = priv->scan_mode;
|
|
-
|
|
- /* INFO: For probe_delay, not multiplying by 1024 as this will be
|
|
- slightly less than min_channel_time
|
|
- (per spec: probe delay < min. channel time) */
|
|
- scan.min_channel_time = cpu_to_le16(priv->scan_min_time);
|
|
- scan.max_channel_time = cpu_to_le16(priv->scan_max_time);
|
|
- scan.probe_delay = cpu_to_le16(priv->scan_min_time * 1000);
|
|
- scan.international_scan = 0;
|
|
-
|
|
- /* other values are set to 0 for type 0 */
|
|
-
|
|
- at76_dbg(DBG_PROGRESS, "%s: start_scan (use_essid = %d, intl = %d, "
|
|
- "channel = %d, probe_delay = %d, scan_min_time = %d, "
|
|
- "scan_max_time = %d)",
|
|
- priv->netdev->name, use_essid,
|
|
- scan.international_scan, scan.channel,
|
|
- le16_to_cpu(scan.probe_delay),
|
|
- le16_to_cpu(scan.min_channel_time),
|
|
- le16_to_cpu(scan.max_channel_time));
|
|
-
|
|
- return at76_set_card_command(priv->udev, CMD_SCAN, &scan, sizeof(scan));
|
|
-}
|
|
-
|
|
/* Enable monitor mode */
|
|
static int at76_start_monitor(struct at76_priv *priv)
|
|
{
|
|
@@ -1395,86 +1292,6 @@
|
|
return ret;
|
|
}
|
|
|
|
-static int at76_start_ibss(struct at76_priv *priv)
|
|
-{
|
|
- struct at76_req_ibss bss;
|
|
- int ret;
|
|
-
|
|
- WARN_ON(priv->mac_state != MAC_OWN_IBSS);
|
|
- if (priv->mac_state != MAC_OWN_IBSS)
|
|
- return -EBUSY;
|
|
-
|
|
- memset(&bss, 0, sizeof(struct at76_req_ibss));
|
|
- memset(bss.bssid, 0xff, ETH_ALEN);
|
|
- memcpy(bss.essid, priv->essid, IW_ESSID_MAX_SIZE);
|
|
- bss.essid_size = priv->essid_size;
|
|
- bss.bss_type = ADHOC_MODE;
|
|
- bss.channel = priv->channel;
|
|
-
|
|
- ret = at76_set_card_command(priv->udev, CMD_START_IBSS, &bss,
|
|
- sizeof(struct at76_req_ibss));
|
|
- if (ret < 0) {
|
|
- printk(KERN_ERR "%s: start_ibss failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
- return ret;
|
|
- }
|
|
-
|
|
- ret = at76_wait_completion(priv, CMD_START_IBSS);
|
|
- if (ret != CMD_STATUS_COMPLETE) {
|
|
- printk(KERN_ERR "%s: start_ibss failed to complete, %d\n",
|
|
- priv->netdev->name, ret);
|
|
- return ret;
|
|
- }
|
|
-
|
|
- ret = at76_get_current_bssid(priv);
|
|
- if (ret < 0)
|
|
- return ret;
|
|
-
|
|
- ret = at76_get_current_channel(priv);
|
|
- if (ret < 0)
|
|
- return ret;
|
|
-
|
|
- /* not sure what this is good for ??? */
|
|
- priv->mib_buf.type = MIB_MAC_MGMT;
|
|
- priv->mib_buf.size = 1;
|
|
- priv->mib_buf.index = offsetof(struct mib_mac_mgmt, ibss_change);
|
|
- priv->mib_buf.data.byte = 0;
|
|
-
|
|
- ret = at76_set_mib(priv, &priv->mib_buf);
|
|
- if (ret < 0) {
|
|
- printk(KERN_ERR "%s: set_mib (ibss change ok) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
- return ret;
|
|
- }
|
|
-
|
|
- netif_carrier_on(priv->netdev);
|
|
- netif_start_queue(priv->netdev);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/* Request card to join BSS in managed or ad-hoc mode */
|
|
-static int at76_join_bss(struct at76_priv *priv, struct bss_info *ptr)
|
|
-{
|
|
- struct at76_req_join join;
|
|
-
|
|
- BUG_ON(!ptr);
|
|
-
|
|
- memset(&join, 0, sizeof(struct at76_req_join));
|
|
- memcpy(join.bssid, ptr->bssid, ETH_ALEN);
|
|
- memcpy(join.essid, ptr->ssid, ptr->ssid_len);
|
|
- join.essid_size = ptr->ssid_len;
|
|
- join.bss_type = (priv->iw_mode == IW_MODE_ADHOC ? 1 : 2);
|
|
- join.channel = ptr->channel;
|
|
- join.timeout = cpu_to_le16(2000);
|
|
-
|
|
- at76_dbg(DBG_PROGRESS,
|
|
- "%s join addr %s ssid %s type %d ch %d timeout %d",
|
|
- priv->netdev->name, mac2str(join.bssid), join.essid,
|
|
- join.bss_type, join.channel, le16_to_cpu(join.timeout));
|
|
- return at76_set_card_command(priv->udev, CMD_JOIN, &join,
|
|
- sizeof(struct at76_req_join));
|
|
-}
|
|
-
|
|
/* Calculate padding from txbuf->wlength (which excludes the USB TX header),
|
|
likely to compensate a flaw in the AT76C503A USB part ... */
|
|
static inline int at76_calc_padding(int wlen)
|
|
@@ -1493,14 +1310,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-/* We are doing a lot of things here in an interrupt. Need
|
|
- a bh handler (Watching TV with a TV card is probably
|
|
- a good test: if you see flickers, we are doing too much.
|
|
- Currently I do see flickers... even with our tasklet :-( )
|
|
- Maybe because the bttv driver and usb-uhci use the same interrupt
|
|
-*/
|
|
-/* Or maybe because our BH handler is preempting bttv's BH handler.. BHs don't
|
|
- * solve everything.. (alex) */
|
|
static void at76_rx_callback(struct urb *urb)
|
|
{
|
|
struct at76_priv *priv = urb->context;
|
|
@@ -1510,1914 +1319,70 @@
|
|
return;
|
|
}
|
|
|
|
-static void at76_tx_callback(struct urb *urb)
|
|
+static int at76_submit_rx_urb(struct at76_priv *priv)
|
|
{
|
|
- struct at76_priv *priv = urb->context;
|
|
- struct net_device_stats *stats = &priv->stats;
|
|
- unsigned long flags;
|
|
- struct at76_tx_buffer *mgmt_buf;
|
|
int ret;
|
|
+ int size;
|
|
+ struct sk_buff *skb = priv->rx_skb;
|
|
|
|
- switch (urb->status) {
|
|
- case 0:
|
|
- stats->tx_packets++;
|
|
- break;
|
|
- case -ENOENT:
|
|
- case -ECONNRESET:
|
|
- /* urb has been unlinked */
|
|
- return;
|
|
- default:
|
|
- at76_dbg(DBG_URB, "%s - nonzero tx status received: %d",
|
|
- __func__, urb->status);
|
|
- stats->tx_errors++;
|
|
- break;
|
|
+ if (!priv->rx_urb) {
|
|
+ printk(KERN_ERR "%s: %s: priv->rx_urb is NULL\n",
|
|
+ wiphy_name(priv->hw->wiphy), __func__);
|
|
+ return -EFAULT;
|
|
}
|
|
|
|
- spin_lock_irqsave(&priv->mgmt_spinlock, flags);
|
|
- mgmt_buf = priv->next_mgmt_bulk;
|
|
- priv->next_mgmt_bulk = NULL;
|
|
- spin_unlock_irqrestore(&priv->mgmt_spinlock, flags);
|
|
+ if (!skb) {
|
|
+ skb = dev_alloc_skb(sizeof(struct at76_rx_buffer));
|
|
+ if (!skb) {
|
|
+ printk(KERN_ERR "%s: cannot allocate rx skbuff\n",
|
|
+ wiphy_name(priv->hw->wiphy));
|
|
+ ret = -ENOMEM;
|
|
+ goto exit;
|
|
+ }
|
|
+ priv->rx_skb = skb;
|
|
+ } else {
|
|
+ skb_push(skb, skb_headroom(skb));
|
|
+ skb_trim(skb, 0);
|
|
+ }
|
|
|
|
- if (!mgmt_buf) {
|
|
- netif_wake_queue(priv->netdev);
|
|
- return;
|
|
+ size = skb_tailroom(skb);
|
|
+ usb_fill_bulk_urb(priv->rx_urb, priv->udev, priv->rx_pipe,
|
|
+ skb_put(skb, size), size, at76_rx_callback, priv);
|
|
+ ret = usb_submit_urb(priv->rx_urb, GFP_ATOMIC);
|
|
+ if (ret < 0) {
|
|
+ if (ret == -ENODEV)
|
|
+ at76_dbg(DBG_DEVSTART,
|
|
+ "usb_submit_urb returned -ENODEV");
|
|
+ else
|
|
+ printk(KERN_ERR "%s: rx, usb_submit_urb failed: %d\n",
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
}
|
|
|
|
- /* we don't copy the padding bytes, but add them
|
|
- to the length */
|
|
- memcpy(priv->bulk_out_buffer, mgmt_buf,
|
|
- le16_to_cpu(mgmt_buf->wlength) + AT76_TX_HDRLEN);
|
|
- usb_fill_bulk_urb(priv->tx_urb, priv->udev, priv->tx_pipe,
|
|
- priv->bulk_out_buffer,
|
|
- le16_to_cpu(mgmt_buf->wlength) + mgmt_buf->padding +
|
|
- AT76_TX_HDRLEN, at76_tx_callback, priv);
|
|
- ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
|
|
- if (ret)
|
|
- printk(KERN_ERR "%s: error in tx submit urb: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+exit:
|
|
+ if (ret < 0 && ret != -ENODEV)
|
|
+ printk(KERN_ERR "%s: cannot submit rx urb - please unload the "
|
|
+ "driver and/or power cycle the device\n",
|
|
+ wiphy_name(priv->hw->wiphy));
|
|
|
|
- kfree(mgmt_buf);
|
|
+ return ret;
|
|
}
|
|
|
|
-/* Send a management frame on bulk-out. txbuf->wlength must be set */
|
|
-static int at76_tx_mgmt(struct at76_priv *priv, struct at76_tx_buffer *txbuf)
|
|
+/* Download external firmware */
|
|
+static int at76_load_external_fw(struct usb_device *udev, struct fwentry *fwe)
|
|
{
|
|
- unsigned long flags;
|
|
int ret;
|
|
- int urb_status;
|
|
- void *oldbuf = NULL;
|
|
-
|
|
- netif_carrier_off(priv->netdev); /* stop netdev watchdog */
|
|
- netif_stop_queue(priv->netdev); /* stop tx data packets */
|
|
+ int op_mode;
|
|
+ int blockno = 0;
|
|
+ int bsize;
|
|
+ u8 *block;
|
|
+ u8 *buf = fwe->extfw;
|
|
+ int size = fwe->extfw_size;
|
|
|
|
- spin_lock_irqsave(&priv->mgmt_spinlock, flags);
|
|
+ if (!buf || !size)
|
|
+ return -ENOENT;
|
|
|
|
- urb_status = priv->tx_urb->status;
|
|
- if (urb_status == -EINPROGRESS) {
|
|
- /* cannot transmit now, put in the queue */
|
|
- oldbuf = priv->next_mgmt_bulk;
|
|
- priv->next_mgmt_bulk = txbuf;
|
|
- }
|
|
- spin_unlock_irqrestore(&priv->mgmt_spinlock, flags);
|
|
-
|
|
- if (oldbuf) {
|
|
- /* a data/mgmt tx is already pending in the URB -
|
|
- if this is no error in some situations we must
|
|
- implement a queue or silently modify the old msg */
|
|
- printk(KERN_ERR "%s: removed pending mgmt buffer %s\n",
|
|
- priv->netdev->name, hex2str(oldbuf, 64));
|
|
- kfree(oldbuf);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- txbuf->tx_rate = TX_RATE_1MBIT;
|
|
- txbuf->padding = at76_calc_padding(le16_to_cpu(txbuf->wlength));
|
|
- memset(txbuf->reserved, 0, sizeof(txbuf->reserved));
|
|
-
|
|
- if (priv->next_mgmt_bulk)
|
|
- printk(KERN_ERR "%s: URB status %d, but mgmt is pending\n",
|
|
- priv->netdev->name, urb_status);
|
|
-
|
|
- at76_dbg(DBG_TX_MGMT,
|
|
- "%s: tx mgmt: wlen %d tx_rate %d pad %d %s",
|
|
- priv->netdev->name, le16_to_cpu(txbuf->wlength),
|
|
- txbuf->tx_rate, txbuf->padding,
|
|
- hex2str(txbuf->packet, le16_to_cpu(txbuf->wlength)));
|
|
-
|
|
- /* txbuf was not consumed above -> send mgmt msg immediately */
|
|
- memcpy(priv->bulk_out_buffer, txbuf,
|
|
- le16_to_cpu(txbuf->wlength) + AT76_TX_HDRLEN);
|
|
- usb_fill_bulk_urb(priv->tx_urb, priv->udev, priv->tx_pipe,
|
|
- priv->bulk_out_buffer,
|
|
- le16_to_cpu(txbuf->wlength) + txbuf->padding +
|
|
- AT76_TX_HDRLEN, at76_tx_callback, priv);
|
|
- ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
|
|
- if (ret)
|
|
- printk(KERN_ERR "%s: error in tx submit urb: %d\n",
|
|
- priv->netdev->name, ret);
|
|
-
|
|
- kfree(txbuf);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-/* Go to the next information element */
|
|
-static inline void next_ie(struct ieee80211_info_element **ie)
|
|
-{
|
|
- *ie = (struct ieee80211_info_element *)(&(*ie)->data[(*ie)->len]);
|
|
-}
|
|
-
|
|
-/* Challenge is the challenge string (in TLV format)
|
|
- we got with seq_nr 2 for shared secret authentication only and
|
|
- send in seq_nr 3 WEP encrypted to prove we have the correct WEP key;
|
|
- otherwise it is NULL */
|
|
-static int at76_auth_req(struct at76_priv *priv, struct bss_info *bss,
|
|
- int seq_nr, struct ieee80211_info_element *challenge)
|
|
-{
|
|
- struct at76_tx_buffer *tx_buffer;
|
|
- struct ieee80211_hdr_3addr *mgmt;
|
|
- struct ieee80211_auth *req;
|
|
- int buf_len = (seq_nr != 3 ? AUTH_FRAME_SIZE :
|
|
- AUTH_FRAME_SIZE + 1 + 1 + challenge->len);
|
|
-
|
|
- BUG_ON(!bss);
|
|
- BUG_ON(seq_nr == 3 && !challenge);
|
|
- tx_buffer = kmalloc(buf_len + MAX_PADDING_SIZE, GFP_ATOMIC);
|
|
- if (!tx_buffer)
|
|
- return -ENOMEM;
|
|
-
|
|
- req = (struct ieee80211_auth *)tx_buffer->packet;
|
|
- mgmt = &req->header;
|
|
-
|
|
- /* make wireless header */
|
|
- /* first auth msg is not encrypted, only the second (seq_nr == 3) */
|
|
- mgmt->frame_ctl =
|
|
- cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH |
|
|
- (seq_nr == 3 ? IEEE80211_FCTL_PROTECTED : 0));
|
|
-
|
|
- mgmt->duration_id = cpu_to_le16(0x8000);
|
|
- memcpy(mgmt->addr1, bss->bssid, ETH_ALEN);
|
|
- memcpy(mgmt->addr2, priv->netdev->dev_addr, ETH_ALEN);
|
|
- memcpy(mgmt->addr3, bss->bssid, ETH_ALEN);
|
|
- mgmt->seq_ctl = cpu_to_le16(0);
|
|
-
|
|
- req->algorithm = cpu_to_le16(priv->auth_mode);
|
|
- req->transaction = cpu_to_le16(seq_nr);
|
|
- req->status = cpu_to_le16(0);
|
|
-
|
|
- if (seq_nr == 3)
|
|
- memcpy(req->info_element, challenge, 1 + 1 + challenge->len);
|
|
-
|
|
- /* init. at76_priv tx header */
|
|
- tx_buffer->wlength = cpu_to_le16(buf_len - AT76_TX_HDRLEN);
|
|
- at76_dbg(DBG_TX_MGMT, "%s: AuthReq bssid %s alg %d seq_nr %d",
|
|
- priv->netdev->name, mac2str(mgmt->addr3),
|
|
- le16_to_cpu(req->algorithm), le16_to_cpu(req->transaction));
|
|
- if (seq_nr == 3)
|
|
- at76_dbg(DBG_TX_MGMT, "%s: AuthReq challenge: %s ...",
|
|
- priv->netdev->name, hex2str(req->info_element, 18));
|
|
-
|
|
- /* either send immediately (if no data tx is pending
|
|
- or put it in pending list */
|
|
- return at76_tx_mgmt(priv, tx_buffer);
|
|
-}
|
|
-
|
|
-static int at76_assoc_req(struct at76_priv *priv, struct bss_info *bss)
|
|
-{
|
|
- struct at76_tx_buffer *tx_buffer;
|
|
- struct ieee80211_hdr_3addr *mgmt;
|
|
- struct ieee80211_assoc_request *req;
|
|
- struct ieee80211_info_element *ie;
|
|
- char *essid;
|
|
- int essid_len;
|
|
- u16 capa;
|
|
-
|
|
- BUG_ON(!bss);
|
|
-
|
|
- tx_buffer = kmalloc(ASSOCREQ_MAX_SIZE + MAX_PADDING_SIZE, GFP_ATOMIC);
|
|
- if (!tx_buffer)
|
|
- return -ENOMEM;
|
|
-
|
|
- req = (struct ieee80211_assoc_request *)tx_buffer->packet;
|
|
- mgmt = &req->header;
|
|
- ie = req->info_element;
|
|
-
|
|
- /* make wireless header */
|
|
- mgmt->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
|
- IEEE80211_STYPE_ASSOC_REQ);
|
|
-
|
|
- mgmt->duration_id = cpu_to_le16(0x8000);
|
|
- memcpy(mgmt->addr1, bss->bssid, ETH_ALEN);
|
|
- memcpy(mgmt->addr2, priv->netdev->dev_addr, ETH_ALEN);
|
|
- memcpy(mgmt->addr3, bss->bssid, ETH_ALEN);
|
|
- mgmt->seq_ctl = cpu_to_le16(0);
|
|
-
|
|
- /* we must set the Privacy bit in the capabilities to assure an
|
|
- Agere-based AP with optional WEP transmits encrypted frames
|
|
- to us. AP only set the Privacy bit in their capabilities
|
|
- if WEP is mandatory in the BSS! */
|
|
- capa = bss->capa;
|
|
- if (priv->wep_enabled)
|
|
- capa |= WLAN_CAPABILITY_PRIVACY;
|
|
- if (priv->preamble_type != PREAMBLE_TYPE_LONG)
|
|
- capa |= WLAN_CAPABILITY_SHORT_PREAMBLE;
|
|
- req->capability = cpu_to_le16(capa);
|
|
-
|
|
- req->listen_interval = cpu_to_le16(2 * bss->beacon_interval);
|
|
-
|
|
- /* write TLV data elements */
|
|
-
|
|
- ie->id = MFIE_TYPE_SSID;
|
|
- ie->len = bss->ssid_len;
|
|
- memcpy(ie->data, bss->ssid, bss->ssid_len);
|
|
- next_ie(&ie);
|
|
-
|
|
- ie->id = MFIE_TYPE_RATES;
|
|
- ie->len = sizeof(hw_rates);
|
|
- memcpy(ie->data, hw_rates, sizeof(hw_rates));
|
|
- next_ie(&ie); /* ie points behind the supp_rates field */
|
|
-
|
|
- /* init. at76_priv tx header */
|
|
- tx_buffer->wlength = cpu_to_le16((u8 *)ie - (u8 *)mgmt);
|
|
-
|
|
- ie = req->info_element;
|
|
- essid = ie->data;
|
|
- essid_len = min_t(int, IW_ESSID_MAX_SIZE, ie->len);
|
|
-
|
|
- next_ie(&ie); /* points to IE of rates now */
|
|
- at76_dbg(DBG_TX_MGMT,
|
|
- "%s: AssocReq bssid %s capa 0x%04x ssid %.*s rates %s",
|
|
- priv->netdev->name, mac2str(mgmt->addr3),
|
|
- le16_to_cpu(req->capability), essid_len, essid,
|
|
- hex2str(ie->data, ie->len));
|
|
-
|
|
- /* either send immediately (if no data tx is pending
|
|
- or put it in pending list */
|
|
- return at76_tx_mgmt(priv, tx_buffer);
|
|
-}
|
|
-
|
|
-/* We got to check the bss_list for old entries */
|
|
-static void at76_bss_list_timeout(unsigned long par)
|
|
-{
|
|
- struct at76_priv *priv = (struct at76_priv *)par;
|
|
- unsigned long flags;
|
|
- struct list_head *lptr, *nptr;
|
|
- struct bss_info *ptr;
|
|
-
|
|
- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
|
|
-
|
|
- list_for_each_safe(lptr, nptr, &priv->bss_list) {
|
|
-
|
|
- ptr = list_entry(lptr, struct bss_info, list);
|
|
-
|
|
- if (ptr != priv->curr_bss
|
|
- && time_after(jiffies, ptr->last_rx + BSS_LIST_TIMEOUT)) {
|
|
- at76_dbg(DBG_BSS_TABLE_RM,
|
|
- "%s: bss_list: removing old BSS %s ch %d",
|
|
- priv->netdev->name, mac2str(ptr->bssid),
|
|
- ptr->channel);
|
|
- list_del(&ptr->list);
|
|
- kfree(ptr);
|
|
- }
|
|
- }
|
|
- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
|
|
- /* restart the timer */
|
|
- mod_timer(&priv->bss_list_timer, jiffies + BSS_LIST_TIMEOUT);
|
|
-}
|
|
-
|
|
-static inline void at76_set_mac_state(struct at76_priv *priv,
|
|
- enum mac_state mac_state)
|
|
-{
|
|
- at76_dbg(DBG_MAC_STATE, "%s state: %s", priv->netdev->name,
|
|
- mac_states[mac_state]);
|
|
- priv->mac_state = mac_state;
|
|
-}
|
|
-
|
|
-static void at76_dump_bss_table(struct at76_priv *priv)
|
|
-{
|
|
- struct bss_info *ptr;
|
|
- unsigned long flags;
|
|
- struct list_head *lptr;
|
|
-
|
|
- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
|
|
-
|
|
- at76_dbg(DBG_BSS_TABLE, "%s BSS table (curr=%p):", priv->netdev->name,
|
|
- priv->curr_bss);
|
|
-
|
|
- list_for_each(lptr, &priv->bss_list) {
|
|
- ptr = list_entry(lptr, struct bss_info, list);
|
|
- at76_dbg(DBG_BSS_TABLE, "0x%p: bssid %s channel %d ssid %.*s "
|
|
- "(%s) capa 0x%04x rates %s rssi %d link %d noise %d",
|
|
- ptr, mac2str(ptr->bssid), ptr->channel, ptr->ssid_len,
|
|
- ptr->ssid, hex2str(ptr->ssid, ptr->ssid_len),
|
|
- ptr->capa, hex2str(ptr->rates, ptr->rates_len),
|
|
- ptr->rssi, ptr->link_qual, ptr->noise_level);
|
|
- }
|
|
- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
|
|
-}
|
|
-
|
|
-/* Called upon successful association to mark interface as connected */
|
|
-static void at76_work_assoc_done(struct work_struct *work)
|
|
-{
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- work_assoc_done);
|
|
-
|
|
- mutex_lock(&priv->mtx);
|
|
-
|
|
- WARN_ON(priv->mac_state != MAC_ASSOC);
|
|
- WARN_ON(!priv->curr_bss);
|
|
- if (priv->mac_state != MAC_ASSOC || !priv->curr_bss)
|
|
- goto exit;
|
|
-
|
|
- if (priv->iw_mode == IW_MODE_INFRA) {
|
|
- if (priv->pm_mode != AT76_PM_OFF) {
|
|
- /* calculate the listen interval in units of
|
|
- beacon intervals of the curr_bss */
|
|
- u32 pm_period_beacon = (priv->pm_period >> 10) /
|
|
- priv->curr_bss->beacon_interval;
|
|
-
|
|
- pm_period_beacon = max(pm_period_beacon, 2u);
|
|
- pm_period_beacon = min(pm_period_beacon, 0xffffu);
|
|
-
|
|
- at76_dbg(DBG_PM,
|
|
- "%s: pm_mode %d assoc id 0x%x listen int %d",
|
|
- priv->netdev->name, priv->pm_mode,
|
|
- priv->assoc_id, pm_period_beacon);
|
|
-
|
|
- at76_set_associd(priv, priv->assoc_id);
|
|
- at76_set_listen_interval(priv, (u16)pm_period_beacon);
|
|
- }
|
|
- schedule_delayed_work(&priv->dwork_beacon, BEACON_TIMEOUT);
|
|
- }
|
|
- at76_set_pm_mode(priv);
|
|
-
|
|
- netif_carrier_on(priv->netdev);
|
|
- netif_wake_queue(priv->netdev);
|
|
- at76_set_mac_state(priv, MAC_CONNECTED);
|
|
- at76_iwevent_bss_connect(priv->netdev, priv->curr_bss->bssid);
|
|
- at76_dbg(DBG_PROGRESS, "%s: connected to BSSID %s",
|
|
- priv->netdev->name, mac2str(priv->curr_bss->bssid));
|
|
-
|
|
-exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
-}
|
|
-
|
|
-/* We only store the new mac address in netdev struct,
|
|
- it gets set when the netdev is opened. */
|
|
-static int at76_set_mac_address(struct net_device *netdev, void *addr)
|
|
-{
|
|
- struct sockaddr *mac = addr;
|
|
- memcpy(netdev->dev_addr, mac->sa_data, ETH_ALEN);
|
|
- return 1;
|
|
-}
|
|
-
|
|
-static struct net_device_stats *at76_get_stats(struct net_device *netdev)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- return &priv->stats;
|
|
-}
|
|
-
|
|
-static struct iw_statistics *at76_get_wireless_stats(struct net_device *netdev)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "RETURN qual %d level %d noise %d updated %d",
|
|
- priv->wstats.qual.qual, priv->wstats.qual.level,
|
|
- priv->wstats.qual.noise, priv->wstats.qual.updated);
|
|
-
|
|
- return &priv->wstats;
|
|
-}
|
|
-
|
|
-static void at76_set_multicast(struct net_device *netdev)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int promisc;
|
|
-
|
|
- promisc = ((netdev->flags & IFF_PROMISC) != 0);
|
|
- if (promisc != priv->promisc) {
|
|
- /* This gets called in interrupt, must reschedule */
|
|
- priv->promisc = promisc;
|
|
- schedule_work(&priv->work_set_promisc);
|
|
- }
|
|
-}
|
|
-
|
|
-/* Stop all network activity, flush all pending tasks */
|
|
-static void at76_quiesce(struct at76_priv *priv)
|
|
-{
|
|
- unsigned long flags;
|
|
-
|
|
- netif_stop_queue(priv->netdev);
|
|
- netif_carrier_off(priv->netdev);
|
|
-
|
|
- at76_set_mac_state(priv, MAC_INIT);
|
|
-
|
|
- cancel_delayed_work(&priv->dwork_get_scan);
|
|
- cancel_delayed_work(&priv->dwork_beacon);
|
|
- cancel_delayed_work(&priv->dwork_auth);
|
|
- cancel_delayed_work(&priv->dwork_assoc);
|
|
- cancel_delayed_work(&priv->dwork_restart);
|
|
-
|
|
- spin_lock_irqsave(&priv->mgmt_spinlock, flags);
|
|
- kfree(priv->next_mgmt_bulk);
|
|
- priv->next_mgmt_bulk = NULL;
|
|
- spin_unlock_irqrestore(&priv->mgmt_spinlock, flags);
|
|
-}
|
|
-
|
|
-/*******************************************************************************
|
|
- * at76_priv implementations of iw_handler functions:
|
|
- */
|
|
-static int at76_iw_handler_commit(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- void *null, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s %s: restarting the device", netdev->name,
|
|
- __func__);
|
|
-
|
|
- if (priv->mac_state != MAC_INIT)
|
|
- at76_quiesce(priv);
|
|
-
|
|
- /* Wait half second before the restart to process subsequent
|
|
- * requests from the same iwconfig in a single restart */
|
|
- schedule_delayed_work(&priv->dwork_restart, HZ / 2);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_name(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- char *name, char *extra)
|
|
-{
|
|
- strcpy(name, "IEEE 802.11b");
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWNAME - name %s", netdev->name, name);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_freq(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_freq *freq, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int chan = -1;
|
|
- int ret = -EIWCOMMIT;
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWFREQ - freq.m %d freq.e %d",
|
|
- netdev->name, freq->m, freq->e);
|
|
-
|
|
- if ((freq->e == 0) && (freq->m <= 1000))
|
|
- /* Setting by channel number */
|
|
- chan = freq->m;
|
|
- else {
|
|
- /* Setting by frequency - search the table */
|
|
- int mult = 1;
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < (6 - freq->e); i++)
|
|
- mult *= 10;
|
|
-
|
|
- for (i = 0; i < NUM_CHANNELS; i++) {
|
|
- if (freq->m == (channel_frequency[i] * mult))
|
|
- chan = i + 1;
|
|
- }
|
|
- }
|
|
-
|
|
- if (chan < 1 || !priv->domain)
|
|
- /* non-positive channels are invalid
|
|
- * we need a domain info to set the channel
|
|
- * either that or an invalid frequency was
|
|
- * provided by the user */
|
|
- ret = -EINVAL;
|
|
- else if (!(priv->domain->channel_map & (1 << (chan - 1)))) {
|
|
- printk(KERN_INFO "%s: channel %d not allowed for domain %s\n",
|
|
- priv->netdev->name, chan, priv->domain->name);
|
|
- ret = -EINVAL;
|
|
- }
|
|
-
|
|
- if (ret == -EIWCOMMIT) {
|
|
- priv->channel = chan;
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWFREQ - ch %d", netdev->name,
|
|
- chan);
|
|
- }
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_freq(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_freq *freq, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- freq->m = priv->channel;
|
|
- freq->e = 0;
|
|
-
|
|
- if (priv->channel)
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWFREQ - freq %ld x 10e%d",
|
|
- netdev->name, channel_frequency[priv->channel - 1], 6);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWFREQ - ch %d", netdev->name,
|
|
- priv->channel);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_mode(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- __u32 *mode, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWMODE - %d", netdev->name, *mode);
|
|
-
|
|
- if ((*mode != IW_MODE_ADHOC) && (*mode != IW_MODE_INFRA) &&
|
|
- (*mode != IW_MODE_MONITOR))
|
|
- return -EINVAL;
|
|
-
|
|
- priv->iw_mode = *mode;
|
|
- if (priv->iw_mode != IW_MODE_INFRA)
|
|
- priv->pm_mode = AT76_PM_OFF;
|
|
-
|
|
- return -EIWCOMMIT;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_mode(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- __u32 *mode, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- *mode = priv->iw_mode;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWMODE - %d", netdev->name, *mode);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_range(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
- /* inspired by atmel.c */
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- struct iw_range *range = (struct iw_range *)extra;
|
|
- int i;
|
|
-
|
|
- data->length = sizeof(struct iw_range);
|
|
- memset(range, 0, sizeof(struct iw_range));
|
|
-
|
|
- /* TODO: range->throughput = xxxxxx; */
|
|
-
|
|
- range->min_nwid = 0x0000;
|
|
- range->max_nwid = 0x0000;
|
|
-
|
|
- /* this driver doesn't maintain sensitivity information */
|
|
- range->sensitivity = 0;
|
|
-
|
|
- range->max_qual.qual = 100;
|
|
- range->max_qual.level = 100;
|
|
- range->max_qual.noise = 0;
|
|
- range->max_qual.updated = IW_QUAL_NOISE_INVALID;
|
|
-
|
|
- range->avg_qual.qual = 50;
|
|
- range->avg_qual.level = 50;
|
|
- range->avg_qual.noise = 0;
|
|
- range->avg_qual.updated = IW_QUAL_NOISE_INVALID;
|
|
-
|
|
- range->bitrate[0] = 1000000;
|
|
- range->bitrate[1] = 2000000;
|
|
- range->bitrate[2] = 5500000;
|
|
- range->bitrate[3] = 11000000;
|
|
- range->num_bitrates = 4;
|
|
-
|
|
- range->min_rts = 0;
|
|
- range->max_rts = MAX_RTS_THRESHOLD;
|
|
-
|
|
- range->min_frag = MIN_FRAG_THRESHOLD;
|
|
- range->max_frag = MAX_FRAG_THRESHOLD;
|
|
-
|
|
- range->pmp_flags = IW_POWER_PERIOD;
|
|
- range->pmt_flags = IW_POWER_ON;
|
|
- range->pm_capa = IW_POWER_PERIOD | IW_POWER_ALL_R;
|
|
-
|
|
- range->encoding_size[0] = WEP_SMALL_KEY_LEN;
|
|
- range->encoding_size[1] = WEP_LARGE_KEY_LEN;
|
|
- range->num_encoding_sizes = 2;
|
|
- range->max_encoding_tokens = WEP_KEYS;
|
|
-
|
|
- /* both WL-240U and Linksys WUSB11 v2.6 specify 15 dBm as output power
|
|
- - take this for all (ignore antenna gains) */
|
|
- range->txpower[0] = 15;
|
|
- range->num_txpower = 1;
|
|
- range->txpower_capa = IW_TXPOW_DBM;
|
|
-
|
|
- range->we_version_source = WIRELESS_EXT;
|
|
- range->we_version_compiled = WIRELESS_EXT;
|
|
-
|
|
- /* same as the values used in atmel.c */
|
|
- range->retry_capa = IW_RETRY_LIMIT;
|
|
- range->retry_flags = IW_RETRY_LIMIT;
|
|
- range->r_time_flags = 0;
|
|
- range->min_retry = 1;
|
|
- range->max_retry = 255;
|
|
-
|
|
- range->num_channels = NUM_CHANNELS;
|
|
- range->num_frequency = 0;
|
|
-
|
|
- for (i = 0; i < NUM_CHANNELS; i++) {
|
|
- /* test if channel map bit is raised */
|
|
- if (priv->domain->channel_map & (0x1 << i)) {
|
|
- range->num_frequency += 1;
|
|
-
|
|
- range->freq[i].i = i + 1;
|
|
- range->freq[i].m = channel_frequency[i] * 100000;
|
|
- range->freq[i].e = 1; /* freq * 10^1 */
|
|
- }
|
|
- }
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWRANGE", netdev->name);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_spy(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = 0;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWSPY - number of addresses %d",
|
|
- netdev->name, data->length);
|
|
-
|
|
- spin_lock_bh(&priv->spy_spinlock);
|
|
- ret = iw_handler_set_spy(priv->netdev, info, (union iwreq_data *)data,
|
|
- extra);
|
|
- spin_unlock_bh(&priv->spy_spinlock);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_spy(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
-
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = 0;
|
|
-
|
|
- spin_lock_bh(&priv->spy_spinlock);
|
|
- ret = iw_handler_get_spy(priv->netdev, info,
|
|
- (union iwreq_data *)data, extra);
|
|
- spin_unlock_bh(&priv->spy_spinlock);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWSPY - number of addresses %d",
|
|
- netdev->name, data->length);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_thrspy(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWTHRSPY - number of addresses %d)",
|
|
- netdev->name, data->length);
|
|
-
|
|
- spin_lock_bh(&priv->spy_spinlock);
|
|
- ret = iw_handler_set_thrspy(netdev, info, (union iwreq_data *)data,
|
|
- extra);
|
|
- spin_unlock_bh(&priv->spy_spinlock);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_thrspy(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret;
|
|
-
|
|
- spin_lock_bh(&priv->spy_spinlock);
|
|
- ret = iw_handler_get_thrspy(netdev, info, (union iwreq_data *)data,
|
|
- extra);
|
|
- spin_unlock_bh(&priv->spy_spinlock);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWTHRSPY - number of addresses %d)",
|
|
- netdev->name, data->length);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_wap(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct sockaddr *ap_addr, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWAP - wap/bssid %s", netdev->name,
|
|
- mac2str(ap_addr->sa_data));
|
|
-
|
|
- /* if the incoming address == ff:ff:ff:ff:ff:ff, the user has
|
|
- chosen any or auto AP preference */
|
|
- if (is_broadcast_ether_addr(ap_addr->sa_data)
|
|
- || is_zero_ether_addr(ap_addr->sa_data))
|
|
- priv->wanted_bssid_valid = 0;
|
|
- else {
|
|
- /* user wants to set a preferred AP address */
|
|
- priv->wanted_bssid_valid = 1;
|
|
- memcpy(priv->wanted_bssid, ap_addr->sa_data, ETH_ALEN);
|
|
- }
|
|
-
|
|
- return -EIWCOMMIT;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_wap(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct sockaddr *ap_addr, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- ap_addr->sa_family = ARPHRD_ETHER;
|
|
- memcpy(ap_addr->sa_data, priv->bssid, ETH_ALEN);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWAP - wap/bssid %s", netdev->name,
|
|
- mac2str(ap_addr->sa_data));
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_scan(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- union iwreq_data *wrqu, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = 0;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWSCAN", netdev->name);
|
|
-
|
|
- if (mutex_lock_interruptible(&priv->mtx))
|
|
- return -EINTR;
|
|
-
|
|
- if (!netif_running(netdev)) {
|
|
- ret = -ENETDOWN;
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- /* jal: we don't allow "iwlist ethX scan" while we are
|
|
- in monitor mode */
|
|
- if (priv->iw_mode == IW_MODE_MONITOR) {
|
|
- ret = -EBUSY;
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- /* Discard old scan results */
|
|
- if ((jiffies - priv->last_scan) > (20 * HZ))
|
|
- priv->scan_state = SCAN_IDLE;
|
|
- priv->last_scan = jiffies;
|
|
-
|
|
- /* Initiate a scan command */
|
|
- if (priv->scan_state == SCAN_IN_PROGRESS) {
|
|
- ret = -EBUSY;
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- priv->scan_state = SCAN_IN_PROGRESS;
|
|
-
|
|
- at76_quiesce(priv);
|
|
-
|
|
- /* Try to do passive or active scan if WE asks as. */
|
|
- if (wrqu->data.length
|
|
- && wrqu->data.length == sizeof(struct iw_scan_req)) {
|
|
- struct iw_scan_req *req = (struct iw_scan_req *)extra;
|
|
-
|
|
- if (req->scan_type == IW_SCAN_TYPE_PASSIVE)
|
|
- priv->scan_mode = SCAN_TYPE_PASSIVE;
|
|
- else if (req->scan_type == IW_SCAN_TYPE_ACTIVE)
|
|
- priv->scan_mode = SCAN_TYPE_ACTIVE;
|
|
-
|
|
- /* Sanity check values? */
|
|
- if (req->min_channel_time > 0)
|
|
- priv->scan_min_time = req->min_channel_time;
|
|
-
|
|
- if (req->max_channel_time > 0)
|
|
- priv->scan_max_time = req->max_channel_time;
|
|
- }
|
|
-
|
|
- /* change to scanning state */
|
|
- at76_set_mac_state(priv, MAC_SCANNING);
|
|
- schedule_work(&priv->work_start_scan);
|
|
-
|
|
-exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_scan(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- unsigned long flags;
|
|
- struct list_head *lptr, *nptr;
|
|
- struct bss_info *curr_bss;
|
|
- struct iw_event *iwe = kmalloc(sizeof(struct iw_event), GFP_KERNEL);
|
|
- char *curr_val, *curr_pos = extra;
|
|
- int i;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWSCAN", netdev->name);
|
|
-
|
|
- if (!iwe)
|
|
- return -ENOMEM;
|
|
-
|
|
- if (priv->scan_state != SCAN_COMPLETED) {
|
|
- /* scan not yet finished */
|
|
- kfree(iwe);
|
|
- return -EAGAIN;
|
|
- }
|
|
-
|
|
- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
|
|
-
|
|
- list_for_each_safe(lptr, nptr, &priv->bss_list) {
|
|
- curr_bss = list_entry(lptr, struct bss_info, list);
|
|
-
|
|
- iwe->cmd = SIOCGIWAP;
|
|
- iwe->u.ap_addr.sa_family = ARPHRD_ETHER;
|
|
- memcpy(iwe->u.ap_addr.sa_data, curr_bss->bssid, 6);
|
|
- curr_pos = iwe_stream_add_event(info, curr_pos,
|
|
- extra + IW_SCAN_MAX_DATA, iwe,
|
|
- IW_EV_ADDR_LEN);
|
|
-
|
|
- iwe->u.data.length = curr_bss->ssid_len;
|
|
- iwe->cmd = SIOCGIWESSID;
|
|
- iwe->u.data.flags = 1;
|
|
-
|
|
- curr_pos = iwe_stream_add_point(info, curr_pos,
|
|
- extra + IW_SCAN_MAX_DATA, iwe,
|
|
- curr_bss->ssid);
|
|
-
|
|
- iwe->cmd = SIOCGIWMODE;
|
|
- iwe->u.mode = (curr_bss->capa & WLAN_CAPABILITY_IBSS) ?
|
|
- IW_MODE_ADHOC :
|
|
- (curr_bss->capa & WLAN_CAPABILITY_ESS) ?
|
|
- IW_MODE_MASTER : IW_MODE_AUTO;
|
|
- /* IW_MODE_AUTO = 0 which I thought is
|
|
- * the most logical value to return in this case */
|
|
- curr_pos = iwe_stream_add_event(info, curr_pos,
|
|
- extra + IW_SCAN_MAX_DATA, iwe,
|
|
- IW_EV_UINT_LEN);
|
|
-
|
|
- iwe->cmd = SIOCGIWFREQ;
|
|
- iwe->u.freq.m = curr_bss->channel;
|
|
- iwe->u.freq.e = 0;
|
|
- curr_pos = iwe_stream_add_event(info, curr_pos,
|
|
- extra + IW_SCAN_MAX_DATA, iwe,
|
|
- IW_EV_FREQ_LEN);
|
|
-
|
|
- iwe->cmd = SIOCGIWENCODE;
|
|
- if (curr_bss->capa & WLAN_CAPABILITY_PRIVACY)
|
|
- iwe->u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
|
|
- else
|
|
- iwe->u.data.flags = IW_ENCODE_DISABLED;
|
|
-
|
|
- iwe->u.data.length = 0;
|
|
- curr_pos = iwe_stream_add_point(info, curr_pos,
|
|
- extra + IW_SCAN_MAX_DATA, iwe,
|
|
- NULL);
|
|
-
|
|
- /* Add quality statistics */
|
|
- iwe->cmd = IWEVQUAL;
|
|
- iwe->u.qual.noise = 0;
|
|
- iwe->u.qual.updated =
|
|
- IW_QUAL_NOISE_INVALID | IW_QUAL_LEVEL_UPDATED;
|
|
- iwe->u.qual.level = (curr_bss->rssi * 100 / 42);
|
|
- if (iwe->u.qual.level > 100)
|
|
- iwe->u.qual.level = 100;
|
|
- if (at76_is_intersil(priv->board_type))
|
|
- iwe->u.qual.qual = curr_bss->link_qual;
|
|
- else {
|
|
- iwe->u.qual.qual = 0;
|
|
- iwe->u.qual.updated |= IW_QUAL_QUAL_INVALID;
|
|
- }
|
|
- /* Add new value to event */
|
|
- curr_pos = iwe_stream_add_event(info, curr_pos,
|
|
- extra + IW_SCAN_MAX_DATA, iwe,
|
|
- IW_EV_QUAL_LEN);
|
|
-
|
|
- /* Rate: stuffing multiple values in a single event requires
|
|
- * a bit more of magic - Jean II */
|
|
- curr_val = curr_pos + IW_EV_LCP_LEN;
|
|
-
|
|
- iwe->cmd = SIOCGIWRATE;
|
|
- /* Those two flags are ignored... */
|
|
- iwe->u.bitrate.fixed = 0;
|
|
- iwe->u.bitrate.disabled = 0;
|
|
- /* Max 8 values */
|
|
- for (i = 0; i < curr_bss->rates_len; i++) {
|
|
- /* Bit rate given in 500 kb/s units (+ 0x80) */
|
|
- iwe->u.bitrate.value =
|
|
- ((curr_bss->rates[i] & 0x7f) * 500000);
|
|
- /* Add new value to event */
|
|
- curr_val = iwe_stream_add_value(info, curr_pos,
|
|
- curr_val,
|
|
- extra +
|
|
- IW_SCAN_MAX_DATA, iwe,
|
|
- IW_EV_PARAM_LEN);
|
|
- }
|
|
-
|
|
- /* Check if we added any event */
|
|
- if ((curr_val - curr_pos) > IW_EV_LCP_LEN)
|
|
- curr_pos = curr_val;
|
|
-
|
|
- /* more information may be sent back using IWECUSTOM */
|
|
-
|
|
- }
|
|
-
|
|
- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
|
|
-
|
|
- data->length = (curr_pos - extra);
|
|
- data->flags = 0;
|
|
-
|
|
- kfree(iwe);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_essid(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWESSID - %s", netdev->name, extra);
|
|
-
|
|
- if (data->flags) {
|
|
- memcpy(priv->essid, extra, data->length);
|
|
- priv->essid_size = data->length;
|
|
- } else
|
|
- priv->essid_size = 0; /* Use any SSID */
|
|
-
|
|
- return -EIWCOMMIT;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_essid(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- if (priv->essid_size) {
|
|
- /* not the ANY ssid in priv->essid */
|
|
- data->flags = 1;
|
|
- data->length = priv->essid_size;
|
|
- memcpy(extra, priv->essid, data->length);
|
|
- } else {
|
|
- /* the ANY ssid was specified */
|
|
- if (priv->mac_state == MAC_CONNECTED && priv->curr_bss) {
|
|
- /* report the SSID we have found */
|
|
- data->flags = 1;
|
|
- data->length = priv->curr_bss->ssid_len;
|
|
- memcpy(extra, priv->curr_bss->ssid, data->length);
|
|
- } else {
|
|
- /* report ANY back */
|
|
- data->flags = 0;
|
|
- data->length = 0;
|
|
- }
|
|
- }
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWESSID - %.*s", netdev->name,
|
|
- data->length, extra);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_rate(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *bitrate, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = -EIWCOMMIT;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWRATE - %d", netdev->name,
|
|
- bitrate->value);
|
|
-
|
|
- switch (bitrate->value) {
|
|
- case -1:
|
|
- priv->txrate = TX_RATE_AUTO;
|
|
- break; /* auto rate */
|
|
- case 1000000:
|
|
- priv->txrate = TX_RATE_1MBIT;
|
|
- break;
|
|
- case 2000000:
|
|
- priv->txrate = TX_RATE_2MBIT;
|
|
- break;
|
|
- case 5500000:
|
|
- priv->txrate = TX_RATE_5_5MBIT;
|
|
- break;
|
|
- case 11000000:
|
|
- priv->txrate = TX_RATE_11MBIT;
|
|
- break;
|
|
- default:
|
|
- ret = -EINVAL;
|
|
- }
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_rate(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *bitrate, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = 0;
|
|
-
|
|
- switch (priv->txrate) {
|
|
- /* return max rate if RATE_AUTO */
|
|
- case TX_RATE_AUTO:
|
|
- bitrate->value = 11000000;
|
|
- break;
|
|
- case TX_RATE_1MBIT:
|
|
- bitrate->value = 1000000;
|
|
- break;
|
|
- case TX_RATE_2MBIT:
|
|
- bitrate->value = 2000000;
|
|
- break;
|
|
- case TX_RATE_5_5MBIT:
|
|
- bitrate->value = 5500000;
|
|
- break;
|
|
- case TX_RATE_11MBIT:
|
|
- bitrate->value = 11000000;
|
|
- break;
|
|
- default:
|
|
- ret = -EINVAL;
|
|
- }
|
|
-
|
|
- bitrate->fixed = (priv->txrate != TX_RATE_AUTO);
|
|
- bitrate->disabled = 0;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWRATE - %d", netdev->name,
|
|
- bitrate->value);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_rts(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *rts, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = -EIWCOMMIT;
|
|
- int rthr = rts->value;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWRTS - value %d disabled %s",
|
|
- netdev->name, rts->value, (rts->disabled) ? "true" : "false");
|
|
-
|
|
- if (rts->disabled)
|
|
- rthr = MAX_RTS_THRESHOLD;
|
|
-
|
|
- if ((rthr < 0) || (rthr > MAX_RTS_THRESHOLD))
|
|
- ret = -EINVAL;
|
|
- else
|
|
- priv->rts_threshold = rthr;
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_rts(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *rts, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- rts->value = priv->rts_threshold;
|
|
- rts->disabled = (rts->value >= MAX_RTS_THRESHOLD);
|
|
- rts->fixed = 1;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWRTS - value %d disabled %s",
|
|
- netdev->name, rts->value, (rts->disabled) ? "true" : "false");
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_frag(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *frag, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = -EIWCOMMIT;
|
|
- int fthr = frag->value;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWFRAG - value %d, disabled %s",
|
|
- netdev->name, frag->value,
|
|
- (frag->disabled) ? "true" : "false");
|
|
-
|
|
- if (frag->disabled)
|
|
- fthr = MAX_FRAG_THRESHOLD;
|
|
-
|
|
- if ((fthr < MIN_FRAG_THRESHOLD) || (fthr > MAX_FRAG_THRESHOLD))
|
|
- ret = -EINVAL;
|
|
- else
|
|
- priv->frag_threshold = fthr & ~0x1; /* get an even value */
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_frag(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *frag, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- frag->value = priv->frag_threshold;
|
|
- frag->disabled = (frag->value >= MAX_FRAG_THRESHOLD);
|
|
- frag->fixed = 1;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWFRAG - value %d, disabled %s",
|
|
- netdev->name, frag->value,
|
|
- (frag->disabled) ? "true" : "false");
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_txpow(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *power, char *extra)
|
|
-{
|
|
- power->value = 15;
|
|
- power->fixed = 1; /* No power control */
|
|
- power->disabled = 0;
|
|
- power->flags = IW_TXPOW_DBM;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWTXPOW - txpow %d dBm", netdev->name,
|
|
- power->value);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/* jal: short retry is handled by the firmware (at least 0.90.x),
|
|
- while long retry is not (?) */
|
|
-static int at76_iw_handler_set_retry(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *retry, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = -EIWCOMMIT;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWRETRY disabled %d flags 0x%x val %d",
|
|
- netdev->name, retry->disabled, retry->flags, retry->value);
|
|
-
|
|
- if (!retry->disabled && (retry->flags & IW_RETRY_LIMIT)) {
|
|
- if ((retry->flags & IW_RETRY_MIN) ||
|
|
- !(retry->flags & IW_RETRY_MAX))
|
|
- priv->short_retry_limit = retry->value;
|
|
- else
|
|
- ret = -EINVAL;
|
|
- } else
|
|
- ret = -EINVAL;
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-/* Adapted (ripped) from atmel.c */
|
|
-static int at76_iw_handler_get_retry(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *retry, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWRETRY", netdev->name);
|
|
-
|
|
- retry->disabled = 0; /* Can't be disabled */
|
|
- retry->flags = IW_RETRY_LIMIT;
|
|
- retry->value = priv->short_retry_limit;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_encode(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *encoding, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int index = (encoding->flags & IW_ENCODE_INDEX) - 1;
|
|
- int len = encoding->length;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCSIWENCODE - enc.flags %08x "
|
|
- "pointer %p len %d", netdev->name, encoding->flags,
|
|
- encoding->pointer, encoding->length);
|
|
- at76_dbg(DBG_IOCTL,
|
|
- "%s: SIOCSIWENCODE - old wepstate: enabled %s key_id %d "
|
|
- "auth_mode %s", netdev->name,
|
|
- (priv->wep_enabled) ? "true" : "false", priv->wep_key_id,
|
|
- (priv->auth_mode ==
|
|
- WLAN_AUTH_SHARED_KEY) ? "restricted" : "open");
|
|
-
|
|
- /* take the old default key if index is invalid */
|
|
- if ((index < 0) || (index >= WEP_KEYS))
|
|
- index = priv->wep_key_id;
|
|
-
|
|
- if (len > 0) {
|
|
- if (len > WEP_LARGE_KEY_LEN)
|
|
- len = WEP_LARGE_KEY_LEN;
|
|
-
|
|
- memset(priv->wep_keys[index], 0, WEP_KEY_LEN);
|
|
- memcpy(priv->wep_keys[index], extra, len);
|
|
- priv->wep_keys_len[index] = (len <= WEP_SMALL_KEY_LEN) ?
|
|
- WEP_SMALL_KEY_LEN : WEP_LARGE_KEY_LEN;
|
|
- priv->wep_enabled = 1;
|
|
- }
|
|
-
|
|
- priv->wep_key_id = index;
|
|
- priv->wep_enabled = ((encoding->flags & IW_ENCODE_DISABLED) == 0);
|
|
-
|
|
- if (encoding->flags & IW_ENCODE_RESTRICTED)
|
|
- priv->auth_mode = WLAN_AUTH_SHARED_KEY;
|
|
- if (encoding->flags & IW_ENCODE_OPEN)
|
|
- priv->auth_mode = WLAN_AUTH_OPEN;
|
|
-
|
|
- at76_dbg(DBG_IOCTL,
|
|
- "%s: SIOCSIWENCODE - new wepstate: enabled %s key_id %d "
|
|
- "key_len %d auth_mode %s", netdev->name,
|
|
- (priv->wep_enabled) ? "true" : "false", priv->wep_key_id + 1,
|
|
- priv->wep_keys_len[priv->wep_key_id],
|
|
- (priv->auth_mode ==
|
|
- WLAN_AUTH_SHARED_KEY) ? "restricted" : "open");
|
|
-
|
|
- return -EIWCOMMIT;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_encode(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *encoding, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int index = (encoding->flags & IW_ENCODE_INDEX) - 1;
|
|
-
|
|
- if ((index < 0) || (index >= WEP_KEYS))
|
|
- index = priv->wep_key_id;
|
|
-
|
|
- encoding->flags =
|
|
- (priv->auth_mode == WLAN_AUTH_SHARED_KEY) ?
|
|
- IW_ENCODE_RESTRICTED : IW_ENCODE_OPEN;
|
|
-
|
|
- if (!priv->wep_enabled)
|
|
- encoding->flags |= IW_ENCODE_DISABLED;
|
|
-
|
|
- if (encoding->pointer) {
|
|
- encoding->length = priv->wep_keys_len[index];
|
|
-
|
|
- memcpy(extra, priv->wep_keys[index], priv->wep_keys_len[index]);
|
|
-
|
|
- encoding->flags |= (index + 1);
|
|
- }
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWENCODE - enc.flags %08x "
|
|
- "pointer %p len %d", netdev->name, encoding->flags,
|
|
- encoding->pointer, encoding->length);
|
|
- at76_dbg(DBG_IOCTL,
|
|
- "%s: SIOCGIWENCODE - wepstate: enabled %s key_id %d "
|
|
- "key_len %d auth_mode %s", netdev->name,
|
|
- (priv->wep_enabled) ? "true" : "false", priv->wep_key_id + 1,
|
|
- priv->wep_keys_len[priv->wep_key_id],
|
|
- (priv->auth_mode ==
|
|
- WLAN_AUTH_SHARED_KEY) ? "restricted" : "open");
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_set_power(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *prq, char *extra)
|
|
-{
|
|
- int err = -EIWCOMMIT;
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- at76_dbg(DBG_IOCTL,
|
|
- "%s: SIOCSIWPOWER - disabled %s flags 0x%x value 0x%x",
|
|
- netdev->name, (prq->disabled) ? "true" : "false", prq->flags,
|
|
- prq->value);
|
|
-
|
|
- if (prq->disabled)
|
|
- priv->pm_mode = AT76_PM_OFF;
|
|
- else {
|
|
- switch (prq->flags & IW_POWER_MODE) {
|
|
- case IW_POWER_ALL_R:
|
|
- case IW_POWER_ON:
|
|
- break;
|
|
- default:
|
|
- err = -EINVAL;
|
|
- goto exit;
|
|
- }
|
|
- if (prq->flags & IW_POWER_PERIOD)
|
|
- priv->pm_period = prq->value;
|
|
-
|
|
- if (prq->flags & IW_POWER_TIMEOUT) {
|
|
- err = -EINVAL;
|
|
- goto exit;
|
|
- }
|
|
- priv->pm_mode = AT76_PM_ON;
|
|
- }
|
|
-exit:
|
|
- return err;
|
|
-}
|
|
-
|
|
-static int at76_iw_handler_get_power(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_param *power, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- power->disabled = (priv->pm_mode == AT76_PM_OFF);
|
|
- if (!power->disabled) {
|
|
- power->flags = IW_POWER_PERIOD | IW_POWER_ALL_R;
|
|
- power->value = priv->pm_period;
|
|
- }
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: SIOCGIWPOWER - %s flags 0x%x value 0x%x",
|
|
- netdev->name, power->disabled ? "disabled" : "enabled",
|
|
- power->flags, power->value);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*******************************************************************************
|
|
- * Private IOCTLS
|
|
- */
|
|
-static int at76_iw_set_short_preamble(struct net_device *netdev,
|
|
- struct iw_request_info *info, char *name,
|
|
- char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int val = *((int *)name);
|
|
- int ret = -EIWCOMMIT;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: AT76_SET_SHORT_PREAMBLE, %d",
|
|
- netdev->name, val);
|
|
-
|
|
- if (val < PREAMBLE_TYPE_LONG || val > PREAMBLE_TYPE_AUTO)
|
|
- ret = -EINVAL;
|
|
- else
|
|
- priv->preamble_type = val;
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_get_short_preamble(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- union iwreq_data *wrqu, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- snprintf(wrqu->name, sizeof(wrqu->name), "%s (%d)",
|
|
- preambles[priv->preamble_type], priv->preamble_type);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_set_debug(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- struct iw_point *data, char *extra)
|
|
-{
|
|
- char *ptr;
|
|
- u32 val;
|
|
-
|
|
- if (data->length > 0) {
|
|
- val = simple_strtol(extra, &ptr, 0);
|
|
-
|
|
- if (ptr == extra)
|
|
- val = DBG_DEFAULTS;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: AT76_SET_DEBUG input %d: %s -> 0x%x",
|
|
- netdev->name, data->length, extra, val);
|
|
- } else
|
|
- val = DBG_DEFAULTS;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: AT76_SET_DEBUG, old 0x%x, new 0x%x",
|
|
- netdev->name, at76_debug, val);
|
|
-
|
|
- /* jal: some more output to pin down lockups */
|
|
- at76_dbg(DBG_IOCTL, "%s: netif running %d queue_stopped %d "
|
|
- "carrier_ok %d", netdev->name, netif_running(netdev),
|
|
- netif_queue_stopped(netdev), netif_carrier_ok(netdev));
|
|
-
|
|
- at76_debug = val;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_get_debug(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- union iwreq_data *wrqu, char *extra)
|
|
-{
|
|
- snprintf(wrqu->name, sizeof(wrqu->name), "0x%08x", at76_debug);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_set_powersave_mode(struct net_device *netdev,
|
|
- struct iw_request_info *info, char *name,
|
|
- char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int val = *((int *)name);
|
|
- int ret = -EIWCOMMIT;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: AT76_SET_POWERSAVE_MODE, %d (%s)",
|
|
- netdev->name, val,
|
|
- val == AT76_PM_OFF ? "active" : val == AT76_PM_ON ? "save" :
|
|
- val == AT76_PM_SMART ? "smart save" : "<invalid>");
|
|
- if (val < AT76_PM_OFF || val > AT76_PM_SMART)
|
|
- ret = -EINVAL;
|
|
- else
|
|
- priv->pm_mode = val;
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_get_powersave_mode(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- union iwreq_data *wrqu, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int *param = (int *)extra;
|
|
-
|
|
- param[0] = priv->pm_mode;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_set_scan_times(struct net_device *netdev,
|
|
- struct iw_request_info *info, char *name,
|
|
- char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int mint = *((int *)name);
|
|
- int maxt = *((int *)name + 1);
|
|
- int ret = -EIWCOMMIT;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: AT76_SET_SCAN_TIMES - min %d max %d",
|
|
- netdev->name, mint, maxt);
|
|
- if (mint <= 0 || maxt <= 0 || mint > maxt)
|
|
- ret = -EINVAL;
|
|
- else {
|
|
- priv->scan_min_time = mint;
|
|
- priv->scan_max_time = maxt;
|
|
- }
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_get_scan_times(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- union iwreq_data *wrqu, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int *param = (int *)extra;
|
|
-
|
|
- param[0] = priv->scan_min_time;
|
|
- param[1] = priv->scan_max_time;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int at76_iw_set_scan_mode(struct net_device *netdev,
|
|
- struct iw_request_info *info, char *name,
|
|
- char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int val = *((int *)name);
|
|
- int ret = -EIWCOMMIT;
|
|
-
|
|
- at76_dbg(DBG_IOCTL, "%s: AT76_SET_SCAN_MODE - mode %s",
|
|
- netdev->name, (val = SCAN_TYPE_ACTIVE) ? "active" :
|
|
- (val = SCAN_TYPE_PASSIVE) ? "passive" : "<invalid>");
|
|
-
|
|
- if (val != SCAN_TYPE_ACTIVE && val != SCAN_TYPE_PASSIVE)
|
|
- ret = -EINVAL;
|
|
- else
|
|
- priv->scan_mode = val;
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_iw_get_scan_mode(struct net_device *netdev,
|
|
- struct iw_request_info *info,
|
|
- union iwreq_data *wrqu, char *extra)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int *param = (int *)extra;
|
|
-
|
|
- param[0] = priv->scan_mode;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-#define AT76_SET_HANDLER(h, f) [h - SIOCIWFIRST] = (iw_handler) f
|
|
-
|
|
-/* Standard wireless handlers */
|
|
-static const iw_handler at76_handlers[] = {
|
|
- AT76_SET_HANDLER(SIOCSIWCOMMIT, at76_iw_handler_commit),
|
|
- AT76_SET_HANDLER(SIOCGIWNAME, at76_iw_handler_get_name),
|
|
- AT76_SET_HANDLER(SIOCSIWFREQ, at76_iw_handler_set_freq),
|
|
- AT76_SET_HANDLER(SIOCGIWFREQ, at76_iw_handler_get_freq),
|
|
- AT76_SET_HANDLER(SIOCSIWMODE, at76_iw_handler_set_mode),
|
|
- AT76_SET_HANDLER(SIOCGIWMODE, at76_iw_handler_get_mode),
|
|
- AT76_SET_HANDLER(SIOCGIWRANGE, at76_iw_handler_get_range),
|
|
- AT76_SET_HANDLER(SIOCSIWSPY, at76_iw_handler_set_spy),
|
|
- AT76_SET_HANDLER(SIOCGIWSPY, at76_iw_handler_get_spy),
|
|
- AT76_SET_HANDLER(SIOCSIWTHRSPY, at76_iw_handler_set_thrspy),
|
|
- AT76_SET_HANDLER(SIOCGIWTHRSPY, at76_iw_handler_get_thrspy),
|
|
- AT76_SET_HANDLER(SIOCSIWAP, at76_iw_handler_set_wap),
|
|
- AT76_SET_HANDLER(SIOCGIWAP, at76_iw_handler_get_wap),
|
|
- AT76_SET_HANDLER(SIOCSIWSCAN, at76_iw_handler_set_scan),
|
|
- AT76_SET_HANDLER(SIOCGIWSCAN, at76_iw_handler_get_scan),
|
|
- AT76_SET_HANDLER(SIOCSIWESSID, at76_iw_handler_set_essid),
|
|
- AT76_SET_HANDLER(SIOCGIWESSID, at76_iw_handler_get_essid),
|
|
- AT76_SET_HANDLER(SIOCSIWRATE, at76_iw_handler_set_rate),
|
|
- AT76_SET_HANDLER(SIOCGIWRATE, at76_iw_handler_get_rate),
|
|
- AT76_SET_HANDLER(SIOCSIWRTS, at76_iw_handler_set_rts),
|
|
- AT76_SET_HANDLER(SIOCGIWRTS, at76_iw_handler_get_rts),
|
|
- AT76_SET_HANDLER(SIOCSIWFRAG, at76_iw_handler_set_frag),
|
|
- AT76_SET_HANDLER(SIOCGIWFRAG, at76_iw_handler_get_frag),
|
|
- AT76_SET_HANDLER(SIOCGIWTXPOW, at76_iw_handler_get_txpow),
|
|
- AT76_SET_HANDLER(SIOCSIWRETRY, at76_iw_handler_set_retry),
|
|
- AT76_SET_HANDLER(SIOCGIWRETRY, at76_iw_handler_get_retry),
|
|
- AT76_SET_HANDLER(SIOCSIWENCODE, at76_iw_handler_set_encode),
|
|
- AT76_SET_HANDLER(SIOCGIWENCODE, at76_iw_handler_get_encode),
|
|
- AT76_SET_HANDLER(SIOCSIWPOWER, at76_iw_handler_set_power),
|
|
- AT76_SET_HANDLER(SIOCGIWPOWER, at76_iw_handler_get_power)
|
|
-};
|
|
-
|
|
-#define AT76_SET_PRIV(h, f) [h - SIOCIWFIRSTPRIV] = (iw_handler) f
|
|
-
|
|
-/* Private wireless handlers */
|
|
-static const iw_handler at76_priv_handlers[] = {
|
|
- AT76_SET_PRIV(AT76_SET_SHORT_PREAMBLE, at76_iw_set_short_preamble),
|
|
- AT76_SET_PRIV(AT76_GET_SHORT_PREAMBLE, at76_iw_get_short_preamble),
|
|
- AT76_SET_PRIV(AT76_SET_DEBUG, at76_iw_set_debug),
|
|
- AT76_SET_PRIV(AT76_GET_DEBUG, at76_iw_get_debug),
|
|
- AT76_SET_PRIV(AT76_SET_POWERSAVE_MODE, at76_iw_set_powersave_mode),
|
|
- AT76_SET_PRIV(AT76_GET_POWERSAVE_MODE, at76_iw_get_powersave_mode),
|
|
- AT76_SET_PRIV(AT76_SET_SCAN_TIMES, at76_iw_set_scan_times),
|
|
- AT76_SET_PRIV(AT76_GET_SCAN_TIMES, at76_iw_get_scan_times),
|
|
- AT76_SET_PRIV(AT76_SET_SCAN_MODE, at76_iw_set_scan_mode),
|
|
- AT76_SET_PRIV(AT76_GET_SCAN_MODE, at76_iw_get_scan_mode),
|
|
-};
|
|
-
|
|
-/* Names and arguments of private wireless handlers */
|
|
-static const struct iw_priv_args at76_priv_args[] = {
|
|
- /* 0 - long, 1 - short */
|
|
- {AT76_SET_SHORT_PREAMBLE,
|
|
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
|
|
-
|
|
- {AT76_GET_SHORT_PREAMBLE,
|
|
- 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 10, "get_preamble"},
|
|
-
|
|
- /* we must pass the new debug mask as a string, because iwpriv cannot
|
|
- * parse hex numbers starting with 0x :-( */
|
|
- {AT76_SET_DEBUG,
|
|
- IW_PRIV_TYPE_CHAR | 10, 0, "set_debug"},
|
|
-
|
|
- {AT76_GET_DEBUG,
|
|
- 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 10, "get_debug"},
|
|
-
|
|
- /* 1 - active, 2 - power save, 3 - smart power save */
|
|
- {AT76_SET_POWERSAVE_MODE,
|
|
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_powersave"},
|
|
-
|
|
- {AT76_GET_POWERSAVE_MODE,
|
|
- 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_powersave"},
|
|
-
|
|
- /* min_channel_time, max_channel_time */
|
|
- {AT76_SET_SCAN_TIMES,
|
|
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "set_scan_times"},
|
|
-
|
|
- {AT76_GET_SCAN_TIMES,
|
|
- 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, "get_scan_times"},
|
|
-
|
|
- /* 0 - active, 1 - passive scan */
|
|
- {AT76_SET_SCAN_MODE,
|
|
- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_scan_mode"},
|
|
-
|
|
- {AT76_GET_SCAN_MODE,
|
|
- 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_scan_mode"},
|
|
-};
|
|
-
|
|
-static const struct iw_handler_def at76_handler_def = {
|
|
- .num_standard = ARRAY_SIZE(at76_handlers),
|
|
- .num_private = ARRAY_SIZE(at76_priv_handlers),
|
|
- .num_private_args = ARRAY_SIZE(at76_priv_args),
|
|
- .standard = at76_handlers,
|
|
- .private = at76_priv_handlers,
|
|
- .private_args = at76_priv_args,
|
|
- .get_wireless_stats = at76_get_wireless_stats,
|
|
-};
|
|
-
|
|
-static const u8 snapsig[] = { 0xaa, 0xaa, 0x03 };
|
|
-
|
|
-/* RFC 1042 encapsulates Ethernet frames in 802.2 SNAP (0xaa, 0xaa, 0x03) with
|
|
- * a SNAP OID of 0 (0x00, 0x00, 0x00) */
|
|
-static const u8 rfc1042sig[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
|
|
-
|
|
-static int at76_tx(struct sk_buff *skb, struct net_device *netdev)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- struct net_device_stats *stats = &priv->stats;
|
|
- int ret = 0;
|
|
- int wlen;
|
|
- int submit_len;
|
|
- struct at76_tx_buffer *tx_buffer = priv->bulk_out_buffer;
|
|
- struct ieee80211_hdr_3addr *i802_11_hdr =
|
|
- (struct ieee80211_hdr_3addr *)tx_buffer->packet;
|
|
- u8 *payload = i802_11_hdr->payload;
|
|
- struct ethhdr *eh = (struct ethhdr *)skb->data;
|
|
-
|
|
- if (netif_queue_stopped(netdev)) {
|
|
- printk(KERN_ERR "%s: %s called while netdev is stopped\n",
|
|
- netdev->name, __func__);
|
|
- /* skip this packet */
|
|
- dev_kfree_skb(skb);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- if (priv->tx_urb->status == -EINPROGRESS) {
|
|
- printk(KERN_ERR "%s: %s called while tx urb is pending\n",
|
|
- netdev->name, __func__);
|
|
- /* skip this packet */
|
|
- dev_kfree_skb(skb);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- if (skb->len < ETH_HLEN) {
|
|
- printk(KERN_ERR "%s: %s: skb too short (%d)\n",
|
|
- netdev->name, __func__, skb->len);
|
|
- dev_kfree_skb(skb);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- at76_ledtrig_tx_activity(); /* tell ledtrigger we send a packet */
|
|
-
|
|
- /* we can get rid of memcpy if we set netdev->hard_header_len to
|
|
- reserve enough space, but we would need to keep the skb around */
|
|
-
|
|
- if (ntohs(eh->h_proto) <= ETH_DATA_LEN) {
|
|
- /* this is a 802.3 packet */
|
|
- if (skb->len >= ETH_HLEN + sizeof(rfc1042sig)
|
|
- && skb->data[ETH_HLEN] == rfc1042sig[0]
|
|
- && skb->data[ETH_HLEN + 1] == rfc1042sig[1]) {
|
|
- /* higher layer delivered SNAP header - keep it */
|
|
- memcpy(payload, skb->data + ETH_HLEN,
|
|
- skb->len - ETH_HLEN);
|
|
- wlen = IEEE80211_3ADDR_LEN + skb->len - ETH_HLEN;
|
|
- } else {
|
|
- printk(KERN_ERR "%s: dropping non-SNAP 802.2 packet "
|
|
- "(DSAP 0x%02x SSAP 0x%02x cntrl 0x%02x)\n",
|
|
- priv->netdev->name, skb->data[ETH_HLEN],
|
|
- skb->data[ETH_HLEN + 1],
|
|
- skb->data[ETH_HLEN + 2]);
|
|
- dev_kfree_skb(skb);
|
|
- return 0;
|
|
- }
|
|
- } else {
|
|
- /* add RFC 1042 header in front */
|
|
- memcpy(payload, rfc1042sig, sizeof(rfc1042sig));
|
|
- memcpy(payload + sizeof(rfc1042sig), &eh->h_proto,
|
|
- skb->len - offsetof(struct ethhdr, h_proto));
|
|
- wlen = IEEE80211_3ADDR_LEN + sizeof(rfc1042sig) + skb->len -
|
|
- offsetof(struct ethhdr, h_proto);
|
|
- }
|
|
-
|
|
- /* make wireless header */
|
|
- i802_11_hdr->frame_ctl =
|
|
- cpu_to_le16(IEEE80211_FTYPE_DATA |
|
|
- (priv->wep_enabled ? IEEE80211_FCTL_PROTECTED : 0) |
|
|
- (priv->iw_mode ==
|
|
- IW_MODE_INFRA ? IEEE80211_FCTL_TODS : 0));
|
|
-
|
|
- if (priv->iw_mode == IW_MODE_ADHOC) {
|
|
- memcpy(i802_11_hdr->addr1, eh->h_dest, ETH_ALEN);
|
|
- memcpy(i802_11_hdr->addr2, eh->h_source, ETH_ALEN);
|
|
- memcpy(i802_11_hdr->addr3, priv->bssid, ETH_ALEN);
|
|
- } else if (priv->iw_mode == IW_MODE_INFRA) {
|
|
- memcpy(i802_11_hdr->addr1, priv->bssid, ETH_ALEN);
|
|
- memcpy(i802_11_hdr->addr2, eh->h_source, ETH_ALEN);
|
|
- memcpy(i802_11_hdr->addr3, eh->h_dest, ETH_ALEN);
|
|
- }
|
|
-
|
|
- i802_11_hdr->duration_id = cpu_to_le16(0);
|
|
- i802_11_hdr->seq_ctl = cpu_to_le16(0);
|
|
-
|
|
- /* setup 'Atmel' header */
|
|
- tx_buffer->wlength = cpu_to_le16(wlen);
|
|
- tx_buffer->tx_rate = priv->txrate;
|
|
- /* for broadcast destination addresses, the firmware 0.100.x
|
|
- seems to choose the highest rate set with CMD_STARTUP in
|
|
- basic_rate_set replacing this value */
|
|
-
|
|
- memset(tx_buffer->reserved, 0, sizeof(tx_buffer->reserved));
|
|
-
|
|
- tx_buffer->padding = at76_calc_padding(wlen);
|
|
- submit_len = wlen + AT76_TX_HDRLEN + tx_buffer->padding;
|
|
-
|
|
- at76_dbg(DBG_TX_DATA_CONTENT, "%s skb->data %s", priv->netdev->name,
|
|
- hex2str(skb->data, 32));
|
|
- at76_dbg(DBG_TX_DATA, "%s tx: wlen 0x%x pad 0x%x rate %d hdr %s",
|
|
- priv->netdev->name,
|
|
- le16_to_cpu(tx_buffer->wlength),
|
|
- tx_buffer->padding, tx_buffer->tx_rate,
|
|
- hex2str(i802_11_hdr, sizeof(*i802_11_hdr)));
|
|
- at76_dbg(DBG_TX_DATA_CONTENT, "%s payload %s", priv->netdev->name,
|
|
- hex2str(payload, 48));
|
|
-
|
|
- /* send stuff */
|
|
- netif_stop_queue(netdev);
|
|
- netdev->trans_start = jiffies;
|
|
-
|
|
- usb_fill_bulk_urb(priv->tx_urb, priv->udev, priv->tx_pipe, tx_buffer,
|
|
- submit_len, at76_tx_callback, priv);
|
|
- ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
|
|
- if (ret) {
|
|
- stats->tx_errors++;
|
|
- printk(KERN_ERR "%s: error in tx submit urb: %d\n",
|
|
- netdev->name, ret);
|
|
- if (ret == -EINVAL)
|
|
- printk(KERN_ERR
|
|
- "%s: -EINVAL: tx urb %p hcpriv %p complete %p\n",
|
|
- priv->netdev->name, priv->tx_urb,
|
|
- priv->tx_urb->hcpriv, priv->tx_urb->complete);
|
|
- } else {
|
|
- stats->tx_bytes += skb->len;
|
|
- dev_kfree_skb(skb);
|
|
- }
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static void at76_tx_timeout(struct net_device *netdev)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- if (!priv)
|
|
- return;
|
|
- dev_warn(&netdev->dev, "tx timeout.");
|
|
-
|
|
- usb_unlink_urb(priv->tx_urb);
|
|
- priv->stats.tx_errors++;
|
|
-}
|
|
-
|
|
-static int at76_submit_rx_urb(struct at76_priv *priv)
|
|
-{
|
|
- int ret;
|
|
- int size;
|
|
- struct sk_buff *skb = priv->rx_skb;
|
|
-
|
|
- if (!priv->rx_urb) {
|
|
- printk(KERN_ERR "%s: %s: priv->rx_urb is NULL\n",
|
|
- priv->netdev->name, __func__);
|
|
- return -EFAULT;
|
|
- }
|
|
-
|
|
- if (!skb) {
|
|
- skb = dev_alloc_skb(sizeof(struct at76_rx_buffer));
|
|
- if (!skb) {
|
|
- printk(KERN_ERR "%s: cannot allocate rx skbuff\n",
|
|
- priv->netdev->name);
|
|
- ret = -ENOMEM;
|
|
- goto exit;
|
|
- }
|
|
- priv->rx_skb = skb;
|
|
- } else {
|
|
- skb_push(skb, skb_headroom(skb));
|
|
- skb_trim(skb, 0);
|
|
- }
|
|
-
|
|
- size = skb_tailroom(skb);
|
|
- usb_fill_bulk_urb(priv->rx_urb, priv->udev, priv->rx_pipe,
|
|
- skb_put(skb, size), size, at76_rx_callback, priv);
|
|
- ret = usb_submit_urb(priv->rx_urb, GFP_ATOMIC);
|
|
- if (ret < 0) {
|
|
- if (ret == -ENODEV)
|
|
- at76_dbg(DBG_DEVSTART,
|
|
- "usb_submit_urb returned -ENODEV");
|
|
- else
|
|
- printk(KERN_ERR "%s: rx, usb_submit_urb failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
- }
|
|
-
|
|
-exit:
|
|
- if (ret < 0 && ret != -ENODEV)
|
|
- printk(KERN_ERR "%s: cannot submit rx urb - please unload the "
|
|
- "driver and/or power cycle the device\n",
|
|
- priv->netdev->name);
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_open(struct net_device *netdev)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- int ret = 0;
|
|
-
|
|
- at76_dbg(DBG_PROC_ENTRY, "%s(): entry", __func__);
|
|
-
|
|
- if (mutex_lock_interruptible(&priv->mtx))
|
|
- return -EINTR;
|
|
-
|
|
- /* if netdev->dev_addr != priv->mac_addr we must
|
|
- set the mac address in the device ! */
|
|
- if (compare_ether_addr(netdev->dev_addr, priv->mac_addr)) {
|
|
- if (at76_add_mac_address(priv, netdev->dev_addr) >= 0)
|
|
- at76_dbg(DBG_PROGRESS, "%s: set new MAC addr %s",
|
|
- netdev->name, mac2str(netdev->dev_addr));
|
|
- }
|
|
-
|
|
- priv->scan_state = SCAN_IDLE;
|
|
- priv->last_scan = jiffies;
|
|
-
|
|
- ret = at76_submit_rx_urb(priv);
|
|
- if (ret < 0) {
|
|
- printk(KERN_ERR "%s: open: submit_rx_urb failed: %d\n",
|
|
- netdev->name, ret);
|
|
- goto error;
|
|
- }
|
|
-
|
|
- schedule_delayed_work(&priv->dwork_restart, 0);
|
|
-
|
|
- at76_dbg(DBG_PROC_ENTRY, "%s(): end", __func__);
|
|
-error:
|
|
- mutex_unlock(&priv->mtx);
|
|
- return ret < 0 ? ret : 0;
|
|
-}
|
|
-
|
|
-static int at76_stop(struct net_device *netdev)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- at76_dbg(DBG_DEVSTART, "%s: ENTER", __func__);
|
|
-
|
|
- if (mutex_lock_interruptible(&priv->mtx))
|
|
- return -EINTR;
|
|
-
|
|
- at76_quiesce(priv);
|
|
-
|
|
- if (!priv->device_unplugged) {
|
|
- /* We are called by "ifconfig ethX down", not because the
|
|
- * device is not available anymore. */
|
|
- at76_set_radio(priv, 0);
|
|
-
|
|
- /* We unlink rx_urb because at76_open() re-submits it.
|
|
- * If unplugged, at76_delete_device() takes care of it. */
|
|
- usb_kill_urb(priv->rx_urb);
|
|
- }
|
|
-
|
|
- /* free the bss_list */
|
|
- at76_free_bss_list(priv);
|
|
-
|
|
- mutex_unlock(&priv->mtx);
|
|
- at76_dbg(DBG_DEVSTART, "%s: EXIT", __func__);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void at76_ethtool_get_drvinfo(struct net_device *netdev,
|
|
- struct ethtool_drvinfo *info)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
-
|
|
- strncpy(info->driver, DRIVER_NAME, sizeof(info->driver));
|
|
- strncpy(info->version, DRIVER_VERSION, sizeof(info->version));
|
|
-
|
|
- usb_make_path(priv->udev, info->bus_info, sizeof(info->bus_info));
|
|
-
|
|
- snprintf(info->fw_version, sizeof(info->fw_version), "%d.%d.%d-%d",
|
|
- priv->fw_version.major, priv->fw_version.minor,
|
|
- priv->fw_version.patch, priv->fw_version.build);
|
|
-}
|
|
-
|
|
-static u32 at76_ethtool_get_link(struct net_device *netdev)
|
|
-{
|
|
- struct at76_priv *priv = netdev_priv(netdev);
|
|
- return priv->mac_state == MAC_CONNECTED;
|
|
-}
|
|
-
|
|
-static struct ethtool_ops at76_ethtool_ops = {
|
|
- .get_drvinfo = at76_ethtool_get_drvinfo,
|
|
- .get_link = at76_ethtool_get_link,
|
|
-};
|
|
-
|
|
-/* Download external firmware */
|
|
-static int at76_load_external_fw(struct usb_device *udev, struct fwentry *fwe)
|
|
-{
|
|
- int ret;
|
|
- int op_mode;
|
|
- int blockno = 0;
|
|
- int bsize;
|
|
- u8 *block;
|
|
- u8 *buf = fwe->extfw;
|
|
- int size = fwe->extfw_size;
|
|
-
|
|
- if (!buf || !size)
|
|
- return -ENOENT;
|
|
-
|
|
- op_mode = at76_get_op_mode(udev);
|
|
- at76_dbg(DBG_DEVSTART, "opmode %d", op_mode);
|
|
+ op_mode = at76_get_op_mode(udev);
|
|
+ at76_dbg(DBG_DEVSTART, "opmode %d", op_mode);
|
|
|
|
if (op_mode != OPMODE_NORMAL_NIC_WITHOUT_FLASH) {
|
|
dev_printk(KERN_ERR, &udev->dev, "unexpected opmode %d\n",
|
|
@@ -3458,444 +1423,44 @@
|
|
exit:
|
|
kfree(block);
|
|
if (ret < 0)
|
|
- dev_printk(KERN_ERR, &udev->dev,
|
|
- "downloading external firmware failed: %d\n", ret);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-/* Download internal firmware */
|
|
-static int at76_load_internal_fw(struct usb_device *udev, struct fwentry *fwe)
|
|
-{
|
|
- int ret;
|
|
- int need_remap = !at76_is_505a(fwe->board_type);
|
|
-
|
|
- ret = at76_usbdfu_download(udev, fwe->intfw, fwe->intfw_size,
|
|
- need_remap ? 0 : 2 * HZ);
|
|
-
|
|
- if (ret < 0) {
|
|
- dev_printk(KERN_ERR, &udev->dev,
|
|
- "downloading internal fw failed with %d\n", ret);
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- at76_dbg(DBG_DEVSTART, "sending REMAP");
|
|
-
|
|
- /* no REMAP for 505A (see SF driver) */
|
|
- if (need_remap) {
|
|
- ret = at76_remap(udev);
|
|
- if (ret < 0) {
|
|
- dev_printk(KERN_ERR, &udev->dev,
|
|
- "sending REMAP failed with %d\n", ret);
|
|
- goto exit;
|
|
- }
|
|
- }
|
|
-
|
|
- at76_dbg(DBG_DEVSTART, "sleeping for 2 seconds");
|
|
- schedule_timeout_interruptible(2 * HZ + 1);
|
|
- usb_reset_device(udev);
|
|
-
|
|
-exit:
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_match_essid(struct at76_priv *priv, struct bss_info *ptr)
|
|
-{
|
|
- /* common criteria for both modi */
|
|
-
|
|
- int ret = (priv->essid_size == 0 /* ANY ssid */ ||
|
|
- (priv->essid_size == ptr->ssid_len &&
|
|
- !memcmp(priv->essid, ptr->ssid, ptr->ssid_len)));
|
|
- if (!ret)
|
|
- at76_dbg(DBG_BSS_MATCH,
|
|
- "%s bss table entry %p: essid didn't match",
|
|
- priv->netdev->name, ptr);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static inline int at76_match_mode(struct at76_priv *priv, struct bss_info *ptr)
|
|
-{
|
|
- int ret;
|
|
-
|
|
- if (priv->iw_mode == IW_MODE_ADHOC)
|
|
- ret = ptr->capa & WLAN_CAPABILITY_IBSS;
|
|
- else
|
|
- ret = ptr->capa & WLAN_CAPABILITY_ESS;
|
|
- if (!ret)
|
|
- at76_dbg(DBG_BSS_MATCH,
|
|
- "%s bss table entry %p: mode didn't match",
|
|
- priv->netdev->name, ptr);
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int at76_match_rates(struct at76_priv *priv, struct bss_info *ptr)
|
|
-{
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < ptr->rates_len; i++) {
|
|
- u8 rate = ptr->rates[i];
|
|
-
|
|
- if (!(rate & 0x80))
|
|
- continue;
|
|
-
|
|
- /* this is a basic rate we have to support
|
|
- (see IEEE802.11, ch. 7.3.2.2) */
|
|
- if (rate != (0x80 | hw_rates[0])
|
|
- && rate != (0x80 | hw_rates[1])
|
|
- && rate != (0x80 | hw_rates[2])
|
|
- && rate != (0x80 | hw_rates[3])) {
|
|
- at76_dbg(DBG_BSS_MATCH,
|
|
- "%s: bss table entry %p: basic rate %02x not "
|
|
- "supported", priv->netdev->name, ptr, rate);
|
|
- return 0;
|
|
- }
|
|
- }
|
|
-
|
|
- /* if we use short preamble, the bss must support it */
|
|
- if (priv->preamble_type == PREAMBLE_TYPE_SHORT &&
|
|
- !(ptr->capa & WLAN_CAPABILITY_SHORT_PREAMBLE)) {
|
|
- at76_dbg(DBG_BSS_MATCH,
|
|
- "%s: %p does not support short preamble",
|
|
- priv->netdev->name, ptr);
|
|
- return 0;
|
|
- } else
|
|
- return 1;
|
|
-}
|
|
-
|
|
-static inline int at76_match_wep(struct at76_priv *priv, struct bss_info *ptr)
|
|
-{
|
|
- if (!priv->wep_enabled && ptr->capa & WLAN_CAPABILITY_PRIVACY) {
|
|
- /* we have disabled WEP, but the BSS signals privacy */
|
|
- at76_dbg(DBG_BSS_MATCH,
|
|
- "%s: bss table entry %p: requires encryption",
|
|
- priv->netdev->name, ptr);
|
|
- return 0;
|
|
- }
|
|
- /* otherwise if the BSS does not signal privacy it may well
|
|
- accept encrypted packets from us ... */
|
|
- return 1;
|
|
-}
|
|
-
|
|
-static inline int at76_match_bssid(struct at76_priv *priv, struct bss_info *ptr)
|
|
-{
|
|
- if (!priv->wanted_bssid_valid ||
|
|
- !compare_ether_addr(ptr->bssid, priv->wanted_bssid))
|
|
- return 1;
|
|
-
|
|
- at76_dbg(DBG_BSS_MATCH,
|
|
- "%s: requested bssid - %s does not match",
|
|
- priv->netdev->name, mac2str(priv->wanted_bssid));
|
|
- at76_dbg(DBG_BSS_MATCH,
|
|
- " AP bssid - %s of bss table entry %p",
|
|
- mac2str(ptr->bssid), ptr);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/**
|
|
- * at76_match_bss - try to find a matching bss in priv->bss
|
|
- *
|
|
- * last - last bss tried
|
|
- *
|
|
- * last == NULL signals a new round starting with priv->bss_list.next
|
|
- * this function must be called inside an acquired priv->bss_list_spinlock
|
|
- * otherwise the timeout on bss may remove the newly chosen entry
|
|
- */
|
|
-static struct bss_info *at76_match_bss(struct at76_priv *priv,
|
|
- struct bss_info *last)
|
|
-{
|
|
- struct bss_info *ptr = NULL;
|
|
- struct list_head *curr;
|
|
-
|
|
- curr = last ? last->list.next : priv->bss_list.next;
|
|
- while (curr != &priv->bss_list) {
|
|
- ptr = list_entry(curr, struct bss_info, list);
|
|
- if (at76_match_essid(priv, ptr) && at76_match_mode(priv, ptr)
|
|
- && at76_match_wep(priv, ptr) && at76_match_rates(priv, ptr)
|
|
- && at76_match_bssid(priv, ptr))
|
|
- break;
|
|
- curr = curr->next;
|
|
- }
|
|
-
|
|
- if (curr == &priv->bss_list)
|
|
- ptr = NULL;
|
|
- /* otherwise ptr points to the struct bss_info we have chosen */
|
|
-
|
|
- at76_dbg(DBG_BSS_TABLE, "%s %s: returned %p", priv->netdev->name,
|
|
- __func__, ptr);
|
|
- return ptr;
|
|
-}
|
|
-
|
|
-/* Start joining a matching BSS, or create own IBSS */
|
|
-static void at76_work_join(struct work_struct *work)
|
|
-{
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- work_join);
|
|
- int ret;
|
|
- unsigned long flags;
|
|
-
|
|
- mutex_lock(&priv->mtx);
|
|
-
|
|
- WARN_ON(priv->mac_state != MAC_JOINING);
|
|
- if (priv->mac_state != MAC_JOINING)
|
|
- goto exit;
|
|
-
|
|
- /* secure the access to priv->curr_bss ! */
|
|
- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
|
|
- priv->curr_bss = at76_match_bss(priv, priv->curr_bss);
|
|
- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
|
|
-
|
|
- if (!priv->curr_bss) {
|
|
- /* here we haven't found a matching (i)bss ... */
|
|
- if (priv->iw_mode == IW_MODE_ADHOC) {
|
|
- at76_set_mac_state(priv, MAC_OWN_IBSS);
|
|
- at76_start_ibss(priv);
|
|
- goto exit;
|
|
- }
|
|
- /* haven't found a matching BSS in infra mode - try again */
|
|
- at76_set_mac_state(priv, MAC_SCANNING);
|
|
- schedule_work(&priv->work_start_scan);
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- ret = at76_join_bss(priv, priv->curr_bss);
|
|
- if (ret < 0) {
|
|
- printk(KERN_ERR "%s: join_bss failed with %d\n",
|
|
- priv->netdev->name, ret);
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- ret = at76_wait_completion(priv, CMD_JOIN);
|
|
- if (ret != CMD_STATUS_COMPLETE) {
|
|
- if (ret != CMD_STATUS_TIME_OUT)
|
|
- printk(KERN_ERR "%s: join_bss completed with %d\n",
|
|
- priv->netdev->name, ret);
|
|
- else
|
|
- printk(KERN_INFO "%s: join_bss ssid %s timed out\n",
|
|
- priv->netdev->name,
|
|
- mac2str(priv->curr_bss->bssid));
|
|
-
|
|
- /* retry next BSS immediately */
|
|
- schedule_work(&priv->work_join);
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- /* here we have joined the (I)BSS */
|
|
- if (priv->iw_mode == IW_MODE_ADHOC) {
|
|
- struct bss_info *bptr = priv->curr_bss;
|
|
- at76_set_mac_state(priv, MAC_CONNECTED);
|
|
- /* get ESSID, BSSID and channel for priv->curr_bss */
|
|
- priv->essid_size = bptr->ssid_len;
|
|
- memcpy(priv->essid, bptr->ssid, bptr->ssid_len);
|
|
- memcpy(priv->bssid, bptr->bssid, ETH_ALEN);
|
|
- priv->channel = bptr->channel;
|
|
- at76_iwevent_bss_connect(priv->netdev, bptr->bssid);
|
|
- netif_carrier_on(priv->netdev);
|
|
- netif_start_queue(priv->netdev);
|
|
- /* just to be sure */
|
|
- cancel_delayed_work(&priv->dwork_get_scan);
|
|
- cancel_delayed_work(&priv->dwork_auth);
|
|
- cancel_delayed_work(&priv->dwork_assoc);
|
|
- } else {
|
|
- /* send auth req */
|
|
- priv->retries = AUTH_RETRIES;
|
|
- at76_set_mac_state(priv, MAC_AUTH);
|
|
- at76_auth_req(priv, priv->curr_bss, 1, NULL);
|
|
- at76_dbg(DBG_MGMT_TIMER,
|
|
- "%s:%d: starting mgmt_timer + HZ", __func__, __LINE__);
|
|
- schedule_delayed_work(&priv->dwork_auth, AUTH_TIMEOUT);
|
|
- }
|
|
-
|
|
-exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
-}
|
|
-
|
|
-/* Reap scan results */
|
|
-static void at76_dwork_get_scan(struct work_struct *work)
|
|
-{
|
|
- int status;
|
|
- int ret;
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- dwork_get_scan.work);
|
|
-
|
|
- mutex_lock(&priv->mtx);
|
|
- WARN_ON(priv->mac_state != MAC_SCANNING);
|
|
- if (priv->mac_state != MAC_SCANNING)
|
|
- goto exit;
|
|
-
|
|
- status = at76_get_cmd_status(priv->udev, CMD_SCAN);
|
|
- if (status < 0) {
|
|
- printk(KERN_ERR "%s: %s: at76_get_cmd_status failed with %d\n",
|
|
- priv->netdev->name, __func__, status);
|
|
- status = CMD_STATUS_IN_PROGRESS;
|
|
- /* INFO: Hope it was a one off error - if not, scanning
|
|
- further down the line and stop this cycle */
|
|
- }
|
|
- at76_dbg(DBG_PROGRESS,
|
|
- "%s %s: got cmd_status %d (state %s, need_any %d)",
|
|
- priv->netdev->name, __func__, status,
|
|
- mac_states[priv->mac_state], priv->scan_need_any);
|
|
-
|
|
- if (status != CMD_STATUS_COMPLETE) {
|
|
- if ((status != CMD_STATUS_IN_PROGRESS) &&
|
|
- (status != CMD_STATUS_IDLE))
|
|
- printk(KERN_ERR "%s: %s: Bad scan status: %s\n",
|
|
- priv->netdev->name, __func__,
|
|
- at76_get_cmd_status_string(status));
|
|
-
|
|
- /* the first cmd status after scan start is always a IDLE ->
|
|
- start the timer to poll again until COMPLETED */
|
|
- at76_dbg(DBG_MGMT_TIMER,
|
|
- "%s:%d: starting mgmt_timer for %d ticks",
|
|
- __func__, __LINE__, SCAN_POLL_INTERVAL);
|
|
- schedule_delayed_work(&priv->dwork_get_scan,
|
|
- SCAN_POLL_INTERVAL);
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- if (at76_debug & DBG_BSS_TABLE)
|
|
- at76_dump_bss_table(priv);
|
|
-
|
|
- if (priv->scan_need_any) {
|
|
- ret = at76_start_scan(priv, 0);
|
|
- if (ret < 0)
|
|
- printk(KERN_ERR
|
|
- "%s: %s: start_scan (ANY) failed with %d\n",
|
|
- priv->netdev->name, __func__, ret);
|
|
- at76_dbg(DBG_MGMT_TIMER,
|
|
- "%s:%d: starting mgmt_timer for %d ticks", __func__,
|
|
- __LINE__, SCAN_POLL_INTERVAL);
|
|
- schedule_delayed_work(&priv->dwork_get_scan,
|
|
- SCAN_POLL_INTERVAL);
|
|
- priv->scan_need_any = 0;
|
|
- } else {
|
|
- priv->scan_state = SCAN_COMPLETED;
|
|
- /* report the end of scan to user space */
|
|
- at76_iwevent_scan_complete(priv->netdev);
|
|
- at76_set_mac_state(priv, MAC_JOINING);
|
|
- schedule_work(&priv->work_join);
|
|
- }
|
|
-
|
|
-exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
-}
|
|
-
|
|
-/* Handle loss of beacons from the AP */
|
|
-static void at76_dwork_beacon(struct work_struct *work)
|
|
-{
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- dwork_beacon.work);
|
|
-
|
|
- mutex_lock(&priv->mtx);
|
|
- if (priv->mac_state != MAC_CONNECTED || priv->iw_mode != IW_MODE_INFRA)
|
|
- goto exit;
|
|
-
|
|
- /* We haven't received any beacons from out AP for BEACON_TIMEOUT */
|
|
- printk(KERN_INFO "%s: lost beacon bssid %s\n",
|
|
- priv->netdev->name, mac2str(priv->curr_bss->bssid));
|
|
-
|
|
- netif_carrier_off(priv->netdev);
|
|
- netif_stop_queue(priv->netdev);
|
|
- at76_iwevent_bss_disconnect(priv->netdev);
|
|
- at76_set_mac_state(priv, MAC_SCANNING);
|
|
- schedule_work(&priv->work_start_scan);
|
|
-
|
|
-exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
-}
|
|
-
|
|
-/* Handle authentication response timeout */
|
|
-static void at76_dwork_auth(struct work_struct *work)
|
|
-{
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- dwork_auth.work);
|
|
-
|
|
- mutex_lock(&priv->mtx);
|
|
- WARN_ON(priv->mac_state != MAC_AUTH);
|
|
- if (priv->mac_state != MAC_AUTH)
|
|
- goto exit;
|
|
-
|
|
- at76_dbg(DBG_PROGRESS, "%s: authentication response timeout",
|
|
- priv->netdev->name);
|
|
-
|
|
- if (priv->retries-- >= 0) {
|
|
- at76_auth_req(priv, priv->curr_bss, 1, NULL);
|
|
- at76_dbg(DBG_MGMT_TIMER, "%s:%d: starting mgmt_timer + HZ",
|
|
- __func__, __LINE__);
|
|
- schedule_delayed_work(&priv->dwork_auth, AUTH_TIMEOUT);
|
|
- } else {
|
|
- /* try to get next matching BSS */
|
|
- at76_set_mac_state(priv, MAC_JOINING);
|
|
- schedule_work(&priv->work_join);
|
|
- }
|
|
-
|
|
-exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
-}
|
|
-
|
|
-/* Handle association response timeout */
|
|
-static void at76_dwork_assoc(struct work_struct *work)
|
|
-{
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- dwork_assoc.work);
|
|
-
|
|
- mutex_lock(&priv->mtx);
|
|
- WARN_ON(priv->mac_state != MAC_ASSOC);
|
|
- if (priv->mac_state != MAC_ASSOC)
|
|
- goto exit;
|
|
-
|
|
- at76_dbg(DBG_PROGRESS, "%s: association response timeout",
|
|
- priv->netdev->name);
|
|
-
|
|
- if (priv->retries-- >= 0) {
|
|
- at76_assoc_req(priv, priv->curr_bss);
|
|
- at76_dbg(DBG_MGMT_TIMER, "%s:%d: starting mgmt_timer + HZ",
|
|
- __func__, __LINE__);
|
|
- schedule_delayed_work(&priv->dwork_assoc, ASSOC_TIMEOUT);
|
|
- } else {
|
|
- /* try to get next matching BSS */
|
|
- at76_set_mac_state(priv, MAC_JOINING);
|
|
- schedule_work(&priv->work_join);
|
|
- }
|
|
-
|
|
-exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
+ dev_printk(KERN_ERR, &udev->dev,
|
|
+ "downloading external firmware failed: %d\n", ret);
|
|
+ return ret;
|
|
}
|
|
|
|
-/* Read new bssid in ad-hoc mode */
|
|
-static void at76_work_new_bss(struct work_struct *work)
|
|
+/* Download internal firmware */
|
|
+static int at76_load_internal_fw(struct usb_device *udev, struct fwentry *fwe)
|
|
{
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- work_new_bss);
|
|
int ret;
|
|
- struct mib_mac_mgmt mac_mgmt;
|
|
+ int need_remap = !at76_is_505a(fwe->board_type);
|
|
|
|
- mutex_lock(&priv->mtx);
|
|
+ ret = at76_usbdfu_download(udev, fwe->intfw, fwe->intfw_size,
|
|
+ need_remap ? 0 : 2 * HZ);
|
|
|
|
- ret = at76_get_mib(priv->udev, MIB_MAC_MGMT, &mac_mgmt,
|
|
- sizeof(struct mib_mac_mgmt));
|
|
if (ret < 0) {
|
|
- printk(KERN_ERR "%s: at76_get_mib failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ dev_printk(KERN_ERR, &udev->dev,
|
|
+ "downloading internal fw failed with %d\n", ret);
|
|
goto exit;
|
|
}
|
|
|
|
- at76_dbg(DBG_PROGRESS, "ibss_change = 0x%2x", mac_mgmt.ibss_change);
|
|
- memcpy(priv->bssid, mac_mgmt.current_bssid, ETH_ALEN);
|
|
- at76_dbg(DBG_PROGRESS, "using BSSID %s", mac2str(priv->bssid));
|
|
-
|
|
- at76_iwevent_bss_connect(priv->netdev, priv->bssid);
|
|
+ at76_dbg(DBG_DEVSTART, "sending REMAP");
|
|
|
|
- priv->mib_buf.type = MIB_MAC_MGMT;
|
|
- priv->mib_buf.size = 1;
|
|
- priv->mib_buf.index = offsetof(struct mib_mac_mgmt, ibss_change);
|
|
- priv->mib_buf.data.byte = 0;
|
|
+ /* no REMAP for 505A (see SF driver) */
|
|
+ if (need_remap) {
|
|
+ ret = at76_remap(udev);
|
|
+ if (ret < 0) {
|
|
+ dev_printk(KERN_ERR, &udev->dev,
|
|
+ "sending REMAP failed with %d\n", ret);
|
|
+ goto exit;
|
|
+ }
|
|
+ }
|
|
|
|
- ret = at76_set_mib(priv, &priv->mib_buf);
|
|
- if (ret < 0)
|
|
- printk(KERN_ERR "%s: set_mib (ibss change ok) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ at76_dbg(DBG_DEVSTART, "sleeping for 2 seconds");
|
|
+ schedule_timeout_interruptible(2 * HZ + 1);
|
|
+ usb_reset_device(udev);
|
|
|
|
exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
+ return ret;
|
|
}
|
|
|
|
static int at76_startup_device(struct at76_priv *priv)
|
|
@@ -3905,14 +1470,14 @@
|
|
|
|
at76_dbg(DBG_PARAMS,
|
|
"%s param: ssid %.*s (%s) mode %s ch %d wep %s key %d "
|
|
- "keylen %d", priv->netdev->name, priv->essid_size, priv->essid,
|
|
- hex2str(priv->essid, IW_ESSID_MAX_SIZE),
|
|
+ "keylen %d", wiphy_name(priv->hw->wiphy), priv->essid_size,
|
|
+ priv->essid, hex2str(priv->essid, IW_ESSID_MAX_SIZE),
|
|
priv->iw_mode == IW_MODE_ADHOC ? "adhoc" : "infra",
|
|
priv->channel, priv->wep_enabled ? "enabled" : "disabled",
|
|
priv->wep_key_id, priv->wep_keys_len[priv->wep_key_id]);
|
|
at76_dbg(DBG_PARAMS,
|
|
"%s param: preamble %s rts %d retry %d frag %d "
|
|
- "txrate %s auth_mode %d", priv->netdev->name,
|
|
+ "txrate %s auth_mode %d", wiphy_name(priv->hw->wiphy),
|
|
preambles[priv->preamble_type], priv->rts_threshold,
|
|
priv->short_retry_limit, priv->frag_threshold,
|
|
priv->txrate == TX_RATE_1MBIT ? "1MBit" : priv->txrate ==
|
|
@@ -3923,7 +1488,7 @@
|
|
at76_dbg(DBG_PARAMS,
|
|
"%s param: pm_mode %d pm_period %d auth_mode %s "
|
|
"scan_times %d %d scan_mode %s",
|
|
- priv->netdev->name, priv->pm_mode, priv->pm_period,
|
|
+ wiphy_name(priv->hw->wiphy), priv->pm_mode, priv->pm_period,
|
|
priv->auth_mode == WLAN_AUTH_OPEN ? "open" : "shared_secret",
|
|
priv->scan_min_time, priv->scan_max_time,
|
|
priv->scan_mode == SCAN_TYPE_ACTIVE ? "active" : "passive");
|
|
@@ -3957,7 +1522,8 @@
|
|
ccfg->ssid_len = priv->essid_size;
|
|
|
|
ccfg->wep_default_key_id = priv->wep_key_id;
|
|
- memcpy(ccfg->wep_default_key_value, priv->wep_keys, 4 * WEP_KEY_LEN);
|
|
+ memcpy(ccfg->wep_default_key_value, priv->wep_keys,
|
|
+ sizeof(priv->wep_keys));
|
|
|
|
ccfg->short_preamble = priv->preamble_type;
|
|
ccfg->beacon_period = cpu_to_le16(priv->beacon_period);
|
|
@@ -3966,7 +1532,7 @@
|
|
sizeof(struct at76_card_config));
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "%s: at76_set_card_command failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
return ret;
|
|
}
|
|
|
|
@@ -4012,69 +1578,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-/* Restart the interface */
|
|
-static void at76_dwork_restart(struct work_struct *work)
|
|
-{
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- dwork_restart.work);
|
|
-
|
|
- mutex_lock(&priv->mtx);
|
|
-
|
|
- netif_carrier_off(priv->netdev); /* stop netdev watchdog */
|
|
- netif_stop_queue(priv->netdev); /* stop tx data packets */
|
|
-
|
|
- at76_startup_device(priv);
|
|
-
|
|
- if (priv->iw_mode != IW_MODE_MONITOR) {
|
|
- priv->netdev->type = ARPHRD_ETHER;
|
|
- at76_set_mac_state(priv, MAC_SCANNING);
|
|
- schedule_work(&priv->work_start_scan);
|
|
- } else {
|
|
- priv->netdev->type = ARPHRD_IEEE80211_RADIOTAP;
|
|
- at76_start_monitor(priv);
|
|
- }
|
|
-
|
|
- mutex_unlock(&priv->mtx);
|
|
-}
|
|
-
|
|
-/* Initiate scanning */
|
|
-static void at76_work_start_scan(struct work_struct *work)
|
|
-{
|
|
- struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
- work_start_scan);
|
|
- int ret;
|
|
-
|
|
- mutex_lock(&priv->mtx);
|
|
-
|
|
- WARN_ON(priv->mac_state != MAC_SCANNING);
|
|
- if (priv->mac_state != MAC_SCANNING)
|
|
- goto exit;
|
|
-
|
|
- /* only clear the bss list when a scan is actively initiated,
|
|
- * otherwise simply rely on at76_bss_list_timeout */
|
|
- if (priv->scan_state == SCAN_IN_PROGRESS) {
|
|
- at76_free_bss_list(priv);
|
|
- priv->scan_need_any = 1;
|
|
- } else
|
|
- priv->scan_need_any = 0;
|
|
-
|
|
- ret = at76_start_scan(priv, 1);
|
|
-
|
|
- if (ret < 0)
|
|
- printk(KERN_ERR "%s: %s: start_scan failed with %d\n",
|
|
- priv->netdev->name, __func__, ret);
|
|
- else {
|
|
- at76_dbg(DBG_MGMT_TIMER,
|
|
- "%s:%d: starting mgmt_timer for %d ticks",
|
|
- __func__, __LINE__, SCAN_POLL_INTERVAL);
|
|
- schedule_delayed_work(&priv->dwork_get_scan,
|
|
- SCAN_POLL_INTERVAL);
|
|
- }
|
|
-
|
|
-exit:
|
|
- mutex_unlock(&priv->mtx);
|
|
-}
|
|
-
|
|
/* Enable or disable promiscuous mode */
|
|
static void at76_work_set_promisc(struct work_struct *work)
|
|
{
|
|
@@ -4092,7 +1595,7 @@
|
|
ret = at76_set_mib(priv, &priv->mib_buf);
|
|
if (ret < 0)
|
|
printk(KERN_ERR "%s: set_mib (promiscuous_mode) failed: %d\n",
|
|
- priv->netdev->name, ret);
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
|
|
mutex_unlock(&priv->mtx);
|
|
}
|
|
@@ -4108,1088 +1611,759 @@
|
|
mutex_unlock(&priv->mtx);
|
|
}
|
|
|
|
-/* We got an association response */
|
|
-static void at76_rx_mgmt_assoc(struct at76_priv *priv,
|
|
- struct at76_rx_buffer *buf)
|
|
-{
|
|
- struct ieee80211_assoc_response *resp =
|
|
- (struct ieee80211_assoc_response *)buf->packet;
|
|
- u16 assoc_id = le16_to_cpu(resp->aid);
|
|
- u16 status = le16_to_cpu(resp->status);
|
|
-
|
|
- at76_dbg(DBG_RX_MGMT, "%s: rx AssocResp bssid %s capa 0x%04x status "
|
|
- "0x%04x assoc_id 0x%04x rates %s", priv->netdev->name,
|
|
- mac2str(resp->header.addr3), le16_to_cpu(resp->capability),
|
|
- status, assoc_id, hex2str(resp->info_element->data,
|
|
- resp->info_element->len));
|
|
-
|
|
- if (priv->mac_state != MAC_ASSOC) {
|
|
- printk(KERN_INFO "%s: AssocResp in state %s ignored\n",
|
|
- priv->netdev->name, mac_states[priv->mac_state]);
|
|
+static void at76_rx_tasklet(unsigned long param)
|
|
+{
|
|
+ struct urb *urb = (struct urb *)param;
|
|
+ struct at76_priv *priv = urb->context;
|
|
+ struct at76_rx_buffer *buf;
|
|
+ struct ieee80211_rx_status rx_status = { 0 };
|
|
+
|
|
+ if (priv->device_unplugged) {
|
|
+ at76_dbg(DBG_DEVSTART, "device unplugged");
|
|
+ if (urb)
|
|
+ at76_dbg(DBG_DEVSTART, "urb status %d", urb->status);
|
|
return;
|
|
}
|
|
|
|
- BUG_ON(!priv->curr_bss);
|
|
+ if (!priv->rx_skb || !priv->rx_skb->data)
|
|
+ return;
|
|
|
|
- cancel_delayed_work(&priv->dwork_assoc);
|
|
- if (status == WLAN_STATUS_SUCCESS) {
|
|
- struct bss_info *ptr = priv->curr_bss;
|
|
- priv->assoc_id = assoc_id & 0x3fff;
|
|
- /* update iwconfig params */
|
|
- memcpy(priv->bssid, ptr->bssid, ETH_ALEN);
|
|
- memcpy(priv->essid, ptr->ssid, ptr->ssid_len);
|
|
- priv->essid_size = ptr->ssid_len;
|
|
- priv->channel = ptr->channel;
|
|
- schedule_work(&priv->work_assoc_done);
|
|
- } else {
|
|
- at76_set_mac_state(priv, MAC_JOINING);
|
|
- schedule_work(&priv->work_join);
|
|
+ buf = (struct at76_rx_buffer *)priv->rx_skb->data;
|
|
+
|
|
+ if (urb->status != 0) {
|
|
+ if (urb->status != -ENOENT && urb->status != -ECONNRESET)
|
|
+ at76_dbg(DBG_URB,
|
|
+ "%s %s: - nonzero Rx bulk status received: %d",
|
|
+ __func__, wiphy_name(priv->hw->wiphy),
|
|
+ urb->status);
|
|
+ return;
|
|
}
|
|
+
|
|
+ at76_dbg(DBG_RX_ATMEL_HDR,
|
|
+ "%s: rx frame: rate %d rssi %d noise %d link %d",
|
|
+ wiphy_name(priv->hw->wiphy), buf->rx_rate, buf->rssi,
|
|
+ buf->noise_level, buf->link_quality);
|
|
+
|
|
+ skb_trim(priv->rx_skb, le16_to_cpu(buf->wlength) + AT76_RX_HDRLEN);
|
|
+ at76_dbg_dump(DBG_RX_DATA, &priv->rx_skb->data[AT76_RX_HDRLEN],
|
|
+ priv->rx_skb->len, "RX: len=%d",
|
|
+ (int)(priv->rx_skb->len - AT76_RX_HDRLEN));
|
|
+
|
|
+ rx_status.signal = buf->rssi;
|
|
+ /* FIXME: is rate_idx still present in structure? */
|
|
+ rx_status.rate_idx = buf->rx_rate;
|
|
+ rx_status.flag |= RX_FLAG_DECRYPTED;
|
|
+ rx_status.flag |= RX_FLAG_IV_STRIPPED;
|
|
+
|
|
+ skb_pull(priv->rx_skb, AT76_RX_HDRLEN);
|
|
+ at76_dbg(DBG_MAC80211, "calling ieee80211_rx_irqsafe(): %d/%d",
|
|
+ priv->rx_skb->len, priv->rx_skb->data_len);
|
|
+ ieee80211_rx_irqsafe(priv->hw, priv->rx_skb, &rx_status);
|
|
+
|
|
+ /* Use a new skb for the next receive */
|
|
+ priv->rx_skb = NULL;
|
|
+
|
|
+ at76_submit_rx_urb(priv);
|
|
}
|
|
|
|
-/* Process disassociation request from the AP */
|
|
-static void at76_rx_mgmt_disassoc(struct at76_priv *priv,
|
|
- struct at76_rx_buffer *buf)
|
|
+/* Load firmware into kernel memory and parse it */
|
|
+static struct fwentry *at76_load_firmware(struct usb_device *udev,
|
|
+ enum board_type board_type)
|
|
{
|
|
- struct ieee80211_disassoc *resp =
|
|
- (struct ieee80211_disassoc *)buf->packet;
|
|
- struct ieee80211_hdr_3addr *mgmt = &resp->header;
|
|
+ int ret;
|
|
+ char *str;
|
|
+ struct at76_fw_header *fwh;
|
|
+ struct fwentry *fwe = &firmwares[board_type];
|
|
|
|
- at76_dbg(DBG_RX_MGMT,
|
|
- "%s: rx DisAssoc bssid %s reason 0x%04x destination %s",
|
|
- priv->netdev->name, mac2str(mgmt->addr3),
|
|
- le16_to_cpu(resp->reason), mac2str(mgmt->addr1));
|
|
+ mutex_lock(&fw_mutex);
|
|
|
|
- /* We are not connected, ignore */
|
|
- if (priv->mac_state == MAC_SCANNING || priv->mac_state == MAC_INIT
|
|
- || !priv->curr_bss)
|
|
- return;
|
|
+ if (fwe->loaded) {
|
|
+ at76_dbg(DBG_FW, "re-using previously loaded fw");
|
|
+ goto exit;
|
|
+ }
|
|
|
|
- /* Not our BSSID, ignore */
|
|
- if (compare_ether_addr(mgmt->addr3, priv->curr_bss->bssid))
|
|
- return;
|
|
+ at76_dbg(DBG_FW, "downloading firmware %s", fwe->fwname);
|
|
+ ret = request_firmware(&fwe->fw, fwe->fwname, &udev->dev);
|
|
+ if (ret < 0) {
|
|
+ dev_printk(KERN_ERR, &udev->dev, "firmware %s not found!\n",
|
|
+ fwe->fwname);
|
|
+ dev_printk(KERN_ERR, &udev->dev,
|
|
+ "you may need to download the firmware from "
|
|
+ "http://developer.berlios.de/projects/at76c503a/\n");
|
|
+ goto exit;
|
|
+ }
|
|
|
|
- /* Not for our STA and not broadcast, ignore */
|
|
- if (compare_ether_addr(priv->netdev->dev_addr, mgmt->addr1)
|
|
- && !is_broadcast_ether_addr(mgmt->addr1))
|
|
- return;
|
|
+ at76_dbg(DBG_FW, "got it.");
|
|
+ fwh = (struct at76_fw_header *)(fwe->fw->data);
|
|
|
|
- if (priv->mac_state != MAC_ASSOC && priv->mac_state != MAC_CONNECTED
|
|
- && priv->mac_state != MAC_JOINING) {
|
|
- printk(KERN_INFO "%s: DisAssoc in state %s ignored\n",
|
|
- priv->netdev->name, mac_states[priv->mac_state]);
|
|
- return;
|
|
+ if (fwe->fw->size <= sizeof(*fwh)) {
|
|
+ dev_printk(KERN_ERR, &udev->dev,
|
|
+ "firmware is too short (0x%zx)\n", fwe->fw->size);
|
|
+ goto exit;
|
|
}
|
|
|
|
- if (priv->mac_state == MAC_CONNECTED) {
|
|
- netif_carrier_off(priv->netdev);
|
|
- netif_stop_queue(priv->netdev);
|
|
- at76_iwevent_bss_disconnect(priv->netdev);
|
|
- }
|
|
- cancel_delayed_work(&priv->dwork_get_scan);
|
|
- cancel_delayed_work(&priv->dwork_beacon);
|
|
- cancel_delayed_work(&priv->dwork_auth);
|
|
- cancel_delayed_work(&priv->dwork_assoc);
|
|
- at76_set_mac_state(priv, MAC_JOINING);
|
|
- schedule_work(&priv->work_join);
|
|
-}
|
|
-
|
|
-static void at76_rx_mgmt_auth(struct at76_priv *priv,
|
|
- struct at76_rx_buffer *buf)
|
|
-{
|
|
- struct ieee80211_auth *resp = (struct ieee80211_auth *)buf->packet;
|
|
- struct ieee80211_hdr_3addr *mgmt = &resp->header;
|
|
- int seq_nr = le16_to_cpu(resp->transaction);
|
|
- int alg = le16_to_cpu(resp->algorithm);
|
|
- int status = le16_to_cpu(resp->status);
|
|
-
|
|
- at76_dbg(DBG_RX_MGMT,
|
|
- "%s: rx AuthFrame bssid %s alg %d seq_nr %d status %d "
|
|
- "destination %s", priv->netdev->name, mac2str(mgmt->addr3),
|
|
- alg, seq_nr, status, mac2str(mgmt->addr1));
|
|
-
|
|
- if (alg == WLAN_AUTH_SHARED_KEY && seq_nr == 2)
|
|
- at76_dbg(DBG_RX_MGMT, "%s: AuthFrame challenge %s ...",
|
|
- priv->netdev->name, hex2str(resp->info_element, 18));
|
|
-
|
|
- if (priv->mac_state != MAC_AUTH) {
|
|
- printk(KERN_INFO "%s: ignored AuthFrame in state %s\n",
|
|
- priv->netdev->name, mac_states[priv->mac_state]);
|
|
- return;
|
|
- }
|
|
- if (priv->auth_mode != alg) {
|
|
- printk(KERN_INFO "%s: ignored AuthFrame for alg %d\n",
|
|
- priv->netdev->name, alg);
|
|
- return;
|
|
+ /* CRC currently not checked */
|
|
+ fwe->board_type = le32_to_cpu(fwh->board_type);
|
|
+ if (fwe->board_type != board_type) {
|
|
+ dev_printk(KERN_ERR, &udev->dev,
|
|
+ "board type mismatch, requested %u, got %u\n",
|
|
+ board_type, fwe->board_type);
|
|
+ goto exit;
|
|
}
|
|
|
|
- BUG_ON(!priv->curr_bss);
|
|
+ fwe->fw_version.major = fwh->major;
|
|
+ fwe->fw_version.minor = fwh->minor;
|
|
+ fwe->fw_version.patch = fwh->patch;
|
|
+ fwe->fw_version.build = fwh->build;
|
|
|
|
- /* Not our BSSID or not for our STA, ignore */
|
|
- if (compare_ether_addr(mgmt->addr3, priv->curr_bss->bssid)
|
|
- || compare_ether_addr(priv->netdev->dev_addr, mgmt->addr1))
|
|
- return;
|
|
+ str = (char *)fwh + le32_to_cpu(fwh->str_offset);
|
|
+ fwe->intfw = (u8 *)fwh + le32_to_cpu(fwh->int_fw_offset);
|
|
+ fwe->intfw_size = le32_to_cpu(fwh->int_fw_len);
|
|
+ fwe->extfw = (u8 *)fwh + le32_to_cpu(fwh->ext_fw_offset);
|
|
+ fwe->extfw_size = le32_to_cpu(fwh->ext_fw_len);
|
|
|
|
- cancel_delayed_work(&priv->dwork_auth);
|
|
- if (status != WLAN_STATUS_SUCCESS) {
|
|
- /* try to join next bss */
|
|
- at76_set_mac_state(priv, MAC_JOINING);
|
|
- schedule_work(&priv->work_join);
|
|
- return;
|
|
- }
|
|
+ fwe->loaded = 1;
|
|
|
|
- if (priv->auth_mode == WLAN_AUTH_OPEN || seq_nr == 4) {
|
|
- priv->retries = ASSOC_RETRIES;
|
|
- at76_set_mac_state(priv, MAC_ASSOC);
|
|
- at76_assoc_req(priv, priv->curr_bss);
|
|
- at76_dbg(DBG_MGMT_TIMER,
|
|
- "%s:%d: starting mgmt_timer + HZ", __func__, __LINE__);
|
|
- schedule_delayed_work(&priv->dwork_assoc, ASSOC_TIMEOUT);
|
|
- return;
|
|
- }
|
|
+ dev_printk(KERN_DEBUG, &udev->dev,
|
|
+ "using firmware %s (version %d.%d.%d-%d)\n",
|
|
+ fwe->fwname, fwh->major, fwh->minor, fwh->patch, fwh->build);
|
|
|
|
- WARN_ON(seq_nr != 2);
|
|
- at76_auth_req(priv, priv->curr_bss, seq_nr + 1, resp->info_element);
|
|
- at76_dbg(DBG_MGMT_TIMER, "%s:%d: starting mgmt_timer + HZ", __func__,
|
|
- __LINE__);
|
|
- schedule_delayed_work(&priv->dwork_auth, AUTH_TIMEOUT);
|
|
-}
|
|
-
|
|
-static void at76_rx_mgmt_deauth(struct at76_priv *priv,
|
|
- struct at76_rx_buffer *buf)
|
|
-{
|
|
- struct ieee80211_disassoc *resp =
|
|
- (struct ieee80211_disassoc *)buf->packet;
|
|
- struct ieee80211_hdr_3addr *mgmt = &resp->header;
|
|
-
|
|
- at76_dbg(DBG_RX_MGMT | DBG_PROGRESS,
|
|
- "%s: rx DeAuth bssid %s reason 0x%04x destination %s",
|
|
- priv->netdev->name, mac2str(mgmt->addr3),
|
|
- le16_to_cpu(resp->reason), mac2str(mgmt->addr1));
|
|
-
|
|
- if (priv->mac_state != MAC_AUTH && priv->mac_state != MAC_ASSOC
|
|
- && priv->mac_state != MAC_CONNECTED) {
|
|
- printk(KERN_INFO "%s: DeAuth in state %s ignored\n",
|
|
- priv->netdev->name, mac_states[priv->mac_state]);
|
|
- return;
|
|
- }
|
|
+ at76_dbg(DBG_DEVSTART, "board %u, int %d:%d, ext %d:%d", board_type,
|
|
+ le32_to_cpu(fwh->int_fw_offset), le32_to_cpu(fwh->int_fw_len),
|
|
+ le32_to_cpu(fwh->ext_fw_offset), le32_to_cpu(fwh->ext_fw_len));
|
|
+ at76_dbg(DBG_DEVSTART, "firmware id %s", str);
|
|
|
|
- BUG_ON(!priv->curr_bss);
|
|
+exit:
|
|
+ mutex_unlock(&fw_mutex);
|
|
|
|
- /* Not our BSSID, ignore */
|
|
- if (compare_ether_addr(mgmt->addr3, priv->curr_bss->bssid))
|
|
- return;
|
|
+ if (fwe->loaded)
|
|
+ return fwe;
|
|
+ else
|
|
+ return NULL;
|
|
+}
|
|
|
|
- /* Not for our STA and not broadcast, ignore */
|
|
- if (compare_ether_addr(priv->netdev->dev_addr, mgmt->addr1)
|
|
- && !is_broadcast_ether_addr(mgmt->addr1))
|
|
- return;
|
|
+static void at76_mac80211_tx_callback(struct urb *urb)
|
|
+{
|
|
+ struct at76_priv *priv = urb->context;
|
|
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(priv->tx_skb);
|
|
|
|
- if (priv->mac_state == MAC_CONNECTED)
|
|
- at76_iwevent_bss_disconnect(priv->netdev);
|
|
+ at76_dbg(DBG_MAC80211, "%s()", __func__);
|
|
|
|
- at76_set_mac_state(priv, MAC_JOINING);
|
|
- schedule_work(&priv->work_join);
|
|
- cancel_delayed_work(&priv->dwork_get_scan);
|
|
- cancel_delayed_work(&priv->dwork_beacon);
|
|
- cancel_delayed_work(&priv->dwork_auth);
|
|
- cancel_delayed_work(&priv->dwork_assoc);
|
|
-}
|
|
-
|
|
-static void at76_rx_mgmt_beacon(struct at76_priv *priv,
|
|
- struct at76_rx_buffer *buf)
|
|
-{
|
|
- int varpar_len;
|
|
- /* beacon content */
|
|
- struct ieee80211_beacon *bdata = (struct ieee80211_beacon *)buf->packet;
|
|
- struct ieee80211_hdr_3addr *mgmt = &bdata->header;
|
|
-
|
|
- struct list_head *lptr;
|
|
- struct bss_info *match; /* entry matching addr3 with its bssid */
|
|
- int new_entry = 0;
|
|
- int len;
|
|
- struct ieee80211_info_element *ie;
|
|
- int have_ssid = 0;
|
|
- int have_rates = 0;
|
|
- int have_channel = 0;
|
|
- int keep_going = 1;
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
|
|
- if (priv->mac_state == MAC_CONNECTED) {
|
|
- /* in state MAC_CONNECTED we use the mgmt_timer to control
|
|
- the beacon of the BSS */
|
|
- BUG_ON(!priv->curr_bss);
|
|
-
|
|
- if (!compare_ether_addr(priv->curr_bss->bssid, mgmt->addr3)) {
|
|
- /* We got our AP's beacon, defer the timeout handler.
|
|
- Kill pending work first, as schedule_delayed_work()
|
|
- won't do it. */
|
|
- cancel_delayed_work(&priv->dwork_beacon);
|
|
- schedule_delayed_work(&priv->dwork_beacon,
|
|
- BEACON_TIMEOUT);
|
|
- priv->curr_bss->rssi = buf->rssi;
|
|
- priv->beacons_received++;
|
|
- goto exit;
|
|
- }
|
|
+ switch (urb->status) {
|
|
+ case 0:
|
|
+ /* success */
|
|
+ /* FIXME:
|
|
+ * is the frame really ACKed when tx_callback is called ? */
|
|
+ info->flags |= IEEE80211_TX_STAT_ACK;
|
|
+ break;
|
|
+ case -ENOENT:
|
|
+ case -ECONNRESET:
|
|
+ /* fail, urb has been unlinked */
|
|
+ /* FIXME: add error message */
|
|
+ break;
|
|
+ default:
|
|
+ at76_dbg(DBG_URB, "%s - nonzero tx status received: %d",
|
|
+ __func__, urb->status);
|
|
+ break;
|
|
}
|
|
|
|
- /* look if we have this BSS already in the list */
|
|
- match = NULL;
|
|
+ memset(&info->status, 0, sizeof(info->status));
|
|
|
|
- if (!list_empty(&priv->bss_list)) {
|
|
- list_for_each(lptr, &priv->bss_list) {
|
|
- struct bss_info *bss_ptr =
|
|
- list_entry(lptr, struct bss_info, list);
|
|
- if (!compare_ether_addr(bss_ptr->bssid, mgmt->addr3)) {
|
|
- match = bss_ptr;
|
|
- break;
|
|
- }
|
|
- }
|
|
+ ieee80211_tx_status_irqsafe(priv->hw, priv->tx_skb);
|
|
+
|
|
+ priv->tx_skb = NULL;
|
|
+
|
|
+ ieee80211_wake_queues(priv->hw);
|
|
+}
|
|
+
|
|
+static int at76_mac80211_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|
+{
|
|
+ struct at76_priv *priv = hw->priv;
|
|
+ struct at76_tx_buffer *tx_buffer = priv->bulk_out_buffer;
|
|
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
+ int padding, submit_len, ret;
|
|
+
|
|
+ at76_dbg(DBG_MAC80211, "%s()", __func__);
|
|
+
|
|
+ if (priv->tx_urb->status == -EINPROGRESS) {
|
|
+ printk(KERN_ERR "%s: %s called while tx urb is pending\n",
|
|
+ wiphy_name(priv->hw->wiphy), __func__);
|
|
+ return NETDEV_TX_BUSY;
|
|
}
|
|
|
|
- if (!match) {
|
|
- /* BSS not in the list - append it */
|
|
- match = kzalloc(sizeof(struct bss_info), GFP_ATOMIC);
|
|
- if (!match) {
|
|
- at76_dbg(DBG_BSS_TABLE,
|
|
- "%s: cannot kmalloc new bss info (%zd byte)",
|
|
- priv->netdev->name, sizeof(struct bss_info));
|
|
- goto exit;
|
|
- }
|
|
- new_entry = 1;
|
|
- list_add_tail(&match->list, &priv->bss_list);
|
|
+ ieee80211_stop_queues(hw);
|
|
+
|
|
+ at76_ledtrig_tx_activity(); /* tell ledtrigger we send a packet */
|
|
+
|
|
+ WARN_ON(priv->tx_skb != NULL);
|
|
+
|
|
+ priv->tx_skb = skb;
|
|
+ padding = at76_calc_padding(skb->len);
|
|
+ submit_len = AT76_TX_HDRLEN + skb->len + padding;
|
|
+
|
|
+ /* setup 'Atmel' header */
|
|
+ memset(tx_buffer, 0, sizeof(*tx_buffer));
|
|
+ tx_buffer->padding = padding;
|
|
+ tx_buffer->wlength = cpu_to_le16(skb->len);
|
|
+ tx_buffer->tx_rate = ieee80211_get_tx_rate(hw, info)->hw_value;
|
|
+ if (FIRMWARE_IS_WPA(priv->fw_version) && info->control.hw_key) {
|
|
+ tx_buffer->key_id = (info->control.hw_key->keyidx);
|
|
+ tx_buffer->cipher_type =
|
|
+ priv->keys[info->control.hw_key->keyidx].cipher;
|
|
+ tx_buffer->cipher_length =
|
|
+ priv->keys[info->control.hw_key->keyidx].keylen;
|
|
+ tx_buffer->reserved = 0;
|
|
+ } else {
|
|
+ tx_buffer->key_id = 0;
|
|
+ tx_buffer->cipher_type = 0;
|
|
+ tx_buffer->cipher_length = 0;
|
|
+ tx_buffer->reserved = 0;
|
|
+ };
|
|
+ /* memset(tx_buffer->reserved, 0, sizeof(tx_buffer->reserved)); */
|
|
+ memcpy(tx_buffer->packet, skb->data, skb->len);
|
|
+
|
|
+ at76_dbg(DBG_TX_DATA, "%s tx: wlen 0x%x pad 0x%x rate %d hdr",
|
|
+ wiphy_name(priv->hw->wiphy), le16_to_cpu(tx_buffer->wlength),
|
|
+ tx_buffer->padding, tx_buffer->tx_rate);
|
|
+
|
|
+ /* send stuff */
|
|
+ at76_dbg_dump(DBG_TX_DATA_CONTENT, tx_buffer, submit_len,
|
|
+ "%s(): tx_buffer %d bytes:", __func__, submit_len);
|
|
+ usb_fill_bulk_urb(priv->tx_urb, priv->udev, priv->tx_pipe, tx_buffer,
|
|
+ submit_len, at76_mac80211_tx_callback, priv);
|
|
+ ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
|
|
+ if (ret) {
|
|
+ printk(KERN_ERR "%s: error in tx submit urb: %d\n",
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
+ if (ret == -EINVAL)
|
|
+ printk(KERN_ERR
|
|
+ "%s: -EINVAL: tx urb %p hcpriv %p complete %p\n",
|
|
+ wiphy_name(priv->hw->wiphy), priv->tx_urb,
|
|
+ priv->tx_urb->hcpriv, priv->tx_urb->complete);
|
|
}
|
|
|
|
- match->capa = le16_to_cpu(bdata->capability);
|
|
- match->beacon_interval = le16_to_cpu(bdata->beacon_interval);
|
|
- match->rssi = buf->rssi;
|
|
- match->link_qual = buf->link_quality;
|
|
- match->noise_level = buf->noise_level;
|
|
- memcpy(match->bssid, mgmt->addr3, ETH_ALEN);
|
|
- at76_dbg(DBG_RX_BEACON, "%s: bssid %s", priv->netdev->name,
|
|
- mac2str(match->bssid));
|
|
-
|
|
- ie = bdata->info_element;
|
|
-
|
|
- /* length of var length beacon parameters */
|
|
- varpar_len = min_t(int, le16_to_cpu(buf->wlength) -
|
|
- sizeof(struct ieee80211_beacon),
|
|
- BEACON_MAX_DATA_LENGTH);
|
|
-
|
|
- /* This routine steps through the bdata->data array to get
|
|
- * some useful information about the access point.
|
|
- * Currently, this implementation supports receipt of: SSID,
|
|
- * supported transfer rates and channel, in any order, with some
|
|
- * tolerance for intermittent unknown codes (although this
|
|
- * functionality may not be necessary as the useful information will
|
|
- * usually arrive in consecutively, but there have been some
|
|
- * reports of some of the useful information fields arriving in a
|
|
- * different order).
|
|
- * It does not support any more IE types although MFIE_TYPE_TIM may
|
|
- * be supported (on my AP at least).
|
|
- * The bdata->data array is about 1500 bytes long but only ~36 of those
|
|
- * bytes are useful, hence the have_ssid etc optimizations. */
|
|
-
|
|
- while (keep_going &&
|
|
- ((&ie->data[ie->len] - (u8 *)bdata->info_element) <=
|
|
- varpar_len)) {
|
|
+ return 0;
|
|
+}
|
|
|
|
- switch (ie->id) {
|
|
+static int at76_mac80211_start(struct ieee80211_hw *hw)
|
|
+{
|
|
+ struct at76_priv *priv = hw->priv;
|
|
+ int ret;
|
|
|
|
- case MFIE_TYPE_SSID:
|
|
- if (have_ssid)
|
|
- break;
|
|
+ at76_dbg(DBG_MAC80211, "%s()", __func__);
|
|
|
|
- len = min_t(int, IW_ESSID_MAX_SIZE, ie->len);
|
|
+ mutex_lock(&priv->mtx);
|
|
|
|
- /* we copy only if this is a new entry,
|
|
- or the incoming SSID is not a hidden SSID. This
|
|
- will protect us from overwriting a real SSID read
|
|
- in a ProbeResponse with a hidden one from a
|
|
- following beacon. */
|
|
- if (!new_entry && at76_is_hidden_ssid(ie->data, len)) {
|
|
- have_ssid = 1;
|
|
- break;
|
|
- }
|
|
+ ret = at76_submit_rx_urb(priv);
|
|
+ if (ret < 0) {
|
|
+ printk(KERN_ERR "%s: open: submit_rx_urb failed: %d\n",
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
+ goto error;
|
|
+ }
|
|
|
|
- match->ssid_len = len;
|
|
- memcpy(match->ssid, ie->data, len);
|
|
- at76_dbg(DBG_RX_BEACON, "%s: SSID - %.*s",
|
|
- priv->netdev->name, len, match->ssid);
|
|
- have_ssid = 1;
|
|
- break;
|
|
+ at76_startup_device(priv);
|
|
|
|
- case MFIE_TYPE_RATES:
|
|
- if (have_rates)
|
|
- break;
|
|
+ at76_start_monitor(priv);
|
|
|
|
- match->rates_len =
|
|
- min_t(int, sizeof(match->rates), ie->len);
|
|
- memcpy(match->rates, ie->data, match->rates_len);
|
|
- have_rates = 1;
|
|
- at76_dbg(DBG_RX_BEACON, "%s: SUPPORTED RATES %s",
|
|
- priv->netdev->name,
|
|
- hex2str(ie->data, ie->len));
|
|
- break;
|
|
+error:
|
|
+ mutex_unlock(&priv->mtx);
|
|
|
|
- case MFIE_TYPE_DS_SET:
|
|
- if (have_channel)
|
|
- break;
|
|
+ return 0;
|
|
+}
|
|
|
|
- match->channel = ie->data[0];
|
|
- have_channel = 1;
|
|
- at76_dbg(DBG_RX_BEACON, "%s: CHANNEL - %d",
|
|
- priv->netdev->name, match->channel);
|
|
- break;
|
|
+static void at76_mac80211_stop(struct ieee80211_hw *hw)
|
|
+{
|
|
+ struct at76_priv *priv = hw->priv;
|
|
|
|
- case MFIE_TYPE_CF_SET:
|
|
- case MFIE_TYPE_TIM:
|
|
- case MFIE_TYPE_IBSS_SET:
|
|
- default:
|
|
- at76_dbg(DBG_RX_BEACON, "%s: beacon IE id %d len %d %s",
|
|
- priv->netdev->name, ie->id, ie->len,
|
|
- hex2str(ie->data, ie->len));
|
|
- break;
|
|
- }
|
|
+ at76_dbg(DBG_MAC80211, "%s()", __func__);
|
|
|
|
- /* advance to the next informational element */
|
|
- next_ie(&ie);
|
|
+ mutex_lock(&priv->mtx);
|
|
+
|
|
+ if (!priv->device_unplugged) {
|
|
+ /* We are called by "ifconfig ethX down", not because the
|
|
+ * device is not available anymore. */
|
|
+ if (at76_set_radio(priv, 0) == 1)
|
|
+ at76_wait_completion(priv, CMD_RADIO_ON);
|
|
+
|
|
+ /* We unlink rx_urb because at76_open() re-submits it.
|
|
+ * If unplugged, at76_delete_device() takes care of it. */
|
|
+ usb_kill_urb(priv->rx_urb);
|
|
+ }
|
|
+
|
|
+ mutex_unlock(&priv->mtx);
|
|
+}
|
|
+
|
|
+static int at76_add_interface(struct ieee80211_hw *hw,
|
|
+ struct ieee80211_if_init_conf *conf)
|
|
+{
|
|
+ struct at76_priv *priv = hw->priv;
|
|
+ int ret = 0;
|
|
|
|
- /* Optimization: after all, the bdata->data array is
|
|
- * varpar_len bytes long, whereas we get all of the useful
|
|
- * information after only ~36 bytes, this saves us a lot of
|
|
- * time (and trouble as the remaining portion of the array
|
|
- * could be full of junk)
|
|
- * Comment this out if you want to see what other information
|
|
- * comes from the AP - although little of it may be useful */
|
|
- }
|
|
+ at76_dbg(DBG_MAC80211, "%s()", __func__);
|
|
|
|
- at76_dbg(DBG_RX_BEACON, "%s: Finished processing beacon data",
|
|
- priv->netdev->name);
|
|
+ mutex_lock(&priv->mtx);
|
|
|
|
- match->last_rx = jiffies; /* record last rx of beacon */
|
|
+ switch (conf->type) {
|
|
+ case NL80211_IFTYPE_STATION:
|
|
+ priv->iw_mode = IW_MODE_INFRA;
|
|
+ break;
|
|
+ default:
|
|
+ ret = -EOPNOTSUPP;
|
|
+ goto exit;
|
|
+ }
|
|
|
|
exit:
|
|
- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
|
|
+ mutex_unlock(&priv->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
-/* Calculate the link level from a given rx_buffer */
|
|
-static void at76_calc_level(struct at76_priv *priv, struct at76_rx_buffer *buf,
|
|
- struct iw_quality *qual)
|
|
+static void at76_remove_interface(struct ieee80211_hw *hw,
|
|
+ struct ieee80211_if_init_conf *conf)
|
|
{
|
|
- /* just a guess for now, might be different for other chips */
|
|
- int max_rssi = 42;
|
|
-
|
|
- qual->level = (buf->rssi * 100 / max_rssi);
|
|
- if (qual->level > 100)
|
|
- qual->level = 100;
|
|
- qual->updated |= IW_QUAL_LEVEL_UPDATED;
|
|
+ at76_dbg(DBG_MAC80211, "%s()", __func__);
|
|
}
|
|
|
|
-/* Calculate the link quality from a given rx_buffer */
|
|
-static void at76_calc_qual(struct at76_priv *priv, struct at76_rx_buffer *buf,
|
|
- struct iw_quality *qual)
|
|
+static int at76_join(struct at76_priv *priv)
|
|
{
|
|
- if (at76_is_intersil(priv->board_type))
|
|
- qual->qual = buf->link_quality;
|
|
- else {
|
|
- unsigned long elapsed;
|
|
+ struct at76_req_join join;
|
|
+ int ret;
|
|
|
|
- /* Update qual at most once a second */
|
|
- elapsed = jiffies - priv->beacons_last_qual;
|
|
- if (elapsed < 1 * HZ)
|
|
- return;
|
|
+ memset(&join, 0, sizeof(struct at76_req_join));
|
|
+ memcpy(join.essid, priv->essid, priv->essid_size);
|
|
+ join.essid_size = priv->essid_size;
|
|
+ memcpy(join.bssid, priv->bssid, ETH_ALEN);
|
|
+ join.bss_type = INFRASTRUCTURE_MODE;
|
|
+ join.channel = priv->channel;
|
|
+ join.timeout = cpu_to_le16(2000);
|
|
|
|
- qual->qual = qual->level * priv->beacons_received *
|
|
- msecs_to_jiffies(priv->beacon_period) / elapsed;
|
|
+ at76_dbg(DBG_MAC80211, "%s: sending CMD_JOIN", __func__);
|
|
+ ret = at76_set_card_command(priv->udev, CMD_JOIN, &join,
|
|
+ sizeof(struct at76_req_join));
|
|
|
|
- priv->beacons_last_qual = jiffies;
|
|
- priv->beacons_received = 0;
|
|
+ if (ret < 0) {
|
|
+ printk(KERN_ERR "%s: at76_set_card_command failed: %d\n",
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
+ return 0;
|
|
}
|
|
- qual->qual = (qual->qual > 100) ? 100 : qual->qual;
|
|
- qual->updated |= IW_QUAL_QUAL_UPDATED;
|
|
-}
|
|
|
|
-/* Calculate the noise quality from a given rx_buffer */
|
|
-static void at76_calc_noise(struct at76_priv *priv, struct at76_rx_buffer *buf,
|
|
- struct iw_quality *qual)
|
|
-{
|
|
- qual->noise = 0;
|
|
- qual->updated |= IW_QUAL_NOISE_INVALID;
|
|
-}
|
|
+ ret = at76_wait_completion(priv, CMD_JOIN);
|
|
+ at76_dbg(DBG_MAC80211, "%s: CMD_JOIN returned: 0x%02x", __func__, ret);
|
|
+ if (ret != CMD_STATUS_COMPLETE) {
|
|
+ printk(KERN_ERR "%s: at76_wait_completion failed: %d\n",
|
|
+ wiphy_name(priv->hw->wiphy), ret);
|
|
+ return 0;
|
|
+ }
|
|
|
|
-static void at76_update_wstats(struct at76_priv *priv,
|
|
- struct at76_rx_buffer *buf)
|
|
-{
|
|
- struct iw_quality *qual = &priv->wstats.qual;
|
|
+ at76_set_tkip_bssid(priv, priv->bssid);
|
|
+ at76_set_pm_mode(priv);
|
|
|
|
- if (buf->rssi && priv->mac_state == MAC_CONNECTED) {
|
|
- qual->updated = 0;
|
|
- at76_calc_level(priv, buf, qual);
|
|
- at76_calc_qual(priv, buf, qual);
|
|
- at76_calc_noise(priv, buf, qual);
|
|
- } else {
|
|
- qual->qual = 0;
|
|
- qual->level = 0;
|
|
- qual->noise = 0;
|
|
- qual->updated = IW_QUAL_ALL_INVALID;
|
|
- }
|
|
+ return 0;
|
|
}
|
|
|
|
-static void at76_rx_mgmt(struct at76_priv *priv, struct at76_rx_buffer *buf)
|
|
-{
|
|
- struct ieee80211_hdr_3addr *mgmt =
|
|
- (struct ieee80211_hdr_3addr *)buf->packet;
|
|
- u16 framectl = le16_to_cpu(mgmt->frame_ctl);
|
|
-
|
|
- /* update wstats */
|
|
- if (priv->mac_state != MAC_INIT && priv->mac_state != MAC_SCANNING) {
|
|
- /* jal: this is a dirty hack needed by Tim in ad-hoc mode */
|
|
- /* Data packets always seem to have a 0 link level, so we
|
|
- only read link quality info from management packets.
|
|
- Atmel driver actually averages the present, and previous
|
|
- values, we just present the raw value at the moment - TJS */
|
|
- if (priv->iw_mode == IW_MODE_ADHOC
|
|
- || (priv->curr_bss
|
|
- && !compare_ether_addr(mgmt->addr3,
|
|
- priv->curr_bss->bssid)))
|
|
- at76_update_wstats(priv, buf);
|
|
- }
|
|
-
|
|
- at76_dbg(DBG_RX_MGMT_CONTENT, "%s rx mgmt framectl 0x%x %s",
|
|
- priv->netdev->name, framectl,
|
|
- hex2str(mgmt, le16_to_cpu(buf->wlength)));
|
|
-
|
|
- switch (framectl & IEEE80211_FCTL_STYPE) {
|
|
- case IEEE80211_STYPE_BEACON:
|
|
- case IEEE80211_STYPE_PROBE_RESP:
|
|
- at76_rx_mgmt_beacon(priv, buf);
|
|
- break;
|
|
+static void at76_dwork_hw_scan(struct work_struct *work)
|
|
+{
|
|
+ struct at76_priv *priv = container_of(work, struct at76_priv,
|
|
+ dwork_hw_scan.work);
|
|
+ int ret;
|
|
|
|
- case IEEE80211_STYPE_ASSOC_RESP:
|
|
- at76_rx_mgmt_assoc(priv, buf);
|
|
- break;
|
|
+ ret = at76_get_cmd_status(priv->udev, CMD_SCAN);
|
|
+ at76_dbg(DBG_MAC80211, "%s: CMD_SCAN status 0x%02x", __func__, ret);
|
|
|
|
- case IEEE80211_STYPE_DISASSOC:
|
|
- at76_rx_mgmt_disassoc(priv, buf);
|
|
- break;
|
|
+ /* FIXME: add maximum time for scan to complete */
|
|
|
|
- case IEEE80211_STYPE_AUTH:
|
|
- at76_rx_mgmt_auth(priv, buf);
|
|
- break;
|
|
+ if (ret != CMD_STATUS_COMPLETE) {
|
|
+ queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
|
|
+ SCAN_POLL_INTERVAL);
|
|
+ goto exit;
|
|
+ }
|
|
|
|
- case IEEE80211_STYPE_DEAUTH:
|
|
- at76_rx_mgmt_deauth(priv, buf);
|
|
- break;
|
|
+ ieee80211_scan_completed(priv->hw);
|
|
|
|
- default:
|
|
- printk(KERN_DEBUG "%s: ignoring frame with framectl 0x%04x\n",
|
|
- priv->netdev->name, framectl);
|
|
+ if (is_valid_ether_addr(priv->bssid)) {
|
|
+ ieee80211_wake_queues(priv->hw);
|
|
+ at76_join(priv);
|
|
}
|
|
|
|
+ ieee80211_wake_queues(priv->hw);
|
|
+
|
|
+exit:
|
|
return;
|
|
}
|
|
|
|
-/* Convert the 802.11 header into an ethernet-style header, make skb
|
|
- * ready for consumption by netif_rx() */
|
|
-static void at76_ieee80211_to_eth(struct sk_buff *skb, int iw_mode)
|
|
-{
|
|
- struct ieee80211_hdr_3addr *i802_11_hdr;
|
|
- struct ethhdr *eth_hdr_p;
|
|
- u8 *src_addr;
|
|
- u8 *dest_addr;
|
|
-
|
|
- i802_11_hdr = (struct ieee80211_hdr_3addr *)skb->data;
|
|
-
|
|
- /* That would be the ethernet header if the hardware converted
|
|
- * the frame for us. Make sure the source and the destination
|
|
- * match the 802.11 header. Which hardware does it? */
|
|
- eth_hdr_p = (struct ethhdr *)skb_pull(skb, IEEE80211_3ADDR_LEN);
|
|
-
|
|
- dest_addr = i802_11_hdr->addr1;
|
|
- if (iw_mode == IW_MODE_ADHOC)
|
|
- src_addr = i802_11_hdr->addr2;
|
|
- else
|
|
- src_addr = i802_11_hdr->addr3;
|
|
-
|
|
- if (!compare_ether_addr(eth_hdr_p->h_source, src_addr) &&
|
|
- !compare_ether_addr(eth_hdr_p->h_dest, dest_addr))
|
|
- /* Yes, we already have an ethernet header */
|
|
- skb_reset_mac_header(skb);
|
|
- else {
|
|
- u16 len;
|
|
-
|
|
- /* Need to build an ethernet header */
|
|
- if (!memcmp(skb->data, snapsig, sizeof(snapsig))) {
|
|
- /* SNAP frame - decapsulate, keep proto */
|
|
- skb_push(skb, offsetof(struct ethhdr, h_proto) -
|
|
- sizeof(rfc1042sig));
|
|
- len = 0;
|
|
- } else {
|
|
- /* 802.3 frame, proto is length */
|
|
- len = skb->len;
|
|
- skb_push(skb, ETH_HLEN);
|
|
- }
|
|
-
|
|
- skb_reset_mac_header(skb);
|
|
- eth_hdr_p = eth_hdr(skb);
|
|
- /* This needs to be done in this order (eth_hdr_p->h_dest may
|
|
- * overlap src_addr) */
|
|
- memcpy(eth_hdr_p->h_source, src_addr, ETH_ALEN);
|
|
- memcpy(eth_hdr_p->h_dest, dest_addr, ETH_ALEN);
|
|
- if (len)
|
|
- eth_hdr_p->h_proto = htons(len);
|
|
- }
|
|
-
|
|
- skb->protocol = eth_type_trans(skb, skb->dev);
|
|
-}
|
|
-
|
|
-/* Check for fragmented data in priv->rx_skb. If the packet was no fragment
|
|
- or it was the last of a fragment set a skb containing the whole packet
|
|
- is returned for further processing. Otherwise we get NULL and are
|
|
- done and the packet is either stored inside the fragment buffer
|
|
- or thrown away. Every returned skb starts with the ieee802_11 header
|
|
- and contains _no_ FCS at the end */
|
|
-static struct sk_buff *at76_check_for_rx_frags(struct at76_priv *priv)
|
|
+static int at76_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len)
|
|
{
|
|
- struct sk_buff *skb = priv->rx_skb;
|
|
- struct at76_rx_buffer *buf = (struct at76_rx_buffer *)skb->data;
|
|
- struct ieee80211_hdr_3addr *i802_11_hdr =
|
|
- (struct ieee80211_hdr_3addr *)buf->packet;
|
|
- /* seq_ctrl, fragment_number, sequence number of new packet */
|
|
- u16 sctl = le16_to_cpu(i802_11_hdr->seq_ctl);
|
|
- u16 fragnr = sctl & 0xf;
|
|
- u16 seqnr = sctl >> 4;
|
|
- u16 frame_ctl = le16_to_cpu(i802_11_hdr->frame_ctl);
|
|
-
|
|
- /* Length including the IEEE802.11 header, but without the trailing
|
|
- * FCS and without the Atmel Rx header */
|
|
- int length = le16_to_cpu(buf->wlength) - IEEE80211_FCS_LEN;
|
|
-
|
|
- /* where does the data payload start in skb->data ? */
|
|
- u8 *data = i802_11_hdr->payload;
|
|
-
|
|
- /* length of payload, excl. the trailing FCS */
|
|
- int data_len = length - IEEE80211_3ADDR_LEN;
|
|
-
|
|
- int i;
|
|
- struct rx_data_buf *bptr, *optr;
|
|
- unsigned long oldest = ~0UL;
|
|
-
|
|
- at76_dbg(DBG_RX_FRAGS,
|
|
- "%s: rx data frame_ctl %04x addr2 %s seq/frag %d/%d "
|
|
- "length %d data %d: %s ...", priv->netdev->name, frame_ctl,
|
|
- mac2str(i802_11_hdr->addr2), seqnr, fragnr, length, data_len,
|
|
- hex2str(data, 32));
|
|
-
|
|
- at76_dbg(DBG_RX_FRAGS_SKB, "%s: incoming skb: head %p data %p "
|
|
- "tail %p end %p len %d", priv->netdev->name, skb->head,
|
|
- skb->data, skb_tail_pointer(skb), skb_end_pointer(skb),
|
|
- skb->len);
|
|
-
|
|
- if (data_len < 0) {
|
|
- /* make sure data starts in the buffer */
|
|
- printk(KERN_INFO "%s: data frame too short\n",
|
|
- priv->netdev->name);
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- WARN_ON(length <= AT76_RX_HDRLEN);
|
|
- if (length <= AT76_RX_HDRLEN)
|
|
- return NULL;
|
|
+ struct at76_priv *priv = hw->priv;
|
|
+ struct at76_req_scan scan;
|
|
+ int ret;
|
|
|
|
- /* remove the at76_rx_buffer header - we don't need it anymore */
|
|
- /* we need the IEEE802.11 header (for the addresses) if this packet
|
|
- is the first of a chain */
|
|
- skb_pull(skb, AT76_RX_HDRLEN);
|
|
-
|
|
- /* remove FCS at end */
|
|
- skb_trim(skb, length);
|
|
-
|
|
- at76_dbg(DBG_RX_FRAGS_SKB, "%s: trimmed skb: head %p data %p tail %p "
|
|
- "end %p len %d data %p data_len %d", priv->netdev->name,
|
|
- skb->head, skb->data, skb_tail_pointer(skb),
|
|
- skb_end_pointer(skb), skb->len, data, data_len);
|
|
-
|
|
- if (fragnr == 0 && !(frame_ctl & IEEE80211_FCTL_MOREFRAGS)) {
|
|
- /* unfragmented packet received */
|
|
- /* Use a new skb for the next receive */
|
|
- priv->rx_skb = NULL;
|
|
- at76_dbg(DBG_RX_FRAGS, "%s: unfragmented", priv->netdev->name);
|
|
- return skb;
|
|
- }
|
|
-
|
|
- /* look if we've got a chain for the sender address.
|
|
- afterwards optr points to first free or the oldest entry,
|
|
- or, if i < NR_RX_DATA_BUF, bptr points to the entry for the
|
|
- sender address */
|
|
- /* determining the oldest entry doesn't cope with jiffies wrapping
|
|
- but I don't care to delete a young entry at these rare moments ... */
|
|
-
|
|
- bptr = priv->rx_data;
|
|
- optr = NULL;
|
|
- for (i = 0; i < NR_RX_DATA_BUF; i++, bptr++) {
|
|
- if (!bptr->skb) {
|
|
- optr = bptr;
|
|
- oldest = 0UL;
|
|
- continue;
|
|
- }
|
|
+ at76_dbg(DBG_MAC80211, "%s():", __func__);
|
|
+ at76_dbg_dump(DBG_MAC80211, ssid, len, "ssid %zd bytes:", len);
|
|
|
|
- if (!compare_ether_addr(i802_11_hdr->addr2, bptr->sender))
|
|
- break;
|
|
+ mutex_lock(&priv->mtx);
|
|
|
|
- if (!optr) {
|
|
- optr = bptr;
|
|
- oldest = bptr->last_rx;
|
|
- } else if (bptr->last_rx < oldest)
|
|
- optr = bptr;
|
|
- }
|
|
-
|
|
- if (i < NR_RX_DATA_BUF) {
|
|
-
|
|
- at76_dbg(DBG_RX_FRAGS, "%s: %d. cacheentry (seq/frag = %d/%d) "
|
|
- "matched sender addr",
|
|
- priv->netdev->name, i, bptr->seqnr, bptr->fragnr);
|
|
-
|
|
- /* bptr points to an entry for the sender address */
|
|
- if (bptr->seqnr == seqnr) {
|
|
- int left;
|
|
- /* the fragment has the current sequence number */
|
|
- if (((bptr->fragnr + 1) & 0xf) != fragnr) {
|
|
- /* wrong fragment number -> ignore it */
|
|
- /* is & 0xf necessary above ??? */
|
|
- at76_dbg(DBG_RX_FRAGS,
|
|
- "%s: frag nr mismatch: %d + 1 != %d",
|
|
- priv->netdev->name, bptr->fragnr,
|
|
- fragnr);
|
|
- return NULL;
|
|
- }
|
|
- bptr->last_rx = jiffies;
|
|
- /* the next following fragment number ->
|
|
- add the data at the end */
|
|
-
|
|
- /* for test only ??? */
|
|
- left = skb_tailroom(bptr->skb);
|
|
- if (left < data_len)
|
|
- printk(KERN_INFO
|
|
- "%s: only %d byte free (need %d)\n",
|
|
- priv->netdev->name, left, data_len);
|
|
- else
|
|
- memcpy(skb_put(bptr->skb, data_len), data,
|
|
- data_len);
|
|
-
|
|
- bptr->fragnr = fragnr;
|
|
- if (frame_ctl & IEEE80211_FCTL_MOREFRAGS)
|
|
- return NULL;
|
|
-
|
|
- /* this was the last fragment - send it */
|
|
- skb = bptr->skb;
|
|
- bptr->skb = NULL; /* free the entry */
|
|
- at76_dbg(DBG_RX_FRAGS, "%s: last frag of seq %d",
|
|
- priv->netdev->name, seqnr);
|
|
- return skb;
|
|
- }
|
|
+ ieee80211_stop_queues(hw);
|
|
|
|
- /* got another sequence number */
|
|
- if (fragnr == 0) {
|
|
- /* it's the start of a new chain - replace the
|
|
- old one by this */
|
|
- /* bptr->sender has the correct value already */
|
|
- at76_dbg(DBG_RX_FRAGS,
|
|
- "%s: start of new seq %d, removing old seq %d",
|
|
- priv->netdev->name, seqnr, bptr->seqnr);
|
|
- bptr->seqnr = seqnr;
|
|
- bptr->fragnr = 0;
|
|
- bptr->last_rx = jiffies;
|
|
- /* swap bptr->skb and priv->rx_skb */
|
|
- skb = bptr->skb;
|
|
- bptr->skb = priv->rx_skb;
|
|
- priv->rx_skb = skb;
|
|
- } else {
|
|
- /* it from the middle of a new chain ->
|
|
- delete the old entry and skip the new one */
|
|
- at76_dbg(DBG_RX_FRAGS,
|
|
- "%s: middle of new seq %d (%d) "
|
|
- "removing old seq %d",
|
|
- priv->netdev->name, seqnr, fragnr,
|
|
- bptr->seqnr);
|
|
- dev_kfree_skb(bptr->skb);
|
|
- bptr->skb = NULL;
|
|
- }
|
|
- return NULL;
|
|
+ memset(&scan, 0, sizeof(struct at76_req_scan));
|
|
+ memset(scan.bssid, 0xFF, ETH_ALEN);
|
|
+ scan.scan_type = SCAN_TYPE_ACTIVE;
|
|
+ if (priv->essid_size > 0) {
|
|
+ memcpy(scan.essid, ssid, len);
|
|
+ scan.essid_size = len;
|
|
}
|
|
+ scan.min_channel_time = cpu_to_le16(priv->scan_min_time);
|
|
+ scan.max_channel_time = cpu_to_le16(priv->scan_max_time);
|
|
+ scan.probe_delay = cpu_to_le16(priv->scan_min_time * 1000);
|
|
+ scan.international_scan = 0;
|
|
|
|
- /* if we didn't find a chain for the sender address, optr
|
|
- points either to the first free or the oldest entry */
|
|
+ at76_dbg(DBG_MAC80211, "%s: sending CMD_SCAN", __func__);
|
|
+ ret = at76_set_card_command(priv->udev, CMD_SCAN, &scan, sizeof(scan));
|
|
|
|
- if (fragnr != 0) {
|
|
- /* this is not the begin of a fragment chain ... */
|
|
- at76_dbg(DBG_RX_FRAGS,
|
|
- "%s: no chain for non-first fragment (%d)",
|
|
- priv->netdev->name, fragnr);
|
|
- return NULL;
|
|
+ if (ret < 0) {
|
|
+ err("CMD_SCAN failed: %d", ret);
|
|
+ goto exit;
|
|
}
|
|
|
|
- BUG_ON(!optr);
|
|
- if (optr->skb) {
|
|
- /* swap the skb's */
|
|
- skb = optr->skb;
|
|
- optr->skb = priv->rx_skb;
|
|
- priv->rx_skb = skb;
|
|
-
|
|
- at76_dbg(DBG_RX_FRAGS,
|
|
- "%s: free old contents: sender %s seq/frag %d/%d",
|
|
- priv->netdev->name, mac2str(optr->sender),
|
|
- optr->seqnr, optr->fragnr);
|
|
+ queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
|
|
+ SCAN_POLL_INTERVAL);
|
|
|
|
- } else {
|
|
- /* take the skb from priv->rx_skb */
|
|
- optr->skb = priv->rx_skb;
|
|
- /* let at76_submit_rx_urb() allocate a new skb */
|
|
- priv->rx_skb = NULL;
|
|
-
|
|
- at76_dbg(DBG_RX_FRAGS, "%s: use a free entry",
|
|
- priv->netdev->name);
|
|
- }
|
|
- memcpy(optr->sender, i802_11_hdr->addr2, ETH_ALEN);
|
|
- optr->seqnr = seqnr;
|
|
- optr->fragnr = 0;
|
|
- optr->last_rx = jiffies;
|
|
+exit:
|
|
+ mutex_unlock(&priv->mtx);
|
|
|
|
- return NULL;
|
|
+ return 0;
|
|
}
|
|
|
|
-/* Rx interrupt: we expect the complete data buffer in priv->rx_skb */
|
|
-static void at76_rx_data(struct at76_priv *priv)
|
|
+static int at76_config(struct ieee80211_hw *hw, u32 changed)
|
|
{
|
|
- struct net_device *netdev = priv->netdev;
|
|
- struct net_device_stats *stats = &priv->stats;
|
|
- struct sk_buff *skb = priv->rx_skb;
|
|
- struct at76_rx_buffer *buf = (struct at76_rx_buffer *)skb->data;
|
|
- struct ieee80211_hdr_3addr *i802_11_hdr;
|
|
- int length = le16_to_cpu(buf->wlength);
|
|
-
|
|
- at76_dbg(DBG_RX_DATA, "%s received data packet: %s", netdev->name,
|
|
- hex2str(skb->data, AT76_RX_HDRLEN));
|
|
+ struct at76_priv *priv = hw->priv;
|
|
+ struct ieee80211_conf *conf = &hw->conf;
|
|
|
|
- at76_dbg(DBG_RX_DATA_CONTENT, "rx packet: %s",
|
|
- hex2str(skb->data + AT76_RX_HDRLEN, length));
|
|
+ at76_dbg(DBG_MAC80211, "%s(): channel %d radio %d",
|
|
+ __func__, conf->channel->hw_value, conf->radio_enabled);
|
|
+ at76_dbg_dump(DBG_MAC80211, priv->essid, priv->essid_size, "ssid:");
|
|
+ at76_dbg_dump(DBG_MAC80211, priv->bssid, ETH_ALEN, "bssid:");
|
|
|
|
- skb = at76_check_for_rx_frags(priv);
|
|
- if (!skb)
|
|
- return;
|
|
+ mutex_lock(&priv->mtx);
|
|
|
|
- /* Atmel header and the FCS are already removed */
|
|
- i802_11_hdr = (struct ieee80211_hdr_3addr *)skb->data;
|
|
+ priv->channel = conf->channel->hw_value;
|
|
|
|
- skb->dev = netdev;
|
|
- skb->ip_summed = CHECKSUM_NONE; /* TODO: should check CRC */
|
|
+ if (is_valid_ether_addr(priv->bssid)) {
|
|
+ at76_join(priv);
|
|
+ ieee80211_wake_queues(priv->hw);
|
|
+ } else {
|
|
+ ieee80211_stop_queues(priv->hw);
|
|
+ at76_start_monitor(priv);
|
|
+ };
|
|
|
|
- if (is_broadcast_ether_addr(i802_11_hdr->addr1)) {
|
|
- if (!compare_ether_addr(i802_11_hdr->addr1, netdev->broadcast))
|
|
- skb->pkt_type = PACKET_BROADCAST;
|
|
- else
|
|
- skb->pkt_type = PACKET_MULTICAST;
|
|
- } else if (compare_ether_addr(i802_11_hdr->addr1, netdev->dev_addr))
|
|
- skb->pkt_type = PACKET_OTHERHOST;
|
|
-
|
|
- at76_ieee80211_to_eth(skb, priv->iw_mode);
|
|
-
|
|
- netdev->last_rx = jiffies;
|
|
- netif_rx(skb);
|
|
- stats->rx_packets++;
|
|
- stats->rx_bytes += length;
|
|
+ mutex_unlock(&priv->mtx);
|
|
|
|
- return;
|
|
+ return 0;
|
|
}
|
|
|
|
-static void at76_rx_monitor_mode(struct at76_priv *priv)
|
|
+static int at76_config_interface(struct ieee80211_hw *hw,
|
|
+ struct ieee80211_vif *vif,
|
|
+ struct ieee80211_if_conf *conf)
|
|
{
|
|
- struct at76_rx_radiotap *rt;
|
|
- u8 *payload;
|
|
- int skblen;
|
|
- struct net_device *netdev = priv->netdev;
|
|
- struct at76_rx_buffer *buf =
|
|
- (struct at76_rx_buffer *)priv->rx_skb->data;
|
|
- /* length including the IEEE802.11 header and the trailing FCS,
|
|
- but not at76_rx_buffer */
|
|
- int length = le16_to_cpu(buf->wlength);
|
|
- struct sk_buff *skb = priv->rx_skb;
|
|
- struct net_device_stats *stats = &priv->stats;
|
|
-
|
|
- if (length < IEEE80211_FCS_LEN) {
|
|
- /* buffer contains no data */
|
|
- at76_dbg(DBG_MONITOR_MODE,
|
|
- "%s: MONITOR MODE: rx skb without data",
|
|
- priv->netdev->name);
|
|
- return;
|
|
- }
|
|
-
|
|
- skblen = sizeof(struct at76_rx_radiotap) + length;
|
|
+ struct at76_priv *priv = hw->priv;
|
|
|
|
- skb = dev_alloc_skb(skblen);
|
|
- if (!skb) {
|
|
- printk(KERN_ERR "%s: MONITOR MODE: dev_alloc_skb for radiotap "
|
|
- "header returned NULL\n", priv->netdev->name);
|
|
- return;
|
|
- }
|
|
+ at76_dbg_dump(DBG_MAC80211, conf->bssid, ETH_ALEN, "bssid:");
|
|
|
|
- skb_put(skb, skblen);
|
|
+ mutex_lock(&priv->mtx);
|
|
|
|
- rt = (struct at76_rx_radiotap *)skb->data;
|
|
- payload = skb->data + sizeof(struct at76_rx_radiotap);
|
|
+ memcpy(priv->bssid, conf->bssid, ETH_ALEN);
|
|
+// memcpy(priv->essid, conf->ssid, conf->ssid_len);
|
|
+// priv->essid_size = conf->ssid_len;
|
|
+
|
|
+ if (is_valid_ether_addr(priv->bssid)) {
|
|
+ /* mac80211 is joining a bss */
|
|
+ ieee80211_wake_queues(priv->hw);
|
|
+ at76_join(priv);
|
|
+ } else
|
|
+ ieee80211_stop_queues(priv->hw);
|
|
|
|
- rt->rt_hdr.it_version = 0;
|
|
- rt->rt_hdr.it_pad = 0;
|
|
- rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct at76_rx_radiotap));
|
|
- rt->rt_hdr.it_present = cpu_to_le32(AT76_RX_RADIOTAP_PRESENT);
|
|
-
|
|
- rt->rt_tsft = cpu_to_le64(le32_to_cpu(buf->rx_time));
|
|
- rt->rt_rate = hw_rates[buf->rx_rate] & (~0x80);
|
|
- rt->rt_signal = buf->rssi;
|
|
- rt->rt_noise = buf->noise_level;
|
|
- rt->rt_flags = IEEE80211_RADIOTAP_F_FCS;
|
|
- if (buf->fragmentation)
|
|
- rt->rt_flags |= IEEE80211_RADIOTAP_F_FRAG;
|
|
-
|
|
- memcpy(payload, buf->packet, length);
|
|
- skb->dev = netdev;
|
|
- skb->ip_summed = CHECKSUM_NONE;
|
|
- skb_reset_mac_header(skb);
|
|
- skb->pkt_type = PACKET_OTHERHOST;
|
|
- skb->protocol = htons(ETH_P_802_2);
|
|
-
|
|
- netdev->last_rx = jiffies;
|
|
- netif_rx(skb);
|
|
- stats->rx_packets++;
|
|
- stats->rx_bytes += length;
|
|
-}
|
|
-
|
|
-/* Check if we spy on the sender address in buf and update stats */
|
|
-static void at76_iwspy_update(struct at76_priv *priv,
|
|
- struct at76_rx_buffer *buf)
|
|
-{
|
|
- struct ieee80211_hdr_3addr *hdr =
|
|
- (struct ieee80211_hdr_3addr *)buf->packet;
|
|
- struct iw_quality qual;
|
|
-
|
|
- /* We can only set the level here */
|
|
- qual.updated = IW_QUAL_QUAL_INVALID | IW_QUAL_NOISE_INVALID;
|
|
- qual.level = 0;
|
|
- qual.noise = 0;
|
|
- at76_calc_level(priv, buf, &qual);
|
|
+ mutex_unlock(&priv->mtx);
|
|
|
|
- spin_lock_bh(&priv->spy_spinlock);
|
|
+ return 0;
|
|
+}
|
|
|
|
- if (priv->spy_data.spy_number > 0)
|
|
- wireless_spy_update(priv->netdev, hdr->addr2, &qual);
|
|
+/* must be atomic */
|
|
+static void at76_configure_filter(struct ieee80211_hw *hw,
|
|
+ unsigned int changed_flags,
|
|
+ unsigned int *total_flags, int mc_count,
|
|
+ struct dev_addr_list *mc_list)
|
|
+{
|
|
+ struct at76_priv *priv = hw->priv;
|
|
+ int flags;
|
|
+
|
|
+ at76_dbg(DBG_MAC80211, "%s(): changed_flags=0x%08x "
|
|
+ "total_flags=0x%08x mc_count=%d",
|
|
+ __func__, changed_flags, *total_flags, mc_count);
|
|
+
|
|
+ flags = changed_flags & AT76_SUPPORTED_FILTERS;
|
|
+ *total_flags = AT76_SUPPORTED_FILTERS;
|
|
+
|
|
+ /* FIXME: access to priv->promisc should be protected with
|
|
+ * priv->mtx, but it's impossible because this function needs to be
|
|
+ * atomic */
|
|
+
|
|
+ if (flags && !priv->promisc) {
|
|
+ /* mac80211 wants us to enable promiscuous mode */
|
|
+ priv->promisc = 1;
|
|
+ } else if (!flags && priv->promisc) {
|
|
+ /* we need to disable promiscuous mode */
|
|
+ priv->promisc = 0;
|
|
+ } else
|
|
+ return;
|
|
|
|
- spin_unlock_bh(&priv->spy_spinlock);
|
|
+ queue_work(hw->workqueue, &priv->work_set_promisc);
|
|
}
|
|
|
|
-static void at76_rx_tasklet(unsigned long param)
|
|
+static int at76_set_key_oldfw(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|
+ const u8 *local_address, const u8 *address,
|
|
+ struct ieee80211_key_conf *key)
|
|
{
|
|
- struct urb *urb = (struct urb *)param;
|
|
- struct at76_priv *priv = urb->context;
|
|
- struct net_device *netdev = priv->netdev;
|
|
- struct at76_rx_buffer *buf;
|
|
- struct ieee80211_hdr_3addr *i802_11_hdr;
|
|
- u16 frame_ctl;
|
|
-
|
|
- if (priv->device_unplugged) {
|
|
- at76_dbg(DBG_DEVSTART, "device unplugged");
|
|
- if (urb)
|
|
- at76_dbg(DBG_DEVSTART, "urb status %d", urb->status);
|
|
- return;
|
|
- }
|
|
+ struct at76_priv *priv = hw->priv;
|
|
|
|
- if (!priv->rx_skb || !netdev || !priv->rx_skb->data)
|
|
- return;
|
|
+ int i;
|
|
|
|
- buf = (struct at76_rx_buffer *)priv->rx_skb->data;
|
|
+ at76_dbg(DBG_MAC80211, "%s(): cmd %d key->alg %d key->keyidx %d "
|
|
+ "key->keylen %d",
|
|
+ __func__, cmd, key->alg, key->keyidx, key->keylen);
|
|
|
|
- i802_11_hdr = (struct ieee80211_hdr_3addr *)buf->packet;
|
|
+ if (key->alg != ALG_WEP)
|
|
+ return -EOPNOTSUPP;
|
|
|
|
- frame_ctl = le16_to_cpu(i802_11_hdr->frame_ctl);
|
|
+ key->hw_key_idx = key->keyidx;
|
|
|
|
- if (urb->status != 0) {
|
|
- if (urb->status != -ENOENT && urb->status != -ECONNRESET)
|
|
- at76_dbg(DBG_URB,
|
|
- "%s %s: - nonzero Rx bulk status received: %d",
|
|
- __func__, netdev->name, urb->status);
|
|
- return;
|
|
- }
|
|
+ mutex_lock(&priv->mtx);
|
|
|
|
- at76_dbg(DBG_RX_ATMEL_HDR,
|
|
- "%s: rx frame: rate %d rssi %d noise %d link %d %s",
|
|
- priv->netdev->name, buf->rx_rate, buf->rssi, buf->noise_level,
|
|
- buf->link_quality, hex2str(i802_11_hdr, 48));
|
|
- if (priv->iw_mode == IW_MODE_MONITOR) {
|
|
- at76_rx_monitor_mode(priv);
|
|
- goto exit;
|
|
- }
|
|
+ switch (cmd) {
|
|
+ case SET_KEY:
|
|
+ memcpy(priv->wep_keys[key->keyidx], key->key, key->keylen);
|
|
+ priv->wep_keys_len[key->keyidx] = key->keylen;
|
|
|
|
- /* there is a new bssid around, accept it: */
|
|
- if (buf->newbss && priv->iw_mode == IW_MODE_ADHOC) {
|
|
- at76_dbg(DBG_PROGRESS, "%s: rx newbss", netdev->name);
|
|
- schedule_work(&priv->work_new_bss);
|
|
- }
|
|
+ /* FIXME: find out how to do this properly */
|
|
+ priv->wep_key_id = key->keyidx;
|
|
|
|
- switch (frame_ctl & IEEE80211_FCTL_FTYPE) {
|
|
- case IEEE80211_FTYPE_DATA:
|
|
- at76_rx_data(priv);
|
|
break;
|
|
+ case DISABLE_KEY:
|
|
+ default:
|
|
+ priv->wep_keys_len[key->keyidx] = 0;
|
|
+ break;
|
|
+ }
|
|
|
|
- case IEEE80211_FTYPE_MGMT:
|
|
- /* jal: TODO: find out if we can update iwspy also on
|
|
- other frames than management (might depend on the
|
|
- radio chip / firmware version !) */
|
|
+ priv->wep_enabled = 0;
|
|
|
|
- at76_iwspy_update(priv, buf);
|
|
+ for (i = 0; i < WEP_KEYS; i++) {
|
|
+ if (priv->wep_keys_len[i] != 0)
|
|
+ priv->wep_enabled = 1;
|
|
+ }
|
|
|
|
- at76_rx_mgmt(priv, buf);
|
|
- break;
|
|
+ at76_startup_device(priv);
|
|
|
|
- case IEEE80211_FTYPE_CTL:
|
|
- at76_dbg(DBG_RX_CTRL, "%s: ignored ctrl frame: %04x",
|
|
- priv->netdev->name, frame_ctl);
|
|
- break;
|
|
+ mutex_unlock(&priv->mtx);
|
|
|
|
- default:
|
|
- printk(KERN_DEBUG "%s: ignoring frame with framectl 0x%04x\n",
|
|
- priv->netdev->name, frame_ctl);
|
|
- }
|
|
-exit:
|
|
- at76_submit_rx_urb(priv);
|
|
+ return 0;
|
|
}
|
|
|
|
-/* Load firmware into kernel memory and parse it */
|
|
-static struct fwentry *at76_load_firmware(struct usb_device *udev,
|
|
- enum board_type board_type)
|
|
-{
|
|
- int ret;
|
|
- char *str;
|
|
- struct at76_fw_header *fwh;
|
|
- struct fwentry *fwe = &firmwares[board_type];
|
|
+static int at76_set_key_newfw(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|
+ const u8 *local_address, const u8 *address,
|
|
+ struct ieee80211_key_conf *key)
|
|
+{
|
|
+ struct at76_priv *priv = hw->priv;
|
|
+ int ret = -EOPNOTSUPP;
|
|
+
|
|
+ at76_dbg(DBG_MAC80211, "%s(): cmd %d key->alg %d key->keyidx %d "
|
|
+ "key->keylen %d",
|
|
+ __func__, cmd, key->alg, key->keyidx, key->keylen);
|
|
|
|
- mutex_lock(&fw_mutex);
|
|
+ mutex_lock(&priv->mtx);
|
|
|
|
- if (fwe->loaded) {
|
|
- at76_dbg(DBG_FW, "re-using previously loaded fw");
|
|
- goto exit;
|
|
- }
|
|
+ priv->mib_buf.type = MIB_MAC_ENCRYPTION;
|
|
|
|
- at76_dbg(DBG_FW, "downloading firmware %s", fwe->fwname);
|
|
- ret = request_firmware(&fwe->fw, fwe->fwname, &udev->dev);
|
|
- if (ret < 0) {
|
|
- dev_printk(KERN_ERR, &udev->dev, "firmware %s not found!\n",
|
|
- fwe->fwname);
|
|
- dev_printk(KERN_ERR, &udev->dev,
|
|
- "you may need to download the firmware from "
|
|
- "http://developer.berlios.de/projects/at76c503a/");
|
|
+ if (cmd == DISABLE_KEY) {
|
|
+ priv->mib_buf.size = CIPHER_KEY_LEN;
|
|
+ priv->mib_buf.index = offsetof(struct mib_mac_encryption,
|
|
+ cipher_default_keyvalue[key->keyidx]);
|
|
+ memset(priv->mib_buf.data.data, 0, CIPHER_KEY_LEN);
|
|
+ if (at76_set_mib(priv, &priv->mib_buf) != CMD_STATUS_COMPLETE)
|
|
+ ret = -EOPNOTSUPP; /* -EIO would be probably better */
|
|
+ else {
|
|
+
|
|
+ priv->keys[key->keyidx].cipher = CIPHER_NONE;
|
|
+ priv->keys[key->keyidx].keylen = 0;
|
|
+ };
|
|
+ if (priv->default_group_key == key->keyidx)
|
|
+ priv->default_group_key = 0xff;
|
|
+
|
|
+ if (priv->default_pairwise_key == key->keyidx)
|
|
+ priv->default_pairwise_key = 0xff;
|
|
+ /* If default pairwise key is removed, fall back to
|
|
+ * group key? */
|
|
+ ret = 0;
|
|
goto exit;
|
|
- }
|
|
+ };
|
|
|
|
- at76_dbg(DBG_FW, "got it.");
|
|
- fwh = (struct at76_fw_header *)(fwe->fw->data);
|
|
+ if (cmd == SET_KEY) {
|
|
+ /* store key into MIB */
|
|
+ priv->mib_buf.size = CIPHER_KEY_LEN;
|
|
+ priv->mib_buf.index = offsetof(struct mib_mac_encryption,
|
|
+ cipher_default_keyvalue[key->keyidx]);
|
|
+ memset(priv->mib_buf.data.data, 0, CIPHER_KEY_LEN);
|
|
+ memcpy(priv->mib_buf.data.data, key->key, key->keylen);
|
|
+
|
|
+ switch (key->alg) {
|
|
+ case ALG_WEP:
|
|
+ if (key->keylen == 5) {
|
|
+ priv->keys[key->keyidx].cipher =
|
|
+ CIPHER_WEP64;
|
|
+ priv->keys[key->keyidx].keylen = 8;
|
|
+ } else if (key->keylen == 13) {
|
|
+ priv->keys[key->keyidx].cipher =
|
|
+ CIPHER_WEP128;
|
|
+ /* Firmware needs this */
|
|
+ priv->keys[key->keyidx].keylen = 8;
|
|
+ } else {
|
|
+ ret = -EOPNOTSUPP;
|
|
+ goto exit;
|
|
+ };
|
|
+ break;
|
|
+ case ALG_TKIP:
|
|
+ key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
|
|
+ priv->keys[key->keyidx].cipher = CIPHER_TKIP;
|
|
+ priv->keys[key->keyidx].keylen = 12;
|
|
+ break;
|
|
|
|
- if (fwe->fw->size <= sizeof(*fwh)) {
|
|
- dev_printk(KERN_ERR, &udev->dev,
|
|
- "firmware is too short (0x%zx)\n", fwe->fw->size);
|
|
- goto exit;
|
|
- }
|
|
+ case ALG_CCMP:
|
|
+ if (!at76_is_505a(priv->board_type)) {
|
|
+ ret = -EOPNOTSUPP;
|
|
+ goto exit;
|
|
+ };
|
|
+ key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
|
|
+ priv->keys[key->keyidx].cipher = CIPHER_CCMP;
|
|
+ priv->keys[key->keyidx].keylen = 16;
|
|
+ break;
|
|
|
|
- /* CRC currently not checked */
|
|
- fwe->board_type = le32_to_cpu(fwh->board_type);
|
|
- if (fwe->board_type != board_type) {
|
|
- dev_printk(KERN_ERR, &udev->dev,
|
|
- "board type mismatch, requested %u, got %u\n",
|
|
- board_type, fwe->board_type);
|
|
- goto exit;
|
|
- }
|
|
+ default:
|
|
+ ret = -EOPNOTSUPP;
|
|
+ goto exit;
|
|
+ };
|
|
|
|
- fwe->fw_version.major = fwh->major;
|
|
- fwe->fw_version.minor = fwh->minor;
|
|
- fwe->fw_version.patch = fwh->patch;
|
|
- fwe->fw_version.build = fwh->build;
|
|
+ priv->mib_buf.data.data[38] = priv->keys[key->keyidx].cipher;
|
|
+ priv->mib_buf.data.data[39] = 1; /* Taken from atmelwlandriver,
|
|
+ not documented */
|
|
+
|
|
+ if (is_valid_ether_addr(address))
|
|
+ /* Pairwise key */
|
|
+ priv->mib_buf.data.data[39] |= (KEY_PAIRWISE | KEY_TX);
|
|
+ else if (is_broadcast_ether_addr(address))
|
|
+ /* Group key */
|
|
+ priv->mib_buf.data.data[39] |= (KEY_TX);
|
|
+ else /* Key used only for transmission ??? */
|
|
+ priv->mib_buf.data.data[39] |= (KEY_TX);
|
|
+
|
|
+ if (at76_set_mib(priv, &priv->mib_buf) !=
|
|
+ CMD_STATUS_COMPLETE) {
|
|
+ ret = -EOPNOTSUPP; /* -EIO would be probably better */
|
|
+ goto exit;
|
|
+ };
|
|
|
|
- str = (char *)fwh + le32_to_cpu(fwh->str_offset);
|
|
- fwe->intfw = (u8 *)fwh + le32_to_cpu(fwh->int_fw_offset);
|
|
- fwe->intfw_size = le32_to_cpu(fwh->int_fw_len);
|
|
- fwe->extfw = (u8 *)fwh + le32_to_cpu(fwh->ext_fw_offset);
|
|
- fwe->extfw_size = le32_to_cpu(fwh->ext_fw_len);
|
|
+ if ((key->alg == ALG_TKIP) || (key->alg == ALG_CCMP))
|
|
+ at76_reset_rsc(priv);
|
|
|
|
- fwe->loaded = 1;
|
|
+ key->hw_key_idx = key->keyidx;
|
|
|
|
- dev_printk(KERN_DEBUG, &udev->dev,
|
|
- "using firmware %s (version %d.%d.%d-%d)\n",
|
|
- fwe->fwname, fwh->major, fwh->minor, fwh->patch, fwh->build);
|
|
+ /* Set up default keys */
|
|
+ if (is_broadcast_ether_addr(address))
|
|
+ priv->default_group_key = key->keyidx;
|
|
+ if (is_valid_ether_addr(address))
|
|
+ priv->default_pairwise_key = key->keyidx;
|
|
+
|
|
+ /* Set up encryption MIBs */
|
|
+
|
|
+ /* first block of settings */
|
|
+ priv->mib_buf.size = 3;
|
|
+ priv->mib_buf.index = offsetof(struct mib_mac_encryption,
|
|
+ privacy_invoked);
|
|
+ priv->mib_buf.data.data[0] = 1; /* privacy_invoked */
|
|
+ priv->mib_buf.data.data[1] = priv->default_pairwise_key;
|
|
+ priv->mib_buf.data.data[2] = priv->default_group_key;
|
|
|
|
- at76_dbg(DBG_DEVSTART, "board %u, int %d:%d, ext %d:%d", board_type,
|
|
- le32_to_cpu(fwh->int_fw_offset), le32_to_cpu(fwh->int_fw_len),
|
|
- le32_to_cpu(fwh->ext_fw_offset), le32_to_cpu(fwh->ext_fw_len));
|
|
- at76_dbg(DBG_DEVSTART, "firmware id %s", str);
|
|
+ ret = at76_set_mib(priv, &priv->mib_buf);
|
|
+ if (ret != CMD_STATUS_COMPLETE)
|
|
+ goto exit;
|
|
+
|
|
+ /* second block of settings */
|
|
+ priv->mib_buf.size = 3;
|
|
+ priv->mib_buf.index = offsetof(struct mib_mac_encryption,
|
|
+ exclude_unencrypted);
|
|
+ priv->mib_buf.data.data[0] = 1; /* exclude_unencrypted */
|
|
+ priv->mib_buf.data.data[1] = 0; /* wep_encryption_type */
|
|
+ priv->mib_buf.data.data[2] = 0; /* ckip_key_permutation */
|
|
|
|
+ ret = at76_set_mib(priv, &priv->mib_buf);
|
|
+ if (ret != CMD_STATUS_COMPLETE)
|
|
+ goto exit;
|
|
+ ret = 0;
|
|
+ };
|
|
exit:
|
|
- mutex_unlock(&fw_mutex);
|
|
+ at76_dump_mib_mac_encryption(priv);
|
|
+ mutex_unlock(&priv->mtx);
|
|
+ return ret;
|
|
+}
|
|
|
|
- if (fwe->loaded)
|
|
- return fwe;
|
|
+static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|
+ const u8 *local_address, const u8 *address,
|
|
+ struct ieee80211_key_conf *key)
|
|
+{
|
|
+ struct at76_priv *priv = hw->priv;
|
|
+
|
|
+ at76_dbg(DBG_MAC80211, "%s(): cmd %d key->alg %d key->keyidx %d "
|
|
+ "key->keylen %d",
|
|
+ __func__, cmd, key->alg, key->keyidx, key->keylen);
|
|
+
|
|
+ if (FIRMWARE_IS_WPA(priv->fw_version))
|
|
+ return at76_set_key_newfw(hw, cmd, local_address, address, key);
|
|
else
|
|
- return NULL;
|
|
+ return at76_set_key_oldfw(hw, cmd, local_address, address, key);
|
|
+
|
|
}
|
|
|
|
+static const struct ieee80211_ops at76_ops = {
|
|
+ .tx = at76_mac80211_tx,
|
|
+ .add_interface = at76_add_interface,
|
|
+ .remove_interface = at76_remove_interface,
|
|
+ .config = at76_config,
|
|
+ .config_interface = at76_config_interface,
|
|
+ .configure_filter = at76_configure_filter,
|
|
+ .start = at76_mac80211_start,
|
|
+ .stop = at76_mac80211_stop,
|
|
+ .hw_scan = at76_hw_scan,
|
|
+ .set_key = at76_set_key,
|
|
+};
|
|
+
|
|
/* Allocate network device and initialize private data */
|
|
static struct at76_priv *at76_alloc_new_device(struct usb_device *udev)
|
|
{
|
|
- struct net_device *netdev;
|
|
+ struct ieee80211_hw *hw;
|
|
struct at76_priv *priv;
|
|
- int i;
|
|
|
|
- /* allocate memory for our device state and initialize it */
|
|
- netdev = alloc_etherdev(sizeof(struct at76_priv));
|
|
- if (!netdev) {
|
|
- dev_printk(KERN_ERR, &udev->dev, "out of memory\n");
|
|
+ hw = ieee80211_alloc_hw(sizeof(struct at76_priv), &at76_ops);
|
|
+ if (!hw) {
|
|
+ printk(KERN_ERR DRIVER_NAME ": could not register"
|
|
+ " ieee80211_hw\n");
|
|
return NULL;
|
|
}
|
|
|
|
- priv = netdev_priv(netdev);
|
|
+ priv = hw->priv;
|
|
+ priv->hw = hw;
|
|
|
|
priv->udev = udev;
|
|
- priv->netdev = netdev;
|
|
|
|
mutex_init(&priv->mtx);
|
|
- INIT_WORK(&priv->work_assoc_done, at76_work_assoc_done);
|
|
- INIT_WORK(&priv->work_join, at76_work_join);
|
|
- INIT_WORK(&priv->work_new_bss, at76_work_new_bss);
|
|
- INIT_WORK(&priv->work_start_scan, at76_work_start_scan);
|
|
INIT_WORK(&priv->work_set_promisc, at76_work_set_promisc);
|
|
INIT_WORK(&priv->work_submit_rx, at76_work_submit_rx);
|
|
- INIT_DELAYED_WORK(&priv->dwork_restart, at76_dwork_restart);
|
|
- INIT_DELAYED_WORK(&priv->dwork_get_scan, at76_dwork_get_scan);
|
|
- INIT_DELAYED_WORK(&priv->dwork_beacon, at76_dwork_beacon);
|
|
- INIT_DELAYED_WORK(&priv->dwork_auth, at76_dwork_auth);
|
|
- INIT_DELAYED_WORK(&priv->dwork_assoc, at76_dwork_assoc);
|
|
-
|
|
- spin_lock_init(&priv->mgmt_spinlock);
|
|
- priv->next_mgmt_bulk = NULL;
|
|
- priv->mac_state = MAC_INIT;
|
|
-
|
|
- /* initialize empty BSS list */
|
|
- priv->curr_bss = NULL;
|
|
- INIT_LIST_HEAD(&priv->bss_list);
|
|
- spin_lock_init(&priv->bss_list_spinlock);
|
|
-
|
|
- init_timer(&priv->bss_list_timer);
|
|
- priv->bss_list_timer.data = (unsigned long)priv;
|
|
- priv->bss_list_timer.function = at76_bss_list_timeout;
|
|
-
|
|
- spin_lock_init(&priv->spy_spinlock);
|
|
-
|
|
- /* mark all rx data entries as unused */
|
|
- for (i = 0; i < NR_RX_DATA_BUF; i++)
|
|
- priv->rx_data[i].skb = NULL;
|
|
+ INIT_DELAYED_WORK(&priv->dwork_hw_scan, at76_dwork_hw_scan);
|
|
|
|
priv->rx_tasklet.func = at76_rx_tasklet;
|
|
priv->rx_tasklet.data = 0;
|
|
@@ -5197,6 +2371,9 @@
|
|
priv->pm_mode = AT76_PM_OFF;
|
|
priv->pm_period = 0;
|
|
|
|
+ /* unit us */
|
|
+ priv->hw->channel_change_time = 100000;
|
|
+
|
|
return priv;
|
|
}
|
|
|
|
@@ -5259,11 +2436,42 @@
|
|
return 0;
|
|
}
|
|
|
|
+static struct ieee80211_rate at76_rates[] = {
|
|
+ { .bitrate = 10, .hw_value = TX_RATE_1MBIT, },
|
|
+ { .bitrate = 20, .hw_value = TX_RATE_2MBIT, },
|
|
+ { .bitrate = 55, .hw_value = TX_RATE_5_5MBIT, },
|
|
+ { .bitrate = 110, .hw_value = TX_RATE_11MBIT, },
|
|
+};
|
|
+
|
|
+static struct ieee80211_channel at76_channels[] = {
|
|
+ { .center_freq = 2412, .hw_value = 1 },
|
|
+ { .center_freq = 2417, .hw_value = 2 },
|
|
+ { .center_freq = 2422, .hw_value = 3 },
|
|
+ { .center_freq = 2427, .hw_value = 4 },
|
|
+ { .center_freq = 2432, .hw_value = 5 },
|
|
+ { .center_freq = 2437, .hw_value = 6 },
|
|
+ { .center_freq = 2442, .hw_value = 7 },
|
|
+ { .center_freq = 2447, .hw_value = 8 },
|
|
+ { .center_freq = 2452, .hw_value = 9 },
|
|
+ { .center_freq = 2457, .hw_value = 10 },
|
|
+ { .center_freq = 2462, .hw_value = 11 },
|
|
+ { .center_freq = 2467, .hw_value = 12 },
|
|
+ { .center_freq = 2472, .hw_value = 13 },
|
|
+ { .center_freq = 2484, .hw_value = 14 }
|
|
+};
|
|
+
|
|
+static struct ieee80211_supported_band at76_supported_band = {
|
|
+ .channels = at76_channels,
|
|
+ .n_channels = ARRAY_SIZE(at76_channels),
|
|
+ .bitrates = at76_rates,
|
|
+ .n_bitrates = ARRAY_SIZE(at76_rates),
|
|
+};
|
|
+
|
|
/* Register network device and initialize the hardware */
|
|
static int at76_init_new_device(struct at76_priv *priv,
|
|
struct usb_interface *interface)
|
|
{
|
|
- struct net_device *netdev = priv->netdev;
|
|
+ struct device *dev = &interface->dev;
|
|
int ret;
|
|
|
|
/* set up the endpoint information */
|
|
@@ -5279,14 +2487,11 @@
|
|
/* MAC address */
|
|
ret = at76_get_hw_config(priv);
|
|
if (ret < 0) {
|
|
- dev_printk(KERN_ERR, &interface->dev,
|
|
- "cannot get MAC address\n");
|
|
+ dev_err(dev, "cannot get MAC address\n");
|
|
goto exit;
|
|
}
|
|
|
|
priv->domain = at76_get_reg_domain(priv->regulatory_domain);
|
|
- /* init. netdev->dev_addr */
|
|
- memcpy(netdev->dev_addr, priv->mac_addr, ETH_ALEN);
|
|
|
|
priv->channel = DEF_CHANNEL;
|
|
priv->iw_mode = IW_MODE_INFRA;
|
|
@@ -5296,47 +2501,54 @@
|
|
priv->txrate = TX_RATE_AUTO;
|
|
priv->preamble_type = PREAMBLE_TYPE_LONG;
|
|
priv->beacon_period = 100;
|
|
- priv->beacons_last_qual = jiffies;
|
|
priv->auth_mode = WLAN_AUTH_OPEN;
|
|
priv->scan_min_time = DEF_SCAN_MIN_TIME;
|
|
priv->scan_max_time = DEF_SCAN_MAX_TIME;
|
|
priv->scan_mode = SCAN_TYPE_ACTIVE;
|
|
+ priv->default_pairwise_key = 0xff;
|
|
+ priv->default_group_key = 0xff;
|
|
+
|
|
+ /* mac80211 initialisation */
|
|
+ priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &at76_supported_band;
|
|
+
|
|
+ if (FIRMWARE_IS_WPA(priv->fw_version) &&
|
|
+ (at76_is_503rfmd(priv->board_type) ||
|
|
+ at76_is_505(priv->board_type)))
|
|
+ priv->hw->flags = IEEE80211_HW_SIGNAL_UNSPEC;
|
|
+ else
|
|
+ priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
|
|
+ IEEE80211_HW_SIGNAL_UNSPEC;
|
|
|
|
- netdev->flags &= ~IFF_MULTICAST; /* not yet or never */
|
|
- netdev->open = at76_open;
|
|
- netdev->stop = at76_stop;
|
|
- netdev->get_stats = at76_get_stats;
|
|
- netdev->ethtool_ops = &at76_ethtool_ops;
|
|
-
|
|
- /* Add pointers to enable iwspy support. */
|
|
- priv->wireless_data.spy_data = &priv->spy_data;
|
|
- netdev->wireless_data = &priv->wireless_data;
|
|
-
|
|
- netdev->hard_start_xmit = at76_tx;
|
|
- netdev->tx_timeout = at76_tx_timeout;
|
|
- netdev->watchdog_timeo = 2 * HZ;
|
|
- netdev->wireless_handlers = &at76_handler_def;
|
|
- netdev->set_multicast_list = at76_set_multicast;
|
|
- netdev->set_mac_address = at76_set_mac_address;
|
|
- dev_alloc_name(netdev, "wlan%d");
|
|
+ priv->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
|
|
|
- ret = register_netdev(priv->netdev);
|
|
+ SET_IEEE80211_DEV(priv->hw, &interface->dev);
|
|
+ SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr);
|
|
+
|
|
+ ret = ieee80211_register_hw(priv->hw);
|
|
if (ret) {
|
|
- dev_printk(KERN_ERR, &interface->dev,
|
|
- "cannot register netdevice (status %d)!\n", ret);
|
|
+ dev_err(dev, "cannot register mac80211 hw (status %d)!\n", ret);
|
|
goto exit;
|
|
}
|
|
- priv->netdev_registered = 1;
|
|
|
|
- printk(KERN_INFO "%s: USB %s, MAC %s, firmware %d.%d.%d-%d\n",
|
|
- netdev->name, dev_name(&interface->dev), mac2str(priv->mac_addr),
|
|
- priv->fw_version.major, priv->fw_version.minor,
|
|
- priv->fw_version.patch, priv->fw_version.build);
|
|
- printk(KERN_INFO "%s: regulatory domain 0x%02x: %s\n", netdev->name,
|
|
- priv->regulatory_domain, priv->domain->name);
|
|
+ priv->mac80211_registered = 1;
|
|
|
|
- /* we let this timer run the whole time this driver instance lives */
|
|
- mod_timer(&priv->bss_list_timer, jiffies + BSS_LIST_TIMEOUT);
|
|
+ dev_info(dev, "%s: USB %s, MAC %s, firmware %d.%d.%d-%d\n",
|
|
+ wiphy_name(priv->hw->wiphy),
|
|
+ dev_name(&interface->dev), mac2str(priv->mac_addr),
|
|
+ priv->fw_version.major, priv->fw_version.minor,
|
|
+ priv->fw_version.patch, priv->fw_version.build);
|
|
+ dev_info(dev, "%s: regulatory domain 0x%02x: %s\n",
|
|
+ wiphy_name(priv->hw->wiphy),
|
|
+ priv->regulatory_domain, priv->domain->name);
|
|
+ dev_info(dev, "%s: WPA support: ", wiphy_name(priv->hw->wiphy));
|
|
+ if (!FIRMWARE_IS_WPA(priv->fw_version))
|
|
+ printk("none\n");
|
|
+ else {
|
|
+ if (!at76_is_505a(priv->board_type))
|
|
+ printk("TKIP\n");
|
|
+ else
|
|
+ printk("TKIP, AES/CCMP\n");
|
|
+ };
|
|
|
|
exit:
|
|
return ret;
|
|
@@ -5344,15 +2556,13 @@
|
|
|
|
static void at76_delete_device(struct at76_priv *priv)
|
|
{
|
|
- int i;
|
|
-
|
|
at76_dbg(DBG_PROC_ENTRY, "%s: ENTER", __func__);
|
|
|
|
/* The device is gone, don't bother turning it off */
|
|
priv->device_unplugged = 1;
|
|
|
|
- if (priv->netdev_registered)
|
|
- unregister_netdev(priv->netdev);
|
|
+ if (priv->mac80211_registered)
|
|
+ ieee80211_unregister_hw(priv->hw);
|
|
|
|
/* assuming we used keventd, it must quiesce too */
|
|
flush_scheduled_work();
|
|
@@ -5373,25 +2583,11 @@
|
|
if (priv->rx_skb)
|
|
kfree_skb(priv->rx_skb);
|
|
|
|
- at76_free_bss_list(priv);
|
|
- del_timer_sync(&priv->bss_list_timer);
|
|
- cancel_delayed_work(&priv->dwork_get_scan);
|
|
- cancel_delayed_work(&priv->dwork_beacon);
|
|
- cancel_delayed_work(&priv->dwork_auth);
|
|
- cancel_delayed_work(&priv->dwork_assoc);
|
|
-
|
|
- if (priv->mac_state == MAC_CONNECTED)
|
|
- at76_iwevent_bss_disconnect(priv->netdev);
|
|
-
|
|
- for (i = 0; i < NR_RX_DATA_BUF; i++)
|
|
- if (priv->rx_data[i].skb) {
|
|
- dev_kfree_skb(priv->rx_data[i].skb);
|
|
- priv->rx_data[i].skb = NULL;
|
|
- }
|
|
usb_put_dev(priv->udev);
|
|
|
|
- at76_dbg(DBG_PROC_ENTRY, "%s: before freeing priv/netdev", __func__);
|
|
- free_netdev(priv->netdev); /* priv is in netdev */
|
|
+ at76_dbg(DBG_PROC_ENTRY, "%s: before freeing priv/ieee80211_hw",
|
|
+ __func__);
|
|
+ ieee80211_free_hw(priv->hw);
|
|
|
|
at76_dbg(DBG_PROC_ENTRY, "%s: EXIT", __func__);
|
|
}
|
|
@@ -5425,8 +2621,8 @@
|
|
we get 204 with 2.4.23, Fiberline FL-WL240u (505A+RFMD2958) ??? */
|
|
|
|
if (op_mode == OPMODE_HW_CONFIG_MODE) {
|
|
- dev_printk(KERN_ERR, &interface->dev,
|
|
- "cannot handle a device in HW_CONFIG_MODE\n");
|
|
+ dev_err(&interface->dev,
|
|
+ "cannot handle a device in HW_CONFIG_MODE\n");
|
|
ret = -EBUSY;
|
|
goto error;
|
|
}
|
|
@@ -5434,13 +2630,12 @@
|
|
if (op_mode != OPMODE_NORMAL_NIC_WITH_FLASH
|
|
&& op_mode != OPMODE_NORMAL_NIC_WITHOUT_FLASH) {
|
|
/* download internal firmware part */
|
|
- dev_printk(KERN_DEBUG, &interface->dev,
|
|
- "downloading internal firmware\n");
|
|
+ dev_dbg(&interface->dev, "downloading internal firmware\n");
|
|
ret = at76_load_internal_fw(udev, fwe);
|
|
if (ret < 0) {
|
|
- dev_printk(KERN_ERR, &interface->dev,
|
|
- "error %d downloading internal firmware\n",
|
|
- ret);
|
|
+ dev_err(&interface->dev,
|
|
+ "error %d downloading internal firmware\n",
|
|
+ ret);
|
|
goto error;
|
|
}
|
|
usb_put_dev(udev);
|
|
@@ -5465,8 +2660,7 @@
|
|
need_ext_fw = 1;
|
|
|
|
if (need_ext_fw) {
|
|
- dev_printk(KERN_DEBUG, &interface->dev,
|
|
- "downloading external firmware\n");
|
|
+ dev_dbg(&interface->dev, "downloading external firmware\n");
|
|
|
|
ret = at76_load_external_fw(udev, fwe);
|
|
if (ret)
|
|
@@ -5475,8 +2669,8 @@
|
|
/* Re-check firmware version */
|
|
ret = at76_get_mib(udev, MIB_FW_VERSION, &fwv, sizeof(fwv));
|
|
if (ret < 0) {
|
|
- dev_printk(KERN_ERR, &interface->dev,
|
|
- "error %d getting firmware version\n", ret);
|
|
+ dev_err(&interface->dev,
|
|
+ "error %d getting firmware version\n", ret);
|
|
goto error;
|
|
}
|
|
}
|
|
@@ -5487,7 +2681,6 @@
|
|
goto error;
|
|
}
|
|
|
|
- SET_NETDEV_DEV(priv->netdev, &interface->dev);
|
|
usb_set_intfdata(interface, priv);
|
|
|
|
memcpy(&priv->fw_version, &fwv, sizeof(struct mib_fw_version));
|
|
@@ -5515,7 +2708,7 @@
|
|
if (!priv)
|
|
return;
|
|
|
|
- printk(KERN_INFO "%s: disconnecting\n", priv->netdev->name);
|
|
+ printk(KERN_INFO "%s: disconnecting\n", wiphy_name(priv->hw->wiphy));
|
|
at76_delete_device(priv);
|
|
dev_printk(KERN_INFO, &interface->dev, "disconnected\n");
|
|
}
|
|
@@ -5571,5 +2764,8 @@
|
|
MODULE_AUTHOR("Nick Jones");
|
|
MODULE_AUTHOR("Balint Seeber <n0_5p4m_p13453@hotmail.com>");
|
|
MODULE_AUTHOR("Pavel Roskin <proski@gnu.org>");
|
|
+MODULE_AUTHOR("Guido Guenther <agx@sigxcpu.org>");
|
|
+MODULE_AUTHOR("Kalle Valo <kalle.valo@iki.fi>");
|
|
+MODULE_AUTHOR("Milan Plzik <milan.plzik@gmail.com>");
|
|
MODULE_DESCRIPTION(DRIVER_DESC);
|
|
MODULE_LICENSE("GPL");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/at76_usb/at76_usb.h linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/at76_usb.h
|
|
--- linux-2.6.29.owrt/drivers/staging/at76_usb/at76_usb.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/at76_usb.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -34,23 +34,6 @@
|
|
BOARD_505AMX = 8
|
|
};
|
|
|
|
-/* our private ioctl's */
|
|
-/* preamble length (0 - long, 1 - short, 2 - auto) */
|
|
-#define AT76_SET_SHORT_PREAMBLE (SIOCIWFIRSTPRIV + 0)
|
|
-#define AT76_GET_SHORT_PREAMBLE (SIOCIWFIRSTPRIV + 1)
|
|
-/* which debug channels are enabled */
|
|
-#define AT76_SET_DEBUG (SIOCIWFIRSTPRIV + 2)
|
|
-#define AT76_GET_DEBUG (SIOCIWFIRSTPRIV + 3)
|
|
-/* power save mode (incl. the Atmel proprietary smart save mode) */
|
|
-#define AT76_SET_POWERSAVE_MODE (SIOCIWFIRSTPRIV + 4)
|
|
-#define AT76_GET_POWERSAVE_MODE (SIOCIWFIRSTPRIV + 5)
|
|
-/* min and max channel times for scan */
|
|
-#define AT76_SET_SCAN_TIMES (SIOCIWFIRSTPRIV + 6)
|
|
-#define AT76_GET_SCAN_TIMES (SIOCIWFIRSTPRIV + 7)
|
|
-/* scan mode (0 - active, 1 - passive) */
|
|
-#define AT76_SET_SCAN_MODE (SIOCIWFIRSTPRIV + 8)
|
|
-#define AT76_GET_SCAN_MODE (SIOCIWFIRSTPRIV + 9)
|
|
-
|
|
#define CMD_STATUS_IDLE 0x00
|
|
#define CMD_STATUS_COMPLETE 0x01
|
|
#define CMD_STATUS_UNKNOWN 0x02
|
|
@@ -82,6 +65,7 @@
|
|
#define MIB_MAC 0x03
|
|
#define MIB_MAC_MGMT 0x05
|
|
#define MIB_MAC_WEP 0x06
|
|
+#define MIB_MAC_ENCRYPTION 0x06
|
|
#define MIB_PHY 0x07
|
|
#define MIB_FW_VERSION 0x08
|
|
#define MIB_MDOMAIN 0x09
|
|
@@ -106,6 +90,26 @@
|
|
#define AT76_PM_ON 2
|
|
#define AT76_PM_SMART 3
|
|
|
|
+/* cipher values for encryption keys */
|
|
+#define CIPHER_NONE 0 /* this value is only guessed */
|
|
+#define CIPHER_WEP64 1
|
|
+#define CIPHER_TKIP 2
|
|
+#define CIPHER_CCMP 3
|
|
+#define CIPHER_CCX 4 /* for consistency sake only */
|
|
+#define CIPHER_WEP128 5
|
|
+
|
|
+/* bit flags key types for encryption keys */
|
|
+#define KEY_PAIRWISE 2
|
|
+#define KEY_TX 4
|
|
+
|
|
+#define CIPHER_KEYS (4)
|
|
+#define CIPHER_KEY_LEN (40)
|
|
+
|
|
+struct key_config {
|
|
+ u8 cipher;
|
|
+ u8 keylen;
|
|
+};
|
|
+
|
|
struct hwcfg_r505 {
|
|
u8 cr39_values[14];
|
|
u8 reserved1[14];
|
|
@@ -147,6 +151,9 @@
|
|
|
|
#define WEP_SMALL_KEY_LEN (40 / 8)
|
|
#define WEP_LARGE_KEY_LEN (104 / 8)
|
|
+#define WEP_KEYS (4)
|
|
+
|
|
+
|
|
|
|
struct at76_card_config {
|
|
u8 exclude_unencrypted;
|
|
@@ -161,7 +168,7 @@
|
|
u8 privacy_invoked;
|
|
u8 wep_default_key_id; /* 0..3 */
|
|
u8 current_ssid[32];
|
|
- u8 wep_default_key_value[4][WEP_KEY_LEN];
|
|
+ u8 wep_default_key_value[4][WEP_LARGE_KEY_LEN];
|
|
u8 ssid_len;
|
|
u8 short_preamble;
|
|
__le16 beacon_period;
|
|
@@ -186,7 +193,7 @@
|
|
u8 link_quality;
|
|
u8 noise_level;
|
|
__le32 rx_time;
|
|
- u8 packet[IEEE80211_FRAME_LEN + IEEE80211_FCS_LEN];
|
|
+ u8 packet[IEEE80211_MAX_FRAG_THRESHOLD];
|
|
} __attribute__((packed));
|
|
|
|
/* Length of Atmel-specific Tx header before 802.11 frame */
|
|
@@ -196,8 +203,11 @@
|
|
__le16 wlength;
|
|
u8 tx_rate;
|
|
u8 padding;
|
|
- u8 reserved[4];
|
|
- u8 packet[IEEE80211_FRAME_LEN + IEEE80211_FCS_LEN];
|
|
+ u8 key_id;
|
|
+ u8 cipher_type;
|
|
+ u8 cipher_length;
|
|
+ u8 reserved;
|
|
+ u8 packet[IEEE80211_MAX_FRAG_THRESHOLD];
|
|
} __attribute__((packed));
|
|
|
|
/* defines for scan_type below */
|
|
@@ -244,6 +254,7 @@
|
|
u8 byte;
|
|
__le16 word;
|
|
u8 addr[ETH_ALEN];
|
|
+ u8 data[256]; /* we need more space for mib_mac_encryption */
|
|
} data;
|
|
} __attribute__((packed));
|
|
|
|
@@ -317,10 +328,24 @@
|
|
u8 exclude_unencrypted;
|
|
__le32 wep_icv_error_count;
|
|
__le32 wep_excluded_count;
|
|
- u8 wep_default_keyvalue[WEP_KEYS][WEP_KEY_LEN];
|
|
+ u8 wep_default_keyvalue[WEP_KEYS][WEP_LARGE_KEY_LEN];
|
|
u8 encryption_level; /* 1 for 40bit, 2 for 104bit encryption */
|
|
} __attribute__((packed));
|
|
|
|
+struct mib_mac_encryption {
|
|
+ u8 cipher_default_keyvalue[CIPHER_KEYS][CIPHER_KEY_LEN];
|
|
+ u8 tkip_bssid[6];
|
|
+ u8 privacy_invoked;
|
|
+ u8 cipher_default_key_id;
|
|
+ u8 cipher_default_group_key_id;
|
|
+ u8 exclude_unencrypted;
|
|
+ u8 wep_encryption_type;
|
|
+ u8 ckip_key_permutation; /* bool */
|
|
+ __le32 wep_icv_error_count;
|
|
+ __le32 wep_excluded_count;
|
|
+ u8 key_rsc[CIPHER_KEYS][8];
|
|
+} __attribute__((packed));
|
|
+
|
|
struct mib_phy {
|
|
__le32 ed_threshold;
|
|
|
|
@@ -364,16 +389,6 @@
|
|
__le32 ext_fw_len; /* external firmware image length */
|
|
} __attribute__((packed));
|
|
|
|
-enum mac_state {
|
|
- MAC_INIT,
|
|
- MAC_SCANNING,
|
|
- MAC_AUTH,
|
|
- MAC_ASSOC,
|
|
- MAC_JOINING,
|
|
- MAC_CONNECTED,
|
|
- MAC_OWN_IBSS
|
|
-};
|
|
-
|
|
/* a description of a regulatory domain and the allowed channels */
|
|
struct reg_domain {
|
|
u16 code;
|
|
@@ -381,47 +396,6 @@
|
|
u32 channel_map; /* if bit N is set, channel (N+1) is allowed */
|
|
};
|
|
|
|
-/* how long do we keep a (I)BSS in the bss_list in jiffies
|
|
- this should be long enough for the user to retrieve the table
|
|
- (by iwlist ?) after the device started, because all entries from
|
|
- other channels than the one the device locks on get removed, too */
|
|
-#define BSS_LIST_TIMEOUT (120 * HZ)
|
|
-/* struct to store BSS info found during scan */
|
|
-#define BSS_LIST_MAX_RATE_LEN 32 /* 32 rates should be enough ... */
|
|
-
|
|
-struct bss_info {
|
|
- struct list_head list;
|
|
-
|
|
- u8 bssid[ETH_ALEN]; /* bssid */
|
|
- u8 ssid[IW_ESSID_MAX_SIZE]; /* essid */
|
|
- u8 ssid_len; /* length of ssid above */
|
|
- u8 channel;
|
|
- u16 capa; /* BSS capabilities */
|
|
- u16 beacon_interval; /* beacon interval, Kus (1024 microseconds) */
|
|
- u8 rates[BSS_LIST_MAX_RATE_LEN]; /* supported rates in units of
|
|
- 500 kbps, ORed with 0x80 for
|
|
- basic rates */
|
|
- u8 rates_len;
|
|
-
|
|
- /* quality of received beacon */
|
|
- u8 rssi;
|
|
- u8 link_qual;
|
|
- u8 noise_level;
|
|
-
|
|
- unsigned long last_rx; /* time (jiffies) of last beacon received */
|
|
-};
|
|
-
|
|
-/* a rx data buffer to collect rx fragments */
|
|
-struct rx_data_buf {
|
|
- u8 sender[ETH_ALEN]; /* sender address */
|
|
- u16 seqnr; /* sequence number */
|
|
- u16 fragnr; /* last fragment received */
|
|
- unsigned long last_rx; /* jiffies of last rx */
|
|
- struct sk_buff *skb; /* == NULL if entry is free */
|
|
-};
|
|
-
|
|
-#define NR_RX_DATA_BUF 8
|
|
-
|
|
/* Data for one loaded firmware file */
|
|
struct fwentry {
|
|
const char *const fwname;
|
|
@@ -438,11 +412,9 @@
|
|
|
|
struct at76_priv {
|
|
struct usb_device *udev; /* USB device pointer */
|
|
- struct net_device *netdev; /* net device pointer */
|
|
- struct net_device_stats stats; /* net device stats */
|
|
- struct iw_statistics wstats; /* wireless stats */
|
|
|
|
struct sk_buff *rx_skb; /* skbuff for receiving data */
|
|
+ struct sk_buff *tx_skb; /* skbuff for transmitting data */
|
|
void *bulk_out_buffer; /* buffer for sending data */
|
|
|
|
struct urb *tx_urb; /* URB for sending data */
|
|
@@ -454,26 +426,17 @@
|
|
struct mutex mtx; /* locks this structure */
|
|
|
|
/* work queues */
|
|
- struct work_struct work_assoc_done;
|
|
- struct work_struct work_join;
|
|
- struct work_struct work_new_bss;
|
|
- struct work_struct work_start_scan;
|
|
struct work_struct work_set_promisc;
|
|
struct work_struct work_submit_rx;
|
|
- struct delayed_work dwork_restart;
|
|
- struct delayed_work dwork_get_scan;
|
|
- struct delayed_work dwork_beacon;
|
|
- struct delayed_work dwork_auth;
|
|
- struct delayed_work dwork_assoc;
|
|
+ struct delayed_work dwork_hw_scan;
|
|
|
|
struct tasklet_struct rx_tasklet;
|
|
|
|
/* the WEP stuff */
|
|
int wep_enabled; /* 1 if WEP is enabled */
|
|
int wep_key_id; /* key id to be used */
|
|
- u8 wep_keys[WEP_KEYS][WEP_KEY_LEN]; /* the four WEP keys,
|
|
- 5 or 13 bytes are used */
|
|
- u8 wep_keys_len[WEP_KEYS]; /* the length of the above keys */
|
|
+ u8 wep_keys[WEP_KEYS][WEP_LARGE_KEY_LEN]; /* WEP keys */
|
|
+ u8 wep_keys_len[WEP_KEYS]; /* length of WEP keys */
|
|
|
|
int channel;
|
|
int iw_mode;
|
|
@@ -495,44 +458,13 @@
|
|
int scan_mode; /* SCAN_TYPE_ACTIVE, SCAN_TYPE_PASSIVE */
|
|
int scan_need_any; /* if set, need to scan for any ESSID */
|
|
|
|
- /* the list we got from scanning */
|
|
- spinlock_t bss_list_spinlock; /* protects bss_list operations */
|
|
- struct list_head bss_list; /* list of BSS we got beacons from */
|
|
- struct timer_list bss_list_timer; /* timer to purge old entries
|
|
- from bss_list */
|
|
- struct bss_info *curr_bss; /* current BSS */
|
|
u16 assoc_id; /* current association ID, if associated */
|
|
|
|
- u8 wanted_bssid[ETH_ALEN];
|
|
- int wanted_bssid_valid; /* != 0 if wanted_bssid is to be used */
|
|
-
|
|
- /* some data for infrastructure mode only */
|
|
- spinlock_t mgmt_spinlock; /* this spinlock protects access to
|
|
- next_mgmt_bulk */
|
|
-
|
|
- struct at76_tx_buffer *next_mgmt_bulk; /* pending management msg to
|
|
- send via bulk out */
|
|
- enum mac_state mac_state;
|
|
- enum {
|
|
- SCAN_IDLE,
|
|
- SCAN_IN_PROGRESS,
|
|
- SCAN_COMPLETED
|
|
- } scan_state;
|
|
- time_t last_scan;
|
|
-
|
|
- int retries; /* remaining retries in case of timeout when
|
|
- * sending AuthReq or AssocReq */
|
|
u8 pm_mode; /* power management mode */
|
|
u32 pm_period; /* power management period in microseconds */
|
|
|
|
struct reg_domain const *domain; /* reg domain description */
|
|
|
|
- /* iwspy support */
|
|
- spinlock_t spy_spinlock;
|
|
- struct iw_spy_data spy_data;
|
|
-
|
|
- struct iw_public_data wireless_data;
|
|
-
|
|
/* These fields contain HW config provided by the device (not all of
|
|
* these fields are used by all board types) */
|
|
u8 mac_addr[ETH_ALEN];
|
|
@@ -540,9 +472,6 @@
|
|
|
|
struct at76_card_config card_config;
|
|
|
|
- /* store rx fragments until complete */
|
|
- struct rx_data_buf rx_data[NR_RX_DATA_BUF];
|
|
-
|
|
enum board_type board_type;
|
|
struct mib_fw_version fw_version;
|
|
|
|
@@ -550,58 +479,20 @@
|
|
unsigned int netdev_registered:1;
|
|
struct set_mib_buffer mib_buf; /* global buffer for set_mib calls */
|
|
|
|
- /* beacon counting */
|
|
int beacon_period; /* period of mgmt beacons, Kus */
|
|
- int beacons_received;
|
|
- unsigned long beacons_last_qual; /* time we restarted counting
|
|
- beacons */
|
|
-};
|
|
|
|
-struct at76_rx_radiotap {
|
|
- struct ieee80211_radiotap_header rt_hdr;
|
|
- __le64 rt_tsft;
|
|
- u8 rt_flags;
|
|
- u8 rt_rate;
|
|
- s8 rt_signal;
|
|
- s8 rt_noise;
|
|
-};
|
|
-
|
|
-#define AT76_RX_RADIOTAP_PRESENT \
|
|
- ((1 << IEEE80211_RADIOTAP_TSFT) | \
|
|
- (1 << IEEE80211_RADIOTAP_FLAGS) | \
|
|
- (1 << IEEE80211_RADIOTAP_RATE) | \
|
|
- (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \
|
|
- (1 << IEEE80211_RADIOTAP_DB_ANTNOISE))
|
|
-
|
|
-#define BEACON_MAX_DATA_LENGTH 1500
|
|
-
|
|
-/* the maximum size of an AssocReq packet */
|
|
-#define ASSOCREQ_MAX_SIZE \
|
|
- (AT76_TX_HDRLEN + sizeof(struct ieee80211_assoc_request) + \
|
|
- 1 + 1 + IW_ESSID_MAX_SIZE + 1 + 1 + 4)
|
|
-
|
|
-/* for shared secret auth, add the challenge text size */
|
|
-#define AUTH_FRAME_SIZE (AT76_TX_HDRLEN + sizeof(struct ieee80211_auth))
|
|
+ struct ieee80211_hw *hw;
|
|
+ int mac80211_registered;
|
|
|
|
-/* Maximal number of AuthReq retries */
|
|
-#define AUTH_RETRIES 3
|
|
-
|
|
-/* Maximal number of AssocReq retries */
|
|
-#define ASSOC_RETRIES 3
|
|
-
|
|
-/* Beacon timeout in managed mode when we are connected */
|
|
-#define BEACON_TIMEOUT (10 * HZ)
|
|
-
|
|
-/* Timeout for authentication response */
|
|
-#define AUTH_TIMEOUT (1 * HZ)
|
|
+ struct key_config keys[4]; /* installed key types */
|
|
+ u8 default_pairwise_key;
|
|
+ u8 default_group_key;
|
|
+};
|
|
|
|
-/* Timeout for association response */
|
|
-#define ASSOC_TIMEOUT (1 * HZ)
|
|
+#define AT76_SUPPORTED_FILTERS FIF_PROMISC_IN_BSS
|
|
|
|
-/* Polling interval when scan is running */
|
|
#define SCAN_POLL_INTERVAL (HZ / 4)
|
|
|
|
-/* Command completion timeout */
|
|
#define CMD_COMPLETION_TIMEOUT (5 * HZ)
|
|
|
|
#define DEF_RTS_THRESHOLD 1536
|
|
@@ -611,8 +502,6 @@
|
|
#define DEF_SCAN_MIN_TIME 10
|
|
#define DEF_SCAN_MAX_TIME 120
|
|
|
|
-#define MAX_RTS_THRESHOLD (MAX_FRAG_THRESHOLD + 1)
|
|
-
|
|
/* the max padding size for tx in bytes (see calc_padding) */
|
|
#define MAX_PADDING_SIZE 53
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/at76_usb/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/staging/at76_usb/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,6 +1,6 @@
|
|
config USB_ATMEL
|
|
tristate "Atmel at76c503/at76c505/at76c505a USB cards"
|
|
- depends on WLAN_80211 && USB
|
|
+ depends on MAC80211 && WLAN_80211 && USB
|
|
default N
|
|
select FW_LOADER
|
|
---help---
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/asyncmesg.h linux-2.6.29-rc3.owrt/drivers/staging/benet/asyncmesg.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/asyncmesg.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/asyncmesg.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,82 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __asyncmesg_amap_h__
|
|
+#define __asyncmesg_amap_h__
|
|
+#include "fwcmd_common.h"
|
|
+
|
|
+/* --- ASYNC_EVENT_CODES --- */
|
|
+#define ASYNC_EVENT_CODE_LINK_STATE (1)
|
|
+#define ASYNC_EVENT_CODE_ISCSI (2)
|
|
+
|
|
+/* --- ASYNC_LINK_STATES --- */
|
|
+#define ASYNC_EVENT_LINK_DOWN (0) /* Link Down on a port */
|
|
+#define ASYNC_EVENT_LINK_UP (1) /* Link Up on a port */
|
|
+
|
|
+/*
|
|
+ * The last 4 bytes of the async events have this common format. It allows
|
|
+ * the driver to distinguish [link]MCC_CQ_ENTRY[/link] structs from
|
|
+ * asynchronous events. Both arrive on the same completion queue. This
|
|
+ * structure also contains the common fields used to decode the async event.
|
|
+ */
|
|
+struct BE_ASYNC_EVENT_TRAILER_AMAP {
|
|
+ u8 rsvd0[8]; /* DWORD 0 */
|
|
+ u8 event_code[8]; /* DWORD 0 */
|
|
+ u8 event_type[8]; /* DWORD 0 */
|
|
+ u8 rsvd1[6]; /* DWORD 0 */
|
|
+ u8 async_event; /* DWORD 0 */
|
|
+ u8 valid; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct ASYNC_EVENT_TRAILER_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Applicable in Initiator, Target and NIC modes.
|
|
+ * A link state async event is seen by all device drivers as soon they
|
|
+ * create an MCC ring. Thereafter, anytime the link status changes the
|
|
+ * drivers will receive a link state async event. Notifications continue to
|
|
+ * be sent until a driver destroys its MCC ring. A link down event is
|
|
+ * reported when either port loses link. A link up event is reported
|
|
+ * when either port regains link. When BE's failover mechanism is enabled, a
|
|
+ * link down on the active port causes traffic to be diverted to the standby
|
|
+ * port by the BE's ARM firmware (assuming the standby port has link). In
|
|
+ * this case, the standy port assumes the active status. Note: when link is
|
|
+ * restored on the failed port, traffic continues on the currently active
|
|
+ * port. The ARM firmware does not attempt to 'fail back' traffic to
|
|
+ * the restored port.
|
|
+ */
|
|
+struct BE_ASYNC_EVENT_LINK_STATE_AMAP {
|
|
+ u8 port0_link_status[8];
|
|
+ u8 port1_link_status[8];
|
|
+ u8 active_port[8];
|
|
+ u8 rsvd0[8]; /* DWORD 0 */
|
|
+ u8 port0_duplex[8];
|
|
+ u8 port0_speed[8];
|
|
+ u8 port1_duplex[8];
|
|
+ u8 port1_speed[8];
|
|
+ u8 port0_fault[8];
|
|
+ u8 port1_fault[8];
|
|
+ u8 rsvd1[2][8]; /* DWORD 2 */
|
|
+ struct BE_ASYNC_EVENT_TRAILER_AMAP trailer;
|
|
+} __packed;
|
|
+struct ASYNC_EVENT_LINK_STATE_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+#endif /* __asyncmesg_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/be_cm.h linux-2.6.29-rc3.owrt/drivers/staging/benet/be_cm.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/be_cm.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_cm.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,134 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __be_cm_amap_h__
|
|
+#define __be_cm_amap_h__
|
|
+#include "be_common.h"
|
|
+#include "etx_context.h"
|
|
+#include "mpu_context.h"
|
|
+
|
|
+/*
|
|
+ * --- CEV_WATERMARK_ENUM ---
|
|
+ * CQ/EQ Watermark Encodings. Encoded as number of free entries in
|
|
+ * Queue when Watermark is reached.
|
|
+ */
|
|
+#define CEV_WMARK_0 (0) /* Watermark when Queue full */
|
|
+#define CEV_WMARK_16 (1) /* Watermark at 16 free entries */
|
|
+#define CEV_WMARK_32 (2) /* Watermark at 32 free entries */
|
|
+#define CEV_WMARK_48 (3) /* Watermark at 48 free entries */
|
|
+#define CEV_WMARK_64 (4) /* Watermark at 64 free entries */
|
|
+#define CEV_WMARK_80 (5) /* Watermark at 80 free entries */
|
|
+#define CEV_WMARK_96 (6) /* Watermark at 96 free entries */
|
|
+#define CEV_WMARK_112 (7) /* Watermark at 112 free entries */
|
|
+#define CEV_WMARK_128 (8) /* Watermark at 128 free entries */
|
|
+#define CEV_WMARK_144 (9) /* Watermark at 144 free entries */
|
|
+#define CEV_WMARK_160 (10) /* Watermark at 160 free entries */
|
|
+#define CEV_WMARK_176 (11) /* Watermark at 176 free entries */
|
|
+#define CEV_WMARK_192 (12) /* Watermark at 192 free entries */
|
|
+#define CEV_WMARK_208 (13) /* Watermark at 208 free entries */
|
|
+#define CEV_WMARK_224 (14) /* Watermark at 224 free entries */
|
|
+#define CEV_WMARK_240 (15) /* Watermark at 240 free entries */
|
|
+
|
|
+/*
|
|
+ * --- CQ_CNT_ENUM ---
|
|
+ * Completion Queue Count Encodings.
|
|
+ */
|
|
+#define CEV_CQ_CNT_256 (0) /* CQ has 256 entries */
|
|
+#define CEV_CQ_CNT_512 (1) /* CQ has 512 entries */
|
|
+#define CEV_CQ_CNT_1024 (2) /* CQ has 1024 entries */
|
|
+
|
|
+/*
|
|
+ * --- EQ_CNT_ENUM ---
|
|
+ * Event Queue Count Encodings.
|
|
+ */
|
|
+#define CEV_EQ_CNT_256 (0) /* EQ has 256 entries (16-byte EQEs only) */
|
|
+#define CEV_EQ_CNT_512 (1) /* EQ has 512 entries (16-byte EQEs only) */
|
|
+#define CEV_EQ_CNT_1024 (2) /* EQ has 1024 entries (4-byte or */
|
|
+ /* 16-byte EQEs only) */
|
|
+#define CEV_EQ_CNT_2048 (3) /* EQ has 2048 entries (4-byte or */
|
|
+ /* 16-byte EQEs only) */
|
|
+#define CEV_EQ_CNT_4096 (4) /* EQ has 4096 entries (4-byte EQEs only) */
|
|
+
|
|
+/*
|
|
+ * --- EQ_SIZE_ENUM ---
|
|
+ * Event Queue Entry Size Encoding.
|
|
+ */
|
|
+#define CEV_EQ_SIZE_4 (0) /* EQE is 4 bytes */
|
|
+#define CEV_EQ_SIZE_16 (1) /* EQE is 16 bytes */
|
|
+
|
|
+/*
|
|
+ * Completion Queue Context Table Entry. Contains the state of a CQ.
|
|
+ * Located in RAM within the CEV block.
|
|
+ */
|
|
+struct BE_CQ_CONTEXT_AMAP {
|
|
+ u8 Cidx[11]; /* DWORD 0 */
|
|
+ u8 Watermark[4]; /* DWORD 0 */
|
|
+ u8 NoDelay; /* DWORD 0 */
|
|
+ u8 EPIdx[11]; /* DWORD 0 */
|
|
+ u8 Count[2]; /* DWORD 0 */
|
|
+ u8 valid; /* DWORD 0 */
|
|
+ u8 SolEvent; /* DWORD 0 */
|
|
+ u8 Eventable; /* DWORD 0 */
|
|
+ u8 Pidx[11]; /* DWORD 1 */
|
|
+ u8 PD[10]; /* DWORD 1 */
|
|
+ u8 EQID[7]; /* DWORD 1 */
|
|
+ u8 Func; /* DWORD 1 */
|
|
+ u8 WME; /* DWORD 1 */
|
|
+ u8 Stalled; /* DWORD 1 */
|
|
+ u8 Armed; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct CQ_CONTEXT_AMAP {
|
|
+ u32 dw[2];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Event Queue Context Table Entry. Contains the state of an EQ.
|
|
+ * Located in RAM in the CEV block.
|
|
+ */
|
|
+struct BE_EQ_CONTEXT_AMAP {
|
|
+ u8 Cidx[13]; /* DWORD 0 */
|
|
+ u8 rsvd0[2]; /* DWORD 0 */
|
|
+ u8 Func; /* DWORD 0 */
|
|
+ u8 EPIdx[13]; /* DWORD 0 */
|
|
+ u8 valid; /* DWORD 0 */
|
|
+ u8 rsvd1; /* DWORD 0 */
|
|
+ u8 Size; /* DWORD 0 */
|
|
+ u8 Pidx[13]; /* DWORD 1 */
|
|
+ u8 rsvd2[3]; /* DWORD 1 */
|
|
+ u8 PD[10]; /* DWORD 1 */
|
|
+ u8 Count[3]; /* DWORD 1 */
|
|
+ u8 SolEvent; /* DWORD 1 */
|
|
+ u8 Stalled; /* DWORD 1 */
|
|
+ u8 Armed; /* DWORD 1 */
|
|
+ u8 Watermark[4]; /* DWORD 2 */
|
|
+ u8 WME; /* DWORD 2 */
|
|
+ u8 rsvd3[3]; /* DWORD 2 */
|
|
+ u8 EventVect[6]; /* DWORD 2 */
|
|
+ u8 rsvd4[2]; /* DWORD 2 */
|
|
+ u8 Delay[8]; /* DWORD 2 */
|
|
+ u8 rsvd5[6]; /* DWORD 2 */
|
|
+ u8 TMR; /* DWORD 2 */
|
|
+ u8 rsvd6; /* DWORD 2 */
|
|
+ u8 rsvd7[32]; /* DWORD 3 */
|
|
+} __packed;
|
|
+struct EQ_CONTEXT_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+#endif /* __be_cm_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/be_common.h linux-2.6.29-rc3.owrt/drivers/staging/benet/be_common.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/be_common.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_common.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,53 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __be_common_amap_h__
|
|
+#define __be_common_amap_h__
|
|
+
|
|
+/* Physical Address. */
|
|
+struct BE_PHYS_ADDR_AMAP {
|
|
+ u8 lo[32]; /* DWORD 0 */
|
|
+ u8 hi[32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PHYS_ADDR_AMAP {
|
|
+ u32 dw[2];
|
|
+};
|
|
+
|
|
+/* Virtual Address. */
|
|
+struct BE_VIRT_ADDR_AMAP {
|
|
+ u8 lo[32]; /* DWORD 0 */
|
|
+ u8 hi[32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct VIRT_ADDR_AMAP {
|
|
+ u32 dw[2];
|
|
+};
|
|
+
|
|
+/* Scatter gather element. */
|
|
+struct BE_SGE_AMAP {
|
|
+ u8 addr_hi[32]; /* DWORD 0 */
|
|
+ u8 addr_lo[32]; /* DWORD 1 */
|
|
+ u8 rsvd0[32]; /* DWORD 2 */
|
|
+ u8 len[16]; /* DWORD 3 */
|
|
+ u8 rsvd1[16]; /* DWORD 3 */
|
|
+} __packed;
|
|
+struct SGE_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+#endif /* __be_common_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/be_ethtool.c linux-2.6.29-rc3.owrt/drivers/staging/benet/be_ethtool.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/be_ethtool.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_ethtool.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,348 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * be_ethtool.c
|
|
+ *
|
|
+ * This file contains various functions that ethtool can use
|
|
+ * to talk to the driver and the BE H/W.
|
|
+ */
|
|
+
|
|
+#include "benet.h"
|
|
+
|
|
+#include <linux/ethtool.h>
|
|
+
|
|
+static const char benet_gstrings_stats[][ETH_GSTRING_LEN] = {
|
|
+/* net_device_stats */
|
|
+ "rx_packets",
|
|
+ "tx_packets",
|
|
+ "rx_bytes",
|
|
+ "tx_bytes",
|
|
+ "rx_errors",
|
|
+ "tx_errors",
|
|
+ "rx_dropped",
|
|
+ "tx_dropped",
|
|
+ "multicast",
|
|
+ "collisions",
|
|
+ "rx_length_errors",
|
|
+ "rx_over_errors",
|
|
+ "rx_crc_errors",
|
|
+ "rx_frame_errors",
|
|
+ "rx_fifo_errors",
|
|
+ "rx_missed_errors",
|
|
+ "tx_aborted_errors",
|
|
+ "tx_carrier_errors",
|
|
+ "tx_fifo_errors",
|
|
+ "tx_heartbeat_errors",
|
|
+ "tx_window_errors",
|
|
+ "rx_compressed",
|
|
+ "tc_compressed",
|
|
+/* BE driver Stats */
|
|
+ "bes_tx_reqs",
|
|
+ "bes_tx_fails",
|
|
+ "bes_fwd_reqs",
|
|
+ "bes_tx_wrbs",
|
|
+ "bes_interrupts",
|
|
+ "bes_events",
|
|
+ "bes_tx_events",
|
|
+ "bes_rx_events",
|
|
+ "bes_tx_compl",
|
|
+ "bes_rx_compl",
|
|
+ "bes_ethrx_post_fail",
|
|
+ "bes_802_3_dropped_frames",
|
|
+ "bes_802_3_malformed_frames",
|
|
+ "bes_rx_misc_pkts",
|
|
+ "bes_eth_tx_rate",
|
|
+ "bes_eth_rx_rate",
|
|
+ "Num Packets collected",
|
|
+ "Num Times Flushed",
|
|
+};
|
|
+
|
|
+#define NET_DEV_STATS_LEN \
|
|
+ (sizeof(struct net_device_stats)/sizeof(unsigned long))
|
|
+
|
|
+#define BENET_STATS_LEN ARRAY_SIZE(benet_gstrings_stats)
|
|
+
|
|
+static void
|
|
+be_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+
|
|
+ strncpy(drvinfo->driver, be_driver_name, 32);
|
|
+ strncpy(drvinfo->version, be_drvr_ver, 32);
|
|
+ strncpy(drvinfo->fw_version, be_fw_ver, 32);
|
|
+ strcpy(drvinfo->bus_info, pci_name(adapter->pdev));
|
|
+ drvinfo->testinfo_len = 0;
|
|
+ drvinfo->regdump_len = 0;
|
|
+ drvinfo->eedump_len = 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+
|
|
+ coalesce->rx_max_coalesced_frames = adapter->max_rx_coal;
|
|
+
|
|
+ coalesce->rx_coalesce_usecs = adapter->cur_eqd;
|
|
+ coalesce->rx_coalesce_usecs_high = adapter->max_eqd;
|
|
+ coalesce->rx_coalesce_usecs_low = adapter->min_eqd;
|
|
+
|
|
+ coalesce->tx_coalesce_usecs = adapter->cur_eqd;
|
|
+ coalesce->tx_coalesce_usecs_high = adapter->max_eqd;
|
|
+ coalesce->tx_coalesce_usecs_low = adapter->min_eqd;
|
|
+
|
|
+ coalesce->use_adaptive_rx_coalesce = adapter->enable_aic;
|
|
+ coalesce->use_adaptive_tx_coalesce = adapter->enable_aic;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This routine is used to set interrup coalescing delay *as well as*
|
|
+ * the number of pkts to coalesce for LRO.
|
|
+ */
|
|
+static int
|
|
+be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ struct be_eq_object *eq_objectp;
|
|
+ u32 max, min, cur;
|
|
+ int status;
|
|
+
|
|
+ adapter->max_rx_coal = coalesce->rx_max_coalesced_frames;
|
|
+ if (adapter->max_rx_coal >= BE_LRO_MAX_PKTS)
|
|
+ adapter->max_rx_coal = BE_LRO_MAX_PKTS;
|
|
+
|
|
+ if (adapter->enable_aic == 0 &&
|
|
+ coalesce->use_adaptive_rx_coalesce == 1) {
|
|
+ /* if AIC is being turned on now, start with an EQD of 0 */
|
|
+ adapter->cur_eqd = 0;
|
|
+ }
|
|
+ adapter->enable_aic = coalesce->use_adaptive_rx_coalesce;
|
|
+
|
|
+ /* round off to nearest multiple of 8 */
|
|
+ max = (((coalesce->rx_coalesce_usecs_high + 4) >> 3) << 3);
|
|
+ min = (((coalesce->rx_coalesce_usecs_low + 4) >> 3) << 3);
|
|
+ cur = (((coalesce->rx_coalesce_usecs + 4) >> 3) << 3);
|
|
+
|
|
+ if (adapter->enable_aic) {
|
|
+ /* accept low and high if AIC is enabled */
|
|
+ if (max > MAX_EQD)
|
|
+ max = MAX_EQD;
|
|
+ if (min > max)
|
|
+ min = max;
|
|
+ adapter->max_eqd = max;
|
|
+ adapter->min_eqd = min;
|
|
+ if (adapter->cur_eqd > max)
|
|
+ adapter->cur_eqd = max;
|
|
+ if (adapter->cur_eqd < min)
|
|
+ adapter->cur_eqd = min;
|
|
+ } else {
|
|
+ /* accept specified coalesce_usecs only if AIC is disabled */
|
|
+ if (cur > MAX_EQD)
|
|
+ cur = MAX_EQD;
|
|
+ eq_objectp = &pnob->event_q_obj;
|
|
+ status =
|
|
+ be_eq_modify_delay(&pnob->fn_obj, 1, &eq_objectp, &cur,
|
|
+ NULL, NULL, NULL);
|
|
+ if (status == BE_SUCCESS)
|
|
+ adapter->cur_eqd = cur;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static u32 be_get_rx_csum(struct net_device *netdev)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ return adapter->rx_csum;
|
|
+}
|
|
+
|
|
+static int be_set_rx_csum(struct net_device *netdev, uint32_t data)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+
|
|
+ if (data)
|
|
+ adapter->rx_csum = 1;
|
|
+ else
|
|
+ adapter->rx_csum = 0;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void
|
|
+be_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data)
|
|
+{
|
|
+ switch (stringset) {
|
|
+ case ETH_SS_STATS:
|
|
+ memcpy(data, *benet_gstrings_stats,
|
|
+ sizeof(benet_gstrings_stats));
|
|
+ break;
|
|
+ }
|
|
+}
|
|
+
|
|
+static int be_get_stats_count(struct net_device *netdev)
|
|
+{
|
|
+ return BENET_STATS_LEN;
|
|
+}
|
|
+
|
|
+static void
|
|
+be_get_ethtool_stats(struct net_device *netdev,
|
|
+ struct ethtool_stats *stats, uint64_t *data)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ int i;
|
|
+
|
|
+ benet_get_stats(netdev);
|
|
+
|
|
+ for (i = 0; i <= NET_DEV_STATS_LEN; i++)
|
|
+ data[i] = ((unsigned long *)&adapter->benet_stats)[i];
|
|
+
|
|
+ data[i] = adapter->be_stat.bes_tx_reqs;
|
|
+ data[i++] = adapter->be_stat.bes_tx_fails;
|
|
+ data[i++] = adapter->be_stat.bes_fwd_reqs;
|
|
+ data[i++] = adapter->be_stat.bes_tx_wrbs;
|
|
+
|
|
+ data[i++] = adapter->be_stat.bes_ints;
|
|
+ data[i++] = adapter->be_stat.bes_events;
|
|
+ data[i++] = adapter->be_stat.bes_tx_events;
|
|
+ data[i++] = adapter->be_stat.bes_rx_events;
|
|
+ data[i++] = adapter->be_stat.bes_tx_compl;
|
|
+ data[i++] = adapter->be_stat.bes_rx_compl;
|
|
+ data[i++] = adapter->be_stat.bes_ethrx_post_fail;
|
|
+ data[i++] = adapter->be_stat.bes_802_3_dropped_frames;
|
|
+ data[i++] = adapter->be_stat.bes_802_3_malformed_frames;
|
|
+ data[i++] = adapter->be_stat.bes_rx_misc_pkts;
|
|
+ data[i++] = adapter->be_stat.bes_eth_tx_rate;
|
|
+ data[i++] = adapter->be_stat.bes_eth_rx_rate;
|
|
+ data[i++] = adapter->be_stat.bes_rx_coal;
|
|
+ data[i++] = adapter->be_stat.bes_rx_flush;
|
|
+
|
|
+}
|
|
+
|
|
+static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
|
|
+{
|
|
+ ecmd->speed = SPEED_10000;
|
|
+ ecmd->duplex = DUPLEX_FULL;
|
|
+ ecmd->autoneg = AUTONEG_DISABLE;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* Get the Ring parameters from the pnob */
|
|
+static void
|
|
+be_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+
|
|
+ /* Pre Set Maxims */
|
|
+ ring->rx_max_pending = pnob->rx_q_len;
|
|
+ ring->rx_mini_max_pending = ring->rx_mini_max_pending;
|
|
+ ring->rx_jumbo_max_pending = ring->rx_jumbo_max_pending;
|
|
+ ring->tx_max_pending = pnob->tx_q_len;
|
|
+
|
|
+ /* Current hardware Settings */
|
|
+ ring->rx_pending = atomic_read(&pnob->rx_q_posted);
|
|
+ ring->rx_mini_pending = ring->rx_mini_pending;
|
|
+ ring->rx_jumbo_pending = ring->rx_jumbo_pending;
|
|
+ ring->tx_pending = atomic_read(&pnob->tx_q_used);
|
|
+
|
|
+}
|
|
+
|
|
+static void
|
|
+be_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ bool rxfc, txfc;
|
|
+ int status;
|
|
+
|
|
+ status = be_eth_get_flow_control(&pnob->fn_obj, &txfc, &rxfc);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ dev_info(&netdev->dev, "Unable to get pause frame settings\n");
|
|
+ /* return defaults */
|
|
+ ecmd->rx_pause = 1;
|
|
+ ecmd->tx_pause = 0;
|
|
+ ecmd->autoneg = AUTONEG_ENABLE;
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (txfc == true)
|
|
+ ecmd->tx_pause = 1;
|
|
+ else
|
|
+ ecmd->tx_pause = 0;
|
|
+
|
|
+ if (rxfc == true)
|
|
+ ecmd->rx_pause = 1;
|
|
+ else
|
|
+ ecmd->rx_pause = 0;
|
|
+
|
|
+ ecmd->autoneg = AUTONEG_ENABLE;
|
|
+}
|
|
+
|
|
+static int
|
|
+be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ bool txfc, rxfc;
|
|
+ int status;
|
|
+
|
|
+ if (ecmd->autoneg != AUTONEG_ENABLE)
|
|
+ return -EINVAL;
|
|
+
|
|
+ if (ecmd->tx_pause)
|
|
+ txfc = true;
|
|
+ else
|
|
+ txfc = false;
|
|
+
|
|
+ if (ecmd->rx_pause)
|
|
+ rxfc = true;
|
|
+ else
|
|
+ rxfc = false;
|
|
+
|
|
+ status = be_eth_set_flow_control(&pnob->fn_obj, txfc, rxfc);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ dev_info(&netdev->dev, "Unable to set pause frame settings\n");
|
|
+ return -1;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+struct ethtool_ops be_ethtool_ops = {
|
|
+ .get_settings = be_get_settings,
|
|
+ .get_drvinfo = be_get_drvinfo,
|
|
+ .get_link = ethtool_op_get_link,
|
|
+ .get_coalesce = be_get_coalesce,
|
|
+ .set_coalesce = be_set_coalesce,
|
|
+ .get_ringparam = be_get_ringparam,
|
|
+ .get_pauseparam = be_get_pauseparam,
|
|
+ .set_pauseparam = be_set_pauseparam,
|
|
+ .get_rx_csum = be_get_rx_csum,
|
|
+ .set_rx_csum = be_set_rx_csum,
|
|
+ .get_tx_csum = ethtool_op_get_tx_csum,
|
|
+ .set_tx_csum = ethtool_op_set_tx_csum,
|
|
+ .get_sg = ethtool_op_get_sg,
|
|
+ .set_sg = ethtool_op_set_sg,
|
|
+ .get_tso = ethtool_op_get_tso,
|
|
+ .set_tso = ethtool_op_set_tso,
|
|
+ .get_strings = be_get_strings,
|
|
+ .get_stats_count = be_get_stats_count,
|
|
+ .get_ethtool_stats = be_get_ethtool_stats,
|
|
+};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/be_init.c linux-2.6.29-rc3.owrt/drivers/staging/benet/be_init.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/be_init.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_init.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,1382 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#include <linux/etherdevice.h>
|
|
+#include "benet.h"
|
|
+
|
|
+#define DRVR_VERSION "1.0.728"
|
|
+
|
|
+static const struct pci_device_id be_device_id_table[] = {
|
|
+ {PCI_DEVICE(0x19a2, 0x0201)},
|
|
+ {0}
|
|
+};
|
|
+
|
|
+MODULE_DEVICE_TABLE(pci, be_device_id_table);
|
|
+
|
|
+MODULE_VERSION(DRVR_VERSION);
|
|
+
|
|
+#define DRV_DESCRIPTION "ServerEngines BladeEngine Network Driver Version "
|
|
+
|
|
+MODULE_DESCRIPTION(DRV_DESCRIPTION DRVR_VERSION);
|
|
+MODULE_AUTHOR("ServerEngines");
|
|
+MODULE_LICENSE("GPL");
|
|
+
|
|
+static unsigned int msix = 1;
|
|
+module_param(msix, uint, S_IRUGO);
|
|
+MODULE_PARM_DESC(msix, "Use MSI-x interrupts");
|
|
+
|
|
+static unsigned int rxbuf_size = 2048; /* Default RX frag size */
|
|
+module_param(rxbuf_size, uint, S_IRUGO);
|
|
+MODULE_PARM_DESC(rxbuf_size, "Size of buffers to hold Rx data");
|
|
+
|
|
+const char be_drvr_ver[] = DRVR_VERSION;
|
|
+char be_fw_ver[32]; /* F/W version filled in by be_probe */
|
|
+char be_driver_name[] = "benet";
|
|
+
|
|
+/*
|
|
+ * Number of entries in each queue.
|
|
+ */
|
|
+#define EVENT_Q_LEN 1024
|
|
+#define ETH_TXQ_LEN 2048
|
|
+#define ETH_TXCQ_LEN 1024
|
|
+#define ETH_RXQ_LEN 1024 /* Does not support any other value */
|
|
+#define ETH_UC_RXCQ_LEN 1024
|
|
+#define ETH_BC_RXCQ_LEN 256
|
|
+#define MCC_Q_LEN 64 /* total size not to exceed 8 pages */
|
|
+#define MCC_CQ_LEN 256
|
|
+
|
|
+/* Bit mask describing events of interest to be traced */
|
|
+unsigned int trace_level;
|
|
+
|
|
+static int
|
|
+init_pci_be_function(struct be_adapter *adapter, struct pci_dev *pdev)
|
|
+{
|
|
+ u64 pa;
|
|
+
|
|
+ /* CSR */
|
|
+ pa = pci_resource_start(pdev, 2);
|
|
+ adapter->csr_va = ioremap_nocache(pa, pci_resource_len(pdev, 2));
|
|
+ if (adapter->csr_va == NULL)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ /* Door Bell */
|
|
+ pa = pci_resource_start(pdev, 4);
|
|
+ adapter->db_va = ioremap_nocache(pa, (128 * 1024));
|
|
+ if (adapter->db_va == NULL) {
|
|
+ iounmap(adapter->csr_va);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
+ /* PCI */
|
|
+ pa = pci_resource_start(pdev, 1);
|
|
+ adapter->pci_va = ioremap_nocache(pa, pci_resource_len(pdev, 1));
|
|
+ if (adapter->pci_va == NULL) {
|
|
+ iounmap(adapter->csr_va);
|
|
+ iounmap(adapter->db_va);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This function enables the interrupt corresponding to the Event
|
|
+ queue ID for the given NetObject
|
|
+*/
|
|
+void be_enable_eq_intr(struct be_net_object *pnob)
|
|
+{
|
|
+ struct CQ_DB_AMAP cqdb;
|
|
+ cqdb.dw[0] = 0;
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, event, &cqdb, 1);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, 1);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, 0);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, pnob->event_q_id);
|
|
+ PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]);
|
|
+}
|
|
+
|
|
+/*
|
|
+ This function disables the interrupt corresponding to the Event
|
|
+ queue ID for the given NetObject
|
|
+*/
|
|
+void be_disable_eq_intr(struct be_net_object *pnob)
|
|
+{
|
|
+ struct CQ_DB_AMAP cqdb;
|
|
+ cqdb.dw[0] = 0;
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, event, &cqdb, 1);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, 0);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, 0);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, pnob->event_q_id);
|
|
+ PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]);
|
|
+}
|
|
+
|
|
+/*
|
|
+ This function enables the interrupt from the network function
|
|
+ of the BladeEngine. Use the function be_disable_eq_intr()
|
|
+ to enable the interrupt from the event queue of only one specific
|
|
+ NetObject
|
|
+*/
|
|
+void be_enable_intr(struct be_net_object *pnob)
|
|
+{
|
|
+ struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl;
|
|
+ u32 host_intr;
|
|
+
|
|
+ ctrl.dw[0] = PCICFG1_READ(&pnob->fn_obj, host_timer_int_ctrl);
|
|
+ host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR,
|
|
+ hostintr, ctrl.dw);
|
|
+ if (!host_intr) {
|
|
+ AMAP_SET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR,
|
|
+ hostintr, ctrl.dw, 1);
|
|
+ PCICFG1_WRITE(&pnob->fn_obj, host_timer_int_ctrl,
|
|
+ ctrl.dw[0]);
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ This function disables the interrupt from the network function of
|
|
+ the BladeEngine. Use the function be_disable_eq_intr() to
|
|
+ disable the interrupt from the event queue of only one specific NetObject
|
|
+*/
|
|
+void be_disable_intr(struct be_net_object *pnob)
|
|
+{
|
|
+
|
|
+ struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl;
|
|
+ u32 host_intr;
|
|
+ ctrl.dw[0] = PCICFG1_READ(&pnob->fn_obj, host_timer_int_ctrl);
|
|
+ host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR,
|
|
+ hostintr, ctrl.dw);
|
|
+ if (host_intr) {
|
|
+ AMAP_SET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR, hostintr,
|
|
+ ctrl.dw, 0);
|
|
+ PCICFG1_WRITE(&pnob->fn_obj, host_timer_int_ctrl,
|
|
+ ctrl.dw[0]);
|
|
+ }
|
|
+}
|
|
+
|
|
+static int be_enable_msix(struct be_adapter *adapter)
|
|
+{
|
|
+ int i, ret;
|
|
+
|
|
+ if (!msix)
|
|
+ return -1;
|
|
+
|
|
+ for (i = 0; i < BE_MAX_REQ_MSIX_VECTORS; i++)
|
|
+ adapter->msix_entries[i].entry = i;
|
|
+
|
|
+ ret = pci_enable_msix(adapter->pdev, adapter->msix_entries,
|
|
+ BE_MAX_REQ_MSIX_VECTORS);
|
|
+
|
|
+ if (ret == 0)
|
|
+ adapter->msix_enabled = 1;
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int be_register_isr(struct be_adapter *adapter,
|
|
+ struct be_net_object *pnob)
|
|
+{
|
|
+ struct net_device *netdev = pnob->netdev;
|
|
+ int intx = 0, r;
|
|
+
|
|
+ netdev->irq = adapter->pdev->irq;
|
|
+ r = be_enable_msix(adapter);
|
|
+
|
|
+ if (r == 0) {
|
|
+ r = request_irq(adapter->msix_entries[0].vector,
|
|
+ be_int, IRQF_SHARED, netdev->name, netdev);
|
|
+ if (r) {
|
|
+ printk(KERN_WARNING
|
|
+ "MSIX Request IRQ failed - Errno %d\n", r);
|
|
+ intx = 1;
|
|
+ pci_disable_msix(adapter->pdev);
|
|
+ adapter->msix_enabled = 0;
|
|
+ }
|
|
+ } else {
|
|
+ intx = 1;
|
|
+ }
|
|
+
|
|
+ if (intx) {
|
|
+ r = request_irq(netdev->irq, be_int, IRQF_SHARED,
|
|
+ netdev->name, netdev);
|
|
+ if (r) {
|
|
+ printk(KERN_WARNING
|
|
+ "INTx Request IRQ failed - Errno %d\n", r);
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+ adapter->isr_registered = 1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void be_unregister_isr(struct be_adapter *adapter)
|
|
+{
|
|
+ struct net_device *netdev = adapter->netdevp;
|
|
+ if (adapter->isr_registered) {
|
|
+ if (adapter->msix_enabled) {
|
|
+ free_irq(adapter->msix_entries[0].vector, netdev);
|
|
+ pci_disable_msix(adapter->pdev);
|
|
+ adapter->msix_enabled = 0;
|
|
+ } else {
|
|
+ free_irq(netdev->irq, netdev);
|
|
+ }
|
|
+ adapter->isr_registered = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ This function processes the Flush Completions that are issued by the
|
|
+ ARM F/W, when a Recv Ring is destroyed. A flush completion is
|
|
+ identified when a Rx COmpl descriptor has the tcpcksum and udpcksum
|
|
+ set and the pktsize is 32. These completions are received on the
|
|
+ Rx Completion Queue.
|
|
+*/
|
|
+static u32 be_process_rx_flush_cmpl(struct be_net_object *pnob)
|
|
+{
|
|
+ struct ETH_RX_COMPL_AMAP *rxcp;
|
|
+ unsigned int i = 0;
|
|
+ while ((rxcp = be_get_rx_cmpl(pnob)) != NULL) {
|
|
+ be_notify_cmpl(pnob, 1, pnob->rx_cq_id, 1);
|
|
+ i++;
|
|
+ }
|
|
+ return i;
|
|
+}
|
|
+
|
|
+static void be_tx_q_clean(struct be_net_object *pnob)
|
|
+{
|
|
+ while (atomic_read(&pnob->tx_q_used))
|
|
+ process_one_tx_compl(pnob, tx_compl_lastwrb_idx_get(pnob));
|
|
+}
|
|
+
|
|
+static void be_rx_q_clean(struct be_net_object *pnob)
|
|
+{
|
|
+ if (pnob->rx_ctxt) {
|
|
+ int i;
|
|
+ struct be_rx_page_info *rx_page_info;
|
|
+ for (i = 0; i < pnob->rx_q_len; i++) {
|
|
+ rx_page_info = &(pnob->rx_page_info[i]);
|
|
+ if (!pnob->rx_pg_shared || rx_page_info->page_offset) {
|
|
+ pci_unmap_page(pnob->adapter->pdev,
|
|
+ pci_unmap_addr(rx_page_info, bus),
|
|
+ pnob->rx_buf_size,
|
|
+ PCI_DMA_FROMDEVICE);
|
|
+ }
|
|
+ if (rx_page_info->page)
|
|
+ put_page(rx_page_info->page);
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+ }
|
|
+ pnob->rx_pg_info_hd = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void be_destroy_netobj(struct be_net_object *pnob)
|
|
+{
|
|
+ int status;
|
|
+
|
|
+ if (pnob->tx_q_created) {
|
|
+ status = be_eth_sq_destroy(&pnob->tx_q_obj);
|
|
+ pnob->tx_q_created = 0;
|
|
+ }
|
|
+
|
|
+ if (pnob->rx_q_created) {
|
|
+ status = be_eth_rq_destroy(&pnob->rx_q_obj);
|
|
+ if (status != 0) {
|
|
+ status = be_eth_rq_destroy_options(&pnob->rx_q_obj, 0,
|
|
+ NULL, NULL);
|
|
+ BUG_ON(status);
|
|
+ }
|
|
+ pnob->rx_q_created = 0;
|
|
+ }
|
|
+
|
|
+ be_process_rx_flush_cmpl(pnob);
|
|
+
|
|
+ if (pnob->tx_cq_created) {
|
|
+ status = be_cq_destroy(&pnob->tx_cq_obj);
|
|
+ pnob->tx_cq_created = 0;
|
|
+ }
|
|
+
|
|
+ if (pnob->rx_cq_created) {
|
|
+ status = be_cq_destroy(&pnob->rx_cq_obj);
|
|
+ pnob->rx_cq_created = 0;
|
|
+ }
|
|
+
|
|
+ if (pnob->mcc_q_created) {
|
|
+ status = be_mcc_ring_destroy(&pnob->mcc_q_obj);
|
|
+ pnob->mcc_q_created = 0;
|
|
+ }
|
|
+ if (pnob->mcc_cq_created) {
|
|
+ status = be_cq_destroy(&pnob->mcc_cq_obj);
|
|
+ pnob->mcc_cq_created = 0;
|
|
+ }
|
|
+
|
|
+ if (pnob->event_q_created) {
|
|
+ status = be_eq_destroy(&pnob->event_q_obj);
|
|
+ pnob->event_q_created = 0;
|
|
+ }
|
|
+ be_function_cleanup(&pnob->fn_obj);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * free all resources associated with a pnob
|
|
+ * Called at the time of module cleanup as well a any error during
|
|
+ * module init. Some resources may be partially allocated in a NetObj.
|
|
+ */
|
|
+static void netobject_cleanup(struct be_adapter *adapter,
|
|
+ struct be_net_object *pnob)
|
|
+{
|
|
+ struct net_device *netdev = adapter->netdevp;
|
|
+
|
|
+ if (netif_running(netdev)) {
|
|
+ netif_stop_queue(netdev);
|
|
+ be_wait_nic_tx_cmplx_cmpl(pnob);
|
|
+ be_disable_eq_intr(pnob);
|
|
+ }
|
|
+
|
|
+ be_unregister_isr(adapter);
|
|
+
|
|
+ if (adapter->tasklet_started) {
|
|
+ tasklet_kill(&(adapter->sts_handler));
|
|
+ adapter->tasklet_started = 0;
|
|
+ }
|
|
+ if (pnob->fn_obj_created)
|
|
+ be_disable_intr(pnob);
|
|
+
|
|
+ if (adapter->dev_state != BE_DEV_STATE_NONE)
|
|
+ unregister_netdev(netdev);
|
|
+
|
|
+ if (pnob->fn_obj_created)
|
|
+ be_destroy_netobj(pnob);
|
|
+
|
|
+ adapter->net_obj = NULL;
|
|
+ adapter->netdevp = NULL;
|
|
+
|
|
+ be_rx_q_clean(pnob);
|
|
+ if (pnob->rx_ctxt) {
|
|
+ kfree(pnob->rx_page_info);
|
|
+ kfree(pnob->rx_ctxt);
|
|
+ }
|
|
+
|
|
+ be_tx_q_clean(pnob);
|
|
+ kfree(pnob->tx_ctxt);
|
|
+
|
|
+ if (pnob->mcc_q)
|
|
+ pci_free_consistent(adapter->pdev, pnob->mcc_q_size,
|
|
+ pnob->mcc_q, pnob->mcc_q_bus);
|
|
+
|
|
+ if (pnob->mcc_wrb_ctxt)
|
|
+ free_pages((unsigned long)pnob->mcc_wrb_ctxt,
|
|
+ get_order(pnob->mcc_wrb_ctxt_size));
|
|
+
|
|
+ if (pnob->mcc_cq)
|
|
+ pci_free_consistent(adapter->pdev, pnob->mcc_cq_size,
|
|
+ pnob->mcc_cq, pnob->mcc_cq_bus);
|
|
+
|
|
+ if (pnob->event_q)
|
|
+ pci_free_consistent(adapter->pdev, pnob->event_q_size,
|
|
+ pnob->event_q, pnob->event_q_bus);
|
|
+
|
|
+ if (pnob->tx_cq)
|
|
+ pci_free_consistent(adapter->pdev, pnob->tx_cq_size,
|
|
+ pnob->tx_cq, pnob->tx_cq_bus);
|
|
+
|
|
+ if (pnob->tx_q)
|
|
+ pci_free_consistent(adapter->pdev, pnob->tx_q_size,
|
|
+ pnob->tx_q, pnob->tx_q_bus);
|
|
+
|
|
+ if (pnob->rx_q)
|
|
+ pci_free_consistent(adapter->pdev, pnob->rx_q_size,
|
|
+ pnob->rx_q, pnob->rx_q_bus);
|
|
+
|
|
+ if (pnob->rx_cq)
|
|
+ pci_free_consistent(adapter->pdev, pnob->rx_cq_size,
|
|
+ pnob->rx_cq, pnob->rx_cq_bus);
|
|
+
|
|
+
|
|
+ if (pnob->mb_ptr)
|
|
+ pci_free_consistent(adapter->pdev, pnob->mb_size, pnob->mb_ptr,
|
|
+ pnob->mb_bus);
|
|
+
|
|
+ free_netdev(netdev);
|
|
+}
|
|
+
|
|
+
|
|
+static int be_nob_ring_alloc(struct be_adapter *adapter,
|
|
+ struct be_net_object *pnob)
|
|
+{
|
|
+ u32 size;
|
|
+
|
|
+ /* Mail box rd; mailbox pointer needs to be 16 byte aligned */
|
|
+ pnob->mb_size = sizeof(struct MCC_MAILBOX_AMAP) + 16;
|
|
+ pnob->mb_ptr = pci_alloc_consistent(adapter->pdev, pnob->mb_size,
|
|
+ &pnob->mb_bus);
|
|
+ if (!pnob->mb_bus)
|
|
+ return -1;
|
|
+ memset(pnob->mb_ptr, 0, pnob->mb_size);
|
|
+ pnob->mb_rd.va = PTR_ALIGN(pnob->mb_ptr, 16);
|
|
+ pnob->mb_rd.pa = PTR_ALIGN(pnob->mb_bus, 16);
|
|
+ pnob->mb_rd.length = sizeof(struct MCC_MAILBOX_AMAP);
|
|
+ /*
|
|
+ * Event queue
|
|
+ */
|
|
+ pnob->event_q_len = EVENT_Q_LEN;
|
|
+ pnob->event_q_size = pnob->event_q_len * sizeof(struct EQ_ENTRY_AMAP);
|
|
+ pnob->event_q = pci_alloc_consistent(adapter->pdev, pnob->event_q_size,
|
|
+ &pnob->event_q_bus);
|
|
+ if (!pnob->event_q_bus)
|
|
+ return -1;
|
|
+ memset(pnob->event_q, 0, pnob->event_q_size);
|
|
+ /*
|
|
+ * Eth TX queue
|
|
+ */
|
|
+ pnob->tx_q_len = ETH_TXQ_LEN;
|
|
+ pnob->tx_q_port = 0;
|
|
+ pnob->tx_q_size = pnob->tx_q_len * sizeof(struct ETH_WRB_AMAP);
|
|
+ pnob->tx_q = pci_alloc_consistent(adapter->pdev, pnob->tx_q_size,
|
|
+ &pnob->tx_q_bus);
|
|
+ if (!pnob->tx_q_bus)
|
|
+ return -1;
|
|
+ memset(pnob->tx_q, 0, pnob->tx_q_size);
|
|
+ /*
|
|
+ * Eth TX Compl queue
|
|
+ */
|
|
+ pnob->txcq_len = ETH_TXCQ_LEN;
|
|
+ pnob->tx_cq_size = pnob->txcq_len * sizeof(struct ETH_TX_COMPL_AMAP);
|
|
+ pnob->tx_cq = pci_alloc_consistent(adapter->pdev, pnob->tx_cq_size,
|
|
+ &pnob->tx_cq_bus);
|
|
+ if (!pnob->tx_cq_bus)
|
|
+ return -1;
|
|
+ memset(pnob->tx_cq, 0, pnob->tx_cq_size);
|
|
+ /*
|
|
+ * Eth RX queue
|
|
+ */
|
|
+ pnob->rx_q_len = ETH_RXQ_LEN;
|
|
+ pnob->rx_q_size = pnob->rx_q_len * sizeof(struct ETH_RX_D_AMAP);
|
|
+ pnob->rx_q = pci_alloc_consistent(adapter->pdev, pnob->rx_q_size,
|
|
+ &pnob->rx_q_bus);
|
|
+ if (!pnob->rx_q_bus)
|
|
+ return -1;
|
|
+ memset(pnob->rx_q, 0, pnob->rx_q_size);
|
|
+ /*
|
|
+ * Eth Unicast RX Compl queue
|
|
+ */
|
|
+ pnob->rx_cq_len = ETH_UC_RXCQ_LEN;
|
|
+ pnob->rx_cq_size = pnob->rx_cq_len *
|
|
+ sizeof(struct ETH_RX_COMPL_AMAP);
|
|
+ pnob->rx_cq = pci_alloc_consistent(adapter->pdev, pnob->rx_cq_size,
|
|
+ &pnob->rx_cq_bus);
|
|
+ if (!pnob->rx_cq_bus)
|
|
+ return -1;
|
|
+ memset(pnob->rx_cq, 0, pnob->rx_cq_size);
|
|
+
|
|
+ /* TX resources */
|
|
+ size = pnob->tx_q_len * sizeof(void **);
|
|
+ pnob->tx_ctxt = kzalloc(size, GFP_KERNEL);
|
|
+ if (pnob->tx_ctxt == NULL)
|
|
+ return -1;
|
|
+
|
|
+ /* RX resources */
|
|
+ size = pnob->rx_q_len * sizeof(void *);
|
|
+ pnob->rx_ctxt = kzalloc(size, GFP_KERNEL);
|
|
+ if (pnob->rx_ctxt == NULL)
|
|
+ return -1;
|
|
+
|
|
+ size = (pnob->rx_q_len * sizeof(struct be_rx_page_info));
|
|
+ pnob->rx_page_info = kzalloc(size, GFP_KERNEL);
|
|
+ if (pnob->rx_page_info == NULL)
|
|
+ return -1;
|
|
+
|
|
+ adapter->eth_statsp = kzalloc(sizeof(struct FWCMD_ETH_GET_STATISTICS),
|
|
+ GFP_KERNEL);
|
|
+ if (adapter->eth_statsp == NULL)
|
|
+ return -1;
|
|
+ pnob->rx_buf_size = rxbuf_size;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This function initializes the be_net_object for subsequent
|
|
+ network operations.
|
|
+
|
|
+ Before calling this function, the driver must have allocated
|
|
+ space for the NetObject structure, initialized the structure,
|
|
+ allocated DMAable memory for all the network queues that form
|
|
+ part of the NetObject and populated the start address (virtual)
|
|
+ and number of entries allocated for each queue in the NetObject structure.
|
|
+
|
|
+ The driver must also have allocated memory to hold the
|
|
+ mailbox structure (MCC_MAILBOX) and post the physical address,
|
|
+ virtual addresses and the size of the mailbox memory in the
|
|
+ NetObj.mb_rd. This structure is used by BECLIB for
|
|
+ initial communication with the embedded MCC processor. BECLIB
|
|
+ uses the mailbox until MCC rings are created for more efficient
|
|
+ communication with the MCC processor.
|
|
+
|
|
+ If the driver wants to create multiple network interface for more
|
|
+ than one protection domain, it can call be_create_netobj()
|
|
+ multiple times once for each protection domain. A Maximum of
|
|
+ 32 protection domains are supported.
|
|
+
|
|
+*/
|
|
+static int
|
|
+be_create_netobj(struct be_net_object *pnob, u8 __iomem *csr_va,
|
|
+ u8 __iomem *db_va, u8 __iomem *pci_va)
|
|
+{
|
|
+ int status = 0;
|
|
+ bool eventable = false, tx_no_delay = false, rx_no_delay = false;
|
|
+ struct be_eq_object *eq_objectp = NULL;
|
|
+ struct be_function_object *pfob = &pnob->fn_obj;
|
|
+ struct ring_desc rd;
|
|
+ u32 set_rxbuf_size;
|
|
+ u32 tx_cmpl_wm = CEV_WMARK_96; /* 0xffffffff to disable */
|
|
+ u32 rx_cmpl_wm = CEV_WMARK_160; /* 0xffffffff to disable */
|
|
+ u32 eq_delay = 0; /* delay in 8usec units. 0xffffffff to disable */
|
|
+
|
|
+ memset(&rd, 0, sizeof(struct ring_desc));
|
|
+
|
|
+ status = be_function_object_create(csr_va, db_va, pci_va,
|
|
+ BE_FUNCTION_TYPE_NETWORK, &pnob->mb_rd, pfob);
|
|
+ if (status != BE_SUCCESS)
|
|
+ return status;
|
|
+ pnob->fn_obj_created = true;
|
|
+
|
|
+ if (tx_cmpl_wm == 0xffffffff)
|
|
+ tx_no_delay = true;
|
|
+ if (rx_cmpl_wm == 0xffffffff)
|
|
+ rx_no_delay = true;
|
|
+ /*
|
|
+ * now create the necessary rings
|
|
+ * Event Queue first.
|
|
+ */
|
|
+ if (pnob->event_q_len) {
|
|
+ rd.va = pnob->event_q;
|
|
+ rd.pa = pnob->event_q_bus;
|
|
+ rd.length = pnob->event_q_size;
|
|
+
|
|
+ status = be_eq_create(pfob, &rd, 4, pnob->event_q_len,
|
|
+ (u32) -1, /* CEV_WMARK_* or -1 */
|
|
+ eq_delay, /* in 8us units, or -1 */
|
|
+ &pnob->event_q_obj);
|
|
+ if (status != BE_SUCCESS)
|
|
+ goto error_ret;
|
|
+ pnob->event_q_id = pnob->event_q_obj.eq_id;
|
|
+ pnob->event_q_created = 1;
|
|
+ eventable = true;
|
|
+ eq_objectp = &pnob->event_q_obj;
|
|
+ }
|
|
+ /*
|
|
+ * Now Eth Tx Compl. queue.
|
|
+ */
|
|
+ if (pnob->txcq_len) {
|
|
+ rd.va = pnob->tx_cq;
|
|
+ rd.pa = pnob->tx_cq_bus;
|
|
+ rd.length = pnob->tx_cq_size;
|
|
+
|
|
+ status = be_cq_create(pfob, &rd,
|
|
+ pnob->txcq_len * sizeof(struct ETH_TX_COMPL_AMAP),
|
|
+ false, /* solicted events, */
|
|
+ tx_no_delay, /* nodelay */
|
|
+ tx_cmpl_wm, /* Watermark encodings */
|
|
+ eq_objectp, &pnob->tx_cq_obj);
|
|
+ if (status != BE_SUCCESS)
|
|
+ goto error_ret;
|
|
+
|
|
+ pnob->tx_cq_id = pnob->tx_cq_obj.cq_id;
|
|
+ pnob->tx_cq_created = 1;
|
|
+ }
|
|
+ /*
|
|
+ * Eth Tx queue
|
|
+ */
|
|
+ if (pnob->tx_q_len) {
|
|
+ struct be_eth_sq_parameters ex_params = { 0 };
|
|
+ u32 type;
|
|
+
|
|
+ if (pnob->tx_q_port) {
|
|
+ /* TXQ to be bound to a specific port */
|
|
+ type = BE_ETH_TX_RING_TYPE_BOUND;
|
|
+ ex_params.port = pnob->tx_q_port - 1;
|
|
+ } else
|
|
+ type = BE_ETH_TX_RING_TYPE_STANDARD;
|
|
+
|
|
+ rd.va = pnob->tx_q;
|
|
+ rd.pa = pnob->tx_q_bus;
|
|
+ rd.length = pnob->tx_q_size;
|
|
+
|
|
+ status = be_eth_sq_create_ex(pfob, &rd,
|
|
+ pnob->tx_q_len * sizeof(struct ETH_WRB_AMAP),
|
|
+ type, 2, &pnob->tx_cq_obj,
|
|
+ &ex_params, &pnob->tx_q_obj);
|
|
+
|
|
+ if (status != BE_SUCCESS)
|
|
+ goto error_ret;
|
|
+
|
|
+ pnob->tx_q_id = pnob->tx_q_obj.bid;
|
|
+ pnob->tx_q_created = 1;
|
|
+ }
|
|
+ /*
|
|
+ * Now Eth Rx compl. queue. Always needed.
|
|
+ */
|
|
+ rd.va = pnob->rx_cq;
|
|
+ rd.pa = pnob->rx_cq_bus;
|
|
+ rd.length = pnob->rx_cq_size;
|
|
+
|
|
+ status = be_cq_create(pfob, &rd,
|
|
+ pnob->rx_cq_len * sizeof(struct ETH_RX_COMPL_AMAP),
|
|
+ false, /* solicted events, */
|
|
+ rx_no_delay, /* nodelay */
|
|
+ rx_cmpl_wm, /* Watermark encodings */
|
|
+ eq_objectp, &pnob->rx_cq_obj);
|
|
+ if (status != BE_SUCCESS)
|
|
+ goto error_ret;
|
|
+
|
|
+ pnob->rx_cq_id = pnob->rx_cq_obj.cq_id;
|
|
+ pnob->rx_cq_created = 1;
|
|
+
|
|
+ status = be_eth_rq_set_frag_size(pfob, pnob->rx_buf_size,
|
|
+ (u32 *) &set_rxbuf_size);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ be_eth_rq_get_frag_size(pfob, (u32 *) &pnob->rx_buf_size);
|
|
+ if ((pnob->rx_buf_size != 2048) && (pnob->rx_buf_size != 4096)
|
|
+ && (pnob->rx_buf_size != 8192))
|
|
+ goto error_ret;
|
|
+ } else {
|
|
+ if (pnob->rx_buf_size != set_rxbuf_size)
|
|
+ pnob->rx_buf_size = set_rxbuf_size;
|
|
+ }
|
|
+ /*
|
|
+ * Eth RX queue. be_eth_rq_create() always assumes 2 pages size
|
|
+ */
|
|
+ rd.va = pnob->rx_q;
|
|
+ rd.pa = pnob->rx_q_bus;
|
|
+ rd.length = pnob->rx_q_size;
|
|
+
|
|
+ status = be_eth_rq_create(pfob, &rd, &pnob->rx_cq_obj,
|
|
+ &pnob->rx_cq_obj, &pnob->rx_q_obj);
|
|
+
|
|
+ if (status != BE_SUCCESS)
|
|
+ goto error_ret;
|
|
+
|
|
+ pnob->rx_q_id = pnob->rx_q_obj.rid;
|
|
+ pnob->rx_q_created = 1;
|
|
+
|
|
+ return BE_SUCCESS; /* All required queues created. */
|
|
+
|
|
+error_ret:
|
|
+ be_destroy_netobj(pnob);
|
|
+ return status;
|
|
+}
|
|
+
|
|
+static int be_nob_ring_init(struct be_adapter *adapter,
|
|
+ struct be_net_object *pnob)
|
|
+{
|
|
+ int status;
|
|
+
|
|
+ pnob->event_q_tl = 0;
|
|
+
|
|
+ pnob->tx_q_hd = 0;
|
|
+ pnob->tx_q_tl = 0;
|
|
+
|
|
+ pnob->tx_cq_tl = 0;
|
|
+
|
|
+ pnob->rx_cq_tl = 0;
|
|
+
|
|
+ memset(pnob->event_q, 0, pnob->event_q_size);
|
|
+ memset(pnob->tx_cq, 0, pnob->tx_cq_size);
|
|
+ memset(pnob->tx_ctxt, 0, pnob->tx_q_len * sizeof(void **));
|
|
+ memset(pnob->rx_ctxt, 0, pnob->rx_q_len * sizeof(void *));
|
|
+ pnob->rx_pg_info_hd = 0;
|
|
+ pnob->rx_q_hd = 0;
|
|
+ atomic_set(&pnob->rx_q_posted, 0);
|
|
+
|
|
+ status = be_create_netobj(pnob, adapter->csr_va, adapter->db_va,
|
|
+ adapter->pci_va);
|
|
+ if (status != BE_SUCCESS)
|
|
+ return -1;
|
|
+
|
|
+ be_post_eth_rx_buffs(pnob);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* This function handles async callback for link status */
|
|
+static void
|
|
+be_link_status_async_callback(void *context, u32 event_code, void *event)
|
|
+{
|
|
+ struct ASYNC_EVENT_LINK_STATE_AMAP *link_status = event;
|
|
+ struct be_adapter *adapter = context;
|
|
+ bool link_enable = false;
|
|
+ struct be_net_object *pnob;
|
|
+ struct ASYNC_EVENT_TRAILER_AMAP *async_trailer;
|
|
+ struct net_device *netdev;
|
|
+ u32 async_event_code, async_event_type, active_port;
|
|
+ u32 port0_link_status, port1_link_status, port0_duplex, port1_duplex;
|
|
+ u32 port0_speed, port1_speed;
|
|
+
|
|
+ if (event_code != ASYNC_EVENT_CODE_LINK_STATE) {
|
|
+ /* Not our event to handle */
|
|
+ return;
|
|
+ }
|
|
+ async_trailer = (struct ASYNC_EVENT_TRAILER_AMAP *)
|
|
+ ((u8 *) event + sizeof(struct MCC_CQ_ENTRY_AMAP) -
|
|
+ sizeof(struct ASYNC_EVENT_TRAILER_AMAP));
|
|
+
|
|
+ async_event_code = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, event_code,
|
|
+ async_trailer);
|
|
+ BUG_ON(async_event_code != ASYNC_EVENT_CODE_LINK_STATE);
|
|
+
|
|
+ pnob = adapter->net_obj;
|
|
+ netdev = pnob->netdev;
|
|
+
|
|
+ /* Determine if this event is a switch VLD or a physical link event */
|
|
+ async_event_type = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, event_type,
|
|
+ async_trailer);
|
|
+ active_port = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
|
|
+ active_port, link_status);
|
|
+ port0_link_status = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
|
|
+ port0_link_status, link_status);
|
|
+ port1_link_status = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
|
|
+ port1_link_status, link_status);
|
|
+ port0_duplex = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
|
|
+ port0_duplex, link_status);
|
|
+ port1_duplex = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
|
|
+ port1_duplex, link_status);
|
|
+ port0_speed = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
|
|
+ port0_speed, link_status);
|
|
+ port1_speed = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
|
|
+ port1_speed, link_status);
|
|
+ if (async_event_type == NTWK_LINK_TYPE_VIRTUAL) {
|
|
+ adapter->be_stat.bes_link_change_virtual++;
|
|
+ if (adapter->be_link_sts->active_port != active_port) {
|
|
+ dev_notice(&netdev->dev,
|
|
+ "Active port changed due to VLD on switch\n");
|
|
+ } else {
|
|
+ dev_notice(&netdev->dev, "Link status update\n");
|
|
+ }
|
|
+
|
|
+ } else {
|
|
+ adapter->be_stat.bes_link_change_physical++;
|
|
+ if (adapter->be_link_sts->active_port != active_port) {
|
|
+ dev_notice(&netdev->dev,
|
|
+ "Active port changed due to port link"
|
|
+ " status change\n");
|
|
+ } else {
|
|
+ dev_notice(&netdev->dev, "Link status update\n");
|
|
+ }
|
|
+ }
|
|
+
|
|
+ memset(adapter->be_link_sts, 0, sizeof(adapter->be_link_sts));
|
|
+
|
|
+ if ((port0_link_status == ASYNC_EVENT_LINK_UP) ||
|
|
+ (port1_link_status == ASYNC_EVENT_LINK_UP)) {
|
|
+ if ((adapter->port0_link_sts == BE_PORT_LINK_DOWN) &&
|
|
+ (adapter->port1_link_sts == BE_PORT_LINK_DOWN)) {
|
|
+ /* Earlier both the ports are down So link is up */
|
|
+ link_enable = true;
|
|
+ }
|
|
+
|
|
+ if (port0_link_status == ASYNC_EVENT_LINK_UP) {
|
|
+ adapter->port0_link_sts = BE_PORT_LINK_UP;
|
|
+ adapter->be_link_sts->mac0_duplex = port0_duplex;
|
|
+ adapter->be_link_sts->mac0_speed = port0_speed;
|
|
+ if (active_port == NTWK_PORT_A)
|
|
+ adapter->be_link_sts->active_port = 0;
|
|
+ } else
|
|
+ adapter->port0_link_sts = BE_PORT_LINK_DOWN;
|
|
+
|
|
+ if (port1_link_status == ASYNC_EVENT_LINK_UP) {
|
|
+ adapter->port1_link_sts = BE_PORT_LINK_UP;
|
|
+ adapter->be_link_sts->mac1_duplex = port1_duplex;
|
|
+ adapter->be_link_sts->mac1_speed = port1_speed;
|
|
+ if (active_port == NTWK_PORT_B)
|
|
+ adapter->be_link_sts->active_port = 1;
|
|
+ } else
|
|
+ adapter->port1_link_sts = BE_PORT_LINK_DOWN;
|
|
+
|
|
+ printk(KERN_INFO "Link Properties for %s:\n", netdev->name);
|
|
+ dev_info(&netdev->dev, "Link Properties:\n");
|
|
+ be_print_link_info(adapter->be_link_sts);
|
|
+
|
|
+ if (!link_enable)
|
|
+ return;
|
|
+ /*
|
|
+ * Both ports were down previously, but atleast one of
|
|
+ * them has come up if this netdevice's carrier is not up,
|
|
+ * then indicate to stack
|
|
+ */
|
|
+ if (!netif_carrier_ok(netdev)) {
|
|
+ netif_start_queue(netdev);
|
|
+ netif_carrier_on(netdev);
|
|
+ }
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* Now both the ports are down. Tell the stack about it */
|
|
+ dev_info(&netdev->dev, "Both ports are down\n");
|
|
+ adapter->port0_link_sts = BE_PORT_LINK_DOWN;
|
|
+ adapter->port1_link_sts = BE_PORT_LINK_DOWN;
|
|
+ if (netif_carrier_ok(netdev)) {
|
|
+ netif_carrier_off(netdev);
|
|
+ netif_stop_queue(netdev);
|
|
+ }
|
|
+ return;
|
|
+}
|
|
+
|
|
+static int be_mcc_create(struct be_adapter *adapter)
|
|
+{
|
|
+ struct be_net_object *pnob;
|
|
+
|
|
+ pnob = adapter->net_obj;
|
|
+ /*
|
|
+ * Create the MCC ring so that all further communication with
|
|
+ * MCC can go thru the ring. we do this at the end since
|
|
+ * we do not want to be dealing with interrupts until the
|
|
+ * initialization is complete.
|
|
+ */
|
|
+ pnob->mcc_q_len = MCC_Q_LEN;
|
|
+ pnob->mcc_q_size = pnob->mcc_q_len * sizeof(struct MCC_WRB_AMAP);
|
|
+ pnob->mcc_q = pci_alloc_consistent(adapter->pdev, pnob->mcc_q_size,
|
|
+ &pnob->mcc_q_bus);
|
|
+ if (!pnob->mcc_q_bus)
|
|
+ return -1;
|
|
+ /*
|
|
+ * space for MCC WRB context
|
|
+ */
|
|
+ pnob->mcc_wrb_ctxtLen = MCC_Q_LEN;
|
|
+ pnob->mcc_wrb_ctxt_size = pnob->mcc_wrb_ctxtLen *
|
|
+ sizeof(struct be_mcc_wrb_context);
|
|
+ pnob->mcc_wrb_ctxt = (void *)__get_free_pages(GFP_KERNEL,
|
|
+ get_order(pnob->mcc_wrb_ctxt_size));
|
|
+ if (pnob->mcc_wrb_ctxt == NULL)
|
|
+ return -1;
|
|
+ /*
|
|
+ * Space for MCC compl. ring
|
|
+ */
|
|
+ pnob->mcc_cq_len = MCC_CQ_LEN;
|
|
+ pnob->mcc_cq_size = pnob->mcc_cq_len * sizeof(struct MCC_CQ_ENTRY_AMAP);
|
|
+ pnob->mcc_cq = pci_alloc_consistent(adapter->pdev, pnob->mcc_cq_size,
|
|
+ &pnob->mcc_cq_bus);
|
|
+ if (!pnob->mcc_cq_bus)
|
|
+ return -1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This function creates the MCC request and completion ring required
|
|
+ for communicating with the ARM processor. The caller must have
|
|
+ allocated required amount of memory for the MCC ring and MCC
|
|
+ completion ring and posted the virtual address and number of
|
|
+ entries in the corresponding members (mcc_q and mcc_cq) in the
|
|
+ NetObject struture.
|
|
+
|
|
+ When this call is completed, all further communication with
|
|
+ ARM will switch from mailbox to this ring.
|
|
+
|
|
+ pnob - Pointer to the NetObject structure. This NetObject should
|
|
+ have been created using a previous call to be_create_netobj()
|
|
+*/
|
|
+int be_create_mcc_rings(struct be_net_object *pnob)
|
|
+{
|
|
+ int status = 0;
|
|
+ struct ring_desc rd;
|
|
+ struct be_function_object *pfob = &pnob->fn_obj;
|
|
+
|
|
+ memset(&rd, 0, sizeof(struct ring_desc));
|
|
+ if (pnob->mcc_cq_len) {
|
|
+ rd.va = pnob->mcc_cq;
|
|
+ rd.pa = pnob->mcc_cq_bus;
|
|
+ rd.length = pnob->mcc_cq_size;
|
|
+
|
|
+ status = be_cq_create(pfob, &rd,
|
|
+ pnob->mcc_cq_len * sizeof(struct MCC_CQ_ENTRY_AMAP),
|
|
+ false, /* solicted events, */
|
|
+ true, /* nodelay */
|
|
+ 0, /* 0 Watermark since Nodelay is true */
|
|
+ &pnob->event_q_obj,
|
|
+ &pnob->mcc_cq_obj);
|
|
+
|
|
+ if (status != BE_SUCCESS)
|
|
+ return status;
|
|
+
|
|
+ pnob->mcc_cq_id = pnob->mcc_cq_obj.cq_id;
|
|
+ pnob->mcc_cq_created = 1;
|
|
+ }
|
|
+ if (pnob->mcc_q_len) {
|
|
+ rd.va = pnob->mcc_q;
|
|
+ rd.pa = pnob->mcc_q_bus;
|
|
+ rd.length = pnob->mcc_q_size;
|
|
+
|
|
+ status = be_mcc_ring_create(pfob, &rd,
|
|
+ pnob->mcc_q_len * sizeof(struct MCC_WRB_AMAP),
|
|
+ pnob->mcc_wrb_ctxt, pnob->mcc_wrb_ctxtLen,
|
|
+ &pnob->mcc_cq_obj, &pnob->mcc_q_obj);
|
|
+
|
|
+ if (status != BE_SUCCESS)
|
|
+ return status;
|
|
+
|
|
+ pnob->mcc_q_created = 1;
|
|
+ }
|
|
+ return BE_SUCCESS;
|
|
+}
|
|
+
|
|
+static int be_mcc_init(struct be_adapter *adapter)
|
|
+{
|
|
+ u32 r;
|
|
+ struct be_net_object *pnob;
|
|
+
|
|
+ pnob = adapter->net_obj;
|
|
+ memset(pnob->mcc_q, 0, pnob->mcc_q_size);
|
|
+ pnob->mcc_q_hd = 0;
|
|
+
|
|
+ memset(pnob->mcc_wrb_ctxt, 0, pnob->mcc_wrb_ctxt_size);
|
|
+
|
|
+ memset(pnob->mcc_cq, 0, pnob->mcc_cq_size);
|
|
+ pnob->mcc_cq_tl = 0;
|
|
+
|
|
+ r = be_create_mcc_rings(adapter->net_obj);
|
|
+ if (r != BE_SUCCESS)
|
|
+ return -1;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void be_remove(struct pci_dev *pdev)
|
|
+{
|
|
+ struct be_net_object *pnob;
|
|
+ struct be_adapter *adapter;
|
|
+
|
|
+ adapter = pci_get_drvdata(pdev);
|
|
+ if (!adapter)
|
|
+ return;
|
|
+
|
|
+ pci_set_drvdata(pdev, NULL);
|
|
+ pnob = (struct be_net_object *)adapter->net_obj;
|
|
+
|
|
+ flush_scheduled_work();
|
|
+
|
|
+ if (pnob) {
|
|
+ /* Unregister async callback function for link status updates */
|
|
+ if (pnob->mcc_q_created)
|
|
+ be_mcc_add_async_event_callback(&pnob->mcc_q_obj,
|
|
+ NULL, NULL);
|
|
+ netobject_cleanup(adapter, pnob);
|
|
+ }
|
|
+
|
|
+ if (adapter->csr_va)
|
|
+ iounmap(adapter->csr_va);
|
|
+ if (adapter->db_va)
|
|
+ iounmap(adapter->db_va);
|
|
+ if (adapter->pci_va)
|
|
+ iounmap(adapter->pci_va);
|
|
+
|
|
+ pci_release_regions(adapter->pdev);
|
|
+ pci_disable_device(adapter->pdev);
|
|
+
|
|
+ kfree(adapter->be_link_sts);
|
|
+ kfree(adapter->eth_statsp);
|
|
+
|
|
+ if (adapter->timer_ctxt.get_stats_timer.function)
|
|
+ del_timer_sync(&adapter->timer_ctxt.get_stats_timer);
|
|
+ kfree(adapter);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This function is called by the PCI sub-system when it finds a PCI
|
|
+ * device with dev/vendor IDs that match with one of our devices.
|
|
+ * All of the driver initialization is done in this function.
|
|
+ */
|
|
+static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id)
|
|
+{
|
|
+ int status = 0;
|
|
+ struct be_adapter *adapter;
|
|
+ struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD get_fwv;
|
|
+ struct be_net_object *pnob;
|
|
+ struct net_device *netdev;
|
|
+
|
|
+ status = pci_enable_device(pdev);
|
|
+ if (status)
|
|
+ goto error;
|
|
+
|
|
+ status = pci_request_regions(pdev, be_driver_name);
|
|
+ if (status)
|
|
+ goto error_pci_req;
|
|
+
|
|
+ pci_set_master(pdev);
|
|
+ adapter = kzalloc(sizeof(struct be_adapter), GFP_KERNEL);
|
|
+ if (adapter == NULL) {
|
|
+ status = -ENOMEM;
|
|
+ goto error_adapter;
|
|
+ }
|
|
+ adapter->dev_state = BE_DEV_STATE_NONE;
|
|
+ adapter->pdev = pdev;
|
|
+ pci_set_drvdata(pdev, adapter);
|
|
+
|
|
+ adapter->enable_aic = 1;
|
|
+ adapter->max_eqd = MAX_EQD;
|
|
+ adapter->min_eqd = 0;
|
|
+ adapter->cur_eqd = 0;
|
|
+
|
|
+ status = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
|
|
+ if (!status) {
|
|
+ adapter->dma_64bit_cap = true;
|
|
+ } else {
|
|
+ adapter->dma_64bit_cap = false;
|
|
+ status = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
|
|
+ if (status != 0) {
|
|
+ printk(KERN_ERR "Could not set PCI DMA Mask\n");
|
|
+ goto cleanup;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ status = init_pci_be_function(adapter, pdev);
|
|
+ if (status != 0) {
|
|
+ printk(KERN_ERR "Failed to map PCI BARS\n");
|
|
+ status = -ENOMEM;
|
|
+ goto cleanup;
|
|
+ }
|
|
+
|
|
+ be_trace_set_level(DL_ALWAYS | DL_ERR);
|
|
+
|
|
+ adapter->be_link_sts = kmalloc(sizeof(struct BE_LINK_STATUS),
|
|
+ GFP_KERNEL);
|
|
+ if (adapter->be_link_sts == NULL) {
|
|
+ printk(KERN_ERR "Memory allocation for link status "
|
|
+ "buffer failed\n");
|
|
+ goto cleanup;
|
|
+ }
|
|
+ spin_lock_init(&adapter->txq_lock);
|
|
+
|
|
+ netdev = alloc_etherdev(sizeof(struct be_net_object));
|
|
+ if (netdev == NULL) {
|
|
+ status = -ENOMEM;
|
|
+ goto cleanup;
|
|
+ }
|
|
+ pnob = netdev_priv(netdev);
|
|
+ adapter->net_obj = pnob;
|
|
+ adapter->netdevp = netdev;
|
|
+ pnob->adapter = adapter;
|
|
+ pnob->netdev = netdev;
|
|
+
|
|
+ status = be_nob_ring_alloc(adapter, pnob);
|
|
+ if (status != 0)
|
|
+ goto cleanup;
|
|
+
|
|
+ status = be_nob_ring_init(adapter, pnob);
|
|
+ if (status != 0)
|
|
+ goto cleanup;
|
|
+
|
|
+ be_rxf_mac_address_read_write(&pnob->fn_obj, false, false, false,
|
|
+ false, false, netdev->dev_addr, NULL, NULL);
|
|
+
|
|
+ netdev->init = &benet_init;
|
|
+ netif_carrier_off(netdev);
|
|
+ netif_stop_queue(netdev);
|
|
+
|
|
+ SET_NETDEV_DEV(netdev, &(adapter->pdev->dev));
|
|
+
|
|
+ netif_napi_add(netdev, &pnob->napi, be_poll, 64);
|
|
+
|
|
+ /* if the rx_frag size if 2K, one page is shared as two RX frags */
|
|
+ pnob->rx_pg_shared =
|
|
+ (pnob->rx_buf_size <= PAGE_SIZE / 2) ? true : false;
|
|
+ if (pnob->rx_buf_size != rxbuf_size) {
|
|
+ printk(KERN_WARNING
|
|
+ "Could not set Rx buffer size to %d. Using %d\n",
|
|
+ rxbuf_size, pnob->rx_buf_size);
|
|
+ rxbuf_size = pnob->rx_buf_size;
|
|
+ }
|
|
+
|
|
+ tasklet_init(&(adapter->sts_handler), be_process_intr,
|
|
+ (unsigned long)adapter);
|
|
+ adapter->tasklet_started = 1;
|
|
+ spin_lock_init(&(adapter->int_lock));
|
|
+
|
|
+ status = be_register_isr(adapter, pnob);
|
|
+ if (status != 0)
|
|
+ goto cleanup;
|
|
+
|
|
+ adapter->rx_csum = 1;
|
|
+ adapter->max_rx_coal = BE_LRO_MAX_PKTS;
|
|
+
|
|
+ memset(&get_fwv, 0,
|
|
+ sizeof(struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD));
|
|
+ printk(KERN_INFO "BladeEngine Driver version:%s. "
|
|
+ "Copyright ServerEngines, Corporation 2005 - 2008\n",
|
|
+ be_drvr_ver);
|
|
+ status = be_function_get_fw_version(&pnob->fn_obj, &get_fwv, NULL,
|
|
+ NULL);
|
|
+ if (status == BE_SUCCESS) {
|
|
+ strncpy(be_fw_ver, get_fwv.firmware_version_string, 32);
|
|
+ printk(KERN_INFO "BladeEngine Firmware Version:%s\n",
|
|
+ get_fwv.firmware_version_string);
|
|
+ } else {
|
|
+ printk(KERN_WARNING "Unable to get BE Firmware Version\n");
|
|
+ }
|
|
+
|
|
+ sema_init(&adapter->get_eth_stat_sem, 0);
|
|
+ init_timer(&adapter->timer_ctxt.get_stats_timer);
|
|
+ atomic_set(&adapter->timer_ctxt.get_stat_flag, 0);
|
|
+ adapter->timer_ctxt.get_stats_timer.function =
|
|
+ &be_get_stats_timer_handler;
|
|
+
|
|
+ status = be_mcc_create(adapter);
|
|
+ if (status < 0)
|
|
+ goto cleanup;
|
|
+ status = be_mcc_init(adapter);
|
|
+ if (status < 0)
|
|
+ goto cleanup;
|
|
+
|
|
+
|
|
+ status = be_mcc_add_async_event_callback(&adapter->net_obj->mcc_q_obj,
|
|
+ be_link_status_async_callback, (void *)adapter);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ printk(KERN_WARNING "add_async_event_callback failed");
|
|
+ printk(KERN_WARNING
|
|
+ "Link status changes may not be reflected\n");
|
|
+ }
|
|
+
|
|
+ status = register_netdev(netdev);
|
|
+ if (status != 0)
|
|
+ goto cleanup;
|
|
+ be_update_link_status(adapter);
|
|
+ adapter->dev_state = BE_DEV_STATE_INIT;
|
|
+ return 0;
|
|
+
|
|
+cleanup:
|
|
+ be_remove(pdev);
|
|
+ return status;
|
|
+error_adapter:
|
|
+ pci_release_regions(pdev);
|
|
+error_pci_req:
|
|
+ pci_disable_device(pdev);
|
|
+error:
|
|
+ printk(KERN_ERR "BladeEngine initalization failed\n");
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Get the current link status and print the status on console
|
|
+ */
|
|
+void be_update_link_status(struct be_adapter *adapter)
|
|
+{
|
|
+ int status;
|
|
+ struct be_net_object *pnob = adapter->net_obj;
|
|
+
|
|
+ status = be_rxf_link_status(&pnob->fn_obj, adapter->be_link_sts, NULL,
|
|
+ NULL, NULL);
|
|
+ if (status == BE_SUCCESS) {
|
|
+ if (adapter->be_link_sts->mac0_speed &&
|
|
+ adapter->be_link_sts->mac0_duplex)
|
|
+ adapter->port0_link_sts = BE_PORT_LINK_UP;
|
|
+ else
|
|
+ adapter->port0_link_sts = BE_PORT_LINK_DOWN;
|
|
+
|
|
+ if (adapter->be_link_sts->mac1_speed &&
|
|
+ adapter->be_link_sts->mac1_duplex)
|
|
+ adapter->port1_link_sts = BE_PORT_LINK_UP;
|
|
+ else
|
|
+ adapter->port1_link_sts = BE_PORT_LINK_DOWN;
|
|
+
|
|
+ dev_info(&pnob->netdev->dev, "Link Properties:\n");
|
|
+ be_print_link_info(adapter->be_link_sts);
|
|
+ return;
|
|
+ }
|
|
+ dev_info(&pnob->netdev->dev, "Could not get link status\n");
|
|
+ return;
|
|
+}
|
|
+
|
|
+
|
|
+#ifdef CONFIG_PM
|
|
+static void
|
|
+be_pm_cleanup(struct be_adapter *adapter,
|
|
+ struct be_net_object *pnob, struct net_device *netdev)
|
|
+{
|
|
+ netif_carrier_off(netdev);
|
|
+ netif_stop_queue(netdev);
|
|
+
|
|
+ be_wait_nic_tx_cmplx_cmpl(pnob);
|
|
+ be_disable_eq_intr(pnob);
|
|
+
|
|
+ if (adapter->tasklet_started) {
|
|
+ tasklet_kill(&adapter->sts_handler);
|
|
+ adapter->tasklet_started = 0;
|
|
+ }
|
|
+
|
|
+ be_unregister_isr(adapter);
|
|
+ be_disable_intr(pnob);
|
|
+
|
|
+ be_tx_q_clean(pnob);
|
|
+ be_rx_q_clean(pnob);
|
|
+
|
|
+ be_destroy_netobj(pnob);
|
|
+}
|
|
+
|
|
+static int be_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
+{
|
|
+ struct be_adapter *adapter = pci_get_drvdata(pdev);
|
|
+ struct net_device *netdev = adapter->netdevp;
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+
|
|
+ adapter->dev_pm_state = adapter->dev_state;
|
|
+ adapter->dev_state = BE_DEV_STATE_SUSPEND;
|
|
+
|
|
+ netif_device_detach(netdev);
|
|
+ if (netif_running(netdev))
|
|
+ be_pm_cleanup(adapter, pnob, netdev);
|
|
+
|
|
+ pci_enable_wake(pdev, 3, 1);
|
|
+ pci_enable_wake(pdev, 4, 1); /* D3 Cold = 4 */
|
|
+ pci_save_state(pdev);
|
|
+ pci_disable_device(pdev);
|
|
+ pci_set_power_state(pdev, pci_choose_state(pdev, state));
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void be_up(struct be_adapter *adapter)
|
|
+{
|
|
+ struct be_net_object *pnob = adapter->net_obj;
|
|
+
|
|
+ if (pnob->num_vlans != 0)
|
|
+ be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans,
|
|
+ pnob->vlan_tag, NULL, NULL, NULL);
|
|
+
|
|
+}
|
|
+
|
|
+static int be_resume(struct pci_dev *pdev)
|
|
+{
|
|
+ int status = 0;
|
|
+ struct be_adapter *adapter = pci_get_drvdata(pdev);
|
|
+ struct net_device *netdev = adapter->netdevp;
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+
|
|
+ netif_device_detach(netdev);
|
|
+
|
|
+ status = pci_enable_device(pdev);
|
|
+ if (status)
|
|
+ return status;
|
|
+
|
|
+ pci_set_power_state(pdev, 0);
|
|
+ pci_restore_state(pdev);
|
|
+ pci_enable_wake(pdev, 3, 0);
|
|
+ pci_enable_wake(pdev, 4, 0); /* 4 is D3 cold */
|
|
+
|
|
+ netif_carrier_on(netdev);
|
|
+ netif_start_queue(netdev);
|
|
+
|
|
+ if (netif_running(netdev)) {
|
|
+ be_rxf_mac_address_read_write(&pnob->fn_obj, false, false,
|
|
+ false, true, false, netdev->dev_addr, NULL, NULL);
|
|
+
|
|
+ status = be_nob_ring_init(adapter, pnob);
|
|
+ if (status < 0)
|
|
+ return status;
|
|
+
|
|
+ tasklet_init(&(adapter->sts_handler), be_process_intr,
|
|
+ (unsigned long)adapter);
|
|
+ adapter->tasklet_started = 1;
|
|
+
|
|
+ if (be_register_isr(adapter, pnob) != 0) {
|
|
+ printk(KERN_ERR "be_register_isr failed\n");
|
|
+ return status;
|
|
+ }
|
|
+
|
|
+
|
|
+ status = be_mcc_init(adapter);
|
|
+ if (status < 0) {
|
|
+ printk(KERN_ERR "be_mcc_init failed\n");
|
|
+ return status;
|
|
+ }
|
|
+ be_update_link_status(adapter);
|
|
+ /*
|
|
+ * Register async call back function to handle link
|
|
+ * status updates
|
|
+ */
|
|
+ status = be_mcc_add_async_event_callback(
|
|
+ &adapter->net_obj->mcc_q_obj,
|
|
+ be_link_status_async_callback, (void *)adapter);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ printk(KERN_WARNING "add_async_event_callback failed");
|
|
+ printk(KERN_WARNING
|
|
+ "Link status changes may not be reflected\n");
|
|
+ }
|
|
+ be_enable_intr(pnob);
|
|
+ be_enable_eq_intr(pnob);
|
|
+ be_up(adapter);
|
|
+ }
|
|
+ netif_device_attach(netdev);
|
|
+ adapter->dev_state = adapter->dev_pm_state;
|
|
+ return 0;
|
|
+
|
|
+}
|
|
+
|
|
+#endif
|
|
+
|
|
+/* Wait until no more pending transmits */
|
|
+void be_wait_nic_tx_cmplx_cmpl(struct be_net_object *pnob)
|
|
+{
|
|
+ int i;
|
|
+
|
|
+ /* Wait for 20us * 50000 (= 1s) and no more */
|
|
+ i = 0;
|
|
+ while ((pnob->tx_q_tl != pnob->tx_q_hd) && (i < 50000)) {
|
|
+ ++i;
|
|
+ udelay(20);
|
|
+ }
|
|
+
|
|
+ /* Check for no more pending transmits */
|
|
+ if (i >= 50000) {
|
|
+ printk(KERN_WARNING
|
|
+ "Did not receive completions for all TX requests\n");
|
|
+ }
|
|
+}
|
|
+
|
|
+static struct pci_driver be_driver = {
|
|
+ .name = be_driver_name,
|
|
+ .id_table = be_device_id_table,
|
|
+ .probe = be_probe,
|
|
+#ifdef CONFIG_PM
|
|
+ .suspend = be_suspend,
|
|
+ .resume = be_resume,
|
|
+#endif
|
|
+ .remove = be_remove
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Module init entry point. Registers our our device and return.
|
|
+ * Our probe will be called if the device is found.
|
|
+ */
|
|
+static int __init be_init_module(void)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ if (rxbuf_size != 8192 && rxbuf_size != 4096 && rxbuf_size != 2048) {
|
|
+ printk(KERN_WARNING
|
|
+ "Unsupported receive buffer size (%d) requested\n",
|
|
+ rxbuf_size);
|
|
+ printk(KERN_WARNING
|
|
+ "Must be 2048, 4096 or 8192. Defaulting to 2048\n");
|
|
+ rxbuf_size = 2048;
|
|
+ }
|
|
+
|
|
+ ret = pci_register_driver(&be_driver);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+module_init(be_init_module);
|
|
+
|
|
+/*
|
|
+ * be_exit_module - Driver Exit Cleanup Routine
|
|
+ */
|
|
+static void __exit be_exit_module(void)
|
|
+{
|
|
+ pci_unregister_driver(&be_driver);
|
|
+}
|
|
+
|
|
+module_exit(be_exit_module);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/be_int.c linux-2.6.29-rc3.owrt/drivers/staging/benet/be_int.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/be_int.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_int.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,863 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#include <linux/if_vlan.h>
|
|
+#include <linux/inet_lro.h>
|
|
+
|
|
+#include "benet.h"
|
|
+
|
|
+/* number of bytes of RX frame that are copied to skb->data */
|
|
+#define BE_HDR_LEN 64
|
|
+
|
|
+#define NETIF_RX(skb) netif_receive_skb(skb)
|
|
+#define VLAN_ACCEL_RX(skb, pnob, vt) \
|
|
+ vlan_hwaccel_rx(skb, pnob->vlan_grp, vt)
|
|
+
|
|
+/*
|
|
+ This function notifies BladeEngine of the number of completion
|
|
+ entries processed from the specified completion queue by writing
|
|
+ the number of popped entries to the door bell.
|
|
+
|
|
+ pnob - Pointer to the NetObject structure
|
|
+ n - Number of completion entries processed
|
|
+ cq_id - Queue ID of the completion queue for which notification
|
|
+ is being done.
|
|
+ re_arm - 1 - rearm the completion ring to generate an event.
|
|
+ - 0 - dont rearm the completion ring to generate an event
|
|
+*/
|
|
+void be_notify_cmpl(struct be_net_object *pnob, int n, int cq_id, int re_arm)
|
|
+{
|
|
+ struct CQ_DB_AMAP cqdb;
|
|
+
|
|
+ cqdb.dw[0] = 0;
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, cq_id);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, re_arm);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, n);
|
|
+ PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * adds additional receive frags indicated by BE starting from given
|
|
+ * frag index (fi) to specified skb's frag list
|
|
+ */
|
|
+static void
|
|
+add_skb_frags(struct be_net_object *pnob, struct sk_buff *skb,
|
|
+ u32 nresid, u32 fi)
|
|
+{
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ u32 sk_frag_idx, n;
|
|
+ struct be_rx_page_info *rx_page_info;
|
|
+ u32 frag_sz = pnob->rx_buf_size;
|
|
+
|
|
+ sk_frag_idx = skb_shinfo(skb)->nr_frags;
|
|
+ while (nresid) {
|
|
+ index_inc(&fi, pnob->rx_q_len);
|
|
+
|
|
+ rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi];
|
|
+ pnob->rx_ctxt[fi] = NULL;
|
|
+ if ((rx_page_info->page_offset) ||
|
|
+ (pnob->rx_pg_shared == false)) {
|
|
+ pci_unmap_page(adapter->pdev,
|
|
+ pci_unmap_addr(rx_page_info, bus),
|
|
+ frag_sz, PCI_DMA_FROMDEVICE);
|
|
+ }
|
|
+
|
|
+ n = min(nresid, frag_sz);
|
|
+ skb_shinfo(skb)->frags[sk_frag_idx].page = rx_page_info->page;
|
|
+ skb_shinfo(skb)->frags[sk_frag_idx].page_offset
|
|
+ = rx_page_info->page_offset;
|
|
+ skb_shinfo(skb)->frags[sk_frag_idx].size = n;
|
|
+
|
|
+ sk_frag_idx++;
|
|
+ skb->len += n;
|
|
+ skb->data_len += n;
|
|
+ skb_shinfo(skb)->nr_frags++;
|
|
+ nresid -= n;
|
|
+
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+ atomic_dec(&pnob->rx_q_posted);
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This function processes incoming nic packets over various Rx queues.
|
|
+ * This function takes the adapter, the current Rx status descriptor
|
|
+ * entry and the Rx completion queue ID as argument.
|
|
+ */
|
|
+static inline int process_nic_rx_completion(struct be_net_object *pnob,
|
|
+ struct ETH_RX_COMPL_AMAP *rxcp)
|
|
+{
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ struct sk_buff *skb;
|
|
+ int udpcksm, tcpcksm;
|
|
+ int n;
|
|
+ u32 nresid, fi;
|
|
+ u32 frag_sz = pnob->rx_buf_size;
|
|
+ u8 *va;
|
|
+ struct be_rx_page_info *rx_page_info;
|
|
+ u32 numfrags, vtp, vtm, vlan_tag, pktsize;
|
|
+
|
|
+ fi = AMAP_GET_BITS_PTR(ETH_RX_COMPL, fragndx, rxcp);
|
|
+ BUG_ON(fi >= (int)pnob->rx_q_len);
|
|
+ BUG_ON(fi < 0);
|
|
+
|
|
+ rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi];
|
|
+ BUG_ON(!rx_page_info->page);
|
|
+ pnob->rx_ctxt[fi] = NULL;
|
|
+
|
|
+ /*
|
|
+ * If one page is used per fragment or if this is the second half of
|
|
+ * of the page, unmap the page here
|
|
+ */
|
|
+ if ((rx_page_info->page_offset) || (pnob->rx_pg_shared == false)) {
|
|
+ pci_unmap_page(adapter->pdev,
|
|
+ pci_unmap_addr(rx_page_info, bus), frag_sz,
|
|
+ PCI_DMA_FROMDEVICE);
|
|
+ }
|
|
+
|
|
+ atomic_dec(&pnob->rx_q_posted);
|
|
+ udpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, udpcksm, rxcp);
|
|
+ tcpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, tcpcksm, rxcp);
|
|
+ pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp);
|
|
+ /*
|
|
+ * get rid of RX flush completions first.
|
|
+ */
|
|
+ if ((tcpcksm) && (udpcksm) && (pktsize == 32)) {
|
|
+ put_page(rx_page_info->page);
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+ return 0;
|
|
+ }
|
|
+ skb = netdev_alloc_skb(pnob->netdev, BE_HDR_LEN + NET_IP_ALIGN);
|
|
+ if (skb == NULL) {
|
|
+ dev_info(&pnob->netdev->dev, "alloc_skb() failed\n");
|
|
+ put_page(rx_page_info->page);
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+ goto free_frags;
|
|
+ }
|
|
+ skb_reserve(skb, NET_IP_ALIGN);
|
|
+
|
|
+ skb->dev = pnob->netdev;
|
|
+
|
|
+ n = min(pktsize, frag_sz);
|
|
+
|
|
+ va = page_address(rx_page_info->page) + rx_page_info->page_offset;
|
|
+ prefetch(va);
|
|
+
|
|
+ skb->len = n;
|
|
+ skb->data_len = n;
|
|
+ if (n <= BE_HDR_LEN) {
|
|
+ memcpy(skb->data, va, n);
|
|
+ put_page(rx_page_info->page);
|
|
+ skb->data_len -= n;
|
|
+ skb->tail += n;
|
|
+ } else {
|
|
+
|
|
+ /* Setup the SKB with page buffer information */
|
|
+ skb_shinfo(skb)->frags[0].page = rx_page_info->page;
|
|
+ skb_shinfo(skb)->nr_frags++;
|
|
+
|
|
+ /* Copy the header into the skb_data */
|
|
+ memcpy(skb->data, va, BE_HDR_LEN);
|
|
+ skb_shinfo(skb)->frags[0].page_offset =
|
|
+ rx_page_info->page_offset + BE_HDR_LEN;
|
|
+ skb_shinfo(skb)->frags[0].size = n - BE_HDR_LEN;
|
|
+ skb->data_len -= BE_HDR_LEN;
|
|
+ skb->tail += BE_HDR_LEN;
|
|
+ }
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+ nresid = pktsize - n;
|
|
+
|
|
+ skb->protocol = eth_type_trans(skb, pnob->netdev);
|
|
+
|
|
+ if ((tcpcksm || udpcksm) && adapter->rx_csum)
|
|
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
+ else
|
|
+ skb->ip_summed = CHECKSUM_NONE;
|
|
+ /*
|
|
+ * if we have more bytes left, the frame has been
|
|
+ * given to us in multiple fragments. This happens
|
|
+ * with Jumbo frames. Add the remaining fragments to
|
|
+ * skb->frags[] array.
|
|
+ */
|
|
+ if (nresid)
|
|
+ add_skb_frags(pnob, skb, nresid, fi);
|
|
+
|
|
+ /* update the the true size of the skb. */
|
|
+ skb->truesize = skb->len + sizeof(struct sk_buff);
|
|
+
|
|
+ /*
|
|
+ * If a 802.3 frame or 802.2 LLC frame
|
|
+ * (i.e) contains length field in MAC Hdr
|
|
+ * and frame len is greater than 64 bytes
|
|
+ */
|
|
+ if (((skb->protocol == ntohs(ETH_P_802_2)) ||
|
|
+ (skb->protocol == ntohs(ETH_P_802_3)))
|
|
+ && (pktsize > BE_HDR_LEN)) {
|
|
+ /*
|
|
+ * If the length given in Mac Hdr is less than frame size
|
|
+ * Erraneous frame, Drop it
|
|
+ */
|
|
+ if ((ntohs(*(u16 *) (va + 12)) + ETH_HLEN) < pktsize) {
|
|
+ /* Increment Non Ether type II frames dropped */
|
|
+ adapter->be_stat.bes_802_3_dropped_frames++;
|
|
+
|
|
+ kfree_skb(skb);
|
|
+ return 0;
|
|
+ }
|
|
+ /*
|
|
+ * else if the length given in Mac Hdr is greater than
|
|
+ * frame size, should not be seeing this sort of frames
|
|
+ * dump the pkt and pass to stack
|
|
+ */
|
|
+ else if ((ntohs(*(u16 *) (va + 12)) + ETH_HLEN) > pktsize) {
|
|
+ /* Increment Non Ether type II frames malformed */
|
|
+ adapter->be_stat.bes_802_3_malformed_frames++;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ vtp = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtp, rxcp);
|
|
+ vtm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtm, rxcp);
|
|
+ if (vtp && vtm) {
|
|
+ /* Vlan tag present in pkt and BE found
|
|
+ * that the tag matched an entry in VLAN table
|
|
+ */
|
|
+ if (!pnob->vlan_grp || pnob->num_vlans == 0) {
|
|
+ /* But we have no VLANs configured.
|
|
+ * This should never happen. Drop the packet.
|
|
+ */
|
|
+ dev_info(&pnob->netdev->dev,
|
|
+ "BladeEngine: Unexpected vlan tagged packet\n");
|
|
+ kfree_skb(skb);
|
|
+ return 0;
|
|
+ }
|
|
+ /* pass the VLAN packet to stack */
|
|
+ vlan_tag = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vlan_tag, rxcp);
|
|
+ VLAN_ACCEL_RX(skb, pnob, be16_to_cpu(vlan_tag));
|
|
+
|
|
+ } else {
|
|
+ NETIF_RX(skb);
|
|
+ }
|
|
+ return 0;
|
|
+
|
|
+free_frags:
|
|
+ /* free all frags associated with the current rxcp */
|
|
+ numfrags = AMAP_GET_BITS_PTR(ETH_RX_COMPL, numfrags, rxcp);
|
|
+ while (numfrags-- > 1) {
|
|
+ index_inc(&fi, pnob->rx_q_len);
|
|
+
|
|
+ rx_page_info = (struct be_rx_page_info *)
|
|
+ pnob->rx_ctxt[fi];
|
|
+ pnob->rx_ctxt[fi] = (void *)NULL;
|
|
+ if (rx_page_info->page_offset || !pnob->rx_pg_shared) {
|
|
+ pci_unmap_page(adapter->pdev,
|
|
+ pci_unmap_addr(rx_page_info, bus),
|
|
+ frag_sz, PCI_DMA_FROMDEVICE);
|
|
+ }
|
|
+
|
|
+ put_page(rx_page_info->page);
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+ atomic_dec(&pnob->rx_q_posted);
|
|
+ }
|
|
+ return -ENOMEM;
|
|
+}
|
|
+
|
|
+static void process_nic_rx_completion_lro(struct be_net_object *pnob,
|
|
+ struct ETH_RX_COMPL_AMAP *rxcp)
|
|
+{
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ struct skb_frag_struct rx_frags[BE_MAX_FRAGS_PER_FRAME];
|
|
+ unsigned int udpcksm, tcpcksm;
|
|
+ u32 numfrags, vlanf, vtm, vlan_tag, nresid;
|
|
+ u16 vlant;
|
|
+ unsigned int fi, idx, n;
|
|
+ struct be_rx_page_info *rx_page_info;
|
|
+ u32 frag_sz = pnob->rx_buf_size, pktsize;
|
|
+ bool rx_coal = (adapter->max_rx_coal <= 1) ? 0 : 1;
|
|
+ u8 err, *va;
|
|
+ __wsum csum = 0;
|
|
+
|
|
+ if (AMAP_GET_BITS_PTR(ETH_RX_COMPL, ipsec, rxcp)) {
|
|
+ /* Drop the pkt and move to the next completion. */
|
|
+ adapter->be_stat.bes_rx_misc_pkts++;
|
|
+ return;
|
|
+ }
|
|
+ err = AMAP_GET_BITS_PTR(ETH_RX_COMPL, err, rxcp);
|
|
+ if (err || !rx_coal) {
|
|
+ /* We won't coalesce Rx pkts if the err bit set.
|
|
+ * take the path of normal completion processing */
|
|
+ process_nic_rx_completion(pnob, rxcp);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ fi = AMAP_GET_BITS_PTR(ETH_RX_COMPL, fragndx, rxcp);
|
|
+ BUG_ON(fi >= (int)pnob->rx_q_len);
|
|
+ BUG_ON(fi < 0);
|
|
+ rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi];
|
|
+ BUG_ON(!rx_page_info->page);
|
|
+ pnob->rx_ctxt[fi] = (void *)NULL;
|
|
+ /* If one page is used per fragment or if this is the
|
|
+ * second half of the page, unmap the page here
|
|
+ */
|
|
+ if (rx_page_info->page_offset || !pnob->rx_pg_shared) {
|
|
+ pci_unmap_page(adapter->pdev,
|
|
+ pci_unmap_addr(rx_page_info, bus),
|
|
+ frag_sz, PCI_DMA_FROMDEVICE);
|
|
+ }
|
|
+
|
|
+ numfrags = AMAP_GET_BITS_PTR(ETH_RX_COMPL, numfrags, rxcp);
|
|
+ udpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, udpcksm, rxcp);
|
|
+ tcpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, tcpcksm, rxcp);
|
|
+ vlan_tag = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vlan_tag, rxcp);
|
|
+ vlant = be16_to_cpu(vlan_tag);
|
|
+ vlanf = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtp, rxcp);
|
|
+ vtm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtm, rxcp);
|
|
+ pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp);
|
|
+
|
|
+ atomic_dec(&pnob->rx_q_posted);
|
|
+
|
|
+ if (tcpcksm && udpcksm && pktsize == 32) {
|
|
+ /* flush completion entries */
|
|
+ put_page(rx_page_info->page);
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+ return;
|
|
+ }
|
|
+ /* Only one of udpcksum and tcpcksum can be set */
|
|
+ BUG_ON(udpcksm && tcpcksm);
|
|
+
|
|
+ /* jumbo frames could come in multiple fragments */
|
|
+ BUG_ON(numfrags != ((pktsize + (frag_sz - 1)) / frag_sz));
|
|
+ n = min(pktsize, frag_sz);
|
|
+ nresid = pktsize - n; /* will be useful for jumbo pkts */
|
|
+ idx = 0;
|
|
+
|
|
+ va = page_address(rx_page_info->page) + rx_page_info->page_offset;
|
|
+ prefetch(va);
|
|
+ rx_frags[idx].page = rx_page_info->page;
|
|
+ rx_frags[idx].page_offset = (rx_page_info->page_offset);
|
|
+ rx_frags[idx].size = n;
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+
|
|
+ /* If we got multiple fragments, we have more data. */
|
|
+ while (nresid) {
|
|
+ idx++;
|
|
+ index_inc(&fi, pnob->rx_q_len);
|
|
+
|
|
+ rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi];
|
|
+ pnob->rx_ctxt[fi] = (void *)NULL;
|
|
+ if (rx_page_info->page_offset || !pnob->rx_pg_shared) {
|
|
+ pci_unmap_page(adapter->pdev,
|
|
+ pci_unmap_addr(rx_page_info, bus),
|
|
+ frag_sz, PCI_DMA_FROMDEVICE);
|
|
+ }
|
|
+
|
|
+ n = min(nresid, frag_sz);
|
|
+ rx_frags[idx].page = rx_page_info->page;
|
|
+ rx_frags[idx].page_offset = (rx_page_info->page_offset);
|
|
+ rx_frags[idx].size = n;
|
|
+
|
|
+ nresid -= n;
|
|
+ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
|
|
+ atomic_dec(&pnob->rx_q_posted);
|
|
+ }
|
|
+
|
|
+ if (likely(!(vlanf && vtm))) {
|
|
+ lro_receive_frags(&pnob->lro_mgr, rx_frags,
|
|
+ pktsize, pktsize,
|
|
+ (void *)(unsigned long)csum, csum);
|
|
+ } else {
|
|
+ /* Vlan tag present in pkt and BE found
|
|
+ * that the tag matched an entry in VLAN table
|
|
+ */
|
|
+ if (unlikely(!pnob->vlan_grp || pnob->num_vlans == 0)) {
|
|
+ /* But we have no VLANs configured.
|
|
+ * This should never happen. Drop the packet.
|
|
+ */
|
|
+ dev_info(&pnob->netdev->dev,
|
|
+ "BladeEngine: Unexpected vlan tagged packet\n");
|
|
+ return;
|
|
+ }
|
|
+ /* pass the VLAN packet to stack */
|
|
+ lro_vlan_hwaccel_receive_frags(&pnob->lro_mgr,
|
|
+ rx_frags, pktsize, pktsize,
|
|
+ pnob->vlan_grp, vlant,
|
|
+ (void *)(unsigned long)csum,
|
|
+ csum);
|
|
+ }
|
|
+
|
|
+ adapter->be_stat.bes_rx_coal++;
|
|
+}
|
|
+
|
|
+struct ETH_RX_COMPL_AMAP *be_get_rx_cmpl(struct be_net_object *pnob)
|
|
+{
|
|
+ struct ETH_RX_COMPL_AMAP *rxcp = &pnob->rx_cq[pnob->rx_cq_tl];
|
|
+ u32 valid, ct;
|
|
+
|
|
+ valid = AMAP_GET_BITS_PTR(ETH_RX_COMPL, valid, rxcp);
|
|
+ if (valid == 0)
|
|
+ return NULL;
|
|
+
|
|
+ ct = AMAP_GET_BITS_PTR(ETH_RX_COMPL, ct, rxcp);
|
|
+ if (ct != 0) {
|
|
+ /* Invalid chute #. treat as error */
|
|
+ AMAP_SET_BITS_PTR(ETH_RX_COMPL, err, rxcp, 1);
|
|
+ }
|
|
+
|
|
+ be_adv_rxcq_tl(pnob);
|
|
+ AMAP_SET_BITS_PTR(ETH_RX_COMPL, valid, rxcp, 0);
|
|
+ return rxcp;
|
|
+}
|
|
+
|
|
+static void update_rx_rate(struct be_adapter *adapter)
|
|
+{
|
|
+ /* update the rate once in two seconds */
|
|
+ if ((jiffies - adapter->eth_rx_jiffies) > 2 * (HZ)) {
|
|
+ u32 r;
|
|
+ r = adapter->eth_rx_bytes /
|
|
+ ((jiffies - adapter->eth_rx_jiffies) / (HZ));
|
|
+ r = (r / 1000000); /* MB/Sec */
|
|
+
|
|
+ /* Mega Bits/Sec */
|
|
+ adapter->be_stat.bes_eth_rx_rate = (r * 8);
|
|
+ adapter->eth_rx_jiffies = jiffies;
|
|
+ adapter->eth_rx_bytes = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
+static int process_rx_completions(struct be_net_object *pnob, int max_work)
|
|
+{
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ struct ETH_RX_COMPL_AMAP *rxcp;
|
|
+ u32 nc = 0;
|
|
+ unsigned int pktsize;
|
|
+
|
|
+ while (max_work && (rxcp = be_get_rx_cmpl(pnob))) {
|
|
+ prefetch(rxcp);
|
|
+ pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp);
|
|
+ process_nic_rx_completion_lro(pnob, rxcp);
|
|
+ adapter->eth_rx_bytes += pktsize;
|
|
+ update_rx_rate(adapter);
|
|
+ nc++;
|
|
+ max_work--;
|
|
+ adapter->be_stat.bes_rx_compl++;
|
|
+ }
|
|
+ if (likely(adapter->max_rx_coal > 1)) {
|
|
+ adapter->be_stat.bes_rx_flush++;
|
|
+ lro_flush_all(&pnob->lro_mgr);
|
|
+ }
|
|
+
|
|
+ /* Refill the queue */
|
|
+ if (atomic_read(&pnob->rx_q_posted) < 900)
|
|
+ be_post_eth_rx_buffs(pnob);
|
|
+
|
|
+ return nc;
|
|
+}
|
|
+
|
|
+static struct ETH_TX_COMPL_AMAP *be_get_tx_cmpl(struct be_net_object *pnob)
|
|
+{
|
|
+ struct ETH_TX_COMPL_AMAP *txcp = &pnob->tx_cq[pnob->tx_cq_tl];
|
|
+ u32 valid;
|
|
+
|
|
+ valid = AMAP_GET_BITS_PTR(ETH_TX_COMPL, valid, txcp);
|
|
+ if (valid == 0)
|
|
+ return NULL;
|
|
+
|
|
+ AMAP_SET_BITS_PTR(ETH_TX_COMPL, valid, txcp, 0);
|
|
+ be_adv_txcq_tl(pnob);
|
|
+ return txcp;
|
|
+
|
|
+}
|
|
+
|
|
+void process_one_tx_compl(struct be_net_object *pnob, u32 end_idx)
|
|
+{
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ int cur_index, tx_wrbs_completed = 0;
|
|
+ struct sk_buff *skb;
|
|
+ u64 busaddr, pa, pa_lo, pa_hi;
|
|
+ struct ETH_WRB_AMAP *wrb;
|
|
+ u32 frag_len, last_index, j;
|
|
+
|
|
+ last_index = tx_compl_lastwrb_idx_get(pnob);
|
|
+ BUG_ON(last_index != end_idx);
|
|
+ pnob->tx_ctxt[pnob->tx_q_tl] = NULL;
|
|
+ do {
|
|
+ cur_index = pnob->tx_q_tl;
|
|
+ wrb = &pnob->tx_q[cur_index];
|
|
+ pa_hi = AMAP_GET_BITS_PTR(ETH_WRB, frag_pa_hi, wrb);
|
|
+ pa_lo = AMAP_GET_BITS_PTR(ETH_WRB, frag_pa_lo, wrb);
|
|
+ frag_len = AMAP_GET_BITS_PTR(ETH_WRB, frag_len, wrb);
|
|
+ busaddr = (pa_hi << 32) | pa_lo;
|
|
+ if (busaddr != 0) {
|
|
+ pa = le64_to_cpu(busaddr);
|
|
+ pci_unmap_single(adapter->pdev, pa,
|
|
+ frag_len, PCI_DMA_TODEVICE);
|
|
+ }
|
|
+ if (cur_index == last_index) {
|
|
+ skb = (struct sk_buff *)pnob->tx_ctxt[cur_index];
|
|
+ BUG_ON(!skb);
|
|
+ for (j = 0; j < skb_shinfo(skb)->nr_frags; j++) {
|
|
+ struct skb_frag_struct *frag;
|
|
+ frag = &skb_shinfo(skb)->frags[j];
|
|
+ pci_unmap_page(adapter->pdev,
|
|
+ (ulong) frag->page, frag->size,
|
|
+ PCI_DMA_TODEVICE);
|
|
+ }
|
|
+ kfree_skb(skb);
|
|
+ pnob->tx_ctxt[cur_index] = NULL;
|
|
+ } else {
|
|
+ BUG_ON(pnob->tx_ctxt[cur_index]);
|
|
+ }
|
|
+ tx_wrbs_completed++;
|
|
+ be_adv_txq_tl(pnob);
|
|
+ } while (cur_index != last_index);
|
|
+ atomic_sub(tx_wrbs_completed, &pnob->tx_q_used);
|
|
+}
|
|
+
|
|
+/* there is no need to take an SMP lock here since currently
|
|
+ * we have only one instance of the tasklet that does completion
|
|
+ * processing.
|
|
+ */
|
|
+static void process_nic_tx_completions(struct be_net_object *pnob)
|
|
+{
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ struct ETH_TX_COMPL_AMAP *txcp;
|
|
+ struct net_device *netdev = pnob->netdev;
|
|
+ u32 end_idx, num_processed = 0;
|
|
+
|
|
+ adapter->be_stat.bes_tx_events++;
|
|
+
|
|
+ while ((txcp = be_get_tx_cmpl(pnob))) {
|
|
+ end_idx = AMAP_GET_BITS_PTR(ETH_TX_COMPL, wrb_index, txcp);
|
|
+ process_one_tx_compl(pnob, end_idx);
|
|
+ num_processed++;
|
|
+ adapter->be_stat.bes_tx_compl++;
|
|
+ }
|
|
+ be_notify_cmpl(pnob, num_processed, pnob->tx_cq_id, 1);
|
|
+ /*
|
|
+ * We got Tx completions and have usable WRBs.
|
|
+ * If the netdev's queue has been stopped
|
|
+ * because we had run out of WRBs, wake it now.
|
|
+ */
|
|
+ spin_lock(&adapter->txq_lock);
|
|
+ if (netif_queue_stopped(netdev)
|
|
+ && atomic_read(&pnob->tx_q_used) < pnob->tx_q_len / 2) {
|
|
+ netif_wake_queue(netdev);
|
|
+ }
|
|
+ spin_unlock(&adapter->txq_lock);
|
|
+}
|
|
+
|
|
+static u32 post_rx_buffs(struct be_net_object *pnob, struct list_head *rxbl)
|
|
+{
|
|
+ u32 nposted = 0;
|
|
+ struct ETH_RX_D_AMAP *rxd = NULL;
|
|
+ struct be_recv_buffer *rxbp;
|
|
+ void **rx_ctxp;
|
|
+ struct RQ_DB_AMAP rqdb;
|
|
+
|
|
+ rx_ctxp = pnob->rx_ctxt;
|
|
+
|
|
+ while (!list_empty(rxbl) &&
|
|
+ (rx_ctxp[pnob->rx_q_hd] == NULL) && nposted < 255) {
|
|
+
|
|
+ rxbp = list_first_entry(rxbl, struct be_recv_buffer, rxb_list);
|
|
+ list_del(&rxbp->rxb_list);
|
|
+ rxd = pnob->rx_q + pnob->rx_q_hd;
|
|
+ AMAP_SET_BITS_PTR(ETH_RX_D, fragpa_lo, rxd, rxbp->rxb_pa_lo);
|
|
+ AMAP_SET_BITS_PTR(ETH_RX_D, fragpa_hi, rxd, rxbp->rxb_pa_hi);
|
|
+
|
|
+ rx_ctxp[pnob->rx_q_hd] = rxbp->rxb_ctxt;
|
|
+ be_adv_rxq_hd(pnob);
|
|
+ nposted++;
|
|
+ }
|
|
+
|
|
+ if (nposted) {
|
|
+ /* Now press the door bell to notify BladeEngine. */
|
|
+ rqdb.dw[0] = 0;
|
|
+ AMAP_SET_BITS_PTR(RQ_DB, numPosted, &rqdb, nposted);
|
|
+ AMAP_SET_BITS_PTR(RQ_DB, rq, &rqdb, pnob->rx_q_id);
|
|
+ PD_WRITE(&pnob->fn_obj, erx_rq_db, rqdb.dw[0]);
|
|
+ }
|
|
+ atomic_add(nposted, &pnob->rx_q_posted);
|
|
+ return nposted;
|
|
+}
|
|
+
|
|
+void be_post_eth_rx_buffs(struct be_net_object *pnob)
|
|
+{
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ u32 num_bufs, r;
|
|
+ u64 busaddr = 0, tmp_pa;
|
|
+ u32 max_bufs, pg_hd;
|
|
+ u32 frag_size;
|
|
+ struct be_recv_buffer *rxbp;
|
|
+ struct list_head rxbl;
|
|
+ struct be_rx_page_info *rx_page_info;
|
|
+ struct page *page = NULL;
|
|
+ u32 page_order = 0;
|
|
+ gfp_t alloc_flags = GFP_ATOMIC;
|
|
+
|
|
+ BUG_ON(!adapter);
|
|
+
|
|
+ max_bufs = 64; /* should be even # <= 255. */
|
|
+
|
|
+ frag_size = pnob->rx_buf_size;
|
|
+ page_order = get_order(frag_size);
|
|
+
|
|
+ if (frag_size == 8192)
|
|
+ alloc_flags |= (gfp_t) __GFP_COMP;
|
|
+ /*
|
|
+ * Form a linked list of RECV_BUFFFER structure to be be posted.
|
|
+ * We will post even number of buffer so that pages can be
|
|
+ * shared.
|
|
+ */
|
|
+ INIT_LIST_HEAD(&rxbl);
|
|
+
|
|
+ for (num_bufs = 0; num_bufs < max_bufs &&
|
|
+ !pnob->rx_page_info[pnob->rx_pg_info_hd].page; ++num_bufs) {
|
|
+
|
|
+ rxbp = &pnob->eth_rx_bufs[num_bufs];
|
|
+ pg_hd = pnob->rx_pg_info_hd;
|
|
+ rx_page_info = &pnob->rx_page_info[pg_hd];
|
|
+
|
|
+ if (!page) {
|
|
+ page = alloc_pages(alloc_flags, page_order);
|
|
+ if (unlikely(page == NULL)) {
|
|
+ adapter->be_stat.bes_ethrx_post_fail++;
|
|
+ pnob->rxbuf_post_fail++;
|
|
+ break;
|
|
+ }
|
|
+ pnob->rxbuf_post_fail = 0;
|
|
+ busaddr = pci_map_page(adapter->pdev, page, 0,
|
|
+ frag_size, PCI_DMA_FROMDEVICE);
|
|
+ rx_page_info->page_offset = 0;
|
|
+ rx_page_info->page = page;
|
|
+ /*
|
|
+ * If we are sharing a page among two skbs,
|
|
+ * alloc a new one on the next iteration
|
|
+ */
|
|
+ if (pnob->rx_pg_shared == false)
|
|
+ page = NULL;
|
|
+ } else {
|
|
+ get_page(page);
|
|
+ rx_page_info->page_offset += frag_size;
|
|
+ rx_page_info->page = page;
|
|
+ /*
|
|
+ * We are finished with the alloced page,
|
|
+ * Alloc a new one on the next iteration
|
|
+ */
|
|
+ page = NULL;
|
|
+ }
|
|
+ rxbp->rxb_ctxt = (void *)rx_page_info;
|
|
+ index_inc(&pnob->rx_pg_info_hd, pnob->rx_q_len);
|
|
+
|
|
+ pci_unmap_addr_set(rx_page_info, bus, busaddr);
|
|
+ tmp_pa = busaddr + rx_page_info->page_offset;
|
|
+ rxbp->rxb_pa_lo = (tmp_pa & 0xFFFFFFFF);
|
|
+ rxbp->rxb_pa_hi = (tmp_pa >> 32);
|
|
+ rxbp->rxb_len = frag_size;
|
|
+ list_add_tail(&rxbp->rxb_list, &rxbl);
|
|
+ } /* End of for */
|
|
+
|
|
+ r = post_rx_buffs(pnob, &rxbl);
|
|
+ BUG_ON(r != num_bufs);
|
|
+ return;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Interrupt service for network function. We just schedule the
|
|
+ * tasklet which does all completion processing.
|
|
+ */
|
|
+irqreturn_t be_int(int irq, void *dev)
|
|
+{
|
|
+ struct net_device *netdev = dev;
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ u32 isr;
|
|
+
|
|
+ isr = CSR_READ(&pnob->fn_obj, cev.isr1);
|
|
+ if (unlikely(!isr))
|
|
+ return IRQ_NONE;
|
|
+
|
|
+ spin_lock(&adapter->int_lock);
|
|
+ adapter->isr |= isr;
|
|
+ spin_unlock(&adapter->int_lock);
|
|
+
|
|
+ adapter->be_stat.bes_ints++;
|
|
+
|
|
+ tasklet_schedule(&adapter->sts_handler);
|
|
+ return IRQ_HANDLED;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Poll function called by NAPI with a work budget.
|
|
+ * We process as many UC. BC and MC receive completions
|
|
+ * as the budget allows and return the actual number of
|
|
+ * RX ststutses processed.
|
|
+ */
|
|
+int be_poll(struct napi_struct *napi, int budget)
|
|
+{
|
|
+ struct be_net_object *pnob =
|
|
+ container_of(napi, struct be_net_object, napi);
|
|
+ u32 work_done;
|
|
+
|
|
+ pnob->adapter->be_stat.bes_polls++;
|
|
+ work_done = process_rx_completions(pnob, budget);
|
|
+ BUG_ON(work_done > budget);
|
|
+
|
|
+ /* All consumed */
|
|
+ if (work_done < budget) {
|
|
+ netif_rx_complete(napi);
|
|
+ /* enable intr */
|
|
+ be_notify_cmpl(pnob, work_done, pnob->rx_cq_id, 1);
|
|
+ } else {
|
|
+ /* More to be consumed; continue with interrupts disabled */
|
|
+ be_notify_cmpl(pnob, work_done, pnob->rx_cq_id, 0);
|
|
+ }
|
|
+ return work_done;
|
|
+}
|
|
+
|
|
+static struct EQ_ENTRY_AMAP *get_event(struct be_net_object *pnob)
|
|
+{
|
|
+ struct EQ_ENTRY_AMAP *eqp = &(pnob->event_q[pnob->event_q_tl]);
|
|
+ if (!AMAP_GET_BITS_PTR(EQ_ENTRY, Valid, eqp))
|
|
+ return NULL;
|
|
+ be_adv_eq_tl(pnob);
|
|
+ return eqp;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Processes all valid events in the event ring associated with given
|
|
+ * NetObject. Also, notifies BE the number of events processed.
|
|
+ */
|
|
+static inline u32 process_events(struct be_net_object *pnob)
|
|
+{
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ struct EQ_ENTRY_AMAP *eqp;
|
|
+ u32 rid, num_events = 0;
|
|
+ struct net_device *netdev = pnob->netdev;
|
|
+
|
|
+ while ((eqp = get_event(pnob)) != NULL) {
|
|
+ adapter->be_stat.bes_events++;
|
|
+ rid = AMAP_GET_BITS_PTR(EQ_ENTRY, ResourceID, eqp);
|
|
+ if (rid == pnob->rx_cq_id) {
|
|
+ adapter->be_stat.bes_rx_events++;
|
|
+ netif_rx_schedule(&pnob->napi);
|
|
+ } else if (rid == pnob->tx_cq_id) {
|
|
+ process_nic_tx_completions(pnob);
|
|
+ } else if (rid == pnob->mcc_cq_id) {
|
|
+ be_mcc_process_cq(&pnob->mcc_q_obj, 1);
|
|
+ } else {
|
|
+ dev_info(&netdev->dev,
|
|
+ "Invalid EQ ResourceID %d\n", rid);
|
|
+ }
|
|
+ AMAP_SET_BITS_PTR(EQ_ENTRY, Valid, eqp, 0);
|
|
+ AMAP_SET_BITS_PTR(EQ_ENTRY, ResourceID, eqp, 0);
|
|
+ num_events++;
|
|
+ }
|
|
+ return num_events;
|
|
+}
|
|
+
|
|
+static void update_eqd(struct be_adapter *adapter, struct be_net_object *pnob)
|
|
+{
|
|
+ int status;
|
|
+ struct be_eq_object *eq_objectp;
|
|
+
|
|
+ /* update once a second */
|
|
+ if ((jiffies - adapter->ips_jiffies) > 1 * (HZ)) {
|
|
+ /* One second elapsed since last update */
|
|
+ u32 r, new_eqd = -1;
|
|
+ r = adapter->be_stat.bes_ints - adapter->be_stat.bes_prev_ints;
|
|
+ r = r / ((jiffies - adapter->ips_jiffies) / (HZ));
|
|
+ adapter->be_stat.bes_ips = r;
|
|
+ adapter->ips_jiffies = jiffies;
|
|
+ adapter->be_stat.bes_prev_ints = adapter->be_stat.bes_ints;
|
|
+ if (r > IPS_HI_WM && adapter->cur_eqd < adapter->max_eqd)
|
|
+ new_eqd = (adapter->cur_eqd + 8);
|
|
+ if (r < IPS_LO_WM && adapter->cur_eqd > adapter->min_eqd)
|
|
+ new_eqd = (adapter->cur_eqd - 8);
|
|
+ if (adapter->enable_aic && new_eqd != -1) {
|
|
+ eq_objectp = &pnob->event_q_obj;
|
|
+ status = be_eq_modify_delay(&pnob->fn_obj, 1,
|
|
+ &eq_objectp, &new_eqd, NULL,
|
|
+ NULL, NULL);
|
|
+ if (status == BE_SUCCESS)
|
|
+ adapter->cur_eqd = new_eqd;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ This function notifies BladeEngine of how many events were processed
|
|
+ from the event queue by ringing the corresponding door bell and
|
|
+ optionally re-arms the event queue.
|
|
+ n - number of events processed
|
|
+ re_arm - 1 - re-arm the EQ, 0 - do not re-arm the EQ
|
|
+
|
|
+*/
|
|
+static void be_notify_event(struct be_net_object *pnob, int n, int re_arm)
|
|
+{
|
|
+ struct CQ_DB_AMAP eqdb;
|
|
+ eqdb.dw[0] = 0;
|
|
+
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, qid, &eqdb, pnob->event_q_id);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, rearm, &eqdb, re_arm);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, event, &eqdb, 1);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &eqdb, n);
|
|
+ /*
|
|
+ * Under some situations we see an interrupt and no valid
|
|
+ * EQ entry. To keep going, we need to ring the DB even if
|
|
+ * numPOsted is 0.
|
|
+ */
|
|
+ PD_WRITE(&pnob->fn_obj, cq_db, eqdb.dw[0]);
|
|
+ return;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Called from the tasklet scheduled by ISR. All real interrupt processing
|
|
+ * is done here.
|
|
+ */
|
|
+void be_process_intr(unsigned long context)
|
|
+{
|
|
+ struct be_adapter *adapter = (struct be_adapter *)context;
|
|
+ struct be_net_object *pnob = adapter->net_obj;
|
|
+ u32 isr, n;
|
|
+ ulong flags = 0;
|
|
+
|
|
+ isr = adapter->isr;
|
|
+
|
|
+ /*
|
|
+ * we create only one NIC event queue in Linux. Event is
|
|
+ * expected only in the first event queue
|
|
+ */
|
|
+ BUG_ON(isr & 0xfffffffe);
|
|
+ if ((isr & 1) == 0)
|
|
+ return; /* not our interrupt */
|
|
+ n = process_events(pnob);
|
|
+ /*
|
|
+ * Clear the event bit. adapter->isr is set by
|
|
+ * hard interrupt. Prevent race with lock.
|
|
+ */
|
|
+ spin_lock_irqsave(&adapter->int_lock, flags);
|
|
+ adapter->isr &= ~1;
|
|
+ spin_unlock_irqrestore(&adapter->int_lock, flags);
|
|
+ be_notify_event(pnob, n, 1);
|
|
+ /*
|
|
+ * If previous allocation attempts had failed and
|
|
+ * BE has used up all posted buffers, post RX buffers here
|
|
+ */
|
|
+ if (pnob->rxbuf_post_fail && atomic_read(&pnob->rx_q_posted) == 0)
|
|
+ be_post_eth_rx_buffs(pnob);
|
|
+ update_eqd(adapter, pnob);
|
|
+ return;
|
|
+}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/benet.h linux-2.6.29-rc3.owrt/drivers/staging/benet/benet.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/benet.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/benet.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,429 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#ifndef _BENET_H_
|
|
+#define _BENET_H_
|
|
+
|
|
+#include <linux/pci.h>
|
|
+#include <linux/netdevice.h>
|
|
+#include <linux/inet_lro.h>
|
|
+#include "hwlib.h"
|
|
+
|
|
+#define _SA_MODULE_NAME "net-driver"
|
|
+
|
|
+#define VLAN_VALID_BIT 0x8000
|
|
+#define BE_NUM_VLAN_SUPPORTED 32
|
|
+#define BE_PORT_LINK_DOWN 0000
|
|
+#define BE_PORT_LINK_UP 0001
|
|
+#define BE_MAX_TX_FRAG_COUNT (30)
|
|
+
|
|
+/* Flag bits for send operation */
|
|
+#define IPCS (1 << 0) /* Enable IP checksum offload */
|
|
+#define UDPCS (1 << 1) /* Enable UDP checksum offload */
|
|
+#define TCPCS (1 << 2) /* Enable TCP checksum offload */
|
|
+#define LSO (1 << 3) /* Enable Large Segment offload */
|
|
+#define ETHVLAN (1 << 4) /* Enable VLAN insert */
|
|
+#define ETHEVENT (1 << 5) /* Generate event on completion */
|
|
+#define ETHCOMPLETE (1 << 6) /* Generate completion when done */
|
|
+#define IPSEC (1 << 7) /* Enable IPSEC */
|
|
+#define FORWARD (1 << 8) /* Send the packet in forwarding path */
|
|
+#define FIN (1 << 9) /* Issue FIN segment */
|
|
+
|
|
+#define BE_MAX_MTU 8974
|
|
+
|
|
+#define BE_MAX_LRO_DESCRIPTORS 8
|
|
+#define BE_LRO_MAX_PKTS 64
|
|
+#define BE_MAX_FRAGS_PER_FRAME 6
|
|
+
|
|
+extern const char be_drvr_ver[];
|
|
+extern char be_fw_ver[];
|
|
+extern char be_driver_name[];
|
|
+
|
|
+extern struct ethtool_ops be_ethtool_ops;
|
|
+
|
|
+#define BE_DEV_STATE_NONE 0
|
|
+#define BE_DEV_STATE_INIT 1
|
|
+#define BE_DEV_STATE_OPEN 2
|
|
+#define BE_DEV_STATE_SUSPEND 3
|
|
+
|
|
+/* This structure is used to describe physical fragments to use
|
|
+ * for DMAing data from NIC.
|
|
+ */
|
|
+struct be_recv_buffer {
|
|
+ struct list_head rxb_list; /* for maintaining a linked list */
|
|
+ void *rxb_va; /* buffer virtual address */
|
|
+ u32 rxb_pa_lo; /* low part of physical address */
|
|
+ u32 rxb_pa_hi; /* high part of physical address */
|
|
+ u32 rxb_len; /* length of recv buffer */
|
|
+ void *rxb_ctxt; /* context for OSM driver to use */
|
|
+};
|
|
+
|
|
+/*
|
|
+ * fragment list to describe scattered data.
|
|
+ */
|
|
+struct be_tx_frag_list {
|
|
+ u32 txb_len; /* Size of this fragment */
|
|
+ u32 txb_pa_lo; /* Lower 32 bits of 64 bit physical addr */
|
|
+ u32 txb_pa_hi; /* Higher 32 bits of 64 bit physical addr */
|
|
+};
|
|
+
|
|
+struct be_rx_page_info {
|
|
+ struct page *page;
|
|
+ dma_addr_t bus;
|
|
+ u16 page_offset;
|
|
+};
|
|
+
|
|
+/*
|
|
+ * This structure is the main tracking structure for a NIC interface.
|
|
+ */
|
|
+struct be_net_object {
|
|
+ /* MCC Ring - used to send fwcmds to embedded ARM processor */
|
|
+ struct MCC_WRB_AMAP *mcc_q; /* VA of the start of the ring */
|
|
+ u32 mcc_q_len; /* # of WRB entries in this ring */
|
|
+ u32 mcc_q_size;
|
|
+ u32 mcc_q_hd; /* MCC ring head */
|
|
+ u8 mcc_q_created; /* flag to help cleanup */
|
|
+ struct be_mcc_object mcc_q_obj; /* BECLIB's MCC ring Object */
|
|
+ dma_addr_t mcc_q_bus; /* DMA'ble bus address */
|
|
+
|
|
+ /* MCC Completion Ring - FW responses to fwcmds sent from MCC ring */
|
|
+ struct MCC_CQ_ENTRY_AMAP *mcc_cq; /* VA of the start of the ring */
|
|
+ u32 mcc_cq_len; /* # of compl. entries in this ring */
|
|
+ u32 mcc_cq_size;
|
|
+ u32 mcc_cq_tl; /* compl. ring tail */
|
|
+ u8 mcc_cq_created; /* flag to help cleanup */
|
|
+ struct be_cq_object mcc_cq_obj; /* BECLIB's MCC compl. ring object */
|
|
+ u32 mcc_cq_id; /* MCC ring ID */
|
|
+ dma_addr_t mcc_cq_bus; /* DMA'ble bus address */
|
|
+
|
|
+ struct ring_desc mb_rd; /* RD for MCC_MAIL_BOX */
|
|
+ void *mb_ptr; /* mailbox ptr to be freed */
|
|
+ dma_addr_t mb_bus; /* DMA'ble bus address */
|
|
+ u32 mb_size;
|
|
+
|
|
+ /* BEClib uses an array of context objects to track outstanding
|
|
+ * requests to the MCC. We need allocate the same number of
|
|
+ * conext entries as the number of entries in the MCC WRB ring
|
|
+ */
|
|
+ u32 mcc_wrb_ctxt_size;
|
|
+ void *mcc_wrb_ctxt; /* pointer to the context area */
|
|
+ u32 mcc_wrb_ctxtLen; /* Number of entries in the context */
|
|
+ /*
|
|
+ * NIC send request ring - used for xmitting raw ether frames.
|
|
+ */
|
|
+ struct ETH_WRB_AMAP *tx_q; /* VA of the start of the ring */
|
|
+ u32 tx_q_len; /* # if entries in the send ring */
|
|
+ u32 tx_q_size;
|
|
+ u32 tx_q_hd; /* Head index. Next req. goes here */
|
|
+ u32 tx_q_tl; /* Tail indx. oldest outstanding req. */
|
|
+ u8 tx_q_created; /* flag to help cleanup */
|
|
+ struct be_ethsq_object tx_q_obj;/* BECLIB's send Q handle */
|
|
+ dma_addr_t tx_q_bus; /* DMA'ble bus address */
|
|
+ u32 tx_q_id; /* send queue ring ID */
|
|
+ u32 tx_q_port; /* 0 no binding, 1 port A, 2 port B */
|
|
+ atomic_t tx_q_used; /* # of WRBs used */
|
|
+ /* ptr to an array in which we store context info for each send req. */
|
|
+ void **tx_ctxt;
|
|
+ /*
|
|
+ * NIC Send compl. ring - completion status for all NIC frames xmitted.
|
|
+ */
|
|
+ struct ETH_TX_COMPL_AMAP *tx_cq;/* VA of start of the ring */
|
|
+ u32 txcq_len; /* # of entries in the ring */
|
|
+ u32 tx_cq_size;
|
|
+ /*
|
|
+ * index into compl ring where the host expects next completion entry
|
|
+ */
|
|
+ u32 tx_cq_tl;
|
|
+ u32 tx_cq_id; /* completion queue id */
|
|
+ u8 tx_cq_created; /* flag to help cleanup */
|
|
+ struct be_cq_object tx_cq_obj;
|
|
+ dma_addr_t tx_cq_bus; /* DMA'ble bus address */
|
|
+ /*
|
|
+ * Event Queue - all completion entries post events here.
|
|
+ */
|
|
+ struct EQ_ENTRY_AMAP *event_q; /* VA of start of event queue */
|
|
+ u32 event_q_len; /* # of entries */
|
|
+ u32 event_q_size;
|
|
+ u32 event_q_tl; /* Tail of the event queue */
|
|
+ u32 event_q_id; /* Event queue ID */
|
|
+ u8 event_q_created; /* flag to help cleanup */
|
|
+ struct be_eq_object event_q_obj; /* Queue handle */
|
|
+ dma_addr_t event_q_bus; /* DMA'ble bus address */
|
|
+ /*
|
|
+ * NIC receive queue - Data buffers to be used for receiving unicast,
|
|
+ * broadcast and multi-cast frames are posted here.
|
|
+ */
|
|
+ struct ETH_RX_D_AMAP *rx_q; /* VA of start of the queue */
|
|
+ u32 rx_q_len; /* # of entries */
|
|
+ u32 rx_q_size;
|
|
+ u32 rx_q_hd; /* Head of the queue */
|
|
+ atomic_t rx_q_posted; /* number of posted buffers */
|
|
+ u32 rx_q_id; /* queue ID */
|
|
+ u8 rx_q_created; /* flag to help cleanup */
|
|
+ struct be_ethrq_object rx_q_obj; /* NIC RX queue handle */
|
|
+ dma_addr_t rx_q_bus; /* DMA'ble bus address */
|
|
+ /*
|
|
+ * Pointer to an array of opaque context object for use by OSM driver
|
|
+ */
|
|
+ void **rx_ctxt;
|
|
+ /*
|
|
+ * NIC unicast RX completion queue - all unicast ether frame completion
|
|
+ * statuses from BE come here.
|
|
+ */
|
|
+ struct ETH_RX_COMPL_AMAP *rx_cq; /* VA of start of the queue */
|
|
+ u32 rx_cq_len; /* # of entries */
|
|
+ u32 rx_cq_size;
|
|
+ u32 rx_cq_tl; /* Tail of the queue */
|
|
+ u32 rx_cq_id; /* queue ID */
|
|
+ u8 rx_cq_created; /* flag to help cleanup */
|
|
+ struct be_cq_object rx_cq_obj; /* queue handle */
|
|
+ dma_addr_t rx_cq_bus; /* DMA'ble bus address */
|
|
+ struct be_function_object fn_obj; /* function object */
|
|
+ bool fn_obj_created;
|
|
+ u32 rx_buf_size; /* Size of the RX buffers */
|
|
+
|
|
+ struct net_device *netdev;
|
|
+ struct be_recv_buffer eth_rx_bufs[256]; /* to pass Rx buffer
|
|
+ addresses */
|
|
+ struct be_adapter *adapter; /* Pointer to OSM adapter */
|
|
+ u32 devno; /* OSM, network dev no. */
|
|
+ u32 use_port; /* Current active port */
|
|
+ struct be_rx_page_info *rx_page_info; /* Array of Rx buf pages */
|
|
+ u32 rx_pg_info_hd; /* Head of queue */
|
|
+ int rxbuf_post_fail; /* RxBuff posting fail count */
|
|
+ bool rx_pg_shared; /* Is an allocsted page shared as two frags ? */
|
|
+ struct vlan_group *vlan_grp;
|
|
+ u32 num_vlans; /* Number of vlans in BE's filter */
|
|
+ u16 vlan_tag[BE_NUM_VLAN_SUPPORTED]; /* vlans currently configured */
|
|
+ struct napi_struct napi;
|
|
+ struct net_lro_mgr lro_mgr;
|
|
+ struct net_lro_desc lro_desc[BE_MAX_LRO_DESCRIPTORS];
|
|
+};
|
|
+
|
|
+#define NET_FH(np) (&(np)->fn_obj)
|
|
+
|
|
+/*
|
|
+ * BE driver statistics.
|
|
+ */
|
|
+struct be_drvr_stat {
|
|
+ u32 bes_tx_reqs; /* number of TX requests initiated */
|
|
+ u32 bes_tx_fails; /* number of TX requests that failed */
|
|
+ u32 bes_fwd_reqs; /* number of send reqs through forwarding i/f */
|
|
+ u32 bes_tx_wrbs; /* number of tx WRBs used */
|
|
+
|
|
+ u32 bes_ints; /* number of interrupts */
|
|
+ u32 bes_polls; /* number of times NAPI called poll function */
|
|
+ u32 bes_events; /* total evet entries processed */
|
|
+ u32 bes_tx_events; /* number of tx completion events */
|
|
+ u32 bes_rx_events; /* number of ucast rx completion events */
|
|
+ u32 bes_tx_compl; /* number of tx completion entries processed */
|
|
+ u32 bes_rx_compl; /* number of rx completion entries
|
|
+ processed */
|
|
+ u32 bes_ethrx_post_fail; /* number of ethrx buffer alloc
|
|
+ failures */
|
|
+ /*
|
|
+ * number of non ether type II frames dropped where
|
|
+ * frame len > length field of Mac Hdr
|
|
+ */
|
|
+ u32 bes_802_3_dropped_frames;
|
|
+ /*
|
|
+ * number of non ether type II frames malformed where
|
|
+ * in frame len < length field of Mac Hdr
|
|
+ */
|
|
+ u32 bes_802_3_malformed_frames;
|
|
+ u32 bes_ips; /* interrupts / sec */
|
|
+ u32 bes_prev_ints; /* bes_ints at last IPS calculation */
|
|
+ u16 bes_eth_tx_rate; /* ETH TX rate - Mb/sec */
|
|
+ u16 bes_eth_rx_rate; /* ETH RX rate - Mb/sec */
|
|
+ u32 bes_rx_coal; /* Num pkts coalasced */
|
|
+ u32 bes_rx_flush; /* Num times coalasced */
|
|
+ u32 bes_link_change_physical; /*Num of times physical link changed */
|
|
+ u32 bes_link_change_virtual; /*Num of times virtual link changed */
|
|
+ u32 bes_rx_misc_pkts; /* Misc pkts received */
|
|
+};
|
|
+
|
|
+/* Maximum interrupt delay (in microseconds) allowed */
|
|
+#define MAX_EQD 120
|
|
+
|
|
+/*
|
|
+ * timer to prevent system shutdown hang for ever if h/w stops responding
|
|
+ */
|
|
+struct be_timer_ctxt {
|
|
+ atomic_t get_stat_flag;
|
|
+ struct timer_list get_stats_timer;
|
|
+ unsigned long get_stat_sem_addr;
|
|
+} ;
|
|
+
|
|
+/* This structure is the main BladeEngine driver context. */
|
|
+struct be_adapter {
|
|
+ struct net_device *netdevp;
|
|
+ struct be_drvr_stat be_stat;
|
|
+ struct net_device_stats benet_stats;
|
|
+
|
|
+ /* PCI BAR mapped addresses */
|
|
+ u8 __iomem *csr_va; /* CSR */
|
|
+ u8 __iomem *db_va; /* Door Bell */
|
|
+ u8 __iomem *pci_va; /* PCI Config */
|
|
+
|
|
+ struct tasklet_struct sts_handler;
|
|
+ struct timer_list cq_timer;
|
|
+ spinlock_t int_lock; /* to protect the isr field in adapter */
|
|
+
|
|
+ struct FWCMD_ETH_GET_STATISTICS *eth_statsp;
|
|
+ /*
|
|
+ * This will enable the use of ethtool to enable or disable
|
|
+ * Checksum on Rx pkts to be obeyed or disobeyed.
|
|
+ * If this is true = 1, then whatever is the checksum on the
|
|
+ * Received pkt as per BE, it will be given to the stack.
|
|
+ * Else the stack will re calculate it.
|
|
+ */
|
|
+ bool rx_csum;
|
|
+ /*
|
|
+ * This will enable the use of ethtool to enable or disable
|
|
+ * Coalese on Rx pkts to be obeyed or disobeyed.
|
|
+ * If this is grater than 0 and less than 16 then coalascing
|
|
+ * is enabled else it is disabled
|
|
+ */
|
|
+ u32 max_rx_coal;
|
|
+ struct pci_dev *pdev; /* Pointer to OS's PCI dvice */
|
|
+
|
|
+ spinlock_t txq_lock; /* to stop/wake queue based on tx_q_used */
|
|
+
|
|
+ u32 isr; /* copy of Intr status reg. */
|
|
+
|
|
+ u32 port0_link_sts; /* Port 0 link status */
|
|
+ u32 port1_link_sts; /* port 1 list status */
|
|
+ struct BE_LINK_STATUS *be_link_sts;
|
|
+
|
|
+ /* pointer to the first netobject of this adapter */
|
|
+ struct be_net_object *net_obj;
|
|
+
|
|
+ /* Flags to indicate what to clean up */
|
|
+ bool tasklet_started;
|
|
+ bool isr_registered;
|
|
+ /*
|
|
+ * adaptive interrupt coalescing (AIC) related
|
|
+ */
|
|
+ bool enable_aic; /* 1 if AIC is enabled */
|
|
+ u16 min_eqd; /* minimum EQ delay in usec */
|
|
+ u16 max_eqd; /* minimum EQ delay in usec */
|
|
+ u16 cur_eqd; /* current EQ delay in usec */
|
|
+ /*
|
|
+ * book keeping for interrupt / sec and TX/RX rate calculation
|
|
+ */
|
|
+ ulong ips_jiffies; /* jiffies at last IPS calc */
|
|
+ u32 eth_tx_bytes;
|
|
+ ulong eth_tx_jiffies;
|
|
+ u32 eth_rx_bytes;
|
|
+ ulong eth_rx_jiffies;
|
|
+
|
|
+ struct semaphore get_eth_stat_sem;
|
|
+
|
|
+ /* timer ctxt to prevent shutdown hanging due to un-responsive BE */
|
|
+ struct be_timer_ctxt timer_ctxt;
|
|
+
|
|
+#define BE_MAX_MSIX_VECTORS 32
|
|
+#define BE_MAX_REQ_MSIX_VECTORS 1 /* only one EQ in Linux driver */
|
|
+ struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS];
|
|
+ bool msix_enabled;
|
|
+ bool dma_64bit_cap; /* the Device DAC capable or not */
|
|
+ u8 dev_state; /* The current state of the device */
|
|
+ u8 dev_pm_state; /* The State of device before going to suspend */
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Every second we look at the ints/sec and adjust eq_delay
|
|
+ * between adapter->min_eqd and adapter->max_eqd to keep the ints/sec between
|
|
+ * IPS_HI_WM and IPS_LO_WM.
|
|
+ */
|
|
+#define IPS_HI_WM 18000
|
|
+#define IPS_LO_WM 8000
|
|
+
|
|
+
|
|
+static inline void index_adv(u32 *index, u32 val, u32 limit)
|
|
+{
|
|
+ BUG_ON(limit & (limit-1));
|
|
+ *index = (*index + val) & (limit - 1);
|
|
+}
|
|
+
|
|
+static inline void index_inc(u32 *index, u32 limit)
|
|
+{
|
|
+ BUG_ON(limit & (limit-1));
|
|
+ *index = (*index + 1) & (limit - 1);
|
|
+}
|
|
+
|
|
+static inline void be_adv_eq_tl(struct be_net_object *pnob)
|
|
+{
|
|
+ index_inc(&pnob->event_q_tl, pnob->event_q_len);
|
|
+}
|
|
+
|
|
+static inline void be_adv_txq_hd(struct be_net_object *pnob)
|
|
+{
|
|
+ index_inc(&pnob->tx_q_hd, pnob->tx_q_len);
|
|
+}
|
|
+
|
|
+static inline void be_adv_txq_tl(struct be_net_object *pnob)
|
|
+{
|
|
+ index_inc(&pnob->tx_q_tl, pnob->tx_q_len);
|
|
+}
|
|
+
|
|
+static inline void be_adv_txcq_tl(struct be_net_object *pnob)
|
|
+{
|
|
+ index_inc(&pnob->tx_cq_tl, pnob->txcq_len);
|
|
+}
|
|
+
|
|
+static inline void be_adv_rxq_hd(struct be_net_object *pnob)
|
|
+{
|
|
+ index_inc(&pnob->rx_q_hd, pnob->rx_q_len);
|
|
+}
|
|
+
|
|
+static inline void be_adv_rxcq_tl(struct be_net_object *pnob)
|
|
+{
|
|
+ index_inc(&pnob->rx_cq_tl, pnob->rx_cq_len);
|
|
+}
|
|
+
|
|
+static inline u32 tx_compl_lastwrb_idx_get(struct be_net_object *pnob)
|
|
+{
|
|
+ return (pnob->tx_q_tl + *(u32 *)&pnob->tx_ctxt[pnob->tx_q_tl] - 1)
|
|
+ & (pnob->tx_q_len - 1);
|
|
+}
|
|
+
|
|
+int benet_init(struct net_device *);
|
|
+int be_ethtool_ioctl(struct net_device *, struct ifreq *);
|
|
+struct net_device_stats *benet_get_stats(struct net_device *);
|
|
+void be_process_intr(unsigned long context);
|
|
+irqreturn_t be_int(int irq, void *dev);
|
|
+void be_post_eth_rx_buffs(struct be_net_object *);
|
|
+void be_get_stat_cb(void *, int, struct MCC_WRB_AMAP *);
|
|
+void be_get_stats_timer_handler(unsigned long);
|
|
+void be_wait_nic_tx_cmplx_cmpl(struct be_net_object *);
|
|
+void be_print_link_info(struct BE_LINK_STATUS *);
|
|
+void be_update_link_status(struct be_adapter *);
|
|
+void be_init_procfs(struct be_adapter *);
|
|
+void be_cleanup_procfs(struct be_adapter *);
|
|
+int be_poll(struct napi_struct *, int);
|
|
+struct ETH_RX_COMPL_AMAP *be_get_rx_cmpl(struct be_net_object *);
|
|
+void be_notify_cmpl(struct be_net_object *, int, int, int);
|
|
+void be_enable_intr(struct be_net_object *);
|
|
+void be_enable_eq_intr(struct be_net_object *);
|
|
+void be_disable_intr(struct be_net_object *);
|
|
+void be_disable_eq_intr(struct be_net_object *);
|
|
+int be_set_uc_mac_adr(struct be_net_object *, u8, u8, u8,
|
|
+ u8 *, mcc_wrb_cqe_callback, void *);
|
|
+int be_get_flow_ctl(struct be_function_object *pFnObj, bool *, bool *);
|
|
+void process_one_tx_compl(struct be_net_object *pnob, u32 end_idx);
|
|
+
|
|
+#endif /* _BENET_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/be_netif.c linux-2.6.29-rc3.owrt/drivers/staging/benet/be_netif.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/be_netif.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_netif.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,705 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * be_netif.c
|
|
+ *
|
|
+ * This file contains various entry points of drivers seen by tcp/ip stack.
|
|
+ */
|
|
+
|
|
+#include <linux/if_vlan.h>
|
|
+#include <linux/in.h>
|
|
+#include "benet.h"
|
|
+#include <linux/ip.h>
|
|
+#include <linux/inet_lro.h>
|
|
+
|
|
+/* Strings to print Link properties */
|
|
+static const char *link_speed[] = {
|
|
+ "Invalid link Speed Value",
|
|
+ "10 Mbps",
|
|
+ "100 Mbps",
|
|
+ "1 Gbps",
|
|
+ "10 Gbps"
|
|
+};
|
|
+
|
|
+static const char *link_duplex[] = {
|
|
+ "Invalid Duplex Value",
|
|
+ "Half Duplex",
|
|
+ "Full Duplex"
|
|
+};
|
|
+
|
|
+static const char *link_state[] = {
|
|
+ "",
|
|
+ "(active)"
|
|
+};
|
|
+
|
|
+void be_print_link_info(struct BE_LINK_STATUS *lnk_status)
|
|
+{
|
|
+ u16 si, di, ai;
|
|
+
|
|
+ /* Port 0 */
|
|
+ if (lnk_status->mac0_speed && lnk_status->mac0_duplex) {
|
|
+ /* Port is up and running */
|
|
+ si = (lnk_status->mac0_speed < 5) ? lnk_status->mac0_speed : 0;
|
|
+ di = (lnk_status->mac0_duplex < 3) ?
|
|
+ lnk_status->mac0_duplex : 0;
|
|
+ ai = (lnk_status->active_port == 0) ? 1 : 0;
|
|
+ printk(KERN_INFO "PortNo. 0: Speed - %s %s %s\n",
|
|
+ link_speed[si], link_duplex[di], link_state[ai]);
|
|
+ } else
|
|
+ printk(KERN_INFO "PortNo. 0: Down\n");
|
|
+
|
|
+ /* Port 1 */
|
|
+ if (lnk_status->mac1_speed && lnk_status->mac1_duplex) {
|
|
+ /* Port is up and running */
|
|
+ si = (lnk_status->mac1_speed < 5) ? lnk_status->mac1_speed : 0;
|
|
+ di = (lnk_status->mac1_duplex < 3) ?
|
|
+ lnk_status->mac1_duplex : 0;
|
|
+ ai = (lnk_status->active_port == 0) ? 1 : 0;
|
|
+ printk(KERN_INFO "PortNo. 1: Speed - %s %s %s\n",
|
|
+ link_speed[si], link_duplex[di], link_state[ai]);
|
|
+ } else
|
|
+ printk(KERN_INFO "PortNo. 1: Down\n");
|
|
+
|
|
+ return;
|
|
+}
|
|
+
|
|
+static int
|
|
+be_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr,
|
|
+ void **ip_hdr, void **tcpudp_hdr,
|
|
+ u64 *hdr_flags, void *priv)
|
|
+{
|
|
+ struct ethhdr *eh;
|
|
+ struct vlan_ethhdr *veh;
|
|
+ struct iphdr *iph;
|
|
+ u8 *va = page_address(frag->page) + frag->page_offset;
|
|
+ unsigned long ll_hlen;
|
|
+
|
|
+ /* find the mac header, abort if not IPv4 */
|
|
+
|
|
+ prefetch(va);
|
|
+ eh = (struct ethhdr *)va;
|
|
+ *mac_hdr = eh;
|
|
+ ll_hlen = ETH_HLEN;
|
|
+ if (eh->h_proto != htons(ETH_P_IP)) {
|
|
+ if (eh->h_proto == htons(ETH_P_8021Q)) {
|
|
+ veh = (struct vlan_ethhdr *)va;
|
|
+ if (veh->h_vlan_encapsulated_proto != htons(ETH_P_IP))
|
|
+ return -1;
|
|
+
|
|
+ ll_hlen += VLAN_HLEN;
|
|
+
|
|
+ } else {
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+ *hdr_flags = LRO_IPV4;
|
|
+
|
|
+ iph = (struct iphdr *)(va + ll_hlen);
|
|
+ *ip_hdr = iph;
|
|
+ if (iph->protocol != IPPROTO_TCP)
|
|
+ return -1;
|
|
+ *hdr_flags |= LRO_TCP;
|
|
+ *tcpudp_hdr = (u8 *) (*ip_hdr) + (iph->ihl << 2);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int benet_open(struct net_device *netdev)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ struct net_lro_mgr *lro_mgr;
|
|
+
|
|
+ if (adapter->dev_state < BE_DEV_STATE_INIT)
|
|
+ return -EAGAIN;
|
|
+
|
|
+ lro_mgr = &pnob->lro_mgr;
|
|
+ lro_mgr->dev = netdev;
|
|
+
|
|
+ lro_mgr->features = LRO_F_NAPI;
|
|
+ lro_mgr->ip_summed = CHECKSUM_UNNECESSARY;
|
|
+ lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY;
|
|
+ lro_mgr->max_desc = BE_MAX_LRO_DESCRIPTORS;
|
|
+ lro_mgr->lro_arr = pnob->lro_desc;
|
|
+ lro_mgr->get_frag_header = be_get_frag_header;
|
|
+ lro_mgr->max_aggr = adapter->max_rx_coal;
|
|
+ lro_mgr->frag_align_pad = 2;
|
|
+ if (lro_mgr->max_aggr > MAX_SKB_FRAGS)
|
|
+ lro_mgr->max_aggr = MAX_SKB_FRAGS;
|
|
+
|
|
+ adapter->max_rx_coal = BE_LRO_MAX_PKTS;
|
|
+
|
|
+ be_update_link_status(adapter);
|
|
+
|
|
+ /*
|
|
+ * Set carrier on only if Physical Link up
|
|
+ * Either of the port link status up signifies this
|
|
+ */
|
|
+ if ((adapter->port0_link_sts == BE_PORT_LINK_UP) ||
|
|
+ (adapter->port1_link_sts == BE_PORT_LINK_UP)) {
|
|
+ netif_start_queue(netdev);
|
|
+ netif_carrier_on(netdev);
|
|
+ }
|
|
+
|
|
+ adapter->dev_state = BE_DEV_STATE_OPEN;
|
|
+ napi_enable(&pnob->napi);
|
|
+ be_enable_intr(pnob);
|
|
+ be_enable_eq_intr(pnob);
|
|
+ /*
|
|
+ * RX completion queue may be in dis-armed state. Arm it.
|
|
+ */
|
|
+ be_notify_cmpl(pnob, 0, pnob->rx_cq_id, 1);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int benet_close(struct net_device *netdev)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+
|
|
+ netif_stop_queue(netdev);
|
|
+ synchronize_irq(netdev->irq);
|
|
+
|
|
+ be_wait_nic_tx_cmplx_cmpl(pnob);
|
|
+ adapter->dev_state = BE_DEV_STATE_INIT;
|
|
+ netif_carrier_off(netdev);
|
|
+
|
|
+ adapter->port0_link_sts = BE_PORT_LINK_DOWN;
|
|
+ adapter->port1_link_sts = BE_PORT_LINK_DOWN;
|
|
+ be_disable_intr(pnob);
|
|
+ be_disable_eq_intr(pnob);
|
|
+ napi_disable(&pnob->napi);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Setting a Mac Address for BE
|
|
+ * Takes netdev and a void pointer as arguments.
|
|
+ * The pointer holds the new addres to be used.
|
|
+ */
|
|
+static int benet_set_mac_addr(struct net_device *netdev, void *p)
|
|
+{
|
|
+ struct sockaddr *addr = p;
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+
|
|
+ memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
|
|
+ be_rxf_mac_address_read_write(&pnob->fn_obj, 0, 0, false, true, false,
|
|
+ netdev->dev_addr, NULL, NULL);
|
|
+ /*
|
|
+ * Since we are doing Active-Passive failover, both
|
|
+ * ports should have matching MAC addresses everytime.
|
|
+ */
|
|
+ be_rxf_mac_address_read_write(&pnob->fn_obj, 1, 0, false, true, false,
|
|
+ netdev->dev_addr, NULL, NULL);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+void be_get_stats_timer_handler(unsigned long context)
|
|
+{
|
|
+ struct be_timer_ctxt *ctxt = (struct be_timer_ctxt *)context;
|
|
+
|
|
+ if (atomic_read(&ctxt->get_stat_flag)) {
|
|
+ atomic_dec(&ctxt->get_stat_flag);
|
|
+ up((void *)ctxt->get_stat_sem_addr);
|
|
+ }
|
|
+ del_timer(&ctxt->get_stats_timer);
|
|
+ return;
|
|
+}
|
|
+
|
|
+void be_get_stat_cb(void *context, int status,
|
|
+ struct MCC_WRB_AMAP *optional_wrb)
|
|
+{
|
|
+ struct be_timer_ctxt *ctxt = (struct be_timer_ctxt *)context;
|
|
+ /*
|
|
+ * just up the semaphore if the get_stat_flag
|
|
+ * reads 1. so that the waiter can continue.
|
|
+ * If it is 0, then it was handled by the timer handler.
|
|
+ */
|
|
+ del_timer(&ctxt->get_stats_timer);
|
|
+ if (atomic_read(&ctxt->get_stat_flag)) {
|
|
+ atomic_dec(&ctxt->get_stat_flag);
|
|
+ up((void *)ctxt->get_stat_sem_addr);
|
|
+ }
|
|
+}
|
|
+
|
|
+struct net_device_stats *benet_get_stats(struct net_device *dev)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(dev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ u64 pa;
|
|
+ struct be_timer_ctxt *ctxt = &adapter->timer_ctxt;
|
|
+
|
|
+ if (adapter->dev_state != BE_DEV_STATE_OPEN) {
|
|
+ /* Return previously read stats */
|
|
+ return &(adapter->benet_stats);
|
|
+ }
|
|
+ /* Get Physical Addr */
|
|
+ pa = pci_map_single(adapter->pdev, adapter->eth_statsp,
|
|
+ sizeof(struct FWCMD_ETH_GET_STATISTICS),
|
|
+ PCI_DMA_FROMDEVICE);
|
|
+ ctxt->get_stat_sem_addr = (unsigned long)&adapter->get_eth_stat_sem;
|
|
+ atomic_inc(&ctxt->get_stat_flag);
|
|
+
|
|
+ be_rxf_query_eth_statistics(&pnob->fn_obj, adapter->eth_statsp,
|
|
+ cpu_to_le64(pa), be_get_stat_cb, ctxt,
|
|
+ NULL);
|
|
+
|
|
+ ctxt->get_stats_timer.data = (unsigned long)ctxt;
|
|
+ mod_timer(&ctxt->get_stats_timer, (jiffies + (HZ * 2)));
|
|
+ down((void *)ctxt->get_stat_sem_addr); /* callback will unblock us */
|
|
+
|
|
+ /* Adding port0 and port1 stats. */
|
|
+ adapter->benet_stats.rx_packets =
|
|
+ adapter->eth_statsp->params.response.p0recvdtotalframes +
|
|
+ adapter->eth_statsp->params.response.p1recvdtotalframes;
|
|
+ adapter->benet_stats.tx_packets =
|
|
+ adapter->eth_statsp->params.response.p0xmitunicastframes +
|
|
+ adapter->eth_statsp->params.response.p1xmitunicastframes;
|
|
+ adapter->benet_stats.tx_bytes =
|
|
+ adapter->eth_statsp->params.response.p0xmitbyteslsd +
|
|
+ adapter->eth_statsp->params.response.p1xmitbyteslsd;
|
|
+ adapter->benet_stats.rx_errors =
|
|
+ adapter->eth_statsp->params.response.p0crcerrors +
|
|
+ adapter->eth_statsp->params.response.p1crcerrors;
|
|
+ adapter->benet_stats.rx_errors +=
|
|
+ adapter->eth_statsp->params.response.p0alignmentsymerrs +
|
|
+ adapter->eth_statsp->params.response.p1alignmentsymerrs;
|
|
+ adapter->benet_stats.rx_errors +=
|
|
+ adapter->eth_statsp->params.response.p0inrangelenerrors +
|
|
+ adapter->eth_statsp->params.response.p1inrangelenerrors;
|
|
+ adapter->benet_stats.rx_bytes =
|
|
+ adapter->eth_statsp->params.response.p0recvdtotalbytesLSD +
|
|
+ adapter->eth_statsp->params.response.p1recvdtotalbytesLSD;
|
|
+ adapter->benet_stats.rx_crc_errors =
|
|
+ adapter->eth_statsp->params.response.p0crcerrors +
|
|
+ adapter->eth_statsp->params.response.p1crcerrors;
|
|
+
|
|
+ adapter->benet_stats.tx_packets +=
|
|
+ adapter->eth_statsp->params.response.p0xmitmulticastframes +
|
|
+ adapter->eth_statsp->params.response.p1xmitmulticastframes;
|
|
+ adapter->benet_stats.tx_packets +=
|
|
+ adapter->eth_statsp->params.response.p0xmitbroadcastframes +
|
|
+ adapter->eth_statsp->params.response.p1xmitbroadcastframes;
|
|
+ adapter->benet_stats.tx_errors = 0;
|
|
+
|
|
+ adapter->benet_stats.multicast =
|
|
+ adapter->eth_statsp->params.response.p0xmitmulticastframes +
|
|
+ adapter->eth_statsp->params.response.p1xmitmulticastframes;
|
|
+
|
|
+ adapter->benet_stats.rx_fifo_errors =
|
|
+ adapter->eth_statsp->params.response.p0rxfifooverflowdropped +
|
|
+ adapter->eth_statsp->params.response.p1rxfifooverflowdropped;
|
|
+ adapter->benet_stats.rx_frame_errors =
|
|
+ adapter->eth_statsp->params.response.p0alignmentsymerrs +
|
|
+ adapter->eth_statsp->params.response.p1alignmentsymerrs;
|
|
+ adapter->benet_stats.rx_length_errors =
|
|
+ adapter->eth_statsp->params.response.p0inrangelenerrors +
|
|
+ adapter->eth_statsp->params.response.p1inrangelenerrors;
|
|
+ adapter->benet_stats.rx_length_errors +=
|
|
+ adapter->eth_statsp->params.response.p0outrangeerrors +
|
|
+ adapter->eth_statsp->params.response.p1outrangeerrors;
|
|
+ adapter->benet_stats.rx_length_errors +=
|
|
+ adapter->eth_statsp->params.response.p0frametoolongerrors +
|
|
+ adapter->eth_statsp->params.response.p1frametoolongerrors;
|
|
+
|
|
+ pci_unmap_single(adapter->pdev, (ulong) adapter->eth_statsp,
|
|
+ sizeof(struct FWCMD_ETH_GET_STATISTICS),
|
|
+ PCI_DMA_FROMDEVICE);
|
|
+ return &(adapter->benet_stats);
|
|
+
|
|
+}
|
|
+
|
|
+static void be_start_tx(struct be_net_object *pnob, u32 nposted)
|
|
+{
|
|
+#define CSR_ETH_MAX_SQPOSTS 255
|
|
+ struct SQ_DB_AMAP sqdb;
|
|
+
|
|
+ sqdb.dw[0] = 0;
|
|
+
|
|
+ AMAP_SET_BITS_PTR(SQ_DB, cid, &sqdb, pnob->tx_q_id);
|
|
+ while (nposted) {
|
|
+ if (nposted > CSR_ETH_MAX_SQPOSTS) {
|
|
+ AMAP_SET_BITS_PTR(SQ_DB, numPosted, &sqdb,
|
|
+ CSR_ETH_MAX_SQPOSTS);
|
|
+ nposted -= CSR_ETH_MAX_SQPOSTS;
|
|
+ } else {
|
|
+ AMAP_SET_BITS_PTR(SQ_DB, numPosted, &sqdb, nposted);
|
|
+ nposted = 0;
|
|
+ }
|
|
+ PD_WRITE(&pnob->fn_obj, etx_sq_db, sqdb.dw[0]);
|
|
+ }
|
|
+
|
|
+ return;
|
|
+}
|
|
+
|
|
+static void update_tx_rate(struct be_adapter *adapter)
|
|
+{
|
|
+ /* update the rate once in two seconds */
|
|
+ if ((jiffies - adapter->eth_tx_jiffies) > 2 * (HZ)) {
|
|
+ u32 r;
|
|
+ r = adapter->eth_tx_bytes /
|
|
+ ((jiffies - adapter->eth_tx_jiffies) / (HZ));
|
|
+ r = (r / 1000000); /* M bytes/s */
|
|
+ adapter->be_stat.bes_eth_tx_rate = (r * 8); /* M bits/s */
|
|
+ adapter->eth_tx_jiffies = jiffies;
|
|
+ adapter->eth_tx_bytes = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
+static int wrb_cnt_in_skb(struct sk_buff *skb)
|
|
+{
|
|
+ int cnt = 0;
|
|
+ while (skb) {
|
|
+ if (skb->len > skb->data_len)
|
|
+ cnt++;
|
|
+ cnt += skb_shinfo(skb)->nr_frags;
|
|
+ skb = skb_shinfo(skb)->frag_list;
|
|
+ }
|
|
+ BUG_ON(cnt > BE_MAX_TX_FRAG_COUNT);
|
|
+ return cnt;
|
|
+}
|
|
+
|
|
+static void wrb_fill(struct ETH_WRB_AMAP *wrb, u64 addr, int len)
|
|
+{
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, frag_pa_hi, wrb, addr >> 32);
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, frag_pa_lo, wrb, addr & 0xFFFFFFFF);
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, frag_len, wrb, len);
|
|
+}
|
|
+
|
|
+static void wrb_fill_extra(struct ETH_WRB_AMAP *wrb, struct sk_buff *skb,
|
|
+ struct be_net_object *pnob)
|
|
+{
|
|
+ wrb->dw[2] = 0;
|
|
+ wrb->dw[3] = 0;
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, crc, wrb, 1);
|
|
+ if (skb_shinfo(skb)->gso_segs > 1 && skb_shinfo(skb)->gso_size) {
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, lso, wrb, 1);
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, lso_mss, wrb,
|
|
+ skb_shinfo(skb)->gso_size);
|
|
+ } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
+ u8 proto = ((struct iphdr *)ip_hdr(skb))->protocol;
|
|
+ if (proto == IPPROTO_TCP)
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, tcpcs, wrb, 1);
|
|
+ else if (proto == IPPROTO_UDP)
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, udpcs, wrb, 1);
|
|
+ }
|
|
+ if (pnob->vlan_grp && vlan_tx_tag_present(skb)) {
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, vlan, wrb, 1);
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, vlan_tag, wrb, vlan_tx_tag_get(skb));
|
|
+ }
|
|
+}
|
|
+
|
|
+static inline void wrb_copy_extra(struct ETH_WRB_AMAP *to,
|
|
+ struct ETH_WRB_AMAP *from)
|
|
+{
|
|
+
|
|
+ to->dw[2] = from->dw[2];
|
|
+ to->dw[3] = from->dw[3];
|
|
+}
|
|
+
|
|
+/* Returns the actual count of wrbs used including a possible dummy */
|
|
+static int copy_skb_to_txq(struct be_net_object *pnob, struct sk_buff *skb,
|
|
+ u32 wrb_cnt, u32 *copied)
|
|
+{
|
|
+ u64 busaddr;
|
|
+ struct ETH_WRB_AMAP *wrb = NULL, *first = NULL;
|
|
+ u32 i;
|
|
+ bool dummy = true;
|
|
+ struct pci_dev *pdev = pnob->adapter->pdev;
|
|
+
|
|
+ if (wrb_cnt & 1)
|
|
+ wrb_cnt++;
|
|
+ else
|
|
+ dummy = false;
|
|
+
|
|
+ atomic_add(wrb_cnt, &pnob->tx_q_used);
|
|
+
|
|
+ while (skb) {
|
|
+ if (skb->len > skb->data_len) {
|
|
+ int len = skb->len - skb->data_len;
|
|
+ busaddr = pci_map_single(pdev, skb->data, len,
|
|
+ PCI_DMA_TODEVICE);
|
|
+ busaddr = cpu_to_le64(busaddr);
|
|
+ wrb = &pnob->tx_q[pnob->tx_q_hd];
|
|
+ if (first == NULL) {
|
|
+ wrb_fill_extra(wrb, skb, pnob);
|
|
+ first = wrb;
|
|
+ } else {
|
|
+ wrb_copy_extra(wrb, first);
|
|
+ }
|
|
+ wrb_fill(wrb, busaddr, len);
|
|
+ be_adv_txq_hd(pnob);
|
|
+ *copied += len;
|
|
+ }
|
|
+
|
|
+ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
|
+ struct skb_frag_struct *frag =
|
|
+ &skb_shinfo(skb)->frags[i];
|
|
+ busaddr = pci_map_page(pdev, frag->page,
|
|
+ frag->page_offset, frag->size,
|
|
+ PCI_DMA_TODEVICE);
|
|
+ busaddr = cpu_to_le64(busaddr);
|
|
+ wrb = &pnob->tx_q[pnob->tx_q_hd];
|
|
+ if (first == NULL) {
|
|
+ wrb_fill_extra(wrb, skb, pnob);
|
|
+ first = wrb;
|
|
+ } else {
|
|
+ wrb_copy_extra(wrb, first);
|
|
+ }
|
|
+ wrb_fill(wrb, busaddr, frag->size);
|
|
+ be_adv_txq_hd(pnob);
|
|
+ *copied += frag->size;
|
|
+ }
|
|
+ skb = skb_shinfo(skb)->frag_list;
|
|
+ }
|
|
+
|
|
+ if (dummy) {
|
|
+ wrb = &pnob->tx_q[pnob->tx_q_hd];
|
|
+ BUG_ON(first == NULL);
|
|
+ wrb_copy_extra(wrb, first);
|
|
+ wrb_fill(wrb, 0, 0);
|
|
+ be_adv_txq_hd(pnob);
|
|
+ }
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, complete, wrb, 1);
|
|
+ AMAP_SET_BITS_PTR(ETH_WRB, last, wrb, 1);
|
|
+ return wrb_cnt;
|
|
+}
|
|
+
|
|
+/* For each skb transmitted, tx_ctxt stores the num of wrbs in the
|
|
+ * start index and skb pointer in the end index
|
|
+ */
|
|
+static inline void be_tx_wrb_info_remember(struct be_net_object *pnob,
|
|
+ struct sk_buff *skb, int wrb_cnt,
|
|
+ u32 start)
|
|
+{
|
|
+ *(u32 *) (&pnob->tx_ctxt[start]) = wrb_cnt;
|
|
+ index_adv(&start, wrb_cnt - 1, pnob->tx_q_len);
|
|
+ pnob->tx_ctxt[start] = skb;
|
|
+}
|
|
+
|
|
+static int benet_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+ u32 wrb_cnt, copied = 0;
|
|
+ u32 start = pnob->tx_q_hd;
|
|
+
|
|
+ adapter->be_stat.bes_tx_reqs++;
|
|
+
|
|
+ wrb_cnt = wrb_cnt_in_skb(skb);
|
|
+ spin_lock_bh(&adapter->txq_lock);
|
|
+ if ((pnob->tx_q_len - 2 - atomic_read(&pnob->tx_q_used)) <= wrb_cnt) {
|
|
+ netif_stop_queue(pnob->netdev);
|
|
+ spin_unlock_bh(&adapter->txq_lock);
|
|
+ adapter->be_stat.bes_tx_fails++;
|
|
+ return NETDEV_TX_BUSY;
|
|
+ }
|
|
+ spin_unlock_bh(&adapter->txq_lock);
|
|
+
|
|
+ wrb_cnt = copy_skb_to_txq(pnob, skb, wrb_cnt, &copied);
|
|
+ be_tx_wrb_info_remember(pnob, skb, wrb_cnt, start);
|
|
+
|
|
+ be_start_tx(pnob, wrb_cnt);
|
|
+
|
|
+ adapter->eth_tx_bytes += copied;
|
|
+ adapter->be_stat.bes_tx_wrbs += wrb_cnt;
|
|
+ update_tx_rate(adapter);
|
|
+ netdev->trans_start = jiffies;
|
|
+
|
|
+ return NETDEV_TX_OK;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This is the driver entry point to change the mtu of the device
|
|
+ * Returns 0 for success and errno for failure.
|
|
+ */
|
|
+static int benet_change_mtu(struct net_device *netdev, int new_mtu)
|
|
+{
|
|
+ /*
|
|
+ * BE supports jumbo frame size upto 9000 bytes including the link layer
|
|
+ * header. Considering the different variants of frame formats possible
|
|
+ * like VLAN, SNAP/LLC, the maximum possible value for MTU is 8974 bytes
|
|
+ */
|
|
+
|
|
+ if (new_mtu < (ETH_ZLEN + ETH_FCS_LEN) || (new_mtu > BE_MAX_MTU)) {
|
|
+ dev_info(&netdev->dev, "Invalid MTU requested. "
|
|
+ "Must be between %d and %d bytes\n",
|
|
+ (ETH_ZLEN + ETH_FCS_LEN), BE_MAX_MTU);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ dev_info(&netdev->dev, "MTU changed from %d to %d\n",
|
|
+ netdev->mtu, new_mtu);
|
|
+ netdev->mtu = new_mtu;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This is the driver entry point to register a vlan with the device
|
|
+ */
|
|
+static void benet_vlan_register(struct net_device *netdev,
|
|
+ struct vlan_group *grp)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+
|
|
+ be_disable_eq_intr(pnob);
|
|
+ pnob->vlan_grp = grp;
|
|
+ pnob->num_vlans = 0;
|
|
+ be_enable_eq_intr(pnob);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This is the driver entry point to add a vlan vlan_id
|
|
+ * with the device netdev
|
|
+ */
|
|
+static void benet_vlan_add_vid(struct net_device *netdev, u16 vlan_id)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+
|
|
+ if (pnob->num_vlans == (BE_NUM_VLAN_SUPPORTED - 1)) {
|
|
+ /* no way to return an error */
|
|
+ dev_info(&netdev->dev,
|
|
+ "BladeEngine: Cannot configure more than %d Vlans\n",
|
|
+ BE_NUM_VLAN_SUPPORTED);
|
|
+ return;
|
|
+ }
|
|
+ /* The new vlan tag will be in the slot indicated by num_vlans. */
|
|
+ pnob->vlan_tag[pnob->num_vlans++] = vlan_id;
|
|
+ be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans,
|
|
+ pnob->vlan_tag, NULL, NULL, NULL);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This is the driver entry point to remove a vlan vlan_id
|
|
+ * with the device netdev
|
|
+ */
|
|
+static void benet_vlan_rem_vid(struct net_device *netdev, u16 vlan_id)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+
|
|
+ u32 i, value;
|
|
+
|
|
+ /*
|
|
+ * In Blade Engine, we support 32 vlan tag filters across both ports.
|
|
+ * To program a vlan tag, the RXF_RTPR_CSR register is used.
|
|
+ * Each 32-bit value of RXF_RTDR_CSR can address 2 vlan tag entries.
|
|
+ * The Vlan table is of depth 16. thus we support 32 tags.
|
|
+ */
|
|
+
|
|
+ value = vlan_id | VLAN_VALID_BIT;
|
|
+ for (i = 0; i < BE_NUM_VLAN_SUPPORTED; i++) {
|
|
+ if (pnob->vlan_tag[i] == vlan_id)
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (i == BE_NUM_VLAN_SUPPORTED)
|
|
+ return;
|
|
+ /* Now compact the vlan tag array by removing hole created. */
|
|
+ while ((i + 1) < BE_NUM_VLAN_SUPPORTED) {
|
|
+ pnob->vlan_tag[i] = pnob->vlan_tag[i + 1];
|
|
+ i++;
|
|
+ }
|
|
+ if ((i + 1) == BE_NUM_VLAN_SUPPORTED)
|
|
+ pnob->vlan_tag[i] = (u16) 0x0;
|
|
+ pnob->num_vlans--;
|
|
+ be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans,
|
|
+ pnob->vlan_tag, NULL, NULL, NULL);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This function is called to program multicast
|
|
+ * address in the multicast filter of the ASIC.
|
|
+ */
|
|
+static void be_set_multicast_filter(struct net_device *netdev)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct dev_mc_list *mc_ptr;
|
|
+ u8 mac_addr[32][ETH_ALEN];
|
|
+ int i;
|
|
+
|
|
+ if (netdev->flags & IFF_ALLMULTI) {
|
|
+ /* set BE in Multicast promiscuous */
|
|
+ be_rxf_multicast_config(&pnob->fn_obj, true, 0, NULL, NULL,
|
|
+ NULL, NULL);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ for (mc_ptr = netdev->mc_list, i = 0; mc_ptr;
|
|
+ mc_ptr = mc_ptr->next, i++) {
|
|
+ memcpy(&mac_addr[i][0], mc_ptr->dmi_addr, ETH_ALEN);
|
|
+ }
|
|
+
|
|
+ /* reset the promiscuous mode also. */
|
|
+ be_rxf_multicast_config(&pnob->fn_obj, false, i,
|
|
+ &mac_addr[0][0], NULL, NULL, NULL);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This is the driver entry point to set multicast list
|
|
+ * with the device netdev. This function will be used to
|
|
+ * set promiscuous mode or multicast promiscuous mode
|
|
+ * or multicast mode....
|
|
+ */
|
|
+static void benet_set_multicast_list(struct net_device *netdev)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+
|
|
+ if (netdev->flags & IFF_PROMISC) {
|
|
+ be_rxf_promiscuous(&pnob->fn_obj, 1, 1, NULL, NULL, NULL);
|
|
+ } else {
|
|
+ be_rxf_promiscuous(&pnob->fn_obj, 0, 0, NULL, NULL, NULL);
|
|
+ be_set_multicast_filter(netdev);
|
|
+ }
|
|
+}
|
|
+
|
|
+int benet_init(struct net_device *netdev)
|
|
+{
|
|
+ struct be_net_object *pnob = netdev_priv(netdev);
|
|
+ struct be_adapter *adapter = pnob->adapter;
|
|
+
|
|
+ ether_setup(netdev);
|
|
+
|
|
+ netdev->open = &benet_open;
|
|
+ netdev->stop = &benet_close;
|
|
+ netdev->hard_start_xmit = &benet_xmit;
|
|
+
|
|
+ netdev->get_stats = &benet_get_stats;
|
|
+
|
|
+ netdev->set_multicast_list = &benet_set_multicast_list;
|
|
+
|
|
+ netdev->change_mtu = &benet_change_mtu;
|
|
+ netdev->set_mac_address = &benet_set_mac_addr;
|
|
+
|
|
+ netdev->vlan_rx_register = benet_vlan_register;
|
|
+ netdev->vlan_rx_add_vid = benet_vlan_add_vid;
|
|
+ netdev->vlan_rx_kill_vid = benet_vlan_rem_vid;
|
|
+
|
|
+ netdev->features =
|
|
+ NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
|
|
+ NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM;
|
|
+
|
|
+ netdev->flags |= IFF_MULTICAST;
|
|
+
|
|
+ /* If device is DAC Capable, set the HIGHDMA flag for netdevice. */
|
|
+ if (adapter->dma_64bit_cap)
|
|
+ netdev->features |= NETIF_F_HIGHDMA;
|
|
+
|
|
+ SET_ETHTOOL_OPS(netdev, &be_ethtool_ops);
|
|
+ return 0;
|
|
+}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/bestatus.h linux-2.6.29-rc3.owrt/drivers/staging/benet/bestatus.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/bestatus.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/bestatus.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,103 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#ifndef _BESTATUS_H_
|
|
+#define _BESTATUS_H_
|
|
+
|
|
+#define BE_SUCCESS (0x00000000L)
|
|
+/*
|
|
+ * MessageId: BE_PENDING
|
|
+ * The BladeEngine Driver call succeeded, and pended operation.
|
|
+ */
|
|
+#define BE_PENDING (0x20070001L)
|
|
+#define BE_STATUS_PENDING (BE_PENDING)
|
|
+/*
|
|
+ * MessageId: BE_NOT_OK
|
|
+ * An error occurred.
|
|
+ */
|
|
+#define BE_NOT_OK (0xE0070002L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_SYSTEM_RESOURCES
|
|
+ * Insufficient host system resources exist to complete the API.
|
|
+ */
|
|
+#define BE_STATUS_SYSTEM_RESOURCES (0xE0070003L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_CHIP_RESOURCES
|
|
+ * Insufficient chip resources exist to complete the API.
|
|
+ */
|
|
+#define BE_STATUS_CHIP_RESOURCES (0xE0070004L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_NO_RESOURCE
|
|
+ * Insufficient resources to complete request.
|
|
+ */
|
|
+#define BE_STATUS_NO_RESOURCE (0xE0070005L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_BUSY
|
|
+ * Resource is currently busy.
|
|
+ */
|
|
+#define BE_STATUS_BUSY (0xE0070006L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_INVALID_PARAMETER
|
|
+ * Invalid Parameter in request.
|
|
+ */
|
|
+#define BE_STATUS_INVALID_PARAMETER (0xE0000007L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_NOT_SUPPORTED
|
|
+ * Requested operation is not supported.
|
|
+ */
|
|
+#define BE_STATUS_NOT_SUPPORTED (0xE000000DL)
|
|
+
|
|
+/*
|
|
+ * ***************************************************************************
|
|
+ * E T H E R N E T S T A T U S
|
|
+ * ***************************************************************************
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * MessageId: BE_ETH_TX_ERROR
|
|
+ * The Ethernet device driver failed to transmit a packet.
|
|
+ */
|
|
+#define BE_ETH_TX_ERROR (0xE0070101L)
|
|
+
|
|
+/*
|
|
+ * ***************************************************************************
|
|
+ * S H A R E D S T A T U S
|
|
+ * ***************************************************************************
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * MessageId: BE_STATUS_VBD_INVALID_VERSION
|
|
+ * The device driver is not compatible with this version of the VBD.
|
|
+ */
|
|
+#define BE_STATUS_INVALID_VERSION (0xE0070402L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_DOMAIN_DENIED
|
|
+ * The operation failed to complete due to insufficient access
|
|
+ * rights for the requesting domain.
|
|
+ */
|
|
+#define BE_STATUS_DOMAIN_DENIED (0xE0070403L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_TCP_NOT_STARTED
|
|
+ * The embedded TCP/IP stack has not been started.
|
|
+ */
|
|
+#define BE_STATUS_TCP_NOT_STARTED (0xE0070409L)
|
|
+/*
|
|
+ * MessageId: BE_STATUS_NO_MCC_WRB
|
|
+ * No free MCC WRB are available for posting the request.
|
|
+ */
|
|
+#define BE_STATUS_NO_MCC_WRB (0xE0070414L)
|
|
+
|
|
+#endif /* _BESTATUS_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/cev.h linux-2.6.29-rc3.owrt/drivers/staging/benet/cev.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/cev.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/cev.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,243 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __cev_amap_h__
|
|
+#define __cev_amap_h__
|
|
+#include "ep.h"
|
|
+
|
|
+/*
|
|
+ * Host Interrupt Status Register 0. The first of four application
|
|
+ * interrupt status registers. This register contains the interrupts
|
|
+ * for Event Queues EQ0 through EQ31.
|
|
+ */
|
|
+struct BE_CEV_ISR0_CSR_AMAP {
|
|
+ u8 interrupt0; /* DWORD 0 */
|
|
+ u8 interrupt1; /* DWORD 0 */
|
|
+ u8 interrupt2; /* DWORD 0 */
|
|
+ u8 interrupt3; /* DWORD 0 */
|
|
+ u8 interrupt4; /* DWORD 0 */
|
|
+ u8 interrupt5; /* DWORD 0 */
|
|
+ u8 interrupt6; /* DWORD 0 */
|
|
+ u8 interrupt7; /* DWORD 0 */
|
|
+ u8 interrupt8; /* DWORD 0 */
|
|
+ u8 interrupt9; /* DWORD 0 */
|
|
+ u8 interrupt10; /* DWORD 0 */
|
|
+ u8 interrupt11; /* DWORD 0 */
|
|
+ u8 interrupt12; /* DWORD 0 */
|
|
+ u8 interrupt13; /* DWORD 0 */
|
|
+ u8 interrupt14; /* DWORD 0 */
|
|
+ u8 interrupt15; /* DWORD 0 */
|
|
+ u8 interrupt16; /* DWORD 0 */
|
|
+ u8 interrupt17; /* DWORD 0 */
|
|
+ u8 interrupt18; /* DWORD 0 */
|
|
+ u8 interrupt19; /* DWORD 0 */
|
|
+ u8 interrupt20; /* DWORD 0 */
|
|
+ u8 interrupt21; /* DWORD 0 */
|
|
+ u8 interrupt22; /* DWORD 0 */
|
|
+ u8 interrupt23; /* DWORD 0 */
|
|
+ u8 interrupt24; /* DWORD 0 */
|
|
+ u8 interrupt25; /* DWORD 0 */
|
|
+ u8 interrupt26; /* DWORD 0 */
|
|
+ u8 interrupt27; /* DWORD 0 */
|
|
+ u8 interrupt28; /* DWORD 0 */
|
|
+ u8 interrupt29; /* DWORD 0 */
|
|
+ u8 interrupt30; /* DWORD 0 */
|
|
+ u8 interrupt31; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct CEV_ISR0_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Host Interrupt Status Register 1. The second of four application
|
|
+ * interrupt status registers. This register contains the interrupts
|
|
+ * for Event Queues EQ32 through EQ63.
|
|
+ */
|
|
+struct BE_CEV_ISR1_CSR_AMAP {
|
|
+ u8 interrupt32; /* DWORD 0 */
|
|
+ u8 interrupt33; /* DWORD 0 */
|
|
+ u8 interrupt34; /* DWORD 0 */
|
|
+ u8 interrupt35; /* DWORD 0 */
|
|
+ u8 interrupt36; /* DWORD 0 */
|
|
+ u8 interrupt37; /* DWORD 0 */
|
|
+ u8 interrupt38; /* DWORD 0 */
|
|
+ u8 interrupt39; /* DWORD 0 */
|
|
+ u8 interrupt40; /* DWORD 0 */
|
|
+ u8 interrupt41; /* DWORD 0 */
|
|
+ u8 interrupt42; /* DWORD 0 */
|
|
+ u8 interrupt43; /* DWORD 0 */
|
|
+ u8 interrupt44; /* DWORD 0 */
|
|
+ u8 interrupt45; /* DWORD 0 */
|
|
+ u8 interrupt46; /* DWORD 0 */
|
|
+ u8 interrupt47; /* DWORD 0 */
|
|
+ u8 interrupt48; /* DWORD 0 */
|
|
+ u8 interrupt49; /* DWORD 0 */
|
|
+ u8 interrupt50; /* DWORD 0 */
|
|
+ u8 interrupt51; /* DWORD 0 */
|
|
+ u8 interrupt52; /* DWORD 0 */
|
|
+ u8 interrupt53; /* DWORD 0 */
|
|
+ u8 interrupt54; /* DWORD 0 */
|
|
+ u8 interrupt55; /* DWORD 0 */
|
|
+ u8 interrupt56; /* DWORD 0 */
|
|
+ u8 interrupt57; /* DWORD 0 */
|
|
+ u8 interrupt58; /* DWORD 0 */
|
|
+ u8 interrupt59; /* DWORD 0 */
|
|
+ u8 interrupt60; /* DWORD 0 */
|
|
+ u8 interrupt61; /* DWORD 0 */
|
|
+ u8 interrupt62; /* DWORD 0 */
|
|
+ u8 interrupt63; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct CEV_ISR1_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+/*
|
|
+ * Host Interrupt Status Register 2. The third of four application
|
|
+ * interrupt status registers. This register contains the interrupts
|
|
+ * for Event Queues EQ64 through EQ95.
|
|
+ */
|
|
+struct BE_CEV_ISR2_CSR_AMAP {
|
|
+ u8 interrupt64; /* DWORD 0 */
|
|
+ u8 interrupt65; /* DWORD 0 */
|
|
+ u8 interrupt66; /* DWORD 0 */
|
|
+ u8 interrupt67; /* DWORD 0 */
|
|
+ u8 interrupt68; /* DWORD 0 */
|
|
+ u8 interrupt69; /* DWORD 0 */
|
|
+ u8 interrupt70; /* DWORD 0 */
|
|
+ u8 interrupt71; /* DWORD 0 */
|
|
+ u8 interrupt72; /* DWORD 0 */
|
|
+ u8 interrupt73; /* DWORD 0 */
|
|
+ u8 interrupt74; /* DWORD 0 */
|
|
+ u8 interrupt75; /* DWORD 0 */
|
|
+ u8 interrupt76; /* DWORD 0 */
|
|
+ u8 interrupt77; /* DWORD 0 */
|
|
+ u8 interrupt78; /* DWORD 0 */
|
|
+ u8 interrupt79; /* DWORD 0 */
|
|
+ u8 interrupt80; /* DWORD 0 */
|
|
+ u8 interrupt81; /* DWORD 0 */
|
|
+ u8 interrupt82; /* DWORD 0 */
|
|
+ u8 interrupt83; /* DWORD 0 */
|
|
+ u8 interrupt84; /* DWORD 0 */
|
|
+ u8 interrupt85; /* DWORD 0 */
|
|
+ u8 interrupt86; /* DWORD 0 */
|
|
+ u8 interrupt87; /* DWORD 0 */
|
|
+ u8 interrupt88; /* DWORD 0 */
|
|
+ u8 interrupt89; /* DWORD 0 */
|
|
+ u8 interrupt90; /* DWORD 0 */
|
|
+ u8 interrupt91; /* DWORD 0 */
|
|
+ u8 interrupt92; /* DWORD 0 */
|
|
+ u8 interrupt93; /* DWORD 0 */
|
|
+ u8 interrupt94; /* DWORD 0 */
|
|
+ u8 interrupt95; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct CEV_ISR2_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Host Interrupt Status Register 3. The fourth of four application
|
|
+ * interrupt status registers. This register contains the interrupts
|
|
+ * for Event Queues EQ96 through EQ127.
|
|
+ */
|
|
+struct BE_CEV_ISR3_CSR_AMAP {
|
|
+ u8 interrupt96; /* DWORD 0 */
|
|
+ u8 interrupt97; /* DWORD 0 */
|
|
+ u8 interrupt98; /* DWORD 0 */
|
|
+ u8 interrupt99; /* DWORD 0 */
|
|
+ u8 interrupt100; /* DWORD 0 */
|
|
+ u8 interrupt101; /* DWORD 0 */
|
|
+ u8 interrupt102; /* DWORD 0 */
|
|
+ u8 interrupt103; /* DWORD 0 */
|
|
+ u8 interrupt104; /* DWORD 0 */
|
|
+ u8 interrupt105; /* DWORD 0 */
|
|
+ u8 interrupt106; /* DWORD 0 */
|
|
+ u8 interrupt107; /* DWORD 0 */
|
|
+ u8 interrupt108; /* DWORD 0 */
|
|
+ u8 interrupt109; /* DWORD 0 */
|
|
+ u8 interrupt110; /* DWORD 0 */
|
|
+ u8 interrupt111; /* DWORD 0 */
|
|
+ u8 interrupt112; /* DWORD 0 */
|
|
+ u8 interrupt113; /* DWORD 0 */
|
|
+ u8 interrupt114; /* DWORD 0 */
|
|
+ u8 interrupt115; /* DWORD 0 */
|
|
+ u8 interrupt116; /* DWORD 0 */
|
|
+ u8 interrupt117; /* DWORD 0 */
|
|
+ u8 interrupt118; /* DWORD 0 */
|
|
+ u8 interrupt119; /* DWORD 0 */
|
|
+ u8 interrupt120; /* DWORD 0 */
|
|
+ u8 interrupt121; /* DWORD 0 */
|
|
+ u8 interrupt122; /* DWORD 0 */
|
|
+ u8 interrupt123; /* DWORD 0 */
|
|
+ u8 interrupt124; /* DWORD 0 */
|
|
+ u8 interrupt125; /* DWORD 0 */
|
|
+ u8 interrupt126; /* DWORD 0 */
|
|
+ u8 interrupt127; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct CEV_ISR3_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Completions and Events block Registers. */
|
|
+struct BE_CEV_CSRMAP_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[32]; /* DWORD 1 */
|
|
+ u8 rsvd2[32]; /* DWORD 2 */
|
|
+ u8 rsvd3[32]; /* DWORD 3 */
|
|
+ struct BE_CEV_ISR0_CSR_AMAP isr0;
|
|
+ struct BE_CEV_ISR1_CSR_AMAP isr1;
|
|
+ struct BE_CEV_ISR2_CSR_AMAP isr2;
|
|
+ struct BE_CEV_ISR3_CSR_AMAP isr3;
|
|
+ u8 rsvd4[32]; /* DWORD 8 */
|
|
+ u8 rsvd5[32]; /* DWORD 9 */
|
|
+ u8 rsvd6[32]; /* DWORD 10 */
|
|
+ u8 rsvd7[32]; /* DWORD 11 */
|
|
+ u8 rsvd8[32]; /* DWORD 12 */
|
|
+ u8 rsvd9[32]; /* DWORD 13 */
|
|
+ u8 rsvd10[32]; /* DWORD 14 */
|
|
+ u8 rsvd11[32]; /* DWORD 15 */
|
|
+ u8 rsvd12[32]; /* DWORD 16 */
|
|
+ u8 rsvd13[32]; /* DWORD 17 */
|
|
+ u8 rsvd14[32]; /* DWORD 18 */
|
|
+ u8 rsvd15[32]; /* DWORD 19 */
|
|
+ u8 rsvd16[32]; /* DWORD 20 */
|
|
+ u8 rsvd17[32]; /* DWORD 21 */
|
|
+ u8 rsvd18[32]; /* DWORD 22 */
|
|
+ u8 rsvd19[32]; /* DWORD 23 */
|
|
+ u8 rsvd20[32]; /* DWORD 24 */
|
|
+ u8 rsvd21[32]; /* DWORD 25 */
|
|
+ u8 rsvd22[32]; /* DWORD 26 */
|
|
+ u8 rsvd23[32]; /* DWORD 27 */
|
|
+ u8 rsvd24[32]; /* DWORD 28 */
|
|
+ u8 rsvd25[32]; /* DWORD 29 */
|
|
+ u8 rsvd26[32]; /* DWORD 30 */
|
|
+ u8 rsvd27[32]; /* DWORD 31 */
|
|
+ u8 rsvd28[32]; /* DWORD 32 */
|
|
+ u8 rsvd29[32]; /* DWORD 33 */
|
|
+ u8 rsvd30[192]; /* DWORD 34 */
|
|
+ u8 rsvd31[192]; /* DWORD 40 */
|
|
+ u8 rsvd32[160]; /* DWORD 46 */
|
|
+ u8 rsvd33[160]; /* DWORD 51 */
|
|
+ u8 rsvd34[160]; /* DWORD 56 */
|
|
+ u8 rsvd35[96]; /* DWORD 61 */
|
|
+ u8 rsvd36[192][32]; /* DWORD 64 */
|
|
+} __packed;
|
|
+struct CEV_CSRMAP_AMAP {
|
|
+ u32 dw[256];
|
|
+};
|
|
+
|
|
+#endif /* __cev_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/cq.c linux-2.6.29-rc3.owrt/drivers/staging/benet/cq.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/cq.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/cq.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,211 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#include "hwlib.h"
|
|
+#include "bestatus.h"
|
|
+
|
|
+/*
|
|
+ * Completion Queue Objects
|
|
+ */
|
|
+/*
|
|
+ *============================================================================
|
|
+ * P U B L I C R O U T I N E S
|
|
+ *============================================================================
|
|
+ */
|
|
+
|
|
+/*
|
|
+ This routine creates a completion queue based on the client completion
|
|
+ queue configuration information.
|
|
+
|
|
+
|
|
+ FunctionObject - Handle to a function object
|
|
+ CqBaseVa - Base VA for a the CQ ring
|
|
+ NumEntries - CEV_CQ_CNT_* values
|
|
+ solEventEnable - 0 = All CQEs can generate Events if CQ is eventable
|
|
+ 1 = only CQEs with solicited bit set are eventable
|
|
+ eventable - Eventable CQ, generates interrupts.
|
|
+ nodelay - 1 = Force interrupt, relevent if CQ eventable.
|
|
+ Interrupt is asserted immediately after EQE
|
|
+ write is confirmed, regardless of EQ Timer
|
|
+ or watermark settings.
|
|
+ wme - Enable watermark based coalescing
|
|
+ wmThresh - High watermark(CQ fullness at which event
|
|
+ or interrupt should be asserted). These are the
|
|
+ CEV_WATERMARK encoded values.
|
|
+ EqObject - EQ Handle to assign to this CQ
|
|
+ ppCqObject - Internal CQ Handle returned.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful error code is
|
|
+ returned.
|
|
+
|
|
+ IRQL < DISPATCH_LEVEL
|
|
+
|
|
+*/
|
|
+int be_cq_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, u32 length, bool solicited_eventable,
|
|
+ bool no_delay, u32 wm_thresh,
|
|
+ struct be_eq_object *eq_object, struct be_cq_object *cq_object)
|
|
+{
|
|
+ int status = BE_SUCCESS;
|
|
+ u32 num_entries_encoding;
|
|
+ u32 num_entries = length / sizeof(struct MCC_CQ_ENTRY_AMAP);
|
|
+ struct FWCMD_COMMON_CQ_CREATE *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ u32 n;
|
|
+ unsigned long irql;
|
|
+
|
|
+ ASSERT(rd);
|
|
+ ASSERT(cq_object);
|
|
+ ASSERT(length % sizeof(struct MCC_CQ_ENTRY_AMAP) == 0);
|
|
+
|
|
+ switch (num_entries) {
|
|
+ case 256:
|
|
+ num_entries_encoding = CEV_CQ_CNT_256;
|
|
+ break;
|
|
+ case 512:
|
|
+ num_entries_encoding = CEV_CQ_CNT_512;
|
|
+ break;
|
|
+ case 1024:
|
|
+ num_entries_encoding = CEV_CQ_CNT_1024;
|
|
+ break;
|
|
+ default:
|
|
+ ASSERT(0);
|
|
+ return BE_STATUS_INVALID_PARAMETER;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * All cq entries all the same size. Use iSCSI version
|
|
+ * as a test for the proper rd length.
|
|
+ */
|
|
+ memset(cq_object, 0, sizeof(*cq_object));
|
|
+
|
|
+ atomic_set(&cq_object->ref_count, 0);
|
|
+ cq_object->parent_function = pfob;
|
|
+ cq_object->eq_object = eq_object;
|
|
+ cq_object->num_entries = num_entries;
|
|
+ /* save for MCC cq processing */
|
|
+ cq_object->va = rd->va;
|
|
+
|
|
+ /* map into UT. */
|
|
+ length = num_entries * sizeof(struct MCC_CQ_ENTRY_AMAP);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ ASSERT(wrb);
|
|
+ TRACE(DL_ERR, "No free MCC WRBs in create EQ.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_CQ_CREATE);
|
|
+
|
|
+ fwcmd->params.request.num_pages = PAGES_SPANNED(OFFSET_IN_PAGE(rd->va),
|
|
+ length);
|
|
+
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, valid, &fwcmd->params.request.context, 1);
|
|
+ n = pfob->pci_function_number;
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, Func, &fwcmd->params.request.context, n);
|
|
+
|
|
+ n = (eq_object != NULL);
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, Eventable,
|
|
+ &fwcmd->params.request.context, n);
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, Armed, &fwcmd->params.request.context, 1);
|
|
+
|
|
+ n = eq_object ? eq_object->eq_id : 0;
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, EQID, &fwcmd->params.request.context, n);
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, Count,
|
|
+ &fwcmd->params.request.context, num_entries_encoding);
|
|
+
|
|
+ n = 0; /* Protection Domain is always 0 in Linux driver */
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, PD, &fwcmd->params.request.context, n);
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, NoDelay,
|
|
+ &fwcmd->params.request.context, no_delay);
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, SolEvent,
|
|
+ &fwcmd->params.request.context, solicited_eventable);
|
|
+
|
|
+ n = (wm_thresh != 0xFFFFFFFF);
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, WME, &fwcmd->params.request.context, n);
|
|
+
|
|
+ n = (n ? wm_thresh : 0);
|
|
+ AMAP_SET_BITS_PTR(CQ_CONTEXT, Watermark,
|
|
+ &fwcmd->params.request.context, n);
|
|
+ /* Create a page list for the FWCMD. */
|
|
+ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
|
|
+ ARRAY_SIZE(fwcmd->params.request.pages));
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "MCC to create CQ failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Remember the CQ id. */
|
|
+ cq_object->cq_id = fwcmd->params.response.cq_id;
|
|
+
|
|
+ /* insert this cq into eq_object reference */
|
|
+ if (eq_object) {
|
|
+ atomic_inc(&eq_object->ref_count);
|
|
+ list_add_tail(&cq_object->cqlist_for_eq,
|
|
+ &eq_object->cq_list_head);
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+
|
|
+ Deferences the given object. Once the object's reference count drops to
|
|
+ zero, the object is destroyed and all resources that are held by this object
|
|
+ are released. The on-chip context is also destroyed along with the queue
|
|
+ ID, and any mappings made into the UT.
|
|
+
|
|
+ cq_object - CQ handle returned from cq_object_create.
|
|
+
|
|
+ returns the current reference count on the object
|
|
+
|
|
+ IRQL: IRQL < DISPATCH_LEVEL
|
|
+*/
|
|
+int be_cq_destroy(struct be_cq_object *cq_object)
|
|
+{
|
|
+ int status = 0;
|
|
+
|
|
+ /* Nothing should reference this CQ at this point. */
|
|
+ ASSERT(atomic_read(&cq_object->ref_count) == 0);
|
|
+
|
|
+ /* Send fwcmd to destroy the CQ. */
|
|
+ status = be_function_ring_destroy(cq_object->parent_function,
|
|
+ cq_object->cq_id, FWCMD_RING_TYPE_CQ,
|
|
+ NULL, NULL, NULL, NULL);
|
|
+ ASSERT(status == 0);
|
|
+
|
|
+ /* Remove reference if this is an eventable CQ. */
|
|
+ if (cq_object->eq_object) {
|
|
+ atomic_dec(&cq_object->eq_object->ref_count);
|
|
+ list_del(&cq_object->cqlist_for_eq);
|
|
+ }
|
|
+ return BE_SUCCESS;
|
|
+}
|
|
+
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/descriptors.h linux-2.6.29-rc3.owrt/drivers/staging/benet/descriptors.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/descriptors.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/descriptors.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,71 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __descriptors_amap_h__
|
|
+#define __descriptors_amap_h__
|
|
+
|
|
+/*
|
|
+ * --- IPC_NODE_ID_ENUM ---
|
|
+ * IPC processor id values
|
|
+ */
|
|
+#define TPOST_NODE_ID (0) /* TPOST ID */
|
|
+#define TPRE_NODE_ID (1) /* TPRE ID */
|
|
+#define TXULP0_NODE_ID (2) /* TXULP0 ID */
|
|
+#define TXULP1_NODE_ID (3) /* TXULP1 ID */
|
|
+#define TXULP2_NODE_ID (4) /* TXULP2 ID */
|
|
+#define RXULP0_NODE_ID (5) /* RXULP0 ID */
|
|
+#define RXULP1_NODE_ID (6) /* RXULP1 ID */
|
|
+#define RXULP2_NODE_ID (7) /* RXULP2 ID */
|
|
+#define MPU_NODE_ID (15) /* MPU ID */
|
|
+
|
|
+/*
|
|
+ * --- MAC_ID_ENUM ---
|
|
+ * Meaning of the mac_id field in rxpp_eth_d
|
|
+ */
|
|
+#define PORT0_HOST_MAC0 (0) /* PD 0, Port 0, host networking, MAC 0. */
|
|
+#define PORT0_HOST_MAC1 (1) /* PD 0, Port 0, host networking, MAC 1. */
|
|
+#define PORT0_STORAGE_MAC0 (2) /* PD 0, Port 0, host storage, MAC 0. */
|
|
+#define PORT0_STORAGE_MAC1 (3) /* PD 0, Port 0, host storage, MAC 1. */
|
|
+#define PORT1_HOST_MAC0 (4) /* PD 0, Port 1 host networking, MAC 0. */
|
|
+#define PORT1_HOST_MAC1 (5) /* PD 0, Port 1 host networking, MAC 1. */
|
|
+#define PORT1_STORAGE_MAC0 (6) /* PD 0, Port 1 host storage, MAC 0. */
|
|
+#define PORT1_STORAGE_MAC1 (7) /* PD 0, Port 1 host storage, MAC 1. */
|
|
+#define FIRST_VM_MAC (8) /* PD 1 MAC. Protection domains have IDs */
|
|
+ /* from 0x8-0x26, one per PD. */
|
|
+#define LAST_VM_MAC (38) /* PD 31 MAC. */
|
|
+#define MGMT_MAC (39) /* Management port MAC. */
|
|
+#define MARBLE_MAC0 (59) /* Used for flushing function 0 receive */
|
|
+ /*
|
|
+ * queues before re-using a torn-down
|
|
+ * receive ring. the DA =
|
|
+ * 00-00-00-00-00-00, and the MSB of the
|
|
+ * SA = 00
|
|
+ */
|
|
+#define MARBLE_MAC1 (60) /* Used for flushing function 1 receive */
|
|
+ /*
|
|
+ * queues before re-using a torn-down
|
|
+ * receive ring. the DA =
|
|
+ * 00-00-00-00-00-00, and the MSB of the
|
|
+ * SA != 00
|
|
+ */
|
|
+#define NULL_MAC (61) /* Promiscuous mode, indicates no match */
|
|
+#define MCAST_MAC (62) /* Multicast match. */
|
|
+#define BCAST_MATCH (63) /* Broadcast match. */
|
|
+
|
|
+#endif /* __descriptors_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/doorbells.h linux-2.6.29-rc3.owrt/drivers/staging/benet/doorbells.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/doorbells.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/doorbells.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,179 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __doorbells_amap_h__
|
|
+#define __doorbells_amap_h__
|
|
+
|
|
+/* The TX/RDMA send queue doorbell. */
|
|
+struct BE_SQ_DB_AMAP {
|
|
+ u8 cid[11]; /* DWORD 0 */
|
|
+ u8 rsvd0[5]; /* DWORD 0 */
|
|
+ u8 numPosted[14]; /* DWORD 0 */
|
|
+ u8 rsvd1[2]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct SQ_DB_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* The receive queue doorbell. */
|
|
+struct BE_RQ_DB_AMAP {
|
|
+ u8 rq[10]; /* DWORD 0 */
|
|
+ u8 rsvd0[13]; /* DWORD 0 */
|
|
+ u8 Invalidate; /* DWORD 0 */
|
|
+ u8 numPosted[8]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct RQ_DB_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * The CQ/EQ doorbell. Software MUST set reserved fields in this
|
|
+ * descriptor to zero, otherwise (CEV) hardware will not execute the
|
|
+ * doorbell (flagging a bad_db_qid error instead).
|
|
+ */
|
|
+struct BE_CQ_DB_AMAP {
|
|
+ u8 qid[10]; /* DWORD 0 */
|
|
+ u8 rsvd0[4]; /* DWORD 0 */
|
|
+ u8 rearm; /* DWORD 0 */
|
|
+ u8 event; /* DWORD 0 */
|
|
+ u8 num_popped[13]; /* DWORD 0 */
|
|
+ u8 rsvd1[3]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct CQ_DB_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+struct BE_TPM_RQ_DB_AMAP {
|
|
+ u8 qid[10]; /* DWORD 0 */
|
|
+ u8 rsvd0[6]; /* DWORD 0 */
|
|
+ u8 numPosted[11]; /* DWORD 0 */
|
|
+ u8 mss_cnt[5]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct TPM_RQ_DB_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Post WRB Queue Doorbell Register used by the host Storage stack
|
|
+ * to notify the controller of a posted Work Request Block
|
|
+ */
|
|
+struct BE_WRB_POST_DB_AMAP {
|
|
+ u8 wrb_cid[10]; /* DWORD 0 */
|
|
+ u8 rsvd0[6]; /* DWORD 0 */
|
|
+ u8 wrb_index[8]; /* DWORD 0 */
|
|
+ u8 numberPosted[8]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct WRB_POST_DB_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Update Default PDU Queue Doorbell Register used to communicate
|
|
+ * to the controller that the driver has stopped processing the queue
|
|
+ * and where in the queue it stopped, this is
|
|
+ * a CQ Entry Type. Used by storage driver.
|
|
+ */
|
|
+struct BE_DEFAULT_PDU_DB_AMAP {
|
|
+ u8 qid[10]; /* DWORD 0 */
|
|
+ u8 rsvd0[4]; /* DWORD 0 */
|
|
+ u8 rearm; /* DWORD 0 */
|
|
+ u8 event; /* DWORD 0 */
|
|
+ u8 cqproc[14]; /* DWORD 0 */
|
|
+ u8 rsvd1[2]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct DEFAULT_PDU_DB_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Management Command and Controller default fragment ring */
|
|
+struct BE_MCC_DB_AMAP {
|
|
+ u8 rid[11]; /* DWORD 0 */
|
|
+ u8 rsvd0[5]; /* DWORD 0 */
|
|
+ u8 numPosted[14]; /* DWORD 0 */
|
|
+ u8 rsvd1[2]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct MCC_DB_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Used for bootstrapping the Host interface. This register is
|
|
+ * used for driver communication with the MPU when no MCC Rings exist.
|
|
+ * The software must write this register twice to post any MCC
|
|
+ * command. First, it writes the register with hi=1 and the upper bits of
|
|
+ * the physical address for the MCC_MAILBOX structure. Software must poll
|
|
+ * the ready bit until this is acknowledged. Then, sotware writes the
|
|
+ * register with hi=0 with the lower bits in the address. It must
|
|
+ * poll the ready bit until the MCC command is complete. Upon completion,
|
|
+ * the MCC_MAILBOX will contain a valid completion queue entry.
|
|
+ */
|
|
+struct BE_MPU_MAILBOX_DB_AMAP {
|
|
+ u8 ready; /* DWORD 0 */
|
|
+ u8 hi; /* DWORD 0 */
|
|
+ u8 address[30]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct MPU_MAILBOX_DB_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * This is the protection domain doorbell register map. Note that
|
|
+ * while this map shows doorbells for all Blade Engine supported
|
|
+ * protocols, not all of these may be valid in a given function or
|
|
+ * protection domain. It is the responsibility of the application
|
|
+ * accessing the doorbells to know which are valid. Each doorbell
|
|
+ * occupies 32 bytes of space, but unless otherwise specified,
|
|
+ * only the first 4 bytes should be written. There are 32 instances
|
|
+ * of these doorbells for the host and 31 virtual machines respectively.
|
|
+ * The host and VMs will only map the doorbell pages belonging to its
|
|
+ * protection domain. It will not be able to touch the doorbells for
|
|
+ * another VM. The doorbells are the only registers directly accessible
|
|
+ * by a virtual machine. Similarly, there are 511 additional
|
|
+ * doorbells for RDMA protection domains. PD 0 for RDMA shares
|
|
+ * the same physical protection domain doorbell page as ETH/iSCSI.
|
|
+ *
|
|
+ */
|
|
+struct BE_PROTECTION_DOMAIN_DBMAP_AMAP {
|
|
+ u8 rsvd0[512]; /* DWORD 0 */
|
|
+ struct BE_SQ_DB_AMAP rdma_sq_db;
|
|
+ u8 rsvd1[7][32]; /* DWORD 17 */
|
|
+ struct BE_WRB_POST_DB_AMAP iscsi_wrb_post_db;
|
|
+ u8 rsvd2[7][32]; /* DWORD 25 */
|
|
+ struct BE_SQ_DB_AMAP etx_sq_db;
|
|
+ u8 rsvd3[7][32]; /* DWORD 33 */
|
|
+ struct BE_RQ_DB_AMAP rdma_rq_db;
|
|
+ u8 rsvd4[7][32]; /* DWORD 41 */
|
|
+ struct BE_DEFAULT_PDU_DB_AMAP iscsi_default_pdu_db;
|
|
+ u8 rsvd5[7][32]; /* DWORD 49 */
|
|
+ struct BE_TPM_RQ_DB_AMAP tpm_rq_db;
|
|
+ u8 rsvd6[7][32]; /* DWORD 57 */
|
|
+ struct BE_RQ_DB_AMAP erx_rq_db;
|
|
+ u8 rsvd7[7][32]; /* DWORD 65 */
|
|
+ struct BE_CQ_DB_AMAP cq_db;
|
|
+ u8 rsvd8[7][32]; /* DWORD 73 */
|
|
+ struct BE_MCC_DB_AMAP mpu_mcc_db;
|
|
+ u8 rsvd9[7][32]; /* DWORD 81 */
|
|
+ struct BE_MPU_MAILBOX_DB_AMAP mcc_bootstrap_db;
|
|
+ u8 rsvd10[935][32]; /* DWORD 89 */
|
|
+} __packed;
|
|
+struct PROTECTION_DOMAIN_DBMAP_AMAP {
|
|
+ u32 dw[1024];
|
|
+};
|
|
+
|
|
+#endif /* __doorbells_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/ep.h linux-2.6.29-rc3.owrt/drivers/staging/benet/ep.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/ep.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/ep.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,66 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __ep_amap_h__
|
|
+#define __ep_amap_h__
|
|
+
|
|
+/* General Control and Status Register. */
|
|
+struct BE_EP_CONTROL_CSR_AMAP {
|
|
+ u8 m0_RxPbuf; /* DWORD 0 */
|
|
+ u8 m1_RxPbuf; /* DWORD 0 */
|
|
+ u8 m2_RxPbuf; /* DWORD 0 */
|
|
+ u8 ff_en; /* DWORD 0 */
|
|
+ u8 rsvd0[27]; /* DWORD 0 */
|
|
+ u8 CPU_reset; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct EP_CONTROL_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Semaphore Register. */
|
|
+struct BE_EP_SEMAPHORE_CSR_AMAP {
|
|
+ u8 value[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct EP_SEMAPHORE_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Embedded Processor Specific Registers. */
|
|
+struct BE_EP_CSRMAP_AMAP {
|
|
+ struct BE_EP_CONTROL_CSR_AMAP ep_control;
|
|
+ u8 rsvd0[32]; /* DWORD 1 */
|
|
+ u8 rsvd1[32]; /* DWORD 2 */
|
|
+ u8 rsvd2[32]; /* DWORD 3 */
|
|
+ u8 rsvd3[32]; /* DWORD 4 */
|
|
+ u8 rsvd4[32]; /* DWORD 5 */
|
|
+ u8 rsvd5[8][128]; /* DWORD 6 */
|
|
+ u8 rsvd6[32]; /* DWORD 38 */
|
|
+ u8 rsvd7[32]; /* DWORD 39 */
|
|
+ u8 rsvd8[32]; /* DWORD 40 */
|
|
+ u8 rsvd9[32]; /* DWORD 41 */
|
|
+ u8 rsvd10[32]; /* DWORD 42 */
|
|
+ struct BE_EP_SEMAPHORE_CSR_AMAP ep_semaphore;
|
|
+ u8 rsvd11[32]; /* DWORD 44 */
|
|
+ u8 rsvd12[19][32]; /* DWORD 45 */
|
|
+} __packed;
|
|
+struct EP_CSRMAP_AMAP {
|
|
+ u32 dw[64];
|
|
+};
|
|
+
|
|
+#endif /* __ep_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/eq.c linux-2.6.29-rc3.owrt/drivers/staging/benet/eq.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/eq.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/eq.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,299 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#include "hwlib.h"
|
|
+#include "bestatus.h"
|
|
+/*
|
|
+ This routine creates an event queue based on the client completion
|
|
+ queue configuration information.
|
|
+
|
|
+ FunctionObject - Handle to a function object
|
|
+ EqBaseVa - Base VA for a the EQ ring
|
|
+ SizeEncoding - The encoded size for the EQ entries. This value is
|
|
+ either CEV_EQ_SIZE_4 or CEV_EQ_SIZE_16
|
|
+ NumEntries - CEV_CQ_CNT_* values.
|
|
+ Watermark - Enables watermark based coalescing. This parameter
|
|
+ must be of the type CEV_WMARK_* if watermarks
|
|
+ are enabled. If watermarks to to be disabled
|
|
+ this value should be-1.
|
|
+ TimerDelay - If a timer delay is enabled this value should be the
|
|
+ time of the delay in 8 microsecond units. If
|
|
+ delays are not used this parameter should be
|
|
+ set to -1.
|
|
+ ppEqObject - Internal EQ Handle returned.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull,, otherwise a useful error code
|
|
+ is returned.
|
|
+
|
|
+ IRQL < DISPATCH_LEVEL
|
|
+*/
|
|
+int
|
|
+be_eq_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, u32 eqe_size, u32 num_entries,
|
|
+ u32 watermark, /* CEV_WMARK_* or -1 */
|
|
+ u32 timer_delay, /* in 8us units, or -1 */
|
|
+ struct be_eq_object *eq_object)
|
|
+{
|
|
+ int status = BE_SUCCESS;
|
|
+ u32 num_entries_encoding, eqe_size_encoding, length;
|
|
+ struct FWCMD_COMMON_EQ_CREATE *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ u32 n;
|
|
+ unsigned long irql;
|
|
+
|
|
+ ASSERT(rd);
|
|
+ ASSERT(eq_object);
|
|
+
|
|
+ switch (num_entries) {
|
|
+ case 256:
|
|
+ num_entries_encoding = CEV_EQ_CNT_256;
|
|
+ break;
|
|
+ case 512:
|
|
+ num_entries_encoding = CEV_EQ_CNT_512;
|
|
+ break;
|
|
+ case 1024:
|
|
+ num_entries_encoding = CEV_EQ_CNT_1024;
|
|
+ break;
|
|
+ case 2048:
|
|
+ num_entries_encoding = CEV_EQ_CNT_2048;
|
|
+ break;
|
|
+ case 4096:
|
|
+ num_entries_encoding = CEV_EQ_CNT_4096;
|
|
+ break;
|
|
+ default:
|
|
+ ASSERT(0);
|
|
+ return BE_STATUS_INVALID_PARAMETER;
|
|
+ }
|
|
+
|
|
+ switch (eqe_size) {
|
|
+ case 4:
|
|
+ eqe_size_encoding = CEV_EQ_SIZE_4;
|
|
+ break;
|
|
+ case 16:
|
|
+ eqe_size_encoding = CEV_EQ_SIZE_16;
|
|
+ break;
|
|
+ default:
|
|
+ ASSERT(0);
|
|
+ return BE_STATUS_INVALID_PARAMETER;
|
|
+ }
|
|
+
|
|
+ if ((eqe_size == 4 && num_entries < 1024) ||
|
|
+ (eqe_size == 16 && num_entries == 4096)) {
|
|
+ TRACE(DL_ERR, "Bad EQ size. eqe_size:%d num_entries:%d",
|
|
+ eqe_size, num_entries);
|
|
+ ASSERT(0);
|
|
+ return BE_STATUS_INVALID_PARAMETER;
|
|
+ }
|
|
+
|
|
+ memset(eq_object, 0, sizeof(*eq_object));
|
|
+
|
|
+ atomic_set(&eq_object->ref_count, 0);
|
|
+ eq_object->parent_function = pfob;
|
|
+ eq_object->eq_id = 0xFFFFFFFF;
|
|
+
|
|
+ INIT_LIST_HEAD(&eq_object->cq_list_head);
|
|
+
|
|
+ length = num_entries * eqe_size;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ ASSERT(wrb);
|
|
+ TRACE(DL_ERR, "No free MCC WRBs in create EQ.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_EQ_CREATE);
|
|
+
|
|
+ fwcmd->params.request.num_pages = PAGES_SPANNED(OFFSET_IN_PAGE(rd->va),
|
|
+ length);
|
|
+ n = pfob->pci_function_number;
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, Func, &fwcmd->params.request.context, n);
|
|
+
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, valid, &fwcmd->params.request.context, 1);
|
|
+
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, Size,
|
|
+ &fwcmd->params.request.context, eqe_size_encoding);
|
|
+
|
|
+ n = 0; /* Protection Domain is always 0 in Linux driver */
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, PD, &fwcmd->params.request.context, n);
|
|
+
|
|
+ /* Let the caller ARM the EQ with the doorbell. */
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, Armed, &fwcmd->params.request.context, 0);
|
|
+
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, Count, &fwcmd->params.request.context,
|
|
+ num_entries_encoding);
|
|
+
|
|
+ n = pfob->pci_function_number * 32;
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, EventVect,
|
|
+ &fwcmd->params.request.context, n);
|
|
+ if (watermark != -1) {
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, WME,
|
|
+ &fwcmd->params.request.context, 1);
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, Watermark,
|
|
+ &fwcmd->params.request.context, watermark);
|
|
+ ASSERT(watermark <= CEV_WMARK_240);
|
|
+ } else
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, WME,
|
|
+ &fwcmd->params.request.context, 0);
|
|
+ if (timer_delay != -1) {
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, TMR,
|
|
+ &fwcmd->params.request.context, 1);
|
|
+
|
|
+ ASSERT(timer_delay <= 250); /* max value according to EAS */
|
|
+ timer_delay = min(timer_delay, (u32)250);
|
|
+
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, Delay,
|
|
+ &fwcmd->params.request.context, timer_delay);
|
|
+ } else {
|
|
+ AMAP_SET_BITS_PTR(EQ_CONTEXT, TMR,
|
|
+ &fwcmd->params.request.context, 0);
|
|
+ }
|
|
+ /* Create a page list for the FWCMD. */
|
|
+ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
|
|
+ ARRAY_SIZE(fwcmd->params.request.pages));
|
|
+
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "MCC to create EQ failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Get the EQ id. The MPU allocates the IDs. */
|
|
+ eq_object->eq_id = fwcmd->params.response.eq_id;
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ Deferences the given object. Once the object's reference count drops to
|
|
+ zero, the object is destroyed and all resources that are held by this
|
|
+ object are released. The on-chip context is also destroyed along with
|
|
+ the queue ID, and any mappings made into the UT.
|
|
+
|
|
+ eq_object - EQ handle returned from eq_object_create.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful error code
|
|
+ is returned.
|
|
+
|
|
+ IRQL: IRQL < DISPATCH_LEVEL
|
|
+*/
|
|
+int be_eq_destroy(struct be_eq_object *eq_object)
|
|
+{
|
|
+ int status = 0;
|
|
+
|
|
+ ASSERT(atomic_read(&eq_object->ref_count) == 0);
|
|
+ /* no CQs should reference this EQ now */
|
|
+ ASSERT(list_empty(&eq_object->cq_list_head));
|
|
+
|
|
+ /* Send fwcmd to destroy the EQ. */
|
|
+ status = be_function_ring_destroy(eq_object->parent_function,
|
|
+ eq_object->eq_id, FWCMD_RING_TYPE_EQ,
|
|
+ NULL, NULL, NULL, NULL);
|
|
+ ASSERT(status == 0);
|
|
+
|
|
+ return BE_SUCCESS;
|
|
+}
|
|
+/*
|
|
+ *---------------------------------------------------------------------------
|
|
+ * Function: be_eq_modify_delay
|
|
+ * Changes the EQ delay for a group of EQs.
|
|
+ * num_eq - The number of EQs in the eq_array to adjust.
|
|
+ * This also is the number of delay values in
|
|
+ * the eq_delay_array.
|
|
+ * eq_array - Array of struct be_eq_object pointers to adjust.
|
|
+ * eq_delay_array - Array of "num_eq" timer delays in units
|
|
+ * of microseconds. The be_eq_query_delay_range
|
|
+ * fwcmd returns the resolution and range of
|
|
+ * legal EQ delays.
|
|
+ * cb -
|
|
+ * cb_context -
|
|
+ * q_ctxt - Optional. Pointer to a previously allocated
|
|
+ * struct. If the MCC WRB ring is full, this
|
|
+ * structure is used to queue the operation. It
|
|
+ * will be posted to the MCC ring when space
|
|
+ * becomes available. All queued commands will
|
|
+ * be posted to the ring in the order they are
|
|
+ * received. It is always valid to pass a pointer to
|
|
+ * a generic be_generic_q_cntxt. However,
|
|
+ * the specific context structs
|
|
+ * are generally smaller than the generic struct.
|
|
+ * return pend_status - BE_SUCCESS (0) on success.
|
|
+ * BE_PENDING (postive value) if the FWCMD
|
|
+ * completion is pending. Negative error code on failure.
|
|
+ *-------------------------------------------------------------------------
|
|
+ */
|
|
+int
|
|
+be_eq_modify_delay(struct be_function_object *pfob,
|
|
+ u32 num_eq, struct be_eq_object **eq_array,
|
|
+ u32 *eq_delay_array, mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context, struct be_eq_modify_delay_q_ctxt *q_ctxt)
|
|
+{
|
|
+ struct FWCMD_COMMON_MODIFY_EQ_DELAY *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ struct be_generic_q_ctxt *gen_ctxt = NULL;
|
|
+ u32 i;
|
|
+ unsigned long irql;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ if (q_ctxt && cb) {
|
|
+ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
|
|
+ gen_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
|
|
+ gen_ctxt->context.bytes = sizeof(*q_ctxt);
|
|
+ } else {
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_MODIFY_EQ_DELAY);
|
|
+
|
|
+ ASSERT(num_eq > 0);
|
|
+ ASSERT(num_eq <= ARRAY_SIZE(fwcmd->params.request.delay));
|
|
+ fwcmd->params.request.num_eq = num_eq;
|
|
+ for (i = 0; i < num_eq; i++) {
|
|
+ fwcmd->params.request.delay[i].eq_id = eq_array[i]->eq_id;
|
|
+ fwcmd->params.request.delay[i].delay_in_microseconds =
|
|
+ eq_delay_array[i];
|
|
+ }
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, gen_ctxt,
|
|
+ cb, cb_context, NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/eth.c linux-2.6.29-rc3.owrt/drivers/staging/benet/eth.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/eth.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/eth.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,1273 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#include <linux/if_ether.h>
|
|
+#include "hwlib.h"
|
|
+#include "bestatus.h"
|
|
+
|
|
+/*
|
|
+ *---------------------------------------------------------
|
|
+ * Function: be_eth_sq_create_ex
|
|
+ * Creates an ethernet send ring - extended version with
|
|
+ * additional parameters.
|
|
+ * pfob -
|
|
+ * rd - ring address
|
|
+ * length_in_bytes -
|
|
+ * type - The type of ring to create.
|
|
+ * ulp - The requested ULP number for the ring.
|
|
+ * This should be zero based, i.e. 0,1,2. This must
|
|
+ * be valid NIC ULP based on the firmware config.
|
|
+ * All doorbells for this ring must be sent to
|
|
+ * this ULP. The first network ring allocated for
|
|
+ * each ULP are higher performance than subsequent rings.
|
|
+ * cq_object - cq object for completions
|
|
+ * ex_parameters - Additional parameters (that may increase in
|
|
+ * future revisions). These parameters are only used
|
|
+ * for certain ring types -- see
|
|
+ * struct be_eth_sq_parameters for details.
|
|
+ * eth_sq -
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *---------------------------------------------------------
|
|
+ */
|
|
+int
|
|
+be_eth_sq_create_ex(struct be_function_object *pfob, struct ring_desc *rd,
|
|
+ u32 length, u32 type, u32 ulp, struct be_cq_object *cq_object,
|
|
+ struct be_eth_sq_parameters *ex_parameters,
|
|
+ struct be_ethsq_object *eth_sq)
|
|
+{
|
|
+ struct FWCMD_COMMON_ETH_TX_CREATE *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ u32 n;
|
|
+ unsigned long irql;
|
|
+
|
|
+ ASSERT(rd);
|
|
+ ASSERT(eth_sq);
|
|
+ ASSERT(ex_parameters);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ memset(eth_sq, 0, sizeof(*eth_sq));
|
|
+
|
|
+ eth_sq->parent_function = pfob;
|
|
+ eth_sq->bid = 0xFFFFFFFF;
|
|
+ eth_sq->cq_object = cq_object;
|
|
+
|
|
+ /* Translate hwlib interface to arm interface. */
|
|
+ switch (type) {
|
|
+ case BE_ETH_TX_RING_TYPE_FORWARDING:
|
|
+ type = ETH_TX_RING_TYPE_FORWARDING;
|
|
+ break;
|
|
+ case BE_ETH_TX_RING_TYPE_STANDARD:
|
|
+ type = ETH_TX_RING_TYPE_STANDARD;
|
|
+ break;
|
|
+ case BE_ETH_TX_RING_TYPE_BOUND:
|
|
+ ASSERT(ex_parameters->port < 2);
|
|
+ type = ETH_TX_RING_TYPE_BOUND;
|
|
+ break;
|
|
+ default:
|
|
+ TRACE(DL_ERR, "Invalid eth tx ring type:%d", type);
|
|
+ return BE_NOT_OK;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ ASSERT(wrb);
|
|
+ TRACE(DL_ERR, "No free MCC WRBs in create EQ.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ /* NIC must be supported by the current config. */
|
|
+ ASSERT(pfob->fw_config.nic_ulp_mask);
|
|
+
|
|
+ /*
|
|
+ * The ulp parameter must select a valid NIC ULP
|
|
+ * for the current config.
|
|
+ */
|
|
+ ASSERT((1 << ulp) & pfob->fw_config.nic_ulp_mask);
|
|
+
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_ETH_TX_CREATE);
|
|
+ fwcmd->header.request.port_number = ex_parameters->port;
|
|
+
|
|
+ AMAP_SET_BITS_PTR(ETX_CONTEXT, pd_id,
|
|
+ &fwcmd->params.request.context, 0);
|
|
+
|
|
+ n = be_ring_length_to_encoding(length, sizeof(struct ETH_WRB_AMAP));
|
|
+ AMAP_SET_BITS_PTR(ETX_CONTEXT, tx_ring_size,
|
|
+ &fwcmd->params.request.context, n);
|
|
+
|
|
+ AMAP_SET_BITS_PTR(ETX_CONTEXT, cq_id_send,
|
|
+ &fwcmd->params.request.context, cq_object->cq_id);
|
|
+
|
|
+ n = pfob->pci_function_number;
|
|
+ AMAP_SET_BITS_PTR(ETX_CONTEXT, func, &fwcmd->params.request.context, n);
|
|
+
|
|
+ fwcmd->params.request.type = type;
|
|
+ fwcmd->params.request.ulp_num = (1 << ulp);
|
|
+ fwcmd->params.request.num_pages = DIV_ROUND_UP(length, PAGE_SIZE);
|
|
+ ASSERT(PAGES_SPANNED(rd->va, rd->length) >=
|
|
+ fwcmd->params.request.num_pages);
|
|
+
|
|
+ /* Create a page list for the FWCMD. */
|
|
+ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
|
|
+ ARRAY_SIZE(fwcmd->params.request.pages));
|
|
+
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "MCC to create etx queue failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+ /* save the butler ID */
|
|
+ eth_sq->bid = fwcmd->params.response.cid;
|
|
+
|
|
+ /* add a reference to the corresponding CQ */
|
|
+ atomic_inc(&cq_object->ref_count);
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ This routine destroys an ethernet send queue
|
|
+
|
|
+ EthSq - EthSq Handle returned from EthSqCreate
|
|
+
|
|
+ This function always return BE_SUCCESS.
|
|
+
|
|
+ This function frees memory allocated by EthSqCreate for the EthSq Object.
|
|
+
|
|
+*/
|
|
+int be_eth_sq_destroy(struct be_ethsq_object *eth_sq)
|
|
+{
|
|
+ int status = 0;
|
|
+
|
|
+ /* Send fwcmd to destroy the queue. */
|
|
+ status = be_function_ring_destroy(eth_sq->parent_function, eth_sq->bid,
|
|
+ FWCMD_RING_TYPE_ETH_TX, NULL, NULL, NULL, NULL);
|
|
+ ASSERT(status == 0);
|
|
+
|
|
+ /* Derefence any associated CQs. */
|
|
+ atomic_dec(ð_sq->cq_object->ref_count);
|
|
+ return status;
|
|
+}
|
|
+/*
|
|
+ This routine attempts to set the transmit flow control parameters.
|
|
+
|
|
+ FunctionObject - Handle to a function object
|
|
+
|
|
+ txfc_enable - transmit flow control enable - true for
|
|
+ enable, false for disable
|
|
+
|
|
+ rxfc_enable - receive flow control enable - true for
|
|
+ enable, false for disable
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful int error
|
|
+ code is returned.
|
|
+
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+
|
|
+ This function always fails in non-privileged machine context.
|
|
+*/
|
|
+int
|
|
+be_eth_set_flow_control(struct be_function_object *pfob,
|
|
+ bool txfc_enable, bool rxfc_enable)
|
|
+{
|
|
+ struct FWCMD_COMMON_SET_FLOW_CONTROL *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_FLOW_CONTROL);
|
|
+
|
|
+ fwcmd->params.request.rx_flow_control = rxfc_enable;
|
|
+ fwcmd->params.request.tx_flow_control = txfc_enable;
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+ if (status != 0) {
|
|
+ TRACE(DL_ERR, "set flow control fwcmd failed.");
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine attempts to get the transmit flow control parameters.
|
|
+
|
|
+ pfob - Handle to a function object
|
|
+
|
|
+ txfc_enable - transmit flow control enable - true for
|
|
+ enable, false for disable
|
|
+
|
|
+ rxfc_enable - receive flow control enable - true for enable,
|
|
+ false for disable
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful int error code
|
|
+ is returned.
|
|
+
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+
|
|
+ This function always fails in non-privileged machine context.
|
|
+*/
|
|
+int
|
|
+be_eth_get_flow_control(struct be_function_object *pfob,
|
|
+ bool *txfc_enable, bool *rxfc_enable)
|
|
+{
|
|
+ struct FWCMD_COMMON_GET_FLOW_CONTROL *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_FLOW_CONTROL);
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+ if (status != 0) {
|
|
+ TRACE(DL_ERR, "get flow control fwcmd failed.");
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ *txfc_enable = fwcmd->params.response.tx_flow_control;
|
|
+ *rxfc_enable = fwcmd->params.response.rx_flow_control;
|
|
+
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *---------------------------------------------------------
|
|
+ * Function: be_eth_set_qos
|
|
+ * This function sets the ethernet transmit Quality of Service (QoS)
|
|
+ * characteristics of BladeEngine for the domain. All ethernet
|
|
+ * transmit rings of the domain will evenly share the bandwidth.
|
|
+ * The exeception to sharing is the host primary (super) ethernet
|
|
+ * transmit ring as well as the host ethernet forwarding ring
|
|
+ * for missed offload data.
|
|
+ * pfob -
|
|
+ * max_bps - the maximum bits per second in units of
|
|
+ * 10 Mbps (valid 0-100)
|
|
+ * max_pps - the maximum packets per second in units
|
|
+ * of 1 Kpps (0 indicates no limit)
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *---------------------------------------------------------
|
|
+ */
|
|
+int
|
|
+be_eth_set_qos(struct be_function_object *pfob, u32 max_bps, u32 max_pps)
|
|
+{
|
|
+ struct FWCMD_COMMON_SET_QOS *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_QOS);
|
|
+
|
|
+ /* Set fields in fwcmd */
|
|
+ fwcmd->params.request.max_bits_per_second_NIC = max_bps;
|
|
+ fwcmd->params.request.max_packets_per_second_NIC = max_pps;
|
|
+ fwcmd->params.request.valid_flags = QOS_BITS_NIC | QOS_PKTS_NIC;
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+ if (status != 0)
|
|
+ TRACE(DL_ERR, "network set qos fwcmd failed.");
|
|
+
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *---------------------------------------------------------
|
|
+ * Function: be_eth_get_qos
|
|
+ * This function retrieves the ethernet transmit Quality of Service (QoS)
|
|
+ * characteristics for the domain.
|
|
+ * max_bps - the maximum bits per second in units of
|
|
+ * 10 Mbps (valid 0-100)
|
|
+ * max_pps - the maximum packets per second in units of
|
|
+ * 1 Kpps (0 indicates no limit)
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *---------------------------------------------------------
|
|
+ */
|
|
+int
|
|
+be_eth_get_qos(struct be_function_object *pfob, u32 *max_bps, u32 *max_pps)
|
|
+{
|
|
+ struct FWCMD_COMMON_GET_QOS *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_QOS);
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+ if (status != 0) {
|
|
+ TRACE(DL_ERR, "network get qos fwcmd failed.");
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ *max_bps = fwcmd->params.response.max_bits_per_second_NIC;
|
|
+ *max_pps = fwcmd->params.response.max_packets_per_second_NIC;
|
|
+
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *---------------------------------------------------------
|
|
+ * Function: be_eth_set_frame_size
|
|
+ * This function sets the ethernet maximum frame size. The previous
|
|
+ * values are returned.
|
|
+ * pfob -
|
|
+ * tx_frame_size - maximum transmit frame size in bytes
|
|
+ * rx_frame_size - maximum receive frame size in bytes
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *---------------------------------------------------------
|
|
+ */
|
|
+int
|
|
+be_eth_set_frame_size(struct be_function_object *pfob,
|
|
+ u32 *tx_frame_size, u32 *rx_frame_size)
|
|
+{
|
|
+ struct FWCMD_COMMON_SET_FRAME_SIZE *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_FRAME_SIZE);
|
|
+ fwcmd->params.request.max_tx_frame_size = *tx_frame_size;
|
|
+ fwcmd->params.request.max_rx_frame_size = *rx_frame_size;
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+ if (status != 0) {
|
|
+ TRACE(DL_ERR, "network set frame size fwcmd failed.");
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ *tx_frame_size = fwcmd->params.response.chip_max_tx_frame_size;
|
|
+ *rx_frame_size = fwcmd->params.response.chip_max_rx_frame_size;
|
|
+
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ This routine creates a Ethernet receive ring.
|
|
+
|
|
+ pfob - handle to a function object
|
|
+ rq_base_va - base VA for the default receive ring. this must be
|
|
+ exactly 8K in length and continguous physical memory.
|
|
+ cq_object - handle to a previously created CQ to be associated
|
|
+ with the RQ.
|
|
+ pp_eth_rq - pointer to an opqaue handle where an eth
|
|
+ receive object is returned.
|
|
+ Returns BE_SUCCESS if successfull, , otherwise a useful
|
|
+ int error code is returned.
|
|
+
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+ this function allocates a struct be_ethrq_object *object.
|
|
+ there must be no more than 1 of these per function object, unless the
|
|
+ function object supports RSS (is networking and on the host).
|
|
+ the rq_base_va must point to a buffer of exactly 8K.
|
|
+ the erx::host_cqid (or host_stor_cqid) register and erx::ring_page registers
|
|
+ will be updated as appropriate on return
|
|
+*/
|
|
+int
|
|
+be_eth_rq_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, struct be_cq_object *cq_object,
|
|
+ struct be_cq_object *bcmc_cq_object,
|
|
+ struct be_ethrq_object *eth_rq)
|
|
+{
|
|
+ int status = 0;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ struct FWCMD_COMMON_ETH_RX_CREATE *fwcmd = NULL;
|
|
+ unsigned long irql;
|
|
+
|
|
+ /* MPU will set the */
|
|
+ ASSERT(rd);
|
|
+ ASSERT(eth_rq);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ eth_rq->parent_function = pfob;
|
|
+ eth_rq->cq_object = cq_object;
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_ETH_RX_CREATE);
|
|
+
|
|
+ fwcmd->params.request.num_pages = 2; /* required length */
|
|
+ fwcmd->params.request.cq_id = cq_object->cq_id;
|
|
+
|
|
+ if (bcmc_cq_object)
|
|
+ fwcmd->params.request.bcmc_cq_id = bcmc_cq_object->cq_id;
|
|
+ else
|
|
+ fwcmd->params.request.bcmc_cq_id = 0xFFFF;
|
|
+
|
|
+ /* Create a page list for the FWCMD. */
|
|
+ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
|
|
+ ARRAY_SIZE(fwcmd->params.request.pages));
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "fwcmd to map eth rxq frags failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Save the ring ID for cleanup. */
|
|
+ eth_rq->rid = fwcmd->params.response.id;
|
|
+
|
|
+ atomic_inc(&cq_object->ref_count);
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine destroys an Ethernet receive queue
|
|
+
|
|
+ eth_rq - ethernet receive queue handle returned from eth_rq_create
|
|
+
|
|
+ Returns BE_SUCCESS on success and an appropriate int on failure.
|
|
+
|
|
+ This function frees resourcs allocated by EthRqCreate.
|
|
+ The erx::host_cqid (or host_stor_cqid) register and erx::ring_page
|
|
+ registers will be updated as appropriate on return
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+*/
|
|
+
|
|
+static void be_eth_rq_destroy_internal_cb(void *context, int status,
|
|
+ struct MCC_WRB_AMAP *wrb)
|
|
+{
|
|
+ struct be_ethrq_object *eth_rq = (struct be_ethrq_object *) context;
|
|
+
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "Destroy eth rq failed in internal callback.\n");
|
|
+ } else {
|
|
+ /* Dereference any CQs associated with this queue. */
|
|
+ atomic_dec(ð_rq->cq_object->ref_count);
|
|
+ }
|
|
+
|
|
+ return;
|
|
+}
|
|
+
|
|
+int be_eth_rq_destroy(struct be_ethrq_object *eth_rq)
|
|
+{
|
|
+ int status = BE_SUCCESS;
|
|
+
|
|
+ /* Send fwcmd to destroy the RQ. */
|
|
+ status = be_function_ring_destroy(eth_rq->parent_function,
|
|
+ eth_rq->rid, FWCMD_RING_TYPE_ETH_RX, NULL, NULL,
|
|
+ be_eth_rq_destroy_internal_cb, eth_rq);
|
|
+
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *---------------------------------------------------------------------------
|
|
+ * Function: be_eth_rq_destroy_options
|
|
+ * Destroys an ethernet receive ring with finer granularity options
|
|
+ * than the standard be_eth_rq_destroy() API function.
|
|
+ * eth_rq -
|
|
+ * flush - Set to 1 to flush the ring, set to 0 to bypass the flush
|
|
+ * cb - Callback function on completion
|
|
+ * cb_context - Callback context
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *----------------------------------------------------------------------------
|
|
+ */
|
|
+int
|
|
+be_eth_rq_destroy_options(struct be_ethrq_object *eth_rq, bool flush,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context)
|
|
+{
|
|
+ struct FWCMD_COMMON_RING_DESTROY *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = BE_SUCCESS;
|
|
+ struct be_function_object *pfob = NULL;
|
|
+ unsigned long irql;
|
|
+
|
|
+ pfob = eth_rq->parent_function;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ TRACE(DL_INFO, "Destroy eth_rq ring id:%d, flush:%d", eth_rq->rid,
|
|
+ flush);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ ASSERT(wrb);
|
|
+ TRACE(DL_ERR, "No free MCC WRBs in destroy eth_rq ring.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_RING_DESTROY);
|
|
+
|
|
+ fwcmd->params.request.id = eth_rq->rid;
|
|
+ fwcmd->params.request.ring_type = FWCMD_RING_TYPE_ETH_RX;
|
|
+ fwcmd->params.request.bypass_flush = ((0 == flush) ? 1 : 0);
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb, cb_context,
|
|
+ be_eth_rq_destroy_internal_cb, eth_rq, fwcmd, NULL);
|
|
+
|
|
+ if (status != BE_SUCCESS && status != BE_PENDING) {
|
|
+ TRACE(DL_ERR, "eth_rq ring destroy failed. id:%d, flush:%d",
|
|
+ eth_rq->rid, flush);
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine queries the frag size for erx.
|
|
+
|
|
+ pfob - handle to a function object
|
|
+
|
|
+ frag_size_bytes - erx frag size in bytes that is/was set.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful int error
|
|
+ code is returned.
|
|
+
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+
|
|
+*/
|
|
+int
|
|
+be_eth_rq_get_frag_size(struct be_function_object *pfob, u32 *frag_size_bytes)
|
|
+{
|
|
+ struct FWCMD_ETH_GET_RX_FRAG_SIZE *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+
|
|
+ ASSERT(frag_size_bytes);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ return BE_STATUS_NO_MCC_WRB;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_GET_RX_FRAG_SIZE);
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+ if (status != 0) {
|
|
+ TRACE(DL_ERR, "get frag size fwcmd failed.");
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ *frag_size_bytes = 1 << fwcmd->params.response.actual_fragsize_log2;
|
|
+
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine attempts to set the frag size for erx. If the frag size is
|
|
+ already set, the attempt fails and the current frag size is returned.
|
|
+
|
|
+ pfob - Handle to a function object
|
|
+
|
|
+ frag_size - Erx frag size in bytes that is/was set.
|
|
+
|
|
+ current_frag_size_bytes - Pointer to location where currrent frag
|
|
+ is to be rturned
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful int error
|
|
+ code is returned.
|
|
+
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+
|
|
+ This function always fails in non-privileged machine context.
|
|
+*/
|
|
+int
|
|
+be_eth_rq_set_frag_size(struct be_function_object *pfob,
|
|
+ u32 frag_size, u32 *frag_size_bytes)
|
|
+{
|
|
+ struct FWCMD_ETH_SET_RX_FRAG_SIZE *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+
|
|
+ ASSERT(frag_size_bytes);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_SET_RX_FRAG_SIZE);
|
|
+
|
|
+ ASSERT(frag_size >= 128 && frag_size <= 16 * 1024);
|
|
+
|
|
+ /* This is the log2 of the fragsize. This is not the exact
|
|
+ * ERX encoding. */
|
|
+ fwcmd->params.request.new_fragsize_log2 = __ilog2_u32(frag_size);
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+ if (status != 0) {
|
|
+ TRACE(DL_ERR, "set frag size fwcmd failed.");
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ *frag_size_bytes = 1 << fwcmd->params.response.actual_fragsize_log2;
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ This routine gets or sets a mac address for a domain
|
|
+ given the port and mac.
|
|
+
|
|
+ FunctionObject - Function object handle.
|
|
+ port1 - Set to TRUE if this function will set/get the Port 1
|
|
+ address. Only the host may set this to TRUE.
|
|
+ mac1 - Set to TRUE if this function will set/get the
|
|
+ MAC 1 address. Only the host may set this to TRUE.
|
|
+ write - Set to TRUE if this function should write the mac address.
|
|
+ mac_address - Buffer of the mac address to read or write.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful int is returned.
|
|
+
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+*/
|
|
+int be_rxf_mac_address_read_write(struct be_function_object *pfob,
|
|
+ bool port1, /* VM must always set to false */
|
|
+ bool mac1, /* VM must always set to false */
|
|
+ bool mgmt, bool write,
|
|
+ bool permanent, u8 *mac_address,
|
|
+ mcc_wrb_cqe_callback cb, /* optional */
|
|
+ void *cb_context) /* optional */
|
|
+{
|
|
+ int status = BE_SUCCESS;
|
|
+ union {
|
|
+ struct FWCMD_COMMON_NTWK_MAC_QUERY *query;
|
|
+ struct FWCMD_COMMON_NTWK_MAC_SET *set;
|
|
+ } fwcmd = {NULL};
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ u32 type = 0;
|
|
+ unsigned long irql;
|
|
+ struct be_mcc_wrb_response_copy rc;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ ASSERT(mac_address);
|
|
+
|
|
+ ASSERT(port1 == false);
|
|
+ ASSERT(mac1 == false);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+ if (mgmt) {
|
|
+ type = MAC_ADDRESS_TYPE_MANAGEMENT;
|
|
+ } else {
|
|
+ if (pfob->type == BE_FUNCTION_TYPE_NETWORK)
|
|
+ type = MAC_ADDRESS_TYPE_NETWORK;
|
|
+ else
|
|
+ type = MAC_ADDRESS_TYPE_STORAGE;
|
|
+ }
|
|
+
|
|
+ if (write) {
|
|
+ /* Prepares an embedded fwcmd, including
|
|
+ * request/response sizes.
|
|
+ */
|
|
+ fwcmd.set = BE_PREPARE_EMBEDDED_FWCMD(pfob,
|
|
+ wrb, COMMON_NTWK_MAC_SET);
|
|
+
|
|
+ fwcmd.set->params.request.invalidate = 0;
|
|
+ fwcmd.set->params.request.mac1 = (mac1 ? 1 : 0);
|
|
+ fwcmd.set->params.request.port = (port1 ? 1 : 0);
|
|
+ fwcmd.set->params.request.type = type;
|
|
+
|
|
+ /* Copy the mac address to set. */
|
|
+ fwcmd.set->params.request.mac.SizeOfStructure =
|
|
+ sizeof(fwcmd.set->params.request.mac);
|
|
+ memcpy(fwcmd.set->params.request.mac.MACAddress,
|
|
+ mac_address, ETH_ALEN);
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL,
|
|
+ cb, cb_context, NULL, NULL, fwcmd.set, NULL);
|
|
+
|
|
+ } else {
|
|
+
|
|
+ /*
|
|
+ * Prepares an embedded fwcmd, including
|
|
+ * request/response sizes.
|
|
+ */
|
|
+ fwcmd.query = BE_PREPARE_EMBEDDED_FWCMD(pfob,
|
|
+ wrb, COMMON_NTWK_MAC_QUERY);
|
|
+
|
|
+ fwcmd.query->params.request.mac1 = (mac1 ? 1 : 0);
|
|
+ fwcmd.query->params.request.port = (port1 ? 1 : 0);
|
|
+ fwcmd.query->params.request.type = type;
|
|
+ fwcmd.query->params.request.permanent = permanent;
|
|
+
|
|
+ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_MAC_QUERY,
|
|
+ params.response.mac.MACAddress);
|
|
+ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_MAC_QUERY,
|
|
+ params.response.mac.MACAddress);
|
|
+ rc.va = mac_address;
|
|
+ /* Post the f/w command (with a copy for the response) */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb,
|
|
+ cb_context, NULL, NULL, fwcmd.query, &rc);
|
|
+ }
|
|
+
|
|
+ if (status < 0) {
|
|
+ TRACE(DL_ERR, "mac set/query failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine writes data to context memory.
|
|
+
|
|
+ pfob - Function object handle.
|
|
+ mac_table - Set to the 128-bit multicast address hash table.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful int is returned.
|
|
+
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+*/
|
|
+
|
|
+int be_rxf_multicast_config(struct be_function_object *pfob,
|
|
+ bool promiscuous, u32 num, u8 *mac_table,
|
|
+ mcc_wrb_cqe_callback cb, /* optional */
|
|
+ void *cb_context,
|
|
+ struct be_multicast_q_ctxt *q_ctxt)
|
|
+{
|
|
+ int status = BE_SUCCESS;
|
|
+ struct FWCMD_COMMON_NTWK_MULTICAST_SET *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ struct be_generic_q_ctxt *generic_ctxt = NULL;
|
|
+ unsigned long irql;
|
|
+
|
|
+ ASSERT(num <= ARRAY_SIZE(fwcmd->params.request.mac));
|
|
+
|
|
+ if (num > ARRAY_SIZE(fwcmd->params.request.mac)) {
|
|
+ TRACE(DL_ERR, "Too many multicast addresses. BE supports %d.",
|
|
+ (int) ARRAY_SIZE(fwcmd->params.request.mac));
|
|
+ return BE_NOT_OK;
|
|
+ }
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ if (q_ctxt && cb) {
|
|
+ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
|
|
+ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
|
|
+ generic_ctxt->context.bytes = sizeof(*q_ctxt);
|
|
+ } else {
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_MULTICAST_SET);
|
|
+
|
|
+ fwcmd->params.request.promiscuous = promiscuous;
|
|
+ if (!promiscuous) {
|
|
+ fwcmd->params.request.num_mac = num;
|
|
+ if (num > 0) {
|
|
+ ASSERT(mac_table);
|
|
+ memcpy(fwcmd->params.request.mac,
|
|
+ mac_table, ETH_ALEN * num);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
|
|
+ cb, cb_context, NULL, NULL, fwcmd, NULL);
|
|
+ if (status < 0) {
|
|
+ TRACE(DL_ERR, "multicast fwcmd failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine adds or removes a vlan tag from the rxf table.
|
|
+
|
|
+ FunctionObject - Function object handle.
|
|
+ VLanTag - VLan tag to add or remove.
|
|
+ Add - Set to TRUE if this will add a vlan tag
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise a useful int is returned.
|
|
+
|
|
+ IRQL: < DISPATCH_LEVEL
|
|
+*/
|
|
+int be_rxf_vlan_config(struct be_function_object *pfob,
|
|
+ bool promiscuous, u32 num, u16 *vlan_tag_array,
|
|
+ mcc_wrb_cqe_callback cb, /* optional */
|
|
+ void *cb_context,
|
|
+ struct be_vlan_q_ctxt *q_ctxt) /* optional */
|
|
+{
|
|
+ int status = BE_SUCCESS;
|
|
+ struct FWCMD_COMMON_NTWK_VLAN_CONFIG *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ struct be_generic_q_ctxt *generic_ctxt = NULL;
|
|
+ unsigned long irql;
|
|
+
|
|
+ if (num > ARRAY_SIZE(fwcmd->params.request.vlan_tag)) {
|
|
+ TRACE(DL_ERR, "Too many VLAN tags.");
|
|
+ return BE_NOT_OK;
|
|
+ }
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ if (q_ctxt && cb) {
|
|
+ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
|
|
+ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
|
|
+ generic_ctxt->context.bytes = sizeof(*q_ctxt);
|
|
+ } else {
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_VLAN_CONFIG);
|
|
+
|
|
+ fwcmd->params.request.promiscuous = promiscuous;
|
|
+ if (!promiscuous) {
|
|
+ fwcmd->params.request.num_vlan = num;
|
|
+
|
|
+ if (num > 0) {
|
|
+ ASSERT(vlan_tag_array);
|
|
+ memcpy(fwcmd->params.request.vlan_tag, vlan_tag_array,
|
|
+ num * sizeof(vlan_tag_array[0]));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Post the commadn */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
|
|
+ cb, cb_context, NULL, NULL, fwcmd, NULL);
|
|
+ if (status < 0) {
|
|
+ TRACE(DL_ERR, "vlan fwcmd failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+
|
|
+int be_rxf_link_status(struct be_function_object *pfob,
|
|
+ struct BE_LINK_STATUS *link_status,
|
|
+ mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context,
|
|
+ struct be_link_status_q_ctxt *q_ctxt)
|
|
+{
|
|
+ struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ struct be_generic_q_ctxt *generic_ctxt = NULL;
|
|
+ unsigned long irql;
|
|
+ struct be_mcc_wrb_response_copy rc;
|
|
+
|
|
+ ASSERT(link_status);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+
|
|
+ if (!wrb) {
|
|
+ if (q_ctxt && cb) {
|
|
+ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
|
|
+ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
|
|
+ generic_ctxt->context.bytes = sizeof(*q_ctxt);
|
|
+ } else {
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb,
|
|
+ COMMON_NTWK_LINK_STATUS_QUERY);
|
|
+
|
|
+ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY,
|
|
+ params.response);
|
|
+ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY,
|
|
+ params.response);
|
|
+ rc.va = link_status;
|
|
+ /* Post or queue the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
|
|
+ cb, cb_context, NULL, NULL, fwcmd, &rc);
|
|
+
|
|
+ if (status < 0) {
|
|
+ TRACE(DL_ERR, "link status fwcmd failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+int
|
|
+be_rxf_query_eth_statistics(struct be_function_object *pfob,
|
|
+ struct FWCMD_ETH_GET_STATISTICS *va_for_fwcmd,
|
|
+ u64 pa_for_fwcmd, mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context,
|
|
+ struct be_nonembedded_q_ctxt *q_ctxt)
|
|
+{
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ struct be_generic_q_ctxt *generic_ctxt = NULL;
|
|
+ unsigned long irql;
|
|
+
|
|
+ ASSERT(va_for_fwcmd);
|
|
+ ASSERT(pa_for_fwcmd);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+
|
|
+ if (!wrb) {
|
|
+ if (q_ctxt && cb) {
|
|
+ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
|
|
+ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
|
|
+ generic_ctxt->context.bytes = sizeof(*q_ctxt);
|
|
+ } else {
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ TRACE(DL_INFO, "Query eth stats. fwcmd va:%p pa:0x%08x_%08x",
|
|
+ va_for_fwcmd, upper_32_bits(pa_for_fwcmd), (u32)pa_for_fwcmd);
|
|
+
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ va_for_fwcmd = BE_PREPARE_NONEMBEDDED_FWCMD(pfob, wrb,
|
|
+ va_for_fwcmd, pa_for_fwcmd, ETH_GET_STATISTICS);
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
|
|
+ cb, cb_context, NULL, NULL, va_for_fwcmd, NULL);
|
|
+ if (status < 0) {
|
|
+ TRACE(DL_ERR, "eth stats fwcmd failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+int
|
|
+be_rxf_promiscuous(struct be_function_object *pfob,
|
|
+ bool enable_port0, bool enable_port1,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context,
|
|
+ struct be_promiscuous_q_ctxt *q_ctxt)
|
|
+{
|
|
+ struct FWCMD_ETH_PROMISCUOUS *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ struct be_generic_q_ctxt *generic_ctxt = NULL;
|
|
+ unsigned long irql;
|
|
+
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+
|
|
+ if (!wrb) {
|
|
+ if (q_ctxt && cb) {
|
|
+ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
|
|
+ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
|
|
+ generic_ctxt->context.bytes = sizeof(*q_ctxt);
|
|
+ } else {
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_PROMISCUOUS);
|
|
+
|
|
+ fwcmd->params.request.port0_promiscuous = enable_port0;
|
|
+ fwcmd->params.request.port1_promiscuous = enable_port1;
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
|
|
+ cb, cb_context, NULL, NULL, fwcmd, NULL);
|
|
+
|
|
+ if (status < 0) {
|
|
+ TRACE(DL_ERR, "promiscuous fwcmd failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ *-------------------------------------------------------------------------
|
|
+ * Function: be_rxf_filter_config
|
|
+ * Configures BladeEngine ethernet receive filter settings.
|
|
+ * pfob -
|
|
+ * settings - Pointer to the requested filter settings.
|
|
+ * The response from BladeEngine will be placed back
|
|
+ * in this structure.
|
|
+ * cb - optional
|
|
+ * cb_context - optional
|
|
+ * q_ctxt - Optional. Pointer to a previously allocated struct.
|
|
+ * If the MCC WRB ring is full, this structure is
|
|
+ * used to queue the operation. It will be posted
|
|
+ * to the MCC ring when space becomes available. All
|
|
+ * queued commands will be posted to the ring in
|
|
+ * the order they are received. It is always valid
|
|
+ * to pass a pointer to a generic
|
|
+ * be_generic_q_ctxt. However, the specific
|
|
+ * context structs are generally smaller than
|
|
+ * the generic struct.
|
|
+ * return pend_status - BE_SUCCESS (0) on success.
|
|
+ * BE_PENDING (postive value) if the FWCMD
|
|
+ * completion is pending. Negative error code on failure.
|
|
+ *---------------------------------------------------------------------------
|
|
+ */
|
|
+int
|
|
+be_rxf_filter_config(struct be_function_object *pfob,
|
|
+ struct NTWK_RX_FILTER_SETTINGS *settings,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context,
|
|
+ struct be_rxf_filter_q_ctxt *q_ctxt)
|
|
+{
|
|
+ struct FWCMD_COMMON_NTWK_RX_FILTER *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ struct be_generic_q_ctxt *generic_ctxt = NULL;
|
|
+ unsigned long irql;
|
|
+ struct be_mcc_wrb_response_copy rc;
|
|
+
|
|
+ ASSERT(settings);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+
|
|
+ if (!wrb) {
|
|
+ if (q_ctxt && cb) {
|
|
+ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
|
|
+ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
|
|
+ generic_ctxt->context.bytes = sizeof(*q_ctxt);
|
|
+ } else {
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_RX_FILTER);
|
|
+ memcpy(&fwcmd->params.request, settings, sizeof(*settings));
|
|
+
|
|
+ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_RX_FILTER,
|
|
+ params.response);
|
|
+ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_RX_FILTER,
|
|
+ params.response);
|
|
+ rc.va = settings;
|
|
+ /* Post or queue the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
|
|
+ cb, cb_context, NULL, NULL, fwcmd, &rc);
|
|
+
|
|
+ if (status < 0) {
|
|
+ TRACE(DL_ERR, "RXF/ERX filter config fwcmd failed.");
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/etx_context.h linux-2.6.29-rc3.owrt/drivers/staging/benet/etx_context.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/etx_context.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/etx_context.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,55 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __etx_context_amap_h__
|
|
+#define __etx_context_amap_h__
|
|
+
|
|
+/* ETX ring context structure. */
|
|
+struct BE_ETX_CONTEXT_AMAP {
|
|
+ u8 tx_cidx[11]; /* DWORD 0 */
|
|
+ u8 rsvd0[5]; /* DWORD 0 */
|
|
+ u8 rsvd1[16]; /* DWORD 0 */
|
|
+ u8 tx_pidx[11]; /* DWORD 1 */
|
|
+ u8 rsvd2; /* DWORD 1 */
|
|
+ u8 tx_ring_size[4]; /* DWORD 1 */
|
|
+ u8 pd_id[5]; /* DWORD 1 */
|
|
+ u8 pd_id_not_valid; /* DWORD 1 */
|
|
+ u8 cq_id_send[10]; /* DWORD 1 */
|
|
+ u8 rsvd3[32]; /* DWORD 2 */
|
|
+ u8 rsvd4[32]; /* DWORD 3 */
|
|
+ u8 cur_bytes[32]; /* DWORD 4 */
|
|
+ u8 max_bytes[32]; /* DWORD 5 */
|
|
+ u8 time_stamp[32]; /* DWORD 6 */
|
|
+ u8 rsvd5[11]; /* DWORD 7 */
|
|
+ u8 func; /* DWORD 7 */
|
|
+ u8 rsvd6[20]; /* DWORD 7 */
|
|
+ u8 cur_txd_count[32]; /* DWORD 8 */
|
|
+ u8 max_txd_count[32]; /* DWORD 9 */
|
|
+ u8 rsvd7[32]; /* DWORD 10 */
|
|
+ u8 rsvd8[32]; /* DWORD 11 */
|
|
+ u8 rsvd9[32]; /* DWORD 12 */
|
|
+ u8 rsvd10[32]; /* DWORD 13 */
|
|
+ u8 rsvd11[32]; /* DWORD 14 */
|
|
+ u8 rsvd12[32]; /* DWORD 15 */
|
|
+} __packed;
|
|
+struct ETX_CONTEXT_AMAP {
|
|
+ u32 dw[16];
|
|
+};
|
|
+
|
|
+#endif /* __etx_context_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/funcobj.c linux-2.6.29-rc3.owrt/drivers/staging/benet/funcobj.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/funcobj.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/funcobj.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,565 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#include "hwlib.h"
|
|
+#include "bestatus.h"
|
|
+
|
|
+
|
|
+int
|
|
+be_function_internal_query_firmware_config(struct be_function_object *pfob,
|
|
+ struct BE_FIRMWARE_CONFIG *config)
|
|
+{
|
|
+ struct FWCMD_COMMON_FIRMWARE_CONFIG *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+ struct be_mcc_wrb_response_copy rc;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_FIRMWARE_CONFIG);
|
|
+
|
|
+ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_FIRMWARE_CONFIG,
|
|
+ params.response);
|
|
+ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_FIRMWARE_CONFIG,
|
|
+ params.response);
|
|
+ rc.va = config;
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL,
|
|
+ NULL, NULL, NULL, fwcmd, &rc);
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This allocates and initializes a function object based on the information
|
|
+ provided by upper layer drivers.
|
|
+
|
|
+ Returns BE_SUCCESS on success and an appropriate int on failure.
|
|
+
|
|
+ A function object represents a single BladeEngine (logical) PCI function.
|
|
+ That is a function object either represents
|
|
+ the networking side of BladeEngine or the iSCSI side of BladeEngine.
|
|
+
|
|
+ This routine will also detect and create an appropriate PD object for the
|
|
+ PCI function as needed.
|
|
+*/
|
|
+int
|
|
+be_function_object_create(u8 __iomem *csr_va, u8 __iomem *db_va,
|
|
+ u8 __iomem *pci_va, u32 function_type,
|
|
+ struct ring_desc *mailbox, struct be_function_object *pfob)
|
|
+{
|
|
+ int status;
|
|
+
|
|
+ ASSERT(pfob); /* not a magic assert */
|
|
+ ASSERT(function_type <= 2);
|
|
+
|
|
+ TRACE(DL_INFO, "Create function object. type:%s object:0x%p",
|
|
+ (function_type == BE_FUNCTION_TYPE_ISCSI ? "iSCSI" :
|
|
+ (function_type == BE_FUNCTION_TYPE_NETWORK ? "Network" :
|
|
+ "Arm")), pfob);
|
|
+
|
|
+ memset(pfob, 0, sizeof(*pfob));
|
|
+
|
|
+ pfob->type = function_type;
|
|
+ pfob->csr_va = csr_va;
|
|
+ pfob->db_va = db_va;
|
|
+ pfob->pci_va = pci_va;
|
|
+
|
|
+ spin_lock_init(&pfob->cq_lock);
|
|
+ spin_lock_init(&pfob->post_lock);
|
|
+ spin_lock_init(&pfob->mcc_context_lock);
|
|
+
|
|
+
|
|
+ pfob->pci_function_number = 1;
|
|
+
|
|
+
|
|
+ pfob->emulate = false;
|
|
+ TRACE(DL_NOTE, "Non-emulation mode");
|
|
+ status = be_drive_POST(pfob);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "BladeEngine POST failed.");
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ /* Initialize the mailbox */
|
|
+ status = be_mpu_init_mailbox(pfob, mailbox);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "Failed to initialize mailbox.");
|
|
+ goto error;
|
|
+ }
|
|
+ /*
|
|
+ * Cache the firmware config for ASSERTs in hwclib and later
|
|
+ * driver queries.
|
|
+ */
|
|
+ status = be_function_internal_query_firmware_config(pfob,
|
|
+ &pfob->fw_config);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "Failed to query firmware config.");
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+error:
|
|
+ if (status != BE_SUCCESS) {
|
|
+ /* No cleanup necessary */
|
|
+ TRACE(DL_ERR, "Failed to create function.");
|
|
+ memset(pfob, 0, sizeof(*pfob));
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine drops the reference count on a given function object. Once
|
|
+ the reference count falls to zero, the function object is destroyed and all
|
|
+ resources held are freed.
|
|
+
|
|
+ FunctionObject - The function object to drop the reference to.
|
|
+*/
|
|
+int be_function_object_destroy(struct be_function_object *pfob)
|
|
+{
|
|
+ TRACE(DL_INFO, "Destroy pfob. Object:0x%p",
|
|
+ pfob);
|
|
+
|
|
+
|
|
+ ASSERT(pfob->mcc == NULL);
|
|
+
|
|
+ return BE_SUCCESS;
|
|
+}
|
|
+
|
|
+int be_function_cleanup(struct be_function_object *pfob)
|
|
+{
|
|
+ int status = 0;
|
|
+ u32 isr;
|
|
+ u32 host_intr;
|
|
+ struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl;
|
|
+
|
|
+
|
|
+ if (pfob->type == BE_FUNCTION_TYPE_NETWORK) {
|
|
+ status = be_rxf_multicast_config(pfob, false, 0,
|
|
+ NULL, NULL, NULL, NULL);
|
|
+ ASSERT(status == BE_SUCCESS);
|
|
+ }
|
|
+ /* VLAN */
|
|
+ status = be_rxf_vlan_config(pfob, false, 0, NULL, NULL, NULL, NULL);
|
|
+ ASSERT(status == BE_SUCCESS);
|
|
+ /*
|
|
+ * MCC Queue -- Switches to mailbox mode. May want to destroy
|
|
+ * all but the MCC CQ before this call if polling CQ is much better
|
|
+ * performance than polling mailbox register.
|
|
+ */
|
|
+ if (pfob->mcc)
|
|
+ status = be_mcc_ring_destroy(pfob->mcc);
|
|
+ /*
|
|
+ * If interrupts are disabled, clear any CEV interrupt assertions that
|
|
+ * fired after we stopped processing EQs.
|
|
+ */
|
|
+ ctrl.dw[0] = PCICFG1_READ(pfob, host_timer_int_ctrl);
|
|
+ host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR,
|
|
+ hostintr, ctrl.dw);
|
|
+ if (!host_intr)
|
|
+ if (pfob->type == BE_FUNCTION_TYPE_NETWORK)
|
|
+ isr = CSR_READ(pfob, cev.isr1);
|
|
+ else
|
|
+ isr = CSR_READ(pfob, cev.isr0);
|
|
+ else
|
|
+ /* This should never happen... */
|
|
+ TRACE(DL_ERR, "function_cleanup called with interrupt enabled");
|
|
+ /* Function object destroy */
|
|
+ status = be_function_object_destroy(pfob);
|
|
+ ASSERT(status == BE_SUCCESS);
|
|
+
|
|
+ return status;
|
|
+}
|
|
+
|
|
+
|
|
+void *
|
|
+be_function_prepare_embedded_fwcmd(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb, u32 payld_len, u32 request_length,
|
|
+ u32 response_length, u32 opcode, u32 subsystem)
|
|
+{
|
|
+ struct FWCMD_REQUEST_HEADER *header = NULL;
|
|
+ u32 n;
|
|
+
|
|
+ ASSERT(wrb);
|
|
+
|
|
+ n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8;
|
|
+ AMAP_SET_BITS_PTR(MCC_WRB, embedded, wrb, 1);
|
|
+ AMAP_SET_BITS_PTR(MCC_WRB, payload_length, wrb, min(payld_len, n));
|
|
+ header = (struct FWCMD_REQUEST_HEADER *)((u8 *)wrb + n);
|
|
+
|
|
+ header->timeout = 0;
|
|
+ header->domain = 0;
|
|
+ header->request_length = max(request_length, response_length);
|
|
+ header->opcode = opcode;
|
|
+ header->subsystem = subsystem;
|
|
+
|
|
+ return header;
|
|
+}
|
|
+
|
|
+void *
|
|
+be_function_prepare_nonembedded_fwcmd(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb,
|
|
+ void *fwcmd_va, u64 fwcmd_pa,
|
|
+ u32 payld_len,
|
|
+ u32 request_length,
|
|
+ u32 response_length,
|
|
+ u32 opcode, u32 subsystem)
|
|
+{
|
|
+ struct FWCMD_REQUEST_HEADER *header = NULL;
|
|
+ u32 n;
|
|
+ struct MCC_WRB_PAYLOAD_AMAP *plp;
|
|
+
|
|
+ ASSERT(wrb);
|
|
+ ASSERT(fwcmd_va);
|
|
+
|
|
+ header = (struct FWCMD_REQUEST_HEADER *) fwcmd_va;
|
|
+
|
|
+ AMAP_SET_BITS_PTR(MCC_WRB, embedded, wrb, 0);
|
|
+ AMAP_SET_BITS_PTR(MCC_WRB, payload_length, wrb, payld_len);
|
|
+
|
|
+ /*
|
|
+ * Assume one fragment. The caller may override the SGL by
|
|
+ * rewriting the 0th length and adding more entries. They
|
|
+ * will also need to update the sge_count.
|
|
+ */
|
|
+ AMAP_SET_BITS_PTR(MCC_WRB, sge_count, wrb, 1);
|
|
+
|
|
+ n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8;
|
|
+ plp = (struct MCC_WRB_PAYLOAD_AMAP *)((u8 *)wrb + n);
|
|
+ AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].length, plp, payld_len);
|
|
+ AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].pa_lo, plp, (u32)fwcmd_pa);
|
|
+ AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].pa_hi, plp,
|
|
+ upper_32_bits(fwcmd_pa));
|
|
+
|
|
+ header->timeout = 0;
|
|
+ header->domain = 0;
|
|
+ header->request_length = max(request_length, response_length);
|
|
+ header->opcode = opcode;
|
|
+ header->subsystem = subsystem;
|
|
+
|
|
+ return header;
|
|
+}
|
|
+
|
|
+struct MCC_WRB_AMAP *
|
|
+be_function_peek_mcc_wrb(struct be_function_object *pfob)
|
|
+{
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ u32 offset;
|
|
+
|
|
+ if (pfob->mcc)
|
|
+ wrb = _be_mpu_peek_ring_wrb(pfob->mcc, false);
|
|
+ else {
|
|
+ offset = offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8;
|
|
+ wrb = (struct MCC_WRB_AMAP *) ((u8 *) pfob->mailbox.va +
|
|
+ offset);
|
|
+ }
|
|
+
|
|
+ if (wrb)
|
|
+ memset(wrb, 0, sizeof(struct MCC_WRB_AMAP));
|
|
+
|
|
+ return wrb;
|
|
+}
|
|
+
|
|
+#if defined(BE_DEBUG)
|
|
+void be_function_debug_print_wrb(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb, void *optional_fwcmd_va,
|
|
+ struct be_mcc_wrb_context *wrb_context)
|
|
+{
|
|
+
|
|
+ struct FWCMD_REQUEST_HEADER *header = NULL;
|
|
+ u8 embedded;
|
|
+ u32 n;
|
|
+
|
|
+ embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, wrb);
|
|
+
|
|
+ if (embedded) {
|
|
+ n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8;
|
|
+ header = (struct FWCMD_REQUEST_HEADER *)((u8 *)wrb + n);
|
|
+ } else {
|
|
+ header = (struct FWCMD_REQUEST_HEADER *) optional_fwcmd_va;
|
|
+ }
|
|
+
|
|
+ /* Save the completed count before posting for a debug assert. */
|
|
+
|
|
+ if (header) {
|
|
+ wrb_context->opcode = header->opcode;
|
|
+ wrb_context->subsystem = header->subsystem;
|
|
+
|
|
+ } else {
|
|
+ wrb_context->opcode = 0;
|
|
+ wrb_context->subsystem = 0;
|
|
+ }
|
|
+}
|
|
+#else
|
|
+#define be_function_debug_print_wrb(a_, b_, c_, d_)
|
|
+#endif
|
|
+
|
|
+int
|
|
+be_function_post_mcc_wrb(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb,
|
|
+ struct be_generic_q_ctxt *q_ctxt,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context,
|
|
+ mcc_wrb_cqe_callback internal_cb,
|
|
+ void *internal_cb_context, void *optional_fwcmd_va,
|
|
+ struct be_mcc_wrb_response_copy *rc)
|
|
+{
|
|
+ int status;
|
|
+ struct be_mcc_wrb_context *wrb_context = NULL;
|
|
+ u64 *p;
|
|
+
|
|
+ if (q_ctxt) {
|
|
+ /* Initialize context. */
|
|
+ q_ctxt->context.internal_cb = internal_cb;
|
|
+ q_ctxt->context.internal_cb_context = internal_cb_context;
|
|
+ q_ctxt->context.cb = cb;
|
|
+ q_ctxt->context.cb_context = cb_context;
|
|
+ if (rc) {
|
|
+ q_ctxt->context.copy.length = rc->length;
|
|
+ q_ctxt->context.copy.fwcmd_offset = rc->fwcmd_offset;
|
|
+ q_ctxt->context.copy.va = rc->va;
|
|
+ } else
|
|
+ q_ctxt->context.copy.length = 0;
|
|
+
|
|
+ q_ctxt->context.optional_fwcmd_va = optional_fwcmd_va;
|
|
+
|
|
+ /* Queue this request */
|
|
+ status = be_function_queue_mcc_wrb(pfob, q_ctxt);
|
|
+
|
|
+ goto Error;
|
|
+ }
|
|
+ /*
|
|
+ * Allocate a WRB context struct to hold the callback pointers,
|
|
+ * status, etc. This is required if commands complete out of order.
|
|
+ */
|
|
+ wrb_context = _be_mcc_allocate_wrb_context(pfob);
|
|
+ if (!wrb_context) {
|
|
+ TRACE(DL_WARN, "Failed to allocate MCC WRB context.");
|
|
+ status = BE_STATUS_SYSTEM_RESOURCES;
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Initialize context. */
|
|
+ memset(wrb_context, 0, sizeof(*wrb_context));
|
|
+ wrb_context->internal_cb = internal_cb;
|
|
+ wrb_context->internal_cb_context = internal_cb_context;
|
|
+ wrb_context->cb = cb;
|
|
+ wrb_context->cb_context = cb_context;
|
|
+ if (rc) {
|
|
+ wrb_context->copy.length = rc->length;
|
|
+ wrb_context->copy.fwcmd_offset = rc->fwcmd_offset;
|
|
+ wrb_context->copy.va = rc->va;
|
|
+ } else
|
|
+ wrb_context->copy.length = 0;
|
|
+ wrb_context->wrb = wrb;
|
|
+
|
|
+ /*
|
|
+ * Copy the context pointer into the WRB opaque tag field.
|
|
+ * Verify assumption of 64-bit tag with a compile time assert.
|
|
+ */
|
|
+ p = (u64 *) ((u8 *)wrb + offsetof(struct BE_MCC_WRB_AMAP, tag)/8);
|
|
+ *p = (u64)(size_t)wrb_context;
|
|
+
|
|
+ /* Print info about this FWCMD for debug builds. */
|
|
+ be_function_debug_print_wrb(pfob, wrb, optional_fwcmd_va, wrb_context);
|
|
+
|
|
+ /*
|
|
+ * issue the WRB to the MPU as appropriate
|
|
+ */
|
|
+ if (pfob->mcc) {
|
|
+ /*
|
|
+ * we're in WRB mode, pass to the mcc layer
|
|
+ */
|
|
+ status = _be_mpu_post_wrb_ring(pfob->mcc, wrb, wrb_context);
|
|
+ } else {
|
|
+ /*
|
|
+ * we're in mailbox mode
|
|
+ */
|
|
+ status = _be_mpu_post_wrb_mailbox(pfob, wrb, wrb_context);
|
|
+
|
|
+ /* mailbox mode always completes synchronously */
|
|
+ ASSERT(status != BE_STATUS_PENDING);
|
|
+ }
|
|
+
|
|
+Error:
|
|
+
|
|
+ return status;
|
|
+}
|
|
+
|
|
+int
|
|
+be_function_ring_destroy(struct be_function_object *pfob,
|
|
+ u32 id, u32 ring_type, mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context, mcc_wrb_cqe_callback internal_cb,
|
|
+ void *internal_cb_context)
|
|
+{
|
|
+
|
|
+ struct FWCMD_COMMON_RING_DESTROY *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ int status = 0;
|
|
+ unsigned long irql;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ TRACE(DL_INFO, "Destroy ring id:%d type:%d", id, ring_type);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ ASSERT(wrb);
|
|
+ TRACE(DL_ERR, "No free MCC WRBs in destroy ring.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_RING_DESTROY);
|
|
+
|
|
+ fwcmd->params.request.id = id;
|
|
+ fwcmd->params.request.ring_type = ring_type;
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb, cb_context,
|
|
+ internal_cb, internal_cb_context, fwcmd, NULL);
|
|
+ if (status != BE_SUCCESS && status != BE_PENDING) {
|
|
+ TRACE(DL_ERR, "Ring destroy fwcmd failed. id:%d ring_type:%d",
|
|
+ id, ring_type);
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+void
|
|
+be_rd_to_pa_list(struct ring_desc *rd, struct PHYS_ADDR *pa_list, u32 max_num)
|
|
+{
|
|
+ u32 num_pages = PAGES_SPANNED(rd->va, rd->length);
|
|
+ u32 i = 0;
|
|
+ u64 pa = rd->pa;
|
|
+ __le64 lepa;
|
|
+
|
|
+ ASSERT(pa_list);
|
|
+ ASSERT(pa);
|
|
+
|
|
+ for (i = 0; i < min(num_pages, max_num); i++) {
|
|
+ lepa = cpu_to_le64(pa);
|
|
+ pa_list[i].lo = (u32)lepa;
|
|
+ pa_list[i].hi = upper_32_bits(lepa);
|
|
+ pa += PAGE_SIZE;
|
|
+ }
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+/*-----------------------------------------------------------------------------
|
|
+ * Function: be_function_get_fw_version
|
|
+ * Retrieves the firmware version on the adpater. If the callback is
|
|
+ * NULL this call executes synchronously. If the callback is not NULL,
|
|
+ * the returned status will be BE_PENDING if the command was issued
|
|
+ * successfully.
|
|
+ * pfob -
|
|
+ * fwv - Pointer to response buffer if callback is NULL.
|
|
+ * cb - Callback function invoked when the FWCMD completes.
|
|
+ * cb_context - Passed to the callback function.
|
|
+ * return pend_status - BE_SUCCESS (0) on success.
|
|
+ * BE_PENDING (postive value) if the FWCMD
|
|
+ * completion is pending. Negative error code on failure.
|
|
+ *---------------------------------------------------------------------------
|
|
+ */
|
|
+int
|
|
+be_function_get_fw_version(struct be_function_object *pfob,
|
|
+ struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD *fwv,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context)
|
|
+{
|
|
+ int status = BE_SUCCESS;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ struct FWCMD_COMMON_GET_FW_VERSION *fwcmd = NULL;
|
|
+ unsigned long irql;
|
|
+ struct be_mcc_wrb_response_copy rc;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ TRACE(DL_ERR, "MCC wrb peek failed.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto Error;
|
|
+ }
|
|
+
|
|
+ if (!cb && !fwv) {
|
|
+ TRACE(DL_ERR, "callback and response buffer NULL!");
|
|
+ status = BE_NOT_OK;
|
|
+ goto Error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_FW_VERSION);
|
|
+
|
|
+ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_GET_FW_VERSION,
|
|
+ params.response);
|
|
+ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_GET_FW_VERSION,
|
|
+ params.response);
|
|
+ rc.va = fwv;
|
|
+
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb,
|
|
+ cb_context, NULL, NULL, fwcmd, &rc);
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+int
|
|
+be_function_queue_mcc_wrb(struct be_function_object *pfob,
|
|
+ struct be_generic_q_ctxt *q_ctxt)
|
|
+{
|
|
+ int status;
|
|
+
|
|
+ ASSERT(q_ctxt);
|
|
+
|
|
+ /*
|
|
+ * issue the WRB to the MPU as appropriate
|
|
+ */
|
|
+ if (pfob->mcc) {
|
|
+
|
|
+ /* We're in ring mode. Queue this item. */
|
|
+ pfob->mcc->backlog_length++;
|
|
+ list_add_tail(&q_ctxt->context.list, &pfob->mcc->backlog);
|
|
+ status = BE_PENDING;
|
|
+ } else {
|
|
+ status = BE_NOT_OK;
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_common_bmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_common_bmap.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_common_bmap.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_common_bmap.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,717 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __fwcmd_common_bmap_h__
|
|
+#define __fwcmd_common_bmap_h__
|
|
+#include "fwcmd_types_bmap.h"
|
|
+#include "fwcmd_hdr_bmap.h"
|
|
+
|
|
+#if defined(__BIG_ENDIAN)
|
|
+ /* Physical Address. */
|
|
+struct PHYS_ADDR {
|
|
+ union {
|
|
+ struct {
|
|
+ u32 lo; /* DWORD 0 */
|
|
+ u32 hi; /* DWORD 1 */
|
|
+ } __packed; /* unnamed struct */
|
|
+ u32 dw[2]; /* dword union */
|
|
+ }; /* unnamed union */
|
|
+} __packed ;
|
|
+
|
|
+
|
|
+#else
|
|
+ /* Physical Address. */
|
|
+struct PHYS_ADDR {
|
|
+ union {
|
|
+ struct {
|
|
+ u32 lo; /* DWORD 0 */
|
|
+ u32 hi; /* DWORD 1 */
|
|
+ } __packed; /* unnamed struct */
|
|
+ u32 dw[2]; /* dword union */
|
|
+ }; /* unnamed union */
|
|
+} __packed ;
|
|
+
|
|
+struct BE_LINK_STATUS {
|
|
+ u8 mac0_duplex;
|
|
+ u8 mac0_speed;
|
|
+ u8 mac1_duplex;
|
|
+ u8 mac1_speed;
|
|
+ u8 mgmt_mac_duplex;
|
|
+ u8 mgmt_mac_speed;
|
|
+ u8 active_port;
|
|
+ u8 rsvd0;
|
|
+ u8 mac0_fault;
|
|
+ u8 mac1_fault;
|
|
+ u16 rsvd1;
|
|
+} __packed;
|
|
+#endif
|
|
+
|
|
+struct FWCMD_COMMON_ANON_170_REQUEST {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union LINK_STATUS_QUERY_PARAMS {
|
|
+ struct BE_LINK_STATUS response;
|
|
+ struct FWCMD_COMMON_ANON_170_REQUEST request;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * Queries the the link status for all ports. The valid values below
|
|
+ * DO NOT indicate that a particular duplex or speed is supported by
|
|
+ * BladeEngine. These enumerations simply list all possible duplexes
|
|
+ * and speeds for any port. Consult BladeEngine product documentation
|
|
+ * for the supported parameters.
|
|
+ */
|
|
+struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY {
|
|
+ union FWCMD_HEADER header;
|
|
+ union LINK_STATUS_QUERY_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_171_REQUEST {
|
|
+ u8 type;
|
|
+ u8 port;
|
|
+ u8 mac1;
|
|
+ u8 permanent;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_172_RESPONSE {
|
|
+ struct MAC_ADDRESS_FORMAT mac;
|
|
+} __packed;
|
|
+
|
|
+union NTWK_MAC_QUERY_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_171_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_172_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/* Queries one MAC address. */
|
|
+struct FWCMD_COMMON_NTWK_MAC_QUERY {
|
|
+ union FWCMD_HEADER header;
|
|
+ union NTWK_MAC_QUERY_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct MAC_SET_PARAMS_IN {
|
|
+ u8 type;
|
|
+ u8 port;
|
|
+ u8 mac1;
|
|
+ u8 invalidate;
|
|
+ struct MAC_ADDRESS_FORMAT mac;
|
|
+} __packed;
|
|
+
|
|
+struct MAC_SET_PARAMS_OUT {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union MAC_SET_PARAMS {
|
|
+ struct MAC_SET_PARAMS_IN request;
|
|
+ struct MAC_SET_PARAMS_OUT response;
|
|
+} __packed;
|
|
+
|
|
+/* Sets a MAC address. */
|
|
+struct FWCMD_COMMON_NTWK_MAC_SET {
|
|
+ union FWCMD_HEADER header;
|
|
+ union MAC_SET_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+/* MAC address list. */
|
|
+struct NTWK_MULTICAST_MAC_LIST {
|
|
+ u8 byte[6];
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_NTWK_MULTICAST_SET_REQUEST_PAYLOAD {
|
|
+ u16 num_mac;
|
|
+ u8 promiscuous;
|
|
+ u8 rsvd0;
|
|
+ struct NTWK_MULTICAST_MAC_LIST mac[32];
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_174_RESPONSE {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_173_PARAMS {
|
|
+ struct FWCMD_COMMON_NTWK_MULTICAST_SET_REQUEST_PAYLOAD request;
|
|
+ struct FWCMD_COMMON_ANON_174_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * Sets multicast address hash. The MPU will merge the MAC address lists
|
|
+ * from all clients, including the networking and storage functions.
|
|
+ * This command may fail if the final merged list of MAC addresses exceeds
|
|
+ * 32 entries.
|
|
+ */
|
|
+struct FWCMD_COMMON_NTWK_MULTICAST_SET {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_173_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_NTWK_VLAN_CONFIG_REQUEST_PAYLOAD {
|
|
+ u16 num_vlan;
|
|
+ u8 promiscuous;
|
|
+ u8 rsvd0;
|
|
+ u16 vlan_tag[32];
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_176_RESPONSE {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_175_PARAMS {
|
|
+ struct FWCMD_COMMON_NTWK_VLAN_CONFIG_REQUEST_PAYLOAD request;
|
|
+ struct FWCMD_COMMON_ANON_176_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * Sets VLAN tag filter. The MPU will merge the VLAN tag list from all
|
|
+ * clients, including the networking and storage functions. This command
|
|
+ * may fail if the final vlan_tag array (from all functions) is longer
|
|
+ * than 32 entries.
|
|
+ */
|
|
+struct FWCMD_COMMON_NTWK_VLAN_CONFIG {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_175_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct RING_DESTROY_REQUEST {
|
|
+ u16 ring_type;
|
|
+ u16 id;
|
|
+ u8 bypass_flush;
|
|
+ u8 rsvd0;
|
|
+ u16 rsvd1;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_190_RESPONSE {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_189_PARAMS {
|
|
+ struct RING_DESTROY_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_190_RESPONSE response;
|
|
+} __packed;
|
|
+/*
|
|
+ * Command for destroying any ring. The connection(s) using the ring should
|
|
+ * be quiesced before destroying the ring.
|
|
+ */
|
|
+struct FWCMD_COMMON_RING_DESTROY {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_189_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_192_REQUEST {
|
|
+ u16 num_pages;
|
|
+ u16 rsvd0;
|
|
+ struct CQ_CONTEXT_AMAP context;
|
|
+ struct PHYS_ADDR pages[4];
|
|
+} __packed ;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_193_RESPONSE {
|
|
+ u16 cq_id;
|
|
+} __packed ;
|
|
+
|
|
+union FWCMD_COMMON_ANON_191_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_192_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_193_RESPONSE response;
|
|
+} __packed ;
|
|
+
|
|
+/*
|
|
+ * Command for creating a completion queue. A Completion Queue must span
|
|
+ * at least 1 page and at most 4 pages. Each completion queue entry
|
|
+ * is 16 bytes regardless of CQ entry format. Thus the ring must be
|
|
+ * at least 256 entries deep (corresponding to 1 page) and can be at
|
|
+ * most 1024 entries deep (corresponding to 4 pages). The number of
|
|
+ * pages posted must contain the CQ ring size as encoded in the context.
|
|
+ *
|
|
+ */
|
|
+struct FWCMD_COMMON_CQ_CREATE {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_191_PARAMS params;
|
|
+} __packed ;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_198_REQUEST {
|
|
+ u16 num_pages;
|
|
+ u16 rsvd0;
|
|
+ struct EQ_CONTEXT_AMAP context;
|
|
+ struct PHYS_ADDR pages[8];
|
|
+} __packed ;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_199_RESPONSE {
|
|
+ u16 eq_id;
|
|
+} __packed ;
|
|
+
|
|
+union FWCMD_COMMON_ANON_197_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_198_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_199_RESPONSE response;
|
|
+} __packed ;
|
|
+
|
|
+/*
|
|
+ * Command for creating a event queue. An Event Queue must span at least
|
|
+ * 1 page and at most 8 pages. The number of pages posted must contain
|
|
+ * the EQ ring. The ring is defined by the size of the EQ entries (encoded
|
|
+ * in the context) and the number of EQ entries (also encoded in the
|
|
+ * context).
|
|
+ */
|
|
+struct FWCMD_COMMON_EQ_CREATE {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_197_PARAMS params;
|
|
+} __packed ;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_201_REQUEST {
|
|
+ u16 cq_id;
|
|
+ u16 bcmc_cq_id;
|
|
+ u16 num_pages;
|
|
+ u16 rsvd0;
|
|
+ struct PHYS_ADDR pages[2];
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_202_RESPONSE {
|
|
+ u16 id;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_200_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_201_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_202_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * Command for creating Ethernet receive ring. An ERX ring contains ETH_RX_D
|
|
+ * entries (8 bytes each). An ERX ring must be 1024 entries deep
|
|
+ * (corresponding to 2 pages).
|
|
+ */
|
|
+struct FWCMD_COMMON_ETH_RX_CREATE {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_200_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_204_REQUEST {
|
|
+ u16 num_pages;
|
|
+ u8 ulp_num;
|
|
+ u8 type;
|
|
+ struct ETX_CONTEXT_AMAP context;
|
|
+ struct PHYS_ADDR pages[8];
|
|
+} __packed ;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_205_RESPONSE {
|
|
+ u16 cid;
|
|
+ u8 ulp_num;
|
|
+ u8 rsvd0;
|
|
+} __packed ;
|
|
+
|
|
+union FWCMD_COMMON_ANON_203_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_204_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_205_RESPONSE response;
|
|
+} __packed ;
|
|
+
|
|
+/*
|
|
+ * Command for creating an Ethernet transmit ring. An ETX ring contains
|
|
+ * ETH_WRB entries (16 bytes each). An ETX ring must be at least 256
|
|
+ * entries deep (corresponding to 1 page) and at most 2k entries deep
|
|
+ * (corresponding to 8 pages).
|
|
+ */
|
|
+struct FWCMD_COMMON_ETH_TX_CREATE {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_203_PARAMS params;
|
|
+} __packed ;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_222_REQUEST {
|
|
+ u16 num_pages;
|
|
+ u16 rsvd0;
|
|
+ struct MCC_RING_CONTEXT_AMAP context;
|
|
+ struct PHYS_ADDR pages[8];
|
|
+} __packed ;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_223_RESPONSE {
|
|
+ u16 id;
|
|
+} __packed ;
|
|
+
|
|
+union FWCMD_COMMON_ANON_221_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_222_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_223_RESPONSE response;
|
|
+} __packed ;
|
|
+
|
|
+/*
|
|
+ * Command for creating the MCC ring. An MCC ring must be at least 16
|
|
+ * entries deep (corresponding to 1 page) and at most 128 entries deep
|
|
+ * (corresponding to 8 pages).
|
|
+ */
|
|
+struct FWCMD_COMMON_MCC_CREATE {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_221_PARAMS params;
|
|
+} __packed ;
|
|
+
|
|
+struct GET_QOS_IN {
|
|
+ u32 qos_params_rsvd;
|
|
+} __packed;
|
|
+
|
|
+struct GET_QOS_OUT {
|
|
+ u32 max_bits_per_second_NIC;
|
|
+ u32 max_packets_per_second_NIC;
|
|
+ u32 max_ios_per_second_iSCSI;
|
|
+ u32 max_bytes_per_second_iSCSI;
|
|
+ u16 domain_VLAN_tag;
|
|
+ u16 fabric_domain_ID;
|
|
+ u32 qos_params_oem[4];
|
|
+} __packed;
|
|
+
|
|
+union GET_QOS_PARAMS {
|
|
+ struct GET_QOS_IN request;
|
|
+ struct GET_QOS_OUT response;
|
|
+} __packed;
|
|
+
|
|
+/* QOS/Bandwidth settings per domain. Applicable only in VMs. */
|
|
+struct FWCMD_COMMON_GET_QOS {
|
|
+ union FWCMD_HEADER header;
|
|
+ union GET_QOS_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct SET_QOS_IN {
|
|
+ u32 valid_flags;
|
|
+ u32 max_bits_per_second_NIC;
|
|
+ u32 max_packets_per_second_NIC;
|
|
+ u32 max_ios_per_second_iSCSI;
|
|
+ u32 max_bytes_per_second_iSCSI;
|
|
+ u16 domain_VLAN_tag;
|
|
+ u16 fabric_domain_ID;
|
|
+ u32 qos_params_oem[4];
|
|
+} __packed;
|
|
+
|
|
+struct SET_QOS_OUT {
|
|
+ u32 qos_params_rsvd;
|
|
+} __packed;
|
|
+
|
|
+union SET_QOS_PARAMS {
|
|
+ struct SET_QOS_IN request;
|
|
+ struct SET_QOS_OUT response;
|
|
+} __packed;
|
|
+
|
|
+/* QOS/Bandwidth settings per domain. Applicable only in VMs. */
|
|
+struct FWCMD_COMMON_SET_QOS {
|
|
+ union FWCMD_HEADER header;
|
|
+ union SET_QOS_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct SET_FRAME_SIZE_IN {
|
|
+ u32 max_tx_frame_size;
|
|
+ u32 max_rx_frame_size;
|
|
+} __packed;
|
|
+
|
|
+struct SET_FRAME_SIZE_OUT {
|
|
+ u32 chip_max_tx_frame_size;
|
|
+ u32 chip_max_rx_frame_size;
|
|
+} __packed;
|
|
+
|
|
+union SET_FRAME_SIZE_PARAMS {
|
|
+ struct SET_FRAME_SIZE_IN request;
|
|
+ struct SET_FRAME_SIZE_OUT response;
|
|
+} __packed;
|
|
+
|
|
+/* Set frame size command. Only host domain may issue this command. */
|
|
+struct FWCMD_COMMON_SET_FRAME_SIZE {
|
|
+ union FWCMD_HEADER header;
|
|
+ union SET_FRAME_SIZE_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FORCE_FAILOVER_IN {
|
|
+ u32 move_to_port;
|
|
+ u32 failover_config;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_231_RESPONSE {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_230_PARAMS {
|
|
+ struct FORCE_FAILOVER_IN request;
|
|
+ struct FWCMD_COMMON_ANON_231_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * Use this command to control failover in BladeEngine. It may be used
|
|
+ * to failback to a restored port or to forcibly move traffic from
|
|
+ * one port to another. It may also be used to enable or disable the
|
|
+ * automatic failover feature. This command can only be issued by domain
|
|
+ * 0.
|
|
+ */
|
|
+struct FWCMD_COMMON_FORCE_FAILOVER {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_230_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_240_REQUEST {
|
|
+ u64 context;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_241_RESPONSE {
|
|
+ u64 context;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_239_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_240_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_241_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * This command can be used by clients as a no-operation request. Typical
|
|
+ * uses for drivers are as a heartbeat mechanism, or deferred processing
|
|
+ * catalyst. The ARM will always complete this command with a good completion.
|
|
+ * The 64-bit parameter is not touched by the ARM processor.
|
|
+ */
|
|
+struct FWCMD_COMMON_NOP {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_239_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct NTWK_RX_FILTER_SETTINGS {
|
|
+ u8 promiscuous;
|
|
+ u8 ip_cksum;
|
|
+ u8 tcp_cksum;
|
|
+ u8 udp_cksum;
|
|
+ u8 pass_err;
|
|
+ u8 pass_ckerr;
|
|
+ u8 strip_crc;
|
|
+ u8 mcast_en;
|
|
+ u8 bcast_en;
|
|
+ u8 mcast_promiscuous_en;
|
|
+ u8 unicast_en;
|
|
+ u8 vlan_promiscuous;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_242_PARAMS {
|
|
+ struct NTWK_RX_FILTER_SETTINGS request;
|
|
+ struct NTWK_RX_FILTER_SETTINGS response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * This command is used to modify the ethernet receive filter configuration.
|
|
+ * Only domain 0 network function drivers may issue this command. The
|
|
+ * applied configuration is returned in the response payload. Note:
|
|
+ * Some receive packet filter settings are global on BladeEngine and
|
|
+ * can affect both the storage and network function clients that the
|
|
+ * BladeEngine hardware and firmware serve. Additionaly, depending
|
|
+ * on the revision of BladeEngine, some ethernet receive filter settings
|
|
+ * are dependent on others. If a dependency exists between settings
|
|
+ * for the BladeEngine revision, and the command request settings do
|
|
+ * not meet the dependency requirement, the invalid settings will not
|
|
+ * be applied despite the comand succeeding. For example: a driver may
|
|
+ * request to enable broadcast packets, but not enable multicast packets.
|
|
+ * On early revisions of BladeEngine, there may be no distinction between
|
|
+ * broadcast and multicast filters, so broadcast could not be enabled
|
|
+ * without enabling multicast. In this scenario, the comand would still
|
|
+ * succeed, but the response payload would indicate the previously
|
|
+ * configured broadcast and multicast setting.
|
|
+ */
|
|
+struct FWCMD_COMMON_NTWK_RX_FILTER {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_242_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+
|
|
+struct FWCMD_COMMON_ANON_244_REQUEST {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD {
|
|
+ u8 firmware_version_string[32];
|
|
+ u8 fw_on_flash_version_string[32];
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_243_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_244_REQUEST request;
|
|
+ struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD response;
|
|
+} __packed;
|
|
+
|
|
+/* This comand retrieves the firmware version. */
|
|
+struct FWCMD_COMMON_GET_FW_VERSION {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_243_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_246_REQUEST {
|
|
+ u16 tx_flow_control;
|
|
+ u16 rx_flow_control;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_247_RESPONSE {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_245_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_246_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_247_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * This comand is used to program BladeEngine flow control behavior.
|
|
+ * Only the host networking driver is allowed to use this comand.
|
|
+ */
|
|
+struct FWCMD_COMMON_SET_FLOW_CONTROL {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_245_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_249_REQUEST {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_250_RESPONSE {
|
|
+ u16 tx_flow_control;
|
|
+ u16 rx_flow_control;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_248_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_249_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_250_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/* This comand is used to read BladeEngine flow control settings. */
|
|
+struct FWCMD_COMMON_GET_FLOW_CONTROL {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_248_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct EQ_DELAY_PARAMS {
|
|
+ u32 eq_id;
|
|
+ u32 delay_in_microseconds;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_257_REQUEST {
|
|
+ u32 num_eq;
|
|
+ u32 rsvd0;
|
|
+ struct EQ_DELAY_PARAMS delay[16];
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_258_RESPONSE {
|
|
+ u32 delay_resolution_in_microseconds;
|
|
+ u32 delay_max_in_microseconds;
|
|
+} __packed;
|
|
+
|
|
+union MODIFY_EQ_DELAY_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_257_REQUEST request;
|
|
+ struct FWCMD_COMMON_ANON_258_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/* This comand changes the EQ delay for a given set of EQs. */
|
|
+struct FWCMD_COMMON_MODIFY_EQ_DELAY {
|
|
+ union FWCMD_HEADER header;
|
|
+ union MODIFY_EQ_DELAY_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_260_REQUEST {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+struct BE_FIRMWARE_CONFIG {
|
|
+ u16 be_config_number;
|
|
+ u16 asic_revision;
|
|
+ u32 nic_ulp_mask;
|
|
+ u32 tulp_mask;
|
|
+ u32 iscsi_ulp_mask;
|
|
+ u32 rdma_ulp_mask;
|
|
+ u32 rsvd0[4];
|
|
+ u32 eth_tx_id_start;
|
|
+ u32 eth_tx_id_count;
|
|
+ u32 eth_rx_id_start;
|
|
+ u32 eth_rx_id_count;
|
|
+ u32 tpm_wrbq_id_start;
|
|
+ u32 tpm_wrbq_id_count;
|
|
+ u32 tpm_defq_id_start;
|
|
+ u32 tpm_defq_id_count;
|
|
+ u32 iscsi_wrbq_id_start;
|
|
+ u32 iscsi_wrbq_id_count;
|
|
+ u32 iscsi_defq_id_start;
|
|
+ u32 iscsi_defq_id_count;
|
|
+ u32 rdma_qp_id_start;
|
|
+ u32 rdma_qp_id_count;
|
|
+ u32 rsvd1[8];
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_259_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_260_REQUEST request;
|
|
+ struct BE_FIRMWARE_CONFIG response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * This comand queries the current firmware configuration parameters.
|
|
+ * The static configuration type is defined by be_config_number. This
|
|
+ * differentiates different BladeEngine builds, such as iSCSI Initiator
|
|
+ * versus iSCSI Target. For a given static configuration, the Upper
|
|
+ * Layer Protocol (ULP) processors may be reconfigured to support different
|
|
+ * protocols. Each ULP processor supports one or more protocols. The
|
|
+ * masks indicate which processors are configured for each protocol.
|
|
+ * For a given static configuration, the number of TCP connections
|
|
+ * supported for each protocol may vary. The *_id_start and *_id_count
|
|
+ * variables define a linear range of IDs that are available for each
|
|
+ * supported protocol. The *_id_count may be used by the driver to allocate
|
|
+ * the appropriate number of connection resources. The *_id_start may
|
|
+ * be used to map the arbitrary range of IDs to a zero-based range
|
|
+ * of indices.
|
|
+ */
|
|
+struct FWCMD_COMMON_FIRMWARE_CONFIG {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_259_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS {
|
|
+ u32 emph_lev_sel_port0;
|
|
+ u32 emph_lev_sel_port1;
|
|
+ u8 xaui_vo_sel;
|
|
+ u8 xaui_state;
|
|
+ u16 rsvd0;
|
|
+ u32 xaui_eq_vector;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_262_REQUEST {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_261_PARAMS {
|
|
+ struct FWCMD_COMMON_ANON_262_REQUEST request;
|
|
+ struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * This comand can be used to read XAUI equalization parameters. The
|
|
+ * ARM firmware applies default equalization parameters during initialization.
|
|
+ * These parameters may be customer-specific when derived from the
|
|
+ * SEEPROM. See SEEPROM_DATA for equalization specific fields.
|
|
+ */
|
|
+struct FWCMD_COMMON_GET_PORT_EQUALIZATION {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_261_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_COMMON_ANON_264_RESPONSE {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_COMMON_ANON_263_PARAMS {
|
|
+ struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS request;
|
|
+ struct FWCMD_COMMON_ANON_264_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * This comand can be used to set XAUI equalization parameters. The ARM
|
|
+ * firmware applies default equalization parameters during initialization.
|
|
+ * These parameters may be customer-specific when derived from the
|
|
+ * SEEPROM. See SEEPROM_DATA for equalization specific fields.
|
|
+ */
|
|
+struct FWCMD_COMMON_SET_PORT_EQUALIZATION {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_COMMON_ANON_263_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+#endif /* __fwcmd_common_bmap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_common.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_common.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_common.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_common.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,222 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __fwcmd_common_amap_h__
|
|
+#define __fwcmd_common_amap_h__
|
|
+#include "host_struct.h"
|
|
+
|
|
+/* --- PHY_LINK_DUPLEX_ENUM --- */
|
|
+#define PHY_LINK_DUPLEX_NONE (0)
|
|
+#define PHY_LINK_DUPLEX_HALF (1)
|
|
+#define PHY_LINK_DUPLEX_FULL (2)
|
|
+
|
|
+/* --- PHY_LINK_SPEED_ENUM --- */
|
|
+#define PHY_LINK_SPEED_ZERO (0) /* No link. */
|
|
+#define PHY_LINK_SPEED_10MBPS (1) /* 10 Mbps */
|
|
+#define PHY_LINK_SPEED_100MBPS (2) /* 100 Mbps */
|
|
+#define PHY_LINK_SPEED_1GBPS (3) /* 1 Gbps */
|
|
+#define PHY_LINK_SPEED_10GBPS (4) /* 10 Gbps */
|
|
+
|
|
+/* --- PHY_LINK_FAULT_ENUM --- */
|
|
+#define PHY_LINK_FAULT_NONE (0) /* No fault status
|
|
+ available or detected */
|
|
+#define PHY_LINK_FAULT_LOCAL (1) /* Local fault detected */
|
|
+#define PHY_LINK_FAULT_REMOTE (2) /* Remote fault detected */
|
|
+
|
|
+/* --- BE_ULP_MASK --- */
|
|
+#define BE_ULP0_MASK (1)
|
|
+#define BE_ULP1_MASK (2)
|
|
+#define BE_ULP2_MASK (4)
|
|
+
|
|
+/* --- NTWK_ACTIVE_PORT --- */
|
|
+#define NTWK_PORT_A (0) /* Port A is currently active */
|
|
+#define NTWK_PORT_B (1) /* Port B is currently active */
|
|
+#define NTWK_NO_ACTIVE_PORT (15) /* Both ports have lost link */
|
|
+
|
|
+/* --- NTWK_LINK_TYPE --- */
|
|
+#define NTWK_LINK_TYPE_PHYSICAL (0) /* link up/down event
|
|
+ applies to BladeEngine's
|
|
+ Physical Ports
|
|
+ */
|
|
+#define NTWK_LINK_TYPE_VIRTUAL (1) /* Virtual link up/down event
|
|
+ reported by BladeExchange.
|
|
+ This applies only when the
|
|
+ VLD feature is enabled
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * --- FWCMD_MAC_TYPE_ENUM ---
|
|
+ * This enum defines the types of MAC addresses in the RXF MAC Address Table.
|
|
+ */
|
|
+#define MAC_ADDRESS_TYPE_STORAGE (0) /* Storage MAC Address */
|
|
+#define MAC_ADDRESS_TYPE_NETWORK (1) /* Network MAC Address */
|
|
+#define MAC_ADDRESS_TYPE_PD (2) /* Protection Domain MAC Addr */
|
|
+#define MAC_ADDRESS_TYPE_MANAGEMENT (3) /* Managment MAC Address */
|
|
+
|
|
+
|
|
+/* --- FWCMD_RING_TYPE_ENUM --- */
|
|
+#define FWCMD_RING_TYPE_ETH_RX (1) /* Ring created with */
|
|
+ /* FWCMD_COMMON_ETH_RX_CREATE. */
|
|
+#define FWCMD_RING_TYPE_ETH_TX (2) /* Ring created with */
|
|
+ /* FWCMD_COMMON_ETH_TX_CREATE. */
|
|
+#define FWCMD_RING_TYPE_ISCSI_WRBQ (3) /* Ring created with */
|
|
+ /* FWCMD_COMMON_ISCSI_WRBQ_CREATE. */
|
|
+#define FWCMD_RING_TYPE_ISCSI_DEFQ (4) /* Ring created with */
|
|
+ /* FWCMD_COMMON_ISCSI_DEFQ_CREATE. */
|
|
+#define FWCMD_RING_TYPE_TPM_WRBQ (5) /* Ring created with */
|
|
+ /* FWCMD_COMMON_TPM_WRBQ_CREATE. */
|
|
+#define FWCMD_RING_TYPE_TPM_DEFQ (6) /* Ring created with */
|
|
+ /* FWCMD_COMMONTPM_TDEFQ_CREATE. */
|
|
+#define FWCMD_RING_TYPE_TPM_RQ (7) /* Ring created with */
|
|
+ /* FWCMD_COMMON_TPM_RQ_CREATE. */
|
|
+#define FWCMD_RING_TYPE_MCC (8) /* Ring created with */
|
|
+ /* FWCMD_COMMON_MCC_CREATE. */
|
|
+#define FWCMD_RING_TYPE_CQ (9) /* Ring created with */
|
|
+ /* FWCMD_COMMON_CQ_CREATE. */
|
|
+#define FWCMD_RING_TYPE_EQ (10) /* Ring created with */
|
|
+ /* FWCMD_COMMON_EQ_CREATE. */
|
|
+#define FWCMD_RING_TYPE_QP (11) /* Ring created with */
|
|
+ /* FWCMD_RDMA_QP_CREATE. */
|
|
+
|
|
+
|
|
+/* --- ETH_TX_RING_TYPE_ENUM --- */
|
|
+#define ETH_TX_RING_TYPE_FORWARDING (1) /* Ethernet ring for
|
|
+ forwarding packets */
|
|
+#define ETH_TX_RING_TYPE_STANDARD (2) /* Ethernet ring for sending
|
|
+ network packets. */
|
|
+#define ETH_TX_RING_TYPE_BOUND (3) /* Ethernet ring bound to the
|
|
+ port specified in the command
|
|
+ header.port_number field.
|
|
+ Rings of this type are
|
|
+ NOT subject to the
|
|
+ failover logic implemented
|
|
+ in the BladeEngine.
|
|
+ */
|
|
+
|
|
+/* --- FWCMD_COMMON_QOS_TYPE_ENUM --- */
|
|
+#define QOS_BITS_NIC (1) /* max_bits_per_second_NIC */
|
|
+ /* field is valid. */
|
|
+#define QOS_PKTS_NIC (2) /* max_packets_per_second_NIC */
|
|
+ /* field is valid. */
|
|
+#define QOS_IOPS_ISCSI (4) /* max_ios_per_second_iSCSI */
|
|
+ /*field is valid. */
|
|
+#define QOS_VLAN_TAG (8) /* domain_VLAN_tag field
|
|
+ is valid. */
|
|
+#define QOS_FABRIC_ID (16) /* fabric_domain_ID field
|
|
+ is valid. */
|
|
+#define QOS_OEM_PARAMS (32) /* qos_params_oem field
|
|
+ is valid. */
|
|
+#define QOS_TPUT_ISCSI (64) /* max_bytes_per_second_iSCSI
|
|
+ field is valid. */
|
|
+
|
|
+
|
|
+/*
|
|
+ * --- FAILOVER_CONFIG_ENUM ---
|
|
+ * Failover configuration setting used in FWCMD_COMMON_FORCE_FAILOVER
|
|
+ */
|
|
+#define FAILOVER_CONFIG_NO_CHANGE (0) /* No change to automatic */
|
|
+ /* port failover setting. */
|
|
+#define FAILOVER_CONFIG_ON (1) /* Automatic port failover
|
|
+ on link down is enabled. */
|
|
+#define FAILOVER_CONFIG_OFF (2) /* Automatic port failover
|
|
+ on link down is disabled. */
|
|
+
|
|
+/*
|
|
+ * --- FAILOVER_PORT_ENUM ---
|
|
+ * Failover port setting used in FWCMD_COMMON_FORCE_FAILOVER
|
|
+ */
|
|
+#define FAILOVER_PORT_A (0) /* Selects port A. */
|
|
+#define FAILOVER_PORT_B (1) /* Selects port B. */
|
|
+#define FAILOVER_PORT_NONE (15) /* No port change requested. */
|
|
+
|
|
+
|
|
+/*
|
|
+ * --- MGMT_FLASHROM_OPCODE ---
|
|
+ * Flash ROM operation code
|
|
+ */
|
|
+#define MGMT_FLASHROM_OPCODE_FLASH (1) /* Commit downloaded data
|
|
+ to Flash ROM */
|
|
+#define MGMT_FLASHROM_OPCODE_SAVE (2) /* Save downloaded data to
|
|
+ ARM's DDR - do not flash */
|
|
+#define MGMT_FLASHROM_OPCODE_CLEAR (3) /* Erase specified component
|
|
+ from FlashROM */
|
|
+#define MGMT_FLASHROM_OPCODE_REPORT (4) /* Read specified component
|
|
+ from Flash ROM */
|
|
+#define MGMT_FLASHROM_OPCODE_IMAGE_INFO (5) /* Returns size of a
|
|
+ component */
|
|
+
|
|
+/*
|
|
+ * --- MGMT_FLASHROM_OPTYPE ---
|
|
+ * Flash ROM operation type
|
|
+ */
|
|
+#define MGMT_FLASHROM_OPTYPE_CODE_FIRMWARE (0) /* Includes ARM firmware,
|
|
+ IPSec (optional) and EP
|
|
+ firmware */
|
|
+#define MGMT_FLASHROM_OPTYPE_CODE_REDBOOT (1)
|
|
+#define MGMT_FLASHROM_OPTYPE_CODE_BIOS (2)
|
|
+#define MGMT_FLASHROM_OPTYPE_CODE_PXE_BIOS (3)
|
|
+#define MGMT_FLASHROM_OPTYPE_CODE_CTRLS (4)
|
|
+#define MGMT_FLASHROM_OPTYPE_CFG_IPSEC (5)
|
|
+#define MGMT_FLASHROM_OPTYPE_CFG_INI (6)
|
|
+#define MGMT_FLASHROM_OPTYPE_ROM_OFFSET_SPECIFIED (7)
|
|
+
|
|
+/*
|
|
+ * --- FLASHROM_TYPE ---
|
|
+ * Flash ROM manufacturers supported in the f/w
|
|
+ */
|
|
+#define INTEL (0)
|
|
+#define SPANSION (1)
|
|
+#define MICRON (2)
|
|
+
|
|
+/* --- DDR_CAS_TYPE --- */
|
|
+#define CAS_3 (0)
|
|
+#define CAS_4 (1)
|
|
+#define CAS_5 (2)
|
|
+
|
|
+/* --- DDR_SIZE_TYPE --- */
|
|
+#define SIZE_256MB (0)
|
|
+#define SIZE_512MB (1)
|
|
+
|
|
+/* --- DDR_MODE_TYPE --- */
|
|
+#define DDR_NO_ECC (0)
|
|
+#define DDR_ECC (1)
|
|
+
|
|
+/* --- INTERFACE_10GB_TYPE --- */
|
|
+#define CX4_TYPE (0)
|
|
+#define XFP_TYPE (1)
|
|
+
|
|
+/* --- BE_CHIP_MAX_MTU --- */
|
|
+#define CHIP_MAX_MTU (9000)
|
|
+
|
|
+/* --- XAUI_STATE_ENUM --- */
|
|
+#define XAUI_STATE_ENABLE (0) /* This MUST be the default
|
|
+ value for all requests
|
|
+ which set/change
|
|
+ equalization parameter. */
|
|
+#define XAUI_STATE_DISABLE (255) /* The XAUI for both ports
|
|
+ may be disabled for EMI
|
|
+ tests. There is no
|
|
+ provision for turning off
|
|
+ individual ports.
|
|
+ */
|
|
+/* --- BE_ASIC_REVISION --- */
|
|
+#define BE_ASIC_REV_A0 (1)
|
|
+#define BE_ASIC_REV_A1 (2)
|
|
+
|
|
+#endif /* __fwcmd_common_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_eth_bmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_eth_bmap.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_eth_bmap.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_eth_bmap.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,280 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __fwcmd_eth_bmap_h__
|
|
+#define __fwcmd_eth_bmap_h__
|
|
+#include "fwcmd_hdr_bmap.h"
|
|
+#include "fwcmd_types_bmap.h"
|
|
+
|
|
+struct MIB_ETH_STATISTICS_PARAMS_IN {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+struct BE_RXF_STATS {
|
|
+ u32 p0recvdtotalbytesLSD; /* DWORD 0 */
|
|
+ u32 p0recvdtotalbytesMSD; /* DWORD 1 */
|
|
+ u32 p0recvdtotalframes; /* DWORD 2 */
|
|
+ u32 p0recvdunicastframes; /* DWORD 3 */
|
|
+ u32 p0recvdmulticastframes; /* DWORD 4 */
|
|
+ u32 p0recvdbroadcastframes; /* DWORD 5 */
|
|
+ u32 p0crcerrors; /* DWORD 6 */
|
|
+ u32 p0alignmentsymerrs; /* DWORD 7 */
|
|
+ u32 p0pauseframesrecvd; /* DWORD 8 */
|
|
+ u32 p0controlframesrecvd; /* DWORD 9 */
|
|
+ u32 p0inrangelenerrors; /* DWORD 10 */
|
|
+ u32 p0outrangeerrors; /* DWORD 11 */
|
|
+ u32 p0frametoolongerrors; /* DWORD 12 */
|
|
+ u32 p0droppedaddressmatch; /* DWORD 13 */
|
|
+ u32 p0droppedvlanmismatch; /* DWORD 14 */
|
|
+ u32 p0ipdroppedtoosmall; /* DWORD 15 */
|
|
+ u32 p0ipdroppedtooshort; /* DWORD 16 */
|
|
+ u32 p0ipdroppedhdrtoosmall; /* DWORD 17 */
|
|
+ u32 p0tcpdroppedlen; /* DWORD 18 */
|
|
+ u32 p0droppedrunt; /* DWORD 19 */
|
|
+ u32 p0recvd64; /* DWORD 20 */
|
|
+ u32 p0recvd65_127; /* DWORD 21 */
|
|
+ u32 p0recvd128_256; /* DWORD 22 */
|
|
+ u32 p0recvd256_511; /* DWORD 23 */
|
|
+ u32 p0recvd512_1023; /* DWORD 24 */
|
|
+ u32 p0recvd1518_1522; /* DWORD 25 */
|
|
+ u32 p0recvd1522_2047; /* DWORD 26 */
|
|
+ u32 p0recvd2048_4095; /* DWORD 27 */
|
|
+ u32 p0recvd4096_8191; /* DWORD 28 */
|
|
+ u32 p0recvd8192_9216; /* DWORD 29 */
|
|
+ u32 p0rcvdipcksmerrs; /* DWORD 30 */
|
|
+ u32 p0recvdtcpcksmerrs; /* DWORD 31 */
|
|
+ u32 p0recvdudpcksmerrs; /* DWORD 32 */
|
|
+ u32 p0recvdnonrsspackets; /* DWORD 33 */
|
|
+ u32 p0recvdippackets; /* DWORD 34 */
|
|
+ u32 p0recvdchute1packets; /* DWORD 35 */
|
|
+ u32 p0recvdchute2packets; /* DWORD 36 */
|
|
+ u32 p0recvdchute3packets; /* DWORD 37 */
|
|
+ u32 p0recvdipsecpackets; /* DWORD 38 */
|
|
+ u32 p0recvdmanagementpackets; /* DWORD 39 */
|
|
+ u32 p0xmitbyteslsd; /* DWORD 40 */
|
|
+ u32 p0xmitbytesmsd; /* DWORD 41 */
|
|
+ u32 p0xmitunicastframes; /* DWORD 42 */
|
|
+ u32 p0xmitmulticastframes; /* DWORD 43 */
|
|
+ u32 p0xmitbroadcastframes; /* DWORD 44 */
|
|
+ u32 p0xmitpauseframes; /* DWORD 45 */
|
|
+ u32 p0xmitcontrolframes; /* DWORD 46 */
|
|
+ u32 p0xmit64; /* DWORD 47 */
|
|
+ u32 p0xmit65_127; /* DWORD 48 */
|
|
+ u32 p0xmit128_256; /* DWORD 49 */
|
|
+ u32 p0xmit256_511; /* DWORD 50 */
|
|
+ u32 p0xmit512_1023; /* DWORD 51 */
|
|
+ u32 p0xmit1518_1522; /* DWORD 52 */
|
|
+ u32 p0xmit1522_2047; /* DWORD 53 */
|
|
+ u32 p0xmit2048_4095; /* DWORD 54 */
|
|
+ u32 p0xmit4096_8191; /* DWORD 55 */
|
|
+ u32 p0xmit8192_9216; /* DWORD 56 */
|
|
+ u32 p0rxfifooverflowdropped; /* DWORD 57 */
|
|
+ u32 p0ipseclookupfaileddropped; /* DWORD 58 */
|
|
+ u32 p1recvdtotalbytesLSD; /* DWORD 59 */
|
|
+ u32 p1recvdtotalbytesMSD; /* DWORD 60 */
|
|
+ u32 p1recvdtotalframes; /* DWORD 61 */
|
|
+ u32 p1recvdunicastframes; /* DWORD 62 */
|
|
+ u32 p1recvdmulticastframes; /* DWORD 63 */
|
|
+ u32 p1recvdbroadcastframes; /* DWORD 64 */
|
|
+ u32 p1crcerrors; /* DWORD 65 */
|
|
+ u32 p1alignmentsymerrs; /* DWORD 66 */
|
|
+ u32 p1pauseframesrecvd; /* DWORD 67 */
|
|
+ u32 p1controlframesrecvd; /* DWORD 68 */
|
|
+ u32 p1inrangelenerrors; /* DWORD 69 */
|
|
+ u32 p1outrangeerrors; /* DWORD 70 */
|
|
+ u32 p1frametoolongerrors; /* DWORD 71 */
|
|
+ u32 p1droppedaddressmatch; /* DWORD 72 */
|
|
+ u32 p1droppedvlanmismatch; /* DWORD 73 */
|
|
+ u32 p1ipdroppedtoosmall; /* DWORD 74 */
|
|
+ u32 p1ipdroppedtooshort; /* DWORD 75 */
|
|
+ u32 p1ipdroppedhdrtoosmall; /* DWORD 76 */
|
|
+ u32 p1tcpdroppedlen; /* DWORD 77 */
|
|
+ u32 p1droppedrunt; /* DWORD 78 */
|
|
+ u32 p1recvd64; /* DWORD 79 */
|
|
+ u32 p1recvd65_127; /* DWORD 80 */
|
|
+ u32 p1recvd128_256; /* DWORD 81 */
|
|
+ u32 p1recvd256_511; /* DWORD 82 */
|
|
+ u32 p1recvd512_1023; /* DWORD 83 */
|
|
+ u32 p1recvd1518_1522; /* DWORD 84 */
|
|
+ u32 p1recvd1522_2047; /* DWORD 85 */
|
|
+ u32 p1recvd2048_4095; /* DWORD 86 */
|
|
+ u32 p1recvd4096_8191; /* DWORD 87 */
|
|
+ u32 p1recvd8192_9216; /* DWORD 88 */
|
|
+ u32 p1rcvdipcksmerrs; /* DWORD 89 */
|
|
+ u32 p1recvdtcpcksmerrs; /* DWORD 90 */
|
|
+ u32 p1recvdudpcksmerrs; /* DWORD 91 */
|
|
+ u32 p1recvdnonrsspackets; /* DWORD 92 */
|
|
+ u32 p1recvdippackets; /* DWORD 93 */
|
|
+ u32 p1recvdchute1packets; /* DWORD 94 */
|
|
+ u32 p1recvdchute2packets; /* DWORD 95 */
|
|
+ u32 p1recvdchute3packets; /* DWORD 96 */
|
|
+ u32 p1recvdipsecpackets; /* DWORD 97 */
|
|
+ u32 p1recvdmanagementpackets; /* DWORD 98 */
|
|
+ u32 p1xmitbyteslsd; /* DWORD 99 */
|
|
+ u32 p1xmitbytesmsd; /* DWORD 100 */
|
|
+ u32 p1xmitunicastframes; /* DWORD 101 */
|
|
+ u32 p1xmitmulticastframes; /* DWORD 102 */
|
|
+ u32 p1xmitbroadcastframes; /* DWORD 103 */
|
|
+ u32 p1xmitpauseframes; /* DWORD 104 */
|
|
+ u32 p1xmitcontrolframes; /* DWORD 105 */
|
|
+ u32 p1xmit64; /* DWORD 106 */
|
|
+ u32 p1xmit65_127; /* DWORD 107 */
|
|
+ u32 p1xmit128_256; /* DWORD 108 */
|
|
+ u32 p1xmit256_511; /* DWORD 109 */
|
|
+ u32 p1xmit512_1023; /* DWORD 110 */
|
|
+ u32 p1xmit1518_1522; /* DWORD 111 */
|
|
+ u32 p1xmit1522_2047; /* DWORD 112 */
|
|
+ u32 p1xmit2048_4095; /* DWORD 113 */
|
|
+ u32 p1xmit4096_8191; /* DWORD 114 */
|
|
+ u32 p1xmit8192_9216; /* DWORD 115 */
|
|
+ u32 p1rxfifooverflowdropped; /* DWORD 116 */
|
|
+ u32 p1ipseclookupfaileddropped; /* DWORD 117 */
|
|
+ u32 pxdroppednopbuf; /* DWORD 118 */
|
|
+ u32 pxdroppednotxpb; /* DWORD 119 */
|
|
+ u32 pxdroppednoipsecbuf; /* DWORD 120 */
|
|
+ u32 pxdroppednoerxdescr; /* DWORD 121 */
|
|
+ u32 pxdroppednotpredescr; /* DWORD 122 */
|
|
+ u32 pxrecvdmanagementportpackets; /* DWORD 123 */
|
|
+ u32 pxrecvdmanagementportbytes; /* DWORD 124 */
|
|
+ u32 pxrecvdmanagementportpauseframes; /* DWORD 125 */
|
|
+ u32 pxrecvdmanagementporterrors; /* DWORD 126 */
|
|
+ u32 pxxmitmanagementportpackets; /* DWORD 127 */
|
|
+ u32 pxxmitmanagementportbytes; /* DWORD 128 */
|
|
+ u32 pxxmitmanagementportpause; /* DWORD 129 */
|
|
+ u32 pxxmitmanagementportrxfifooverflow; /* DWORD 130 */
|
|
+ u32 pxrecvdipsecipcksmerrs; /* DWORD 131 */
|
|
+ u32 pxrecvdtcpsecipcksmerrs; /* DWORD 132 */
|
|
+ u32 pxrecvdudpsecipcksmerrs; /* DWORD 133 */
|
|
+ u32 pxipsecrunt; /* DWORD 134 */
|
|
+ u32 pxipsecaddressmismatchdropped; /* DWORD 135 */
|
|
+ u32 pxipsecrxfifooverflowdropped; /* DWORD 136 */
|
|
+ u32 pxipsecframestoolong; /* DWORD 137 */
|
|
+ u32 pxipsectotalipframes; /* DWORD 138 */
|
|
+ u32 pxipseciptoosmall; /* DWORD 139 */
|
|
+ u32 pxipseciptooshort; /* DWORD 140 */
|
|
+ u32 pxipseciphdrtoosmall; /* DWORD 141 */
|
|
+ u32 pxipsectcphdrbad; /* DWORD 142 */
|
|
+ u32 pxrecvdipsecchute1; /* DWORD 143 */
|
|
+ u32 pxrecvdipsecchute2; /* DWORD 144 */
|
|
+ u32 pxrecvdipsecchute3; /* DWORD 145 */
|
|
+ u32 pxdropped7frags; /* DWORD 146 */
|
|
+ u32 pxdroppedfrags; /* DWORD 147 */
|
|
+ u32 pxdroppedinvalidfragring; /* DWORD 148 */
|
|
+ u32 pxnumforwardedpackets; /* DWORD 149 */
|
|
+} __packed;
|
|
+
|
|
+union MIB_ETH_STATISTICS_PARAMS {
|
|
+ struct MIB_ETH_STATISTICS_PARAMS_IN request;
|
|
+ struct BE_RXF_STATS response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * Query ethernet statistics. All domains may issue this command. The
|
|
+ * host domain drivers may optionally reset internal statistic counters
|
|
+ * with a query.
|
|
+ */
|
|
+struct FWCMD_ETH_GET_STATISTICS {
|
|
+ union FWCMD_HEADER header;
|
|
+ union MIB_ETH_STATISTICS_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+
|
|
+struct FWCMD_ETH_ANON_175_REQUEST {
|
|
+ u8 port0_promiscuous;
|
|
+ u8 port1_promiscuous;
|
|
+ u16 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_ETH_ANON_176_RESPONSE {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_ETH_ANON_174_PARAMS {
|
|
+ struct FWCMD_ETH_ANON_175_REQUEST request;
|
|
+ struct FWCMD_ETH_ANON_176_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/* Enables/Disables promiscuous ethernet receive mode. */
|
|
+struct FWCMD_ETH_PROMISCUOUS {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_ETH_ANON_174_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_ETH_ANON_178_REQUEST {
|
|
+ u32 new_fragsize_log2;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_ETH_ANON_179_RESPONSE {
|
|
+ u32 actual_fragsize_log2;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_ETH_ANON_177_PARAMS {
|
|
+ struct FWCMD_ETH_ANON_178_REQUEST request;
|
|
+ struct FWCMD_ETH_ANON_179_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * Sets the Ethernet RX fragment size. Only host (domain 0) networking
|
|
+ * drivers may issue this command. This call will fail for non-host
|
|
+ * protection domains. In this situation the MCC CQ status will indicate
|
|
+ * a failure due to insufficient priviledges. The response should be
|
|
+ * ignored, and the driver should use the FWCMD_ETH_GET_FRAG_SIZE to
|
|
+ * query the existing ethernet receive fragment size. It must use this
|
|
+ * fragment size for all fragments in the ethernet receive ring. If
|
|
+ * the command succeeds, the driver must use the frag size indicated
|
|
+ * in the command response since the requested frag size may not be applied
|
|
+ * until the next reboot. When the requested fragsize matches the response
|
|
+ * fragsize, this indicates the request was applied immediately.
|
|
+ */
|
|
+struct FWCMD_ETH_SET_RX_FRAG_SIZE {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_ETH_ANON_177_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_ETH_ANON_181_REQUEST {
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_ETH_ANON_182_RESPONSE {
|
|
+ u32 actual_fragsize_log2;
|
|
+} __packed;
|
|
+
|
|
+union FWCMD_ETH_ANON_180_PARAMS {
|
|
+ struct FWCMD_ETH_ANON_181_REQUEST request;
|
|
+ struct FWCMD_ETH_ANON_182_RESPONSE response;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * Queries the Ethernet RX fragment size. All domains may issue this
|
|
+ * command. The driver should call this command to determine the minimum
|
|
+ * required fragment size for the ethernet RX ring buffers. Drivers
|
|
+ * may choose to use a larger size for each fragment buffer, but BladeEngine
|
|
+ * will use up to the configured minimum required fragsize in each ethernet
|
|
+ * receive fragment buffer. For example, if the ethernet receive fragment
|
|
+ * size is configured to 4kB, and a driver uses 8kB fragments, a 6kB
|
|
+ * ethernet packet received by BladeEngine will be split accross two
|
|
+ * of the driver's receive framgents (4kB in one fragment buffer, and
|
|
+ * 2kB in the subsequent fragment buffer).
|
|
+ */
|
|
+struct FWCMD_ETH_GET_RX_FRAG_SIZE {
|
|
+ union FWCMD_HEADER header;
|
|
+ union FWCMD_ETH_ANON_180_PARAMS params;
|
|
+} __packed;
|
|
+
|
|
+#endif /* __fwcmd_eth_bmap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_hdr_bmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_hdr_bmap.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_hdr_bmap.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_hdr_bmap.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,54 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __fwcmd_hdr_bmap_h__
|
|
+#define __fwcmd_hdr_bmap_h__
|
|
+
|
|
+struct FWCMD_REQUEST_HEADER {
|
|
+ u8 opcode;
|
|
+ u8 subsystem;
|
|
+ u8 port_number;
|
|
+ u8 domain;
|
|
+ u32 timeout;
|
|
+ u32 request_length;
|
|
+ u32 rsvd0;
|
|
+} __packed;
|
|
+
|
|
+struct FWCMD_RESPONSE_HEADER {
|
|
+ u8 opcode;
|
|
+ u8 subsystem;
|
|
+ u8 rsvd0;
|
|
+ u8 domain;
|
|
+ u8 status;
|
|
+ u8 additional_status;
|
|
+ u16 rsvd1;
|
|
+ u32 response_length;
|
|
+ u32 actual_response_length;
|
|
+} __packed;
|
|
+
|
|
+/*
|
|
+ * The firmware/driver overwrites the input FWCMD_REQUEST_HEADER with
|
|
+ * the output FWCMD_RESPONSE_HEADER.
|
|
+ */
|
|
+union FWCMD_HEADER {
|
|
+ struct FWCMD_REQUEST_HEADER request;
|
|
+ struct FWCMD_RESPONSE_HEADER response;
|
|
+} __packed;
|
|
+
|
|
+#endif /* __fwcmd_hdr_bmap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_mcc.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_mcc.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_mcc.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_mcc.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,94 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __fwcmd_mcc_amap_h__
|
|
+#define __fwcmd_mcc_amap_h__
|
|
+#include "fwcmd_opcodes.h"
|
|
+/*
|
|
+ * Where applicable, a WRB, may contain a list of Scatter-gather elements.
|
|
+ * Each element supports a 64 bit address and a 32bit length field.
|
|
+ */
|
|
+struct BE_MCC_SGE_AMAP {
|
|
+ u8 pa_lo[32]; /* DWORD 0 */
|
|
+ u8 pa_hi[32]; /* DWORD 1 */
|
|
+ u8 length[32]; /* DWORD 2 */
|
|
+} __packed;
|
|
+struct MCC_SGE_AMAP {
|
|
+ u32 dw[3];
|
|
+};
|
|
+/*
|
|
+ * The design of an MCC_SGE allows up to 19 elements to be embedded
|
|
+ * in a WRB, supporting 64KB data transfers (assuming a 4KB page size).
|
|
+ */
|
|
+struct BE_MCC_WRB_PAYLOAD_AMAP {
|
|
+ union {
|
|
+ struct BE_MCC_SGE_AMAP sgl[19];
|
|
+ u8 embedded[59][32]; /* DWORD 0 */
|
|
+ };
|
|
+} __packed;
|
|
+struct MCC_WRB_PAYLOAD_AMAP {
|
|
+ u32 dw[59];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * This is the structure of the MCC Command WRB for commands
|
|
+ * sent to the Management Processing Unit (MPU). See section
|
|
+ * for usage in embedded and non-embedded modes.
|
|
+ */
|
|
+struct BE_MCC_WRB_AMAP {
|
|
+ u8 embedded; /* DWORD 0 */
|
|
+ u8 rsvd0[2]; /* DWORD 0 */
|
|
+ u8 sge_count[5]; /* DWORD 0 */
|
|
+ u8 rsvd1[16]; /* DWORD 0 */
|
|
+ u8 special[8]; /* DWORD 0 */
|
|
+ u8 payload_length[32]; /* DWORD 1 */
|
|
+ u8 tag[2][32]; /* DWORD 2 */
|
|
+ u8 rsvd2[32]; /* DWORD 4 */
|
|
+ struct BE_MCC_WRB_PAYLOAD_AMAP payload;
|
|
+} __packed;
|
|
+struct MCC_WRB_AMAP {
|
|
+ u32 dw[64];
|
|
+};
|
|
+
|
|
+/* This is the structure of the MCC Completion queue entry */
|
|
+struct BE_MCC_CQ_ENTRY_AMAP {
|
|
+ u8 completion_status[16]; /* DWORD 0 */
|
|
+ u8 extended_status[16]; /* DWORD 0 */
|
|
+ u8 mcc_tag[2][32]; /* DWORD 1 */
|
|
+ u8 rsvd0[27]; /* DWORD 3 */
|
|
+ u8 consumed; /* DWORD 3 */
|
|
+ u8 completed; /* DWORD 3 */
|
|
+ u8 hpi_buffer_completion; /* DWORD 3 */
|
|
+ u8 async_event; /* DWORD 3 */
|
|
+ u8 valid; /* DWORD 3 */
|
|
+} __packed;
|
|
+struct MCC_CQ_ENTRY_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+/* Mailbox structures used by the MPU during bootstrap */
|
|
+struct BE_MCC_MAILBOX_AMAP {
|
|
+ struct BE_MCC_WRB_AMAP wrb;
|
|
+ struct BE_MCC_CQ_ENTRY_AMAP cq;
|
|
+} __packed;
|
|
+struct MCC_MAILBOX_AMAP {
|
|
+ u32 dw[68];
|
|
+};
|
|
+
|
|
+#endif /* __fwcmd_mcc_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_opcodes.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_opcodes.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_opcodes.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_opcodes.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,244 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __fwcmd_opcodes_amap_h__
|
|
+#define __fwcmd_opcodes_amap_h__
|
|
+
|
|
+/*
|
|
+ * --- FWCMD_SUBSYSTEMS ---
|
|
+ * The commands are grouped into the following subsystems. The subsystem
|
|
+ * code along with the opcode uniquely identify a particular fwcmd.
|
|
+ */
|
|
+#define FWCMD_SUBSYSTEM_RSVD (0) /* This subsystem is reserved. It is */
|
|
+ /* never used. */
|
|
+#define FWCMD_SUBSYSTEM_COMMON (1) /* CMDs in this group are common to
|
|
+ * all subsystems. See
|
|
+ * COMMON_SUBSYSTEM_OPCODES for opcodes
|
|
+ * and Common Host Configuration CMDs
|
|
+ * for the FWCMD descriptions.
|
|
+ */
|
|
+#define FWCMD_SUBSYSTEM_COMMON_ISCSI (2) /* CMDs in this group are */
|
|
+ /*
|
|
+ * common to Initiator and Target. See
|
|
+ * COMMON_ISCSI_SUBSYSTEM_OPCODES and
|
|
+ * Common iSCSI Initiator and Target
|
|
+ * CMDs for the command descriptions.
|
|
+ */
|
|
+#define FWCMD_SUBSYSTEM_ETH (3) /* This subsystem is used to
|
|
+ execute Ethernet commands. */
|
|
+
|
|
+#define FWCMD_SUBSYSTEM_TPM (4) /* This subsystem is used
|
|
+ to execute TPM commands. */
|
|
+#define FWCMD_SUBSYSTEM_PXE_UNDI (5) /* This subsystem is used
|
|
+ * to execute PXE
|
|
+ * and UNDI specific commands.
|
|
+ */
|
|
+
|
|
+#define FWCMD_SUBSYSTEM_ISCSI_INI (6) /* This subsystem is used to
|
|
+ execute ISCSI Initiator
|
|
+ specific commands.
|
|
+ */
|
|
+#define FWCMD_SUBSYSTEM_ISCSI_TGT (7) /* This subsystem is used
|
|
+ to execute iSCSI Target
|
|
+ specific commands.between
|
|
+ PTL and ARM firmware.
|
|
+ */
|
|
+#define FWCMD_SUBSYSTEM_MILI_PTL (8) /* This subsystem is used to
|
|
+ execute iSCSI Target specific
|
|
+ commands.between MILI
|
|
+ and PTL. */
|
|
+#define FWCMD_SUBSYSTEM_MILI_TMD (9) /* This subsystem is used to
|
|
+ execute iSCSI Target specific
|
|
+ commands between MILI
|
|
+ and TMD. */
|
|
+#define FWCMD_SUBSYSTEM_PROXY (11) /* This subsystem is used
|
|
+ to execute proxied commands
|
|
+ within the host at the
|
|
+ explicit request of a
|
|
+ non priviledged domain.
|
|
+ This 'subsystem' is entirely
|
|
+ virtual from the controller
|
|
+ and firmware perspective as
|
|
+ it is implemented in host
|
|
+ drivers.
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * --- COMMON_SUBSYSTEM_OPCODES ---
|
|
+ * These opcodes are common to both networking and storage PCI
|
|
+ * functions. They are used to reserve resources and configure
|
|
+ * BladeEngine. These opcodes all use the FWCMD_SUBSYSTEM_COMMON
|
|
+ * subsystem code.
|
|
+ */
|
|
+#define OPCODE_COMMON_NTWK_MAC_QUERY (1)
|
|
+#define SUBSYSTEM_COMMON_NTWK_MAC_QUERY (1)
|
|
+#define SUBSYSTEM_COMMON_NTWK_MAC_SET (1)
|
|
+#define SUBSYSTEM_COMMON_NTWK_MULTICAST_SET (1)
|
|
+#define SUBSYSTEM_COMMON_NTWK_VLAN_CONFIG (1)
|
|
+#define SUBSYSTEM_COMMON_NTWK_LINK_STATUS_QUERY (1)
|
|
+#define SUBSYSTEM_COMMON_READ_FLASHROM (1)
|
|
+#define SUBSYSTEM_COMMON_WRITE_FLASHROM (1)
|
|
+#define SUBSYSTEM_COMMON_QUERY_MAX_FWCMD_BUFFER_SIZE (1)
|
|
+#define SUBSYSTEM_COMMON_ADD_PAGE_TABLES (1)
|
|
+#define SUBSYSTEM_COMMON_REMOVE_PAGE_TABLES (1)
|
|
+#define SUBSYSTEM_COMMON_RING_DESTROY (1)
|
|
+#define SUBSYSTEM_COMMON_CQ_CREATE (1)
|
|
+#define SUBSYSTEM_COMMON_EQ_CREATE (1)
|
|
+#define SUBSYSTEM_COMMON_ETH_RX_CREATE (1)
|
|
+#define SUBSYSTEM_COMMON_ETH_TX_CREATE (1)
|
|
+#define SUBSYSTEM_COMMON_ISCSI_DEFQ_CREATE (1)
|
|
+#define SUBSYSTEM_COMMON_ISCSI_WRBQ_CREATE (1)
|
|
+#define SUBSYSTEM_COMMON_MCC_CREATE (1)
|
|
+#define SUBSYSTEM_COMMON_JELL_CONFIG (1)
|
|
+#define SUBSYSTEM_COMMON_FORCE_FAILOVER (1)
|
|
+#define SUBSYSTEM_COMMON_ADD_TEMPLATE_HEADER_BUFFERS (1)
|
|
+#define SUBSYSTEM_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS (1)
|
|
+#define SUBSYSTEM_COMMON_POST_ZERO_BUFFER (1)
|
|
+#define SUBSYSTEM_COMMON_GET_QOS (1)
|
|
+#define SUBSYSTEM_COMMON_SET_QOS (1)
|
|
+#define SUBSYSTEM_COMMON_TCP_GET_STATISTICS (1)
|
|
+#define SUBSYSTEM_COMMON_SEEPROM_READ (1)
|
|
+#define SUBSYSTEM_COMMON_TCP_STATE_QUERY (1)
|
|
+#define SUBSYSTEM_COMMON_GET_CNTL_ATTRIBUTES (1)
|
|
+#define SUBSYSTEM_COMMON_NOP (1)
|
|
+#define SUBSYSTEM_COMMON_NTWK_RX_FILTER (1)
|
|
+#define SUBSYSTEM_COMMON_GET_FW_VERSION (1)
|
|
+#define SUBSYSTEM_COMMON_SET_FLOW_CONTROL (1)
|
|
+#define SUBSYSTEM_COMMON_GET_FLOW_CONTROL (1)
|
|
+#define SUBSYSTEM_COMMON_SET_TCP_PARAMETERS (1)
|
|
+#define SUBSYSTEM_COMMON_SET_FRAME_SIZE (1)
|
|
+#define SUBSYSTEM_COMMON_GET_FAT (1)
|
|
+#define SUBSYSTEM_COMMON_MODIFY_EQ_DELAY (1)
|
|
+#define SUBSYSTEM_COMMON_FIRMWARE_CONFIG (1)
|
|
+#define SUBSYSTEM_COMMON_ENABLE_DISABLE_DOMAINS (1)
|
|
+#define SUBSYSTEM_COMMON_GET_DOMAIN_CONFIG (1)
|
|
+#define SUBSYSTEM_COMMON_SET_VLD_CONFIG (1)
|
|
+#define SUBSYSTEM_COMMON_GET_VLD_CONFIG (1)
|
|
+#define SUBSYSTEM_COMMON_GET_PORT_EQUALIZATION (1)
|
|
+#define SUBSYSTEM_COMMON_SET_PORT_EQUALIZATION (1)
|
|
+#define SUBSYSTEM_COMMON_RED_CONFIG (1)
|
|
+#define OPCODE_COMMON_NTWK_MAC_SET (2)
|
|
+#define OPCODE_COMMON_NTWK_MULTICAST_SET (3)
|
|
+#define OPCODE_COMMON_NTWK_VLAN_CONFIG (4)
|
|
+#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY (5)
|
|
+#define OPCODE_COMMON_READ_FLASHROM (6)
|
|
+#define OPCODE_COMMON_WRITE_FLASHROM (7)
|
|
+#define OPCODE_COMMON_QUERY_MAX_FWCMD_BUFFER_SIZE (8)
|
|
+#define OPCODE_COMMON_ADD_PAGE_TABLES (9)
|
|
+#define OPCODE_COMMON_REMOVE_PAGE_TABLES (10)
|
|
+#define OPCODE_COMMON_RING_DESTROY (11)
|
|
+#define OPCODE_COMMON_CQ_CREATE (12)
|
|
+#define OPCODE_COMMON_EQ_CREATE (13)
|
|
+#define OPCODE_COMMON_ETH_RX_CREATE (14)
|
|
+#define OPCODE_COMMON_ETH_TX_CREATE (15)
|
|
+#define OPCODE_COMMON_NET_RESERVED0 (16) /* Reserved */
|
|
+#define OPCODE_COMMON_NET_RESERVED1 (17) /* Reserved */
|
|
+#define OPCODE_COMMON_NET_RESERVED2 (18) /* Reserved */
|
|
+#define OPCODE_COMMON_ISCSI_DEFQ_CREATE (19)
|
|
+#define OPCODE_COMMON_ISCSI_WRBQ_CREATE (20)
|
|
+#define OPCODE_COMMON_MCC_CREATE (21)
|
|
+#define OPCODE_COMMON_JELL_CONFIG (22)
|
|
+#define OPCODE_COMMON_FORCE_FAILOVER (23)
|
|
+#define OPCODE_COMMON_ADD_TEMPLATE_HEADER_BUFFERS (24)
|
|
+#define OPCODE_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS (25)
|
|
+#define OPCODE_COMMON_POST_ZERO_BUFFER (26)
|
|
+#define OPCODE_COMMON_GET_QOS (27)
|
|
+#define OPCODE_COMMON_SET_QOS (28)
|
|
+#define OPCODE_COMMON_TCP_GET_STATISTICS (29)
|
|
+#define OPCODE_COMMON_SEEPROM_READ (30)
|
|
+#define OPCODE_COMMON_TCP_STATE_QUERY (31)
|
|
+#define OPCODE_COMMON_GET_CNTL_ATTRIBUTES (32)
|
|
+#define OPCODE_COMMON_NOP (33)
|
|
+#define OPCODE_COMMON_NTWK_RX_FILTER (34)
|
|
+#define OPCODE_COMMON_GET_FW_VERSION (35)
|
|
+#define OPCODE_COMMON_SET_FLOW_CONTROL (36)
|
|
+#define OPCODE_COMMON_GET_FLOW_CONTROL (37)
|
|
+#define OPCODE_COMMON_SET_TCP_PARAMETERS (38)
|
|
+#define OPCODE_COMMON_SET_FRAME_SIZE (39)
|
|
+#define OPCODE_COMMON_GET_FAT (40)
|
|
+#define OPCODE_COMMON_MODIFY_EQ_DELAY (41)
|
|
+#define OPCODE_COMMON_FIRMWARE_CONFIG (42)
|
|
+#define OPCODE_COMMON_ENABLE_DISABLE_DOMAINS (43)
|
|
+#define OPCODE_COMMON_GET_DOMAIN_CONFIG (44)
|
|
+#define OPCODE_COMMON_SET_VLD_CONFIG (45)
|
|
+#define OPCODE_COMMON_GET_VLD_CONFIG (46)
|
|
+#define OPCODE_COMMON_GET_PORT_EQUALIZATION (47)
|
|
+#define OPCODE_COMMON_SET_PORT_EQUALIZATION (48)
|
|
+#define OPCODE_COMMON_RED_CONFIG (49)
|
|
+
|
|
+
|
|
+
|
|
+/*
|
|
+ * --- ETH_SUBSYSTEM_OPCODES ---
|
|
+ * These opcodes are used for configuring the Ethernet interfaces. These
|
|
+ * opcodes all use the FWCMD_SUBSYSTEM_ETH subsystem code.
|
|
+ */
|
|
+#define OPCODE_ETH_RSS_CONFIG (1)
|
|
+#define OPCODE_ETH_ACPI_CONFIG (2)
|
|
+#define SUBSYSTEM_ETH_RSS_CONFIG (3)
|
|
+#define SUBSYSTEM_ETH_ACPI_CONFIG (3)
|
|
+#define OPCODE_ETH_PROMISCUOUS (3)
|
|
+#define SUBSYSTEM_ETH_PROMISCUOUS (3)
|
|
+#define SUBSYSTEM_ETH_GET_STATISTICS (3)
|
|
+#define SUBSYSTEM_ETH_GET_RX_FRAG_SIZE (3)
|
|
+#define SUBSYSTEM_ETH_SET_RX_FRAG_SIZE (3)
|
|
+#define OPCODE_ETH_GET_STATISTICS (4)
|
|
+#define OPCODE_ETH_GET_RX_FRAG_SIZE (5)
|
|
+#define OPCODE_ETH_SET_RX_FRAG_SIZE (6)
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/*
|
|
+ * --- MCC_STATUS_CODE ---
|
|
+ * These are the global status codes used by all subsystems
|
|
+ */
|
|
+#define MCC_STATUS_SUCCESS (0) /* Indicates a successful
|
|
+ completion of the command */
|
|
+#define MCC_STATUS_INSUFFICIENT_PRIVILEGES (1) /* The client does not have
|
|
+ sufficient privileges to
|
|
+ execute the command */
|
|
+#define MCC_STATUS_INVALID_PARAMETER (2) /* A parameter in the command
|
|
+ was invalid. The extended
|
|
+ status contains the index
|
|
+ of the parameter */
|
|
+#define MCC_STATUS_INSUFFICIENT_RESOURCES (3) /* There are insufficient
|
|
+ chip resources to execute
|
|
+ the command */
|
|
+#define MCC_STATUS_QUEUE_FLUSHING (4) /* The command is completing
|
|
+ because the queue was
|
|
+ getting flushed */
|
|
+#define MCC_STATUS_DMA_FAILED (5) /* The command is completing
|
|
+ with a DMA error */
|
|
+
|
|
+/*
|
|
+ * --- MGMT_ERROR_CODES ---
|
|
+ * Error Codes returned in the status field of the FWCMD response header
|
|
+ */
|
|
+#define MGMT_STATUS_SUCCESS (0) /* The FWCMD completed
|
|
+ without errors */
|
|
+#define MGMT_STATUS_FAILED (1) /* Error status in the Status
|
|
+ field of the
|
|
+ struct FWCMD_RESPONSE_HEADER */
|
|
+#define MGMT_STATUS_ILLEGAL_REQUEST (2) /* Invalid FWCMD opcode */
|
|
+#define MGMT_STATUS_ILLEGAL_FIELD (3) /* Invalid parameter in
|
|
+ the FWCMD payload */
|
|
+
|
|
+#endif /* __fwcmd_opcodes_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_types_bmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_types_bmap.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_types_bmap.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_types_bmap.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,29 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __fwcmd_types_bmap_h__
|
|
+#define __fwcmd_types_bmap_h__
|
|
+
|
|
+/* MAC address format */
|
|
+struct MAC_ADDRESS_FORMAT {
|
|
+ u16 SizeOfStructure;
|
|
+ u8 MACAddress[6];
|
|
+} __packed;
|
|
+
|
|
+#endif /* __fwcmd_types_bmap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/host_struct.h linux-2.6.29-rc3.owrt/drivers/staging/benet/host_struct.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/host_struct.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/host_struct.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,182 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __host_struct_amap_h__
|
|
+#define __host_struct_amap_h__
|
|
+#include "be_cm.h"
|
|
+#include "be_common.h"
|
|
+#include "descriptors.h"
|
|
+
|
|
+/* --- EQ_COMPLETION_MAJOR_CODE_ENUM --- */
|
|
+#define EQ_MAJOR_CODE_COMPLETION (0) /* Completion event on a */
|
|
+ /* qcompletion ueue. */
|
|
+#define EQ_MAJOR_CODE_ETH (1) /* Affiliated Ethernet Event. */
|
|
+#define EQ_MAJOR_CODE_RESERVED (2) /* Reserved */
|
|
+#define EQ_MAJOR_CODE_RDMA (3) /* Affiliated RDMA Event. */
|
|
+#define EQ_MAJOR_CODE_ISCSI (4) /* Affiliated ISCSI Event */
|
|
+#define EQ_MAJOR_CODE_UNAFFILIATED (5) /* Unaffiliated Event */
|
|
+
|
|
+/* --- EQ_COMPLETION_MINOR_CODE_ENUM --- */
|
|
+#define EQ_MINOR_CODE_COMPLETION (0) /* Completion event on a */
|
|
+ /* completion queue. */
|
|
+#define EQ_MINOR_CODE_OTHER (1) /* Other Event (TBD). */
|
|
+
|
|
+/* Queue Entry Definition for all 4 byte event queue types. */
|
|
+struct BE_EQ_ENTRY_AMAP {
|
|
+ u8 Valid; /* DWORD 0 */
|
|
+ u8 MajorCode[3]; /* DWORD 0 */
|
|
+ u8 MinorCode[12]; /* DWORD 0 */
|
|
+ u8 ResourceID[16]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct EQ_ENTRY_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/*
|
|
+ * --- ETH_EVENT_CODE ---
|
|
+ * These codes are returned by the MPU when one of these events has occurred,
|
|
+ * and the event is configured to report to an Event Queue when an event
|
|
+ * is detected.
|
|
+ */
|
|
+#define ETH_EQ_LINK_STATUS (0) /* Link status change event */
|
|
+ /* detected. */
|
|
+#define ETH_EQ_WATERMARK (1) /* watermark event detected. */
|
|
+#define ETH_EQ_MAGIC_PKT (2) /* magic pkt event detected. */
|
|
+#define ETH_EQ_ACPI_PKT0 (3) /* ACPI interesting packet */
|
|
+ /* detected. */
|
|
+#define ETH_EQ_ACPI_PKT1 (3) /* ACPI interesting packet */
|
|
+ /* detected. */
|
|
+#define ETH_EQ_ACPI_PKT2 (3) /* ACPI interesting packet */
|
|
+ /* detected. */
|
|
+#define ETH_EQ_ACPI_PKT3 (3) /* ACPI interesting packet */
|
|
+ /* detected. */
|
|
+
|
|
+/*
|
|
+ * --- ETH_TX_COMPL_STATUS_ENUM ---
|
|
+ * Status codes contained in Ethernet TX completion descriptors.
|
|
+ */
|
|
+#define ETH_COMP_VALID (0)
|
|
+#define ETH_COMP_ERROR (1)
|
|
+#define ETH_COMP_INVALID (15)
|
|
+
|
|
+/*
|
|
+ * --- ETH_TX_COMPL_PORT_ENUM ---
|
|
+ * Port indicator contained in Ethernet TX completion descriptors.
|
|
+ */
|
|
+#define ETH_COMP_PORT0 (0)
|
|
+#define ETH_COMP_PORT1 (1)
|
|
+#define ETH_COMP_MGMT (2)
|
|
+
|
|
+/*
|
|
+ * --- ETH_TX_COMPL_CT_ENUM ---
|
|
+ * Completion type indicator contained in Ethernet TX completion descriptors.
|
|
+ */
|
|
+#define ETH_COMP_ETH (0)
|
|
+
|
|
+/*
|
|
+ * Work request block that the driver issues to the chip for
|
|
+ * Ethernet transmissions. All control fields must be valid in each WRB for
|
|
+ * a message. The controller, as specified by the flags, optionally writes
|
|
+ * an entry to the Completion Ring and generate an event.
|
|
+ */
|
|
+struct BE_ETH_WRB_AMAP {
|
|
+ u8 frag_pa_hi[32]; /* DWORD 0 */
|
|
+ u8 frag_pa_lo[32]; /* DWORD 1 */
|
|
+ u8 complete; /* DWORD 2 */
|
|
+ u8 event; /* DWORD 2 */
|
|
+ u8 crc; /* DWORD 2 */
|
|
+ u8 forward; /* DWORD 2 */
|
|
+ u8 ipsec; /* DWORD 2 */
|
|
+ u8 mgmt; /* DWORD 2 */
|
|
+ u8 ipcs; /* DWORD 2 */
|
|
+ u8 udpcs; /* DWORD 2 */
|
|
+ u8 tcpcs; /* DWORD 2 */
|
|
+ u8 lso; /* DWORD 2 */
|
|
+ u8 last; /* DWORD 2 */
|
|
+ u8 vlan; /* DWORD 2 */
|
|
+ u8 dbg[3]; /* DWORD 2 */
|
|
+ u8 hash_val[3]; /* DWORD 2 */
|
|
+ u8 lso_mss[14]; /* DWORD 2 */
|
|
+ u8 frag_len[16]; /* DWORD 3 */
|
|
+ u8 vlan_tag[16]; /* DWORD 3 */
|
|
+} __packed;
|
|
+struct ETH_WRB_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+/* This is an Ethernet transmit completion descriptor */
|
|
+struct BE_ETH_TX_COMPL_AMAP {
|
|
+ u8 user_bytes[16]; /* DWORD 0 */
|
|
+ u8 nwh_bytes[8]; /* DWORD 0 */
|
|
+ u8 lso; /* DWORD 0 */
|
|
+ u8 rsvd0[7]; /* DWORD 0 */
|
|
+ u8 wrb_index[16]; /* DWORD 1 */
|
|
+ u8 ct[2]; /* DWORD 1 */
|
|
+ u8 port[2]; /* DWORD 1 */
|
|
+ u8 rsvd1[8]; /* DWORD 1 */
|
|
+ u8 status[4]; /* DWORD 1 */
|
|
+ u8 rsvd2[16]; /* DWORD 2 */
|
|
+ u8 ringid[11]; /* DWORD 2 */
|
|
+ u8 hash_val[4]; /* DWORD 2 */
|
|
+ u8 valid; /* DWORD 2 */
|
|
+ u8 rsvd3[32]; /* DWORD 3 */
|
|
+} __packed;
|
|
+struct ETH_TX_COMPL_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+/* Ethernet Receive Buffer descriptor */
|
|
+struct BE_ETH_RX_D_AMAP {
|
|
+ u8 fragpa_hi[32]; /* DWORD 0 */
|
|
+ u8 fragpa_lo[32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct ETH_RX_D_AMAP {
|
|
+ u32 dw[2];
|
|
+};
|
|
+
|
|
+/* This is an Ethernet Receive Completion Descriptor */
|
|
+struct BE_ETH_RX_COMPL_AMAP {
|
|
+ u8 vlan_tag[16]; /* DWORD 0 */
|
|
+ u8 pktsize[14]; /* DWORD 0 */
|
|
+ u8 port; /* DWORD 0 */
|
|
+ u8 rsvd0; /* DWORD 0 */
|
|
+ u8 err; /* DWORD 1 */
|
|
+ u8 rsshp; /* DWORD 1 */
|
|
+ u8 ipf; /* DWORD 1 */
|
|
+ u8 tcpf; /* DWORD 1 */
|
|
+ u8 udpf; /* DWORD 1 */
|
|
+ u8 ipcksm; /* DWORD 1 */
|
|
+ u8 tcpcksm; /* DWORD 1 */
|
|
+ u8 udpcksm; /* DWORD 1 */
|
|
+ u8 macdst[6]; /* DWORD 1 */
|
|
+ u8 vtp; /* DWORD 1 */
|
|
+ u8 vtm; /* DWORD 1 */
|
|
+ u8 fragndx[10]; /* DWORD 1 */
|
|
+ u8 ct[2]; /* DWORD 1 */
|
|
+ u8 ipsec; /* DWORD 1 */
|
|
+ u8 numfrags[3]; /* DWORD 1 */
|
|
+ u8 rsvd1[31]; /* DWORD 2 */
|
|
+ u8 valid; /* DWORD 2 */
|
|
+ u8 rsshash[32]; /* DWORD 3 */
|
|
+} __packed;
|
|
+struct ETH_RX_COMPL_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+#endif /* __host_struct_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/hwlib.h linux-2.6.29-rc3.owrt/drivers/staging/benet/hwlib.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/hwlib.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/hwlib.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,830 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#ifndef __hwlib_h__
|
|
+#define __hwlib_h__
|
|
+
|
|
+#include <linux/module.h>
|
|
+#include <linux/io.h>
|
|
+#include <linux/list.h>
|
|
+#include <linux/spinlock.h>
|
|
+
|
|
+#include "regmap.h" /* srcgen array map output */
|
|
+
|
|
+#include "asyncmesg.h"
|
|
+#include "fwcmd_opcodes.h"
|
|
+#include "post_codes.h"
|
|
+#include "fwcmd_mcc.h"
|
|
+
|
|
+#include "fwcmd_types_bmap.h"
|
|
+#include "fwcmd_common_bmap.h"
|
|
+#include "fwcmd_eth_bmap.h"
|
|
+#include "bestatus.h"
|
|
+/*
|
|
+ *
|
|
+ * Macros for reading/writing a protection domain or CSR registers
|
|
+ * in BladeEngine.
|
|
+ */
|
|
+#define PD_READ(fo, field) ioread32((fo)->db_va + \
|
|
+ offsetof(struct BE_PROTECTION_DOMAIN_DBMAP_AMAP, field)/8)
|
|
+
|
|
+#define PD_WRITE(fo, field, val) iowrite32(val, (fo)->db_va + \
|
|
+ offsetof(struct BE_PROTECTION_DOMAIN_DBMAP_AMAP, field)/8)
|
|
+
|
|
+#define CSR_READ(fo, field) ioread32((fo)->csr_va + \
|
|
+ offsetof(struct BE_BLADE_ENGINE_CSRMAP_AMAP, field)/8)
|
|
+
|
|
+#define CSR_WRITE(fo, field, val) iowrite32(val, (fo)->csr_va + \
|
|
+ offsetof(struct BE_BLADE_ENGINE_CSRMAP_AMAP, field)/8)
|
|
+
|
|
+#define PCICFG0_READ(fo, field) ioread32((fo)->pci_va + \
|
|
+ offsetof(struct BE_PCICFG0_CSRMAP_AMAP, field)/8)
|
|
+
|
|
+#define PCICFG0_WRITE(fo, field, val) iowrite32(val, (fo)->pci_va + \
|
|
+ offsetof(struct BE_PCICFG0_CSRMAP_AMAP, field)/8)
|
|
+
|
|
+#define PCICFG1_READ(fo, field) ioread32((fo)->pci_va + \
|
|
+ offsetof(struct BE_PCICFG1_CSRMAP_AMAP, field)/8)
|
|
+
|
|
+#define PCICFG1_WRITE(fo, field, val) iowrite32(val, (fo)->pci_va + \
|
|
+ offsetof(struct BE_PCICFG1_CSRMAP_AMAP, field)/8)
|
|
+
|
|
+#ifdef BE_DEBUG
|
|
+#define ASSERT(c) BUG_ON(!(c));
|
|
+#else
|
|
+#define ASSERT(c)
|
|
+#endif
|
|
+
|
|
+/* debug levels */
|
|
+enum BE_DEBUG_LEVELS {
|
|
+ DL_ALWAYS = 0, /* cannot be masked */
|
|
+ DL_ERR = 0x1, /* errors that should never happen */
|
|
+ DL_WARN = 0x2, /* something questionable.
|
|
+ recoverable errors */
|
|
+ DL_NOTE = 0x4, /* infrequent, important debug info */
|
|
+ DL_INFO = 0x8, /* debug information */
|
|
+ DL_VERBOSE = 0x10, /* detailed info, such as buffer traces */
|
|
+ BE_DL_MIN_VALUE = 0x1, /* this is the min value used */
|
|
+ BE_DL_MAX_VALUE = 0x80 /* this is the higheset value used */
|
|
+} ;
|
|
+
|
|
+extern unsigned int trace_level;
|
|
+
|
|
+#define TRACE(lm, fmt, args...) { \
|
|
+ if (trace_level & lm) { \
|
|
+ printk(KERN_NOTICE "BE: %s:%d \n" fmt, \
|
|
+ __FILE__ , __LINE__ , ## args); \
|
|
+ } \
|
|
+ }
|
|
+
|
|
+static inline unsigned int be_trace_set_level(unsigned int level)
|
|
+{
|
|
+ unsigned int old_level = trace_level;
|
|
+ trace_level = level;
|
|
+ return old_level;
|
|
+}
|
|
+
|
|
+#define be_trace_get_level() trace_level
|
|
+/*
|
|
+ * Returns number of pages spanned by the size of data
|
|
+ * starting at the given address.
|
|
+ */
|
|
+#define PAGES_SPANNED(_address, _size) \
|
|
+ ((u32)((((size_t)(_address) & (PAGE_SIZE - 1)) + \
|
|
+ (_size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
|
|
+/* Byte offset into the page corresponding to given address */
|
|
+#define OFFSET_IN_PAGE(_addr_) ((size_t)(_addr_) & (PAGE_SIZE-1))
|
|
+
|
|
+/*
|
|
+ * circular subtract.
|
|
+ * Returns a - b assuming a circular number system, where a and b are
|
|
+ * in range (0, maxValue-1). If a==b, zero is returned so the
|
|
+ * highest value possible with this subtraction is maxValue-1.
|
|
+ */
|
|
+static inline u32 be_subc(u32 a, u32 b, u32 max)
|
|
+{
|
|
+ ASSERT(a <= max && b <= max);
|
|
+ ASSERT(max > 0);
|
|
+ return a >= b ? (a - b) : (max - b + a);
|
|
+}
|
|
+
|
|
+static inline u32 be_addc(u32 a, u32 b, u32 max)
|
|
+{
|
|
+ ASSERT(a < max);
|
|
+ ASSERT(max > 0);
|
|
+ return (max - a > b) ? (a + b) : (b + a - max);
|
|
+}
|
|
+
|
|
+/* descriptor for a physically contiguous memory used for ring */
|
|
+struct ring_desc {
|
|
+ u32 length; /* length in bytes */
|
|
+ void *va; /* virtual address */
|
|
+ u64 pa; /* bus address */
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ * This structure stores information about a ring shared between hardware
|
|
+ * and software. Each ring is allocated by the driver in the uncached
|
|
+ * extension and mapped into BladeEngine's unified table.
|
|
+ */
|
|
+struct mp_ring {
|
|
+ u32 pages; /* queue size in pages */
|
|
+ u32 id; /* queue id assigned by beklib */
|
|
+ u32 num; /* number of elements in queue */
|
|
+ u32 cidx; /* consumer index */
|
|
+ u32 pidx; /* producer index -- not used by most rings */
|
|
+ u32 itemSize; /* size in bytes of one object */
|
|
+
|
|
+ void *va; /* The virtual address of the ring.
|
|
+ This should be last to allow 32 & 64
|
|
+ bit debugger extensions to work. */
|
|
+} ;
|
|
+
|
|
+/*----------- amap bit filed get / set macros and functions -----*/
|
|
+/*
|
|
+ * Structures defined in the map header files (under fw/amap/) with names
|
|
+ * in the format BE_<name>_AMAP are pseudo structures with members
|
|
+ * of type u8. These structures are templates that are used in
|
|
+ * conjuntion with the structures with names in the format
|
|
+ * <name>_AMAP to calculate the bit masks and bit offsets to get or set
|
|
+ * bit fields in structures. The structures <name>_AMAP are arrays
|
|
+ * of 32 bits words and have the correct size. The following macros
|
|
+ * provide convenient ways to get and set the various members
|
|
+ * in the structures without using strucctures with bit fields.
|
|
+ * Always use the macros AMAP_GET_BITS_PTR and AMAP_SET_BITS_PTR
|
|
+ * macros to extract and set various members.
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * Returns the a bit mask for the register that is NOT shifted into location.
|
|
+ * That means return values always look like: 0x1, 0xFF, 0x7FF, etc...
|
|
+ */
|
|
+static inline u32 amap_mask(u32 bit_size)
|
|
+{
|
|
+ return bit_size == 32 ? 0xFFFFFFFF : (1 << bit_size) - 1;
|
|
+}
|
|
+
|
|
+#define AMAP_BIT_MASK(_struct_, field) \
|
|
+ amap_mask(AMAP_BIT_SIZE(_struct_, field))
|
|
+
|
|
+/*
|
|
+ * non-optimized set bits function. First clears the bits and then assigns them.
|
|
+ * This does not require knowledge of the particular DWORD you are setting.
|
|
+ * e.g. AMAP_SET_BITS_PTR (struct, field1, &contextMemory, 123);
|
|
+ */
|
|
+static inline void
|
|
+amap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value)
|
|
+{
|
|
+ u32 *dw = (u32 *)ptr;
|
|
+ *(dw + dw_offset) &= ~(mask << offset);
|
|
+ *(dw + dw_offset) |= (mask & value) << offset;
|
|
+}
|
|
+
|
|
+#define AMAP_SET_BITS_PTR(_struct_, field, _structPtr_, val) \
|
|
+ amap_set(_structPtr_, AMAP_WORD_OFFSET(_struct_, field),\
|
|
+ AMAP_BIT_MASK(_struct_, field), \
|
|
+ AMAP_BIT_OFFSET(_struct_, field), val)
|
|
+/*
|
|
+ * Non-optimized routine that gets the bits without knowing the correct DWORD.
|
|
+ * e.g. fieldValue = AMAP_GET_BITS_PTR (struct, field1, &contextMemory);
|
|
+ */
|
|
+static inline u32
|
|
+amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset)
|
|
+{
|
|
+ u32 *dw = (u32 *)ptr;
|
|
+ return mask & (*(dw + dw_offset) >> offset);
|
|
+}
|
|
+#define AMAP_GET_BITS_PTR(_struct_, field, _structPtr_) \
|
|
+ amap_get(_structPtr_, AMAP_WORD_OFFSET(_struct_, field), \
|
|
+ AMAP_BIT_MASK(_struct_, field), \
|
|
+ AMAP_BIT_OFFSET(_struct_, field))
|
|
+
|
|
+/* Returns 0-31 representing bit offset within a DWORD of a bitfield. */
|
|
+#define AMAP_BIT_OFFSET(_struct_, field) \
|
|
+ (offsetof(struct BE_ ## _struct_ ## _AMAP, field) % 32)
|
|
+
|
|
+/* Returns 0-n representing DWORD offset of bitfield within the structure. */
|
|
+#define AMAP_WORD_OFFSET(_struct_, field) \
|
|
+ (offsetof(struct BE_ ## _struct_ ## _AMAP, field)/32)
|
|
+
|
|
+/* Returns size of bitfield in bits. */
|
|
+#define AMAP_BIT_SIZE(_struct_, field) \
|
|
+ sizeof(((struct BE_ ## _struct_ ## _AMAP*)0)->field)
|
|
+
|
|
+struct be_mcc_wrb_response_copy {
|
|
+ u16 length; /* bytes in response */
|
|
+ u16 fwcmd_offset; /* offset within the wrb of the response */
|
|
+ void *va; /* user's va to copy response into */
|
|
+
|
|
+} ;
|
|
+typedef void (*mcc_wrb_cqe_callback) (void *context, int status,
|
|
+ struct MCC_WRB_AMAP *optional_wrb);
|
|
+struct be_mcc_wrb_context {
|
|
+
|
|
+ mcc_wrb_cqe_callback internal_cb; /* Function to call on
|
|
+ completion */
|
|
+ void *internal_cb_context; /* Parameter to pass
|
|
+ to completion function */
|
|
+
|
|
+ mcc_wrb_cqe_callback cb; /* Function to call on completion */
|
|
+ void *cb_context; /* Parameter to pass to completion function */
|
|
+
|
|
+ int *users_final_status; /* pointer to a local
|
|
+ variable for synchronous
|
|
+ commands */
|
|
+ struct MCC_WRB_AMAP *wrb; /* pointer to original wrb for embedded
|
|
+ commands only */
|
|
+ struct list_head next; /* links context structs together in
|
|
+ free list */
|
|
+
|
|
+ struct be_mcc_wrb_response_copy copy; /* Optional parameters to copy
|
|
+ embedded response to user's va */
|
|
+
|
|
+#if defined(BE_DEBUG)
|
|
+ u16 subsystem, opcode; /* Track this FWCMD for debug builds. */
|
|
+ struct MCC_WRB_AMAP *ring_wrb;
|
|
+ u32 consumed_count;
|
|
+#endif
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ Represents a function object for network or storage. This
|
|
+ is used to manage per-function resources like MCC CQs, etc.
|
|
+*/
|
|
+struct be_function_object {
|
|
+
|
|
+ u32 magic; /*!< magic for detecting memory corruption. */
|
|
+
|
|
+ /* PCI BAR mapped addresses */
|
|
+ u8 __iomem *csr_va; /* CSR */
|
|
+ u8 __iomem *db_va; /* Door Bell */
|
|
+ u8 __iomem *pci_va; /* PCI config space */
|
|
+ u32 emulate; /* if set, MPU is not available.
|
|
+ Emulate everything. */
|
|
+ u32 pend_queue_driving; /* if set, drive the queued WRBs
|
|
+ after releasing the WRB lock */
|
|
+
|
|
+ spinlock_t post_lock; /* lock for verifying one thread posting wrbs */
|
|
+ spinlock_t cq_lock; /* lock for verifying one thread
|
|
+ processing cq */
|
|
+ spinlock_t mcc_context_lock; /* lock for protecting mcc
|
|
+ context free list */
|
|
+ unsigned long post_irq;
|
|
+ unsigned long cq_irq;
|
|
+
|
|
+ u32 type;
|
|
+ u32 pci_function_number;
|
|
+
|
|
+ struct be_mcc_object *mcc; /* mcc rings. */
|
|
+
|
|
+ struct {
|
|
+ struct MCC_MAILBOX_AMAP *va; /* VA to the mailbox */
|
|
+ u64 pa; /* PA to the mailbox */
|
|
+ u32 length; /* byte length of mailbox */
|
|
+
|
|
+ /* One default context struct used for posting at
|
|
+ * least one MCC_WRB
|
|
+ */
|
|
+ struct be_mcc_wrb_context default_context;
|
|
+ bool default_context_allocated;
|
|
+ } mailbox;
|
|
+
|
|
+ struct {
|
|
+
|
|
+ /* Wake on lans configured. */
|
|
+ u32 wol_bitmask; /* bits 0,1,2,3 are set if
|
|
+ corresponding index is enabled */
|
|
+ } config;
|
|
+
|
|
+
|
|
+ struct BE_FIRMWARE_CONFIG fw_config;
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ Represents an Event Queue
|
|
+*/
|
|
+struct be_eq_object {
|
|
+ u32 magic;
|
|
+ atomic_t ref_count;
|
|
+
|
|
+ struct be_function_object *parent_function;
|
|
+
|
|
+ struct list_head eq_list;
|
|
+ struct list_head cq_list_head;
|
|
+
|
|
+ u32 eq_id;
|
|
+ void *cb_context;
|
|
+
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ Manages a completion queue
|
|
+*/
|
|
+struct be_cq_object {
|
|
+ u32 magic;
|
|
+ atomic_t ref_count;
|
|
+
|
|
+ struct be_function_object *parent_function;
|
|
+ struct be_eq_object *eq_object;
|
|
+
|
|
+ struct list_head cq_list;
|
|
+ struct list_head cqlist_for_eq;
|
|
+
|
|
+ void *va;
|
|
+ u32 num_entries;
|
|
+
|
|
+ void *cb_context;
|
|
+
|
|
+ u32 cq_id;
|
|
+
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ Manages an ethernet send queue
|
|
+*/
|
|
+struct be_ethsq_object {
|
|
+ u32 magic;
|
|
+
|
|
+ struct list_head list;
|
|
+
|
|
+ struct be_function_object *parent_function;
|
|
+ struct be_cq_object *cq_object;
|
|
+ u32 bid;
|
|
+
|
|
+} ;
|
|
+
|
|
+/*
|
|
+@brief
|
|
+ Manages an ethernet receive queue
|
|
+*/
|
|
+struct be_ethrq_object {
|
|
+ u32 magic;
|
|
+ struct list_head list;
|
|
+ struct be_function_object *parent_function;
|
|
+ u32 rid;
|
|
+ struct be_cq_object *cq_object;
|
|
+ struct be_cq_object *rss_cq_object[4];
|
|
+
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ Manages an MCC
|
|
+*/
|
|
+typedef void (*mcc_async_event_callback) (void *context, u32 event_code,
|
|
+ void *event);
|
|
+struct be_mcc_object {
|
|
+ u32 magic;
|
|
+
|
|
+ struct be_function_object *parent_function;
|
|
+ struct list_head mcc_list;
|
|
+
|
|
+ struct be_cq_object *cq_object;
|
|
+
|
|
+ /* Async event callback for MCC CQ. */
|
|
+ mcc_async_event_callback async_cb;
|
|
+ void *async_context;
|
|
+
|
|
+ struct {
|
|
+ struct be_mcc_wrb_context *base;
|
|
+ u32 num;
|
|
+ struct list_head list_head;
|
|
+ } wrb_context;
|
|
+
|
|
+ struct {
|
|
+ struct ring_desc *rd;
|
|
+ struct mp_ring ring;
|
|
+ } sq;
|
|
+
|
|
+ struct {
|
|
+ struct mp_ring ring;
|
|
+ } cq;
|
|
+
|
|
+ u32 processing; /* flag indicating that one thread
|
|
+ is processing CQ */
|
|
+ u32 rearm; /* doorbell rearm setting to make
|
|
+ sure the active processing thread */
|
|
+ /* rearms the CQ if any of the threads requested it. */
|
|
+
|
|
+ struct list_head backlog;
|
|
+ u32 backlog_length;
|
|
+ u32 driving_backlog;
|
|
+ u32 consumed_index;
|
|
+
|
|
+} ;
|
|
+
|
|
+
|
|
+/* Queue context header -- the required software information for
|
|
+ * queueing a WRB.
|
|
+ */
|
|
+struct be_queue_driver_context {
|
|
+ mcc_wrb_cqe_callback internal_cb; /* Function to call on
|
|
+ completion */
|
|
+ void *internal_cb_context; /* Parameter to pass
|
|
+ to completion function */
|
|
+
|
|
+ mcc_wrb_cqe_callback cb; /* Function to call on completion */
|
|
+ void *cb_context; /* Parameter to pass to completion function */
|
|
+
|
|
+ struct be_mcc_wrb_response_copy copy; /* Optional parameters to copy
|
|
+ embedded response to user's va */
|
|
+ void *optional_fwcmd_va;
|
|
+ struct list_head list;
|
|
+ u32 bytes;
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ * Common MCC WRB header that all commands require.
|
|
+ */
|
|
+struct be_mcc_wrb_header {
|
|
+ u8 rsvd[offsetof(struct BE_MCC_WRB_AMAP, payload)/8];
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ * All non embedded commands supported by hwlib functions only allow
|
|
+ * 1 SGE. This queue context handles them all.
|
|
+ */
|
|
+struct be_nonembedded_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct MCC_SGE_AMAP sge[1];
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ * ------------------------------------------------------------------------
|
|
+ * This section contains the specific queue struct for each command.
|
|
+ * The user could always provide a be_generic_q_ctxt but this is a
|
|
+ * rather large struct. By using the specific struct, memory consumption
|
|
+ * can be reduced.
|
|
+ * ------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+struct be_link_status_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY fwcmd;
|
|
+} ;
|
|
+
|
|
+struct be_multicast_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct FWCMD_COMMON_NTWK_MULTICAST_SET fwcmd;
|
|
+} ;
|
|
+
|
|
+
|
|
+struct be_vlan_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct FWCMD_COMMON_NTWK_VLAN_CONFIG fwcmd;
|
|
+} ;
|
|
+
|
|
+struct be_promiscuous_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct FWCMD_ETH_PROMISCUOUS fwcmd;
|
|
+} ;
|
|
+
|
|
+struct be_force_failover_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct FWCMD_COMMON_FORCE_FAILOVER fwcmd;
|
|
+} ;
|
|
+
|
|
+
|
|
+struct be_rxf_filter_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct FWCMD_COMMON_NTWK_RX_FILTER fwcmd;
|
|
+} ;
|
|
+
|
|
+struct be_eq_modify_delay_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct FWCMD_COMMON_MODIFY_EQ_DELAY fwcmd;
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ * The generic context is the largest size that would be required.
|
|
+ * It is the software context plus an entire WRB.
|
|
+ */
|
|
+struct be_generic_q_ctxt {
|
|
+ struct be_queue_driver_context context;
|
|
+ struct be_mcc_wrb_header wrb_header;
|
|
+ struct MCC_WRB_PAYLOAD_AMAP payload;
|
|
+} ;
|
|
+
|
|
+/*
|
|
+ * Types for the BE_QUEUE_CONTEXT object.
|
|
+ */
|
|
+#define BE_QUEUE_INVALID (0)
|
|
+#define BE_QUEUE_LINK_STATUS (0xA006)
|
|
+#define BE_QUEUE_ETH_STATS (0xA007)
|
|
+#define BE_QUEUE_TPM_STATS (0xA008)
|
|
+#define BE_QUEUE_TCP_STATS (0xA009)
|
|
+#define BE_QUEUE_MULTICAST (0xA00A)
|
|
+#define BE_QUEUE_VLAN (0xA00B)
|
|
+#define BE_QUEUE_RSS (0xA00C)
|
|
+#define BE_QUEUE_FORCE_FAILOVER (0xA00D)
|
|
+#define BE_QUEUE_PROMISCUOUS (0xA00E)
|
|
+#define BE_QUEUE_WAKE_ON_LAN (0xA00F)
|
|
+#define BE_QUEUE_NOP (0xA010)
|
|
+
|
|
+/* --- BE_FUNCTION_ENUM --- */
|
|
+#define BE_FUNCTION_TYPE_ISCSI (0)
|
|
+#define BE_FUNCTION_TYPE_NETWORK (1)
|
|
+#define BE_FUNCTION_TYPE_ARM (2)
|
|
+
|
|
+/* --- BE_ETH_TX_RING_TYPE_ENUM --- */
|
|
+#define BE_ETH_TX_RING_TYPE_FORWARDING (1) /* Ether ring for forwarding */
|
|
+#define BE_ETH_TX_RING_TYPE_STANDARD (2) /* Ether ring for sending */
|
|
+ /* network packets. */
|
|
+#define BE_ETH_TX_RING_TYPE_BOUND (3) /* Ethernet ring for sending */
|
|
+ /* network packets, bound */
|
|
+ /* to a physical port. */
|
|
+/*
|
|
+ * ----------------------------------------------------------------------
|
|
+ * API MACROS
|
|
+ * ----------------------------------------------------------------------
|
|
+ */
|
|
+#define BE_FWCMD_NAME(_short_name_) struct FWCMD_##_short_name_
|
|
+#define BE_OPCODE_NAME(_short_name_) OPCODE_##_short_name_
|
|
+#define BE_SUBSYSTEM_NAME(_short_name_) SUBSYSTEM_##_short_name_
|
|
+
|
|
+
|
|
+#define BE_PREPARE_EMBEDDED_FWCMD(_pfob_, _wrb_, _short_name_) \
|
|
+ ((BE_FWCMD_NAME(_short_name_) *) \
|
|
+ be_function_prepare_embedded_fwcmd(_pfob_, _wrb_, \
|
|
+ sizeof(BE_FWCMD_NAME(_short_name_)), \
|
|
+ FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.request), \
|
|
+ FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.response), \
|
|
+ BE_OPCODE_NAME(_short_name_), \
|
|
+ BE_SUBSYSTEM_NAME(_short_name_)));
|
|
+
|
|
+#define BE_PREPARE_NONEMBEDDED_FWCMD(_pfob_, _wrb_, _iva_, _ipa_, _short_name_)\
|
|
+ ((BE_FWCMD_NAME(_short_name_) *) \
|
|
+ be_function_prepare_nonembedded_fwcmd(_pfob_, _wrb_, (_iva_), (_ipa_), \
|
|
+ sizeof(BE_FWCMD_NAME(_short_name_)), \
|
|
+ FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.request), \
|
|
+ FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.response), \
|
|
+ BE_OPCODE_NAME(_short_name_), \
|
|
+ BE_SUBSYSTEM_NAME(_short_name_)));
|
|
+
|
|
+int be_function_object_create(u8 __iomem *csr_va, u8 __iomem *db_va,
|
|
+ u8 __iomem *pci_va, u32 function_type, struct ring_desc *mailbox_rd,
|
|
+ struct be_function_object *pfob);
|
|
+
|
|
+int be_function_object_destroy(struct be_function_object *pfob);
|
|
+int be_function_cleanup(struct be_function_object *pfob);
|
|
+
|
|
+
|
|
+int be_function_get_fw_version(struct be_function_object *pfob,
|
|
+ struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD *fw_version,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context);
|
|
+
|
|
+
|
|
+int be_eq_modify_delay(struct be_function_object *pfob,
|
|
+ u32 num_eq, struct be_eq_object **eq_array,
|
|
+ u32 *eq_delay_array, mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context,
|
|
+ struct be_eq_modify_delay_q_ctxt *q_ctxt);
|
|
+
|
|
+
|
|
+
|
|
+int be_eq_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, u32 eqe_size, u32 num_entries,
|
|
+ u32 watermark, u32 timer_delay, struct be_eq_object *eq_object);
|
|
+
|
|
+int be_eq_destroy(struct be_eq_object *eq);
|
|
+
|
|
+int be_cq_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, u32 length,
|
|
+ bool solicited_eventable, bool no_delay,
|
|
+ u32 wm_thresh, struct be_eq_object *eq_object,
|
|
+ struct be_cq_object *cq_object);
|
|
+
|
|
+int be_cq_destroy(struct be_cq_object *cq);
|
|
+
|
|
+int be_mcc_ring_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, u32 length,
|
|
+ struct be_mcc_wrb_context *context_array,
|
|
+ u32 num_context_entries,
|
|
+ struct be_cq_object *cq, struct be_mcc_object *mcc);
|
|
+int be_mcc_ring_destroy(struct be_mcc_object *mcc_object);
|
|
+
|
|
+int be_mcc_process_cq(struct be_mcc_object *mcc_object, bool rearm);
|
|
+
|
|
+int be_mcc_add_async_event_callback(struct be_mcc_object *mcc_object,
|
|
+ mcc_async_event_callback cb, void *cb_context);
|
|
+
|
|
+int be_pci_soft_reset(struct be_function_object *pfob);
|
|
+
|
|
+
|
|
+int be_drive_POST(struct be_function_object *pfob);
|
|
+
|
|
+
|
|
+int be_eth_sq_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, u32 length_in_bytes,
|
|
+ u32 type, u32 ulp, struct be_cq_object *cq_object,
|
|
+ struct be_ethsq_object *eth_sq);
|
|
+
|
|
+struct be_eth_sq_parameters {
|
|
+ u32 port;
|
|
+ u32 rsvd0[2];
|
|
+} ;
|
|
+
|
|
+int be_eth_sq_create_ex(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, u32 length_in_bytes,
|
|
+ u32 type, u32 ulp, struct be_cq_object *cq_object,
|
|
+ struct be_eth_sq_parameters *ex_parameters,
|
|
+ struct be_ethsq_object *eth_sq);
|
|
+int be_eth_sq_destroy(struct be_ethsq_object *eth_sq);
|
|
+
|
|
+int be_eth_set_flow_control(struct be_function_object *pfob,
|
|
+ bool txfc_enable, bool rxfc_enable);
|
|
+
|
|
+int be_eth_get_flow_control(struct be_function_object *pfob,
|
|
+ bool *txfc_enable, bool *rxfc_enable);
|
|
+int be_eth_set_qos(struct be_function_object *pfob, u32 max_bps, u32 max_pps);
|
|
+
|
|
+int be_eth_get_qos(struct be_function_object *pfob, u32 *max_bps, u32 *max_pps);
|
|
+
|
|
+int be_eth_set_frame_size(struct be_function_object *pfob,
|
|
+ u32 *tx_frame_size, u32 *rx_frame_size);
|
|
+
|
|
+int be_eth_rq_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, struct be_cq_object *cq_object,
|
|
+ struct be_cq_object *bcmc_cq_object,
|
|
+ struct be_ethrq_object *eth_rq);
|
|
+
|
|
+int be_eth_rq_destroy(struct be_ethrq_object *eth_rq);
|
|
+
|
|
+int be_eth_rq_destroy_options(struct be_ethrq_object *eth_rq, bool flush,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context);
|
|
+int be_eth_rq_set_frag_size(struct be_function_object *pfob,
|
|
+ u32 new_frag_size_bytes, u32 *actual_frag_size_bytes);
|
|
+int be_eth_rq_get_frag_size(struct be_function_object *pfob,
|
|
+ u32 *frag_size_bytes);
|
|
+
|
|
+void *be_function_prepare_embedded_fwcmd(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb,
|
|
+ u32 payload_length, u32 request_length,
|
|
+ u32 response_length, u32 opcode, u32 subsystem);
|
|
+void *be_function_prepare_nonembedded_fwcmd(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb, void *fwcmd_header_va, u64 fwcmd_header_pa,
|
|
+ u32 payload_length, u32 request_length, u32 response_length,
|
|
+ u32 opcode, u32 subsystem);
|
|
+
|
|
+
|
|
+struct MCC_WRB_AMAP *
|
|
+be_function_peek_mcc_wrb(struct be_function_object *pfob);
|
|
+
|
|
+int be_rxf_mac_address_read_write(struct be_function_object *pfob,
|
|
+ bool port1, bool mac1, bool mgmt,
|
|
+ bool write, bool permanent, u8 *mac_address,
|
|
+ mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context);
|
|
+
|
|
+int be_rxf_multicast_config(struct be_function_object *pfob,
|
|
+ bool promiscuous, u32 num, u8 *mac_table,
|
|
+ mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context,
|
|
+ struct be_multicast_q_ctxt *q_ctxt);
|
|
+
|
|
+int be_rxf_vlan_config(struct be_function_object *pfob,
|
|
+ bool promiscuous, u32 num, u16 *vlan_tag_array,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context,
|
|
+ struct be_vlan_q_ctxt *q_ctxt);
|
|
+
|
|
+
|
|
+int be_rxf_link_status(struct be_function_object *pfob,
|
|
+ struct BE_LINK_STATUS *link_status,
|
|
+ mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context,
|
|
+ struct be_link_status_q_ctxt *q_ctxt);
|
|
+
|
|
+
|
|
+int be_rxf_query_eth_statistics(struct be_function_object *pfob,
|
|
+ struct FWCMD_ETH_GET_STATISTICS *va_for_fwcmd,
|
|
+ u64 pa_for_fwcmd, mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context,
|
|
+ struct be_nonembedded_q_ctxt *q_ctxt);
|
|
+
|
|
+int be_rxf_promiscuous(struct be_function_object *pfob,
|
|
+ bool enable_port0, bool enable_port1,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context,
|
|
+ struct be_promiscuous_q_ctxt *q_ctxt);
|
|
+
|
|
+
|
|
+int be_rxf_filter_config(struct be_function_object *pfob,
|
|
+ struct NTWK_RX_FILTER_SETTINGS *settings,
|
|
+ mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context,
|
|
+ struct be_rxf_filter_q_ctxt *q_ctxt);
|
|
+
|
|
+/*
|
|
+ * ------------------------------------------------------
|
|
+ * internal functions used by hwlib
|
|
+ * ------------------------------------------------------
|
|
+ */
|
|
+
|
|
+
|
|
+int be_function_ring_destroy(struct be_function_object *pfob,
|
|
+ u32 id, u32 ring_type, mcc_wrb_cqe_callback cb,
|
|
+ void *cb_context,
|
|
+ mcc_wrb_cqe_callback internal_cb,
|
|
+ void *internal_callback_context);
|
|
+
|
|
+int be_function_post_mcc_wrb(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb,
|
|
+ struct be_generic_q_ctxt *q_ctxt,
|
|
+ mcc_wrb_cqe_callback cb, void *cb_context,
|
|
+ mcc_wrb_cqe_callback internal_cb,
|
|
+ void *internal_cb_context, void *optional_fwcmd_va,
|
|
+ struct be_mcc_wrb_response_copy *response_copy);
|
|
+
|
|
+int be_function_queue_mcc_wrb(struct be_function_object *pfob,
|
|
+ struct be_generic_q_ctxt *q_ctxt);
|
|
+
|
|
+/*
|
|
+ * ------------------------------------------------------
|
|
+ * MCC QUEUE
|
|
+ * ------------------------------------------------------
|
|
+ */
|
|
+
|
|
+int be_mpu_init_mailbox(struct be_function_object *pfob, struct ring_desc *rd);
|
|
+
|
|
+
|
|
+struct MCC_WRB_AMAP *
|
|
+_be_mpu_peek_ring_wrb(struct be_mcc_object *mcc, bool driving_queue);
|
|
+
|
|
+struct be_mcc_wrb_context *
|
|
+_be_mcc_allocate_wrb_context(struct be_function_object *pfob);
|
|
+
|
|
+void _be_mcc_free_wrb_context(struct be_function_object *pfob,
|
|
+ struct be_mcc_wrb_context *context);
|
|
+
|
|
+int _be_mpu_post_wrb_mailbox(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context);
|
|
+
|
|
+int _be_mpu_post_wrb_ring(struct be_mcc_object *mcc,
|
|
+ struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context);
|
|
+
|
|
+void be_drive_mcc_wrb_queue(struct be_mcc_object *mcc);
|
|
+
|
|
+
|
|
+/*
|
|
+ * ------------------------------------------------------
|
|
+ * Ring Sizes
|
|
+ * ------------------------------------------------------
|
|
+ */
|
|
+static inline u32 be_ring_encoding_to_length(u32 encoding, u32 object_size)
|
|
+{
|
|
+
|
|
+ ASSERT(encoding != 1); /* 1 is rsvd */
|
|
+ ASSERT(encoding < 16);
|
|
+ ASSERT(object_size > 0);
|
|
+
|
|
+ if (encoding == 0) /* 32k deep */
|
|
+ encoding = 16;
|
|
+
|
|
+ return (1 << (encoding - 1)) * object_size;
|
|
+}
|
|
+
|
|
+static inline
|
|
+u32 be_ring_length_to_encoding(u32 length_in_bytes, u32 object_size)
|
|
+{
|
|
+
|
|
+ u32 count, encoding;
|
|
+
|
|
+ ASSERT(object_size > 0);
|
|
+ ASSERT(length_in_bytes % object_size == 0);
|
|
+
|
|
+ count = length_in_bytes / object_size;
|
|
+
|
|
+ ASSERT(count > 1);
|
|
+ ASSERT(count <= 32 * 1024);
|
|
+ ASSERT(length_in_bytes <= 8 * PAGE_SIZE); /* max ring size in UT */
|
|
+
|
|
+ encoding = __ilog2_u32(count) + 1;
|
|
+
|
|
+ if (encoding == 16)
|
|
+ encoding = 0; /* 32k deep */
|
|
+
|
|
+ return encoding;
|
|
+}
|
|
+
|
|
+void be_rd_to_pa_list(struct ring_desc *rd, struct PHYS_ADDR *pa_list,
|
|
+ u32 max_num);
|
|
+#endif /* __hwlib_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/benet/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/Kconfig 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,7 @@
|
|
+config BENET
|
|
+ tristate "ServerEngines 10Gb NIC - BladeEngine"
|
|
+ depends on PCI && INET
|
|
+ select INET_LRO
|
|
+ help
|
|
+ This driver implements the NIC functionality for ServerEngines
|
|
+ 10Gb network adapter BladeEngine (EC 3210).
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/MAINTAINERS linux-2.6.29-rc3.owrt/drivers/staging/benet/MAINTAINERS
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/MAINTAINERS 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/MAINTAINERS 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,6 @@
|
|
+SERVER ENGINES 10Gbe NIC - BLADE-ENGINE
|
|
+P: Subbu Seetharaman
|
|
+M: subbus@serverengines.com
|
|
+L: netdev@vger.kernel.org
|
|
+W: http://www.serverengines.com
|
|
+S: Supported
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/Makefile linux-2.6.29-rc3.owrt/drivers/staging/benet/Makefile
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/Makefile 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,14 @@
|
|
+#
|
|
+# Makefile to build the network driver for ServerEngine's BladeEngine
|
|
+#
|
|
+obj-$(CONFIG_BENET) += benet.o
|
|
+
|
|
+benet-y := be_init.o \
|
|
+ be_int.o \
|
|
+ be_netif.o \
|
|
+ be_ethtool.o \
|
|
+ funcobj.o \
|
|
+ cq.o \
|
|
+ eq.o \
|
|
+ mpu.o \
|
|
+ eth.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/mpu.c linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu.c
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/mpu.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,1364 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+#include <linux/delay.h>
|
|
+#include "hwlib.h"
|
|
+#include "bestatus.h"
|
|
+
|
|
+static
|
|
+inline void mp_ring_create(struct mp_ring *ring, u32 num, u32 size, void *va)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ memset(ring, 0, sizeof(struct mp_ring));
|
|
+ ring->num = num;
|
|
+ ring->pages = DIV_ROUND_UP(num * size, PAGE_SIZE);
|
|
+ ring->itemSize = size;
|
|
+ ring->va = va;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * -----------------------------------------------------------------------
|
|
+ * Interface for 2 index rings. i.e. consumer/producer rings
|
|
+ * --------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+/* Returns number items pending on ring. */
|
|
+static inline u32 mp_ring_num_pending(struct mp_ring *ring)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ if (ring->num == 0)
|
|
+ return 0;
|
|
+ return be_subc(ring->pidx, ring->cidx, ring->num);
|
|
+}
|
|
+
|
|
+/* Returns number items free on ring. */
|
|
+static inline u32 mp_ring_num_empty(struct mp_ring *ring)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ return ring->num - 1 - mp_ring_num_pending(ring);
|
|
+}
|
|
+
|
|
+/* Consume 1 item */
|
|
+static inline void mp_ring_consume(struct mp_ring *ring)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ ASSERT(ring->pidx != ring->cidx);
|
|
+
|
|
+ ring->cidx = be_addc(ring->cidx, 1, ring->num);
|
|
+}
|
|
+
|
|
+/* Produce 1 item */
|
|
+static inline void mp_ring_produce(struct mp_ring *ring)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ ring->pidx = be_addc(ring->pidx, 1, ring->num);
|
|
+}
|
|
+
|
|
+/* Consume count items */
|
|
+static inline void mp_ring_consume_multiple(struct mp_ring *ring, u32 count)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ ASSERT(mp_ring_num_pending(ring) >= count);
|
|
+ ring->cidx = be_addc(ring->cidx, count, ring->num);
|
|
+}
|
|
+
|
|
+static inline void *mp_ring_item(struct mp_ring *ring, u32 index)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ ASSERT(index < ring->num);
|
|
+ ASSERT(ring->itemSize > 0);
|
|
+ return (u8 *) ring->va + index * ring->itemSize;
|
|
+}
|
|
+
|
|
+/* Ptr to produce item */
|
|
+static inline void *mp_ring_producer_ptr(struct mp_ring *ring)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ return mp_ring_item(ring, ring->pidx);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Returns a pointer to the current location in the ring.
|
|
+ * This is used for rings with 1 index.
|
|
+ */
|
|
+static inline void *mp_ring_current(struct mp_ring *ring)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ ASSERT(ring->pidx == 0); /* not used */
|
|
+
|
|
+ return mp_ring_item(ring, ring->cidx);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Increment index for rings with only 1 index.
|
|
+ * This is used for rings with 1 index.
|
|
+ */
|
|
+static inline void *mp_ring_next(struct mp_ring *ring)
|
|
+{
|
|
+ ASSERT(ring);
|
|
+ ASSERT(ring->num > 0);
|
|
+ ASSERT(ring->pidx == 0); /* not used */
|
|
+
|
|
+ ring->cidx = be_addc(ring->cidx, 1, ring->num);
|
|
+ return mp_ring_current(ring);
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine waits for a previously posted mailbox WRB to be completed.
|
|
+ Specifically it waits for the mailbox to say that it's ready to accept
|
|
+ more data by setting the LSB of the mailbox pd register to 1.
|
|
+
|
|
+ pcontroller - The function object to post this data to
|
|
+
|
|
+ IRQL < DISPATCH_LEVEL
|
|
+*/
|
|
+static void be_mcc_mailbox_wait(struct be_function_object *pfob)
|
|
+{
|
|
+ struct MPU_MAILBOX_DB_AMAP mailbox_db;
|
|
+ u32 i = 0;
|
|
+ u32 ready;
|
|
+
|
|
+ if (pfob->emulate) {
|
|
+ /* No waiting for mailbox in emulated mode. */
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ mailbox_db.dw[0] = PD_READ(pfob, mcc_bootstrap_db);
|
|
+ ready = AMAP_GET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db);
|
|
+
|
|
+ while (ready == false) {
|
|
+ if ((++i & 0x3FFFF) == 0) {
|
|
+ TRACE(DL_WARN, "Waiting for mailbox ready - %dk polls",
|
|
+ i / 1000);
|
|
+ }
|
|
+ udelay(1);
|
|
+ mailbox_db.dw[0] = PD_READ(pfob, mcc_bootstrap_db);
|
|
+ ready = AMAP_GET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db);
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine tells the MCC mailbox that there is data to processed
|
|
+ in the mailbox. It does this by setting the physical address for the
|
|
+ mailbox location and clearing the LSB. This routine returns immediately
|
|
+ and does not wait for the WRB to be processed.
|
|
+
|
|
+ pcontroller - The function object to post this data to
|
|
+
|
|
+ IRQL < DISPATCH_LEVEL
|
|
+
|
|
+*/
|
|
+static void be_mcc_mailbox_notify(struct be_function_object *pfob)
|
|
+{
|
|
+ struct MPU_MAILBOX_DB_AMAP mailbox_db;
|
|
+ u32 pa;
|
|
+
|
|
+ ASSERT(pfob->mailbox.pa);
|
|
+ ASSERT(pfob->mailbox.va);
|
|
+
|
|
+ /* If emulated, do not ring the mailbox */
|
|
+ if (pfob->emulate) {
|
|
+ TRACE(DL_WARN, "MPU disabled. Skipping mailbox notify.");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* form the higher bits in the address */
|
|
+ mailbox_db.dw[0] = 0; /* init */
|
|
+ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, hi, &mailbox_db, 1);
|
|
+ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db, 0);
|
|
+
|
|
+ /* bits 34 to 63 */
|
|
+ pa = (u32) (pfob->mailbox.pa >> 34);
|
|
+ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, address, &mailbox_db, pa);
|
|
+
|
|
+ /* Wait for the MPU to be ready */
|
|
+ be_mcc_mailbox_wait(pfob);
|
|
+
|
|
+ /* Ring doorbell 1st time */
|
|
+ PD_WRITE(pfob, mcc_bootstrap_db, mailbox_db.dw[0]);
|
|
+
|
|
+ /* Wait for 1st write to be acknowledged. */
|
|
+ be_mcc_mailbox_wait(pfob);
|
|
+
|
|
+ /* lower bits 30 bits from 4th bit (bits 4 to 33)*/
|
|
+ pa = (u32) (pfob->mailbox.pa >> 4) & 0x3FFFFFFF;
|
|
+
|
|
+ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, hi, &mailbox_db, 0);
|
|
+ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db, 0);
|
|
+ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, address, &mailbox_db, pa);
|
|
+
|
|
+ /* Ring doorbell 2nd time */
|
|
+ PD_WRITE(pfob, mcc_bootstrap_db, mailbox_db.dw[0]);
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine tells the MCC mailbox that there is data to processed
|
|
+ in the mailbox. It does this by setting the physical address for the
|
|
+ mailbox location and clearing the LSB. This routine spins until the
|
|
+ MPU writes a 1 into the LSB indicating that the data has been received
|
|
+ and is ready to be processed.
|
|
+
|
|
+ pcontroller - The function object to post this data to
|
|
+
|
|
+ IRQL < DISPATCH_LEVEL
|
|
+*/
|
|
+static void
|
|
+be_mcc_mailbox_notify_and_wait(struct be_function_object *pfob)
|
|
+{
|
|
+ /*
|
|
+ * Notify it
|
|
+ */
|
|
+ be_mcc_mailbox_notify(pfob);
|
|
+ /*
|
|
+ * Now wait for completion of WRB
|
|
+ */
|
|
+ be_mcc_mailbox_wait(pfob);
|
|
+}
|
|
+
|
|
+void
|
|
+be_mcc_process_cqe(struct be_function_object *pfob,
|
|
+ struct MCC_CQ_ENTRY_AMAP *cqe)
|
|
+{
|
|
+ struct be_mcc_wrb_context *wrb_context = NULL;
|
|
+ u32 offset, status;
|
|
+ u8 *p;
|
|
+
|
|
+ ASSERT(cqe);
|
|
+ /*
|
|
+ * A command completed. Commands complete out-of-order.
|
|
+ * Determine which command completed from the TAG.
|
|
+ */
|
|
+ offset = offsetof(struct BE_MCC_CQ_ENTRY_AMAP, mcc_tag)/8;
|
|
+ p = (u8 *) cqe + offset;
|
|
+ wrb_context = (struct be_mcc_wrb_context *)(void *)(size_t)(*(u64 *)p);
|
|
+ ASSERT(wrb_context);
|
|
+
|
|
+ /*
|
|
+ * Perform a response copy if requested.
|
|
+ * Only copy data if the FWCMD is successful.
|
|
+ */
|
|
+ status = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, completion_status, cqe);
|
|
+ if (status == MGMT_STATUS_SUCCESS && wrb_context->copy.length > 0) {
|
|
+ ASSERT(wrb_context->wrb);
|
|
+ ASSERT(wrb_context->copy.va);
|
|
+ p = (u8 *)wrb_context->wrb +
|
|
+ offsetof(struct BE_MCC_WRB_AMAP, payload)/8;
|
|
+ memcpy(wrb_context->copy.va,
|
|
+ (u8 *)p + wrb_context->copy.fwcmd_offset,
|
|
+ wrb_context->copy.length);
|
|
+ }
|
|
+
|
|
+ if (status)
|
|
+ status = BE_NOT_OK;
|
|
+ /* internal callback */
|
|
+ if (wrb_context->internal_cb) {
|
|
+ wrb_context->internal_cb(wrb_context->internal_cb_context,
|
|
+ status, wrb_context->wrb);
|
|
+ }
|
|
+
|
|
+ /* callback */
|
|
+ if (wrb_context->cb) {
|
|
+ wrb_context->cb(wrb_context->cb_context,
|
|
+ status, wrb_context->wrb);
|
|
+ }
|
|
+ /* Free the context structure */
|
|
+ _be_mcc_free_wrb_context(pfob, wrb_context);
|
|
+}
|
|
+
|
|
+void be_drive_mcc_wrb_queue(struct be_mcc_object *mcc)
|
|
+{
|
|
+ struct be_function_object *pfob = NULL;
|
|
+ int status = BE_PENDING;
|
|
+ struct be_generic_q_ctxt *q_ctxt;
|
|
+ struct MCC_WRB_AMAP *wrb;
|
|
+ struct MCC_WRB_AMAP *queue_wrb;
|
|
+ u32 length, payload_length, sge_count, embedded;
|
|
+ unsigned long irql;
|
|
+
|
|
+ BUILD_BUG_ON((sizeof(struct be_generic_q_ctxt) <
|
|
+ sizeof(struct be_queue_driver_context) +
|
|
+ sizeof(struct MCC_WRB_AMAP)));
|
|
+ pfob = mcc->parent_function;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ if (mcc->driving_backlog) {
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return;
|
|
+ }
|
|
+ /* Acquire the flag to limit 1 thread to redrive posts. */
|
|
+ mcc->driving_backlog = 1;
|
|
+
|
|
+ while (!list_empty(&mcc->backlog)) {
|
|
+ wrb = _be_mpu_peek_ring_wrb(mcc, true); /* Driving the queue */
|
|
+ if (!wrb)
|
|
+ break; /* No space in the ring yet. */
|
|
+ /* Get the next queued entry to process. */
|
|
+ q_ctxt = list_first_entry(&mcc->backlog,
|
|
+ struct be_generic_q_ctxt, context.list);
|
|
+ list_del(&q_ctxt->context.list);
|
|
+ pfob->mcc->backlog_length--;
|
|
+ /*
|
|
+ * Compute the required length of the WRB.
|
|
+ * Since the queue element may be smaller than
|
|
+ * the complete WRB, copy only the required number of bytes.
|
|
+ */
|
|
+ queue_wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
|
|
+ embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, queue_wrb);
|
|
+ if (embedded) {
|
|
+ payload_length = AMAP_GET_BITS_PTR(MCC_WRB,
|
|
+ payload_length, queue_wrb);
|
|
+ length = sizeof(struct be_mcc_wrb_header) +
|
|
+ payload_length;
|
|
+ } else {
|
|
+ sge_count = AMAP_GET_BITS_PTR(MCC_WRB, sge_count,
|
|
+ queue_wrb);
|
|
+ ASSERT(sge_count == 1); /* only 1 frag. */
|
|
+ length = sizeof(struct be_mcc_wrb_header) +
|
|
+ sge_count * sizeof(struct MCC_SGE_AMAP);
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Truncate the length based on the size of the
|
|
+ * queue element. Some elements that have output parameters
|
|
+ * can be smaller than the payload_length field would
|
|
+ * indicate. We really only need to copy the request
|
|
+ * parameters, not the response.
|
|
+ */
|
|
+ length = min(length, (u32) (q_ctxt->context.bytes -
|
|
+ offsetof(struct be_generic_q_ctxt, wrb_header)));
|
|
+
|
|
+ /* Copy the queue element WRB into the ring. */
|
|
+ memcpy(wrb, &q_ctxt->wrb_header, length);
|
|
+
|
|
+ /* Post the wrb. This should not fail assuming we have
|
|
+ * enough context structs. */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL,
|
|
+ q_ctxt->context.cb, q_ctxt->context.cb_context,
|
|
+ q_ctxt->context.internal_cb,
|
|
+ q_ctxt->context.internal_cb_context,
|
|
+ q_ctxt->context.optional_fwcmd_va,
|
|
+ &q_ctxt->context.copy);
|
|
+
|
|
+ if (status == BE_SUCCESS) {
|
|
+ /*
|
|
+ * Synchronous completion. Since it was queued,
|
|
+ * we will invoke the callback.
|
|
+ * To the user, this is an asynchronous request.
|
|
+ */
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+
|
|
+ ASSERT(q_ctxt->context.cb);
|
|
+
|
|
+ q_ctxt->context.cb(
|
|
+ q_ctxt->context.cb_context,
|
|
+ BE_SUCCESS, NULL);
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ } else if (status != BE_PENDING) {
|
|
+ /*
|
|
+ * Another resource failed. Should never happen
|
|
+ * if we have sufficient MCC_WRB_CONTEXT structs.
|
|
+ * Return to head of the queue.
|
|
+ */
|
|
+ TRACE(DL_WARN, "Failed to post a queued WRB. 0x%x",
|
|
+ status);
|
|
+ list_add(&q_ctxt->context.list, &mcc->backlog);
|
|
+ pfob->mcc->backlog_length++;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Free the flag to limit 1 thread to redrive posts. */
|
|
+ mcc->driving_backlog = 0;
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+}
|
|
+
|
|
+/* This function asserts that the WRB was consumed in order. */
|
|
+#ifdef BE_DEBUG
|
|
+u32 be_mcc_wrb_consumed_in_order(struct be_mcc_object *mcc,
|
|
+ struct MCC_CQ_ENTRY_AMAP *cqe)
|
|
+{
|
|
+ struct be_mcc_wrb_context *wrb_context = NULL;
|
|
+ u32 wrb_index;
|
|
+ u32 wrb_consumed_in_order;
|
|
+ u32 offset;
|
|
+ u8 *p;
|
|
+
|
|
+ ASSERT(cqe);
|
|
+ /*
|
|
+ * A command completed. Commands complete out-of-order.
|
|
+ * Determine which command completed from the TAG.
|
|
+ */
|
|
+ offset = offsetof(struct BE_MCC_CQ_ENTRY_AMAP, mcc_tag)/8;
|
|
+ p = (u8 *) cqe + offset;
|
|
+ wrb_context = (struct be_mcc_wrb_context *)(void *)(size_t)(*(u64 *)p);
|
|
+
|
|
+ ASSERT(wrb_context);
|
|
+
|
|
+ wrb_index = (u32) (((u64)(size_t)wrb_context->ring_wrb -
|
|
+ (u64)(size_t)mcc->sq.ring.va) / sizeof(struct MCC_WRB_AMAP));
|
|
+
|
|
+ ASSERT(wrb_index < mcc->sq.ring.num);
|
|
+
|
|
+ wrb_consumed_in_order = (u32) (wrb_index == mcc->consumed_index);
|
|
+ mcc->consumed_index = be_addc(mcc->consumed_index, 1, mcc->sq.ring.num);
|
|
+ return wrb_consumed_in_order;
|
|
+}
|
|
+#endif
|
|
+
|
|
+int be_mcc_process_cq(struct be_mcc_object *mcc, bool rearm)
|
|
+{
|
|
+ struct be_function_object *pfob = NULL;
|
|
+ struct MCC_CQ_ENTRY_AMAP *cqe;
|
|
+ struct CQ_DB_AMAP db;
|
|
+ struct mp_ring *cq_ring = &mcc->cq.ring;
|
|
+ struct mp_ring *mp_ring = &mcc->sq.ring;
|
|
+ u32 num_processed = 0;
|
|
+ u32 consumed = 0, valid, completed, cqe_consumed, async_event;
|
|
+
|
|
+ pfob = mcc->parent_function;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->cq_lock, pfob->cq_irq);
|
|
+
|
|
+ /*
|
|
+ * Verify that only one thread is processing the CQ at once.
|
|
+ * We cannot hold the lock while processing the CQ due to
|
|
+ * the callbacks into the OS. Therefore, this flag is used
|
|
+ * to control it. If any of the threads want to
|
|
+ * rearm the CQ, we need to honor that.
|
|
+ */
|
|
+ if (mcc->processing != 0) {
|
|
+ mcc->rearm = mcc->rearm || rearm;
|
|
+ goto Error;
|
|
+ } else {
|
|
+ mcc->processing = 1; /* lock processing for this thread. */
|
|
+ mcc->rearm = rearm; /* set our rearm setting */
|
|
+ }
|
|
+
|
|
+ spin_unlock_irqrestore(&pfob->cq_lock, pfob->cq_irq);
|
|
+
|
|
+ cqe = mp_ring_current(cq_ring);
|
|
+ valid = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe);
|
|
+ while (valid) {
|
|
+
|
|
+ if (num_processed >= 8) {
|
|
+ /* coalesce doorbells, but free space in cq
|
|
+ * ring while processing. */
|
|
+ db.dw[0] = 0; /* clear */
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, qid, &db, cq_ring->id);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, rearm, &db, false);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, event, &db, false);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &db,
|
|
+ num_processed);
|
|
+ num_processed = 0;
|
|
+
|
|
+ PD_WRITE(pfob, cq_db, db.dw[0]);
|
|
+ }
|
|
+
|
|
+ async_event = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, async_event, cqe);
|
|
+ if (async_event) {
|
|
+ /* This is an asynchronous event. */
|
|
+ struct ASYNC_EVENT_TRAILER_AMAP *async_trailer =
|
|
+ (struct ASYNC_EVENT_TRAILER_AMAP *)
|
|
+ ((u8 *) cqe + sizeof(struct MCC_CQ_ENTRY_AMAP) -
|
|
+ sizeof(struct ASYNC_EVENT_TRAILER_AMAP));
|
|
+ u32 event_code;
|
|
+ async_event = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER,
|
|
+ async_event, async_trailer);
|
|
+ ASSERT(async_event == 1);
|
|
+
|
|
+
|
|
+ valid = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER,
|
|
+ valid, async_trailer);
|
|
+ ASSERT(valid == 1);
|
|
+
|
|
+ /* Call the async event handler if it is installed. */
|
|
+ if (mcc->async_cb) {
|
|
+ event_code =
|
|
+ AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER,
|
|
+ event_code, async_trailer);
|
|
+ mcc->async_cb(mcc->async_context,
|
|
+ (u32) event_code, (void *) cqe);
|
|
+ }
|
|
+
|
|
+ } else {
|
|
+ /* This is a completion entry. */
|
|
+
|
|
+ /* No vm forwarding in this driver. */
|
|
+
|
|
+ cqe_consumed = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY,
|
|
+ consumed, cqe);
|
|
+ if (cqe_consumed) {
|
|
+ /*
|
|
+ * A command on the MCC ring was consumed.
|
|
+ * Update the consumer index.
|
|
+ * These occur in order.
|
|
+ */
|
|
+ ASSERT(be_mcc_wrb_consumed_in_order(mcc, cqe));
|
|
+ consumed++;
|
|
+ }
|
|
+
|
|
+ completed = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY,
|
|
+ completed, cqe);
|
|
+ if (completed) {
|
|
+ /* A command completed. Use tag to
|
|
+ * determine which command. */
|
|
+ be_mcc_process_cqe(pfob, cqe);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Reset the CQE */
|
|
+ AMAP_SET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe, false);
|
|
+ num_processed++;
|
|
+
|
|
+ /* Update our tracking for the CQ ring. */
|
|
+ cqe = mp_ring_next(cq_ring);
|
|
+ valid = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe);
|
|
+ }
|
|
+
|
|
+ TRACE(DL_INFO, "num_processed:0x%x, and consumed:0x%x",
|
|
+ num_processed, consumed);
|
|
+ /*
|
|
+ * Grab the CQ lock to synchronize the "rearm" setting for
|
|
+ * the doorbell, and for clearing the "processing" flag.
|
|
+ */
|
|
+ spin_lock_irqsave(&pfob->cq_lock, pfob->cq_irq);
|
|
+
|
|
+ /*
|
|
+ * Rearm the cq. This is done based on the global mcc->rearm
|
|
+ * flag which combines the rearm parameter from the current
|
|
+ * call to process_cq and any other threads
|
|
+ * that tried to process the CQ while this one was active.
|
|
+ * This handles the situation where a sync. fwcmd was processing
|
|
+ * the CQ while the interrupt/dpc tries to process it.
|
|
+ * The sync process gets to continue -- but it is now
|
|
+ * responsible for the rearming.
|
|
+ */
|
|
+ if (num_processed > 0 || mcc->rearm == true) {
|
|
+ db.dw[0] = 0; /* clear */
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, qid, &db, cq_ring->id);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, rearm, &db, mcc->rearm);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, event, &db, false);
|
|
+ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &db, num_processed);
|
|
+
|
|
+ PD_WRITE(pfob, cq_db, db.dw[0]);
|
|
+ }
|
|
+ /*
|
|
+ * Update the consumer index after ringing the CQ doorbell.
|
|
+ * We don't want another thread to post more WRBs before we
|
|
+ * have CQ space available.
|
|
+ */
|
|
+ mp_ring_consume_multiple(mp_ring, consumed);
|
|
+
|
|
+ /* Clear the processing flag. */
|
|
+ mcc->processing = 0;
|
|
+
|
|
+Error:
|
|
+ spin_unlock_irqrestore(&pfob->cq_lock, pfob->cq_irq);
|
|
+ /*
|
|
+ * Use the local variable to detect if the current thread
|
|
+ * holds the WRB post lock. If rearm is false, this is
|
|
+ * either a synchronous command, or the upper layer driver is polling
|
|
+ * from a thread. We do not drive the queue from that
|
|
+ * context since the driver may hold the
|
|
+ * wrb post lock already.
|
|
+ */
|
|
+ if (rearm)
|
|
+ be_drive_mcc_wrb_queue(mcc);
|
|
+ else
|
|
+ pfob->pend_queue_driving = 1;
|
|
+
|
|
+ return BE_SUCCESS;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *============================================================================
|
|
+ * P U B L I C R O U T I N E S
|
|
+ *============================================================================
|
|
+ */
|
|
+
|
|
+/*
|
|
+ This routine creates an MCC object. This object contains an MCC send queue
|
|
+ and a CQ private to the MCC.
|
|
+
|
|
+ pcontroller - Handle to a function object
|
|
+
|
|
+ EqObject - EQ object that will be used to dispatch this MCC
|
|
+
|
|
+ ppMccObject - Pointer to an internal Mcc Object returned.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull,, otherwise a useful error code
|
|
+ is returned.
|
|
+
|
|
+ IRQL < DISPATCH_LEVEL
|
|
+
|
|
+*/
|
|
+int
|
|
+be_mcc_ring_create(struct be_function_object *pfob,
|
|
+ struct ring_desc *rd, u32 length,
|
|
+ struct be_mcc_wrb_context *context_array,
|
|
+ u32 num_context_entries,
|
|
+ struct be_cq_object *cq, struct be_mcc_object *mcc)
|
|
+{
|
|
+ int status = 0;
|
|
+
|
|
+ struct FWCMD_COMMON_MCC_CREATE *fwcmd = NULL;
|
|
+ struct MCC_WRB_AMAP *wrb = NULL;
|
|
+ u32 num_entries_encoded, n, i;
|
|
+ void *va = NULL;
|
|
+ unsigned long irql;
|
|
+
|
|
+ if (length < sizeof(struct MCC_WRB_AMAP) * 2) {
|
|
+ TRACE(DL_ERR, "Invalid MCC ring length:%d", length);
|
|
+ return BE_NOT_OK;
|
|
+ }
|
|
+ /*
|
|
+ * Reduce the actual ring size to be less than the number
|
|
+ * of context entries. This ensures that we run out of
|
|
+ * ring WRBs first so the queuing works correctly. We never
|
|
+ * queue based on context structs.
|
|
+ */
|
|
+ if (num_context_entries + 1 <
|
|
+ length / sizeof(struct MCC_WRB_AMAP) - 1) {
|
|
+
|
|
+ u32 max_length =
|
|
+ (num_context_entries + 2) * sizeof(struct MCC_WRB_AMAP);
|
|
+
|
|
+ if (is_power_of_2(max_length))
|
|
+ length = __roundup_pow_of_two(max_length+1) / 2;
|
|
+ else
|
|
+ length = __roundup_pow_of_two(max_length) / 2;
|
|
+
|
|
+ ASSERT(length <= max_length);
|
|
+
|
|
+ TRACE(DL_WARN,
|
|
+ "MCC ring length reduced based on context entries."
|
|
+ " length:%d wrbs:%d context_entries:%d", length,
|
|
+ (int) (length / sizeof(struct MCC_WRB_AMAP)),
|
|
+ num_context_entries);
|
|
+ }
|
|
+
|
|
+ spin_lock_irqsave(&pfob->post_lock, irql);
|
|
+
|
|
+ num_entries_encoded =
|
|
+ be_ring_length_to_encoding(length, sizeof(struct MCC_WRB_AMAP));
|
|
+
|
|
+ /* Init MCC object. */
|
|
+ memset(mcc, 0, sizeof(*mcc));
|
|
+ mcc->parent_function = pfob;
|
|
+ mcc->cq_object = cq;
|
|
+
|
|
+ INIT_LIST_HEAD(&mcc->backlog);
|
|
+
|
|
+ wrb = be_function_peek_mcc_wrb(pfob);
|
|
+ if (!wrb) {
|
|
+ ASSERT(wrb);
|
|
+ TRACE(DL_ERR, "No free MCC WRBs in create EQ.");
|
|
+ status = BE_STATUS_NO_MCC_WRB;
|
|
+ goto error;
|
|
+ }
|
|
+ /* Prepares an embedded fwcmd, including request/response sizes. */
|
|
+ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_MCC_CREATE);
|
|
+
|
|
+ fwcmd->params.request.num_pages = DIV_ROUND_UP(length, PAGE_SIZE);
|
|
+ /*
|
|
+ * Program MCC ring context
|
|
+ */
|
|
+ AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, pdid,
|
|
+ &fwcmd->params.request.context, 0);
|
|
+ AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, invalid,
|
|
+ &fwcmd->params.request.context, false);
|
|
+ AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, ring_size,
|
|
+ &fwcmd->params.request.context, num_entries_encoded);
|
|
+
|
|
+ n = cq->cq_id;
|
|
+ AMAP_SET_BITS_PTR(MCC_RING_CONTEXT,
|
|
+ cq_id, &fwcmd->params.request.context, n);
|
|
+ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
|
|
+ ARRAY_SIZE(fwcmd->params.request.pages));
|
|
+ /* Post the f/w command */
|
|
+ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
|
|
+ NULL, NULL, fwcmd, NULL);
|
|
+ if (status != BE_SUCCESS) {
|
|
+ TRACE(DL_ERR, "MCC to create CQ failed.");
|
|
+ goto error;
|
|
+ }
|
|
+ /*
|
|
+ * Create a linked list of context structures
|
|
+ */
|
|
+ mcc->wrb_context.base = context_array;
|
|
+ mcc->wrb_context.num = num_context_entries;
|
|
+ INIT_LIST_HEAD(&mcc->wrb_context.list_head);
|
|
+ memset(context_array, 0,
|
|
+ sizeof(struct be_mcc_wrb_context) * num_context_entries);
|
|
+ for (i = 0; i < mcc->wrb_context.num; i++) {
|
|
+ list_add_tail(&context_array[i].next,
|
|
+ &mcc->wrb_context.list_head);
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ *
|
|
+ * Create an mcc_ring for tracking WRB hw ring
|
|
+ */
|
|
+ va = rd->va;
|
|
+ ASSERT(va);
|
|
+ mp_ring_create(&mcc->sq.ring, length / sizeof(struct MCC_WRB_AMAP),
|
|
+ sizeof(struct MCC_WRB_AMAP), va);
|
|
+ mcc->sq.ring.id = fwcmd->params.response.id;
|
|
+ /*
|
|
+ * Init a mcc_ring for tracking the MCC CQ.
|
|
+ */
|
|
+ ASSERT(cq->va);
|
|
+ mp_ring_create(&mcc->cq.ring, cq->num_entries,
|
|
+ sizeof(struct MCC_CQ_ENTRY_AMAP), cq->va);
|
|
+ mcc->cq.ring.id = cq->cq_id;
|
|
+
|
|
+ /* Force zeroing of CQ. */
|
|
+ memset(cq->va, 0, cq->num_entries * sizeof(struct MCC_CQ_ENTRY_AMAP));
|
|
+
|
|
+ /* Initialize debug index. */
|
|
+ mcc->consumed_index = 0;
|
|
+
|
|
+ atomic_inc(&cq->ref_count);
|
|
+ pfob->mcc = mcc;
|
|
+
|
|
+ TRACE(DL_INFO, "MCC ring created. id:%d bytes:%d cq_id:%d cq_entries:%d"
|
|
+ " num_context:%d", mcc->sq.ring.id, length,
|
|
+ cq->cq_id, cq->num_entries, num_context_entries);
|
|
+
|
|
+error:
|
|
+ spin_unlock_irqrestore(&pfob->post_lock, irql);
|
|
+ if (pfob->pend_queue_driving && pfob->mcc) {
|
|
+ pfob->pend_queue_driving = 0;
|
|
+ be_drive_mcc_wrb_queue(pfob->mcc);
|
|
+ }
|
|
+ return status;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine destroys an MCC send queue
|
|
+
|
|
+ MccObject - Internal Mcc Object to be destroyed.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise an error code is returned.
|
|
+
|
|
+ IRQL < DISPATCH_LEVEL
|
|
+
|
|
+ The caller of this routine must ensure that no other WRB may be posted
|
|
+ until this routine returns.
|
|
+
|
|
+*/
|
|
+int be_mcc_ring_destroy(struct be_mcc_object *mcc)
|
|
+{
|
|
+ int status = 0;
|
|
+ struct be_function_object *pfob = mcc->parent_function;
|
|
+
|
|
+
|
|
+ ASSERT(mcc->processing == 0);
|
|
+
|
|
+ /*
|
|
+ * Remove the ring from the function object.
|
|
+ * This transitions back to mailbox mode.
|
|
+ */
|
|
+ pfob->mcc = NULL;
|
|
+
|
|
+ /* Send fwcmd to destroy the queue. (Using the mailbox.) */
|
|
+ status = be_function_ring_destroy(mcc->parent_function, mcc->sq.ring.id,
|
|
+ FWCMD_RING_TYPE_MCC, NULL, NULL, NULL, NULL);
|
|
+ ASSERT(status == 0);
|
|
+
|
|
+ /* Release the SQ reference to the CQ */
|
|
+ atomic_dec(&mcc->cq_object->ref_count);
|
|
+
|
|
+ return status;
|
|
+}
|
|
+
|
|
+static void
|
|
+mcc_wrb_sync_cb(void *context, int staus, struct MCC_WRB_AMAP *wrb)
|
|
+{
|
|
+ struct be_mcc_wrb_context *wrb_context =
|
|
+ (struct be_mcc_wrb_context *) context;
|
|
+ ASSERT(wrb_context);
|
|
+ *wrb_context->users_final_status = staus;
|
|
+}
|
|
+
|
|
+/*
|
|
+ This routine posts a command to the MCC send queue
|
|
+
|
|
+ mcc - Internal Mcc Object to be destroyed.
|
|
+
|
|
+ wrb - wrb to post.
|
|
+
|
|
+ Returns BE_SUCCESS if successfull, otherwise an error code is returned.
|
|
+
|
|
+ IRQL < DISPATCH_LEVEL if CompletionCallback is not NULL
|
|
+ IRQL <=DISPATCH_LEVEL if CompletionCallback is NULL
|
|
+
|
|
+ If this routine is called with CompletionCallback != NULL the
|
|
+ call is considered to be asynchronous and will return as soon
|
|
+ as the WRB is posted to the MCC with BE_PENDING.
|
|
+
|
|
+ If CompletionCallback is NULL, then this routine will not return until
|
|
+ a completion for this MCC command has been processed.
|
|
+ If called at DISPATCH_LEVEL the CompletionCallback must be NULL.
|
|
+
|
|
+ This routine should only be called if the MPU has been boostraped past
|
|
+ mailbox mode.
|
|
+
|
|
+
|
|
+*/
|
|
+int
|
|
+_be_mpu_post_wrb_ring(struct be_mcc_object *mcc, struct MCC_WRB_AMAP *wrb,
|
|
+ struct be_mcc_wrb_context *wrb_context)
|
|
+{
|
|
+
|
|
+ struct MCC_WRB_AMAP *ring_wrb = NULL;
|
|
+ int status = BE_PENDING;
|
|
+ int final_status = BE_PENDING;
|
|
+ mcc_wrb_cqe_callback cb = NULL;
|
|
+ struct MCC_DB_AMAP mcc_db;
|
|
+ u32 embedded;
|
|
+
|
|
+ ASSERT(mp_ring_num_empty(&mcc->sq.ring) > 0);
|
|
+ /*
|
|
+ * Input wrb is most likely the next wrb in the ring, since the client
|
|
+ * can peek at the address.
|
|
+ */
|
|
+ ring_wrb = mp_ring_producer_ptr(&mcc->sq.ring);
|
|
+ if (wrb != ring_wrb) {
|
|
+ /* If not equal, copy it into the ring. */
|
|
+ memcpy(ring_wrb, wrb, sizeof(struct MCC_WRB_AMAP));
|
|
+ }
|
|
+#ifdef BE_DEBUG
|
|
+ wrb_context->ring_wrb = ring_wrb;
|
|
+#endif
|
|
+ embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, ring_wrb);
|
|
+ if (embedded) {
|
|
+ /* embedded commands will have the response within the WRB. */
|
|
+ wrb_context->wrb = ring_wrb;
|
|
+ } else {
|
|
+ /*
|
|
+ * non-embedded commands will not have the response
|
|
+ * within the WRB, and they may complete out-of-order.
|
|
+ * The WRB will not be valid to inspect
|
|
+ * during the completion.
|
|
+ */
|
|
+ wrb_context->wrb = NULL;
|
|
+ }
|
|
+ cb = wrb_context->cb;
|
|
+
|
|
+ if (cb == NULL) {
|
|
+ /* Assign our internal callback if this is a
|
|
+ * synchronous call. */
|
|
+ wrb_context->cb = mcc_wrb_sync_cb;
|
|
+ wrb_context->cb_context = wrb_context;
|
|
+ wrb_context->users_final_status = &final_status;
|
|
+ }
|
|
+ /* Increment producer index */
|
|
+
|
|
+ mcc_db.dw[0] = 0; /* initialize */
|
|
+ AMAP_SET_BITS_PTR(MCC_DB, rid, &mcc_db, mcc->sq.ring.id);
|
|
+ AMAP_SET_BITS_PTR(MCC_DB, numPosted, &mcc_db, 1);
|
|
+
|
|
+ mp_ring_produce(&mcc->sq.ring);
|
|
+ PD_WRITE(mcc->parent_function, mpu_mcc_db, mcc_db.dw[0]);
|
|
+ TRACE(DL_INFO, "pidx: %x and cidx: %x.", mcc->sq.ring.pidx,
|
|
+ mcc->sq.ring.cidx);
|
|
+
|
|
+ if (cb == NULL) {
|
|
+ int polls = 0; /* At >= 1 us per poll */
|
|
+ /* Wait until this command completes, polling the CQ. */
|
|
+ do {
|
|
+ TRACE(DL_INFO, "FWCMD submitted in the poll mode.");
|
|
+ /* Do not rearm CQ in this context. */
|
|
+ be_mcc_process_cq(mcc, false);
|
|
+
|
|
+ if (final_status == BE_PENDING) {
|
|
+ if ((++polls & 0x7FFFF) == 0) {
|
|
+ TRACE(DL_WARN,
|
|
+ "Warning : polling MCC CQ for %d"
|
|
+ "ms.", polls / 1000);
|
|
+ }
|
|
+
|
|
+ udelay(1);
|
|
+ }
|
|
+
|
|
+ /* final_status changed when the command completes */
|
|
+ } while (final_status == BE_PENDING);
|
|
+
|
|
+ status = final_status;
|
|
+ }
|
|
+
|
|
+ return status;
|
|
+}
|
|
+
|
|
+struct MCC_WRB_AMAP *
|
|
+_be_mpu_peek_ring_wrb(struct be_mcc_object *mcc, bool driving_queue)
|
|
+{
|
|
+ /* If we have queued items, do not allow a post to bypass the queue. */
|
|
+ if (!driving_queue && !list_empty(&mcc->backlog))
|
|
+ return NULL;
|
|
+
|
|
+ if (mp_ring_num_empty(&mcc->sq.ring) <= 0)
|
|
+ return NULL;
|
|
+ return (struct MCC_WRB_AMAP *) mp_ring_producer_ptr(&mcc->sq.ring);
|
|
+}
|
|
+
|
|
+int
|
|
+be_mpu_init_mailbox(struct be_function_object *pfob, struct ring_desc *mailbox)
|
|
+{
|
|
+ ASSERT(mailbox);
|
|
+ pfob->mailbox.va = mailbox->va;
|
|
+ pfob->mailbox.pa = cpu_to_le64(mailbox->pa);
|
|
+ pfob->mailbox.length = mailbox->length;
|
|
+
|
|
+ ASSERT(((u32)(size_t)pfob->mailbox.va & 0xf) == 0);
|
|
+ ASSERT(((u32)(size_t)pfob->mailbox.pa & 0xf) == 0);
|
|
+ /*
|
|
+ * Issue the WRB to set MPU endianness
|
|
+ */
|
|
+ {
|
|
+ u64 *endian_check = (u64 *) (pfob->mailbox.va +
|
|
+ offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8);
|
|
+ *endian_check = 0xFF1234FFFF5678FFULL;
|
|
+ }
|
|
+
|
|
+ be_mcc_mailbox_notify_and_wait(pfob);
|
|
+
|
|
+ return BE_SUCCESS;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ This routine posts a command to the MCC mailbox.
|
|
+
|
|
+ FuncObj - Function Object to post the WRB on behalf of.
|
|
+ wrb - wrb to post.
|
|
+ CompletionCallback - Address of a callback routine to invoke once the WRB
|
|
+ is completed.
|
|
+ CompletionCallbackContext - Opaque context to be passed during the call to
|
|
+ the CompletionCallback.
|
|
+ Returns BE_SUCCESS if successfull, otherwise an error code is returned.
|
|
+
|
|
+ IRQL <=DISPATCH_LEVEL if CompletionCallback is NULL
|
|
+
|
|
+ This routine will block until a completion for this MCC command has been
|
|
+ processed. If called at DISPATCH_LEVEL the CompletionCallback must be NULL.
|
|
+
|
|
+ This routine should only be called if the MPU has not been boostraped past
|
|
+ mailbox mode.
|
|
+*/
|
|
+int
|
|
+_be_mpu_post_wrb_mailbox(struct be_function_object *pfob,
|
|
+ struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context)
|
|
+{
|
|
+ struct MCC_MAILBOX_AMAP *mailbox = NULL;
|
|
+ struct MCC_WRB_AMAP *mb_wrb;
|
|
+ struct MCC_CQ_ENTRY_AMAP *mb_cq;
|
|
+ u32 offset, status;
|
|
+
|
|
+ ASSERT(pfob->mcc == NULL);
|
|
+ mailbox = pfob->mailbox.va;
|
|
+ ASSERT(mailbox);
|
|
+
|
|
+ offset = offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8;
|
|
+ mb_wrb = (struct MCC_WRB_AMAP *) (u8 *)mailbox + offset;
|
|
+ if (mb_wrb != wrb) {
|
|
+ memset(mailbox, 0, sizeof(*mailbox));
|
|
+ memcpy(mb_wrb, wrb, sizeof(struct MCC_WRB_AMAP));
|
|
+ }
|
|
+ /* The callback can inspect the final WRB to get output parameters. */
|
|
+ wrb_context->wrb = mb_wrb;
|
|
+
|
|
+ be_mcc_mailbox_notify_and_wait(pfob);
|
|
+
|
|
+ /* A command completed. Use tag to determine which command. */
|
|
+ offset = offsetof(struct BE_MCC_MAILBOX_AMAP, cq)/8;
|
|
+ mb_cq = (struct MCC_CQ_ENTRY_AMAP *) ((u8 *)mailbox + offset);
|
|
+ be_mcc_process_cqe(pfob, mb_cq);
|
|
+
|
|
+ status = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, completion_status, mb_cq);
|
|
+ if (status)
|
|
+ status = BE_NOT_OK;
|
|
+ return status;
|
|
+}
|
|
+
|
|
+struct be_mcc_wrb_context *
|
|
+_be_mcc_allocate_wrb_context(struct be_function_object *pfob)
|
|
+{
|
|
+ struct be_mcc_wrb_context *context = NULL;
|
|
+ unsigned long irq;
|
|
+
|
|
+ spin_lock_irqsave(&pfob->mcc_context_lock, irq);
|
|
+
|
|
+ if (!pfob->mailbox.default_context_allocated) {
|
|
+ /* Use the single default context that we
|
|
+ * always have allocated. */
|
|
+ pfob->mailbox.default_context_allocated = true;
|
|
+ context = &pfob->mailbox.default_context;
|
|
+ } else if (pfob->mcc) {
|
|
+ /* Get a context from the free list. If any are available. */
|
|
+ if (!list_empty(&pfob->mcc->wrb_context.list_head)) {
|
|
+ context = list_first_entry(
|
|
+ &pfob->mcc->wrb_context.list_head,
|
|
+ struct be_mcc_wrb_context, next);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ spin_unlock_irqrestore(&pfob->mcc_context_lock, irq);
|
|
+
|
|
+ return context;
|
|
+}
|
|
+
|
|
+void
|
|
+_be_mcc_free_wrb_context(struct be_function_object *pfob,
|
|
+ struct be_mcc_wrb_context *context)
|
|
+{
|
|
+ unsigned long irq;
|
|
+
|
|
+ ASSERT(context);
|
|
+ /*
|
|
+ * Zero during free to try and catch any bugs where the context
|
|
+ * is accessed after a free.
|
|
+ */
|
|
+ memset(context, 0, sizeof(context));
|
|
+
|
|
+ spin_lock_irqsave(&pfob->mcc_context_lock, irq);
|
|
+
|
|
+ if (context == &pfob->mailbox.default_context) {
|
|
+ /* Free the default context. */
|
|
+ ASSERT(pfob->mailbox.default_context_allocated);
|
|
+ pfob->mailbox.default_context_allocated = false;
|
|
+ } else {
|
|
+ /* Add to free list. */
|
|
+ ASSERT(pfob->mcc);
|
|
+ list_add_tail(&context->next,
|
|
+ &pfob->mcc->wrb_context.list_head);
|
|
+ }
|
|
+
|
|
+ spin_unlock_irqrestore(&pfob->mcc_context_lock, irq);
|
|
+}
|
|
+
|
|
+int
|
|
+be_mcc_add_async_event_callback(struct be_mcc_object *mcc_object,
|
|
+ mcc_async_event_callback cb, void *cb_context)
|
|
+{
|
|
+ /* Lock against anyone trying to change the callback/context pointers
|
|
+ * while being used. */
|
|
+ spin_lock_irqsave(&mcc_object->parent_function->cq_lock,
|
|
+ mcc_object->parent_function->cq_irq);
|
|
+
|
|
+ /* Assign the async callback. */
|
|
+ mcc_object->async_context = cb_context;
|
|
+ mcc_object->async_cb = cb;
|
|
+
|
|
+ spin_unlock_irqrestore(&mcc_object->parent_function->cq_lock,
|
|
+ mcc_object->parent_function->cq_irq);
|
|
+
|
|
+ return BE_SUCCESS;
|
|
+}
|
|
+
|
|
+#define MPU_EP_CONTROL 0
|
|
+#define MPU_EP_SEMAPHORE 0xac
|
|
+
|
|
+/*
|
|
+ *-------------------------------------------------------------------
|
|
+ * Function: be_wait_for_POST_complete
|
|
+ * Waits until the BladeEngine POST completes (either in error or success).
|
|
+ * pfob -
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *-------------------------------------------------------------------
|
|
+ */
|
|
+static int be_wait_for_POST_complete(struct be_function_object *pfob)
|
|
+{
|
|
+ struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status;
|
|
+ int s;
|
|
+ u32 post_error, post_stage;
|
|
+
|
|
+ const u32 us_per_loop = 1000; /* 1000us */
|
|
+ const u32 print_frequency_loops = 1000000 / us_per_loop;
|
|
+ const u32 max_loops = 60 * print_frequency_loops;
|
|
+ u32 loops = 0;
|
|
+
|
|
+ /*
|
|
+ * Wait for arm fw indicating it is done or a fatal error happened.
|
|
+ * Note: POST can take some time to complete depending on configuration
|
|
+ * settings (consider ARM attempts to acquire an IP address
|
|
+ * over DHCP!!!).
|
|
+ *
|
|
+ */
|
|
+ do {
|
|
+ status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE);
|
|
+ post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT,
|
|
+ error, &status);
|
|
+ post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT,
|
|
+ stage, &status);
|
|
+ if (0 == (loops % print_frequency_loops)) {
|
|
+ /* Print current status */
|
|
+ TRACE(DL_INFO, "POST status = 0x%x (stage = 0x%x)",
|
|
+ status.dw[0], post_stage);
|
|
+ }
|
|
+ udelay(us_per_loop);
|
|
+ } while ((post_error != 1) &&
|
|
+ (post_stage != POST_STAGE_ARMFW_READY) &&
|
|
+ (++loops < max_loops));
|
|
+
|
|
+ if (post_error == 1) {
|
|
+ TRACE(DL_ERR, "POST error! Status = 0x%x (stage = 0x%x)",
|
|
+ status.dw[0], post_stage);
|
|
+ s = BE_NOT_OK;
|
|
+ } else if (post_stage != POST_STAGE_ARMFW_READY) {
|
|
+ TRACE(DL_ERR, "POST time-out! Status = 0x%x (stage = 0x%x)",
|
|
+ status.dw[0], post_stage);
|
|
+ s = BE_NOT_OK;
|
|
+ } else {
|
|
+ s = BE_SUCCESS;
|
|
+ }
|
|
+ return s;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *-------------------------------------------------------------------
|
|
+ * Function: be_kickoff_and_wait_for_POST
|
|
+ * Interacts with the BladeEngine management processor to initiate POST, and
|
|
+ * subsequently waits until POST completes (either in error or success).
|
|
+ * The caller must acquire the reset semaphore before initiating POST
|
|
+ * to prevent multiple drivers interacting with the management processor.
|
|
+ * Once POST is complete the caller must release the reset semaphore.
|
|
+ * Callers who only want to wait for POST complete may call
|
|
+ * be_wait_for_POST_complete.
|
|
+ * pfob -
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *-------------------------------------------------------------------
|
|
+ */
|
|
+static int
|
|
+be_kickoff_and_wait_for_POST(struct be_function_object *pfob)
|
|
+{
|
|
+ struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status;
|
|
+ int s;
|
|
+
|
|
+ const u32 us_per_loop = 1000; /* 1000us */
|
|
+ const u32 print_frequency_loops = 1000000 / us_per_loop;
|
|
+ const u32 max_loops = 5 * print_frequency_loops;
|
|
+ u32 loops = 0;
|
|
+ u32 post_error, post_stage;
|
|
+
|
|
+ /* Wait for arm fw awaiting host ready or a fatal error happened. */
|
|
+ TRACE(DL_INFO, "Wait for BladeEngine ready to POST");
|
|
+ do {
|
|
+ status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE);
|
|
+ post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT,
|
|
+ error, &status);
|
|
+ post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT,
|
|
+ stage, &status);
|
|
+ if (0 == (loops % print_frequency_loops)) {
|
|
+ /* Print current status */
|
|
+ TRACE(DL_INFO, "POST status = 0x%x (stage = 0x%x)",
|
|
+ status.dw[0], post_stage);
|
|
+ }
|
|
+ udelay(us_per_loop);
|
|
+ } while ((post_error != 1) &&
|
|
+ (post_stage < POST_STAGE_AWAITING_HOST_RDY) &&
|
|
+ (++loops < max_loops));
|
|
+
|
|
+ if (post_error == 1) {
|
|
+ TRACE(DL_ERR, "Pre-POST error! Status = 0x%x (stage = 0x%x)",
|
|
+ status.dw[0], post_stage);
|
|
+ s = BE_NOT_OK;
|
|
+ } else if (post_stage == POST_STAGE_AWAITING_HOST_RDY) {
|
|
+ iowrite32(POST_STAGE_HOST_RDY, pfob->csr_va + MPU_EP_SEMAPHORE);
|
|
+
|
|
+ /* Wait for POST to complete */
|
|
+ s = be_wait_for_POST_complete(pfob);
|
|
+ } else {
|
|
+ /*
|
|
+ * Either a timeout waiting for host ready signal or POST has
|
|
+ * moved ahead without requiring a host ready signal.
|
|
+ * Might as well give POST a chance to complete
|
|
+ * (or timeout again).
|
|
+ */
|
|
+ s = be_wait_for_POST_complete(pfob);
|
|
+ }
|
|
+ return s;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *-------------------------------------------------------------------
|
|
+ * Function: be_pci_soft_reset
|
|
+ * This function is called to issue a BladeEngine soft reset.
|
|
+ * Callers should acquire the soft reset semaphore before calling this
|
|
+ * function. Additionaly, callers should ensure they cannot be pre-empted
|
|
+ * while the routine executes. Upon completion of this routine, callers
|
|
+ * should release the reset semaphore. This routine implicitly waits
|
|
+ * for BladeEngine POST to complete.
|
|
+ * pfob -
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *-------------------------------------------------------------------
|
|
+ */
|
|
+int be_pci_soft_reset(struct be_function_object *pfob)
|
|
+{
|
|
+ struct PCICFG_SOFT_RESET_CSR_AMAP soft_reset;
|
|
+ struct PCICFG_ONLINE0_CSR_AMAP pciOnline0;
|
|
+ struct PCICFG_ONLINE1_CSR_AMAP pciOnline1;
|
|
+ struct EP_CONTROL_CSR_AMAP epControlCsr;
|
|
+ int status = BE_SUCCESS;
|
|
+ u32 i, soft_reset_bit;
|
|
+
|
|
+ TRACE(DL_NOTE, "PCI reset...");
|
|
+
|
|
+ /* Issue soft reset #1 to get BladeEngine into a known state. */
|
|
+ soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset);
|
|
+ AMAP_SET_BITS_PTR(PCICFG_SOFT_RESET_CSR, softreset, soft_reset.dw, 1);
|
|
+ PCICFG0_WRITE(pfob, host_timer_int_ctrl, soft_reset.dw[0]);
|
|
+ /*
|
|
+ * wait til soft reset is deasserted - hardware
|
|
+ * deasserts after some time.
|
|
+ */
|
|
+ i = 0;
|
|
+ do {
|
|
+ udelay(50);
|
|
+ soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset);
|
|
+ soft_reset_bit = AMAP_GET_BITS_PTR(PCICFG_SOFT_RESET_CSR,
|
|
+ softreset, soft_reset.dw);
|
|
+ } while (soft_reset_bit && (i++ < 1024));
|
|
+ if (soft_reset_bit != 0) {
|
|
+ TRACE(DL_ERR, "Soft-reset #1 did not deassert as expected.");
|
|
+ status = BE_NOT_OK;
|
|
+ goto Error_label;
|
|
+ }
|
|
+ /* Mask everything */
|
|
+ PCICFG0_WRITE(pfob, ue_status_low_mask, 0xFFFFFFFF);
|
|
+ PCICFG0_WRITE(pfob, ue_status_hi_mask, 0xFFFFFFFF);
|
|
+ /*
|
|
+ * Set everything offline except MPU IRAM (it is offline with
|
|
+ * the soft-reset, but soft-reset does not reset the PCICFG registers!)
|
|
+ */
|
|
+ pciOnline0.dw[0] = 0;
|
|
+ pciOnline1.dw[0] = 0;
|
|
+ AMAP_SET_BITS_PTR(PCICFG_ONLINE1_CSR, mpu_iram_online,
|
|
+ pciOnline1.dw, 1);
|
|
+ PCICFG0_WRITE(pfob, online0, pciOnline0.dw[0]);
|
|
+ PCICFG0_WRITE(pfob, online1, pciOnline1.dw[0]);
|
|
+
|
|
+ udelay(20000);
|
|
+
|
|
+ /* Issue soft reset #2. */
|
|
+ AMAP_SET_BITS_PTR(PCICFG_SOFT_RESET_CSR, softreset, soft_reset.dw, 1);
|
|
+ PCICFG0_WRITE(pfob, host_timer_int_ctrl, soft_reset.dw[0]);
|
|
+ /*
|
|
+ * wait til soft reset is deasserted - hardware
|
|
+ * deasserts after some time.
|
|
+ */
|
|
+ i = 0;
|
|
+ do {
|
|
+ udelay(50);
|
|
+ soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset);
|
|
+ soft_reset_bit = AMAP_GET_BITS_PTR(PCICFG_SOFT_RESET_CSR,
|
|
+ softreset, soft_reset.dw);
|
|
+ } while (soft_reset_bit && (i++ < 1024));
|
|
+ if (soft_reset_bit != 0) {
|
|
+ TRACE(DL_ERR, "Soft-reset #1 did not deassert as expected.");
|
|
+ status = BE_NOT_OK;
|
|
+ goto Error_label;
|
|
+ }
|
|
+
|
|
+
|
|
+ udelay(20000);
|
|
+
|
|
+ /* Take MPU out of reset. */
|
|
+
|
|
+ epControlCsr.dw[0] = ioread32(pfob->csr_va + MPU_EP_CONTROL);
|
|
+ AMAP_SET_BITS_PTR(EP_CONTROL_CSR, CPU_reset, &epControlCsr, 0);
|
|
+ iowrite32((u32)epControlCsr.dw[0], pfob->csr_va + MPU_EP_CONTROL);
|
|
+
|
|
+ /* Kickoff BE POST and wait for completion */
|
|
+ status = be_kickoff_and_wait_for_POST(pfob);
|
|
+
|
|
+Error_label:
|
|
+ return status;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ *-------------------------------------------------------------------
|
|
+ * Function: be_pci_reset_required
|
|
+ * This private function is called to detect if a host entity is
|
|
+ * required to issue a PCI soft reset and subsequently drive
|
|
+ * BladeEngine POST. Scenarios where this is required:
|
|
+ * 1) BIOS-less configuration
|
|
+ * 2) Hot-swap/plug/power-on
|
|
+ * pfob -
|
|
+ * return true if a reset is required, false otherwise
|
|
+ *-------------------------------------------------------------------
|
|
+ */
|
|
+static bool be_pci_reset_required(struct be_function_object *pfob)
|
|
+{
|
|
+ struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status;
|
|
+ bool do_reset = false;
|
|
+ u32 post_error, post_stage;
|
|
+
|
|
+ /*
|
|
+ * Read the POST status register
|
|
+ */
|
|
+ status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE);
|
|
+ post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, error,
|
|
+ &status);
|
|
+ post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, stage,
|
|
+ &status);
|
|
+ if (post_stage <= POST_STAGE_AWAITING_HOST_RDY) {
|
|
+ /*
|
|
+ * If BladeEngine is waiting for host ready indication,
|
|
+ * we want to do a PCI reset.
|
|
+ */
|
|
+ do_reset = true;
|
|
+ }
|
|
+
|
|
+ return do_reset;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *-------------------------------------------------------------------
|
|
+ * Function: be_drive_POST
|
|
+ * This function is called to drive BladeEngine POST. The
|
|
+ * caller should ensure they cannot be pre-empted while this routine executes.
|
|
+ * pfob -
|
|
+ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
|
|
+ *-------------------------------------------------------------------
|
|
+ */
|
|
+int be_drive_POST(struct be_function_object *pfob)
|
|
+{
|
|
+ int status;
|
|
+
|
|
+ if (false != be_pci_reset_required(pfob)) {
|
|
+ /* PCI reset is needed (implicitly starts and waits for POST) */
|
|
+ status = be_pci_soft_reset(pfob);
|
|
+ } else {
|
|
+ /* No PCI reset is needed, start POST */
|
|
+ status = be_kickoff_and_wait_for_POST(pfob);
|
|
+ }
|
|
+
|
|
+ return status;
|
|
+}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/mpu_context.h linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu_context.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/mpu_context.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu_context.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,46 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __mpu_context_amap_h__
|
|
+#define __mpu_context_amap_h__
|
|
+
|
|
+/*
|
|
+ * Management command and control ring context. The MPUs BTLR_CTRL1 CSR
|
|
+ * controls the writeback behavior of the producer and consumer index values.
|
|
+ */
|
|
+struct BE_MCC_RING_CONTEXT_AMAP {
|
|
+ u8 con_index[16]; /* DWORD 0 */
|
|
+ u8 ring_size[4]; /* DWORD 0 */
|
|
+ u8 cq_id[11]; /* DWORD 0 */
|
|
+ u8 rsvd0; /* DWORD 0 */
|
|
+ u8 prod_index[16]; /* DWORD 1 */
|
|
+ u8 pdid[15]; /* DWORD 1 */
|
|
+ u8 invalid; /* DWORD 1 */
|
|
+ u8 cmd_pending_current[7]; /* DWORD 2 */
|
|
+ u8 rsvd1[25]; /* DWORD 2 */
|
|
+ u8 hpi_port_cq_id[11]; /* DWORD 3 */
|
|
+ u8 rsvd2[5]; /* DWORD 3 */
|
|
+ u8 cmd_pending_max[7]; /* DWORD 3 */
|
|
+ u8 rsvd3[9]; /* DWORD 3 */
|
|
+} __packed;
|
|
+struct MCC_RING_CONTEXT_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+#endif /* __mpu_context_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/mpu.h linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/mpu.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,74 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __mpu_amap_h__
|
|
+#define __mpu_amap_h__
|
|
+#include "ep.h"
|
|
+
|
|
+/* Provide control parameters for the Managment Processor Unit. */
|
|
+struct BE_MPU_CSRMAP_AMAP {
|
|
+ struct BE_EP_CSRMAP_AMAP ep;
|
|
+ u8 rsvd0[128]; /* DWORD 64 */
|
|
+ u8 rsvd1[32]; /* DWORD 68 */
|
|
+ u8 rsvd2[192]; /* DWORD 69 */
|
|
+ u8 rsvd3[192]; /* DWORD 75 */
|
|
+ u8 rsvd4[32]; /* DWORD 81 */
|
|
+ u8 rsvd5[32]; /* DWORD 82 */
|
|
+ u8 rsvd6[32]; /* DWORD 83 */
|
|
+ u8 rsvd7[32]; /* DWORD 84 */
|
|
+ u8 rsvd8[32]; /* DWORD 85 */
|
|
+ u8 rsvd9[32]; /* DWORD 86 */
|
|
+ u8 rsvd10[32]; /* DWORD 87 */
|
|
+ u8 rsvd11[32]; /* DWORD 88 */
|
|
+ u8 rsvd12[32]; /* DWORD 89 */
|
|
+ u8 rsvd13[32]; /* DWORD 90 */
|
|
+ u8 rsvd14[32]; /* DWORD 91 */
|
|
+ u8 rsvd15[32]; /* DWORD 92 */
|
|
+ u8 rsvd16[32]; /* DWORD 93 */
|
|
+ u8 rsvd17[32]; /* DWORD 94 */
|
|
+ u8 rsvd18[32]; /* DWORD 95 */
|
|
+ u8 rsvd19[32]; /* DWORD 96 */
|
|
+ u8 rsvd20[32]; /* DWORD 97 */
|
|
+ u8 rsvd21[32]; /* DWORD 98 */
|
|
+ u8 rsvd22[32]; /* DWORD 99 */
|
|
+ u8 rsvd23[32]; /* DWORD 100 */
|
|
+ u8 rsvd24[32]; /* DWORD 101 */
|
|
+ u8 rsvd25[32]; /* DWORD 102 */
|
|
+ u8 rsvd26[32]; /* DWORD 103 */
|
|
+ u8 rsvd27[32]; /* DWORD 104 */
|
|
+ u8 rsvd28[96]; /* DWORD 105 */
|
|
+ u8 rsvd29[32]; /* DWORD 108 */
|
|
+ u8 rsvd30[32]; /* DWORD 109 */
|
|
+ u8 rsvd31[32]; /* DWORD 110 */
|
|
+ u8 rsvd32[32]; /* DWORD 111 */
|
|
+ u8 rsvd33[32]; /* DWORD 112 */
|
|
+ u8 rsvd34[96]; /* DWORD 113 */
|
|
+ u8 rsvd35[32]; /* DWORD 116 */
|
|
+ u8 rsvd36[32]; /* DWORD 117 */
|
|
+ u8 rsvd37[32]; /* DWORD 118 */
|
|
+ u8 rsvd38[32]; /* DWORD 119 */
|
|
+ u8 rsvd39[32]; /* DWORD 120 */
|
|
+ u8 rsvd40[32]; /* DWORD 121 */
|
|
+ u8 rsvd41[134][32]; /* DWORD 122 */
|
|
+} __packed;
|
|
+struct MPU_CSRMAP_AMAP {
|
|
+ u32 dw[256];
|
|
+};
|
|
+
|
|
+#endif /* __mpu_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/pcicfg.h linux-2.6.29-rc3.owrt/drivers/staging/benet/pcicfg.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/pcicfg.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/pcicfg.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,825 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __pcicfg_amap_h__
|
|
+#define __pcicfg_amap_h__
|
|
+
|
|
+/* Vendor and Device ID Register. */
|
|
+struct BE_PCICFG_ID_CSR_AMAP {
|
|
+ u8 vendorid[16]; /* DWORD 0 */
|
|
+ u8 deviceid[16]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_ID_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* IO Bar Register. */
|
|
+struct BE_PCICFG_IOBAR_CSR_AMAP {
|
|
+ u8 iospace; /* DWORD 0 */
|
|
+ u8 rsvd0[7]; /* DWORD 0 */
|
|
+ u8 iobar[24]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_IOBAR_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Memory BAR 0 Register. */
|
|
+struct BE_PCICFG_MEMBAR0_CSR_AMAP {
|
|
+ u8 memspace; /* DWORD 0 */
|
|
+ u8 type[2]; /* DWORD 0 */
|
|
+ u8 pf; /* DWORD 0 */
|
|
+ u8 rsvd0[10]; /* DWORD 0 */
|
|
+ u8 membar0[18]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MEMBAR0_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Memory BAR 1 - Low Address Register. */
|
|
+struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP {
|
|
+ u8 memspace; /* DWORD 0 */
|
|
+ u8 type[2]; /* DWORD 0 */
|
|
+ u8 pf; /* DWORD 0 */
|
|
+ u8 rsvd0[13]; /* DWORD 0 */
|
|
+ u8 membar1lo[15]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MEMBAR1_LO_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Memory BAR 1 - High Address Register. */
|
|
+struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP {
|
|
+ u8 membar1hi[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MEMBAR1_HI_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Memory BAR 2 - Low Address Register. */
|
|
+struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP {
|
|
+ u8 memspace; /* DWORD 0 */
|
|
+ u8 type[2]; /* DWORD 0 */
|
|
+ u8 pf; /* DWORD 0 */
|
|
+ u8 rsvd0[17]; /* DWORD 0 */
|
|
+ u8 membar2lo[11]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MEMBAR2_LO_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Memory BAR 2 - High Address Register. */
|
|
+struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP {
|
|
+ u8 membar2hi[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MEMBAR2_HI_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Subsystem Vendor and ID (Function 0) Register. */
|
|
+struct BE_PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP {
|
|
+ u8 subsys_vendor_id[16]; /* DWORD 0 */
|
|
+ u8 subsys_id[16]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Subsystem Vendor and ID (Function 1) Register. */
|
|
+struct BE_PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP {
|
|
+ u8 subsys_vendor_id[16]; /* DWORD 0 */
|
|
+ u8 subsys_id[16]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Semaphore Register. */
|
|
+struct BE_PCICFG_SEMAPHORE_CSR_AMAP {
|
|
+ u8 locked; /* DWORD 0 */
|
|
+ u8 rsvd0[31]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_SEMAPHORE_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Soft Reset Register. */
|
|
+struct BE_PCICFG_SOFT_RESET_CSR_AMAP {
|
|
+ u8 rsvd0[7]; /* DWORD 0 */
|
|
+ u8 softreset; /* DWORD 0 */
|
|
+ u8 rsvd1[16]; /* DWORD 0 */
|
|
+ u8 nec_ll_rcvdetect_i[8]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_SOFT_RESET_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Unrecoverable Error Status (Low) Register. Each bit corresponds to
|
|
+ * an internal Unrecoverable Error. These are set by hardware and may be
|
|
+ * cleared by writing a one to the respective bit(s) to be cleared. Any
|
|
+ * bit being set that is also unmasked will result in Unrecoverable Error
|
|
+ * interrupt notification to the host CPU and/or Server Management chip
|
|
+ * and the transitioning of BladeEngine to an Offline state.
|
|
+ */
|
|
+struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP {
|
|
+ u8 cev_ue_status; /* DWORD 0 */
|
|
+ u8 ctx_ue_status; /* DWORD 0 */
|
|
+ u8 dbuf_ue_status; /* DWORD 0 */
|
|
+ u8 erx_ue_status; /* DWORD 0 */
|
|
+ u8 host_ue_status; /* DWORD 0 */
|
|
+ u8 mpu_ue_status; /* DWORD 0 */
|
|
+ u8 ndma_ue_status; /* DWORD 0 */
|
|
+ u8 ptc_ue_status; /* DWORD 0 */
|
|
+ u8 rdma_ue_status; /* DWORD 0 */
|
|
+ u8 rxf_ue_status; /* DWORD 0 */
|
|
+ u8 rxips_ue_status; /* DWORD 0 */
|
|
+ u8 rxulp0_ue_status; /* DWORD 0 */
|
|
+ u8 rxulp1_ue_status; /* DWORD 0 */
|
|
+ u8 rxulp2_ue_status; /* DWORD 0 */
|
|
+ u8 tim_ue_status; /* DWORD 0 */
|
|
+ u8 tpost_ue_status; /* DWORD 0 */
|
|
+ u8 tpre_ue_status; /* DWORD 0 */
|
|
+ u8 txips_ue_status; /* DWORD 0 */
|
|
+ u8 txulp0_ue_status; /* DWORD 0 */
|
|
+ u8 txulp1_ue_status; /* DWORD 0 */
|
|
+ u8 uc_ue_status; /* DWORD 0 */
|
|
+ u8 wdma_ue_status; /* DWORD 0 */
|
|
+ u8 txulp2_ue_status; /* DWORD 0 */
|
|
+ u8 host1_ue_status; /* DWORD 0 */
|
|
+ u8 p0_ob_link_ue_status; /* DWORD 0 */
|
|
+ u8 p1_ob_link_ue_status; /* DWORD 0 */
|
|
+ u8 host_gpio_ue_status; /* DWORD 0 */
|
|
+ u8 mbox_netw_ue_status; /* DWORD 0 */
|
|
+ u8 mbox_stor_ue_status; /* DWORD 0 */
|
|
+ u8 axgmac0_ue_status; /* DWORD 0 */
|
|
+ u8 axgmac1_ue_status; /* DWORD 0 */
|
|
+ u8 mpu_intpend_ue_status; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_UE_STATUS_LOW_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Unrecoverable Error Status (High) Register. Each bit corresponds to
|
|
+ * an internal Unrecoverable Error. These are set by hardware and may be
|
|
+ * cleared by writing a one to the respective bit(s) to be cleared. Any
|
|
+ * bit being set that is also unmasked will result in Unrecoverable Error
|
|
+ * interrupt notification to the host CPU and/or Server Management chip;
|
|
+ * and the transitioning of BladeEngine to an Offline state.
|
|
+ */
|
|
+struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP {
|
|
+ u8 jtag_ue_status; /* DWORD 0 */
|
|
+ u8 lpcmemhost_ue_status; /* DWORD 0 */
|
|
+ u8 mgmt_mac_ue_status; /* DWORD 0 */
|
|
+ u8 mpu_iram_ue_status; /* DWORD 0 */
|
|
+ u8 pcs0online_ue_status; /* DWORD 0 */
|
|
+ u8 pcs1online_ue_status; /* DWORD 0 */
|
|
+ u8 pctl0_ue_status; /* DWORD 0 */
|
|
+ u8 pctl1_ue_status; /* DWORD 0 */
|
|
+ u8 pmem_ue_status; /* DWORD 0 */
|
|
+ u8 rr_ue_status; /* DWORD 0 */
|
|
+ u8 rxpp_ue_status; /* DWORD 0 */
|
|
+ u8 txpb_ue_status; /* DWORD 0 */
|
|
+ u8 txp_ue_status; /* DWORD 0 */
|
|
+ u8 xaui_ue_status; /* DWORD 0 */
|
|
+ u8 arm_ue_status; /* DWORD 0 */
|
|
+ u8 ipc_ue_status; /* DWORD 0 */
|
|
+ u8 rsvd0[16]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_UE_STATUS_HI_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Unrecoverable Error Mask (Low) Register. Each bit, when set to one,
|
|
+ * will mask the associated Unrecoverable Error status bit from notification
|
|
+ * of Unrecoverable Error to the host CPU and/or Server Managment chip and the
|
|
+ * transitioning of all BladeEngine units to an Offline state.
|
|
+ */
|
|
+struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP {
|
|
+ u8 cev_ue_mask; /* DWORD 0 */
|
|
+ u8 ctx_ue_mask; /* DWORD 0 */
|
|
+ u8 dbuf_ue_mask; /* DWORD 0 */
|
|
+ u8 erx_ue_mask; /* DWORD 0 */
|
|
+ u8 host_ue_mask; /* DWORD 0 */
|
|
+ u8 mpu_ue_mask; /* DWORD 0 */
|
|
+ u8 ndma_ue_mask; /* DWORD 0 */
|
|
+ u8 ptc_ue_mask; /* DWORD 0 */
|
|
+ u8 rdma_ue_mask; /* DWORD 0 */
|
|
+ u8 rxf_ue_mask; /* DWORD 0 */
|
|
+ u8 rxips_ue_mask; /* DWORD 0 */
|
|
+ u8 rxulp0_ue_mask; /* DWORD 0 */
|
|
+ u8 rxulp1_ue_mask; /* DWORD 0 */
|
|
+ u8 rxulp2_ue_mask; /* DWORD 0 */
|
|
+ u8 tim_ue_mask; /* DWORD 0 */
|
|
+ u8 tpost_ue_mask; /* DWORD 0 */
|
|
+ u8 tpre_ue_mask; /* DWORD 0 */
|
|
+ u8 txips_ue_mask; /* DWORD 0 */
|
|
+ u8 txulp0_ue_mask; /* DWORD 0 */
|
|
+ u8 txulp1_ue_mask; /* DWORD 0 */
|
|
+ u8 uc_ue_mask; /* DWORD 0 */
|
|
+ u8 wdma_ue_mask; /* DWORD 0 */
|
|
+ u8 txulp2_ue_mask; /* DWORD 0 */
|
|
+ u8 host1_ue_mask; /* DWORD 0 */
|
|
+ u8 p0_ob_link_ue_mask; /* DWORD 0 */
|
|
+ u8 p1_ob_link_ue_mask; /* DWORD 0 */
|
|
+ u8 host_gpio_ue_mask; /* DWORD 0 */
|
|
+ u8 mbox_netw_ue_mask; /* DWORD 0 */
|
|
+ u8 mbox_stor_ue_mask; /* DWORD 0 */
|
|
+ u8 axgmac0_ue_mask; /* DWORD 0 */
|
|
+ u8 axgmac1_ue_mask; /* DWORD 0 */
|
|
+ u8 mpu_intpend_ue_mask; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Unrecoverable Error Mask (High) Register. Each bit, when set to one,
|
|
+ * will mask the associated Unrecoverable Error status bit from notification
|
|
+ * of Unrecoverable Error to the host CPU and/or Server Managment chip and the
|
|
+ * transitioning of all BladeEngine units to an Offline state.
|
|
+ */
|
|
+struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP {
|
|
+ u8 jtag_ue_mask; /* DWORD 0 */
|
|
+ u8 lpcmemhost_ue_mask; /* DWORD 0 */
|
|
+ u8 mgmt_mac_ue_mask; /* DWORD 0 */
|
|
+ u8 mpu_iram_ue_mask; /* DWORD 0 */
|
|
+ u8 pcs0online_ue_mask; /* DWORD 0 */
|
|
+ u8 pcs1online_ue_mask; /* DWORD 0 */
|
|
+ u8 pctl0_ue_mask; /* DWORD 0 */
|
|
+ u8 pctl1_ue_mask; /* DWORD 0 */
|
|
+ u8 pmem_ue_mask; /* DWORD 0 */
|
|
+ u8 rr_ue_mask; /* DWORD 0 */
|
|
+ u8 rxpp_ue_mask; /* DWORD 0 */
|
|
+ u8 txpb_ue_mask; /* DWORD 0 */
|
|
+ u8 txp_ue_mask; /* DWORD 0 */
|
|
+ u8 xaui_ue_mask; /* DWORD 0 */
|
|
+ u8 arm_ue_mask; /* DWORD 0 */
|
|
+ u8 ipc_ue_mask; /* DWORD 0 */
|
|
+ u8 rsvd0[16]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_UE_STATUS_HI_MASK_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Online Control Register 0. This register controls various units within
|
|
+ * BladeEngine being in an Online or Offline state.
|
|
+ */
|
|
+struct BE_PCICFG_ONLINE0_CSR_AMAP {
|
|
+ u8 cev_online; /* DWORD 0 */
|
|
+ u8 ctx_online; /* DWORD 0 */
|
|
+ u8 dbuf_online; /* DWORD 0 */
|
|
+ u8 erx_online; /* DWORD 0 */
|
|
+ u8 host_online; /* DWORD 0 */
|
|
+ u8 mpu_online; /* DWORD 0 */
|
|
+ u8 ndma_online; /* DWORD 0 */
|
|
+ u8 ptc_online; /* DWORD 0 */
|
|
+ u8 rdma_online; /* DWORD 0 */
|
|
+ u8 rxf_online; /* DWORD 0 */
|
|
+ u8 rxips_online; /* DWORD 0 */
|
|
+ u8 rxulp0_online; /* DWORD 0 */
|
|
+ u8 rxulp1_online; /* DWORD 0 */
|
|
+ u8 rxulp2_online; /* DWORD 0 */
|
|
+ u8 tim_online; /* DWORD 0 */
|
|
+ u8 tpost_online; /* DWORD 0 */
|
|
+ u8 tpre_online; /* DWORD 0 */
|
|
+ u8 txips_online; /* DWORD 0 */
|
|
+ u8 txulp0_online; /* DWORD 0 */
|
|
+ u8 txulp1_online; /* DWORD 0 */
|
|
+ u8 uc_online; /* DWORD 0 */
|
|
+ u8 wdma_online; /* DWORD 0 */
|
|
+ u8 txulp2_online; /* DWORD 0 */
|
|
+ u8 host1_online; /* DWORD 0 */
|
|
+ u8 p0_ob_link_online; /* DWORD 0 */
|
|
+ u8 p1_ob_link_online; /* DWORD 0 */
|
|
+ u8 host_gpio_online; /* DWORD 0 */
|
|
+ u8 mbox_netw_online; /* DWORD 0 */
|
|
+ u8 mbox_stor_online; /* DWORD 0 */
|
|
+ u8 axgmac0_online; /* DWORD 0 */
|
|
+ u8 axgmac1_online; /* DWORD 0 */
|
|
+ u8 mpu_intpend_online; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_ONLINE0_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Online Control Register 1. This register controls various units within
|
|
+ * BladeEngine being in an Online or Offline state.
|
|
+ */
|
|
+struct BE_PCICFG_ONLINE1_CSR_AMAP {
|
|
+ u8 jtag_online; /* DWORD 0 */
|
|
+ u8 lpcmemhost_online; /* DWORD 0 */
|
|
+ u8 mgmt_mac_online; /* DWORD 0 */
|
|
+ u8 mpu_iram_online; /* DWORD 0 */
|
|
+ u8 pcs0online_online; /* DWORD 0 */
|
|
+ u8 pcs1online_online; /* DWORD 0 */
|
|
+ u8 pctl0_online; /* DWORD 0 */
|
|
+ u8 pctl1_online; /* DWORD 0 */
|
|
+ u8 pmem_online; /* DWORD 0 */
|
|
+ u8 rr_online; /* DWORD 0 */
|
|
+ u8 rxpp_online; /* DWORD 0 */
|
|
+ u8 txpb_online; /* DWORD 0 */
|
|
+ u8 txp_online; /* DWORD 0 */
|
|
+ u8 xaui_online; /* DWORD 0 */
|
|
+ u8 arm_online; /* DWORD 0 */
|
|
+ u8 ipc_online; /* DWORD 0 */
|
|
+ u8 rsvd0[16]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_ONLINE1_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Host Timer Register. */
|
|
+struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP {
|
|
+ u8 hosttimer[24]; /* DWORD 0 */
|
|
+ u8 hostintr; /* DWORD 0 */
|
|
+ u8 rsvd0[7]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* Scratchpad Register (for software use). */
|
|
+struct BE_PCICFG_SCRATCHPAD_CSR_AMAP {
|
|
+ u8 scratchpad[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_SCRATCHPAD_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express Capabilities Register. */
|
|
+struct BE_PCICFG_PCIE_CAP_CSR_AMAP {
|
|
+ u8 capid[8]; /* DWORD 0 */
|
|
+ u8 nextcap[8]; /* DWORD 0 */
|
|
+ u8 capver[4]; /* DWORD 0 */
|
|
+ u8 devport[4]; /* DWORD 0 */
|
|
+ u8 rsvd0[6]; /* DWORD 0 */
|
|
+ u8 rsvd1[2]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_PCIE_CAP_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express Device Capabilities Register. */
|
|
+struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP {
|
|
+ u8 payload[3]; /* DWORD 0 */
|
|
+ u8 rsvd0[3]; /* DWORD 0 */
|
|
+ u8 lo_lat[3]; /* DWORD 0 */
|
|
+ u8 l1_lat[3]; /* DWORD 0 */
|
|
+ u8 rsvd1[3]; /* DWORD 0 */
|
|
+ u8 rsvd2[3]; /* DWORD 0 */
|
|
+ u8 pwr_value[8]; /* DWORD 0 */
|
|
+ u8 pwr_scale[2]; /* DWORD 0 */
|
|
+ u8 rsvd3[4]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_PCIE_DEVCAP_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express Device Control/Status Registers. */
|
|
+struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP {
|
|
+ u8 CorrErrReportEn; /* DWORD 0 */
|
|
+ u8 NonFatalErrReportEn; /* DWORD 0 */
|
|
+ u8 FatalErrReportEn; /* DWORD 0 */
|
|
+ u8 UnsuppReqReportEn; /* DWORD 0 */
|
|
+ u8 EnableRelaxOrder; /* DWORD 0 */
|
|
+ u8 Max_Payload_Size[3]; /* DWORD 0 */
|
|
+ u8 ExtendTagFieldEnable; /* DWORD 0 */
|
|
+ u8 PhantomFnEnable; /* DWORD 0 */
|
|
+ u8 AuxPwrPMEnable; /* DWORD 0 */
|
|
+ u8 EnableNoSnoop; /* DWORD 0 */
|
|
+ u8 Max_Read_Req_Size[3]; /* DWORD 0 */
|
|
+ u8 rsvd0; /* DWORD 0 */
|
|
+ u8 CorrErrDetect; /* DWORD 0 */
|
|
+ u8 NonFatalErrDetect; /* DWORD 0 */
|
|
+ u8 FatalErrDetect; /* DWORD 0 */
|
|
+ u8 UnsuppReqDetect; /* DWORD 0 */
|
|
+ u8 AuxPwrDetect; /* DWORD 0 */
|
|
+ u8 TransPending; /* DWORD 0 */
|
|
+ u8 rsvd1[10]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express Link Capabilities Register. */
|
|
+struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP {
|
|
+ u8 MaxLinkSpeed[4]; /* DWORD 0 */
|
|
+ u8 MaxLinkWidth[6]; /* DWORD 0 */
|
|
+ u8 ASPMSupport[2]; /* DWORD 0 */
|
|
+ u8 L0sExitLat[3]; /* DWORD 0 */
|
|
+ u8 L1ExitLat[3]; /* DWORD 0 */
|
|
+ u8 rsvd0[6]; /* DWORD 0 */
|
|
+ u8 PortNum[8]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_PCIE_LINK_CAP_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express Link Status Register. */
|
|
+struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP {
|
|
+ u8 ASPMCtl[2]; /* DWORD 0 */
|
|
+ u8 rsvd0; /* DWORD 0 */
|
|
+ u8 ReadCmplBndry; /* DWORD 0 */
|
|
+ u8 LinkDisable; /* DWORD 0 */
|
|
+ u8 RetrainLink; /* DWORD 0 */
|
|
+ u8 CommonClkConfig; /* DWORD 0 */
|
|
+ u8 ExtendSync; /* DWORD 0 */
|
|
+ u8 rsvd1[8]; /* DWORD 0 */
|
|
+ u8 LinkSpeed[4]; /* DWORD 0 */
|
|
+ u8 NegLinkWidth[6]; /* DWORD 0 */
|
|
+ u8 LinkTrainErr; /* DWORD 0 */
|
|
+ u8 LinkTrain; /* DWORD 0 */
|
|
+ u8 SlotClkConfig; /* DWORD 0 */
|
|
+ u8 rsvd2[3]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_PCIE_LINK_STATUS_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express MSI Configuration Register. */
|
|
+struct BE_PCICFG_MSI_CSR_AMAP {
|
|
+ u8 capid[8]; /* DWORD 0 */
|
|
+ u8 nextptr[8]; /* DWORD 0 */
|
|
+ u8 tablesize[11]; /* DWORD 0 */
|
|
+ u8 rsvd0[3]; /* DWORD 0 */
|
|
+ u8 funcmask; /* DWORD 0 */
|
|
+ u8 en; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MSI_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* MSI-X Table Offset Register. */
|
|
+struct BE_PCICFG_MSIX_TABLE_CSR_AMAP {
|
|
+ u8 tablebir[3]; /* DWORD 0 */
|
|
+ u8 offset[29]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MSIX_TABLE_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* MSI-X PBA Offset Register. */
|
|
+struct BE_PCICFG_MSIX_PBA_CSR_AMAP {
|
|
+ u8 pbabir[3]; /* DWORD 0 */
|
|
+ u8 offset[29]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MSIX_PBA_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express MSI-X Message Vector Control Register. */
|
|
+struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP {
|
|
+ u8 vector_control; /* DWORD 0 */
|
|
+ u8 rsvd0[31]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express MSI-X Message Data Register. */
|
|
+struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP {
|
|
+ u8 data[16]; /* DWORD 0 */
|
|
+ u8 rsvd0[16]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MSIX_MSG_DATA_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express MSI-X Message Address Register - High Part. */
|
|
+struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP {
|
|
+ u8 addr[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* PCI Express MSI-X Message Address Register - Low Part. */
|
|
+struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP {
|
|
+ u8 rsvd0[2]; /* DWORD 0 */
|
|
+ u8 addr[30]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_18_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_18_RSVD_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_19_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_19_RSVD_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_20_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[25][32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_20_RSVD_AMAP {
|
|
+ u32 dw[26];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_21_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[1919][32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_21_RSVD_AMAP {
|
|
+ u32 dw[1920];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_22_MESSAGE_AMAP {
|
|
+ struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP vec_ctrl;
|
|
+ struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP msg_data;
|
|
+ struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP addr_hi;
|
|
+ struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP addr_low;
|
|
+} __packed;
|
|
+struct PCICFG_ANON_22_MESSAGE_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_23_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[895][32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_23_RSVD_AMAP {
|
|
+ u32 dw[896];
|
|
+};
|
|
+
|
|
+/* These PCI Configuration Space registers are for the Storage Function of
|
|
+ * BladeEngine (Function 0). In the memory map of the registers below their
|
|
+ * table,
|
|
+ */
|
|
+struct BE_PCICFG0_CSRMAP_AMAP {
|
|
+ struct BE_PCICFG_ID_CSR_AMAP id;
|
|
+ u8 rsvd0[32]; /* DWORD 1 */
|
|
+ u8 rsvd1[32]; /* DWORD 2 */
|
|
+ u8 rsvd2[32]; /* DWORD 3 */
|
|
+ struct BE_PCICFG_IOBAR_CSR_AMAP iobar;
|
|
+ struct BE_PCICFG_MEMBAR0_CSR_AMAP membar0;
|
|
+ struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP membar1_lo;
|
|
+ struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP membar1_hi;
|
|
+ struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP membar2_lo;
|
|
+ struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP membar2_hi;
|
|
+ u8 rsvd3[32]; /* DWORD 10 */
|
|
+ struct BE_PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP subsystem_id;
|
|
+ u8 rsvd4[32]; /* DWORD 12 */
|
|
+ u8 rsvd5[32]; /* DWORD 13 */
|
|
+ u8 rsvd6[32]; /* DWORD 14 */
|
|
+ u8 rsvd7[32]; /* DWORD 15 */
|
|
+ struct BE_PCICFG_SEMAPHORE_CSR_AMAP semaphore[4];
|
|
+ struct BE_PCICFG_SOFT_RESET_CSR_AMAP soft_reset;
|
|
+ u8 rsvd8[32]; /* DWORD 21 */
|
|
+ struct BE_PCICFG_SCRATCHPAD_CSR_AMAP scratchpad;
|
|
+ u8 rsvd9[32]; /* DWORD 23 */
|
|
+ u8 rsvd10[32]; /* DWORD 24 */
|
|
+ u8 rsvd11[32]; /* DWORD 25 */
|
|
+ u8 rsvd12[32]; /* DWORD 26 */
|
|
+ u8 rsvd13[32]; /* DWORD 27 */
|
|
+ u8 rsvd14[2][32]; /* DWORD 28 */
|
|
+ u8 rsvd15[32]; /* DWORD 30 */
|
|
+ u8 rsvd16[32]; /* DWORD 31 */
|
|
+ u8 rsvd17[8][32]; /* DWORD 32 */
|
|
+ struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP ue_status_low;
|
|
+ struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP ue_status_hi;
|
|
+ struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP ue_status_low_mask;
|
|
+ struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP ue_status_hi_mask;
|
|
+ struct BE_PCICFG_ONLINE0_CSR_AMAP online0;
|
|
+ struct BE_PCICFG_ONLINE1_CSR_AMAP online1;
|
|
+ u8 rsvd18[32]; /* DWORD 46 */
|
|
+ u8 rsvd19[32]; /* DWORD 47 */
|
|
+ u8 rsvd20[32]; /* DWORD 48 */
|
|
+ u8 rsvd21[32]; /* DWORD 49 */
|
|
+ struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP host_timer_int_ctrl;
|
|
+ u8 rsvd22[32]; /* DWORD 51 */
|
|
+ struct BE_PCICFG_PCIE_CAP_CSR_AMAP pcie_cap;
|
|
+ struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP pcie_devcap;
|
|
+ struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP pcie_control_status;
|
|
+ struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP pcie_link_cap;
|
|
+ struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP pcie_link_status;
|
|
+ struct BE_PCICFG_MSI_CSR_AMAP msi;
|
|
+ struct BE_PCICFG_MSIX_TABLE_CSR_AMAP msix_table_offset;
|
|
+ struct BE_PCICFG_MSIX_PBA_CSR_AMAP msix_pba_offset;
|
|
+ u8 rsvd23[32]; /* DWORD 60 */
|
|
+ u8 rsvd24[32]; /* DWORD 61 */
|
|
+ u8 rsvd25[32]; /* DWORD 62 */
|
|
+ u8 rsvd26[32]; /* DWORD 63 */
|
|
+ u8 rsvd27[32]; /* DWORD 64 */
|
|
+ u8 rsvd28[32]; /* DWORD 65 */
|
|
+ u8 rsvd29[32]; /* DWORD 66 */
|
|
+ u8 rsvd30[32]; /* DWORD 67 */
|
|
+ u8 rsvd31[32]; /* DWORD 68 */
|
|
+ u8 rsvd32[32]; /* DWORD 69 */
|
|
+ u8 rsvd33[32]; /* DWORD 70 */
|
|
+ u8 rsvd34[32]; /* DWORD 71 */
|
|
+ u8 rsvd35[32]; /* DWORD 72 */
|
|
+ u8 rsvd36[32]; /* DWORD 73 */
|
|
+ u8 rsvd37[32]; /* DWORD 74 */
|
|
+ u8 rsvd38[32]; /* DWORD 75 */
|
|
+ u8 rsvd39[32]; /* DWORD 76 */
|
|
+ u8 rsvd40[32]; /* DWORD 77 */
|
|
+ u8 rsvd41[32]; /* DWORD 78 */
|
|
+ u8 rsvd42[32]; /* DWORD 79 */
|
|
+ u8 rsvd43[32]; /* DWORD 80 */
|
|
+ u8 rsvd44[32]; /* DWORD 81 */
|
|
+ u8 rsvd45[32]; /* DWORD 82 */
|
|
+ u8 rsvd46[32]; /* DWORD 83 */
|
|
+ u8 rsvd47[32]; /* DWORD 84 */
|
|
+ u8 rsvd48[32]; /* DWORD 85 */
|
|
+ u8 rsvd49[32]; /* DWORD 86 */
|
|
+ u8 rsvd50[32]; /* DWORD 87 */
|
|
+ u8 rsvd51[32]; /* DWORD 88 */
|
|
+ u8 rsvd52[32]; /* DWORD 89 */
|
|
+ u8 rsvd53[32]; /* DWORD 90 */
|
|
+ u8 rsvd54[32]; /* DWORD 91 */
|
|
+ u8 rsvd55[32]; /* DWORD 92 */
|
|
+ u8 rsvd56[832]; /* DWORD 93 */
|
|
+ u8 rsvd57[32]; /* DWORD 119 */
|
|
+ u8 rsvd58[32]; /* DWORD 120 */
|
|
+ u8 rsvd59[32]; /* DWORD 121 */
|
|
+ u8 rsvd60[32]; /* DWORD 122 */
|
|
+ u8 rsvd61[32]; /* DWORD 123 */
|
|
+ u8 rsvd62[32]; /* DWORD 124 */
|
|
+ u8 rsvd63[32]; /* DWORD 125 */
|
|
+ u8 rsvd64[32]; /* DWORD 126 */
|
|
+ u8 rsvd65[32]; /* DWORD 127 */
|
|
+ u8 rsvd66[61440]; /* DWORD 128 */
|
|
+ struct BE_PCICFG_ANON_22_MESSAGE_AMAP message[32];
|
|
+ u8 rsvd67[28672]; /* DWORD 2176 */
|
|
+ u8 rsvd68[32]; /* DWORD 3072 */
|
|
+ u8 rsvd69[1023][32]; /* DWORD 3073 */
|
|
+} __packed;
|
|
+struct PCICFG0_CSRMAP_AMAP {
|
|
+ u32 dw[4096];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_24_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_24_RSVD_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_25_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_25_RSVD_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_26_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_26_RSVD_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_27_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_27_RSVD_AMAP {
|
|
+ u32 dw[2];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_28_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[3][32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_28_RSVD_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_29_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[36][32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_29_RSVD_AMAP {
|
|
+ u32 dw[37];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_30_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[1930][32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_30_RSVD_AMAP {
|
|
+ u32 dw[1931];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_31_MESSAGE_AMAP {
|
|
+ struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP vec_ctrl;
|
|
+ struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP msg_data;
|
|
+ struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP addr_hi;
|
|
+ struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP addr_low;
|
|
+} __packed;
|
|
+struct PCICFG_ANON_31_MESSAGE_AMAP {
|
|
+ u32 dw[4];
|
|
+};
|
|
+
|
|
+struct BE_PCICFG_ANON_32_RSVD_AMAP {
|
|
+ u8 rsvd0[32]; /* DWORD 0 */
|
|
+ u8 rsvd1[895][32]; /* DWORD 1 */
|
|
+} __packed;
|
|
+struct PCICFG_ANON_32_RSVD_AMAP {
|
|
+ u32 dw[896];
|
|
+};
|
|
+
|
|
+/* This PCI configuration space register map is for the Networking Function of
|
|
+ * BladeEngine (Function 1).
|
|
+ */
|
|
+struct BE_PCICFG1_CSRMAP_AMAP {
|
|
+ struct BE_PCICFG_ID_CSR_AMAP id;
|
|
+ u8 rsvd0[32]; /* DWORD 1 */
|
|
+ u8 rsvd1[32]; /* DWORD 2 */
|
|
+ u8 rsvd2[32]; /* DWORD 3 */
|
|
+ struct BE_PCICFG_IOBAR_CSR_AMAP iobar;
|
|
+ struct BE_PCICFG_MEMBAR0_CSR_AMAP membar0;
|
|
+ struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP membar1_lo;
|
|
+ struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP membar1_hi;
|
|
+ struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP membar2_lo;
|
|
+ struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP membar2_hi;
|
|
+ u8 rsvd3[32]; /* DWORD 10 */
|
|
+ struct BE_PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP subsystem_id;
|
|
+ u8 rsvd4[32]; /* DWORD 12 */
|
|
+ u8 rsvd5[32]; /* DWORD 13 */
|
|
+ u8 rsvd6[32]; /* DWORD 14 */
|
|
+ u8 rsvd7[32]; /* DWORD 15 */
|
|
+ struct BE_PCICFG_SEMAPHORE_CSR_AMAP semaphore[4];
|
|
+ struct BE_PCICFG_SOFT_RESET_CSR_AMAP soft_reset;
|
|
+ u8 rsvd8[32]; /* DWORD 21 */
|
|
+ struct BE_PCICFG_SCRATCHPAD_CSR_AMAP scratchpad;
|
|
+ u8 rsvd9[32]; /* DWORD 23 */
|
|
+ u8 rsvd10[32]; /* DWORD 24 */
|
|
+ u8 rsvd11[32]; /* DWORD 25 */
|
|
+ u8 rsvd12[32]; /* DWORD 26 */
|
|
+ u8 rsvd13[32]; /* DWORD 27 */
|
|
+ u8 rsvd14[2][32]; /* DWORD 28 */
|
|
+ u8 rsvd15[32]; /* DWORD 30 */
|
|
+ u8 rsvd16[32]; /* DWORD 31 */
|
|
+ u8 rsvd17[8][32]; /* DWORD 32 */
|
|
+ struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP ue_status_low;
|
|
+ struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP ue_status_hi;
|
|
+ struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP ue_status_low_mask;
|
|
+ struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP ue_status_hi_mask;
|
|
+ struct BE_PCICFG_ONLINE0_CSR_AMAP online0;
|
|
+ struct BE_PCICFG_ONLINE1_CSR_AMAP online1;
|
|
+ u8 rsvd18[32]; /* DWORD 46 */
|
|
+ u8 rsvd19[32]; /* DWORD 47 */
|
|
+ u8 rsvd20[32]; /* DWORD 48 */
|
|
+ u8 rsvd21[32]; /* DWORD 49 */
|
|
+ struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP host_timer_int_ctrl;
|
|
+ u8 rsvd22[32]; /* DWORD 51 */
|
|
+ struct BE_PCICFG_PCIE_CAP_CSR_AMAP pcie_cap;
|
|
+ struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP pcie_devcap;
|
|
+ struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP pcie_control_status;
|
|
+ struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP pcie_link_cap;
|
|
+ struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP pcie_link_status;
|
|
+ struct BE_PCICFG_MSI_CSR_AMAP msi;
|
|
+ struct BE_PCICFG_MSIX_TABLE_CSR_AMAP msix_table_offset;
|
|
+ struct BE_PCICFG_MSIX_PBA_CSR_AMAP msix_pba_offset;
|
|
+ u8 rsvd23[64]; /* DWORD 60 */
|
|
+ u8 rsvd24[32]; /* DWORD 62 */
|
|
+ u8 rsvd25[32]; /* DWORD 63 */
|
|
+ u8 rsvd26[32]; /* DWORD 64 */
|
|
+ u8 rsvd27[32]; /* DWORD 65 */
|
|
+ u8 rsvd28[32]; /* DWORD 66 */
|
|
+ u8 rsvd29[32]; /* DWORD 67 */
|
|
+ u8 rsvd30[32]; /* DWORD 68 */
|
|
+ u8 rsvd31[32]; /* DWORD 69 */
|
|
+ u8 rsvd32[32]; /* DWORD 70 */
|
|
+ u8 rsvd33[32]; /* DWORD 71 */
|
|
+ u8 rsvd34[32]; /* DWORD 72 */
|
|
+ u8 rsvd35[32]; /* DWORD 73 */
|
|
+ u8 rsvd36[32]; /* DWORD 74 */
|
|
+ u8 rsvd37[128]; /* DWORD 75 */
|
|
+ u8 rsvd38[32]; /* DWORD 79 */
|
|
+ u8 rsvd39[1184]; /* DWORD 80 */
|
|
+ u8 rsvd40[61792]; /* DWORD 117 */
|
|
+ struct BE_PCICFG_ANON_31_MESSAGE_AMAP message[32];
|
|
+ u8 rsvd41[28672]; /* DWORD 2176 */
|
|
+ u8 rsvd42[32]; /* DWORD 3072 */
|
|
+ u8 rsvd43[1023][32]; /* DWORD 3073 */
|
|
+} __packed;
|
|
+struct PCICFG1_CSRMAP_AMAP {
|
|
+ u32 dw[4096];
|
|
+};
|
|
+
|
|
+#endif /* __pcicfg_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/post_codes.h linux-2.6.29-rc3.owrt/drivers/staging/benet/post_codes.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/post_codes.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/post_codes.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,111 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __post_codes_amap_h__
|
|
+#define __post_codes_amap_h__
|
|
+
|
|
+/* --- MGMT_HBA_POST_STAGE_ENUM --- */
|
|
+#define POST_STAGE_POWER_ON_RESET (0) /* State after a cold or warm boot. */
|
|
+#define POST_STAGE_AWAITING_HOST_RDY (1) /* ARM boot code awaiting a
|
|
+ go-ahed from the host. */
|
|
+#define POST_STAGE_HOST_RDY (2) /* Host has given go-ahed to ARM. */
|
|
+#define POST_STAGE_BE_RESET (3) /* Host wants to reset chip, this is a chip
|
|
+ workaround */
|
|
+#define POST_STAGE_SEEPROM_CS_START (256) /* SEEPROM checksum
|
|
+ test start. */
|
|
+#define POST_STAGE_SEEPROM_CS_DONE (257) /* SEEPROM checksum test
|
|
+ done. */
|
|
+#define POST_STAGE_DDR_CONFIG_START (512) /* DDR configuration start. */
|
|
+#define POST_STAGE_DDR_CONFIG_DONE (513) /* DDR configuration done. */
|
|
+#define POST_STAGE_DDR_CALIBRATE_START (768) /* DDR calibration start. */
|
|
+#define POST_STAGE_DDR_CALIBRATE_DONE (769) /* DDR calibration done. */
|
|
+#define POST_STAGE_DDR_TEST_START (1024) /* DDR memory test start. */
|
|
+#define POST_STAGE_DDR_TEST_DONE (1025) /* DDR memory test done. */
|
|
+#define POST_STAGE_REDBOOT_INIT_START (1536) /* Redboot starts execution. */
|
|
+#define POST_STAGE_REDBOOT_INIT_DONE (1537) /* Redboot done execution. */
|
|
+#define POST_STAGE_FW_IMAGE_LOAD_START (1792) /* Firmware image load to
|
|
+ DDR start. */
|
|
+#define POST_STAGE_FW_IMAGE_LOAD_DONE (1793) /* Firmware image load
|
|
+ to DDR done. */
|
|
+#define POST_STAGE_ARMFW_START (2048) /* ARMfw runtime code
|
|
+ starts execution. */
|
|
+#define POST_STAGE_DHCP_QUERY_START (2304) /* DHCP server query start. */
|
|
+#define POST_STAGE_DHCP_QUERY_DONE (2305) /* DHCP server query done. */
|
|
+#define POST_STAGE_BOOT_TARGET_DISCOVERY_START (2560) /* Boot Target
|
|
+ Discovery Start. */
|
|
+#define POST_STAGE_BOOT_TARGET_DISCOVERY_DONE (2561) /* Boot Target
|
|
+ Discovery Done. */
|
|
+#define POST_STAGE_RC_OPTION_SET (2816) /* Remote configuration
|
|
+ option is set in SEEPROM */
|
|
+#define POST_STAGE_SWITCH_LINK (2817) /* Wait for link up on switch */
|
|
+#define POST_STAGE_SEND_ICDS_MESSAGE (2818) /* Send the ICDS message
|
|
+ to switch */
|
|
+#define POST_STAGE_PERFROM_TFTP (2819) /* Download xml using TFTP */
|
|
+#define POST_STAGE_PARSE_XML (2820) /* Parse XML file */
|
|
+#define POST_STAGE_DOWNLOAD_IMAGE (2821) /* Download IMAGE from
|
|
+ TFTP server */
|
|
+#define POST_STAGE_FLASH_IMAGE (2822) /* Flash the IMAGE */
|
|
+#define POST_STAGE_RC_DONE (2823) /* Remote configuration
|
|
+ complete */
|
|
+#define POST_STAGE_REBOOT_SYSTEM (2824) /* Upgrade IMAGE done,
|
|
+ reboot required */
|
|
+#define POST_STAGE_MAC_ADDRESS (3072) /* MAC Address Check */
|
|
+#define POST_STAGE_ARMFW_READY (49152) /* ARMfw is done with POST
|
|
+ and ready. */
|
|
+#define POST_STAGE_ARMFW_UE (61440) /* ARMfw has asserted an
|
|
+ unrecoverable error. The
|
|
+ lower 3 hex digits of the
|
|
+ stage code identify the
|
|
+ unique error code.
|
|
+ */
|
|
+
|
|
+/* This structure defines the format of the MPU semaphore
|
|
+ * register when used for POST.
|
|
+ */
|
|
+struct BE_MGMT_HBA_POST_STATUS_STRUCT_AMAP {
|
|
+ u8 stage[16]; /* DWORD 0 */
|
|
+ u8 rsvd0[10]; /* DWORD 0 */
|
|
+ u8 iscsi_driver_loaded; /* DWORD 0 */
|
|
+ u8 option_rom_installed; /* DWORD 0 */
|
|
+ u8 iscsi_ip_conflict; /* DWORD 0 */
|
|
+ u8 iscsi_no_ip; /* DWORD 0 */
|
|
+ u8 backup_fw; /* DWORD 0 */
|
|
+ u8 error; /* DWORD 0 */
|
|
+} __packed;
|
|
+struct MGMT_HBA_POST_STATUS_STRUCT_AMAP {
|
|
+ u32 dw[1];
|
|
+};
|
|
+
|
|
+/* --- MGMT_HBA_POST_DUMMY_BITS_ENUM --- */
|
|
+#define POST_BIT_ISCSI_LOADED (26)
|
|
+#define POST_BIT_OPTROM_INST (27)
|
|
+#define POST_BIT_BAD_IP_ADDR (28)
|
|
+#define POST_BIT_NO_IP_ADDR (29)
|
|
+#define POST_BIT_BACKUP_FW (30)
|
|
+#define POST_BIT_ERROR (31)
|
|
+
|
|
+/* --- MGMT_HBA_POST_DUMMY_VALUES_ENUM --- */
|
|
+#define POST_ISCSI_DRIVER_LOADED (67108864)
|
|
+#define POST_OPTROM_INSTALLED (134217728)
|
|
+#define POST_ISCSI_IP_ADDRESS_CONFLICT (268435456)
|
|
+#define POST_ISCSI_NO_IP_ADDRESS (536870912)
|
|
+#define POST_BACKUP_FW_LOADED (1073741824)
|
|
+#define POST_FATAL_ERROR (2147483648)
|
|
+
|
|
+#endif /* __post_codes_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/regmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/regmap.h
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/regmap.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/regmap.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,68 @@
|
|
+/*
|
|
+ * Copyright (C) 2005 - 2008 ServerEngines
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License version 2
|
|
+ * as published by the Free Software Foundation. The full GNU General
|
|
+ * Public License is included in this distribution in the file called COPYING.
|
|
+ *
|
|
+ * Contact Information:
|
|
+ * linux-drivers@serverengines.com
|
|
+ *
|
|
+ * ServerEngines
|
|
+ * 209 N. Fair Oaks Ave
|
|
+ * Sunnyvale, CA 94085
|
|
+ */
|
|
+/*
|
|
+ * Autogenerated by srcgen version: 0127
|
|
+ */
|
|
+#ifndef __regmap_amap_h__
|
|
+#define __regmap_amap_h__
|
|
+#include "pcicfg.h"
|
|
+#include "ep.h"
|
|
+#include "cev.h"
|
|
+#include "mpu.h"
|
|
+#include "doorbells.h"
|
|
+
|
|
+/*
|
|
+ * This is the control and status register map for BladeEngine, showing
|
|
+ * the relative size and offset of each sub-module. The CSR registers
|
|
+ * are identical for the network and storage PCI functions. The
|
|
+ * CSR map is shown below, followed by details of each block,
|
|
+ * in sub-sections. The sub-sections begin with a description
|
|
+ * of CSRs that are instantiated in multiple blocks.
|
|
+ */
|
|
+struct BE_BLADE_ENGINE_CSRMAP_AMAP {
|
|
+ struct BE_MPU_CSRMAP_AMAP mpu;
|
|
+ u8 rsvd0[8192]; /* DWORD 256 */
|
|
+ u8 rsvd1[8192]; /* DWORD 512 */
|
|
+ struct BE_CEV_CSRMAP_AMAP cev;
|
|
+ u8 rsvd2[8192]; /* DWORD 1024 */
|
|
+ u8 rsvd3[8192]; /* DWORD 1280 */
|
|
+ u8 rsvd4[8192]; /* DWORD 1536 */
|
|
+ u8 rsvd5[8192]; /* DWORD 1792 */
|
|
+ u8 rsvd6[8192]; /* DWORD 2048 */
|
|
+ u8 rsvd7[8192]; /* DWORD 2304 */
|
|
+ u8 rsvd8[8192]; /* DWORD 2560 */
|
|
+ u8 rsvd9[8192]; /* DWORD 2816 */
|
|
+ u8 rsvd10[8192]; /* DWORD 3072 */
|
|
+ u8 rsvd11[8192]; /* DWORD 3328 */
|
|
+ u8 rsvd12[8192]; /* DWORD 3584 */
|
|
+ u8 rsvd13[8192]; /* DWORD 3840 */
|
|
+ u8 rsvd14[8192]; /* DWORD 4096 */
|
|
+ u8 rsvd15[8192]; /* DWORD 4352 */
|
|
+ u8 rsvd16[8192]; /* DWORD 4608 */
|
|
+ u8 rsvd17[8192]; /* DWORD 4864 */
|
|
+ u8 rsvd18[8192]; /* DWORD 5120 */
|
|
+ u8 rsvd19[8192]; /* DWORD 5376 */
|
|
+ u8 rsvd20[8192]; /* DWORD 5632 */
|
|
+ u8 rsvd21[8192]; /* DWORD 5888 */
|
|
+ u8 rsvd22[8192]; /* DWORD 6144 */
|
|
+ u8 rsvd23[17152][32]; /* DWORD 6400 */
|
|
+} __packed;
|
|
+struct BLADE_ENGINE_CSRMAP_AMAP {
|
|
+ u32 dw[23552];
|
|
+};
|
|
+
|
|
+#endif /* __regmap_amap_h__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/benet/TODO linux-2.6.29-rc3.owrt/drivers/staging/benet/TODO
|
|
--- linux-2.6.29.owrt/drivers/staging/benet/TODO 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/benet/TODO 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,6 @@
|
|
+TODO:
|
|
+ - remove wrappers around common iowrite functions
|
|
+ - full netdev audit of common problems/issues
|
|
+
|
|
+Please send all patches and questions to Subbu Seetharaman
|
|
+<subbus@serverengines.com> and Greg Kroah-Hartman <greg@kroah.com>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/comedi/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/comedi/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/staging/comedi/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/comedi/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
config COMEDI
|
|
tristate "Data Acquision support (comedi)"
|
|
default N
|
|
- depends on m
|
|
---help---
|
|
Enable support a wide range of data acquision devices
|
|
for Linux.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/staging/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -73,6 +73,8 @@
|
|
|
|
source "drivers/staging/rt2870/Kconfig"
|
|
|
|
+source "drivers/staging/benet/Kconfig"
|
|
+
|
|
source "drivers/staging/comedi/Kconfig"
|
|
|
|
source "drivers/staging/asus_oled/Kconfig"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/Makefile linux-2.6.29-rc3.owrt/drivers/staging/Makefile
|
|
--- linux-2.6.29.owrt/drivers/staging/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -19,6 +19,7 @@
|
|
obj-$(CONFIG_OTUS) += otus/
|
|
obj-$(CONFIG_RT2860) += rt2860/
|
|
obj-$(CONFIG_RT2870) += rt2870/
|
|
+obj-$(CONFIG_BENET) += benet/
|
|
obj-$(CONFIG_COMEDI) += comedi/
|
|
obj-$(CONFIG_ASUS_OLED) += asus_oled/
|
|
obj-$(CONFIG_PANEL) += panel/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/meilhaus/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/meilhaus/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/staging/meilhaus/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/meilhaus/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -4,7 +4,6 @@
|
|
|
|
menuconfig MEILHAUS
|
|
tristate "Meilhaus support"
|
|
- depends on m
|
|
---help---
|
|
If you have a Meilhaus card, say Y (or M) here.
|
|
|
|
@@ -19,7 +18,7 @@
|
|
config ME0600
|
|
tristate "Meilhaus ME-600 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-600 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -30,7 +29,7 @@
|
|
config ME0900
|
|
tristate "Meilhaus ME-900 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-900 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -41,7 +40,7 @@
|
|
config ME1000
|
|
tristate "Meilhaus ME-1000 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-1000 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -52,7 +51,7 @@
|
|
config ME1400
|
|
tristate "Meilhaus ME-1400 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-1400 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -63,7 +62,7 @@
|
|
config ME1600
|
|
tristate "Meilhaus ME-1600 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-1600 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -74,7 +73,7 @@
|
|
config ME4600
|
|
tristate "Meilhaus ME-4600 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-4600 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -85,7 +84,7 @@
|
|
config ME6000
|
|
tristate "Meilhaus ME-6000 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-6000 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -96,7 +95,7 @@
|
|
config ME8100
|
|
tristate "Meilhaus ME-8100 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-8100 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -107,7 +106,7 @@
|
|
config ME8200
|
|
tristate "Meilhaus ME-8200 support"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This driver supports the Meilhaus ME-8200 family of boards
|
|
that do data collection and multipurpose I/O.
|
|
@@ -118,7 +117,7 @@
|
|
config MEDUMMY
|
|
tristate "Meilhaus dummy driver"
|
|
default n
|
|
- depends on PCI && m
|
|
+ depends on PCI
|
|
help
|
|
This provides a dummy driver for the Meilhaus driver package
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/panel/panel.c linux-2.6.29-rc3.owrt/drivers/staging/panel/panel.c
|
|
--- linux-2.6.29.owrt/drivers/staging/panel/panel.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/panel/panel.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -622,7 +622,7 @@
|
|
}
|
|
|
|
/* sets ctrl & data port bits according to current signals values */
|
|
-static void panel_set_bits(void)
|
|
+static void set_bits(void)
|
|
{
|
|
set_data_bits();
|
|
set_ctrl_bits();
|
|
@@ -707,12 +707,12 @@
|
|
*/
|
|
for (bit = 0; bit < 8; bit++) {
|
|
bits.cl = BIT_CLR; /* CLK low */
|
|
- panel_set_bits();
|
|
+ set_bits();
|
|
bits.da = byte & 1;
|
|
- panel_set_bits();
|
|
+ set_bits();
|
|
udelay(2); /* maintain the data during 2 us before CLK up */
|
|
bits.cl = BIT_SET; /* CLK high */
|
|
- panel_set_bits();
|
|
+ set_bits();
|
|
udelay(1); /* maintain the strobe during 1 us */
|
|
byte >>= 1;
|
|
}
|
|
@@ -727,7 +727,7 @@
|
|
/* The backlight is activated by seting the AUTOFEED line to +5V */
|
|
spin_lock(&pprt_lock);
|
|
bits.bl = on;
|
|
- panel_set_bits();
|
|
+ set_bits();
|
|
spin_unlock(&pprt_lock);
|
|
}
|
|
|
|
@@ -2164,20 +2164,19 @@
|
|
if (scan_timer.function != NULL)
|
|
del_timer(&scan_timer);
|
|
|
|
- if (pprt != NULL) {
|
|
- if (keypad_enabled)
|
|
- misc_deregister(&keypad_dev);
|
|
-
|
|
- if (lcd_enabled) {
|
|
- panel_lcd_print("\x0cLCD driver " PANEL_VERSION
|
|
- "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-");
|
|
- misc_deregister(&lcd_dev);
|
|
- }
|
|
+ if (keypad_enabled)
|
|
+ misc_deregister(&keypad_dev);
|
|
|
|
- /* TODO: free all input signals */
|
|
- parport_release(pprt);
|
|
- parport_unregister_device(pprt);
|
|
+ if (lcd_enabled) {
|
|
+ panel_lcd_print("\x0cLCD driver " PANEL_VERSION
|
|
+ "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-");
|
|
+ misc_deregister(&lcd_dev);
|
|
}
|
|
+
|
|
+ /* TODO: free all input signals */
|
|
+
|
|
+ parport_release(pprt);
|
|
+ parport_unregister_device(pprt);
|
|
parport_unregister_driver(&panel_driver);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/poch/poch.c linux-2.6.29-rc3.owrt/drivers/staging/poch/poch.c
|
|
--- linux-2.6.29.owrt/drivers/staging/poch/poch.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/poch/poch.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1026,7 +1026,7 @@
|
|
}
|
|
break;
|
|
case POCH_IOC_GET_COUNTERS:
|
|
- if (!access_ok(VERIFY_WRITE, argp, sizeof(struct poch_counters)))
|
|
+ if (access_ok(VERIFY_WRITE, argp, sizeof(struct poch_counters)))
|
|
return -EFAULT;
|
|
|
|
spin_lock_irq(&channel->counters_lock);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c
|
|
--- linux-2.6.29.owrt/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -234,21 +234,20 @@
|
|
void ieee80211_crypto_deinit(void)
|
|
{
|
|
struct list_head *ptr, *n;
|
|
- struct ieee80211_crypto_alg *alg = NULL;
|
|
|
|
if (hcrypt == NULL)
|
|
return;
|
|
|
|
- list_for_each_safe(ptr, n, &hcrypt->algs) {
|
|
- alg = list_entry(ptr, struct ieee80211_crypto_alg, list);
|
|
- if (alg) {
|
|
- list_del(ptr);
|
|
- printk(KERN_DEBUG
|
|
- "ieee80211_crypt: unregistered algorithm '%s' (deinit)\n",
|
|
- alg->ops->name);
|
|
- kfree(alg);
|
|
- }
|
|
+ for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs;
|
|
+ ptr = n, n = ptr->next) {
|
|
+ struct ieee80211_crypto_alg *alg =
|
|
+ (struct ieee80211_crypto_alg *) ptr;
|
|
+ list_del(ptr);
|
|
+ printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm "
|
|
+ "'%s' (deinit)\n", alg->ops->name);
|
|
+ kfree(alg);
|
|
}
|
|
+
|
|
kfree(hcrypt);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/rtl8187se/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/staging/rtl8187se/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,6 +1,5 @@
|
|
config RTL8187SE
|
|
tristate "RealTek RTL8187SE Wireless LAN NIC driver"
|
|
depends on PCI
|
|
- depends on WIRELESS_EXT && COMPAT_NET_DEV_OPS
|
|
default N
|
|
---help---
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/rtl8187se/r8180_core.c linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/r8180_core.c
|
|
--- linux-2.6.29.owrt/drivers/staging/rtl8187se/r8180_core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/r8180_core.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -6161,10 +6161,10 @@
|
|
{
|
|
pci_unregister_driver (&rtl8180_pci_driver);
|
|
rtl8180_proc_module_remove();
|
|
+ ieee80211_crypto_deinit();
|
|
ieee80211_crypto_tkip_exit();
|
|
ieee80211_crypto_ccmp_exit();
|
|
ieee80211_crypto_wep_exit();
|
|
- ieee80211_crypto_deinit();
|
|
DMESG("Exiting");
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/usbip/usbip_common.c linux-2.6.29-rc3.owrt/drivers/staging/usbip/usbip_common.c
|
|
--- linux-2.6.29.owrt/drivers/staging/usbip/usbip_common.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/usbip/usbip_common.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -406,20 +406,8 @@
|
|
/*
|
|
* threads are invoked per one device (per one connection).
|
|
*/
|
|
- int retval;
|
|
-
|
|
- retval = kernel_thread(usbip_thread, (void *)&ud->tcp_rx, 0);
|
|
- if (retval < 0) {
|
|
- printk(KERN_ERR "Creating tcp_rx thread for ud %p failed.\n",
|
|
- ud);
|
|
- return;
|
|
- }
|
|
- retval = kernel_thread(usbip_thread, (void *)&ud->tcp_tx, 0);
|
|
- if (retval < 0) {
|
|
- printk(KERN_ERR "Creating tcp_tx thread for ud %p failed.\n",
|
|
- ud);
|
|
- return;
|
|
- }
|
|
+ kernel_thread(usbip_thread, (void *)&ud->tcp_rx, 0);
|
|
+ kernel_thread(usbip_thread, (void *)&ud->tcp_tx, 0);
|
|
|
|
/* confirm threads are starting */
|
|
wait_for_completion(&ud->tcp_rx.thread_done);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/staging/winbond/wbusb.c linux-2.6.29-rc3.owrt/drivers/staging/winbond/wbusb.c
|
|
--- linux-2.6.29.owrt/drivers/staging/winbond/wbusb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/staging/winbond/wbusb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -319,18 +319,16 @@
|
|
struct usb_device *udev = interface_to_usbdev(intf);
|
|
struct wbsoft_priv *priv;
|
|
struct ieee80211_hw *dev;
|
|
- int nr, err;
|
|
+ int err;
|
|
|
|
usb_get_dev(udev);
|
|
|
|
// 20060630.2 Check the device if it already be opened
|
|
- nr = usb_control_msg(udev, usb_rcvctrlpipe( udev, 0 ),
|
|
- 0x01, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN,
|
|
- 0x0, 0x400, <mp, 4, HZ*100 );
|
|
- if (nr < 0) {
|
|
- err = nr;
|
|
+ err = usb_control_msg(udev, usb_rcvctrlpipe( udev, 0 ),
|
|
+ 0x01, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN,
|
|
+ 0x0, 0x400, <mp, 4, HZ*100 );
|
|
+ if (err)
|
|
goto error;
|
|
- }
|
|
|
|
ltmp = cpu_to_le32(ltmp);
|
|
if (ltmp) { // Is already initialized?
|
|
@@ -339,10 +337,8 @@
|
|
}
|
|
|
|
dev = ieee80211_alloc_hw(sizeof(*priv), &wbsoft_ops);
|
|
- if (!dev) {
|
|
- err = -ENOMEM;
|
|
+ if (!dev)
|
|
goto error;
|
|
- }
|
|
|
|
priv = dev->priv;
|
|
|
|
@@ -373,11 +369,9 @@
|
|
}
|
|
|
|
dev->extra_tx_headroom = 12; /* FIXME */
|
|
- dev->flags = IEEE80211_HW_SIGNAL_UNSPEC;
|
|
- dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
|
+ dev->flags = 0;
|
|
|
|
dev->channel_change_time = 1000;
|
|
- dev->max_signal = 100;
|
|
dev->queues = 1;
|
|
|
|
dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &wbsoft_band_2GHz;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/atm/cxacru.c linux-2.6.29-rc3.owrt/drivers/usb/atm/cxacru.c
|
|
--- linux-2.6.29.owrt/drivers/usb/atm/cxacru.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/atm/cxacru.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -485,7 +485,7 @@
|
|
usb_err(instance->usbatm, "requested transfer size too large (%d, %d)\n",
|
|
wbuflen, rbuflen);
|
|
ret = -ENOMEM;
|
|
- goto err;
|
|
+ goto fail;
|
|
}
|
|
|
|
mutex_lock(&instance->cm_serialize);
|
|
@@ -565,7 +565,6 @@
|
|
dbg("cm %#x", cm);
|
|
fail:
|
|
mutex_unlock(&instance->cm_serialize);
|
|
-err:
|
|
return ret;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/class/cdc-acm.c linux-2.6.29-rc3.owrt/drivers/usb/class/cdc-acm.c
|
|
--- linux-2.6.29.owrt/drivers/usb/class/cdc-acm.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/class/cdc-acm.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1349,6 +1349,9 @@
|
|
{ USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */
|
|
.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
|
|
},
|
|
+ { USB_DEVICE(0x0e8d, 0x3329), /* i-blue 747, Qstarz BT-Q1000, Holux M-241 */
|
|
+ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
|
|
+ },
|
|
{ USB_DEVICE(0x0e8d, 0x3329), /* MediaTek Inc GPS */
|
|
.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
|
|
},
|
|
@@ -1376,15 +1379,6 @@
|
|
{ USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */
|
|
.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
|
|
},
|
|
- { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
|
|
- },
|
|
- { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */
|
|
- .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on
|
|
- data interface instead of
|
|
- communications interface.
|
|
- Maybe we should define a new
|
|
- quirk for this. */
|
|
- },
|
|
|
|
/* control interfaces with various AT-command sets */
|
|
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/class/usbtmc.c linux-2.6.29-rc3.owrt/drivers/usb/class/usbtmc.c
|
|
--- linux-2.6.29.owrt/drivers/usb/class/usbtmc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/class/usbtmc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -50,7 +50,6 @@
|
|
|
|
static struct usb_device_id usbtmc_devices[] = {
|
|
{ USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 0), },
|
|
- { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 1), },
|
|
{ 0, } /* terminating entry */
|
|
};
|
|
MODULE_DEVICE_TABLE(usb, usbtmc_devices);
|
|
@@ -107,13 +106,12 @@
|
|
{
|
|
struct usb_interface *intf;
|
|
struct usbtmc_device_data *data;
|
|
- int retval = 0;
|
|
+ int retval = -ENODEV;
|
|
|
|
intf = usb_find_interface(&usbtmc_driver, iminor(inode));
|
|
if (!intf) {
|
|
printk(KERN_ERR KBUILD_MODNAME
|
|
": can not find device for minor %d", iminor(inode));
|
|
- retval = -ENODEV;
|
|
goto exit;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/core/devio.c linux-2.6.29-rc3.owrt/drivers/usb/core/devio.c
|
|
--- linux-2.6.29.owrt/drivers/usb/core/devio.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/core/devio.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -359,6 +359,11 @@
|
|
spin_lock_irqsave(&ps->lock, flags);
|
|
}
|
|
spin_unlock_irqrestore(&ps->lock, flags);
|
|
+ as = async_getcompleted(ps);
|
|
+ while (as) {
|
|
+ free_async(as);
|
|
+ as = async_getcompleted(ps);
|
|
+ }
|
|
}
|
|
|
|
static void destroy_async_on_interface(struct dev_state *ps,
|
|
@@ -638,7 +643,6 @@
|
|
struct dev_state *ps = file->private_data;
|
|
struct usb_device *dev = ps->dev;
|
|
unsigned int ifnum;
|
|
- struct async *as;
|
|
|
|
usb_lock_device(dev);
|
|
|
|
@@ -657,12 +661,6 @@
|
|
usb_unlock_device(dev);
|
|
usb_put_dev(dev);
|
|
put_pid(ps->disc_pid);
|
|
-
|
|
- as = async_getcompleted(ps);
|
|
- while (as) {
|
|
- free_async(as);
|
|
- as = async_getcompleted(ps);
|
|
- }
|
|
kfree(ps);
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/core/hcd.h linux-2.6.29-rc3.owrt/drivers/usb/core/hcd.h
|
|
--- linux-2.6.29.owrt/drivers/usb/core/hcd.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/core/hcd.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -257,6 +257,7 @@
|
|
|
|
#ifdef CONFIG_PM
|
|
extern int usb_hcd_pci_suspend(struct pci_dev *dev, pm_message_t msg);
|
|
+extern int usb_hcd_pci_resume_early(struct pci_dev *dev);
|
|
extern int usb_hcd_pci_resume(struct pci_dev *dev);
|
|
#endif /* CONFIG_PM */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/core/hcd-pci.c linux-2.6.29-rc3.owrt/drivers/usb/core/hcd-pci.c
|
|
--- linux-2.6.29.owrt/drivers/usb/core/hcd-pci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/core/hcd-pci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -298,6 +298,19 @@
|
|
EXPORT_SYMBOL_GPL(usb_hcd_pci_suspend);
|
|
|
|
/**
|
|
+ * usb_hcd_pci_resume_early - resume a PCI-based HCD before IRQs are enabled
|
|
+ * @dev: USB Host Controller being resumed
|
|
+ *
|
|
+ * Store this function in the HCD's struct pci_driver as .resume_early.
|
|
+ */
|
|
+int usb_hcd_pci_resume_early(struct pci_dev *dev)
|
|
+{
|
|
+ pci_restore_state(dev);
|
|
+ return 0;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(usb_hcd_pci_resume_early);
|
|
+
|
|
+/**
|
|
* usb_hcd_pci_resume - power management resume of a PCI-based HCD
|
|
* @dev: USB Host Controller being resumed
|
|
*
|
|
@@ -320,8 +333,6 @@
|
|
}
|
|
#endif
|
|
|
|
- pci_restore_state(dev);
|
|
-
|
|
hcd = pci_get_drvdata(dev);
|
|
if (hcd->state != HC_STATE_SUSPENDED) {
|
|
dev_dbg(hcd->self.controller,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/core/message.c linux-2.6.29-rc3.owrt/drivers/usb/core/message.c
|
|
--- linux-2.6.29.owrt/drivers/usb/core/message.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/core/message.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -653,7 +653,7 @@
|
|
if (result <= 0 && result != -ETIMEDOUT)
|
|
continue;
|
|
if (result > 1 && ((u8 *)buf)[1] != type) {
|
|
- result = -ENODATA;
|
|
+ result = -EPROTO;
|
|
continue;
|
|
}
|
|
break;
|
|
@@ -696,13 +696,8 @@
|
|
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
|
|
(USB_DT_STRING << 8) + index, langid, buf, size,
|
|
USB_CTRL_GET_TIMEOUT);
|
|
- if (result == 0 || result == -EPIPE)
|
|
- continue;
|
|
- if (result > 1 && ((u8 *) buf)[1] != USB_DT_STRING) {
|
|
- result = -ENODATA;
|
|
- continue;
|
|
- }
|
|
- break;
|
|
+ if (!(result == 0 || result == -EPIPE))
|
|
+ break;
|
|
}
|
|
return result;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/gadget/file_storage.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/file_storage.c
|
|
--- linux-2.6.29.owrt/drivers/usb/gadget/file_storage.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/file_storage.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -3879,11 +3879,7 @@
|
|
mod_data.protocol_type = USB_SC_SCSI;
|
|
mod_data.protocol_name = "Transparent SCSI";
|
|
|
|
- /* Some peripheral controllers are known not to be able to
|
|
- * halt bulk endpoints correctly. If one of them is present,
|
|
- * disable stalls.
|
|
- */
|
|
- if (gadget_is_sh(fsg->gadget) || gadget_is_at91(fsg->gadget))
|
|
+ if (gadget_is_sh(fsg->gadget))
|
|
mod_data.can_stall = 0;
|
|
|
|
if (mod_data.release == 0xffff) { // Parameter wasn't set
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/gadget/f_obex.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/f_obex.c
|
|
--- linux-2.6.29.owrt/drivers/usb/gadget/f_obex.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/f_obex.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -366,9 +366,9 @@
|
|
f->hs_descriptors = usb_copy_descriptors(hs_function);
|
|
|
|
obex->hs.obex_in = usb_find_endpoint(hs_function,
|
|
- f->hs_descriptors, &obex_hs_ep_in_desc);
|
|
+ f->descriptors, &obex_hs_ep_in_desc);
|
|
obex->hs.obex_out = usb_find_endpoint(hs_function,
|
|
- f->hs_descriptors, &obex_hs_ep_out_desc);
|
|
+ f->descriptors, &obex_hs_ep_out_desc);
|
|
}
|
|
|
|
/* Avoid letting this gadget enumerate until the userspace
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/gadget/fsl_qe_udc.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/fsl_qe_udc.c
|
|
--- linux-2.6.29.owrt/drivers/usb/gadget/fsl_qe_udc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/fsl_qe_udc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1622,8 +1622,6 @@
|
|
nuke(ep, -ESHUTDOWN);
|
|
ep->desc = NULL;
|
|
ep->stopped = 1;
|
|
- ep->tx_req = NULL;
|
|
- qe_ep_reset(udc, ep->epnum);
|
|
spin_unlock_irqrestore(&udc->lock, flags);
|
|
|
|
cpm_muram_free(cpm_muram_offset(ep->rxbase));
|
|
@@ -1683,11 +1681,14 @@
|
|
kfree(req);
|
|
}
|
|
|
|
-static int __qe_ep_queue(struct usb_ep *_ep, struct usb_request *_req)
|
|
+/* queues (submits) an I/O request to an endpoint */
|
|
+static int qe_ep_queue(struct usb_ep *_ep, struct usb_request *_req,
|
|
+ gfp_t gfp_flags)
|
|
{
|
|
struct qe_ep *ep = container_of(_ep, struct qe_ep, ep);
|
|
struct qe_req *req = container_of(_req, struct qe_req, req);
|
|
struct qe_udc *udc;
|
|
+ unsigned long flags;
|
|
int reval;
|
|
|
|
udc = ep->udc;
|
|
@@ -1731,7 +1732,7 @@
|
|
list_add_tail(&req->queue, &ep->queue);
|
|
dev_vdbg(udc->dev, "gadget have request in %s! %d\n",
|
|
ep->name, req->req.length);
|
|
-
|
|
+ spin_lock_irqsave(&udc->lock, flags);
|
|
/* push the request to device */
|
|
if (ep_is_in(ep))
|
|
reval = ep_req_send(ep, req);
|
|
@@ -1747,22 +1748,9 @@
|
|
if (ep->dir == USB_DIR_OUT)
|
|
reval = ep_req_receive(ep, req);
|
|
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/* queues (submits) an I/O request to an endpoint */
|
|
-static int qe_ep_queue(struct usb_ep *_ep, struct usb_request *_req,
|
|
- gfp_t gfp_flags)
|
|
-{
|
|
- struct qe_ep *ep = container_of(_ep, struct qe_ep, ep);
|
|
- struct qe_udc *udc = ep->udc;
|
|
- unsigned long flags;
|
|
- int ret;
|
|
-
|
|
- spin_lock_irqsave(&udc->lock, flags);
|
|
- ret = __qe_ep_queue(_ep, _req);
|
|
spin_unlock_irqrestore(&udc->lock, flags);
|
|
- return ret;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
/* dequeues (cancels, unlinks) an I/O request from an endpoint */
|
|
@@ -2020,7 +2008,7 @@
|
|
udc->ep0_dir = USB_DIR_IN;
|
|
|
|
/* data phase */
|
|
- status = __qe_ep_queue(&ep->ep, &req->req);
|
|
+ status = qe_ep_queue(&ep->ep, &req->req, GFP_ATOMIC);
|
|
|
|
if (status == 0)
|
|
return;
|
|
@@ -2163,9 +2151,6 @@
|
|
{
|
|
unsigned char i;
|
|
|
|
- if (udc->usb_state == USB_STATE_DEFAULT)
|
|
- return 0;
|
|
-
|
|
qe_usb_disable();
|
|
out_8(&udc->usb_regs->usb_usadr, 0);
|
|
|
|
@@ -2457,12 +2442,8 @@
|
|
struct usb_ctlr __iomem *qe_usbregs;
|
|
qe_usbregs = udc->usb_regs;
|
|
|
|
- /* Spec says that we must enable the USB controller to change mode. */
|
|
+ /* Init the usb register */
|
|
out_8(&qe_usbregs->usb_usmod, 0x01);
|
|
- /* Mode changed, now disable it, since muram isn't initialized yet. */
|
|
- out_8(&qe_usbregs->usb_usmod, 0x00);
|
|
-
|
|
- /* Initialize the rest. */
|
|
out_be16(&qe_usbregs->usb_usbmr, 0);
|
|
out_8(&qe_usbregs->usb_uscom, 0);
|
|
out_be16(&qe_usbregs->usb_usber, USBER_ALL_CLEAR);
|
|
@@ -2623,10 +2604,6 @@
|
|
(unsigned long)udc_controller);
|
|
/* request irq and disable DR */
|
|
udc_controller->usb_irq = irq_of_parse_and_map(np, 0);
|
|
- if (!udc_controller->usb_irq) {
|
|
- ret = -EINVAL;
|
|
- goto err_noirq;
|
|
- }
|
|
|
|
ret = request_irq(udc_controller->usb_irq, qe_udc_irq, 0,
|
|
driver_name, udc_controller);
|
|
@@ -2648,8 +2625,6 @@
|
|
err6:
|
|
free_irq(udc_controller->usb_irq, udc_controller);
|
|
err5:
|
|
- irq_dispose_mapping(udc_controller->usb_irq);
|
|
-err_noirq:
|
|
if (udc_controller->nullmap) {
|
|
dma_unmap_single(udc_controller->gadget.dev.parent,
|
|
udc_controller->nullp, 256,
|
|
@@ -2673,7 +2648,7 @@
|
|
iounmap(udc_controller->usb_regs);
|
|
err1:
|
|
kfree(udc_controller);
|
|
- udc_controller = NULL;
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
@@ -2735,7 +2710,6 @@
|
|
kfree(ep->txframe);
|
|
|
|
free_irq(udc_controller->usb_irq, udc_controller);
|
|
- irq_dispose_mapping(udc_controller->usb_irq);
|
|
|
|
tasklet_kill(&udc_controller->rx_tasklet);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/gadget/fsl_usb2_udc.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/fsl_usb2_udc.c
|
|
--- linux-2.6.29.owrt/drivers/usb/gadget/fsl_usb2_udc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/fsl_usb2_udc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -404,10 +404,7 @@
|
|
}
|
|
if (zlt)
|
|
tmp |= EP_QUEUE_HEAD_ZLT_SEL;
|
|
-
|
|
p_QH->max_pkt_length = cpu_to_le32(tmp);
|
|
- p_QH->next_dtd_ptr = 1;
|
|
- p_QH->size_ioc_int_sts = 0;
|
|
|
|
return;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/gadget/Kconfig linux-2.6.29-rc3.owrt/drivers/usb/gadget/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/usb/gadget/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -191,7 +191,6 @@
|
|
boolean "OMAP USB Device Controller"
|
|
depends on ARCH_OMAP
|
|
select ISP1301_OMAP if MACH_OMAP_H2 || MACH_OMAP_H3 || MACH_OMAP_H4_OTG
|
|
- select USB_OTG_UTILS if ARCH_OMAP
|
|
help
|
|
Many Texas Instruments OMAP processors have flexible full
|
|
speed USB device controllers, with support for up to 30
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/gadget/pxa25x_udc.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/pxa25x_udc.c
|
|
--- linux-2.6.29.owrt/drivers/usb/gadget/pxa25x_udc.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/pxa25x_udc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -904,8 +904,8 @@
|
|
|
|
/* most IN status is the same, but ISO can't stall */
|
|
*ep->reg_udccs = UDCCS_BI_TPC|UDCCS_BI_FTF|UDCCS_BI_TUR
|
|
- | (ep->bmAttributes == USB_ENDPOINT_XFER_ISOC
|
|
- ? 0 : UDCCS_BI_SST);
|
|
+ | (ep->bmAttributes == USB_ENDPOINT_XFER_ISOC)
|
|
+ ? 0 : UDCCS_BI_SST;
|
|
}
|
|
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/ehci.h linux-2.6.29-rc3.owrt/drivers/usb/host/ehci.h
|
|
--- linux-2.6.29.owrt/drivers/usb/host/ehci.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -87,10 +87,6 @@
|
|
int next_uframe; /* scan periodic, start here */
|
|
unsigned periodic_sched; /* periodic activity count */
|
|
|
|
- /* list of itds completed while clock_frame was still active */
|
|
- struct list_head cached_itd_list;
|
|
- unsigned clock_frame;
|
|
-
|
|
/* per root hub port */
|
|
unsigned long reset_done [EHCI_MAX_ROOT_PORTS];
|
|
|
|
@@ -224,8 +220,6 @@
|
|
}
|
|
}
|
|
|
|
-static void free_cached_itd_list(struct ehci_hcd *ehci);
|
|
-
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
#include <linux/usb/ehci_def.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/ehci-hcd.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-hcd.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/ehci-hcd.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-hcd.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -485,7 +485,6 @@
|
|
* periodic_size can shrink by USBCMD update if hcc_params allows.
|
|
*/
|
|
ehci->periodic_size = DEFAULT_I_TDPS;
|
|
- INIT_LIST_HEAD(&ehci->cached_itd_list);
|
|
if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
|
|
return retval;
|
|
|
|
@@ -498,7 +497,6 @@
|
|
|
|
ehci->reclaim = NULL;
|
|
ehci->next_uframe = -1;
|
|
- ehci->clock_frame = -1;
|
|
|
|
/*
|
|
* dedicate a qh for the async ring head, since we couldn't unlink
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/ehci-mem.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-mem.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/ehci-mem.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-mem.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -128,7 +128,6 @@
|
|
|
|
static void ehci_mem_cleanup (struct ehci_hcd *ehci)
|
|
{
|
|
- free_cached_itd_list(ehci);
|
|
if (ehci->async)
|
|
qh_put (ehci->async);
|
|
ehci->async = NULL;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/ehci-pci.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-pci.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/ehci-pci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-pci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -432,6 +432,7 @@
|
|
|
|
#ifdef CONFIG_PM
|
|
.suspend = usb_hcd_pci_suspend,
|
|
+ .resume_early = usb_hcd_pci_resume_early,
|
|
.resume = usb_hcd_pci_resume,
|
|
#endif
|
|
.shutdown = usb_hcd_pci_shutdown,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/ehci-q.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-q.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/ehci-q.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-q.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1095,8 +1095,7 @@
|
|
prev->qh_next = qh->qh_next;
|
|
wmb ();
|
|
|
|
- /* If the controller isn't running, we don't have to wait for it */
|
|
- if (unlikely(!HC_IS_RUNNING(ehci_to_hcd(ehci)->state))) {
|
|
+ if (unlikely (ehci_to_hcd(ehci)->state == HC_STATE_HALT)) {
|
|
/* if (unlikely (qh->reclaim != 0))
|
|
* this will recurse, probably not much
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/ehci-sched.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-sched.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/ehci-sched.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-sched.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1004,8 +1004,7 @@
|
|
|
|
is_in = (stream->bEndpointAddress & USB_DIR_IN) ? 0x10 : 0;
|
|
stream->bEndpointAddress &= 0x0f;
|
|
- if (stream->ep)
|
|
- stream->ep->hcpriv = NULL;
|
|
+ stream->ep->hcpriv = NULL;
|
|
|
|
if (stream->rescheduled) {
|
|
ehci_info (ehci, "ep%d%s-iso rescheduled "
|
|
@@ -1536,7 +1535,7 @@
|
|
struct ehci_itd, itd_list);
|
|
list_move_tail (&itd->itd_list, &stream->td_list);
|
|
itd->stream = iso_stream_get (stream);
|
|
- itd->urb = urb;
|
|
+ itd->urb = usb_get_urb (urb);
|
|
itd_init (ehci, stream, itd);
|
|
}
|
|
|
|
@@ -1645,7 +1644,7 @@
|
|
(void) disable_periodic(ehci);
|
|
ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
|
|
|
|
- if (unlikely(list_is_singular(&stream->td_list))) {
|
|
+ if (unlikely (list_empty (&stream->td_list))) {
|
|
ehci_to_hcd(ehci)->self.bandwidth_allocated
|
|
-= stream->bandwidth;
|
|
ehci_vdbg (ehci,
|
|
@@ -1654,27 +1653,14 @@
|
|
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
|
|
}
|
|
iso_stream_put (ehci, stream);
|
|
-
|
|
+ /* OK to recycle this ITD now that its completion callback ran. */
|
|
done:
|
|
+ usb_put_urb(urb);
|
|
itd->urb = NULL;
|
|
- if (ehci->clock_frame != itd->frame || itd->index[7] != -1) {
|
|
- /* OK to recycle this ITD now. */
|
|
- itd->stream = NULL;
|
|
- list_move(&itd->itd_list, &stream->free_list);
|
|
- iso_stream_put(ehci, stream);
|
|
- } else {
|
|
- /* HW might remember this ITD, so we can't recycle it yet.
|
|
- * Move it to a safe place until a new frame starts.
|
|
- */
|
|
- list_move(&itd->itd_list, &ehci->cached_itd_list);
|
|
- if (stream->refcount == 2) {
|
|
- /* If iso_stream_put() were called here, stream
|
|
- * would be freed. Instead, just prevent reuse.
|
|
- */
|
|
- stream->ep->hcpriv = NULL;
|
|
- stream->ep = NULL;
|
|
- }
|
|
- }
|
|
+ itd->stream = NULL;
|
|
+ list_move(&itd->itd_list, &stream->free_list);
|
|
+ iso_stream_put(ehci, stream);
|
|
+
|
|
return retval;
|
|
}
|
|
|
|
@@ -1948,7 +1934,7 @@
|
|
struct ehci_sitd, sitd_list);
|
|
list_move_tail (&sitd->sitd_list, &stream->td_list);
|
|
sitd->stream = iso_stream_get (stream);
|
|
- sitd->urb = urb;
|
|
+ sitd->urb = usb_get_urb (urb);
|
|
|
|
sitd_patch(ehci, stream, sitd, sched, packet);
|
|
sitd_link (ehci, (next_uframe >> 3) % ehci->periodic_size,
|
|
@@ -2033,7 +2019,7 @@
|
|
(void) disable_periodic(ehci);
|
|
ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
|
|
|
|
- if (list_is_singular(&stream->td_list)) {
|
|
+ if (list_empty (&stream->td_list)) {
|
|
ehci_to_hcd(ehci)->self.bandwidth_allocated
|
|
-= stream->bandwidth;
|
|
ehci_vdbg (ehci,
|
|
@@ -2044,6 +2030,7 @@
|
|
iso_stream_put (ehci, stream);
|
|
/* OK to recycle this SITD now that its completion callback ran. */
|
|
done:
|
|
+ usb_put_urb(urb);
|
|
sitd->urb = NULL;
|
|
sitd->stream = NULL;
|
|
list_move(&sitd->sitd_list, &stream->free_list);
|
|
@@ -2114,20 +2101,6 @@
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
-static void free_cached_itd_list(struct ehci_hcd *ehci)
|
|
-{
|
|
- struct ehci_itd *itd, *n;
|
|
-
|
|
- list_for_each_entry_safe(itd, n, &ehci->cached_itd_list, itd_list) {
|
|
- struct ehci_iso_stream *stream = itd->stream;
|
|
- itd->stream = NULL;
|
|
- list_move(&itd->itd_list, &stream->free_list);
|
|
- iso_stream_put(ehci, stream);
|
|
- }
|
|
-}
|
|
-
|
|
-/*-------------------------------------------------------------------------*/
|
|
-
|
|
static void
|
|
scan_periodic (struct ehci_hcd *ehci)
|
|
{
|
|
@@ -2142,17 +2115,10 @@
|
|
* Touches as few pages as possible: cache-friendly.
|
|
*/
|
|
now_uframe = ehci->next_uframe;
|
|
- if (HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) {
|
|
+ if (HC_IS_RUNNING (ehci_to_hcd(ehci)->state))
|
|
clock = ehci_readl(ehci, &ehci->regs->frame_index);
|
|
- clock_frame = (clock >> 3) % ehci->periodic_size;
|
|
- } else {
|
|
+ else
|
|
clock = now_uframe + mod - 1;
|
|
- clock_frame = -1;
|
|
- }
|
|
- if (ehci->clock_frame != clock_frame) {
|
|
- free_cached_itd_list(ehci);
|
|
- ehci->clock_frame = clock_frame;
|
|
- }
|
|
clock %= mod;
|
|
clock_frame = clock >> 3;
|
|
|
|
@@ -2311,10 +2277,6 @@
|
|
/* rescan the rest of this frame, then ... */
|
|
clock = now;
|
|
clock_frame = clock >> 3;
|
|
- if (ehci->clock_frame != clock_frame) {
|
|
- free_cached_itd_list(ehci);
|
|
- ehci->clock_frame = clock_frame;
|
|
- }
|
|
} else {
|
|
now_uframe++;
|
|
now_uframe %= mod;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/ohci-pci.c linux-2.6.29-rc3.owrt/drivers/usb/host/ohci-pci.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/ohci-pci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/ohci-pci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -487,6 +487,7 @@
|
|
|
|
#ifdef CONFIG_PM
|
|
.suspend = usb_hcd_pci_suspend,
|
|
+ .resume_early = usb_hcd_pci_resume_early,
|
|
.resume = usb_hcd_pci_resume,
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/uhci-hcd.c linux-2.6.29-rc3.owrt/drivers/usb/host/uhci-hcd.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/uhci-hcd.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/uhci-hcd.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -942,6 +942,7 @@
|
|
|
|
#ifdef CONFIG_PM
|
|
.suspend = usb_hcd_pci_suspend,
|
|
+ .resume_early = usb_hcd_pci_resume_early,
|
|
.resume = usb_hcd_pci_resume,
|
|
#endif /* PM */
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/whci/asl.c linux-2.6.29-rc3.owrt/drivers/usb/host/whci/asl.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/whci/asl.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/whci/asl.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -170,17 +170,12 @@
|
|
void asl_update(struct whc *whc, uint32_t wusbcmd)
|
|
{
|
|
struct wusbhc *wusbhc = &whc->wusbhc;
|
|
- long t;
|
|
|
|
mutex_lock(&wusbhc->mutex);
|
|
if (wusbhc->active) {
|
|
whc_write_wusbcmd(whc, wusbcmd, wusbcmd);
|
|
- t = wait_event_timeout(
|
|
- whc->async_list_wq,
|
|
- (le_readl(whc->base + WUSBCMD) & WUSBCMD_ASYNC_UPDATED) == 0,
|
|
- msecs_to_jiffies(1000));
|
|
- if (t == 0)
|
|
- whc_hw_error(whc, "ASL update timeout");
|
|
+ wait_event(whc->async_list_wq,
|
|
+ (le_readl(whc->base + WUSBCMD) & WUSBCMD_ASYNC_UPDATED) == 0);
|
|
}
|
|
mutex_unlock(&wusbhc->mutex);
|
|
}
|
|
@@ -227,13 +222,13 @@
|
|
* Now that the ASL is updated, complete the removal of any
|
|
* removed qsets.
|
|
*/
|
|
- spin_lock_irq(&whc->lock);
|
|
+ spin_lock(&whc->lock);
|
|
|
|
list_for_each_entry_safe(qset, t, &whc->async_removed_list, list_node) {
|
|
qset_remove_complete(whc, qset);
|
|
}
|
|
|
|
- spin_unlock_irq(&whc->lock);
|
|
+ spin_unlock(&whc->lock);
|
|
}
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/whci/hw.c linux-2.6.29-rc3.owrt/drivers/usb/host/whci/hw.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/whci/hw.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/whci/hw.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -87,18 +87,3 @@
|
|
|
|
return ret;
|
|
}
|
|
-
|
|
-/**
|
|
- * whc_hw_error - recover from a hardware error
|
|
- * @whc: the WHCI HC that broke.
|
|
- * @reason: a description of the failure.
|
|
- *
|
|
- * Recover from broken hardware with a full reset.
|
|
- */
|
|
-void whc_hw_error(struct whc *whc, const char *reason)
|
|
-{
|
|
- struct wusbhc *wusbhc = &whc->wusbhc;
|
|
-
|
|
- dev_err(&whc->umc->dev, "hardware error: %s\n", reason);
|
|
- wusbhc_reset_all(wusbhc);
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/whci/pzl.c linux-2.6.29-rc3.owrt/drivers/usb/host/whci/pzl.c
|
|
--- linux-2.6.29.owrt/drivers/usb/host/whci/pzl.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/whci/pzl.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -183,17 +183,12 @@
|
|
void pzl_update(struct whc *whc, uint32_t wusbcmd)
|
|
{
|
|
struct wusbhc *wusbhc = &whc->wusbhc;
|
|
- long t;
|
|
|
|
mutex_lock(&wusbhc->mutex);
|
|
if (wusbhc->active) {
|
|
whc_write_wusbcmd(whc, wusbcmd, wusbcmd);
|
|
- t = wait_event_timeout(
|
|
- whc->periodic_list_wq,
|
|
- (le_readl(whc->base + WUSBCMD) & WUSBCMD_PERIODIC_UPDATED) == 0,
|
|
- msecs_to_jiffies(1000));
|
|
- if (t == 0)
|
|
- whc_hw_error(whc, "PZL update timeout");
|
|
+ wait_event(whc->periodic_list_wq,
|
|
+ (le_readl(whc->base + WUSBCMD) & WUSBCMD_PERIODIC_UPDATED) == 0);
|
|
}
|
|
mutex_unlock(&wusbhc->mutex);
|
|
}
|
|
@@ -255,13 +250,13 @@
|
|
* Now that the PZL is updated, complete the removal of any
|
|
* removed qsets.
|
|
*/
|
|
- spin_lock_irq(&whc->lock);
|
|
+ spin_lock(&whc->lock);
|
|
|
|
list_for_each_entry_safe(qset, t, &whc->periodic_removed_list, list_node) {
|
|
qset_remove_complete(whc, qset);
|
|
}
|
|
|
|
- spin_unlock_irq(&whc->lock);
|
|
+ spin_unlock(&whc->lock);
|
|
}
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/host/whci/whcd.h linux-2.6.29-rc3.owrt/drivers/usb/host/whci/whcd.h
|
|
--- linux-2.6.29.owrt/drivers/usb/host/whci/whcd.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/host/whci/whcd.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -137,7 +137,6 @@
|
|
/* hw.c */
|
|
void whc_write_wusbcmd(struct whc *whc, u32 mask, u32 val);
|
|
int whc_do_gencmd(struct whc *whc, u32 cmd, u32 params, void *addr, size_t len);
|
|
-void whc_hw_error(struct whc *whc, const char *reason);
|
|
|
|
/* wusb.c */
|
|
int whc_wusbhc_start(struct wusbhc *wusbhc);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/image/mdc800.c linux-2.6.29-rc3.owrt/drivers/usb/image/mdc800.c
|
|
--- linux-2.6.29.owrt/drivers/usb/image/mdc800.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/image/mdc800.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -499,7 +499,6 @@
|
|
retval = usb_register_dev(intf, &mdc800_class);
|
|
if (retval) {
|
|
dev_err(&intf->dev, "Not able to get a minor for this device.\n");
|
|
- mutex_unlock(&mdc800->io_lock);
|
|
return -ENODEV;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/Makefile linux-2.6.29-rc3.owrt/drivers/usb/Makefile
|
|
--- linux-2.6.29.owrt/drivers/usb/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -11,7 +11,6 @@
|
|
obj-$(CONFIG_PCI) += host/
|
|
obj-$(CONFIG_USB_EHCI_HCD) += host/
|
|
obj-$(CONFIG_USB_ISP116X_HCD) += host/
|
|
-obj-$(CONFIG_USB_ISP1760_HCD) += host/
|
|
obj-$(CONFIG_USB_OHCI_HCD) += host/
|
|
obj-$(CONFIG_USB_UHCI_HCD) += host/
|
|
obj-$(CONFIG_USB_FHCI_HCD) += host/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/misc/adutux.c linux-2.6.29-rc3.owrt/drivers/usb/misc/adutux.c
|
|
--- linux-2.6.29.owrt/drivers/usb/misc/adutux.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/misc/adutux.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -376,7 +376,7 @@
|
|
if (dev->open_count <= 0) {
|
|
dbg(1," %s : device not opened", __func__);
|
|
retval = -ENODEV;
|
|
- goto unlock;
|
|
+ goto exit;
|
|
}
|
|
|
|
adu_release_internal(dev);
|
|
@@ -385,9 +385,9 @@
|
|
if (!dev->open_count) /* ... and we're the last user */
|
|
adu_delete(dev);
|
|
}
|
|
-unlock:
|
|
- mutex_unlock(&adutux_mutex);
|
|
+
|
|
exit:
|
|
+ mutex_unlock(&adutux_mutex);
|
|
dbg(2," %s : leave, return value %d", __func__, retval);
|
|
return retval;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/misc/vstusb.c linux-2.6.29-rc3.owrt/drivers/usb/misc/vstusb.c
|
|
--- linux-2.6.29.owrt/drivers/usb/misc/vstusb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/misc/vstusb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -401,7 +401,6 @@
|
|
}
|
|
|
|
if (copy_from_user(buf, buffer, count)) {
|
|
- mutex_unlock(&vstdev->lock);
|
|
dev_err(&dev->dev, "%s: can't copy_from_user\n", __func__);
|
|
retval = -EFAULT;
|
|
goto exit;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/musb/davinci.c linux-2.6.29-rc3.owrt/drivers/usb/musb/davinci.c
|
|
--- linux-2.6.29.owrt/drivers/usb/musb/davinci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/musb/davinci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -377,8 +377,18 @@
|
|
u32 revision;
|
|
|
|
musb->mregs += DAVINCI_BASE_OFFSET;
|
|
+#if 0
|
|
+ /* REVISIT there's something odd about clocking, this
|
|
+ * didn't appear do the job ...
|
|
+ */
|
|
+ musb->clock = clk_get(pDevice, "usb");
|
|
+ if (IS_ERR(musb->clock))
|
|
+ return PTR_ERR(musb->clock);
|
|
|
|
- clk_enable(musb->clock);
|
|
+ status = clk_enable(musb->clock);
|
|
+ if (status < 0)
|
|
+ return -ENODEV;
|
|
+#endif
|
|
|
|
/* returns zero if e.g. not clocked */
|
|
revision = musb_readl(tibase, DAVINCI_USB_VERSION_REG);
|
|
@@ -443,8 +453,5 @@
|
|
}
|
|
|
|
phy_off();
|
|
-
|
|
- clk_disable(musb->clock);
|
|
-
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/musb/musb_core.c linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_core.c
|
|
--- linux-2.6.29.owrt/drivers/usb/musb/musb_core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_core.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -115,7 +115,7 @@
|
|
|
|
|
|
unsigned musb_debug;
|
|
-module_param_named(debug, musb_debug, uint, S_IRUGO | S_IWUSR);
|
|
+module_param(musb_debug, uint, S_IRUGO | S_IWUSR);
|
|
MODULE_PARM_DESC(debug, "Debug message level. Default = 0");
|
|
|
|
#define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia"
|
|
@@ -767,7 +767,6 @@
|
|
#ifdef CONFIG_USB_MUSB_HDRC_HCD
|
|
case OTG_STATE_A_HOST:
|
|
case OTG_STATE_A_SUSPEND:
|
|
- usb_hcd_resume_root_hub(musb_to_hcd(musb));
|
|
musb_root_disconnect(musb);
|
|
if (musb->a_wait_bcon != 0)
|
|
musb_platform_try_idle(musb, jiffies
|
|
@@ -1816,7 +1815,7 @@
|
|
#ifdef CONFIG_SYSFS
|
|
device_remove_file(musb->controller, &dev_attr_mode);
|
|
device_remove_file(musb->controller, &dev_attr_vbus);
|
|
-#ifdef CONFIG_USB_GADGET_MUSB_HDRC
|
|
+#ifdef CONFIG_USB_MUSB_OTG
|
|
device_remove_file(musb->controller, &dev_attr_srp);
|
|
#endif
|
|
#endif
|
|
@@ -2064,7 +2063,7 @@
|
|
#ifdef CONFIG_SYSFS
|
|
device_remove_file(musb->controller, &dev_attr_mode);
|
|
device_remove_file(musb->controller, &dev_attr_vbus);
|
|
-#ifdef CONFIG_USB_GADGET_MUSB_HDRC
|
|
+#ifdef CONFIG_USB_MUSB_OTG
|
|
device_remove_file(musb->controller, &dev_attr_srp);
|
|
#endif
|
|
#endif
|
|
@@ -2244,10 +2243,10 @@
|
|
return platform_driver_probe(&musb_driver, musb_probe);
|
|
}
|
|
|
|
-/* make us init after usbcore and i2c (transceivers, regulators, etc)
|
|
- * and before usb gadget and host-side drivers start to register
|
|
+/* make us init after usbcore and before usb
|
|
+ * gadget and host-side drivers start to register
|
|
*/
|
|
-fs_initcall(musb_init);
|
|
+subsys_initcall(musb_init);
|
|
|
|
static void __exit musb_cleanup(void)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/musb/musb_gadget.c linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_gadget.c
|
|
--- linux-2.6.29.owrt/drivers/usb/musb/musb_gadget.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_gadget.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -575,7 +575,7 @@
|
|
struct usb_request *request = &req->request;
|
|
struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out;
|
|
void __iomem *epio = musb->endpoints[epnum].regs;
|
|
- unsigned fifo_count = 0;
|
|
+ u16 fifo_count = 0;
|
|
u16 len = musb_ep->packet_sz;
|
|
|
|
csr = musb_readw(epio, MUSB_RXCSR);
|
|
@@ -687,7 +687,7 @@
|
|
len, fifo_count,
|
|
musb_ep->packet_sz);
|
|
|
|
- fifo_count = min_t(unsigned, len, fifo_count);
|
|
+ fifo_count = min(len, fifo_count);
|
|
|
|
#ifdef CONFIG_USB_TUSB_OMAP_DMA
|
|
if (tusb_dma_omap() && musb_ep->dma) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/musb/musb_host.c linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_host.c
|
|
--- linux-2.6.29.owrt/drivers/usb/musb/musb_host.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_host.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -335,11 +335,16 @@
|
|
static struct musb_qh *
|
|
musb_giveback(struct musb_qh *qh, struct urb *urb, int status)
|
|
{
|
|
+ int is_in;
|
|
struct musb_hw_ep *ep = qh->hw_ep;
|
|
struct musb *musb = ep->musb;
|
|
- int is_in = usb_pipein(urb->pipe);
|
|
int ready = qh->is_ready;
|
|
|
|
+ if (ep->is_shared_fifo)
|
|
+ is_in = 1;
|
|
+ else
|
|
+ is_in = usb_pipein(urb->pipe);
|
|
+
|
|
/* save toggle eagerly, for paranoia */
|
|
switch (qh->type) {
|
|
case USB_ENDPOINT_XFER_BULK:
|
|
@@ -427,7 +432,7 @@
|
|
else
|
|
qh = musb_giveback(qh, urb, urb->status);
|
|
|
|
- if (qh != NULL && qh->is_ready) {
|
|
+ if (qh && qh->is_ready && !list_empty(&qh->hep->urb_list)) {
|
|
DBG(4, "... next ep%d %cX urb %p\n",
|
|
hw_ep->epnum, is_in ? 'R' : 'T',
|
|
next_urb(qh));
|
|
@@ -937,8 +942,8 @@
|
|
switch (musb->ep0_stage) {
|
|
case MUSB_EP0_IN:
|
|
fifo_dest = urb->transfer_buffer + urb->actual_length;
|
|
- fifo_count = min_t(size_t, len, urb->transfer_buffer_length -
|
|
- urb->actual_length);
|
|
+ fifo_count = min(len, ((u16) (urb->transfer_buffer_length
|
|
+ - urb->actual_length)));
|
|
if (fifo_count < len)
|
|
urb->status = -EOVERFLOW;
|
|
|
|
@@ -971,9 +976,10 @@
|
|
}
|
|
/* FALLTHROUGH */
|
|
case MUSB_EP0_OUT:
|
|
- fifo_count = min_t(size_t, qh->maxpacket,
|
|
- urb->transfer_buffer_length -
|
|
- urb->actual_length);
|
|
+ fifo_count = min(qh->maxpacket, ((u16)
|
|
+ (urb->transfer_buffer_length
|
|
+ - urb->actual_length)));
|
|
+
|
|
if (fifo_count) {
|
|
fifo_dest = (u8 *) (urb->transfer_buffer
|
|
+ urb->actual_length);
|
|
@@ -1155,8 +1161,7 @@
|
|
struct urb *urb;
|
|
struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
|
|
void __iomem *epio = hw_ep->regs;
|
|
- struct musb_qh *qh = hw_ep->is_shared_fifo ? hw_ep->in_qh
|
|
- : hw_ep->out_qh;
|
|
+ struct musb_qh *qh = hw_ep->out_qh;
|
|
u32 status = 0;
|
|
void __iomem *mbase = musb->mregs;
|
|
struct dma_channel *dma;
|
|
@@ -1303,8 +1308,7 @@
|
|
* packets before updating TXCSR ... other docs disagree ...
|
|
*/
|
|
/* PIO: start next packet in this URB */
|
|
- if (wLength > qh->maxpacket)
|
|
- wLength = qh->maxpacket;
|
|
+ wLength = min(qh->maxpacket, (u16) wLength);
|
|
musb_write_fifo(hw_ep, wLength, buf);
|
|
qh->segsize = wLength;
|
|
|
|
@@ -1863,21 +1867,19 @@
|
|
}
|
|
qh->type_reg = type_reg;
|
|
|
|
- /* Precompute RXINTERVAL/TXINTERVAL register */
|
|
+ /* precompute rxinterval/txinterval register */
|
|
+ interval = min((u8)16, epd->bInterval); /* log encoding */
|
|
switch (qh->type) {
|
|
case USB_ENDPOINT_XFER_INT:
|
|
- /*
|
|
- * Full/low speeds use the linear encoding,
|
|
- * high speed uses the logarithmic encoding.
|
|
- */
|
|
- if (urb->dev->speed <= USB_SPEED_FULL) {
|
|
- interval = max_t(u8, epd->bInterval, 1);
|
|
- break;
|
|
+ /* fullspeed uses linear encoding */
|
|
+ if (USB_SPEED_FULL == urb->dev->speed) {
|
|
+ interval = epd->bInterval;
|
|
+ if (!interval)
|
|
+ interval = 1;
|
|
}
|
|
/* FALLTHROUGH */
|
|
case USB_ENDPOINT_XFER_ISOC:
|
|
- /* ISO always uses logarithmic encoding */
|
|
- interval = min_t(u8, epd->bInterval, 16);
|
|
+ /* iso always uses log encoding */
|
|
break;
|
|
default:
|
|
/* REVISIT we actually want to use NAK limits, hinting to the
|
|
@@ -2035,9 +2037,9 @@
|
|
goto done;
|
|
|
|
/* Any URB not actively programmed into endpoint hardware can be
|
|
- * immediately given back; that's any URB not at the head of an
|
|
+ * immediately given back. Such an URB must be at the head of its
|
|
* endpoint queue, unless someday we get real DMA queues. And even
|
|
- * if it's at the head, it might not be known to the hardware...
|
|
+ * then, it might not be known to the hardware...
|
|
*
|
|
* Otherwise abort current transfer, pending dma, etc.; urb->status
|
|
* has already been updated. This is a synchronous abort; it'd be
|
|
@@ -2076,15 +2078,6 @@
|
|
qh->is_ready = 0;
|
|
__musb_giveback(musb, urb, 0);
|
|
qh->is_ready = ready;
|
|
-
|
|
- /* If nothing else (usually musb_giveback) is using it
|
|
- * and its URB list has emptied, recycle this qh.
|
|
- */
|
|
- if (ready && list_empty(&qh->hep->urb_list)) {
|
|
- qh->hep->hcpriv = NULL;
|
|
- list_del(&qh->ring);
|
|
- kfree(qh);
|
|
- }
|
|
} else
|
|
ret = musb_cleanup_urb(urb, qh, urb->pipe & USB_DIR_IN);
|
|
done:
|
|
@@ -2100,15 +2093,14 @@
|
|
unsigned long flags;
|
|
struct musb *musb = hcd_to_musb(hcd);
|
|
u8 is_in = epnum & USB_DIR_IN;
|
|
- struct musb_qh *qh;
|
|
- struct urb *urb;
|
|
+ struct musb_qh *qh = hep->hcpriv;
|
|
+ struct urb *urb, *tmp;
|
|
struct list_head *sched;
|
|
|
|
- spin_lock_irqsave(&musb->lock, flags);
|
|
+ if (!qh)
|
|
+ return;
|
|
|
|
- qh = hep->hcpriv;
|
|
- if (qh == NULL)
|
|
- goto exit;
|
|
+ spin_lock_irqsave(&musb->lock, flags);
|
|
|
|
switch (qh->type) {
|
|
case USB_ENDPOINT_XFER_CONTROL:
|
|
@@ -2143,28 +2135,13 @@
|
|
|
|
/* cleanup */
|
|
musb_cleanup_urb(urb, qh, urb->pipe & USB_DIR_IN);
|
|
+ } else
|
|
+ urb = NULL;
|
|
|
|
- /* Then nuke all the others ... and advance the
|
|
- * queue on hw_ep (e.g. bulk ring) when we're done.
|
|
- */
|
|
- while (!list_empty(&hep->urb_list)) {
|
|
- urb = next_urb(qh);
|
|
- urb->status = -ESHUTDOWN;
|
|
- musb_advance_schedule(musb, urb, qh->hw_ep, is_in);
|
|
- }
|
|
- } else {
|
|
- /* Just empty the queue; the hardware is busy with
|
|
- * other transfers, and since !qh->is_ready nothing
|
|
- * will activate any of these as it advances.
|
|
- */
|
|
- while (!list_empty(&hep->urb_list))
|
|
- __musb_giveback(musb, next_urb(qh), -ESHUTDOWN);
|
|
+ /* then just nuke all the others */
|
|
+ list_for_each_entry_safe_from(urb, tmp, &hep->urb_list, urb_list)
|
|
+ musb_giveback(qh, urb, -ESHUTDOWN);
|
|
|
|
- hep->hcpriv = NULL;
|
|
- list_del(&qh->ring);
|
|
- kfree(qh);
|
|
- }
|
|
-exit:
|
|
spin_unlock_irqrestore(&musb->lock, flags);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/serial/aircable.c linux-2.6.29-rc3.owrt/drivers/usb/serial/aircable.c
|
|
--- linux-2.6.29.owrt/drivers/usb/serial/aircable.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/serial/aircable.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -621,9 +621,9 @@
|
|
goto failed_usb_register;
|
|
return 0;
|
|
|
|
-failed_usb_register:
|
|
- usb_serial_deregister(&aircable_device);
|
|
failed_serial_register:
|
|
+ usb_serial_deregister(&aircable_device);
|
|
+failed_usb_register:
|
|
return retval;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/serial/cp2101.c linux-2.6.29-rc3.owrt/drivers/usb/serial/cp2101.c
|
|
--- linux-2.6.29.owrt/drivers/usb/serial/cp2101.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/serial/cp2101.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -79,7 +79,6 @@
|
|
{ USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
|
|
{ USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
|
|
{ USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */
|
|
- { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */
|
|
{ USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */
|
|
{ USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */
|
|
{ USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/serial/ftdi_sio.c linux-2.6.29-rc3.owrt/drivers/usb/serial/ftdi_sio.c
|
|
--- linux-2.6.29.owrt/drivers/usb/serial/ftdi_sio.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/serial/ftdi_sio.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -662,12 +662,6 @@
|
|
{ USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
|
|
{ USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
|
|
{ USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
|
|
- { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID) },
|
|
- { USB_DEVICE(ATMEL_VID, STK541_PID) },
|
|
- { USB_DEVICE(DE_VID, STB_PID) },
|
|
- { USB_DEVICE(DE_VID, WHT_PID) },
|
|
- { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
|
|
- .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
|
|
{ }, /* Optional parameter entry */
|
|
{ } /* Terminating entry */
|
|
};
|
|
@@ -1070,10 +1064,8 @@
|
|
|
|
if (!capable(CAP_SYS_ADMIN)) {
|
|
if (((new_serial.flags & ~ASYNC_USR_MASK) !=
|
|
- (priv->flags & ~ASYNC_USR_MASK))) {
|
|
- unlock_kernel();
|
|
+ (priv->flags & ~ASYNC_USR_MASK)))
|
|
return -EPERM;
|
|
- }
|
|
priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
|
|
(new_serial.flags & ASYNC_USR_MASK));
|
|
priv->custom_divisor = new_serial.custom_divisor;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/serial/ftdi_sio.h linux-2.6.29-rc3.owrt/drivers/usb/serial/ftdi_sio.h
|
|
--- linux-2.6.29.owrt/drivers/usb/serial/ftdi_sio.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/serial/ftdi_sio.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -844,9 +844,6 @@
|
|
#define TML_VID 0x1B91 /* Vendor ID */
|
|
#define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */
|
|
|
|
-/* NDI Polaris System */
|
|
-#define FTDI_NDI_HUC_PID 0xDA70
|
|
-
|
|
/* Propox devices */
|
|
#define FTDI_PROPOX_JTAGCABLEII_PID 0xD738
|
|
|
|
@@ -893,26 +890,6 @@
|
|
#define DIEBOLD_BCS_SE923_PID 0xfb99
|
|
|
|
/*
|
|
- * Atmel STK541
|
|
- */
|
|
-#define ATMEL_VID 0x03eb /* Vendor ID */
|
|
-#define STK541_PID 0x2109 /* Zigbee Controller */
|
|
-
|
|
-/*
|
|
- * Dresden Elektronic Sensor Terminal Board
|
|
- */
|
|
-#define DE_VID 0x1cf1 /* Vendor ID */
|
|
-#define STB_PID 0x0001 /* Sensor Terminal Board */
|
|
-#define WHT_PID 0x0004 /* Wireless Handheld Terminal */
|
|
-
|
|
-/*
|
|
- * Blackfin gnICE JTAG
|
|
- * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
|
|
- */
|
|
-#define ADI_VID 0x0456
|
|
-#define ADI_GNICE_PID 0xF000
|
|
-
|
|
-/*
|
|
* BmRequestType: 1100 0000b
|
|
* bRequest: FTDI_E2_READ
|
|
* wValue: 0
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/serial/option.c linux-2.6.29-rc3.owrt/drivers/usb/serial/option.c
|
|
--- linux-2.6.29.owrt/drivers/usb/serial/option.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/serial/option.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -89,7 +89,6 @@
|
|
#define OPTION_PRODUCT_ETNA_MODEM_GT 0x7041
|
|
#define OPTION_PRODUCT_ETNA_MODEM_EX 0x7061
|
|
#define OPTION_PRODUCT_ETNA_KOI_MODEM 0x7100
|
|
-#define OPTION_PRODUCT_GTM380_MODEM 0x7201
|
|
|
|
#define HUAWEI_VENDOR_ID 0x12D1
|
|
#define HUAWEI_PRODUCT_E600 0x1001
|
|
@@ -198,18 +197,16 @@
|
|
/* OVATION PRODUCTS */
|
|
#define NOVATELWIRELESS_PRODUCT_MC727 0x4100
|
|
#define NOVATELWIRELESS_PRODUCT_MC950D 0x4400
|
|
-#define NOVATELWIRELESS_PRODUCT_U727 0x5010
|
|
|
|
/* FUTURE NOVATEL PRODUCTS */
|
|
-#define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED 0X6000
|
|
-#define NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED 0X6001
|
|
-#define NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED 0X7000
|
|
-#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED 0X7001
|
|
-#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED 0X8000
|
|
-#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0X8001
|
|
-#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0X9000
|
|
-#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0X9001
|
|
-#define NOVATELWIRELESS_PRODUCT_GLOBAL 0XA001
|
|
+#define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000
|
|
+#define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000
|
|
+#define NOVATELWIRELESS_PRODUCT_EMBEDDED_1 0x8000
|
|
+#define NOVATELWIRELESS_PRODUCT_GLOBAL_1 0x9000
|
|
+#define NOVATELWIRELESS_PRODUCT_EVDO_2 0x6001
|
|
+#define NOVATELWIRELESS_PRODUCT_HSPA_2 0x7001
|
|
+#define NOVATELWIRELESS_PRODUCT_EMBEDDED_2 0x8001
|
|
+#define NOVATELWIRELESS_PRODUCT_GLOBAL_2 0x9001
|
|
|
|
/* AMOI PRODUCTS */
|
|
#define AMOI_VENDOR_ID 0x1614
|
|
@@ -219,27 +216,6 @@
|
|
|
|
#define DELL_VENDOR_ID 0x413C
|
|
|
|
-/* Dell modems */
|
|
-#define DELL_PRODUCT_5700_MINICARD 0x8114
|
|
-#define DELL_PRODUCT_5500_MINICARD 0x8115
|
|
-#define DELL_PRODUCT_5505_MINICARD 0x8116
|
|
-#define DELL_PRODUCT_5700_EXPRESSCARD 0x8117
|
|
-#define DELL_PRODUCT_5510_EXPRESSCARD 0x8118
|
|
-
|
|
-#define DELL_PRODUCT_5700_MINICARD_SPRINT 0x8128
|
|
-#define DELL_PRODUCT_5700_MINICARD_TELUS 0x8129
|
|
-
|
|
-#define DELL_PRODUCT_5720_MINICARD_VZW 0x8133
|
|
-#define DELL_PRODUCT_5720_MINICARD_SPRINT 0x8134
|
|
-#define DELL_PRODUCT_5720_MINICARD_TELUS 0x8135
|
|
-#define DELL_PRODUCT_5520_MINICARD_CINGULAR 0x8136
|
|
-#define DELL_PRODUCT_5520_MINICARD_GENERIC_L 0x8137
|
|
-#define DELL_PRODUCT_5520_MINICARD_GENERIC_I 0x8138
|
|
-
|
|
-#define DELL_PRODUCT_5730_MINICARD_SPRINT 0x8180
|
|
-#define DELL_PRODUCT_5730_MINICARD_TELUS 0x8181
|
|
-#define DELL_PRODUCT_5730_MINICARD_VZW 0x8182
|
|
-
|
|
#define KYOCERA_VENDOR_ID 0x0c88
|
|
#define KYOCERA_PRODUCT_KPC650 0x17da
|
|
#define KYOCERA_PRODUCT_KPC680 0x180a
|
|
@@ -290,13 +266,19 @@
|
|
|
|
/* ZTE PRODUCTS */
|
|
#define ZTE_VENDOR_ID 0x19d2
|
|
-#define ZTE_PRODUCT_MF622 0x0001
|
|
#define ZTE_PRODUCT_MF628 0x0015
|
|
#define ZTE_PRODUCT_MF626 0x0031
|
|
#define ZTE_PRODUCT_CDMA_TECH 0xfffe
|
|
|
|
-#define BENQ_VENDOR_ID 0x04a5
|
|
-#define BENQ_PRODUCT_H10 0x4068
|
|
+/* Ericsson products */
|
|
+#define ERICSSON_VENDOR_ID 0x0bdb
|
|
+#define ERICSSON_PRODUCT_F3507G 0x1900
|
|
+
|
|
+/* Pantech products */
|
|
+#define PANTECH_VENDOR_ID 0x106c
|
|
+#define PANTECH_PRODUCT_PC5740 0x3701
|
|
+#define PANTECH_PRODUCT_PC5750 0x3702 /* PX-500 */
|
|
+#define PANTECH_PRODUCT_UM150 0x3711
|
|
|
|
static struct usb_device_id option_ids[] = {
|
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
|
|
@@ -323,7 +305,6 @@
|
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
|
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
|
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
|
|
- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTM380_MODEM) },
|
|
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q101) },
|
|
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q111) },
|
|
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) },
|
|
@@ -414,37 +395,31 @@
|
|
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
|
|
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
|
|
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel MC727/U727/USB727 */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, /* Novatel HSPA Embedded product */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, /* Novatel EVDO product */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, /* Novatel HSPA product */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED) }, /* Novatel EVDO Embedded product */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED) }, /* Novatel HSPA Embedded product */
|
|
- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL) }, /* Novatel Global product */
|
|
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */
|
|
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */
|
|
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */
|
|
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_1) }, /* Novatel Global product */
|
|
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_2) }, /* Novatel EVDO product */
|
|
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_2) }, /* Novatel HSPA product */
|
|
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_2) }, /* Novatel Embedded product */
|
|
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_2) }, /* Novatel Global product */
|
|
|
|
{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
|
|
{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
|
|
{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },
|
|
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5505_MINICARD) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_EXPRESSCARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5510_EXPRESSCARD) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_SPRINT) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_TELUS) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_VZW) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_SPRINT) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_TELUS) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) }, /* Dell Wireless HSDPA 5520 */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
|
|
- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8129) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
|
|
+ { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
|
|
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
|
|
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
|
|
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
|
|
@@ -509,12 +484,13 @@
|
|
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
|
{ USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
|
|
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
|
|
- { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622) },
|
|
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
|
|
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
|
|
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
|
|
- { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
|
|
- { USB_DEVICE(0x1da5, 0x4515) }, /* BenQ H20 */
|
|
+ { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
|
|
+ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) },
|
|
+ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) },
|
|
+ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) },
|
|
{ } /* Terminating entry */
|
|
};
|
|
MODULE_DEVICE_TABLE(usb, option_ids);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/serial/ti_usb_3410_5052.c linux-2.6.29-rc3.owrt/drivers/usb/serial/ti_usb_3410_5052.c
|
|
--- linux-2.6.29.owrt/drivers/usb/serial/ti_usb_3410_5052.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/serial/ti_usb_3410_5052.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -176,7 +176,7 @@
|
|
/* the array dimension is the number of default entries plus */
|
|
/* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */
|
|
/* null entry */
|
|
-static struct usb_device_id ti_id_table_3410[10+TI_EXTRA_VID_PID_COUNT+1] = {
|
|
+static struct usb_device_id ti_id_table_3410[7+TI_EXTRA_VID_PID_COUNT+1] = {
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
|
|
{ USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) },
|
|
@@ -185,11 +185,9 @@
|
|
{ USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_PRODUCT_ID) },
|
|
{ USB_DEVICE(MTS_VENDOR_ID, MTS_EDGE_PRODUCT_ID) },
|
|
{ USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
|
|
- { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
|
|
- { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
|
|
};
|
|
|
|
-static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = {
|
|
+static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = {
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
|
|
@@ -197,7 +195,7 @@
|
|
{ USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
|
|
};
|
|
|
|
-static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] = {
|
|
+static struct usb_device_id ti_id_table_combined[6+2*TI_EXTRA_VID_PID_COUNT+1] = {
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
|
|
{ USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) },
|
|
@@ -210,8 +208,6 @@
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
|
|
{ USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
|
|
{ USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
|
|
- { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
|
|
- { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
|
|
{ }
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/serial/ti_usb_3410_5052.h linux-2.6.29-rc3.owrt/drivers/usb/serial/ti_usb_3410_5052.h
|
|
--- linux-2.6.29.owrt/drivers/usb/serial/ti_usb_3410_5052.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/serial/ti_usb_3410_5052.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -30,8 +30,6 @@
|
|
#define IBM_VENDOR_ID 0x04b3
|
|
#define TI_3410_PRODUCT_ID 0x3410
|
|
#define IBM_4543_PRODUCT_ID 0x4543
|
|
-#define IBM_454B_PRODUCT_ID 0x454b
|
|
-#define IBM_454C_PRODUCT_ID 0x454c
|
|
#define TI_3410_EZ430_ID 0xF430 /* TI ez430 development tool */
|
|
#define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */
|
|
#define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/storage/scsiglue.c linux-2.6.29-rc3.owrt/drivers/usb/storage/scsiglue.c
|
|
--- linux-2.6.29.owrt/drivers/usb/storage/scsiglue.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/storage/scsiglue.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -64,7 +64,6 @@
|
|
*/
|
|
#define VENDOR_ID_NOKIA 0x0421
|
|
#define VENDOR_ID_NIKON 0x04b0
|
|
-#define VENDOR_ID_PENTAX 0x0a17
|
|
#define VENDOR_ID_MOTOROLA 0x22b8
|
|
|
|
/***********************************************************************
|
|
@@ -159,7 +158,6 @@
|
|
switch (le16_to_cpu(us->pusb_dev->descriptor.idVendor)) {
|
|
case VENDOR_ID_NOKIA:
|
|
case VENDOR_ID_NIKON:
|
|
- case VENDOR_ID_PENTAX:
|
|
case VENDOR_ID_MOTOROLA:
|
|
if (!(us->fflags & (US_FL_FIX_CAPACITY |
|
|
US_FL_CAPACITY_OK)))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/storage/transport.c linux-2.6.29-rc3.owrt/drivers/usb/storage/transport.c
|
|
--- linux-2.6.29.owrt/drivers/usb/storage/transport.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/storage/transport.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -558,10 +558,32 @@
|
|
|
|
if (srb->result == SAM_STAT_GOOD && scsi_get_resid(srb) == 0) {
|
|
|
|
- /* The command succeeded. We know this device doesn't
|
|
- * have the last-sector bug, so stop checking it.
|
|
+ /* The command succeeded. If the capacity is odd
|
|
+ * (i.e., if the sector number is even) then the
|
|
+ * "always-even" heuristic would be wrong for this
|
|
+ * device. Issue a WARN() so that the kerneloops.org
|
|
+ * project will be notified and we will then know to
|
|
+ * mark the device with a CAPACITY_OK flag. Hopefully
|
|
+ * this will occur for only a few devices.
|
|
+ *
|
|
+ * Use the sign of us->last_sector_hacks to tell whether
|
|
+ * the warning has already been issued; we don't need
|
|
+ * more than one warning per device.
|
|
*/
|
|
- us->use_last_sector_hacks = 0;
|
|
+ if (!(sector & 1) && us->use_last_sector_hacks > 0) {
|
|
+ unsigned vid = le16_to_cpu(
|
|
+ us->pusb_dev->descriptor.idVendor);
|
|
+ unsigned pid = le16_to_cpu(
|
|
+ us->pusb_dev->descriptor.idProduct);
|
|
+ unsigned rev = le16_to_cpu(
|
|
+ us->pusb_dev->descriptor.bcdDevice);
|
|
+
|
|
+ WARN(1, "%s: Successful last sector success at %u, "
|
|
+ "device %04x:%04x:%04x\n",
|
|
+ sdkp->disk->disk_name, sector,
|
|
+ vid, pid, rev);
|
|
+ us->use_last_sector_hacks = -1;
|
|
+ }
|
|
|
|
} else {
|
|
/* The command failed. Allow up to 3 retries in case this
|
|
@@ -577,6 +599,14 @@
|
|
srb->result = SAM_STAT_CHECK_CONDITION;
|
|
memcpy(srb->sense_buffer, record_not_found,
|
|
sizeof(record_not_found));
|
|
+
|
|
+ /* In theory we might want to issue a WARN() here if the
|
|
+ * capacity is even, since it could indicate the device
|
|
+ * has the READ CAPACITY bug _and_ the real capacity is
|
|
+ * odd. But it could also indicate that the device
|
|
+ * simply can't access its last sector, a failure mode
|
|
+ * which is surprisingly common. So no warning.
|
|
+ */
|
|
}
|
|
|
|
done:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/storage/unusual_devs.h linux-2.6.29-rc3.owrt/drivers/usb/storage/unusual_devs.h
|
|
--- linux-2.6.29.owrt/drivers/usb/storage/unusual_devs.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/storage/unusual_devs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -226,7 +226,7 @@
|
|
US_FL_MAX_SECTORS_64 ),
|
|
|
|
/* Reported by Manuel Osdoba <manuel.osdoba@tu-ilmenau.de> */
|
|
-UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x9999,
|
|
+UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x0452,
|
|
"Nokia",
|
|
"Nokia 6233",
|
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
@@ -907,13 +907,13 @@
|
|
"Genesys Logic",
|
|
"USB to IDE Optical",
|
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
- US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 | US_FL_IGNORE_RESIDUE ),
|
|
+ US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ),
|
|
|
|
UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff,
|
|
"Genesys Logic",
|
|
"USB to IDE Disk",
|
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
- US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 | US_FL_IGNORE_RESIDUE ),
|
|
+ US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ),
|
|
|
|
/* Reported by Ben Efros <ben@pc-doctor.com> */
|
|
UNUSUAL_DEV( 0x05e3, 0x0723, 0x9451, 0x9451,
|
|
@@ -951,9 +951,7 @@
|
|
US_FL_FIX_CAPACITY ),
|
|
|
|
/* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
|
|
-/* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
|
|
- * Thomas Bartosik <tbartdev@gmx-topmail.de> */
|
|
-UNUSUAL_DEV( 0x067b, 0x2507, 0x0001, 0x0100,
|
|
+UNUSUAL_DEV( 0x067b, 0x2507, 0x0100, 0x0100,
|
|
"Prolific Technology Inc.",
|
|
"Mass Storage Device",
|
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
@@ -1216,7 +1214,7 @@
|
|
"Datafab",
|
|
"KECF-USB",
|
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
- US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY ),
|
|
+ US_FL_FIX_INQUIRY ),
|
|
|
|
/* Reported by Rauch Wolke <rauchwolke@gmx.net> */
|
|
UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff,
|
|
@@ -1356,6 +1354,21 @@
|
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
US_FL_FIX_INQUIRY ),
|
|
|
|
+
|
|
+/* Submitted by Per Winkvist <per.winkvist@uk.com> */
|
|
+UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff,
|
|
+ "Pentax",
|
|
+ "Optio S/S4",
|
|
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
+ US_FL_FIX_INQUIRY ),
|
|
+
|
|
+/* Reported by Jaak Ristioja <Ristioja@gmail.com> */
|
|
+UNUSUAL_DEV( 0x0a17, 0x006e, 0x0100, 0x0100,
|
|
+ "Pentax",
|
|
+ "K10D",
|
|
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
+ US_FL_FIX_CAPACITY ),
|
|
+
|
|
/* These are virtual windows driver CDs, which the zd1211rw driver
|
|
* automatically converts into WLAN devices. */
|
|
UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
|
|
@@ -1392,16 +1405,6 @@
|
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
0 ),
|
|
|
|
-/* Reported by Jan Dumon <j.dumon@option.com>
|
|
- * This device (wrongly) has a vendor-specific device descriptor.
|
|
- * The entry is needed so usb-storage can bind to it's mass-storage
|
|
- * interface as an interface driver */
|
|
-UNUSUAL_DEV( 0x0af0, 0x7501, 0x0000, 0x0000,
|
|
- "Option",
|
|
- "GI 0431 SD-Card",
|
|
- US_SC_DEVICE, US_PR_DEVICE, NULL,
|
|
- 0 ),
|
|
-
|
|
/* Reported by Ben Efros <ben@pc-doctor.com> */
|
|
UNUSUAL_DEV( 0x0bc2, 0x3010, 0x0000, 0x0000,
|
|
"Seagate",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/wusbcore/devconnect.c linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/devconnect.c
|
|
--- linux-2.6.29.owrt/drivers/usb/wusbcore/devconnect.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/devconnect.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -386,7 +386,6 @@
|
|
| USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED);
|
|
port->change |= USB_PORT_STAT_C_CONNECTION | USB_PORT_STAT_C_ENABLE;
|
|
if (wusb_dev) {
|
|
- dev_dbg(wusbhc->dev, "disconnecting device from port %d\n", wusb_dev->port_idx);
|
|
if (!list_empty(&wusb_dev->cack_node))
|
|
list_del_init(&wusb_dev->cack_node);
|
|
/* For the one in cack_add() */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/wusbcore/rh.c linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/rh.c
|
|
--- linux-2.6.29.owrt/drivers/usb/wusbcore/rh.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/rh.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -100,9 +100,6 @@
|
|
struct wusb_port *port = wusb_port_by_idx(wusbhc, port_idx);
|
|
struct wusb_dev *wusb_dev = port->wusb_dev;
|
|
|
|
- if (wusb_dev == NULL)
|
|
- return -ENOTCONN;
|
|
-
|
|
port->status |= USB_PORT_STAT_RESET;
|
|
port->change |= USB_PORT_STAT_C_RESET;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/usb/wusbcore/wa-xfer.c linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/wa-xfer.c
|
|
--- linux-2.6.29.owrt/drivers/usb/wusbcore/wa-xfer.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/wa-xfer.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -921,10 +921,8 @@
|
|
result = -ENODEV;
|
|
/* FIXME: segmentation broken -- kills DWA */
|
|
mutex_lock(&wusbhc->mutex); /* get a WUSB dev */
|
|
- if (urb->dev == NULL) {
|
|
- mutex_unlock(&wusbhc->mutex);
|
|
+ if (urb->dev == NULL)
|
|
goto error_dev_gone;
|
|
- }
|
|
wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, urb->dev);
|
|
if (wusb_dev == NULL) {
|
|
mutex_unlock(&wusbhc->mutex);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/uwb/allocator.c linux-2.6.29-rc3.owrt/drivers/uwb/allocator.c
|
|
--- linux-2.6.29.owrt/drivers/uwb/allocator.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/uwb/allocator.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -15,6 +15,7 @@
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
+#include <linux/version.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/uwb.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/uwb/drp.c linux-2.6.29-rc3.owrt/drivers/uwb/drp.c
|
|
--- linux-2.6.29.owrt/drivers/uwb/drp.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/uwb/drp.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -66,14 +66,14 @@
|
|
} else
|
|
dev_err(&rc->uwb_dev.dev, "SET-DRP-IE: timeout\n");
|
|
|
|
- spin_lock_bh(&rc->rsvs_lock);
|
|
+ spin_lock(&rc->rsvs_lock);
|
|
if (rc->set_drp_ie_pending > 1) {
|
|
rc->set_drp_ie_pending = 0;
|
|
uwb_rsv_queue_update(rc);
|
|
} else {
|
|
rc->set_drp_ie_pending = 0;
|
|
}
|
|
- spin_unlock_bh(&rc->rsvs_lock);
|
|
+ spin_unlock(&rc->rsvs_lock);
|
|
}
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/uwb/rsv.c linux-2.6.29-rc3.owrt/drivers/uwb/rsv.c
|
|
--- linux-2.6.29.owrt/drivers/uwb/rsv.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/uwb/rsv.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -114,8 +114,7 @@
|
|
devaddr = rsv->target.devaddr;
|
|
uwb_dev_addr_print(target, sizeof(target), &devaddr);
|
|
|
|
- dev_dbg(dev, "rsv %s %s -> %s: %s\n",
|
|
- text, owner, target, uwb_rsv_state_str(rsv->state));
|
|
+ dev_dbg(dev, "rsv %s -> %s: %s\n", owner, target, uwb_rsv_state_str(rsv->state));
|
|
}
|
|
|
|
static void uwb_rsv_release(struct kref *kref)
|
|
@@ -512,7 +511,8 @@
|
|
|
|
if (uwb_rsv_is_owner(rsv))
|
|
uwb_rsv_put_stream(rsv);
|
|
-
|
|
+
|
|
+ del_timer_sync(&rsv->timer);
|
|
uwb_dev_put(rsv->owner);
|
|
if (rsv->target.type == UWB_RSV_TARGET_DEV)
|
|
uwb_dev_put(rsv->target.dev);
|
|
@@ -870,7 +870,7 @@
|
|
*/
|
|
void uwb_rsv_sched_update(struct uwb_rc *rc)
|
|
{
|
|
- spin_lock_bh(&rc->rsvs_lock);
|
|
+ spin_lock(&rc->rsvs_lock);
|
|
if (!delayed_work_pending(&rc->rsv_update_work)) {
|
|
if (rc->set_drp_ie_pending > 0) {
|
|
rc->set_drp_ie_pending++;
|
|
@@ -879,7 +879,7 @@
|
|
uwb_rsv_queue_update(rc);
|
|
}
|
|
unlock:
|
|
- spin_unlock_bh(&rc->rsvs_lock);
|
|
+ spin_unlock(&rc->rsvs_lock);
|
|
}
|
|
|
|
/*
|
|
@@ -943,22 +943,13 @@
|
|
|
|
mutex_lock(&rc->rsvs_mutex);
|
|
list_for_each_entry_safe(rsv, t, &rc->reservations, rc_node) {
|
|
- if (rsv->state != UWB_RSV_STATE_NONE)
|
|
- uwb_rsv_set_state(rsv, UWB_RSV_STATE_NONE);
|
|
- del_timer_sync(&rsv->timer);
|
|
+ uwb_rsv_remove(rsv);
|
|
}
|
|
/* Cancel any postponed update. */
|
|
rc->set_drp_ie_pending = 0;
|
|
mutex_unlock(&rc->rsvs_mutex);
|
|
|
|
cancel_delayed_work_sync(&rc->rsv_update_work);
|
|
- flush_workqueue(rc->rsv_workq);
|
|
-
|
|
- mutex_lock(&rc->rsvs_mutex);
|
|
- list_for_each_entry_safe(rsv, t, &rc->reservations, rc_node) {
|
|
- uwb_rsv_remove(rsv);
|
|
- }
|
|
- mutex_unlock(&rc->rsvs_mutex);
|
|
}
|
|
|
|
void uwb_rsv_init(struct uwb_rc *rc)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/atafb.c linux-2.6.29-rc3.owrt/drivers/video/atafb.c
|
|
--- linux-2.6.29.owrt/drivers/video/atafb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/atafb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -841,7 +841,7 @@
|
|
tt_dmasnd.ctrl = DMASND_CTRL_OFF;
|
|
udelay(20); /* wait a while for things to settle down */
|
|
}
|
|
- mono_moni = (st_mfp.par_dt_reg & 0x80) == 0;
|
|
+ mono_moni = (mfp.par_dt_reg & 0x80) == 0;
|
|
|
|
tt_get_par(&par);
|
|
tt_encode_var(&atafb_predefined[0], &par);
|
|
@@ -2035,7 +2035,7 @@
|
|
tt_dmasnd.ctrl = DMASND_CTRL_OFF;
|
|
udelay(20); /* wait a while for things to settle down */
|
|
}
|
|
- mono_moni = (st_mfp.par_dt_reg & 0x80) == 0;
|
|
+ mono_moni = (mfp.par_dt_reg & 0x80) == 0;
|
|
|
|
stste_get_par(&par);
|
|
stste_encode_var(&atafb_predefined[0], &par);
|
|
@@ -2086,20 +2086,20 @@
|
|
return;
|
|
local_irq_save(flags);
|
|
|
|
- st_mfp.tim_ct_b = 0x10;
|
|
- st_mfp.active_edge |= 8;
|
|
- st_mfp.tim_ct_b = 0;
|
|
- st_mfp.tim_dt_b = 0xf0;
|
|
- st_mfp.tim_ct_b = 8;
|
|
- while (st_mfp.tim_dt_b > 1) /* TOS does it this way, don't ask why */
|
|
+ mfp.tim_ct_b = 0x10;
|
|
+ mfp.active_edge |= 8;
|
|
+ mfp.tim_ct_b = 0;
|
|
+ mfp.tim_dt_b = 0xf0;
|
|
+ mfp.tim_ct_b = 8;
|
|
+ while (mfp.tim_dt_b > 1) /* TOS does it this way, don't ask why */
|
|
;
|
|
- new = st_mfp.tim_dt_b;
|
|
+ new = mfp.tim_dt_b;
|
|
do {
|
|
udelay(LINE_DELAY);
|
|
old = new;
|
|
- new = st_mfp.tim_dt_b;
|
|
+ new = mfp.tim_dt_b;
|
|
} while (old != new);
|
|
- st_mfp.tim_ct_b = 0x10;
|
|
+ mfp.tim_ct_b = 0x10;
|
|
udelay(SYNC_DELAY);
|
|
|
|
if (atari_switches & ATARI_SWITCH_OVSC_IKBD)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/aty/aty128fb.c linux-2.6.29-rc3.owrt/drivers/video/aty/aty128fb.c
|
|
--- linux-2.6.29.owrt/drivers/video/aty/aty128fb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/aty/aty128fb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1475,7 +1475,7 @@
|
|
aty128_set_pll(&par->pll, par);
|
|
aty128_set_fifo(&par->fifo_reg, par);
|
|
|
|
- config = aty_ld_le32(CNFG_CNTL) & ~3;
|
|
+ config = aty_ld_le32(CONFIG_CNTL) & ~3;
|
|
|
|
#if defined(__BIG_ENDIAN)
|
|
if (par->crtc.bpp == 32)
|
|
@@ -1484,7 +1484,7 @@
|
|
config |= 1; /* make aperture do 16 bit swapping */
|
|
#endif
|
|
|
|
- aty_st_le32(CNFG_CNTL, config);
|
|
+ aty_st_le32(CONFIG_CNTL, config);
|
|
aty_st_8(CRTC_EXT_CNTL + 1, 0); /* turn the video back on */
|
|
|
|
info->fix.line_length = (par->crtc.vxres * par->crtc.bpp) >> 3;
|
|
@@ -1853,14 +1853,13 @@
|
|
* Initialisation
|
|
*/
|
|
|
|
-#ifdef CONFIG_PPC_PMAC__disabled
|
|
+#ifdef CONFIG_PPC_PMAC
|
|
static void aty128_early_resume(void *data)
|
|
{
|
|
struct aty128fb_par *par = data;
|
|
|
|
if (try_acquire_console_sem())
|
|
return;
|
|
- pci_restore_state(par->pdev);
|
|
aty128_do_resume(par->pdev);
|
|
release_console_sem();
|
|
}
|
|
@@ -1876,7 +1875,7 @@
|
|
u32 dac;
|
|
|
|
/* Get the chip revision */
|
|
- chip_rev = (aty_ld_le32(CNFG_CNTL) >> 16) & 0x1F;
|
|
+ chip_rev = (aty_ld_le32(CONFIG_CNTL) >> 16) & 0x1F;
|
|
|
|
strcpy(video_card, "Rage128 XX ");
|
|
video_card[8] = ent->device >> 8;
|
|
@@ -1908,14 +1907,7 @@
|
|
/* Indicate sleep capability */
|
|
if (par->chip_gen == rage_M3) {
|
|
pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, NULL, 0, 1);
|
|
-#if 0 /* Disable the early video resume hack for now as it's causing problems, among
|
|
- * others we now rely on the PCI core restoring the config space for us, which
|
|
- * isn't the case with that hack, and that code path causes various things to
|
|
- * be called with interrupts off while they shouldn't. I'm leaving the code in
|
|
- * as it can be useful for debugging purposes
|
|
- */
|
|
pmac_set_early_video_resume(aty128_early_resume, par);
|
|
-#endif
|
|
}
|
|
|
|
/* Find default mode */
|
|
@@ -2065,7 +2057,7 @@
|
|
|
|
/* Grab memory size from the card */
|
|
// How does this relate to the resource length from the PCI hardware?
|
|
- par->vram_size = aty_ld_le32(CNFG_MEMSIZE) & 0x03FFFFFF;
|
|
+ par->vram_size = aty_ld_le32(CONFIG_MEMSIZE) & 0x03FFFFFF;
|
|
|
|
/* Virtualize the framebuffer */
|
|
info->screen_base = ioremap(fb_addr, par->vram_size);
|
|
@@ -2373,6 +2365,7 @@
|
|
static void aty128_set_suspend(struct aty128fb_par *par, int suspend)
|
|
{
|
|
u32 pmgt;
|
|
+ u16 pwr_command;
|
|
struct pci_dev *pdev = par->pdev;
|
|
|
|
if (!par->pm_reg)
|
|
@@ -2381,8 +2374,6 @@
|
|
/* Set the chip into the appropriate suspend mode (we use D2,
|
|
* D3 would require a complete re-initialisation of the chip,
|
|
* including PCI config registers, clocks, AGP configuration, ...)
|
|
- *
|
|
- * For resume, the core will have already brought us back to D0
|
|
*/
|
|
if (suspend) {
|
|
/* Make sure CRTC2 is reset. Remove that the day we decide to
|
|
@@ -2400,9 +2391,17 @@
|
|
aty_st_le32(BUS_CNTL1, 0x00000010);
|
|
aty_st_le32(MEM_POWER_MISC, 0x0c830000);
|
|
mdelay(100);
|
|
-
|
|
+ pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
|
|
/* Switch PCI power management to D2 */
|
|
- pci_set_power_state(pdev, PCI_D2);
|
|
+ pci_write_config_word(pdev, par->pm_reg+PCI_PM_CTRL,
|
|
+ (pwr_command & ~PCI_PM_CTRL_STATE_MASK) | 2);
|
|
+ pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
|
|
+ } else {
|
|
+ /* Switch back PCI power management to D0 */
|
|
+ mdelay(100);
|
|
+ pci_write_config_word(pdev, par->pm_reg+PCI_PM_CTRL, 0);
|
|
+ pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
|
|
+ mdelay(100);
|
|
}
|
|
}
|
|
|
|
@@ -2411,12 +2410,6 @@
|
|
struct fb_info *info = pci_get_drvdata(pdev);
|
|
struct aty128fb_par *par = info->par;
|
|
|
|
- /* Because we may change PCI D state ourselves, we need to
|
|
- * first save the config space content so the core can
|
|
- * restore it properly on resume.
|
|
- */
|
|
- pci_save_state(pdev);
|
|
-
|
|
/* We don't do anything but D2, for now we return 0, but
|
|
* we may want to change that. How do we know if the BIOS
|
|
* can properly take care of D3 ? Also, with swsusp, we
|
|
@@ -2483,11 +2476,6 @@
|
|
if (pdev->dev.power.power_state.event == PM_EVENT_ON)
|
|
return 0;
|
|
|
|
- /* PCI state will have been restored by the core, so
|
|
- * we should be in D0 now with our config space fully
|
|
- * restored
|
|
- */
|
|
-
|
|
/* Wakeup chip */
|
|
aty128_set_suspend(par, 0);
|
|
par->asleep = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/aty/atyfb_base.c linux-2.6.29-rc3.owrt/drivers/video/aty/atyfb_base.c
|
|
--- linux-2.6.29.owrt/drivers/video/aty/atyfb_base.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/aty/atyfb_base.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -135,7 +135,7 @@
|
|
#if defined(CONFIG_PM) || defined(CONFIG_PMAC_BACKLIGHT) || \
|
|
defined (CONFIG_FB_ATY_GENERIC_LCD) || defined(CONFIG_FB_ATY_BACKLIGHT)
|
|
static const u32 lt_lcd_regs[] = {
|
|
- CNFG_PANEL_LG,
|
|
+ CONFIG_PANEL_LG,
|
|
LCD_GEN_CNTL_LG,
|
|
DSTN_CONTROL_LG,
|
|
HFB_PITCH_ADDR_LG,
|
|
@@ -446,7 +446,7 @@
|
|
par->pll_limits.ecp_max = aty_chips[i].ecp_max;
|
|
par->features = aty_chips[i].features;
|
|
|
|
- chip_id = aty_ld_le32(CNFG_CHIP_ID, par);
|
|
+ chip_id = aty_ld_le32(CONFIG_CHIP_ID, par);
|
|
type = chip_id & CFG_CHIP_TYPE;
|
|
rev = (chip_id & CFG_CHIP_REV) >> 24;
|
|
|
|
@@ -629,7 +629,7 @@
|
|
crtc->lcd_index = aty_ld_le32(LCD_INDEX, par);
|
|
aty_st_le32(LCD_INDEX, crtc->lcd_index, par);
|
|
}
|
|
- crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par);
|
|
+ crtc->lcd_config_panel = aty_ld_lcd(CONFIG_PANEL, par);
|
|
crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par);
|
|
|
|
|
|
@@ -676,7 +676,7 @@
|
|
aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl & ~(CRTC_EXT_DISP_EN | CRTC_EN), par);
|
|
|
|
/* update non-shadow registers first */
|
|
- aty_st_lcd(CNFG_PANEL, crtc->lcd_config_panel, par);
|
|
+ aty_st_lcd(CONFIG_PANEL, crtc->lcd_config_panel, par);
|
|
aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl &
|
|
~(CRTC_RW_SELECT | SHADOW_EN | SHADOW_RW_EN), par);
|
|
|
|
@@ -858,7 +858,7 @@
|
|
if (!M64_HAS(MOBIL_BUS))
|
|
crtc->lcd_index |= CRTC2_DISPLAY_DIS;
|
|
|
|
- crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par) | 0x4000;
|
|
+ crtc->lcd_config_panel = aty_ld_lcd(CONFIG_PANEL, par) | 0x4000;
|
|
crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par) & ~CRTC_RW_SELECT;
|
|
|
|
crtc->lcd_gen_cntl &=
|
|
@@ -1978,7 +1978,7 @@
|
|
|
|
return timeout ? 0 : -EIO;
|
|
}
|
|
-#endif /* CONFIG_PPC_PMAC */
|
|
+#endif
|
|
|
|
static int atyfb_pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
{
|
|
@@ -2002,15 +2002,9 @@
|
|
par->asleep = 1;
|
|
par->lock_blank = 1;
|
|
|
|
- /* Because we may change PCI D state ourselves, we need to
|
|
- * first save the config space content so the core can
|
|
- * restore it properly on resume.
|
|
- */
|
|
- pci_save_state(pdev);
|
|
-
|
|
#ifdef CONFIG_PPC_PMAC
|
|
/* Set chip to "suspend" mode */
|
|
- if (machine_is(powermac) && aty_power_mgmt(1, par)) {
|
|
+ if (aty_power_mgmt(1, par)) {
|
|
par->asleep = 0;
|
|
par->lock_blank = 0;
|
|
atyfb_blank(FB_BLANK_UNBLANK, info);
|
|
@@ -2053,15 +2047,11 @@
|
|
|
|
acquire_console_sem();
|
|
|
|
- /* PCI state will have been restored by the core, so
|
|
- * we should be in D0 now with our config space fully
|
|
- * restored
|
|
- */
|
|
-
|
|
#ifdef CONFIG_PPC_PMAC
|
|
- if (machine_is(powermac) &&
|
|
- pdev->dev.power.power_state.event == PM_EVENT_SUSPEND)
|
|
+ if (pdev->dev.power.power_state.event == 2)
|
|
aty_power_mgmt(0, par);
|
|
+#else
|
|
+ pci_set_power_state(pdev, PCI_D0);
|
|
#endif
|
|
|
|
aty_resume_chip(info);
|
|
@@ -2264,7 +2254,7 @@
|
|
if (!M64_HAS(INTEGRATED)) {
|
|
u32 stat0;
|
|
u8 dac_type, dac_subtype, clk_type;
|
|
- stat0 = aty_ld_le32(CNFG_STAT0, par);
|
|
+ stat0 = aty_ld_le32(CONFIG_STAT0, par);
|
|
par->bus_type = (stat0 >> 0) & 0x07;
|
|
par->ram_type = (stat0 >> 3) & 0x07;
|
|
ramname = aty_gx_ram[par->ram_type];
|
|
@@ -2334,7 +2324,7 @@
|
|
par->dac_ops = &aty_dac_ct;
|
|
par->pll_ops = &aty_pll_ct;
|
|
par->bus_type = PCI;
|
|
- par->ram_type = (aty_ld_le32(CNFG_STAT0, par) & 0x07);
|
|
+ par->ram_type = (aty_ld_le32(CONFIG_STAT0, par) & 0x07);
|
|
ramname = aty_ct_ram[par->ram_type];
|
|
/* for many chips, the mclk is 67 MHz for SDRAM, 63 MHz otherwise */
|
|
if (par->pll_limits.mclk == 67 && par->ram_type < SDRAM)
|
|
@@ -2443,7 +2433,7 @@
|
|
}
|
|
|
|
if (M64_HAS(MAGIC_VRAM_SIZE)) {
|
|
- if (aty_ld_le32(CNFG_STAT1, par) & 0x40000000)
|
|
+ if (aty_ld_le32(CONFIG_STAT1, par) & 0x40000000)
|
|
info->fix.smem_len += 0x400000;
|
|
}
|
|
|
|
@@ -2956,7 +2946,7 @@
|
|
* Fix PROMs idea of MEM_CNTL settings...
|
|
*/
|
|
mem = aty_ld_le32(MEM_CNTL, par);
|
|
- chip_id = aty_ld_le32(CNFG_CHIP_ID, par);
|
|
+ chip_id = aty_ld_le32(CONFIG_CHIP_ID, par);
|
|
if (((chip_id & CFG_CHIP_TYPE) == VT_CHIP_ID) && !((chip_id >> 24) & 1)) {
|
|
switch (mem & 0x0f) {
|
|
case 3:
|
|
@@ -2974,7 +2964,7 @@
|
|
default:
|
|
break;
|
|
}
|
|
- if ((aty_ld_le32(CNFG_STAT0, par) & 7) >= SDRAM)
|
|
+ if ((aty_ld_le32(CONFIG_STAT0, par) & 7) >= SDRAM)
|
|
mem &= ~(0x00700000);
|
|
}
|
|
mem &= ~(0xcf80e000); /* Turn off all undocumented bits. */
|
|
@@ -3582,7 +3572,7 @@
|
|
}
|
|
|
|
/* Fake pci_id for correct_chipset() */
|
|
- switch (aty_ld_le32(CNFG_CHIP_ID, par) & CFG_CHIP_TYPE) {
|
|
+ switch (aty_ld_le32(CONFIG_CHIP_ID, par) & CFG_CHIP_TYPE) {
|
|
case 0x00d7:
|
|
par->pci_id = PCI_CHIP_MACH64GX;
|
|
break;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/aty/mach64_ct.c linux-2.6.29-rc3.owrt/drivers/video/aty/mach64_ct.c
|
|
--- linux-2.6.29.owrt/drivers/video/aty/mach64_ct.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/aty/mach64_ct.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -8,9 +8,6 @@
|
|
#include <asm/io.h>
|
|
#include <video/mach64.h>
|
|
#include "atyfb.h"
|
|
-#ifdef CONFIG_PPC
|
|
-#include <asm/machdep.h>
|
|
-#endif
|
|
|
|
#undef DEBUG
|
|
|
|
@@ -539,14 +536,6 @@
|
|
pll->ct.xclk_post_div_real = postdividers[xpost_div];
|
|
pll->ct.mclk_fb_div = q * pll->ct.xclk_post_div_real / 8;
|
|
|
|
-#ifdef CONFIG_PPC
|
|
- if (machine_is(powermac)) {
|
|
- /* Override PLL_EXT_CNTL & 0x07. */
|
|
- pll->ct.xclk_post_div = xpost_div;
|
|
- pll->ct.xclk_ref_div = 1;
|
|
- }
|
|
-#endif
|
|
-
|
|
#ifdef DEBUG
|
|
pllmclk = (1000000 * pll->ct.mclk_fb_mult * pll->ct.mclk_fb_div) /
|
|
(par->ref_clk_per * pll->ct.pll_ref_div);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/aty/radeon_base.c linux-2.6.29-rc3.owrt/drivers/video/aty/radeon_base.c
|
|
--- linux-2.6.29.owrt/drivers/video/aty/radeon_base.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/aty/radeon_base.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1936,8 +1936,8 @@
|
|
OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl | CRTC_DISP_REQ_EN_B);
|
|
mdelay(100);
|
|
|
|
- aper_base = INREG(CNFG_APER_0_BASE);
|
|
- aper_size = INREG(CNFG_APER_SIZE);
|
|
+ aper_base = INREG(CONFIG_APER_0_BASE);
|
|
+ aper_size = INREG(CONFIG_APER_SIZE);
|
|
|
|
#ifdef SET_MC_FB_FROM_APERTURE
|
|
/* Set framebuffer to be at the same address as set in PCI BAR */
|
|
@@ -2024,11 +2024,11 @@
|
|
~CRTC_H_CUTOFF_ACTIVE_EN);
|
|
}
|
|
} else {
|
|
- tmp = INREG(CNFG_MEMSIZE);
|
|
+ tmp = INREG(CONFIG_MEMSIZE);
|
|
}
|
|
|
|
/* mem size is bits [28:0], mask off the rest */
|
|
- rinfo->video_ram = tmp & CNFG_MEMSIZE_MASK;
|
|
+ rinfo->video_ram = tmp & CONFIG_MEMSIZE_MASK;
|
|
|
|
/*
|
|
* Hack to get around some busted production M6's
|
|
@@ -2228,7 +2228,7 @@
|
|
*/
|
|
rinfo->errata = 0;
|
|
if (rinfo->family == CHIP_FAMILY_R300 &&
|
|
- (INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK)
|
|
+ (INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK)
|
|
== CFG_ATI_REV_A11)
|
|
rinfo->errata |= CHIP_ERRATA_R300_CG;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/aty/radeonfb.h linux-2.6.29-rc3.owrt/drivers/video/aty/radeonfb.h
|
|
--- linux-2.6.29.owrt/drivers/video/aty/radeonfb.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/aty/radeonfb.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -361,6 +361,8 @@
|
|
#ifdef CONFIG_FB_RADEON_I2C
|
|
struct radeon_i2c_chan i2c[4];
|
|
#endif
|
|
+
|
|
+ u32 cfg_save[64];
|
|
};
|
|
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/aty/radeon_pm.c linux-2.6.29-rc3.owrt/drivers/video/aty/radeon_pm.c
|
|
--- linux-2.6.29.owrt/drivers/video/aty/radeon_pm.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/aty/radeon_pm.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -333,7 +333,7 @@
|
|
if (!rinfo->has_CRTC2) {
|
|
tmp = INPLL(pllSCLK_CNTL);
|
|
|
|
- if ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) > CFG_ATI_REV_A13)
|
|
+ if ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) > CFG_ATI_REV_A13)
|
|
tmp &= ~(SCLK_CNTL__FORCE_CP | SCLK_CNTL__FORCE_RB);
|
|
tmp &= ~(SCLK_CNTL__FORCE_HDP | SCLK_CNTL__FORCE_DISP1 |
|
|
SCLK_CNTL__FORCE_TOP | SCLK_CNTL__FORCE_SE |
|
|
@@ -468,9 +468,9 @@
|
|
|
|
/*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/
|
|
if ((rinfo->family == CHIP_FAMILY_RV250 &&
|
|
- ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) ||
|
|
+ ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) ||
|
|
((rinfo->family == CHIP_FAMILY_RV100) &&
|
|
- ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) <= CFG_ATI_REV_A13))) {
|
|
+ ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) <= CFG_ATI_REV_A13))) {
|
|
tmp |= SCLK_CNTL__FORCE_CP;
|
|
tmp |= SCLK_CNTL__FORCE_VIP;
|
|
}
|
|
@@ -486,7 +486,7 @@
|
|
/* RV200::A11 A12 RV250::A11 A12 */
|
|
if (((rinfo->family == CHIP_FAMILY_RV200) ||
|
|
(rinfo->family == CHIP_FAMILY_RV250)) &&
|
|
- ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13))
|
|
+ ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13))
|
|
tmp |= SCLK_MORE_CNTL__FORCEON;
|
|
|
|
OUTPLL(pllSCLK_MORE_CNTL, tmp);
|
|
@@ -497,7 +497,7 @@
|
|
/* RV200::A11 A12, RV250::A11 A12 */
|
|
if (((rinfo->family == CHIP_FAMILY_RV200) ||
|
|
(rinfo->family == CHIP_FAMILY_RV250)) &&
|
|
- ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) {
|
|
+ ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) {
|
|
tmp = INPLL(pllPLL_PWRMGT_CNTL);
|
|
tmp |= PLL_PWRMGT_CNTL__TCL_BYPASS_DISABLE;
|
|
OUTPLL(pllPLL_PWRMGT_CNTL, tmp);
|
|
@@ -702,7 +702,7 @@
|
|
OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
|
|
OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
|
|
OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
|
|
- OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
|
|
+ OUTREG(CONFIG_MEMSIZE, rinfo->video_ram);
|
|
|
|
OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
|
|
OUTREG(DISP_PWR_MAN, rinfo->save_regs[10]);
|
|
@@ -1723,7 +1723,7 @@
|
|
OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
|
|
OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
|
|
OUTREG(OV0_BASE_ADDR, rinfo->save_regs[80]);
|
|
- OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
|
|
+ OUTREG(CONFIG_MEMSIZE, rinfo->video_ram);
|
|
OUTREG(BUS_CNTL, rinfo->save_regs[36]);
|
|
OUTREG(BUS_CNTL1, rinfo->save_regs[14]);
|
|
OUTREG(MPP_TB_CONFIG, rinfo->save_regs[37]);
|
|
@@ -1961,7 +1961,7 @@
|
|
OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, rinfo->save_regs[68] /*0x141555ff*/);
|
|
OUTMC(rinfo, ixMC_IMP_CNTL_0, rinfo->save_regs[71] /*0x00009249*/);
|
|
OUTREG(MC_IND_INDEX, 0);
|
|
- OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
|
|
+ OUTREG(CONFIG_MEMSIZE, rinfo->video_ram);
|
|
|
|
mdelay(20);
|
|
}
|
|
@@ -2361,7 +2361,7 @@
|
|
OUTMC(rinfo, ixMC_IMP_CNTL_0, 0x00009249);
|
|
OUTREG(MC_IND_INDEX, 0);
|
|
|
|
- OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
|
|
+ OUTREG(CONFIG_MEMSIZE, rinfo->video_ram);
|
|
|
|
radeon_pm_full_reset_sdram(rinfo);
|
|
|
|
@@ -2507,28 +2507,11 @@
|
|
|
|
#endif /* CONFIG_PPC_OF */
|
|
|
|
-static void radeonfb_whack_power_state(struct radeonfb_info *rinfo, pci_power_t state)
|
|
-{
|
|
- u16 pwr_cmd;
|
|
-
|
|
- for (;;) {
|
|
- pci_read_config_word(rinfo->pdev,
|
|
- rinfo->pm_reg+PCI_PM_CTRL,
|
|
- &pwr_cmd);
|
|
- if (pwr_cmd & 2)
|
|
- break;
|
|
- pwr_cmd = (pwr_cmd & ~PCI_PM_CTRL_STATE_MASK) | 2;
|
|
- pci_write_config_word(rinfo->pdev,
|
|
- rinfo->pm_reg+PCI_PM_CTRL,
|
|
- pwr_cmd);
|
|
- msleep(500);
|
|
- }
|
|
- rinfo->pdev->current_state = state;
|
|
-}
|
|
-
|
|
static void radeon_set_suspend(struct radeonfb_info *rinfo, int suspend)
|
|
{
|
|
+ u16 pwr_cmd;
|
|
u32 tmp;
|
|
+ int i;
|
|
|
|
if (!rinfo->pm_reg)
|
|
return;
|
|
@@ -2574,19 +2557,32 @@
|
|
}
|
|
}
|
|
|
|
+ for (i = 0; i < 64; ++i)
|
|
+ pci_read_config_dword(rinfo->pdev, i * 4,
|
|
+ &rinfo->cfg_save[i]);
|
|
+
|
|
/* Switch PCI power management to D2. */
|
|
pci_disable_device(rinfo->pdev);
|
|
- pci_save_state(rinfo->pdev);
|
|
- /* The chip seems to need us to whack the PM register
|
|
- * repeatedly until it sticks. We do that -prior- to
|
|
- * calling pci_set_power_state()
|
|
- */
|
|
- radeonfb_whack_power_state(rinfo, PCI_D2);
|
|
- pci_set_power_state(rinfo->pdev, PCI_D2);
|
|
+ for (;;) {
|
|
+ pci_read_config_word(
|
|
+ rinfo->pdev, rinfo->pm_reg+PCI_PM_CTRL,
|
|
+ &pwr_cmd);
|
|
+ if (pwr_cmd & 2)
|
|
+ break;
|
|
+ pci_write_config_word(
|
|
+ rinfo->pdev, rinfo->pm_reg+PCI_PM_CTRL,
|
|
+ (pwr_cmd & ~PCI_PM_CTRL_STATE_MASK) | 2);
|
|
+ mdelay(500);
|
|
+ }
|
|
} else {
|
|
printk(KERN_DEBUG "radeonfb (%s): switching to D0 state...\n",
|
|
pci_name(rinfo->pdev));
|
|
|
|
+ /* Switch back PCI powermanagment to D0 */
|
|
+ mdelay(200);
|
|
+ pci_write_config_word(rinfo->pdev, rinfo->pm_reg+PCI_PM_CTRL, 0);
|
|
+ mdelay(500);
|
|
+
|
|
if (rinfo->family <= CHIP_FAMILY_RV250) {
|
|
/* Reset the SDRAM controller */
|
|
radeon_pm_full_reset_sdram(rinfo);
|
|
@@ -2602,10 +2598,37 @@
|
|
}
|
|
}
|
|
|
|
+static int radeon_restore_pci_cfg(struct radeonfb_info *rinfo)
|
|
+{
|
|
+ int i;
|
|
+ static u32 radeon_cfg_after_resume[64];
|
|
+
|
|
+ for (i = 0; i < 64; ++i)
|
|
+ pci_read_config_dword(rinfo->pdev, i * 4,
|
|
+ &radeon_cfg_after_resume[i]);
|
|
+
|
|
+ if (radeon_cfg_after_resume[PCI_BASE_ADDRESS_0/4]
|
|
+ == rinfo->cfg_save[PCI_BASE_ADDRESS_0/4])
|
|
+ return 0; /* assume everything is ok */
|
|
+
|
|
+ for (i = PCI_BASE_ADDRESS_0/4; i < 64; ++i) {
|
|
+ if (radeon_cfg_after_resume[i] != rinfo->cfg_save[i])
|
|
+ pci_write_config_dword(rinfo->pdev, i * 4,
|
|
+ rinfo->cfg_save[i]);
|
|
+ }
|
|
+ pci_write_config_word(rinfo->pdev, PCI_CACHE_LINE_SIZE,
|
|
+ rinfo->cfg_save[PCI_CACHE_LINE_SIZE/4]);
|
|
+ pci_write_config_word(rinfo->pdev, PCI_COMMAND,
|
|
+ rinfo->cfg_save[PCI_COMMAND/4]);
|
|
+ return 1;
|
|
+}
|
|
+
|
|
+
|
|
int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t mesg)
|
|
{
|
|
struct fb_info *info = pci_get_drvdata(pdev);
|
|
struct radeonfb_info *rinfo = info->par;
|
|
+ int i;
|
|
|
|
if (mesg.event == pdev->dev.power.power_state.event)
|
|
return 0;
|
|
@@ -2651,11 +2674,6 @@
|
|
pmac_suspend_agp_for_card(pdev);
|
|
#endif /* CONFIG_PPC_PMAC */
|
|
|
|
- /* It's unclear whether or when the generic code will do that, so let's
|
|
- * do it ourselves. We save state before we do any power management
|
|
- */
|
|
- pci_save_state(pdev);
|
|
-
|
|
/* If we support wakeup from poweroff, we save all regs we can including cfg
|
|
* space
|
|
*/
|
|
@@ -2680,6 +2698,9 @@
|
|
mdelay(20);
|
|
OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) & ~(LVDS_DIGON));
|
|
}
|
|
+ // FIXME: Use PCI layer
|
|
+ for (i = 0; i < 64; ++i)
|
|
+ pci_read_config_dword(pdev, i * 4, &rinfo->cfg_save[i]);
|
|
pci_disable_device(pdev);
|
|
}
|
|
/* If we support D2, we go to it (should be fixed later with a flag forcing
|
|
@@ -2696,13 +2717,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-static int radeon_check_power_loss(struct radeonfb_info *rinfo)
|
|
-{
|
|
- return rinfo->save_regs[4] != INPLL(CLK_PIN_CNTL) ||
|
|
- rinfo->save_regs[2] != INPLL(MCLK_CNTL) ||
|
|
- rinfo->save_regs[3] != INPLL(SCLK_CNTL);
|
|
-}
|
|
-
|
|
int radeonfb_pci_resume(struct pci_dev *pdev)
|
|
{
|
|
struct fb_info *info = pci_get_drvdata(pdev);
|
|
@@ -2721,13 +2735,20 @@
|
|
printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
|
|
pci_name(pdev), pdev->dev.power.power_state.event);
|
|
|
|
- /* PCI state will have been restored by the core, so
|
|
- * we should be in D0 now with our config space fully
|
|
- * restored
|
|
- */
|
|
+
|
|
+ if (pci_enable_device(pdev)) {
|
|
+ rc = -ENODEV;
|
|
+ printk(KERN_ERR "radeonfb (%s): can't enable PCI device !\n",
|
|
+ pci_name(pdev));
|
|
+ goto bail;
|
|
+ }
|
|
+ pci_set_master(pdev);
|
|
+
|
|
if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
|
|
- /* Wakeup chip */
|
|
- if ((rinfo->pm_mode & radeon_pm_off) && radeon_check_power_loss(rinfo)) {
|
|
+ /* Wakeup chip. Check from config space if we were powered off
|
|
+ * (todo: additionally, check CLK_PIN_CNTL too)
|
|
+ */
|
|
+ if ((rinfo->pm_mode & radeon_pm_off) && radeon_restore_pci_cfg(rinfo)) {
|
|
if (rinfo->reinit_func != NULL)
|
|
rinfo->reinit_func(rinfo);
|
|
else {
|
|
@@ -2786,13 +2807,12 @@
|
|
return rc;
|
|
}
|
|
|
|
-#ifdef CONFIG_PPC_OF__disabled
|
|
+#ifdef CONFIG_PPC_OF
|
|
static void radeonfb_early_resume(void *data)
|
|
{
|
|
struct radeonfb_info *rinfo = data;
|
|
|
|
rinfo->no_schedule = 1;
|
|
- pci_restore_state(rinfo->pdev);
|
|
radeonfb_pci_resume(rinfo->pdev);
|
|
rinfo->no_schedule = 0;
|
|
}
|
|
@@ -2859,14 +2879,7 @@
|
|
*/
|
|
if (rinfo->pm_mode != radeon_pm_none) {
|
|
pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, rinfo->of_node, 0, 1);
|
|
-#if 0 /* Disable the early video resume hack for now as it's causing problems, among
|
|
- * others we now rely on the PCI core restoring the config space for us, which
|
|
- * isn't the case with that hack, and that code path causes various things to
|
|
- * be called with interrupts off while they shouldn't. I'm leaving the code in
|
|
- * as it can be useful for debugging purposes
|
|
- */
|
|
pmac_set_early_video_resume(radeonfb_early_resume, rinfo);
|
|
-#endif
|
|
}
|
|
|
|
#if 0
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/backlight/da903x_bl.c linux-2.6.29-rc3.owrt/drivers/video/backlight/da903x_bl.c
|
|
--- linux-2.6.29.owrt/drivers/video/backlight/da903x_bl.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/backlight/da903x_bl.c 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,203 +0,0 @@
|
|
-/*
|
|
- * Backlight driver for Dialog Semiconductor DA9030/DA9034
|
|
- *
|
|
- * Copyright (C) 2008 Compulab, Ltd.
|
|
- * Mike Rapoport <mike@compulab.co.il>
|
|
- *
|
|
- * Copyright (C) 2006-2008 Marvell International Ltd.
|
|
- * Eric Miao <eric.miao@marvell.com>
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License version 2 as
|
|
- * published by the Free Software Foundation.
|
|
- */
|
|
-
|
|
-#include <linux/kernel.h>
|
|
-#include <linux/init.h>
|
|
-#include <linux/platform_device.h>
|
|
-#include <linux/fb.h>
|
|
-#include <linux/backlight.h>
|
|
-#include <linux/mfd/da903x.h>
|
|
-
|
|
-#define DA9030_WLED_CONTROL 0x25
|
|
-#define DA9030_WLED_CP_EN (1 << 6)
|
|
-#define DA9030_WLED_TRIM(x) ((x) & 0x7)
|
|
-
|
|
-#define DA9034_WLED_CONTROL1 0x3C
|
|
-#define DA9034_WLED_CONTROL2 0x3D
|
|
-
|
|
-#define DA9034_WLED_BOOST_EN (1 << 5)
|
|
-
|
|
-#define DA9030_MAX_BRIGHTNESS 7
|
|
-#define DA9034_MAX_BRIGHTNESS 0x7f
|
|
-
|
|
-struct da903x_backlight_data {
|
|
- struct device *da903x_dev;
|
|
- int id;
|
|
- int current_brightness;
|
|
-};
|
|
-
|
|
-static int da903x_backlight_set(struct backlight_device *bl, int brightness)
|
|
-{
|
|
- struct da903x_backlight_data *data = bl_get_data(bl);
|
|
- struct device *dev = data->da903x_dev;
|
|
- uint8_t val;
|
|
- int ret = 0;
|
|
-
|
|
- switch (data->id) {
|
|
- case DA9034_ID_WLED:
|
|
- ret = da903x_update(dev, DA9034_WLED_CONTROL1,
|
|
- brightness, 0x7f);
|
|
- if (ret)
|
|
- return ret;
|
|
-
|
|
- if (data->current_brightness && brightness == 0)
|
|
- ret = da903x_clr_bits(dev,
|
|
- DA9034_WLED_CONTROL2,
|
|
- DA9034_WLED_BOOST_EN);
|
|
-
|
|
- if (data->current_brightness == 0 && brightness)
|
|
- ret = da903x_set_bits(dev,
|
|
- DA9034_WLED_CONTROL2,
|
|
- DA9034_WLED_BOOST_EN);
|
|
- break;
|
|
- case DA9030_ID_WLED:
|
|
- val = DA9030_WLED_TRIM(brightness);
|
|
- val |= brightness ? DA9030_WLED_CP_EN : 0;
|
|
- ret = da903x_write(dev, DA9030_WLED_CONTROL, val);
|
|
- break;
|
|
- }
|
|
-
|
|
- if (ret)
|
|
- return ret;
|
|
-
|
|
- data->current_brightness = brightness;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int da903x_backlight_update_status(struct backlight_device *bl)
|
|
-{
|
|
- int brightness = bl->props.brightness;
|
|
-
|
|
- if (bl->props.power != FB_BLANK_UNBLANK)
|
|
- brightness = 0;
|
|
-
|
|
- if (bl->props.fb_blank != FB_BLANK_UNBLANK)
|
|
- brightness = 0;
|
|
-
|
|
- return da903x_backlight_set(bl, brightness);
|
|
-}
|
|
-
|
|
-static int da903x_backlight_get_brightness(struct backlight_device *bl)
|
|
-{
|
|
- struct da903x_backlight_data *data = bl_get_data(bl);
|
|
- return data->current_brightness;
|
|
-}
|
|
-
|
|
-static struct backlight_ops da903x_backlight_ops = {
|
|
- .update_status = da903x_backlight_update_status,
|
|
- .get_brightness = da903x_backlight_get_brightness,
|
|
-};
|
|
-
|
|
-static int da903x_backlight_probe(struct platform_device *pdev)
|
|
-{
|
|
- struct da903x_backlight_data *data;
|
|
- struct backlight_device *bl;
|
|
- int max_brightness;
|
|
-
|
|
- data = kzalloc(sizeof(*data), GFP_KERNEL);
|
|
- if (data == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
- switch (pdev->id) {
|
|
- case DA9030_ID_WLED:
|
|
- max_brightness = DA9030_MAX_BRIGHTNESS;
|
|
- break;
|
|
- case DA9034_ID_WLED:
|
|
- max_brightness = DA9034_MAX_BRIGHTNESS;
|
|
- break;
|
|
- default:
|
|
- dev_err(&pdev->dev, "invalid backlight device ID(%d)\n",
|
|
- pdev->id);
|
|
- kfree(data);
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- data->id = pdev->id;
|
|
- data->da903x_dev = pdev->dev.parent;
|
|
- data->current_brightness = 0;
|
|
-
|
|
- bl = backlight_device_register(pdev->name, data->da903x_dev,
|
|
- data, &da903x_backlight_ops);
|
|
- if (IS_ERR(bl)) {
|
|
- dev_err(&pdev->dev, "failed to register backlight\n");
|
|
- kfree(data);
|
|
- return PTR_ERR(bl);
|
|
- }
|
|
-
|
|
- bl->props.max_brightness = max_brightness;
|
|
- bl->props.brightness = max_brightness;
|
|
-
|
|
- platform_set_drvdata(pdev, bl);
|
|
- backlight_update_status(bl);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int da903x_backlight_remove(struct platform_device *pdev)
|
|
-{
|
|
- struct backlight_device *bl = platform_get_drvdata(pdev);
|
|
- struct da903x_backlight_data *data = bl_get_data(bl);
|
|
-
|
|
- backlight_device_unregister(bl);
|
|
- kfree(data);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-#ifdef CONFIG_PM
|
|
-static int da903x_backlight_suspend(struct platform_device *pdev,
|
|
- pm_message_t state)
|
|
-{
|
|
- struct backlight_device *bl = platform_get_drvdata(pdev);
|
|
- return da903x_backlight_set(bl, 0);
|
|
-}
|
|
-
|
|
-static int da903x_backlight_resume(struct platform_device *pdev)
|
|
-{
|
|
- struct backlight_device *bl = platform_get_drvdata(pdev);
|
|
-
|
|
- backlight_update_status(bl);
|
|
- return 0;
|
|
-}
|
|
-#else
|
|
-#define da903x_backlight_suspend NULL
|
|
-#define da903x_backlight_resume NULL
|
|
-#endif
|
|
-
|
|
-static struct platform_driver da903x_backlight_driver = {
|
|
- .driver = {
|
|
- .name = "da903x-backlight",
|
|
- .owner = THIS_MODULE,
|
|
- },
|
|
- .probe = da903x_backlight_probe,
|
|
- .remove = da903x_backlight_remove,
|
|
- .suspend = da903x_backlight_suspend,
|
|
- .resume = da903x_backlight_resume,
|
|
-};
|
|
-
|
|
-static int __init da903x_backlight_init(void)
|
|
-{
|
|
- return platform_driver_register(&da903x_backlight_driver);
|
|
-}
|
|
-module_init(da903x_backlight_init);
|
|
-
|
|
-static void __exit da903x_backlight_exit(void)
|
|
-{
|
|
- platform_driver_unregister(&da903x_backlight_driver);
|
|
-}
|
|
-module_exit(da903x_backlight_exit);
|
|
-
|
|
-MODULE_DESCRIPTION("Backlight Driver for Dialog Semiconductor DA9030/DA9034");
|
|
-MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>"
|
|
- "Mike Rapoport <mike@compulab.co.il>");
|
|
-MODULE_LICENSE("GPL");
|
|
-MODULE_ALIAS("platform:da903x-backlight");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/backlight/da903x.c linux-2.6.29-rc3.owrt/drivers/video/backlight/da903x.c
|
|
--- linux-2.6.29.owrt/drivers/video/backlight/da903x.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/backlight/da903x.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -0,0 +1,203 @@
|
|
+/*
|
|
+ * Backlight driver for Dialog Semiconductor DA9030/DA9034
|
|
+ *
|
|
+ * Copyright (C) 2008 Compulab, Ltd.
|
|
+ * Mike Rapoport <mike@compulab.co.il>
|
|
+ *
|
|
+ * Copyright (C) 2006-2008 Marvell International Ltd.
|
|
+ * Eric Miao <eric.miao@marvell.com>
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License version 2 as
|
|
+ * published by the Free Software Foundation.
|
|
+ */
|
|
+
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/platform_device.h>
|
|
+#include <linux/fb.h>
|
|
+#include <linux/backlight.h>
|
|
+#include <linux/mfd/da903x.h>
|
|
+
|
|
+#define DA9030_WLED_CONTROL 0x25
|
|
+#define DA9030_WLED_CP_EN (1 << 6)
|
|
+#define DA9030_WLED_TRIM(x) ((x) & 0x7)
|
|
+
|
|
+#define DA9034_WLED_CONTROL1 0x3C
|
|
+#define DA9034_WLED_CONTROL2 0x3D
|
|
+
|
|
+#define DA9034_WLED_BOOST_EN (1 << 5)
|
|
+
|
|
+#define DA9030_MAX_BRIGHTNESS 7
|
|
+#define DA9034_MAX_BRIGHTNESS 0x7f
|
|
+
|
|
+struct da903x_backlight_data {
|
|
+ struct device *da903x_dev;
|
|
+ int id;
|
|
+ int current_brightness;
|
|
+};
|
|
+
|
|
+static int da903x_backlight_set(struct backlight_device *bl, int brightness)
|
|
+{
|
|
+ struct da903x_backlight_data *data = bl_get_data(bl);
|
|
+ struct device *dev = data->da903x_dev;
|
|
+ uint8_t val;
|
|
+ int ret = 0;
|
|
+
|
|
+ switch (data->id) {
|
|
+ case DA9034_ID_WLED:
|
|
+ ret = da903x_update(dev, DA9034_WLED_CONTROL1,
|
|
+ brightness, 0x7f);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ if (data->current_brightness && brightness == 0)
|
|
+ ret = da903x_clr_bits(dev,
|
|
+ DA9034_WLED_CONTROL2,
|
|
+ DA9034_WLED_BOOST_EN);
|
|
+
|
|
+ if (data->current_brightness == 0 && brightness)
|
|
+ ret = da903x_set_bits(dev,
|
|
+ DA9034_WLED_CONTROL2,
|
|
+ DA9034_WLED_BOOST_EN);
|
|
+ break;
|
|
+ case DA9030_ID_WLED:
|
|
+ val = DA9030_WLED_TRIM(brightness);
|
|
+ val |= brightness ? DA9030_WLED_CP_EN : 0;
|
|
+ ret = da903x_write(dev, DA9030_WLED_CONTROL, val);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ data->current_brightness = brightness;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int da903x_backlight_update_status(struct backlight_device *bl)
|
|
+{
|
|
+ int brightness = bl->props.brightness;
|
|
+
|
|
+ if (bl->props.power != FB_BLANK_UNBLANK)
|
|
+ brightness = 0;
|
|
+
|
|
+ if (bl->props.fb_blank != FB_BLANK_UNBLANK)
|
|
+ brightness = 0;
|
|
+
|
|
+ return da903x_backlight_set(bl, brightness);
|
|
+}
|
|
+
|
|
+static int da903x_backlight_get_brightness(struct backlight_device *bl)
|
|
+{
|
|
+ struct da903x_backlight_data *data = bl_get_data(bl);
|
|
+ return data->current_brightness;
|
|
+}
|
|
+
|
|
+static struct backlight_ops da903x_backlight_ops = {
|
|
+ .update_status = da903x_backlight_update_status,
|
|
+ .get_brightness = da903x_backlight_get_brightness,
|
|
+};
|
|
+
|
|
+static int da903x_backlight_probe(struct platform_device *pdev)
|
|
+{
|
|
+ struct da903x_backlight_data *data;
|
|
+ struct backlight_device *bl;
|
|
+ int max_brightness;
|
|
+
|
|
+ data = kzalloc(sizeof(*data), GFP_KERNEL);
|
|
+ if (data == NULL)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ switch (pdev->id) {
|
|
+ case DA9030_ID_WLED:
|
|
+ max_brightness = DA9030_MAX_BRIGHTNESS;
|
|
+ break;
|
|
+ case DA9034_ID_WLED:
|
|
+ max_brightness = DA9034_MAX_BRIGHTNESS;
|
|
+ break;
|
|
+ default:
|
|
+ dev_err(&pdev->dev, "invalid backlight device ID(%d)\n",
|
|
+ pdev->id);
|
|
+ kfree(data);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ data->id = pdev->id;
|
|
+ data->da903x_dev = pdev->dev.parent;
|
|
+ data->current_brightness = 0;
|
|
+
|
|
+ bl = backlight_device_register(pdev->name, data->da903x_dev,
|
|
+ data, &da903x_backlight_ops);
|
|
+ if (IS_ERR(bl)) {
|
|
+ dev_err(&pdev->dev, "failed to register backlight\n");
|
|
+ kfree(data);
|
|
+ return PTR_ERR(bl);
|
|
+ }
|
|
+
|
|
+ bl->props.max_brightness = max_brightness;
|
|
+ bl->props.brightness = max_brightness;
|
|
+
|
|
+ platform_set_drvdata(pdev, bl);
|
|
+ backlight_update_status(bl);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int da903x_backlight_remove(struct platform_device *pdev)
|
|
+{
|
|
+ struct backlight_device *bl = platform_get_drvdata(pdev);
|
|
+ struct da903x_backlight_data *data = bl_get_data(bl);
|
|
+
|
|
+ backlight_device_unregister(bl);
|
|
+ kfree(data);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+#ifdef CONFIG_PM
|
|
+static int da903x_backlight_suspend(struct platform_device *pdev,
|
|
+ pm_message_t state)
|
|
+{
|
|
+ struct backlight_device *bl = platform_get_drvdata(pdev);
|
|
+ return da903x_backlight_set(bl, 0);
|
|
+}
|
|
+
|
|
+static int da903x_backlight_resume(struct platform_device *pdev)
|
|
+{
|
|
+ struct backlight_device *bl = platform_get_drvdata(pdev);
|
|
+
|
|
+ backlight_update_status(bl);
|
|
+ return 0;
|
|
+}
|
|
+#else
|
|
+#define da903x_backlight_suspend NULL
|
|
+#define da903x_backlight_resume NULL
|
|
+#endif
|
|
+
|
|
+static struct platform_driver da903x_backlight_driver = {
|
|
+ .driver = {
|
|
+ .name = "da903x-backlight",
|
|
+ .owner = THIS_MODULE,
|
|
+ },
|
|
+ .probe = da903x_backlight_probe,
|
|
+ .remove = da903x_backlight_remove,
|
|
+ .suspend = da903x_backlight_suspend,
|
|
+ .resume = da903x_backlight_resume,
|
|
+};
|
|
+
|
|
+static int __init da903x_backlight_init(void)
|
|
+{
|
|
+ return platform_driver_register(&da903x_backlight_driver);
|
|
+}
|
|
+module_init(da903x_backlight_init);
|
|
+
|
|
+static void __exit da903x_backlight_exit(void)
|
|
+{
|
|
+ platform_driver_unregister(&da903x_backlight_driver);
|
|
+}
|
|
+module_exit(da903x_backlight_exit);
|
|
+
|
|
+MODULE_DESCRIPTION("Backlight Driver for Dialog Semiconductor DA9030/DA9034");
|
|
+MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>"
|
|
+ "Mike Rapoport <mike@compulab.co.il>");
|
|
+MODULE_LICENSE("GPL");
|
|
+MODULE_ALIAS("platform:da903x-backlight");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/backlight/Makefile linux-2.6.29-rc3.owrt/drivers/video/backlight/Makefile
|
|
--- linux-2.6.29.owrt/drivers/video/backlight/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/backlight/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -18,7 +18,7 @@
|
|
obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o
|
|
obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o
|
|
obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o
|
|
-obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
|
|
+obj-$(CONFIG_BACKLIGHT_DA903X) += da903x.o
|
|
obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o
|
|
obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o
|
|
obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/bfin-t350mcqb-fb.c linux-2.6.29-rc3.owrt/drivers/video/bfin-t350mcqb-fb.c
|
|
--- linux-2.6.29.owrt/drivers/video/bfin-t350mcqb-fb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/bfin-t350mcqb-fb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -447,7 +447,7 @@
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
-static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev)
|
|
+static int __init bfin_t350mcqb_probe(struct platform_device *pdev)
|
|
{
|
|
struct bfin_t350mcqbfb_info *info;
|
|
struct fb_info *fbinfo;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/fbcmap.c linux-2.6.29-rc3.owrt/drivers/video/fbcmap.c
|
|
--- linux-2.6.29.owrt/drivers/video/fbcmap.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/fbcmap.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -250,6 +250,10 @@
|
|
int rc, size = cmap->len * sizeof(u16);
|
|
struct fb_cmap umap;
|
|
|
|
+ if (cmap->start < 0 || (!info->fbops->fb_setcolreg &&
|
|
+ !info->fbops->fb_setcmap))
|
|
+ return -EINVAL;
|
|
+
|
|
memset(&umap, 0, sizeof(struct fb_cmap));
|
|
rc = fb_alloc_cmap(&umap, cmap->len, cmap->transp != NULL);
|
|
if (rc)
|
|
@@ -258,23 +262,11 @@
|
|
copy_from_user(umap.green, cmap->green, size) ||
|
|
copy_from_user(umap.blue, cmap->blue, size) ||
|
|
(cmap->transp && copy_from_user(umap.transp, cmap->transp, size))) {
|
|
- rc = -EFAULT;
|
|
- goto out;
|
|
+ fb_dealloc_cmap(&umap);
|
|
+ return -EFAULT;
|
|
}
|
|
umap.start = cmap->start;
|
|
- if (!lock_fb_info(info)) {
|
|
- rc = -ENODEV;
|
|
- goto out;
|
|
- }
|
|
- if (cmap->start < 0 || (!info->fbops->fb_setcolreg &&
|
|
- !info->fbops->fb_setcmap)) {
|
|
- rc = -EINVAL;
|
|
- goto out1;
|
|
- }
|
|
rc = fb_set_cmap(&umap, info);
|
|
-out1:
|
|
- unlock_fb_info(info);
|
|
-out:
|
|
fb_dealloc_cmap(&umap);
|
|
return rc;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/fbmem.c linux-2.6.29-rc3.owrt/drivers/video/fbmem.c
|
|
--- linux-2.6.29.owrt/drivers/video/fbmem.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/fbmem.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1013,139 +1013,132 @@
|
|
struct fb_var_screeninfo var;
|
|
struct fb_fix_screeninfo fix;
|
|
struct fb_con2fbmap con2fb;
|
|
- struct fb_cmap cmap_from;
|
|
struct fb_cmap_user cmap;
|
|
struct fb_event event;
|
|
void __user *argp = (void __user *)arg;
|
|
long ret = 0;
|
|
|
|
+ fb = info->fbops;
|
|
+ if (!fb)
|
|
+ return -ENODEV;
|
|
+
|
|
switch (cmd) {
|
|
case FBIOGET_VSCREENINFO:
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
- var = info->var;
|
|
- unlock_fb_info(info);
|
|
-
|
|
- ret = copy_to_user(argp, &var, sizeof(var)) ? -EFAULT : 0;
|
|
+ ret = copy_to_user(argp, &info->var,
|
|
+ sizeof(var)) ? -EFAULT : 0;
|
|
break;
|
|
case FBIOPUT_VSCREENINFO:
|
|
- if (copy_from_user(&var, argp, sizeof(var)))
|
|
- return -EFAULT;
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
+ if (copy_from_user(&var, argp, sizeof(var))) {
|
|
+ ret = -EFAULT;
|
|
+ break;
|
|
+ }
|
|
acquire_console_sem();
|
|
info->flags |= FBINFO_MISC_USEREVENT;
|
|
ret = fb_set_var(info, &var);
|
|
info->flags &= ~FBINFO_MISC_USEREVENT;
|
|
release_console_sem();
|
|
- unlock_fb_info(info);
|
|
- if (!ret && copy_to_user(argp, &var, sizeof(var)))
|
|
+ if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
|
|
ret = -EFAULT;
|
|
break;
|
|
case FBIOGET_FSCREENINFO:
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
- fix = info->fix;
|
|
- unlock_fb_info(info);
|
|
-
|
|
- ret = copy_to_user(argp, &fix, sizeof(fix)) ? -EFAULT : 0;
|
|
+ ret = copy_to_user(argp, &info->fix,
|
|
+ sizeof(fix)) ? -EFAULT : 0;
|
|
break;
|
|
case FBIOPUTCMAP:
|
|
if (copy_from_user(&cmap, argp, sizeof(cmap)))
|
|
- return -EFAULT;
|
|
- ret = fb_set_user_cmap(&cmap, info);
|
|
+ ret = -EFAULT;
|
|
+ else
|
|
+ ret = fb_set_user_cmap(&cmap, info);
|
|
break;
|
|
case FBIOGETCMAP:
|
|
if (copy_from_user(&cmap, argp, sizeof(cmap)))
|
|
- return -EFAULT;
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
- cmap_from = info->cmap;
|
|
- unlock_fb_info(info);
|
|
- ret = fb_cmap_to_user(&cmap_from, &cmap);
|
|
+ ret = -EFAULT;
|
|
+ else
|
|
+ ret = fb_cmap_to_user(&info->cmap, &cmap);
|
|
break;
|
|
case FBIOPAN_DISPLAY:
|
|
- if (copy_from_user(&var, argp, sizeof(var)))
|
|
- return -EFAULT;
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
+ if (copy_from_user(&var, argp, sizeof(var))) {
|
|
+ ret = -EFAULT;
|
|
+ break;
|
|
+ }
|
|
acquire_console_sem();
|
|
ret = fb_pan_display(info, &var);
|
|
release_console_sem();
|
|
- unlock_fb_info(info);
|
|
if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
|
|
- return -EFAULT;
|
|
+ ret = -EFAULT;
|
|
break;
|
|
case FBIO_CURSOR:
|
|
ret = -EINVAL;
|
|
break;
|
|
case FBIOGET_CON2FBMAP:
|
|
if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
|
|
- return -EFAULT;
|
|
- if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
|
|
- return -EINVAL;
|
|
- con2fb.framebuffer = -1;
|
|
- event.data = &con2fb;
|
|
-
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
- event.info = info;
|
|
- fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event);
|
|
- unlock_fb_info(info);
|
|
-
|
|
- ret = copy_to_user(argp, &con2fb, sizeof(con2fb)) ? -EFAULT : 0;
|
|
+ ret = -EFAULT;
|
|
+ else if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
|
|
+ ret = -EINVAL;
|
|
+ else {
|
|
+ con2fb.framebuffer = -1;
|
|
+ event.info = info;
|
|
+ event.data = &con2fb;
|
|
+ fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP,
|
|
+ &event);
|
|
+ ret = copy_to_user(argp, &con2fb,
|
|
+ sizeof(con2fb)) ? -EFAULT : 0;
|
|
+ }
|
|
break;
|
|
case FBIOPUT_CON2FBMAP:
|
|
- if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
|
|
- return -EFAULT;
|
|
- if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
|
|
- return -EINVAL;
|
|
- if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX)
|
|
- return -EINVAL;
|
|
+ if (copy_from_user(&con2fb, argp, sizeof(con2fb))) {
|
|
+ ret = -EFAULT;
|
|
+ break;
|
|
+ }
|
|
+ if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
+ if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
if (!registered_fb[con2fb.framebuffer])
|
|
request_module("fb%d", con2fb.framebuffer);
|
|
if (!registered_fb[con2fb.framebuffer]) {
|
|
ret = -EINVAL;
|
|
break;
|
|
}
|
|
- event.data = &con2fb;
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
event.info = info;
|
|
+ event.data = &con2fb;
|
|
ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP,
|
|
&event);
|
|
- unlock_fb_info(info);
|
|
break;
|
|
case FBIOBLANK:
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
acquire_console_sem();
|
|
info->flags |= FBINFO_MISC_USEREVENT;
|
|
ret = fb_blank(info, arg);
|
|
info->flags &= ~FBINFO_MISC_USEREVENT;
|
|
release_console_sem();
|
|
- unlock_fb_info(info);
|
|
- break;
|
|
+ break;;
|
|
default:
|
|
- if (!lock_fb_info(info))
|
|
- return -ENODEV;
|
|
- fb = info->fbops;
|
|
- if (fb->fb_ioctl)
|
|
- ret = fb->fb_ioctl(info, cmd, arg);
|
|
- else
|
|
+ if (fb->fb_ioctl == NULL)
|
|
ret = -ENOTTY;
|
|
- unlock_fb_info(info);
|
|
+ else
|
|
+ ret = fb->fb_ioctl(info, cmd, arg);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static long fb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|
+__acquires(&info->lock)
|
|
+__releases(&info->lock)
|
|
{
|
|
struct inode *inode = file->f_path.dentry->d_inode;
|
|
int fbidx = iminor(inode);
|
|
- struct fb_info *info = registered_fb[fbidx];
|
|
+ struct fb_info *info;
|
|
+ long ret;
|
|
|
|
- return do_fb_ioctl(info, cmd, arg);
|
|
+ info = registered_fb[fbidx];
|
|
+ mutex_lock(&info->lock);
|
|
+ ret = do_fb_ioctl(info, cmd, arg);
|
|
+ mutex_unlock(&info->lock);
|
|
+ return ret;
|
|
}
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
@@ -1264,6 +1257,8 @@
|
|
|
|
static long fb_compat_ioctl(struct file *file, unsigned int cmd,
|
|
unsigned long arg)
|
|
+__acquires(&info->lock)
|
|
+__releases(&info->lock)
|
|
{
|
|
struct inode *inode = file->f_path.dentry->d_inode;
|
|
int fbidx = iminor(inode);
|
|
@@ -1271,6 +1266,7 @@
|
|
struct fb_ops *fb = info->fbops;
|
|
long ret = -ENOIOCTLCMD;
|
|
|
|
+ mutex_lock(&info->lock);
|
|
switch(cmd) {
|
|
case FBIOGET_VSCREENINFO:
|
|
case FBIOPUT_VSCREENINFO:
|
|
@@ -1296,6 +1292,7 @@
|
|
ret = fb->fb_compat_ioctl(info, cmd, arg);
|
|
break;
|
|
}
|
|
+ mutex_unlock(&info->lock);
|
|
return ret;
|
|
}
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/geode/gx1fb_core.c linux-2.6.29-rc3.owrt/drivers/video/geode/gx1fb_core.c
|
|
--- linux-2.6.29.owrt/drivers/video/geode/gx1fb_core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/geode/gx1fb_core.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -136,10 +136,13 @@
|
|
{
|
|
struct geodefb_par *par = info->par;
|
|
|
|
- if (info->var.bits_per_pixel == 16)
|
|
+ if (info->var.bits_per_pixel == 16) {
|
|
info->fix.visual = FB_VISUAL_TRUECOLOR;
|
|
- else
|
|
+ fb_dealloc_cmap(&info->cmap);
|
|
+ } else {
|
|
info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
|
|
+ fb_alloc_cmap(&info->cmap, 1<<info->var.bits_per_pixel, 0);
|
|
+ }
|
|
|
|
info->fix.line_length = gx1_line_delta(info->var.xres, info->var.bits_per_pixel);
|
|
|
|
@@ -312,10 +315,6 @@
|
|
if (!par->panel_x)
|
|
par->enable_crt = 1; /* fall back to CRT if no panel is specified */
|
|
|
|
- if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
|
|
- framebuffer_release(info);
|
|
- return NULL;
|
|
- }
|
|
return info;
|
|
}
|
|
|
|
@@ -375,11 +374,8 @@
|
|
release_mem_region(gx1_gx_base() + 0x8300, 0x100);
|
|
}
|
|
|
|
- if (info) {
|
|
- fb_dealloc_cmap(&info->cmap);
|
|
+ if (info)
|
|
framebuffer_release(info);
|
|
- }
|
|
-
|
|
return ret;
|
|
}
|
|
|
|
@@ -399,7 +395,6 @@
|
|
iounmap(par->dc_regs);
|
|
release_mem_region(gx1_gx_base() + 0x8300, 0x100);
|
|
|
|
- fb_dealloc_cmap(&info->cmap);
|
|
pci_set_drvdata(pdev, NULL);
|
|
|
|
framebuffer_release(info);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/geode/gxfb_core.c linux-2.6.29-rc3.owrt/drivers/video/geode/gxfb_core.c
|
|
--- linux-2.6.29.owrt/drivers/video/geode/gxfb_core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/geode/gxfb_core.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -171,10 +171,13 @@
|
|
|
|
static int gxfb_set_par(struct fb_info *info)
|
|
{
|
|
- if (info->var.bits_per_pixel > 8)
|
|
+ if (info->var.bits_per_pixel > 8) {
|
|
info->fix.visual = FB_VISUAL_TRUECOLOR;
|
|
- else
|
|
+ fb_dealloc_cmap(&info->cmap);
|
|
+ } else {
|
|
info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
|
|
+ fb_alloc_cmap(&info->cmap, 1<<info->var.bits_per_pixel, 0);
|
|
+ }
|
|
|
|
info->fix.line_length = gx_line_delta(info->var.xres, info->var.bits_per_pixel);
|
|
|
|
@@ -328,11 +331,6 @@
|
|
|
|
info->var.grayscale = 0;
|
|
|
|
- if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
|
|
- framebuffer_release(info);
|
|
- return NULL;
|
|
- }
|
|
-
|
|
return info;
|
|
}
|
|
|
|
@@ -445,10 +443,8 @@
|
|
pci_release_region(pdev, 1);
|
|
}
|
|
|
|
- if (info) {
|
|
- fb_dealloc_cmap(&info->cmap);
|
|
+ if (info)
|
|
framebuffer_release(info);
|
|
- }
|
|
return ret;
|
|
}
|
|
|
|
@@ -471,7 +467,6 @@
|
|
iounmap(par->gp_regs);
|
|
pci_release_region(pdev, 1);
|
|
|
|
- fb_dealloc_cmap(&info->cmap);
|
|
pci_set_drvdata(pdev, NULL);
|
|
|
|
framebuffer_release(info);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/geode/lxfb_core.c linux-2.6.29-rc3.owrt/drivers/video/geode/lxfb_core.c
|
|
--- linux-2.6.29.owrt/drivers/video/geode/lxfb_core.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/geode/lxfb_core.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -278,10 +278,13 @@
|
|
|
|
static int lxfb_set_par(struct fb_info *info)
|
|
{
|
|
- if (info->var.bits_per_pixel > 8)
|
|
+ if (info->var.bits_per_pixel > 8) {
|
|
info->fix.visual = FB_VISUAL_TRUECOLOR;
|
|
- else
|
|
+ fb_dealloc_cmap(&info->cmap);
|
|
+ } else {
|
|
info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
|
|
+ fb_alloc_cmap(&info->cmap, 1<<info->var.bits_per_pixel, 0);
|
|
+ }
|
|
|
|
info->fix.line_length = lx_get_pitch(info->var.xres,
|
|
info->var.bits_per_pixel);
|
|
@@ -448,11 +451,6 @@
|
|
|
|
info->pseudo_palette = (void *)par + sizeof(struct lxfb_par);
|
|
|
|
- if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
|
|
- framebuffer_release(info);
|
|
- return NULL;
|
|
- }
|
|
-
|
|
info->var.grayscale = 0;
|
|
|
|
return info;
|
|
@@ -581,10 +579,8 @@
|
|
pci_release_region(pdev, 3);
|
|
}
|
|
|
|
- if (info) {
|
|
- fb_dealloc_cmap(&info->cmap);
|
|
+ if (info)
|
|
framebuffer_release(info);
|
|
- }
|
|
|
|
return ret;
|
|
}
|
|
@@ -608,7 +604,6 @@
|
|
iounmap(par->vp_regs);
|
|
pci_release_region(pdev, 3);
|
|
|
|
- fb_dealloc_cmap(&info->cmap);
|
|
pci_set_drvdata(pdev, NULL);
|
|
framebuffer_release(info);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/i810/i810_main.c linux-2.6.29-rc3.owrt/drivers/video/i810/i810_main.c
|
|
--- linux-2.6.29.owrt/drivers/video/i810/i810_main.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/i810/i810_main.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -993,7 +993,6 @@
|
|
struct i810fb_par *par = info->par;
|
|
int line_length, vidmem, mode_valid = 0, retval = 0;
|
|
u32 vyres = var->yres_virtual, vxres = var->xres_virtual;
|
|
-
|
|
/*
|
|
* Memory limit
|
|
*/
|
|
@@ -1003,12 +1002,12 @@
|
|
if (vidmem > par->fb.size) {
|
|
vyres = par->fb.size/line_length;
|
|
if (vyres < var->yres) {
|
|
- vyres = info->var.yres;
|
|
+ vyres = yres;
|
|
vxres = par->fb.size/vyres;
|
|
vxres /= var->bits_per_pixel >> 3;
|
|
line_length = get_line_length(par, vxres,
|
|
var->bits_per_pixel);
|
|
- vidmem = line_length * info->var.yres;
|
|
+ vidmem = line_length * yres;
|
|
if (vxres < var->xres) {
|
|
printk("i810fb: required video memory, "
|
|
"%d bytes, for %dx%d-%d (virtual) "
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/Kconfig linux-2.6.29-rc3.owrt/drivers/video/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/video/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -41,7 +41,7 @@
|
|
You need an utility program called fbset to make full use of frame
|
|
buffer devices. Please read <file:Documentation/fb/framebuffer.txt>
|
|
and the Framebuffer-HOWTO at
|
|
- <http://www.munted.org.uk/programming/Framebuffer-HOWTO-1.2.html> for more
|
|
+ <http://www.tahallah.demon.co.uk/programming/prog.html> for more
|
|
information.
|
|
|
|
Say Y here and to the driver for your graphics board below if you
|
|
@@ -1054,7 +1054,9 @@
|
|
|
|
config FB_I810
|
|
tristate "Intel 810/815 support (EXPERIMENTAL)"
|
|
- depends on EXPERIMENTAL && FB && PCI && X86_32 && AGP_INTEL
|
|
+ depends on FB && EXPERIMENTAL && PCI && X86_32
|
|
+ select AGP
|
|
+ select AGP_INTEL
|
|
select FB_MODE_HELPERS
|
|
select FB_CFB_FILLRECT
|
|
select FB_CFB_COPYAREA
|
|
@@ -1117,7 +1119,9 @@
|
|
|
|
config FB_INTEL
|
|
tristate "Intel 830M/845G/852GM/855GM/865G/915G/945G/945GM/965G/965GM support (EXPERIMENTAL)"
|
|
- depends on EXPERIMENTAL && FB && PCI && X86 && AGP_INTEL
|
|
+ depends on FB && EXPERIMENTAL && PCI && X86
|
|
+ select AGP
|
|
+ select AGP_INTEL
|
|
select FB_MODE_HELPERS
|
|
select FB_CFB_FILLRECT
|
|
select FB_CFB_COPYAREA
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/pxafb.c linux-2.6.29-rc3.owrt/drivers/video/pxafb.c
|
|
--- linux-2.6.29.owrt/drivers/video/pxafb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/pxafb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2230,7 +2230,7 @@
|
|
|
|
static struct platform_driver pxafb_driver = {
|
|
.probe = pxafb_probe,
|
|
- .remove = __devexit_p(pxafb_remove),
|
|
+ .remove = pxafb_remove,
|
|
.suspend = pxafb_suspend,
|
|
.resume = pxafb_resume,
|
|
.driver = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/video/sh_mobile_lcdcfb.c linux-2.6.29-rc3.owrt/drivers/video/sh_mobile_lcdcfb.c
|
|
--- linux-2.6.29.owrt/drivers/video/sh_mobile_lcdcfb.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/video/sh_mobile_lcdcfb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -446,6 +446,7 @@
|
|
{
|
|
struct sh_mobile_lcdc_chan *ch;
|
|
struct sh_mobile_lcdc_board_cfg *board_cfg;
|
|
+ unsigned long tmp;
|
|
int k;
|
|
|
|
/* tell the board code to disable the panel */
|
|
@@ -455,8 +456,9 @@
|
|
if (board_cfg->display_off)
|
|
board_cfg->display_off(board_cfg->board_data);
|
|
|
|
- /* cleanup deferred io if enabled */
|
|
- if (ch->info.fbdefio) {
|
|
+ /* cleanup deferred io if SYS bus */
|
|
+ tmp = ch->cfg.sys_bus_cfg.deferred_io_msec;
|
|
+ if (ch->ldmt1r_value & (1 << 12) && tmp) {
|
|
fb_deferred_io_cleanup(&ch->info);
|
|
ch->info.fbdefio = NULL;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/virtio/virtio_pci.c linux-2.6.29-rc3.owrt/drivers/virtio/virtio_pci.c
|
|
--- linux-2.6.29.owrt/drivers/virtio/virtio_pci.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/virtio/virtio_pci.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -192,7 +192,7 @@
|
|
drv = container_of(vp_dev->vdev.dev.driver,
|
|
struct virtio_driver, driver);
|
|
|
|
- if (drv && drv->config_changed)
|
|
+ if (drv->config_changed)
|
|
drv->config_changed(&vp_dev->vdev);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/w1/masters/w1-gpio.c linux-2.6.29-rc3.owrt/drivers/w1/masters/w1-gpio.c
|
|
--- linux-2.6.29.owrt/drivers/w1/masters/w1-gpio.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/w1/masters/w1-gpio.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -39,7 +39,7 @@
|
|
{
|
|
struct w1_gpio_platform_data *pdata = data;
|
|
|
|
- return gpio_get_value(pdata->pin) ? 1 : 0;
|
|
+ return gpio_get_value(pdata->pin);
|
|
}
|
|
|
|
static int __init w1_gpio_probe(struct platform_device *pdev)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/w1/slaves/Kconfig linux-2.6.29-rc3.owrt/drivers/w1/slaves/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/w1/slaves/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/w1/slaves/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -16,12 +16,6 @@
|
|
Say Y here if you want to connect 1-wire
|
|
simple 64bit memory rom(ds2401/ds2411/ds1990*) to your wire.
|
|
|
|
-config W1_SLAVE_DS2431
|
|
- tristate "1kb EEPROM family support (DS2431)"
|
|
- help
|
|
- Say Y here if you want to use a 1-wire
|
|
- 1kb EEPROM family device (DS2431)
|
|
-
|
|
config W1_SLAVE_DS2433
|
|
tristate "4kb EEPROM family support (DS2433)"
|
|
help
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/w1/slaves/Makefile linux-2.6.29-rc3.owrt/drivers/w1/slaves/Makefile
|
|
--- linux-2.6.29.owrt/drivers/w1/slaves/Makefile 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/w1/slaves/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -4,7 +4,6 @@
|
|
|
|
obj-$(CONFIG_W1_SLAVE_THERM) += w1_therm.o
|
|
obj-$(CONFIG_W1_SLAVE_SMEM) += w1_smem.o
|
|
-obj-$(CONFIG_W1_SLAVE_DS2431) += w1_ds2431.o
|
|
obj-$(CONFIG_W1_SLAVE_DS2433) += w1_ds2433.o
|
|
obj-$(CONFIG_W1_SLAVE_DS2760) += w1_ds2760.o
|
|
obj-$(CONFIG_W1_SLAVE_BQ27000) += w1_bq27000.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/w1/slaves/w1_ds2433.c linux-2.6.29-rc3.owrt/drivers/w1/slaves/w1_ds2433.c
|
|
--- linux-2.6.29.owrt/drivers/w1/slaves/w1_ds2433.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/w1/slaves/w1_ds2433.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -156,9 +156,6 @@
|
|
*/
|
|
static int w1_f23_write(struct w1_slave *sl, int addr, int len, const u8 *data)
|
|
{
|
|
-#ifdef CONFIG_W1_SLAVE_DS2433_CRC
|
|
- struct w1_f23_data *f23 = sl->family_data;
|
|
-#endif
|
|
u8 wrbuf[4];
|
|
u8 rdbuf[W1_PAGE_SIZE + 3];
|
|
u8 es = (addr + len - 1) & 0x1f;
|
|
@@ -199,9 +196,7 @@
|
|
|
|
/* Reset the bus to wake up the EEPROM (this may not be needed) */
|
|
w1_reset_bus(sl->master);
|
|
-#ifdef CONFIG_W1_SLAVE_DS2433_CRC
|
|
- f23->validcrc &= ~(1 << (addr >> W1_PAGE_BITS));
|
|
-#endif
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/w1/slaves/w1_therm.c linux-2.6.29-rc3.owrt/drivers/w1/slaves/w1_therm.c
|
|
--- linux-2.6.29.owrt/drivers/w1/slaves/w1_therm.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/w1/slaves/w1_therm.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -115,7 +115,7 @@
|
|
|
|
static inline int w1_DS18B20_convert_temp(u8 rom[9])
|
|
{
|
|
- int t = ((s16)rom[1] << 8) | rom[0];
|
|
+ s16 t = (rom[1] << 8) | rom[0];
|
|
t = t*1000/16;
|
|
return t;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/at91rm9200_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/at91rm9200_wdt.c
|
|
--- linux-2.6.29.owrt/drivers/watchdog/at91rm9200_wdt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/at91rm9200_wdt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -107,10 +107,10 @@
|
|
static int at91_wdt_settimeout(int new_time)
|
|
{
|
|
/*
|
|
- * All counting occurs at SLOW_CLOCK / 128 = 256 Hz
|
|
+ * All counting occurs at SLOW_CLOCK / 128 = 0.256 Hz
|
|
*
|
|
* Since WDV is a 16-bit counter, the maximum period is
|
|
- * 65536 / 256 = 256 seconds.
|
|
+ * 65536 / 0.256 = 256 seconds.
|
|
*/
|
|
if ((new_time <= 0) || (new_time > WDT_MAX_TIME))
|
|
return -EINVAL;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/at91sam9_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/at91sam9_wdt.c
|
|
--- linux-2.6.29.owrt/drivers/watchdog/at91sam9_wdt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/at91sam9_wdt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -18,7 +18,6 @@
|
|
#include <linux/errno.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/io.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/miscdevice.h>
|
|
#include <linux/module.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/gef_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/gef_wdt.c
|
|
--- linux-2.6.29.owrt/drivers/watchdog/gef_wdt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/gef_wdt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -269,7 +269,7 @@
|
|
bus_clk = 133; /* in MHz */
|
|
|
|
freq = fsl_get_sys_freq();
|
|
- if (freq != -1)
|
|
+ if (freq > 0)
|
|
bus_clk = freq;
|
|
|
|
/* Map devices registers into memory */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/iTCO_vendor_support.c linux-2.6.29-rc3.owrt/drivers/watchdog/iTCO_vendor_support.c
|
|
--- linux-2.6.29.owrt/drivers/watchdog/iTCO_vendor_support.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/iTCO_vendor_support.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* intel TCO vendor specific watchdog driver support
|
|
*
|
|
- * (c) Copyright 2006-2009 Wim Van Sebroeck <wim@iguana.be>.
|
|
+ * (c) Copyright 2006-2008 Wim Van Sebroeck <wim@iguana.be>.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
@@ -19,7 +19,7 @@
|
|
|
|
/* Module and version information */
|
|
#define DRV_NAME "iTCO_vendor_support"
|
|
-#define DRV_VERSION "1.03"
|
|
+#define DRV_VERSION "1.02"
|
|
#define PFX DRV_NAME ": "
|
|
|
|
/* Includes */
|
|
@@ -77,26 +77,6 @@
|
|
* 20.6 seconds.
|
|
*/
|
|
|
|
-static void supermicro_old_pre_start(unsigned long acpibase)
|
|
-{
|
|
- unsigned long val32;
|
|
-
|
|
- /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */
|
|
- val32 = inl(SMI_EN);
|
|
- val32 &= 0xffffdfff; /* Turn off SMI clearing watchdog */
|
|
- outl(val32, SMI_EN); /* Needed to activate watchdog */
|
|
-}
|
|
-
|
|
-static void supermicro_old_pre_stop(unsigned long acpibase)
|
|
-{
|
|
- unsigned long val32;
|
|
-
|
|
- /* Bit 13: TCO_EN -> 1 = Enables the TCO logic to generate SMI# */
|
|
- val32 = inl(SMI_EN);
|
|
- val32 |= 0x00002000; /* Turn on SMI clearing watchdog */
|
|
- outl(val32, SMI_EN); /* Needed to deactivate watchdog */
|
|
-}
|
|
-
|
|
static void supermicro_old_pre_keepalive(unsigned long acpibase)
|
|
{
|
|
/* Reload TCO Timer (done in iTCO_wdt_keepalive) + */
|
|
@@ -248,18 +228,14 @@
|
|
void iTCO_vendor_pre_start(unsigned long acpibase,
|
|
unsigned int heartbeat)
|
|
{
|
|
- if (vendorsupport == SUPERMICRO_OLD_BOARD)
|
|
- supermicro_old_pre_start(acpibase);
|
|
- else if (vendorsupport == SUPERMICRO_NEW_BOARD)
|
|
+ if (vendorsupport == SUPERMICRO_NEW_BOARD)
|
|
supermicro_new_pre_start(heartbeat);
|
|
}
|
|
EXPORT_SYMBOL(iTCO_vendor_pre_start);
|
|
|
|
void iTCO_vendor_pre_stop(unsigned long acpibase)
|
|
{
|
|
- if (vendorsupport == SUPERMICRO_OLD_BOARD)
|
|
- supermicro_old_pre_stop(acpibase);
|
|
- else if (vendorsupport == SUPERMICRO_NEW_BOARD)
|
|
+ if (vendorsupport == SUPERMICRO_NEW_BOARD)
|
|
supermicro_new_pre_stop();
|
|
}
|
|
EXPORT_SYMBOL(iTCO_vendor_pre_stop);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/iTCO_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/iTCO_wdt.c
|
|
--- linux-2.6.29.owrt/drivers/watchdog/iTCO_wdt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/iTCO_wdt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
- * intel TCO Watchdog Driver (Used in i82801 and i63xxESB chipsets)
|
|
+ * intel TCO Watchdog Driver (Used in i82801 and i6300ESB chipsets)
|
|
*
|
|
- * (c) Copyright 2006-2009 Wim Van Sebroeck <wim@iguana.be>.
|
|
+ * (c) Copyright 2006-2008 Wim Van Sebroeck <wim@iguana.be>.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
@@ -63,7 +63,7 @@
|
|
|
|
/* Module and version information */
|
|
#define DRV_NAME "iTCO_wdt"
|
|
-#define DRV_VERSION "1.05"
|
|
+#define DRV_VERSION "1.04"
|
|
#define PFX DRV_NAME ": "
|
|
|
|
/* Includes */
|
|
@@ -236,16 +236,16 @@
|
|
|
|
/* Address definitions for the TCO */
|
|
/* TCO base address */
|
|
-#define TCOBASE iTCO_wdt_private.ACPIBASE + 0x60
|
|
+#define TCOBASE iTCO_wdt_private.ACPIBASE + 0x60
|
|
/* SMI Control and Enable Register */
|
|
-#define SMI_EN iTCO_wdt_private.ACPIBASE + 0x30
|
|
+#define SMI_EN iTCO_wdt_private.ACPIBASE + 0x30
|
|
|
|
#define TCO_RLD TCOBASE + 0x00 /* TCO Timer Reload and Curr. Value */
|
|
#define TCOv1_TMR TCOBASE + 0x01 /* TCOv1 Timer Initial Value */
|
|
-#define TCO_DAT_IN TCOBASE + 0x02 /* TCO Data In Register */
|
|
-#define TCO_DAT_OUT TCOBASE + 0x03 /* TCO Data Out Register */
|
|
-#define TCO1_STS TCOBASE + 0x04 /* TCO1 Status Register */
|
|
-#define TCO2_STS TCOBASE + 0x06 /* TCO2 Status Register */
|
|
+#define TCO_DAT_IN TCOBASE + 0x02 /* TCO Data In Register */
|
|
+#define TCO_DAT_OUT TCOBASE + 0x03 /* TCO Data Out Register */
|
|
+#define TCO1_STS TCOBASE + 0x04 /* TCO1 Status Register */
|
|
+#define TCO2_STS TCOBASE + 0x06 /* TCO2 Status Register */
|
|
#define TCO1_CNT TCOBASE + 0x08 /* TCO1 Control Register */
|
|
#define TCO2_CNT TCOBASE + 0x0a /* TCO2 Control Register */
|
|
#define TCOv2_TMR TCOBASE + 0x12 /* TCOv2 Timer Initial Value */
|
|
@@ -338,6 +338,7 @@
|
|
static int iTCO_wdt_start(void)
|
|
{
|
|
unsigned int val;
|
|
+ unsigned long val32;
|
|
|
|
spin_lock(&iTCO_wdt_private.io_lock);
|
|
|
|
@@ -350,6 +351,11 @@
|
|
return -EIO;
|
|
}
|
|
|
|
+ /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */
|
|
+ val32 = inl(SMI_EN);
|
|
+ val32 &= 0xffffdfff; /* Turn off SMI clearing watchdog */
|
|
+ outl(val32, SMI_EN);
|
|
+
|
|
/* Force the timer to its reload value by writing to the TCO_RLD
|
|
register */
|
|
if (iTCO_wdt_private.iTCO_version == 2)
|
|
@@ -372,6 +378,7 @@
|
|
static int iTCO_wdt_stop(void)
|
|
{
|
|
unsigned int val;
|
|
+ unsigned long val32;
|
|
|
|
spin_lock(&iTCO_wdt_private.io_lock);
|
|
|
|
@@ -383,6 +390,11 @@
|
|
outw(val, TCO1_CNT);
|
|
val = inw(TCO1_CNT);
|
|
|
|
+ /* Bit 13: TCO_EN -> 1 = Enables the TCO logic to generate SMI# */
|
|
+ val32 = inl(SMI_EN);
|
|
+ val32 |= 0x00002000;
|
|
+ outl(val32, SMI_EN);
|
|
+
|
|
/* Set the NO_REBOOT bit to prevent later reboots, just for sure */
|
|
iTCO_wdt_set_NO_REBOOT_bit();
|
|
|
|
@@ -637,7 +649,6 @@
|
|
int ret;
|
|
u32 base_address;
|
|
unsigned long RCBA;
|
|
- unsigned long val32;
|
|
|
|
/*
|
|
* Find the ACPI/PM base I/O address which is the base
|
|
@@ -684,10 +695,6 @@
|
|
ret = -EIO;
|
|
goto out;
|
|
}
|
|
- /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */
|
|
- val32 = inl(SMI_EN);
|
|
- val32 &= 0xffffdfff; /* Turn off SMI clearing watchdog */
|
|
- outl(val32, SMI_EN);
|
|
|
|
/* The TCO I/O registers reside in a 32-byte range pointed to
|
|
by the TCOBASE value */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/Kconfig linux-2.6.29-rc3.owrt/drivers/watchdog/Kconfig
|
|
--- linux-2.6.29.owrt/drivers/watchdog/Kconfig 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -406,7 +406,7 @@
|
|
---help---
|
|
Hardware driver for the intel TCO timer based watchdog devices.
|
|
These drivers are included in the Intel 82801 I/O Controller
|
|
- Hub family (from ICH0 up to ICH10) and in the Intel 63xxESB
|
|
+ Hub family (from ICH0 up to ICH8) and in the Intel 6300ESB
|
|
controller hub.
|
|
|
|
The TCO (Total Cost of Ownership) timer is a watchdog timer
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/ks8695_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/ks8695_wdt.c
|
|
--- linux-2.6.29.owrt/drivers/watchdog/ks8695_wdt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/ks8695_wdt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -21,7 +21,6 @@
|
|
#include <linux/watchdog.h>
|
|
#include <linux/io.h>
|
|
#include <linux/uaccess.h>
|
|
-#include <mach/timex.h>
|
|
#include <mach/regs-timer.h>
|
|
|
|
#define WDT_DEFAULT_TIME 5 /* seconds */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/orion5x_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/orion5x_wdt.c
|
|
--- linux-2.6.29.owrt/drivers/watchdog/orion5x_wdt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/orion5x_wdt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -29,7 +29,6 @@
|
|
#define WDT_EN 0x0010
|
|
#define WDT_VAL (TIMER_VIRT_BASE + 0x0024)
|
|
|
|
-#define ORION5X_TCLK 166666667
|
|
#define WDT_MAX_DURATION (0xffffffff / ORION5X_TCLK)
|
|
#define WDT_IN_USE 0
|
|
#define WDT_OK_TO_CLOSE 1
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/watchdog/rc32434_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/rc32434_wdt.c
|
|
--- linux-2.6.29.owrt/drivers/watchdog/rc32434_wdt.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/watchdog/rc32434_wdt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -34,89 +34,104 @@
|
|
#include <asm/time.h>
|
|
#include <asm/mach-rc32434/integ.h>
|
|
|
|
-#define VERSION "0.4"
|
|
+#define MAX_TIMEOUT 20
|
|
+#define RC32434_WDT_INTERVAL (15 * HZ)
|
|
+
|
|
+#define VERSION "0.2"
|
|
|
|
static struct {
|
|
+ struct completion stop;
|
|
+ int running;
|
|
+ struct timer_list timer;
|
|
+ int queue;
|
|
+ int default_ticks;
|
|
unsigned long inuse;
|
|
} rc32434_wdt_device;
|
|
|
|
static struct integ __iomem *wdt_reg;
|
|
+static int ticks = 100 * HZ;
|
|
|
|
static int expect_close;
|
|
-
|
|
-/* Board internal clock speed in Hz,
|
|
- * the watchdog timer ticks at. */
|
|
-extern unsigned int idt_cpu_freq;
|
|
-
|
|
-/* translate wtcompare value to seconds and vice versa */
|
|
-#define WTCOMP2SEC(x) (x / idt_cpu_freq)
|
|
-#define SEC2WTCOMP(x) (x * idt_cpu_freq)
|
|
-
|
|
-/* Use a default timeout of 20s. This should be
|
|
- * safe for CPU clock speeds up to 400MHz, as
|
|
- * ((2 ^ 32) - 1) / (400MHz / 2) = 21s. */
|
|
-#define WATCHDOG_TIMEOUT 20
|
|
-
|
|
-static int timeout = WATCHDOG_TIMEOUT;
|
|
+static int timeout;
|
|
|
|
static int nowayout = WATCHDOG_NOWAYOUT;
|
|
module_param(nowayout, int, 0);
|
|
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
|
|
__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
|
|
|
|
-/* apply or and nand masks to data read from addr and write back */
|
|
-#define SET_BITS(addr, or, nand) \
|
|
- writel((readl(&addr) | or) & ~nand, &addr)
|
|
|
|
static void rc32434_wdt_start(void)
|
|
{
|
|
- u32 or, nand;
|
|
-
|
|
- /* zero the counter before enabling */
|
|
- writel(0, &wdt_reg->wtcount);
|
|
-
|
|
- /* don't generate a non-maskable interrupt,
|
|
- * do a warm reset instead */
|
|
- nand = 1 << RC32434_ERR_WNE;
|
|
- or = 1 << RC32434_ERR_WRE;
|
|
+ u32 val;
|
|
|
|
- /* reset the ERRCS timeout bit in case it's set */
|
|
- nand |= 1 << RC32434_ERR_WTO;
|
|
+ if (!rc32434_wdt_device.inuse) {
|
|
+ writel(0, &wdt_reg->wtcount);
|
|
|
|
- SET_BITS(wdt_reg->errcs, or, nand);
|
|
+ val = RC32434_ERR_WRE;
|
|
+ writel(readl(&wdt_reg->errcs) | val, &wdt_reg->errcs);
|
|
|
|
- /* reset WTC timeout bit and enable WDT */
|
|
- nand = 1 << RC32434_WTC_TO;
|
|
- or = 1 << RC32434_WTC_EN;
|
|
-
|
|
- SET_BITS(wdt_reg->wtc, or, nand);
|
|
+ val = RC32434_WTC_EN;
|
|
+ writel(readl(&wdt_reg->wtc) | val, &wdt_reg->wtc);
|
|
+ }
|
|
+ rc32434_wdt_device.running++;
|
|
}
|
|
|
|
static void rc32434_wdt_stop(void)
|
|
{
|
|
- /* Disable WDT */
|
|
- SET_BITS(wdt_reg->wtc, 0, 1 << RC32434_WTC_EN);
|
|
+ u32 val;
|
|
+
|
|
+ if (rc32434_wdt_device.running) {
|
|
+
|
|
+ val = ~RC32434_WTC_EN;
|
|
+ writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc);
|
|
+
|
|
+ val = ~RC32434_ERR_WRE;
|
|
+ writel(readl(&wdt_reg->errcs) & val, &wdt_reg->errcs);
|
|
+
|
|
+ rc32434_wdt_device.running = 0;
|
|
+ }
|
|
}
|
|
|
|
-static int rc32434_wdt_set(int new_timeout)
|
|
+static void rc32434_wdt_set(int new_timeout)
|
|
{
|
|
- int max_to = WTCOMP2SEC((u32)-1);
|
|
+ u32 cmp = new_timeout * HZ;
|
|
+ u32 state, val;
|
|
|
|
- if (new_timeout < 0 || new_timeout > max_to) {
|
|
- printk(KERN_ERR KBUILD_MODNAME
|
|
- ": timeout value must be between 0 and %d",
|
|
- max_to);
|
|
- return -EINVAL;
|
|
- }
|
|
timeout = new_timeout;
|
|
- writel(SEC2WTCOMP(timeout), &wdt_reg->wtcompare);
|
|
+ /*
|
|
+ * store and disable WTC
|
|
+ */
|
|
+ state = (u32)(readl(&wdt_reg->wtc) & RC32434_WTC_EN);
|
|
+ val = ~RC32434_WTC_EN;
|
|
+ writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc);
|
|
|
|
- return 0;
|
|
+ writel(0, &wdt_reg->wtcount);
|
|
+ writel(cmp, &wdt_reg->wtcompare);
|
|
+
|
|
+ /*
|
|
+ * restore WTC
|
|
+ */
|
|
+
|
|
+ writel(readl(&wdt_reg->wtc) | state, &wdt_reg);
|
|
}
|
|
|
|
-static void rc32434_wdt_ping(void)
|
|
+static void rc32434_wdt_reset(void)
|
|
{
|
|
+ ticks = rc32434_wdt_device.default_ticks;
|
|
+}
|
|
+
|
|
+static void rc32434_wdt_update(unsigned long unused)
|
|
+{
|
|
+ if (rc32434_wdt_device.running)
|
|
+ ticks--;
|
|
+
|
|
writel(0, &wdt_reg->wtcount);
|
|
+
|
|
+ if (rc32434_wdt_device.queue && ticks)
|
|
+ mod_timer(&rc32434_wdt_device.timer,
|
|
+ jiffies + RC32434_WDT_INTERVAL);
|
|
+ else
|
|
+ complete(&rc32434_wdt_device.stop);
|
|
}
|
|
|
|
static int rc32434_wdt_open(struct inode *inode, struct file *file)
|
|
@@ -127,23 +142,19 @@
|
|
if (nowayout)
|
|
__module_get(THIS_MODULE);
|
|
|
|
- rc32434_wdt_start();
|
|
- rc32434_wdt_ping();
|
|
-
|
|
return nonseekable_open(inode, file);
|
|
}
|
|
|
|
static int rc32434_wdt_release(struct inode *inode, struct file *file)
|
|
{
|
|
- if (expect_close == 42) {
|
|
+ if (expect_close && nowayout == 0) {
|
|
rc32434_wdt_stop();
|
|
printk(KERN_INFO KBUILD_MODNAME ": disabling watchdog timer\n");
|
|
module_put(THIS_MODULE);
|
|
- } else {
|
|
+ } else
|
|
printk(KERN_CRIT KBUILD_MODNAME
|
|
": device closed unexpectedly. WDT will not stop !\n");
|
|
- rc32434_wdt_ping();
|
|
- }
|
|
+
|
|
clear_bit(0, &rc32434_wdt_device.inuse);
|
|
return 0;
|
|
}
|
|
@@ -163,10 +174,10 @@
|
|
if (get_user(c, data + i))
|
|
return -EFAULT;
|
|
if (c == 'V')
|
|
- expect_close = 42;
|
|
+ expect_close = 1;
|
|
}
|
|
}
|
|
- rc32434_wdt_ping();
|
|
+ rc32434_wdt_update(0);
|
|
return len;
|
|
}
|
|
return 0;
|
|
@@ -186,11 +197,11 @@
|
|
};
|
|
switch (cmd) {
|
|
case WDIOC_KEEPALIVE:
|
|
- rc32434_wdt_ping();
|
|
+ rc32434_wdt_reset();
|
|
break;
|
|
case WDIOC_GETSTATUS:
|
|
case WDIOC_GETBOOTSTATUS:
|
|
- value = 0;
|
|
+ value = readl(&wdt_reg->wtcount);
|
|
if (copy_to_user(argp, &value, sizeof(int)))
|
|
return -EFAULT;
|
|
break;
|
|
@@ -207,7 +218,6 @@
|
|
break;
|
|
case WDIOS_DISABLECARD:
|
|
rc32434_wdt_stop();
|
|
- break;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
@@ -215,9 +225,11 @@
|
|
case WDIOC_SETTIMEOUT:
|
|
if (copy_from_user(&new_timeout, argp, sizeof(int)))
|
|
return -EFAULT;
|
|
- if (rc32434_wdt_set(new_timeout))
|
|
+ if (new_timeout < 1)
|
|
return -EINVAL;
|
|
- /* Fall through */
|
|
+ if (new_timeout > MAX_TIMEOUT)
|
|
+ return -EINVAL;
|
|
+ rc32434_wdt_set(new_timeout);
|
|
case WDIOC_GETTIMEOUT:
|
|
return copy_to_user(argp, &timeout, sizeof(int));
|
|
default:
|
|
@@ -242,15 +254,15 @@
|
|
.fops = &rc32434_wdt_fops,
|
|
};
|
|
|
|
-static char banner[] __devinitdata = KERN_INFO KBUILD_MODNAME
|
|
+static char banner[] = KERN_INFO KBUILD_MODNAME
|
|
": Watchdog Timer version " VERSION ", timer margin: %d sec\n";
|
|
|
|
-static int __devinit rc32434_wdt_probe(struct platform_device *pdev)
|
|
+static int rc32434_wdt_probe(struct platform_device *pdev)
|
|
{
|
|
int ret;
|
|
struct resource *r;
|
|
|
|
- r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb532_wdt_res");
|
|
+ r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb500_wdt_res");
|
|
if (!r) {
|
|
printk(KERN_ERR KBUILD_MODNAME
|
|
"failed to retrieve resources\n");
|
|
@@ -265,12 +277,24 @@
|
|
}
|
|
|
|
ret = misc_register(&rc32434_wdt_miscdev);
|
|
+
|
|
if (ret < 0) {
|
|
printk(KERN_ERR KBUILD_MODNAME
|
|
"failed to register watchdog device\n");
|
|
goto unmap;
|
|
}
|
|
|
|
+ init_completion(&rc32434_wdt_device.stop);
|
|
+ rc32434_wdt_device.queue = 0;
|
|
+
|
|
+ clear_bit(0, &rc32434_wdt_device.inuse);
|
|
+
|
|
+ setup_timer(&rc32434_wdt_device.timer, rc32434_wdt_update, 0L);
|
|
+
|
|
+ rc32434_wdt_device.default_ticks = ticks;
|
|
+
|
|
+ rc32434_wdt_start();
|
|
+
|
|
printk(banner, timeout);
|
|
|
|
return 0;
|
|
@@ -280,17 +304,23 @@
|
|
return ret;
|
|
}
|
|
|
|
-static int __devexit rc32434_wdt_remove(struct platform_device *pdev)
|
|
+static int rc32434_wdt_remove(struct platform_device *pdev)
|
|
{
|
|
+ if (rc32434_wdt_device.queue) {
|
|
+ rc32434_wdt_device.queue = 0;
|
|
+ wait_for_completion(&rc32434_wdt_device.stop);
|
|
+ }
|
|
misc_deregister(&rc32434_wdt_miscdev);
|
|
+
|
|
iounmap(wdt_reg);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver rc32434_wdt = {
|
|
.probe = rc32434_wdt_probe,
|
|
- .remove = __devexit_p(rc32434_wdt_remove),
|
|
- .driver = {
|
|
+ .remove = rc32434_wdt_remove,
|
|
+ .driver = {
|
|
.name = "rc32434_wdt",
|
|
}
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/xen/balloon.c linux-2.6.29-rc3.owrt/drivers/xen/balloon.c
|
|
--- linux-2.6.29.owrt/drivers/xen/balloon.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/xen/balloon.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -498,7 +498,7 @@
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
return -EPERM;
|
|
|
|
- target_bytes = simple_strtoull(buf, &endchar, 0) * 1024;
|
|
+ target_bytes = memparse(buf, &endchar);
|
|
|
|
balloon_set_new_target(target_bytes >> PAGE_SHIFT);
|
|
|
|
@@ -508,39 +508,8 @@
|
|
static SYSDEV_ATTR(target_kb, S_IRUGO | S_IWUSR,
|
|
show_target_kb, store_target_kb);
|
|
|
|
-
|
|
-static ssize_t show_target(struct sys_device *dev, struct sysdev_attribute *attr,
|
|
- char *buf)
|
|
-{
|
|
- return sprintf(buf, "%llu\n",
|
|
- (u64)balloon_stats.target_pages << PAGE_SHIFT);
|
|
-}
|
|
-
|
|
-static ssize_t store_target(struct sys_device *dev,
|
|
- struct sysdev_attribute *attr,
|
|
- const char *buf,
|
|
- size_t count)
|
|
-{
|
|
- char *endchar;
|
|
- unsigned long long target_bytes;
|
|
-
|
|
- if (!capable(CAP_SYS_ADMIN))
|
|
- return -EPERM;
|
|
-
|
|
- target_bytes = memparse(buf, &endchar);
|
|
-
|
|
- balloon_set_new_target(target_bytes >> PAGE_SHIFT);
|
|
-
|
|
- return count;
|
|
-}
|
|
-
|
|
-static SYSDEV_ATTR(target, S_IRUGO | S_IWUSR,
|
|
- show_target, store_target);
|
|
-
|
|
-
|
|
static struct sysdev_attribute *balloon_attrs[] = {
|
|
&attr_target_kb,
|
|
- &attr_target,
|
|
};
|
|
|
|
static struct attribute *balloon_info_attrs[] = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/drivers/xen/manage.c linux-2.6.29-rc3.owrt/drivers/xen/manage.c
|
|
--- linux-2.6.29.owrt/drivers/xen/manage.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/drivers/xen/manage.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -45,13 +45,6 @@
|
|
err);
|
|
return err;
|
|
}
|
|
- err = sysdev_suspend(PMSG_SUSPEND);
|
|
- if (err) {
|
|
- printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
|
|
- err);
|
|
- device_power_up(PMSG_RESUME);
|
|
- return err;
|
|
- }
|
|
|
|
xen_mm_pin_all();
|
|
gnttab_suspend();
|
|
@@ -68,7 +61,6 @@
|
|
gnttab_resume();
|
|
xen_mm_unpin_all();
|
|
|
|
- sysdev_resume();
|
|
device_power_up(PMSG_RESUME);
|
|
|
|
if (!*cancelled) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/aio.c linux-2.6.29-rc3.owrt/fs/aio.c
|
|
--- linux-2.6.29.owrt/fs/aio.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/aio.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -443,7 +443,7 @@
|
|
req->private = NULL;
|
|
req->ki_iovec = NULL;
|
|
INIT_LIST_HEAD(&req->ki_run_list);
|
|
- req->ki_eventfd = NULL;
|
|
+ req->ki_eventfd = ERR_PTR(-EINVAL);
|
|
|
|
/* Check if the completion queue has enough free space to
|
|
* accept an event from this io.
|
|
@@ -485,6 +485,8 @@
|
|
{
|
|
assert_spin_locked(&ctx->ctx_lock);
|
|
|
|
+ if (!IS_ERR(req->ki_eventfd))
|
|
+ fput(req->ki_eventfd);
|
|
if (req->ki_dtor)
|
|
req->ki_dtor(req);
|
|
if (req->ki_iovec != &req->ki_inline_vec)
|
|
@@ -506,11 +508,8 @@
|
|
list_del(&req->ki_list);
|
|
spin_unlock_irq(&fput_lock);
|
|
|
|
- /* Complete the fput(s) */
|
|
- if (req->ki_filp != NULL)
|
|
- __fput(req->ki_filp);
|
|
- if (req->ki_eventfd != NULL)
|
|
- __fput(req->ki_eventfd);
|
|
+ /* Complete the fput */
|
|
+ __fput(req->ki_filp);
|
|
|
|
/* Link the iocb into the context's free list */
|
|
spin_lock_irq(&ctx->ctx_lock);
|
|
@@ -528,14 +527,12 @@
|
|
*/
|
|
static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
|
|
{
|
|
- int schedule_putreq = 0;
|
|
-
|
|
dprintk(KERN_DEBUG "aio_put(%p): f_count=%ld\n",
|
|
req, atomic_long_read(&req->ki_filp->f_count));
|
|
|
|
assert_spin_locked(&ctx->ctx_lock);
|
|
|
|
- req->ki_users--;
|
|
+ req->ki_users --;
|
|
BUG_ON(req->ki_users < 0);
|
|
if (likely(req->ki_users))
|
|
return 0;
|
|
@@ -543,23 +540,10 @@
|
|
req->ki_cancel = NULL;
|
|
req->ki_retry = NULL;
|
|
|
|
- /*
|
|
- * Try to optimize the aio and eventfd file* puts, by avoiding to
|
|
- * schedule work in case it is not __fput() time. In normal cases,
|
|
- * we would not be holding the last reference to the file*, so
|
|
- * this function will be executed w/out any aio kthread wakeup.
|
|
+ /* Must be done under the lock to serialise against cancellation.
|
|
+ * Call this aio_fput as it duplicates fput via the fput_work.
|
|
*/
|
|
- if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count)))
|
|
- schedule_putreq++;
|
|
- else
|
|
- req->ki_filp = NULL;
|
|
- if (req->ki_eventfd != NULL) {
|
|
- if (unlikely(atomic_long_dec_and_test(&req->ki_eventfd->f_count)))
|
|
- schedule_putreq++;
|
|
- else
|
|
- req->ki_eventfd = NULL;
|
|
- }
|
|
- if (unlikely(schedule_putreq)) {
|
|
+ if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count))) {
|
|
get_ioctx(ctx);
|
|
spin_lock(&fput_lock);
|
|
list_add(&req->ki_list, &fput_head);
|
|
@@ -587,7 +571,7 @@
|
|
static struct kioctx *lookup_ioctx(unsigned long ctx_id)
|
|
{
|
|
struct mm_struct *mm = current->mm;
|
|
- struct kioctx *ctx, *ret = NULL;
|
|
+ struct kioctx *ctx = NULL;
|
|
struct hlist_node *n;
|
|
|
|
rcu_read_lock();
|
|
@@ -595,13 +579,12 @@
|
|
hlist_for_each_entry_rcu(ctx, n, &mm->ioctx_list, list) {
|
|
if (ctx->user_id == ctx_id && !ctx->dead) {
|
|
get_ioctx(ctx);
|
|
- ret = ctx;
|
|
break;
|
|
}
|
|
}
|
|
|
|
rcu_read_unlock();
|
|
- return ret;
|
|
+ return ctx;
|
|
}
|
|
|
|
/*
|
|
@@ -1026,7 +1009,7 @@
|
|
* eventfd. The eventfd_signal() function is safe to be called
|
|
* from IRQ context.
|
|
*/
|
|
- if (iocb->ki_eventfd != NULL)
|
|
+ if (!IS_ERR(iocb->ki_eventfd))
|
|
eventfd_signal(iocb->ki_eventfd, 1);
|
|
|
|
put_rq:
|
|
@@ -1625,7 +1608,6 @@
|
|
req->ki_eventfd = eventfd_fget((int) iocb->aio_resfd);
|
|
if (IS_ERR(req->ki_eventfd)) {
|
|
ret = PTR_ERR(req->ki_eventfd);
|
|
- req->ki_eventfd = NULL;
|
|
goto out_put_req;
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/binfmt_elf.c linux-2.6.29-rc3.owrt/fs/binfmt_elf.c
|
|
--- linux-2.6.29.owrt/fs/binfmt_elf.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/binfmt_elf.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1225,15 +1225,7 @@
|
|
magic.elfmag[EI_MAG1] = ELFMAG1;
|
|
magic.elfmag[EI_MAG2] = ELFMAG2;
|
|
magic.elfmag[EI_MAG3] = ELFMAG3;
|
|
- /*
|
|
- * Switch to the user "segment" for get_user(),
|
|
- * then put back what elf_core_dump() had in place.
|
|
- */
|
|
- set_fs(USER_DS);
|
|
- if (unlikely(get_user(word, header)))
|
|
- word = 0;
|
|
- set_fs(fs);
|
|
- if (word == magic.cmp)
|
|
+ if (get_user(word, header) == 0 && word == magic.cmp)
|
|
return PAGE_SIZE;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/bio.c linux-2.6.29-rc3.owrt/fs/bio.c
|
|
--- linux-2.6.29.owrt/fs/bio.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/bio.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -302,10 +302,9 @@
|
|
struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
|
|
{
|
|
struct bio *bio = NULL;
|
|
- void *uninitialized_var(p);
|
|
|
|
if (bs) {
|
|
- p = mempool_alloc(bs->bio_pool, gfp_mask);
|
|
+ void *p = mempool_alloc(bs->bio_pool, gfp_mask);
|
|
|
|
if (p)
|
|
bio = p + bs->front_pad;
|
|
@@ -330,7 +329,7 @@
|
|
}
|
|
if (unlikely(!bvl)) {
|
|
if (bs)
|
|
- mempool_free(p, bs->bio_pool);
|
|
+ mempool_free(bio, bs->bio_pool);
|
|
else
|
|
kfree(bio);
|
|
bio = NULL;
|
|
@@ -463,12 +462,10 @@
|
|
if (bio_integrity(bio)) {
|
|
int ret;
|
|
|
|
- ret = bio_integrity_clone(b, bio, gfp_mask, fs_bio_set);
|
|
+ ret = bio_integrity_clone(b, bio, fs_bio_set);
|
|
|
|
- if (ret < 0) {
|
|
- bio_put(b);
|
|
+ if (ret < 0)
|
|
return NULL;
|
|
- }
|
|
}
|
|
|
|
return b;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/bio-integrity.c linux-2.6.29-rc3.owrt/fs/bio-integrity.c
|
|
--- linux-2.6.29.owrt/fs/bio-integrity.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/bio-integrity.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -140,6 +140,7 @@
|
|
|
|
iv = bip_vec_idx(bip, bip->bip_vcnt);
|
|
BUG_ON(iv == NULL);
|
|
+ BUG_ON(iv->bv_page != NULL);
|
|
|
|
iv->bv_page = page;
|
|
iv->bv_len = len;
|
|
@@ -464,7 +465,7 @@
|
|
|
|
if (ret) {
|
|
kunmap_atomic(kaddr, KM_USER0);
|
|
- return ret;
|
|
+ break;
|
|
}
|
|
|
|
sectors = bv->bv_len / bi->sector_size;
|
|
@@ -492,13 +493,18 @@
|
|
struct bio_integrity_payload *bip =
|
|
container_of(work, struct bio_integrity_payload, bip_work);
|
|
struct bio *bio = bip->bip_bio;
|
|
- int error;
|
|
+ int error = bip->bip_error;
|
|
|
|
- error = bio_integrity_verify(bio);
|
|
+ if (bio_integrity_verify(bio)) {
|
|
+ clear_bit(BIO_UPTODATE, &bio->bi_flags);
|
|
+ error = -EIO;
|
|
+ }
|
|
|
|
/* Restore original bio completion handler */
|
|
bio->bi_end_io = bip->bip_end_io;
|
|
- bio_endio(bio, error);
|
|
+
|
|
+ if (bio->bi_end_io)
|
|
+ bio->bi_end_io(bio, error);
|
|
}
|
|
|
|
/**
|
|
@@ -519,17 +525,7 @@
|
|
|
|
BUG_ON(bip->bip_bio != bio);
|
|
|
|
- /* In case of an I/O error there is no point in verifying the
|
|
- * integrity metadata. Restore original bio end_io handler
|
|
- * and run it.
|
|
- */
|
|
- if (error) {
|
|
- bio->bi_end_io = bip->bip_end_io;
|
|
- bio_endio(bio, error);
|
|
-
|
|
- return;
|
|
- }
|
|
-
|
|
+ bip->bip_error = error;
|
|
INIT_WORK(&bip->bip_work, bio_integrity_verify_fn);
|
|
queue_work(kintegrityd_wq, &bip->bip_work);
|
|
}
|
|
@@ -685,20 +681,19 @@
|
|
* bio_integrity_clone - Callback for cloning bios with integrity metadata
|
|
* @bio: New bio
|
|
* @bio_src: Original bio
|
|
- * @gfp_mask: Memory allocation mask
|
|
* @bs: bio_set to allocate bip from
|
|
*
|
|
* Description: Called to allocate a bip when cloning a bio
|
|
*/
|
|
int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
|
|
- gfp_t gfp_mask, struct bio_set *bs)
|
|
+ struct bio_set *bs)
|
|
{
|
|
struct bio_integrity_payload *bip_src = bio_src->bi_integrity;
|
|
struct bio_integrity_payload *bip;
|
|
|
|
BUG_ON(bip_src == NULL);
|
|
|
|
- bip = bio_integrity_alloc_bioset(bio, gfp_mask, bip_src->bip_vcnt, bs);
|
|
+ bip = bio_integrity_alloc_bioset(bio, GFP_NOIO, bip_src->bip_vcnt, bs);
|
|
|
|
if (bip == NULL)
|
|
return -EIO;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/async-thread.c linux-2.6.29-rc3.owrt/fs/btrfs/async-thread.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/async-thread.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/async-thread.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -16,11 +16,11 @@
|
|
* Boston, MA 021110-1307, USA.
|
|
*/
|
|
|
|
+#include <linux/version.h>
|
|
#include <linux/kthread.h>
|
|
#include <linux/list.h>
|
|
#include <linux/spinlock.h>
|
|
-#include <linux/freezer.h>
|
|
-#include <linux/ftrace.h>
|
|
+# include <linux/freezer.h>
|
|
#include "async-thread.h"
|
|
|
|
#define WORK_QUEUED_BIT 0
|
|
@@ -143,7 +143,6 @@
|
|
struct btrfs_work *work;
|
|
do {
|
|
spin_lock_irq(&worker->lock);
|
|
-again_locked:
|
|
while (!list_empty(&worker->pending)) {
|
|
cur = worker->pending.next;
|
|
work = list_entry(cur, struct btrfs_work, list);
|
|
@@ -166,50 +165,14 @@
|
|
check_idle_worker(worker);
|
|
|
|
}
|
|
+ worker->working = 0;
|
|
if (freezing(current)) {
|
|
- worker->working = 0;
|
|
- spin_unlock_irq(&worker->lock);
|
|
refrigerator();
|
|
} else {
|
|
+ set_current_state(TASK_INTERRUPTIBLE);
|
|
spin_unlock_irq(&worker->lock);
|
|
- if (!kthread_should_stop()) {
|
|
- cpu_relax();
|
|
- /*
|
|
- * we've dropped the lock, did someone else
|
|
- * jump_in?
|
|
- */
|
|
- smp_mb();
|
|
- if (!list_empty(&worker->pending))
|
|
- continue;
|
|
-
|
|
- /*
|
|
- * this short schedule allows more work to
|
|
- * come in without the queue functions
|
|
- * needing to go through wake_up_process()
|
|
- *
|
|
- * worker->working is still 1, so nobody
|
|
- * is going to try and wake us up
|
|
- */
|
|
- schedule_timeout(1);
|
|
- smp_mb();
|
|
- if (!list_empty(&worker->pending))
|
|
- continue;
|
|
-
|
|
- /* still no more work?, sleep for real */
|
|
- spin_lock_irq(&worker->lock);
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
- if (!list_empty(&worker->pending))
|
|
- goto again_locked;
|
|
-
|
|
- /*
|
|
- * this makes sure we get a wakeup when someone
|
|
- * adds something new to the queue
|
|
- */
|
|
- worker->working = 0;
|
|
- spin_unlock_irq(&worker->lock);
|
|
-
|
|
+ if (!kthread_should_stop())
|
|
schedule();
|
|
- }
|
|
__set_current_state(TASK_RUNNING);
|
|
}
|
|
} while (!kthread_should_stop());
|
|
@@ -387,14 +350,13 @@
|
|
{
|
|
struct btrfs_worker_thread *worker = work->worker;
|
|
unsigned long flags;
|
|
- int wake = 0;
|
|
|
|
if (test_and_set_bit(WORK_QUEUED_BIT, &work->flags))
|
|
goto out;
|
|
|
|
spin_lock_irqsave(&worker->lock, flags);
|
|
- list_add_tail(&work->list, &worker->pending);
|
|
atomic_inc(&worker->num_pending);
|
|
+ list_add_tail(&work->list, &worker->pending);
|
|
|
|
/* by definition we're busy, take ourselves off the idle
|
|
* list
|
|
@@ -406,16 +368,10 @@
|
|
&worker->workers->worker_list);
|
|
spin_unlock_irqrestore(&worker->workers->lock, flags);
|
|
}
|
|
- if (!worker->working) {
|
|
- wake = 1;
|
|
- worker->working = 1;
|
|
- }
|
|
|
|
spin_unlock_irqrestore(&worker->lock, flags);
|
|
- if (wake)
|
|
- wake_up_process(worker->task);
|
|
-out:
|
|
|
|
+out:
|
|
return 0;
|
|
}
|
|
|
|
@@ -442,10 +398,9 @@
|
|
}
|
|
|
|
spin_lock_irqsave(&worker->lock, flags);
|
|
-
|
|
- list_add_tail(&work->list, &worker->pending);
|
|
atomic_inc(&worker->num_pending);
|
|
check_busy_worker(worker);
|
|
+ list_add_tail(&work->list, &worker->pending);
|
|
|
|
/*
|
|
* avoid calling into wake_up_process if this thread has already
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/btrfs_inode.h linux-2.6.29-rc3.owrt/fs/btrfs/btrfs_inode.h
|
|
--- linux-2.6.29.owrt/fs/btrfs/btrfs_inode.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/btrfs_inode.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -66,9 +66,6 @@
|
|
*/
|
|
struct list_head delalloc_inodes;
|
|
|
|
- /* the space_info for where this inode's data allocations are done */
|
|
- struct btrfs_space_info *space_info;
|
|
-
|
|
/* full 64 bit generation number, struct vfs_inode doesn't have a big
|
|
* enough field for this.
|
|
*/
|
|
@@ -97,11 +94,6 @@
|
|
*/
|
|
u64 delalloc_bytes;
|
|
|
|
- /* total number of bytes that may be used for this inode for
|
|
- * delalloc
|
|
- */
|
|
- u64 reserved_bytes;
|
|
-
|
|
/*
|
|
* the size of the file stored in the metadata on disk. data=ordered
|
|
* means the in-memory i_size might be larger than the size on disk
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/compression.c linux-2.6.29-rc3.owrt/fs/btrfs/compression.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/compression.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/compression.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -32,6 +32,7 @@
|
|
#include <linux/swap.h>
|
|
#include <linux/writeback.h>
|
|
#include <linux/bit_spinlock.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/pagevec.h>
|
|
#include "compat.h"
|
|
#include "ctree.h"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/ctree.c linux-2.6.29-rc3.owrt/fs/btrfs/ctree.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/ctree.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/ctree.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -38,62 +38,20 @@
|
|
static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
|
|
struct btrfs_path *path, int level, int slot);
|
|
|
|
-struct btrfs_path *btrfs_alloc_path(void)
|
|
+inline void btrfs_init_path(struct btrfs_path *p)
|
|
{
|
|
- struct btrfs_path *path;
|
|
- path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS);
|
|
- if (path)
|
|
- path->reada = 1;
|
|
- return path;
|
|
+ memset(p, 0, sizeof(*p));
|
|
}
|
|
|
|
-/*
|
|
- * set all locked nodes in the path to blocking locks. This should
|
|
- * be done before scheduling
|
|
- */
|
|
-noinline void btrfs_set_path_blocking(struct btrfs_path *p)
|
|
-{
|
|
- int i;
|
|
- for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
|
|
- if (p->nodes[i] && p->locks[i])
|
|
- btrfs_set_lock_blocking(p->nodes[i]);
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * reset all the locked nodes in the patch to spinning locks.
|
|
- *
|
|
- * held is used to keep lockdep happy, when lockdep is enabled
|
|
- * we set held to a blocking lock before we go around and
|
|
- * retake all the spinlocks in the path. You can safely use NULL
|
|
- * for held
|
|
- */
|
|
-noinline void btrfs_clear_path_blocking(struct btrfs_path *p,
|
|
- struct extent_buffer *held)
|
|
+struct btrfs_path *btrfs_alloc_path(void)
|
|
{
|
|
- int i;
|
|
-
|
|
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
- /* lockdep really cares that we take all of these spinlocks
|
|
- * in the right order. If any of the locks in the path are not
|
|
- * currently blocking, it is going to complain. So, make really
|
|
- * really sure by forcing the path to blocking before we clear
|
|
- * the path blocking.
|
|
- */
|
|
- if (held)
|
|
- btrfs_set_lock_blocking(held);
|
|
- btrfs_set_path_blocking(p);
|
|
-#endif
|
|
-
|
|
- for (i = BTRFS_MAX_LEVEL - 1; i >= 0; i--) {
|
|
- if (p->nodes[i] && p->locks[i])
|
|
- btrfs_clear_lock_blocking(p->nodes[i]);
|
|
+ struct btrfs_path *path;
|
|
+ path = kmem_cache_alloc(btrfs_path_cachep, GFP_NOFS);
|
|
+ if (path) {
|
|
+ btrfs_init_path(path);
|
|
+ path->reada = 1;
|
|
}
|
|
-
|
|
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
- if (held)
|
|
- btrfs_clear_lock_blocking(held);
|
|
-#endif
|
|
+ return path;
|
|
}
|
|
|
|
/* this also releases the path */
|
|
@@ -277,7 +235,7 @@
|
|
if (*cow_ret == buf)
|
|
unlock_orig = 1;
|
|
|
|
- btrfs_assert_tree_locked(buf);
|
|
+ WARN_ON(!btrfs_tree_locked(buf));
|
|
|
|
if (parent)
|
|
parent_start = parent->start;
|
|
@@ -303,7 +261,7 @@
|
|
trans->transid, level, &ins);
|
|
BUG_ON(ret);
|
|
cow = btrfs_init_new_buffer(trans, root, prealloc_dest,
|
|
- buf->len, level);
|
|
+ buf->len);
|
|
} else {
|
|
cow = btrfs_alloc_free_block(trans, root, buf->len,
|
|
parent_start,
|
|
@@ -314,8 +272,6 @@
|
|
if (IS_ERR(cow))
|
|
return PTR_ERR(cow);
|
|
|
|
- /* cow is set to blocking by btrfs_init_new_buffer */
|
|
-
|
|
copy_extent_buffer(cow, buf, 0, 0, cow->len);
|
|
btrfs_set_header_bytenr(cow, cow->start);
|
|
btrfs_set_header_generation(cow, trans->transid);
|
|
@@ -432,20 +388,17 @@
|
|
WARN_ON(1);
|
|
}
|
|
|
|
+ spin_lock(&root->fs_info->hash_lock);
|
|
if (btrfs_header_generation(buf) == trans->transid &&
|
|
btrfs_header_owner(buf) == root->root_key.objectid &&
|
|
!btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN)) {
|
|
*cow_ret = buf;
|
|
+ spin_unlock(&root->fs_info->hash_lock);
|
|
WARN_ON(prealloc_dest);
|
|
return 0;
|
|
}
|
|
-
|
|
+ spin_unlock(&root->fs_info->hash_lock);
|
|
search_start = buf->start & ~((u64)(1024 * 1024 * 1024) - 1);
|
|
-
|
|
- if (parent)
|
|
- btrfs_set_lock_blocking(parent);
|
|
- btrfs_set_lock_blocking(buf);
|
|
-
|
|
ret = __btrfs_cow_block(trans, root, buf, parent,
|
|
parent_slot, cow_ret, search_start, 0,
|
|
prealloc_dest);
|
|
@@ -551,8 +504,6 @@
|
|
if (parent_nritems == 1)
|
|
return 0;
|
|
|
|
- btrfs_set_lock_blocking(parent);
|
|
-
|
|
for (i = start_slot; i < end_slot; i++) {
|
|
int close = 1;
|
|
|
|
@@ -613,7 +564,6 @@
|
|
search_start = last_block;
|
|
|
|
btrfs_tree_lock(cur);
|
|
- btrfs_set_lock_blocking(cur);
|
|
err = __btrfs_cow_block(trans, root, cur, parent, i,
|
|
&cur, search_start,
|
|
min(16 * blocksize,
|
|
@@ -912,7 +862,6 @@
|
|
return 0;
|
|
|
|
mid = path->nodes[level];
|
|
-
|
|
WARN_ON(!path->locks[level]);
|
|
WARN_ON(btrfs_header_generation(mid) != trans->transid);
|
|
|
|
@@ -934,9 +883,8 @@
|
|
|
|
/* promote the child to a root */
|
|
child = read_node_slot(root, mid, 0);
|
|
- BUG_ON(!child);
|
|
btrfs_tree_lock(child);
|
|
- btrfs_set_lock_blocking(child);
|
|
+ BUG_ON(!child);
|
|
ret = btrfs_cow_block(trans, root, child, mid, 0, &child, 0);
|
|
BUG_ON(ret);
|
|
|
|
@@ -952,7 +900,6 @@
|
|
|
|
add_root_to_dirty_list(root);
|
|
btrfs_tree_unlock(child);
|
|
-
|
|
path->locks[level] = 0;
|
|
path->nodes[level] = NULL;
|
|
clean_tree_block(trans, root, mid);
|
|
@@ -977,7 +924,6 @@
|
|
left = read_node_slot(root, parent, pslot - 1);
|
|
if (left) {
|
|
btrfs_tree_lock(left);
|
|
- btrfs_set_lock_blocking(left);
|
|
wret = btrfs_cow_block(trans, root, left,
|
|
parent, pslot - 1, &left, 0);
|
|
if (wret) {
|
|
@@ -988,7 +934,6 @@
|
|
right = read_node_slot(root, parent, pslot + 1);
|
|
if (right) {
|
|
btrfs_tree_lock(right);
|
|
- btrfs_set_lock_blocking(right);
|
|
wret = btrfs_cow_block(trans, root, right,
|
|
parent, pslot + 1, &right, 0);
|
|
if (wret) {
|
|
@@ -1164,8 +1109,6 @@
|
|
u32 left_nr;
|
|
|
|
btrfs_tree_lock(left);
|
|
- btrfs_set_lock_blocking(left);
|
|
-
|
|
left_nr = btrfs_header_nritems(left);
|
|
if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
|
|
wret = 1;
|
|
@@ -1212,10 +1155,7 @@
|
|
*/
|
|
if (right) {
|
|
u32 right_nr;
|
|
-
|
|
btrfs_tree_lock(right);
|
|
- btrfs_set_lock_blocking(right);
|
|
-
|
|
right_nr = btrfs_header_nritems(right);
|
|
if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
|
|
wret = 1;
|
|
@@ -1270,7 +1210,8 @@
|
|
struct btrfs_disk_key disk_key;
|
|
u32 nritems;
|
|
u64 search;
|
|
- u64 target;
|
|
+ u64 lowest_read;
|
|
+ u64 highest_read;
|
|
u64 nread = 0;
|
|
int direction = path->reada;
|
|
struct extent_buffer *eb;
|
|
@@ -1294,7 +1235,8 @@
|
|
return;
|
|
}
|
|
|
|
- target = search;
|
|
+ highest_read = search;
|
|
+ lowest_read = search;
|
|
|
|
nritems = btrfs_header_nritems(node);
|
|
nr = slot;
|
|
@@ -1314,80 +1256,27 @@
|
|
break;
|
|
}
|
|
search = btrfs_node_blockptr(node, nr);
|
|
- if ((search <= target && target - search <= 65536) ||
|
|
- (search > target && search - target <= 65536)) {
|
|
+ if ((search >= lowest_read && search <= highest_read) ||
|
|
+ (search < lowest_read && lowest_read - search <= 16384) ||
|
|
+ (search > highest_read && search - highest_read <= 16384)) {
|
|
readahead_tree_block(root, search, blocksize,
|
|
btrfs_node_ptr_generation(node, nr));
|
|
nread += blocksize;
|
|
}
|
|
nscan++;
|
|
- if ((nread > 65536 || nscan > 32))
|
|
+ if (path->reada < 2 && (nread > (64 * 1024) || nscan > 32))
|
|
break;
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * returns -EAGAIN if it had to drop the path, or zero if everything was in
|
|
- * cache
|
|
- */
|
|
-static noinline int reada_for_balance(struct btrfs_root *root,
|
|
- struct btrfs_path *path, int level)
|
|
-{
|
|
- int slot;
|
|
- int nritems;
|
|
- struct extent_buffer *parent;
|
|
- struct extent_buffer *eb;
|
|
- u64 gen;
|
|
- u64 block1 = 0;
|
|
- u64 block2 = 0;
|
|
- int ret = 0;
|
|
- int blocksize;
|
|
|
|
- parent = path->nodes[level - 1];
|
|
- if (!parent)
|
|
- return 0;
|
|
-
|
|
- nritems = btrfs_header_nritems(parent);
|
|
- slot = path->slots[level];
|
|
- blocksize = btrfs_level_size(root, level);
|
|
-
|
|
- if (slot > 0) {
|
|
- block1 = btrfs_node_blockptr(parent, slot - 1);
|
|
- gen = btrfs_node_ptr_generation(parent, slot - 1);
|
|
- eb = btrfs_find_tree_block(root, block1, blocksize);
|
|
- if (eb && btrfs_buffer_uptodate(eb, gen))
|
|
- block1 = 0;
|
|
- free_extent_buffer(eb);
|
|
- }
|
|
- if (slot < nritems) {
|
|
- block2 = btrfs_node_blockptr(parent, slot + 1);
|
|
- gen = btrfs_node_ptr_generation(parent, slot + 1);
|
|
- eb = btrfs_find_tree_block(root, block2, blocksize);
|
|
- if (eb && btrfs_buffer_uptodate(eb, gen))
|
|
- block2 = 0;
|
|
- free_extent_buffer(eb);
|
|
- }
|
|
- if (block1 || block2) {
|
|
- ret = -EAGAIN;
|
|
- btrfs_release_path(root, path);
|
|
- if (block1)
|
|
- readahead_tree_block(root, block1, blocksize, 0);
|
|
- if (block2)
|
|
- readahead_tree_block(root, block2, blocksize, 0);
|
|
+ if (nread > (256 * 1024) || nscan > 128)
|
|
+ break;
|
|
|
|
- if (block1) {
|
|
- eb = read_tree_block(root, block1, blocksize, 0);
|
|
- free_extent_buffer(eb);
|
|
- }
|
|
- if (block1) {
|
|
- eb = read_tree_block(root, block2, blocksize, 0);
|
|
- free_extent_buffer(eb);
|
|
- }
|
|
+ if (search < lowest_read)
|
|
+ lowest_read = search;
|
|
+ if (search > highest_read)
|
|
+ highest_read = search;
|
|
}
|
|
- return ret;
|
|
}
|
|
|
|
-
|
|
/*
|
|
* when we walk down the tree, it is usually safe to unlock the higher layers
|
|
* in the tree. The exceptions are when our path goes through slot 0, because
|
|
@@ -1439,32 +1328,6 @@
|
|
}
|
|
|
|
/*
|
|
- * This releases any locks held in the path starting at level and
|
|
- * going all the way up to the root.
|
|
- *
|
|
- * btrfs_search_slot will keep the lock held on higher nodes in a few
|
|
- * corner cases, such as COW of the block at slot zero in the node. This
|
|
- * ignores those rules, and it should only be called when there are no
|
|
- * more updates to be done higher up in the tree.
|
|
- */
|
|
-noinline void btrfs_unlock_up_safe(struct btrfs_path *path, int level)
|
|
-{
|
|
- int i;
|
|
-
|
|
- if (path->keep_locks || path->lowest_level)
|
|
- return;
|
|
-
|
|
- for (i = level; i < BTRFS_MAX_LEVEL; i++) {
|
|
- if (!path->nodes[i])
|
|
- continue;
|
|
- if (!path->locks[i])
|
|
- continue;
|
|
- btrfs_tree_unlock(path->nodes[i]);
|
|
- path->locks[i] = 0;
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
* look for key in the tree. path is filled in with nodes along the way
|
|
* if key is found, we return zero and you can find the item in the leaf
|
|
* level of the path (level 0)
|
|
@@ -1524,30 +1387,32 @@
|
|
int wret;
|
|
|
|
/* is a cow on this block not required */
|
|
+ spin_lock(&root->fs_info->hash_lock);
|
|
if (btrfs_header_generation(b) == trans->transid &&
|
|
btrfs_header_owner(b) == root->root_key.objectid &&
|
|
!btrfs_header_flag(b, BTRFS_HEADER_FLAG_WRITTEN)) {
|
|
+ spin_unlock(&root->fs_info->hash_lock);
|
|
goto cow_done;
|
|
}
|
|
+ spin_unlock(&root->fs_info->hash_lock);
|
|
|
|
/* ok, we have to cow, is our old prealloc the right
|
|
* size?
|
|
*/
|
|
if (prealloc_block.objectid &&
|
|
prealloc_block.offset != b->len) {
|
|
- btrfs_release_path(root, p);
|
|
btrfs_free_reserved_extent(root,
|
|
prealloc_block.objectid,
|
|
prealloc_block.offset);
|
|
prealloc_block.objectid = 0;
|
|
- goto again;
|
|
}
|
|
|
|
/*
|
|
* for higher level blocks, try not to allocate blocks
|
|
* with the block and the parent locks held.
|
|
*/
|
|
- if (level > 0 && !prealloc_block.objectid) {
|
|
+ if (level > 1 && !prealloc_block.objectid &&
|
|
+ btrfs_path_lock_waiting(p, level)) {
|
|
u32 size = b->len;
|
|
u64 hint = b->start;
|
|
|
|
@@ -1560,8 +1425,6 @@
|
|
goto again;
|
|
}
|
|
|
|
- btrfs_set_path_blocking(p);
|
|
-
|
|
wret = btrfs_cow_block(trans, root, b,
|
|
p->nodes[level + 1],
|
|
p->slots[level + 1],
|
|
@@ -1583,22 +1446,6 @@
|
|
if (!p->skip_locking)
|
|
p->locks[level] = 1;
|
|
|
|
- btrfs_clear_path_blocking(p, NULL);
|
|
-
|
|
- /*
|
|
- * we have a lock on b and as long as we aren't changing
|
|
- * the tree, there is no way to for the items in b to change.
|
|
- * It is safe to drop the lock on our parent before we
|
|
- * go through the expensive btree search on b.
|
|
- *
|
|
- * If cow is true, then we might be changing slot zero,
|
|
- * which may require changing the parent. So, we can't
|
|
- * drop the lock until after we know which slot we're
|
|
- * operating on.
|
|
- */
|
|
- if (!cow)
|
|
- btrfs_unlock_up_safe(p, level + 1);
|
|
-
|
|
ret = check_block(root, p, level);
|
|
if (ret) {
|
|
ret = -1;
|
|
@@ -1606,7 +1453,6 @@
|
|
}
|
|
|
|
ret = bin_search(b, key, level, &slot);
|
|
-
|
|
if (level != 0) {
|
|
if (ret && slot > 0)
|
|
slot -= 1;
|
|
@@ -1614,16 +1460,7 @@
|
|
if ((p->search_for_split || ins_len > 0) &&
|
|
btrfs_header_nritems(b) >=
|
|
BTRFS_NODEPTRS_PER_BLOCK(root) - 3) {
|
|
- int sret;
|
|
-
|
|
- sret = reada_for_balance(root, p, level);
|
|
- if (sret)
|
|
- goto again;
|
|
-
|
|
- btrfs_set_path_blocking(p);
|
|
- sret = split_node(trans, root, p, level);
|
|
- btrfs_clear_path_blocking(p, NULL);
|
|
-
|
|
+ int sret = split_node(trans, root, p, level);
|
|
BUG_ON(sret > 0);
|
|
if (sret) {
|
|
ret = sret;
|
|
@@ -1631,19 +1468,9 @@
|
|
}
|
|
b = p->nodes[level];
|
|
slot = p->slots[level];
|
|
- } else if (ins_len < 0 &&
|
|
- btrfs_header_nritems(b) <
|
|
- BTRFS_NODEPTRS_PER_BLOCK(root) / 4) {
|
|
- int sret;
|
|
-
|
|
- sret = reada_for_balance(root, p, level);
|
|
- if (sret)
|
|
- goto again;
|
|
-
|
|
- btrfs_set_path_blocking(p);
|
|
- sret = balance_level(trans, root, p, level);
|
|
- btrfs_clear_path_blocking(p, NULL);
|
|
-
|
|
+ } else if (ins_len < 0) {
|
|
+ int sret = balance_level(trans, root, p,
|
|
+ level);
|
|
if (sret) {
|
|
ret = sret;
|
|
goto done;
|
|
@@ -1677,7 +1504,7 @@
|
|
* of the btree by dropping locks before
|
|
* we read.
|
|
*/
|
|
- if (level > 0) {
|
|
+ if (level > 1) {
|
|
btrfs_release_path(NULL, p);
|
|
if (tmp)
|
|
free_extent_buffer(tmp);
|
|
@@ -1692,7 +1519,6 @@
|
|
free_extent_buffer(tmp);
|
|
goto again;
|
|
} else {
|
|
- btrfs_set_path_blocking(p);
|
|
if (tmp)
|
|
free_extent_buffer(tmp);
|
|
if (should_reada)
|
|
@@ -1702,29 +1528,14 @@
|
|
b = read_node_slot(root, b, slot);
|
|
}
|
|
}
|
|
- if (!p->skip_locking) {
|
|
- int lret;
|
|
-
|
|
- btrfs_clear_path_blocking(p, NULL);
|
|
- lret = btrfs_try_spin_lock(b);
|
|
-
|
|
- if (!lret) {
|
|
- btrfs_set_path_blocking(p);
|
|
- btrfs_tree_lock(b);
|
|
- btrfs_clear_path_blocking(p, b);
|
|
- }
|
|
- }
|
|
+ if (!p->skip_locking)
|
|
+ btrfs_tree_lock(b);
|
|
} else {
|
|
p->slots[level] = slot;
|
|
if (ins_len > 0 &&
|
|
btrfs_leaf_free_space(root, b) < ins_len) {
|
|
- int sret;
|
|
-
|
|
- btrfs_set_path_blocking(p);
|
|
- sret = split_leaf(trans, root, key,
|
|
+ int sret = split_leaf(trans, root, key,
|
|
p, ins_len, ret == 0);
|
|
- btrfs_clear_path_blocking(p, NULL);
|
|
-
|
|
BUG_ON(sret > 0);
|
|
if (sret) {
|
|
ret = sret;
|
|
@@ -1738,16 +1549,12 @@
|
|
}
|
|
ret = 1;
|
|
done:
|
|
- /*
|
|
- * we don't really know what they plan on doing with the path
|
|
- * from here on, so for now just mark it as blocking
|
|
- */
|
|
- btrfs_set_path_blocking(p);
|
|
if (prealloc_block.objectid) {
|
|
btrfs_free_reserved_extent(root,
|
|
prealloc_block.objectid,
|
|
prealloc_block.offset);
|
|
}
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
@@ -1771,8 +1578,6 @@
|
|
ret = btrfs_cow_block(trans, root, eb, NULL, 0, &eb, 0);
|
|
BUG_ON(ret);
|
|
|
|
- btrfs_set_lock_blocking(eb);
|
|
-
|
|
parent = eb;
|
|
while (1) {
|
|
level = btrfs_header_level(parent);
|
|
@@ -1797,7 +1602,6 @@
|
|
eb = read_tree_block(root, bytenr, blocksize,
|
|
generation);
|
|
btrfs_tree_lock(eb);
|
|
- btrfs_set_lock_blocking(eb);
|
|
}
|
|
|
|
/*
|
|
@@ -1822,7 +1626,6 @@
|
|
eb = read_tree_block(root, bytenr, blocksize,
|
|
generation);
|
|
btrfs_tree_lock(eb);
|
|
- btrfs_set_lock_blocking(eb);
|
|
}
|
|
|
|
ret = btrfs_cow_block(trans, root, eb, parent, slot,
|
|
@@ -2365,12 +2168,10 @@
|
|
if (slot >= btrfs_header_nritems(upper) - 1)
|
|
return 1;
|
|
|
|
- btrfs_assert_tree_locked(path->nodes[1]);
|
|
+ WARN_ON(!btrfs_tree_locked(path->nodes[1]));
|
|
|
|
right = read_node_slot(root, upper, slot + 1);
|
|
btrfs_tree_lock(right);
|
|
- btrfs_set_lock_blocking(right);
|
|
-
|
|
free_space = btrfs_leaf_free_space(root, right);
|
|
if (free_space < data_size)
|
|
goto out_unlock;
|
|
@@ -2562,12 +2363,10 @@
|
|
if (right_nritems == 0)
|
|
return 1;
|
|
|
|
- btrfs_assert_tree_locked(path->nodes[1]);
|
|
+ WARN_ON(!btrfs_tree_locked(path->nodes[1]));
|
|
|
|
left = read_node_slot(root, path->nodes[1], slot - 1);
|
|
btrfs_tree_lock(left);
|
|
- btrfs_set_lock_blocking(left);
|
|
-
|
|
free_space = btrfs_leaf_free_space(root, left);
|
|
if (free_space < data_size) {
|
|
ret = 1;
|
|
@@ -3026,12 +2825,6 @@
|
|
path->keep_locks = 0;
|
|
BUG_ON(ret);
|
|
|
|
- /*
|
|
- * make sure any changes to the path from split_leaf leave it
|
|
- * in a blocking state
|
|
- */
|
|
- btrfs_set_path_blocking(path);
|
|
-
|
|
leaf = path->nodes[0];
|
|
BUG_ON(btrfs_leaf_free_space(root, leaf) < sizeof(struct btrfs_item));
|
|
|
|
@@ -3561,7 +3354,6 @@
|
|
BUG();
|
|
}
|
|
out:
|
|
- btrfs_unlock_up_safe(path, 1);
|
|
return ret;
|
|
}
|
|
|
|
@@ -3649,22 +3441,15 @@
|
|
{
|
|
int ret;
|
|
u64 root_gen = btrfs_header_generation(path->nodes[1]);
|
|
- u64 parent_start = path->nodes[1]->start;
|
|
- u64 parent_owner = btrfs_header_owner(path->nodes[1]);
|
|
|
|
ret = del_ptr(trans, root, path, 1, path->slots[1]);
|
|
if (ret)
|
|
return ret;
|
|
|
|
- /*
|
|
- * btrfs_free_extent is expensive, we want to make sure we
|
|
- * aren't holding any locks when we call it
|
|
- */
|
|
- btrfs_unlock_up_safe(path, 0);
|
|
-
|
|
ret = btrfs_free_extent(trans, root, bytenr,
|
|
btrfs_level_size(root, 0),
|
|
- parent_start, parent_owner,
|
|
+ path->nodes[1]->start,
|
|
+ btrfs_header_owner(path->nodes[1]),
|
|
root_gen, 0, 1);
|
|
return ret;
|
|
}
|
|
@@ -3936,7 +3721,6 @@
|
|
*/
|
|
if (slot >= nritems) {
|
|
path->slots[level] = slot;
|
|
- btrfs_set_path_blocking(path);
|
|
sret = btrfs_find_next_key(root, path, min_key, level,
|
|
cache_only, min_trans);
|
|
if (sret == 0) {
|
|
@@ -3954,20 +3738,16 @@
|
|
unlock_up(path, level, 1);
|
|
goto out;
|
|
}
|
|
- btrfs_set_path_blocking(path);
|
|
cur = read_node_slot(root, cur, slot);
|
|
|
|
btrfs_tree_lock(cur);
|
|
-
|
|
path->locks[level - 1] = 1;
|
|
path->nodes[level - 1] = cur;
|
|
unlock_up(path, level, 1);
|
|
- btrfs_clear_path_blocking(path, NULL);
|
|
}
|
|
out:
|
|
if (ret == 0)
|
|
memcpy(min_key, &found_key, sizeof(found_key));
|
|
- btrfs_set_path_blocking(path);
|
|
return ret;
|
|
}
|
|
|
|
@@ -4063,7 +3843,6 @@
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
- btrfs_set_path_blocking(path);
|
|
nritems = btrfs_header_nritems(path->nodes[0]);
|
|
/*
|
|
* by releasing the path above we dropped all our locks. A balance
|
|
@@ -4094,16 +3873,14 @@
|
|
free_extent_buffer(next);
|
|
}
|
|
|
|
- /* the path was set to blocking above */
|
|
if (level == 1 && (path->locks[1] || path->skip_locking) &&
|
|
path->reada)
|
|
reada_for_search(root, path, level, slot, 0);
|
|
|
|
next = read_node_slot(root, c, slot);
|
|
if (!path->skip_locking) {
|
|
- btrfs_assert_tree_locked(c);
|
|
+ WARN_ON(!btrfs_tree_locked(c));
|
|
btrfs_tree_lock(next);
|
|
- btrfs_set_lock_blocking(next);
|
|
}
|
|
break;
|
|
}
|
|
@@ -4120,15 +3897,12 @@
|
|
path->locks[level] = 1;
|
|
if (!level)
|
|
break;
|
|
-
|
|
- btrfs_set_path_blocking(path);
|
|
if (level == 1 && path->locks[1] && path->reada)
|
|
reada_for_search(root, path, level, slot, 0);
|
|
next = read_node_slot(root, next, 0);
|
|
if (!path->skip_locking) {
|
|
- btrfs_assert_tree_locked(path->nodes[level]);
|
|
+ WARN_ON(!btrfs_tree_locked(path->nodes[level]));
|
|
btrfs_tree_lock(next);
|
|
- btrfs_set_lock_blocking(next);
|
|
}
|
|
}
|
|
done:
|
|
@@ -4153,7 +3927,6 @@
|
|
|
|
while (1) {
|
|
if (path->slots[0] == 0) {
|
|
- btrfs_set_path_blocking(path);
|
|
ret = btrfs_prev_leaf(root, path);
|
|
if (ret != 0)
|
|
return ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/ctree.h linux-2.6.29-rc3.owrt/fs/btrfs/ctree.h
|
|
--- linux-2.6.29.owrt/fs/btrfs/ctree.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/ctree.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -43,7 +43,11 @@
|
|
|
|
#define BTRFS_ACL_NOT_CACHED ((void *)-1)
|
|
|
|
-#define BTRFS_MAX_LEVEL 8
|
|
+#ifdef CONFIG_LOCKDEP
|
|
+# define BTRFS_MAX_LEVEL 7
|
|
+#else
|
|
+# define BTRFS_MAX_LEVEL 8
|
|
+#endif
|
|
|
|
/* holds pointers to all of the tree roots */
|
|
#define BTRFS_ROOT_TREE_OBJECTID 1ULL
|
|
@@ -450,11 +454,17 @@
|
|
__le32 nsec;
|
|
} __attribute__ ((__packed__));
|
|
|
|
-enum btrfs_compression_type {
|
|
+typedef enum {
|
|
BTRFS_COMPRESS_NONE = 0,
|
|
BTRFS_COMPRESS_ZLIB = 1,
|
|
BTRFS_COMPRESS_LAST = 2,
|
|
-};
|
|
+} btrfs_compression_type;
|
|
+
|
|
+/* we don't understand any encryption methods right now */
|
|
+typedef enum {
|
|
+ BTRFS_ENCRYPTION_NONE = 0,
|
|
+ BTRFS_ENCRYPTION_LAST = 1,
|
|
+} btrfs_encryption_type;
|
|
|
|
struct btrfs_inode_item {
|
|
/* nfs style generation number */
|
|
@@ -596,27 +606,13 @@
|
|
|
|
struct btrfs_space_info {
|
|
u64 flags;
|
|
-
|
|
- u64 total_bytes; /* total bytes in the space */
|
|
- u64 bytes_used; /* total bytes used on disk */
|
|
- u64 bytes_pinned; /* total bytes pinned, will be freed when the
|
|
- transaction finishes */
|
|
- u64 bytes_reserved; /* total bytes the allocator has reserved for
|
|
- current allocations */
|
|
- u64 bytes_readonly; /* total bytes that are read only */
|
|
-
|
|
- /* delalloc accounting */
|
|
- u64 bytes_delalloc; /* number of bytes reserved for allocation,
|
|
- this space is not necessarily reserved yet
|
|
- by the allocator */
|
|
- u64 bytes_may_use; /* number of bytes that may be used for
|
|
- delalloc */
|
|
-
|
|
- int full; /* indicates that we cannot allocate any more
|
|
- chunks for this space */
|
|
- int force_alloc; /* set if we need to force a chunk alloc for
|
|
- this space */
|
|
-
|
|
+ u64 total_bytes;
|
|
+ u64 bytes_used;
|
|
+ u64 bytes_pinned;
|
|
+ u64 bytes_reserved;
|
|
+ u64 bytes_readonly;
|
|
+ int full;
|
|
+ int force_alloc;
|
|
struct list_head list;
|
|
|
|
/* for block groups in our same type */
|
|
@@ -705,7 +701,9 @@
|
|
struct btrfs_transaction *running_transaction;
|
|
wait_queue_head_t transaction_throttle;
|
|
wait_queue_head_t transaction_wait;
|
|
+
|
|
wait_queue_head_t async_submit_wait;
|
|
+ wait_queue_head_t tree_log_wait;
|
|
|
|
struct btrfs_super_block super_copy;
|
|
struct btrfs_super_block super_for_commit;
|
|
@@ -713,6 +711,7 @@
|
|
struct super_block *sb;
|
|
struct inode *btree_inode;
|
|
struct backing_dev_info bdi;
|
|
+ spinlock_t hash_lock;
|
|
struct mutex trans_mutex;
|
|
struct mutex tree_log_mutex;
|
|
struct mutex transaction_kthread_mutex;
|
|
@@ -731,6 +730,10 @@
|
|
atomic_t async_submit_draining;
|
|
atomic_t nr_async_bios;
|
|
atomic_t async_delalloc_pages;
|
|
+ atomic_t tree_log_writers;
|
|
+ atomic_t tree_log_commit;
|
|
+ unsigned long tree_log_batch;
|
|
+ u64 tree_log_transid;
|
|
|
|
/*
|
|
* this is used by the balancing code to wait for all the pending
|
|
@@ -784,14 +787,7 @@
|
|
struct list_head dirty_cowonly_roots;
|
|
|
|
struct btrfs_fs_devices *fs_devices;
|
|
-
|
|
- /*
|
|
- * the space_info list is almost entirely read only. It only changes
|
|
- * when we add a new raid type to the FS, and that happens
|
|
- * very rarely. RCU is used to protect it.
|
|
- */
|
|
struct list_head space_info;
|
|
-
|
|
spinlock_t delalloc_lock;
|
|
spinlock_t new_trans_lock;
|
|
u64 delalloc_bytes;
|
|
@@ -837,14 +833,7 @@
|
|
struct kobject root_kobj;
|
|
struct completion kobj_unregister;
|
|
struct mutex objectid_mutex;
|
|
-
|
|
struct mutex log_mutex;
|
|
- wait_queue_head_t log_writer_wait;
|
|
- wait_queue_head_t log_commit_wait[2];
|
|
- atomic_t log_writers;
|
|
- atomic_t log_commit[2];
|
|
- unsigned long log_transid;
|
|
- unsigned long log_batch;
|
|
|
|
u64 objectid;
|
|
u64 last_trans;
|
|
@@ -1732,8 +1721,7 @@
|
|
u64 empty_size);
|
|
struct extent_buffer *btrfs_init_new_buffer(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *root,
|
|
- u64 bytenr, u32 blocksize,
|
|
- int level);
|
|
+ u64 bytenr, u32 blocksize);
|
|
int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *root,
|
|
u64 num_bytes, u64 parent, u64 min_bytes,
|
|
@@ -1803,18 +1791,6 @@
|
|
int btrfs_cleanup_reloc_trees(struct btrfs_root *root);
|
|
int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len);
|
|
u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags);
|
|
-void btrfs_set_inode_space_info(struct btrfs_root *root, struct inode *ionde);
|
|
-void btrfs_clear_space_info_full(struct btrfs_fs_info *info);
|
|
-
|
|
-int btrfs_check_metadata_free_space(struct btrfs_root *root);
|
|
-int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode,
|
|
- u64 bytes);
|
|
-void btrfs_free_reserved_data_space(struct btrfs_root *root,
|
|
- struct inode *inode, u64 bytes);
|
|
-void btrfs_delalloc_reserve_space(struct btrfs_root *root, struct inode *inode,
|
|
- u64 bytes);
|
|
-void btrfs_delalloc_free_space(struct btrfs_root *root, struct inode *inode,
|
|
- u64 bytes);
|
|
/* ctree.c */
|
|
int btrfs_previous_item(struct btrfs_root *root,
|
|
struct btrfs_path *path, u64 min_objectid,
|
|
@@ -1864,9 +1840,7 @@
|
|
void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p);
|
|
struct btrfs_path *btrfs_alloc_path(void);
|
|
void btrfs_free_path(struct btrfs_path *p);
|
|
-void btrfs_set_path_blocking(struct btrfs_path *p);
|
|
-void btrfs_unlock_up_safe(struct btrfs_path *p, int level);
|
|
-
|
|
+void btrfs_init_path(struct btrfs_path *p);
|
|
int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
|
|
struct btrfs_path *path, int slot, int nr);
|
|
int btrfs_del_leaf(struct btrfs_trans_handle *trans,
|
|
@@ -2060,6 +2034,8 @@
|
|
unsigned long btrfs_force_ra(struct address_space *mapping,
|
|
struct file_ra_state *ra, struct file *file,
|
|
pgoff_t offset, pgoff_t last_index);
|
|
+int btrfs_check_free_space(struct btrfs_root *root, u64 num_required,
|
|
+ int for_del);
|
|
int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page);
|
|
int btrfs_readpage(struct file *file, struct page *page);
|
|
void btrfs_delete_inode(struct inode *inode);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/disk-io.c linux-2.6.29-rc3.owrt/fs/btrfs/disk-io.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/disk-io.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/disk-io.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -16,6 +16,7 @@
|
|
* Boston, MA 021110-1307, USA.
|
|
*/
|
|
|
|
+#include <linux/version.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/blkdev.h>
|
|
#include <linux/scatterlist.h>
|
|
@@ -75,40 +76,6 @@
|
|
struct btrfs_work work;
|
|
};
|
|
|
|
-/* These are used to set the lockdep class on the extent buffer locks.
|
|
- * The class is set by the readpage_end_io_hook after the buffer has
|
|
- * passed csum validation but before the pages are unlocked.
|
|
- *
|
|
- * The lockdep class is also set by btrfs_init_new_buffer on freshly
|
|
- * allocated blocks.
|
|
- *
|
|
- * The class is based on the level in the tree block, which allows lockdep
|
|
- * to know that lower nodes nest inside the locks of higher nodes.
|
|
- *
|
|
- * We also add a check to make sure the highest level of the tree is
|
|
- * the same as our lockdep setup here. If BTRFS_MAX_LEVEL changes, this
|
|
- * code needs update as well.
|
|
- */
|
|
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
-# if BTRFS_MAX_LEVEL != 8
|
|
-# error
|
|
-# endif
|
|
-static struct lock_class_key btrfs_eb_class[BTRFS_MAX_LEVEL + 1];
|
|
-static const char *btrfs_eb_name[BTRFS_MAX_LEVEL + 1] = {
|
|
- /* leaf */
|
|
- "btrfs-extent-00",
|
|
- "btrfs-extent-01",
|
|
- "btrfs-extent-02",
|
|
- "btrfs-extent-03",
|
|
- "btrfs-extent-04",
|
|
- "btrfs-extent-05",
|
|
- "btrfs-extent-06",
|
|
- "btrfs-extent-07",
|
|
- /* highest possible level */
|
|
- "btrfs-extent-08",
|
|
-};
|
|
-#endif
|
|
-
|
|
/*
|
|
* extents on the btree inode are pretty simple, there's one extent
|
|
* that covers the entire device
|
|
@@ -381,15 +348,6 @@
|
|
return ret;
|
|
}
|
|
|
|
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
-void btrfs_set_buffer_lockdep_class(struct extent_buffer *eb, int level)
|
|
-{
|
|
- lockdep_set_class_and_name(&eb->lock,
|
|
- &btrfs_eb_class[level],
|
|
- btrfs_eb_name[level]);
|
|
-}
|
|
-#endif
|
|
-
|
|
static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,
|
|
struct extent_state *state)
|
|
{
|
|
@@ -435,8 +393,6 @@
|
|
}
|
|
found_level = btrfs_header_level(eb);
|
|
|
|
- btrfs_set_buffer_lockdep_class(eb, found_level);
|
|
-
|
|
ret = csum_tree_block(root, eb, 1);
|
|
if (ret)
|
|
ret = -EIO;
|
|
@@ -844,7 +800,7 @@
|
|
ret = btree_read_extent_buffer_pages(root, buf, 0, parent_transid);
|
|
|
|
if (ret == 0)
|
|
- set_bit(EXTENT_BUFFER_UPTODATE, &buf->bflags);
|
|
+ buf->flags |= EXTENT_UPTODATE;
|
|
else
|
|
WARN_ON(1);
|
|
return buf;
|
|
@@ -857,11 +813,7 @@
|
|
struct inode *btree_inode = root->fs_info->btree_inode;
|
|
if (btrfs_header_generation(buf) ==
|
|
root->fs_info->running_transaction->transid) {
|
|
- btrfs_assert_tree_locked(buf);
|
|
-
|
|
- /* ugh, clear_extent_buffer_dirty can be expensive */
|
|
- btrfs_set_lock_blocking(buf);
|
|
-
|
|
+ WARN_ON(!btrfs_tree_locked(buf));
|
|
clear_extent_buffer_dirty(&BTRFS_I(btree_inode)->io_tree,
|
|
buf);
|
|
}
|
|
@@ -898,14 +850,6 @@
|
|
spin_lock_init(&root->list_lock);
|
|
mutex_init(&root->objectid_mutex);
|
|
mutex_init(&root->log_mutex);
|
|
- init_waitqueue_head(&root->log_writer_wait);
|
|
- init_waitqueue_head(&root->log_commit_wait[0]);
|
|
- init_waitqueue_head(&root->log_commit_wait[1]);
|
|
- atomic_set(&root->log_commit[0], 0);
|
|
- atomic_set(&root->log_commit[1], 0);
|
|
- atomic_set(&root->log_writers, 0);
|
|
- root->log_batch = 0;
|
|
- root->log_transid = 0;
|
|
extent_io_tree_init(&root->dirty_log_pages,
|
|
fs_info->btree_inode->i_mapping, GFP_NOFS);
|
|
|
|
@@ -990,16 +934,15 @@
|
|
return 0;
|
|
}
|
|
|
|
-static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
|
|
- struct btrfs_fs_info *fs_info)
|
|
+int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
|
|
+ struct btrfs_fs_info *fs_info)
|
|
{
|
|
struct btrfs_root *root;
|
|
struct btrfs_root *tree_root = fs_info->tree_root;
|
|
- struct extent_buffer *leaf;
|
|
|
|
root = kzalloc(sizeof(*root), GFP_NOFS);
|
|
if (!root)
|
|
- return ERR_PTR(-ENOMEM);
|
|
+ return -ENOMEM;
|
|
|
|
__setup_root(tree_root->nodesize, tree_root->leafsize,
|
|
tree_root->sectorsize, tree_root->stripesize,
|
|
@@ -1008,23 +951,12 @@
|
|
root->root_key.objectid = BTRFS_TREE_LOG_OBJECTID;
|
|
root->root_key.type = BTRFS_ROOT_ITEM_KEY;
|
|
root->root_key.offset = BTRFS_TREE_LOG_OBJECTID;
|
|
- /*
|
|
- * log trees do not get reference counted because they go away
|
|
- * before a real commit is actually done. They do store pointers
|
|
- * to file data extents, and those reference counts still get
|
|
- * updated (along with back refs to the log tree).
|
|
- */
|
|
root->ref_cows = 0;
|
|
|
|
- leaf = btrfs_alloc_free_block(trans, root, root->leafsize,
|
|
- 0, BTRFS_TREE_LOG_OBJECTID,
|
|
- trans->transid, 0, 0, 0);
|
|
- if (IS_ERR(leaf)) {
|
|
- kfree(root);
|
|
- return ERR_CAST(leaf);
|
|
- }
|
|
+ root->node = btrfs_alloc_free_block(trans, root, root->leafsize,
|
|
+ 0, BTRFS_TREE_LOG_OBJECTID,
|
|
+ trans->transid, 0, 0, 0);
|
|
|
|
- root->node = leaf;
|
|
btrfs_set_header_nritems(root->node, 0);
|
|
btrfs_set_header_level(root->node, 0);
|
|
btrfs_set_header_bytenr(root->node, root->node->start);
|
|
@@ -1036,48 +968,7 @@
|
|
BTRFS_FSID_SIZE);
|
|
btrfs_mark_buffer_dirty(root->node);
|
|
btrfs_tree_unlock(root->node);
|
|
- return root;
|
|
-}
|
|
-
|
|
-int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
|
|
- struct btrfs_fs_info *fs_info)
|
|
-{
|
|
- struct btrfs_root *log_root;
|
|
-
|
|
- log_root = alloc_log_tree(trans, fs_info);
|
|
- if (IS_ERR(log_root))
|
|
- return PTR_ERR(log_root);
|
|
- WARN_ON(fs_info->log_root_tree);
|
|
- fs_info->log_root_tree = log_root;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
|
|
- struct btrfs_root *root)
|
|
-{
|
|
- struct btrfs_root *log_root;
|
|
- struct btrfs_inode_item *inode_item;
|
|
-
|
|
- log_root = alloc_log_tree(trans, root->fs_info);
|
|
- if (IS_ERR(log_root))
|
|
- return PTR_ERR(log_root);
|
|
-
|
|
- log_root->last_trans = trans->transid;
|
|
- log_root->root_key.offset = root->root_key.objectid;
|
|
-
|
|
- inode_item = &log_root->root_item.inode;
|
|
- inode_item->generation = cpu_to_le64(1);
|
|
- inode_item->size = cpu_to_le64(3);
|
|
- inode_item->nlink = cpu_to_le32(1);
|
|
- inode_item->nbytes = cpu_to_le64(root->leafsize);
|
|
- inode_item->mode = cpu_to_le32(S_IFDIR | 0755);
|
|
-
|
|
- btrfs_set_root_bytenr(&log_root->root_item, log_root->node->start);
|
|
- btrfs_set_root_generation(&log_root->root_item, trans->transid);
|
|
-
|
|
- WARN_ON(root->log_root);
|
|
- root->log_root = log_root;
|
|
- root->log_transid = 0;
|
|
+ fs_info->log_root_tree = root;
|
|
return 0;
|
|
}
|
|
|
|
@@ -1245,6 +1136,7 @@
|
|
{
|
|
struct btrfs_fs_info *info = (struct btrfs_fs_info *)congested_data;
|
|
int ret = 0;
|
|
+ struct list_head *cur;
|
|
struct btrfs_device *device;
|
|
struct backing_dev_info *bdi;
|
|
#if 0
|
|
@@ -1252,7 +1144,8 @@
|
|
btrfs_congested_async(info, 0))
|
|
return 1;
|
|
#endif
|
|
- list_for_each_entry(device, &info->fs_devices->devices, dev_list) {
|
|
+ list_for_each(cur, &info->fs_devices->devices) {
|
|
+ device = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (!device->bdev)
|
|
continue;
|
|
bdi = blk_get_backing_dev_info(device->bdev);
|
|
@@ -1270,11 +1163,13 @@
|
|
*/
|
|
static void __unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
|
|
{
|
|
+ struct list_head *cur;
|
|
struct btrfs_device *device;
|
|
struct btrfs_fs_info *info;
|
|
|
|
info = (struct btrfs_fs_info *)bdi->unplug_io_data;
|
|
- list_for_each_entry(device, &info->fs_devices->devices, dev_list) {
|
|
+ list_for_each(cur, &info->fs_devices->devices) {
|
|
+ device = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (!device->bdev)
|
|
continue;
|
|
|
|
@@ -1552,6 +1447,7 @@
|
|
INIT_LIST_HEAD(&fs_info->dead_roots);
|
|
INIT_LIST_HEAD(&fs_info->hashers);
|
|
INIT_LIST_HEAD(&fs_info->delalloc_inodes);
|
|
+ spin_lock_init(&fs_info->hash_lock);
|
|
spin_lock_init(&fs_info->delalloc_lock);
|
|
spin_lock_init(&fs_info->new_trans_lock);
|
|
spin_lock_init(&fs_info->ref_cache_lock);
|
|
@@ -1639,6 +1535,10 @@
|
|
init_waitqueue_head(&fs_info->transaction_throttle);
|
|
init_waitqueue_head(&fs_info->transaction_wait);
|
|
init_waitqueue_head(&fs_info->async_submit_wait);
|
|
+ init_waitqueue_head(&fs_info->tree_log_wait);
|
|
+ atomic_set(&fs_info->tree_log_commit, 0);
|
|
+ atomic_set(&fs_info->tree_log_writers, 0);
|
|
+ fs_info->tree_log_transid = 0;
|
|
|
|
__setup_root(4096, 4096, 4096, 4096, tree_root,
|
|
fs_info, BTRFS_ROOT_TREE_OBJECTID);
|
|
@@ -1727,8 +1627,6 @@
|
|
* low idle thresh
|
|
*/
|
|
fs_info->endio_workers.idle_thresh = 4;
|
|
- fs_info->endio_meta_workers.idle_thresh = 4;
|
|
-
|
|
fs_info->endio_write_workers.idle_thresh = 64;
|
|
fs_info->endio_meta_write_workers.idle_thresh = 64;
|
|
|
|
@@ -1822,6 +1720,7 @@
|
|
ret = find_and_setup_root(tree_root, fs_info,
|
|
BTRFS_DEV_TREE_OBJECTID, dev_root);
|
|
dev_root->track_dirty = 1;
|
|
+
|
|
if (ret)
|
|
goto fail_extent_root;
|
|
|
|
@@ -1841,13 +1740,13 @@
|
|
fs_info->system_alloc_profile = fs_info->metadata_alloc_profile;
|
|
fs_info->cleaner_kthread = kthread_run(cleaner_kthread, tree_root,
|
|
"btrfs-cleaner");
|
|
- if (IS_ERR(fs_info->cleaner_kthread))
|
|
+ if (!fs_info->cleaner_kthread)
|
|
goto fail_csum_root;
|
|
|
|
fs_info->transaction_kthread = kthread_run(transaction_kthread,
|
|
tree_root,
|
|
"btrfs-transaction");
|
|
- if (IS_ERR(fs_info->transaction_kthread))
|
|
+ if (!fs_info->transaction_kthread)
|
|
goto fail_cleaner;
|
|
|
|
if (btrfs_super_log_root(disk_super) != 0) {
|
|
@@ -1929,14 +1828,13 @@
|
|
fail_iput:
|
|
invalidate_inode_pages2(fs_info->btree_inode->i_mapping);
|
|
iput(fs_info->btree_inode);
|
|
-
|
|
+fail:
|
|
btrfs_close_devices(fs_info->fs_devices);
|
|
btrfs_mapping_tree_free(&fs_info->mapping_tree);
|
|
- bdi_destroy(&fs_info->bdi);
|
|
|
|
-fail:
|
|
kfree(extent_root);
|
|
kfree(tree_root);
|
|
+ bdi_destroy(&fs_info->bdi);
|
|
kfree(fs_info);
|
|
kfree(chunk_root);
|
|
kfree(dev_root);
|
|
@@ -2097,6 +1995,7 @@
|
|
|
|
int write_all_supers(struct btrfs_root *root, int max_mirrors)
|
|
{
|
|
+ struct list_head *cur;
|
|
struct list_head *head = &root->fs_info->fs_devices->devices;
|
|
struct btrfs_device *dev;
|
|
struct btrfs_super_block *sb;
|
|
@@ -2112,7 +2011,8 @@
|
|
|
|
sb = &root->fs_info->super_for_commit;
|
|
dev_item = &sb->dev_item;
|
|
- list_for_each_entry(dev, head, dev_list) {
|
|
+ list_for_each(cur, head) {
|
|
+ dev = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (!dev->bdev) {
|
|
total_errors++;
|
|
continue;
|
|
@@ -2145,7 +2045,8 @@
|
|
}
|
|
|
|
total_errors = 0;
|
|
- list_for_each_entry(dev, head, dev_list) {
|
|
+ list_for_each(cur, head) {
|
|
+ dev = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (!dev->bdev)
|
|
continue;
|
|
if (!dev->in_fs_metadata || !dev->writeable)
|
|
@@ -2359,9 +2260,7 @@
|
|
u64 transid = btrfs_header_generation(buf);
|
|
struct inode *btree_inode = root->fs_info->btree_inode;
|
|
|
|
- btrfs_set_lock_blocking(buf);
|
|
-
|
|
- btrfs_assert_tree_locked(buf);
|
|
+ WARN_ON(!btrfs_tree_locked(buf));
|
|
if (transid != root->fs_info->generation) {
|
|
printk(KERN_CRIT "btrfs transid mismatch buffer %llu, "
|
|
"found %llu running %llu\n",
|
|
@@ -2403,13 +2302,14 @@
|
|
int ret;
|
|
ret = btree_read_extent_buffer_pages(root, buf, 0, parent_transid);
|
|
if (ret == 0)
|
|
- set_bit(EXTENT_BUFFER_UPTODATE, &buf->bflags);
|
|
+ buf->flags |= EXTENT_UPTODATE;
|
|
return ret;
|
|
}
|
|
|
|
int btree_lock_page_hook(struct page *page)
|
|
{
|
|
struct inode *inode = page->mapping->host;
|
|
+ struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
|
|
struct extent_buffer *eb;
|
|
unsigned long len;
|
|
@@ -2424,7 +2324,9 @@
|
|
goto out;
|
|
|
|
btrfs_tree_lock(eb);
|
|
+ spin_lock(&root->fs_info->hash_lock);
|
|
btrfs_set_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN);
|
|
+ spin_unlock(&root->fs_info->hash_lock);
|
|
btrfs_tree_unlock(eb);
|
|
free_extent_buffer(eb);
|
|
out:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/disk-io.h linux-2.6.29-rc3.owrt/fs/btrfs/disk-io.h
|
|
--- linux-2.6.29.owrt/fs/btrfs/disk-io.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/disk-io.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -98,17 +98,5 @@
|
|
struct btrfs_fs_info *fs_info);
|
|
int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
|
|
struct btrfs_fs_info *fs_info);
|
|
-int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
|
|
- struct btrfs_root *root);
|
|
int btree_lock_page_hook(struct page *page);
|
|
-
|
|
-
|
|
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
-void btrfs_set_buffer_lockdep_class(struct extent_buffer *eb, int level);
|
|
-#else
|
|
-static inline void btrfs_set_buffer_lockdep_class(struct extent_buffer *eb,
|
|
- int level)
|
|
-{
|
|
-}
|
|
-#endif
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/extent_io.c linux-2.6.29-rc3.owrt/fs/btrfs/extent_io.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/extent_io.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/extent_io.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -9,6 +9,7 @@
|
|
#include <linux/spinlock.h>
|
|
#include <linux/blkdev.h>
|
|
#include <linux/swap.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/writeback.h>
|
|
#include <linux/pagevec.h>
|
|
#include "extent_io.h"
|
|
@@ -30,7 +31,7 @@
|
|
static LIST_HEAD(states);
|
|
|
|
#define LEAK_DEBUG 0
|
|
-#if LEAK_DEBUG
|
|
+#ifdef LEAK_DEBUG
|
|
static DEFINE_SPINLOCK(leak_lock);
|
|
#endif
|
|
|
|
@@ -119,7 +120,7 @@
|
|
static struct extent_state *alloc_extent_state(gfp_t mask)
|
|
{
|
|
struct extent_state *state;
|
|
-#if LEAK_DEBUG
|
|
+#ifdef LEAK_DEBUG
|
|
unsigned long flags;
|
|
#endif
|
|
|
|
@@ -129,7 +130,7 @@
|
|
state->state = 0;
|
|
state->private = 0;
|
|
state->tree = NULL;
|
|
-#if LEAK_DEBUG
|
|
+#ifdef LEAK_DEBUG
|
|
spin_lock_irqsave(&leak_lock, flags);
|
|
list_add(&state->leak_list, &states);
|
|
spin_unlock_irqrestore(&leak_lock, flags);
|
|
@@ -144,11 +145,11 @@
|
|
if (!state)
|
|
return;
|
|
if (atomic_dec_and_test(&state->refs)) {
|
|
-#if LEAK_DEBUG
|
|
+#ifdef LEAK_DEBUG
|
|
unsigned long flags;
|
|
#endif
|
|
WARN_ON(state->tree);
|
|
-#if LEAK_DEBUG
|
|
+#ifdef LEAK_DEBUG
|
|
spin_lock_irqsave(&leak_lock, flags);
|
|
list_del(&state->leak_list);
|
|
spin_unlock_irqrestore(&leak_lock, flags);
|
|
@@ -415,6 +416,8 @@
|
|
|
|
node = tree_insert(&tree->state, prealloc->end, &prealloc->rb_node);
|
|
if (node) {
|
|
+ struct extent_state *found;
|
|
+ found = rb_entry(node, struct extent_state, rb_node);
|
|
free_extent_state(prealloc);
|
|
return -EEXIST;
|
|
}
|
|
@@ -2375,6 +2378,11 @@
|
|
int scanned = 0;
|
|
int range_whole = 0;
|
|
|
|
+ if (wbc->nonblocking && bdi_write_congested(bdi)) {
|
|
+ wbc->encountered_congestion = 1;
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
pagevec_init(&pvec, 0);
|
|
if (wbc->range_cyclic) {
|
|
index = mapping->writeback_index; /* Start from prev offset */
|
|
@@ -2847,98 +2855,6 @@
|
|
return sector;
|
|
}
|
|
|
|
-int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|
- __u64 start, __u64 len, get_extent_t *get_extent)
|
|
-{
|
|
- int ret;
|
|
- u64 off = start;
|
|
- u64 max = start + len;
|
|
- u32 flags = 0;
|
|
- u64 disko = 0;
|
|
- struct extent_map *em = NULL;
|
|
- int end = 0;
|
|
- u64 em_start = 0, em_len = 0;
|
|
- unsigned long emflags;
|
|
- ret = 0;
|
|
-
|
|
- if (len == 0)
|
|
- return -EINVAL;
|
|
-
|
|
- lock_extent(&BTRFS_I(inode)->io_tree, start, start + len,
|
|
- GFP_NOFS);
|
|
- em = get_extent(inode, NULL, 0, off, max - off, 0);
|
|
- if (!em)
|
|
- goto out;
|
|
- if (IS_ERR(em)) {
|
|
- ret = PTR_ERR(em);
|
|
- goto out;
|
|
- }
|
|
- while (!end) {
|
|
- off = em->start + em->len;
|
|
- if (off >= max)
|
|
- end = 1;
|
|
-
|
|
- em_start = em->start;
|
|
- em_len = em->len;
|
|
-
|
|
- disko = 0;
|
|
- flags = 0;
|
|
-
|
|
- switch (em->block_start) {
|
|
- case EXTENT_MAP_LAST_BYTE:
|
|
- end = 1;
|
|
- flags |= FIEMAP_EXTENT_LAST;
|
|
- break;
|
|
- case EXTENT_MAP_HOLE:
|
|
- flags |= FIEMAP_EXTENT_UNWRITTEN;
|
|
- break;
|
|
- case EXTENT_MAP_INLINE:
|
|
- flags |= (FIEMAP_EXTENT_DATA_INLINE |
|
|
- FIEMAP_EXTENT_NOT_ALIGNED);
|
|
- break;
|
|
- case EXTENT_MAP_DELALLOC:
|
|
- flags |= (FIEMAP_EXTENT_DELALLOC |
|
|
- FIEMAP_EXTENT_UNKNOWN);
|
|
- break;
|
|
- default:
|
|
- disko = em->block_start;
|
|
- break;
|
|
- }
|
|
- if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags))
|
|
- flags |= FIEMAP_EXTENT_ENCODED;
|
|
-
|
|
- emflags = em->flags;
|
|
- free_extent_map(em);
|
|
- em = NULL;
|
|
-
|
|
- if (!end) {
|
|
- em = get_extent(inode, NULL, 0, off, max - off, 0);
|
|
- if (!em)
|
|
- goto out;
|
|
- if (IS_ERR(em)) {
|
|
- ret = PTR_ERR(em);
|
|
- goto out;
|
|
- }
|
|
- emflags = em->flags;
|
|
- }
|
|
- if (test_bit(EXTENT_FLAG_VACANCY, &emflags)) {
|
|
- flags |= FIEMAP_EXTENT_LAST;
|
|
- end = 1;
|
|
- }
|
|
-
|
|
- ret = fiemap_fill_next_extent(fieinfo, em_start, disko,
|
|
- em_len, flags);
|
|
- if (ret)
|
|
- goto out_free;
|
|
- }
|
|
-out_free:
|
|
- free_extent_map(em);
|
|
-out:
|
|
- unlock_extent(&BTRFS_I(inode)->io_tree, start, start + len,
|
|
- GFP_NOFS);
|
|
- return ret;
|
|
-}
|
|
-
|
|
static inline struct page *extent_buffer_page(struct extent_buffer *eb,
|
|
unsigned long i)
|
|
{
|
|
@@ -2976,17 +2892,15 @@
|
|
gfp_t mask)
|
|
{
|
|
struct extent_buffer *eb = NULL;
|
|
-#if LEAK_DEBUG
|
|
+#ifdef LEAK_DEBUG
|
|
unsigned long flags;
|
|
#endif
|
|
|
|
eb = kmem_cache_zalloc(extent_buffer_cache, mask);
|
|
eb->start = start;
|
|
eb->len = len;
|
|
- spin_lock_init(&eb->lock);
|
|
- init_waitqueue_head(&eb->lock_wq);
|
|
-
|
|
-#if LEAK_DEBUG
|
|
+ mutex_init(&eb->mutex);
|
|
+#ifdef LEAK_DEBUG
|
|
spin_lock_irqsave(&leak_lock, flags);
|
|
list_add(&eb->leak_list, &buffers);
|
|
spin_unlock_irqrestore(&leak_lock, flags);
|
|
@@ -2998,7 +2912,7 @@
|
|
|
|
static void __free_extent_buffer(struct extent_buffer *eb)
|
|
{
|
|
-#if LEAK_DEBUG
|
|
+#ifdef LEAK_DEBUG
|
|
unsigned long flags;
|
|
spin_lock_irqsave(&leak_lock, flags);
|
|
list_del(&eb->leak_list);
|
|
@@ -3066,7 +2980,8 @@
|
|
unlock_page(p);
|
|
}
|
|
if (uptodate)
|
|
- set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
|
|
+ eb->flags |= EXTENT_UPTODATE;
|
|
+ eb->flags |= EXTENT_BUFFER_FILLED;
|
|
|
|
spin_lock(&tree->buffer_lock);
|
|
exists = buffer_tree_insert(tree, start, &eb->rb_node);
|
|
@@ -3220,7 +3135,7 @@
|
|
unsigned long num_pages;
|
|
|
|
num_pages = num_extent_pages(eb->start, eb->len);
|
|
- clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
|
|
+ eb->flags &= ~EXTENT_UPTODATE;
|
|
|
|
clear_extent_uptodate(tree, eb->start, eb->start + eb->len - 1,
|
|
GFP_NOFS);
|
|
@@ -3291,7 +3206,7 @@
|
|
struct page *page;
|
|
int pg_uptodate = 1;
|
|
|
|
- if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
|
|
+ if (eb->flags & EXTENT_UPTODATE)
|
|
return 1;
|
|
|
|
ret = test_range_bit(tree, eb->start, eb->start + eb->len - 1,
|
|
@@ -3327,7 +3242,7 @@
|
|
struct bio *bio = NULL;
|
|
unsigned long bio_flags = 0;
|
|
|
|
- if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
|
|
+ if (eb->flags & EXTENT_UPTODATE)
|
|
return 0;
|
|
|
|
if (test_range_bit(tree, eb->start, eb->start + eb->len - 1,
|
|
@@ -3358,7 +3273,7 @@
|
|
}
|
|
if (all_uptodate) {
|
|
if (start_i == 0)
|
|
- set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
|
|
+ eb->flags |= EXTENT_UPTODATE;
|
|
goto unlock_exit;
|
|
}
|
|
|
|
@@ -3394,7 +3309,7 @@
|
|
}
|
|
|
|
if (!ret)
|
|
- set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
|
|
+ eb->flags |= EXTENT_UPTODATE;
|
|
return ret;
|
|
|
|
unlock_exit:
|
|
@@ -3491,6 +3406,7 @@
|
|
unmap_extent_buffer(eb, eb->map_token, km);
|
|
eb->map_token = NULL;
|
|
save = 1;
|
|
+ WARN_ON(!mutex_is_locked(&eb->mutex));
|
|
}
|
|
err = map_private_extent_buffer(eb, start, min_len, token, map,
|
|
map_start, map_len, km);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/extent_io.h linux-2.6.29-rc3.owrt/fs/btrfs/extent_io.h
|
|
--- linux-2.6.29.owrt/fs/btrfs/extent_io.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/extent_io.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -22,10 +22,6 @@
|
|
/* flags for bio submission */
|
|
#define EXTENT_BIO_COMPRESSED 1
|
|
|
|
-/* these are bit numbers for test/set bit */
|
|
-#define EXTENT_BUFFER_UPTODATE 0
|
|
-#define EXTENT_BUFFER_BLOCKING 1
|
|
-
|
|
/*
|
|
* page->private values. Every page that is controlled by the extent
|
|
* map has page->private set to one.
|
|
@@ -99,19 +95,11 @@
|
|
unsigned long map_start;
|
|
unsigned long map_len;
|
|
struct page *first_page;
|
|
- unsigned long bflags;
|
|
atomic_t refs;
|
|
+ int flags;
|
|
struct list_head leak_list;
|
|
struct rb_node rb_node;
|
|
-
|
|
- /* the spinlock is used to protect most operations */
|
|
- spinlock_t lock;
|
|
-
|
|
- /*
|
|
- * when we keep the lock held while blocking, waiters go onto
|
|
- * the wq
|
|
- */
|
|
- wait_queue_head_t lock_wq;
|
|
+ struct mutex mutex;
|
|
};
|
|
|
|
struct extent_map_tree;
|
|
@@ -205,8 +193,6 @@
|
|
unsigned from, unsigned to);
|
|
sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
|
|
get_extent_t *get_extent);
|
|
-int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|
- __u64 start, __u64 len, get_extent_t *get_extent);
|
|
int set_range_dirty(struct extent_io_tree *tree, u64 start, u64 end);
|
|
int set_state_private(struct extent_io_tree *tree, u64 start, u64 private);
|
|
int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/extent_map.c linux-2.6.29-rc3.owrt/fs/btrfs/extent_map.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/extent_map.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/extent_map.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -3,6 +3,7 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/module.h>
|
|
#include <linux/spinlock.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/hardirq.h>
|
|
#include "extent_map.h"
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/extent-tree.c linux-2.6.29-rc3.owrt/fs/btrfs/extent-tree.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/extent-tree.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/extent-tree.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -19,8 +19,7 @@
|
|
#include <linux/pagemap.h>
|
|
#include <linux/writeback.h>
|
|
#include <linux/blkdev.h>
|
|
-#include <linux/sort.h>
|
|
-#include <linux/rcupdate.h>
|
|
+#include <linux/version.h>
|
|
#include "compat.h"
|
|
#include "hash.h"
|
|
#include "crc32c.h"
|
|
@@ -31,6 +30,7 @@
|
|
#include "volumes.h"
|
|
#include "locking.h"
|
|
#include "ref-cache.h"
|
|
+#include "compat.h"
|
|
|
|
#define PENDING_EXTENT_INSERT 0
|
|
#define PENDING_EXTENT_DELETE 1
|
|
@@ -61,10 +61,6 @@
|
|
u64 bytenr, u64 num_bytes, int alloc,
|
|
int mark_free);
|
|
|
|
-static int do_chunk_alloc(struct btrfs_trans_handle *trans,
|
|
- struct btrfs_root *extent_root, u64 alloc_bytes,
|
|
- u64 flags, int force);
|
|
-
|
|
static int block_group_bits(struct btrfs_block_group_cache *cache, u64 bits)
|
|
{
|
|
return (cache->flags & bits) == bits;
|
|
@@ -330,34 +326,16 @@
|
|
u64 flags)
|
|
{
|
|
struct list_head *head = &info->space_info;
|
|
+ struct list_head *cur;
|
|
struct btrfs_space_info *found;
|
|
-
|
|
- rcu_read_lock();
|
|
- list_for_each_entry_rcu(found, head, list) {
|
|
- if (found->flags == flags) {
|
|
- rcu_read_unlock();
|
|
+ list_for_each(cur, head) {
|
|
+ found = list_entry(cur, struct btrfs_space_info, list);
|
|
+ if (found->flags == flags)
|
|
return found;
|
|
- }
|
|
}
|
|
- rcu_read_unlock();
|
|
return NULL;
|
|
}
|
|
|
|
-/*
|
|
- * after adding space to the filesystem, we need to clear the full flags
|
|
- * on all the space infos.
|
|
- */
|
|
-void btrfs_clear_space_info_full(struct btrfs_fs_info *info)
|
|
-{
|
|
- struct list_head *head = &info->space_info;
|
|
- struct btrfs_space_info *found;
|
|
-
|
|
- rcu_read_lock();
|
|
- list_for_each_entry_rcu(found, head, list)
|
|
- found->full = 0;
|
|
- rcu_read_unlock();
|
|
-}
|
|
-
|
|
static u64 div_factor(u64 num, int factor)
|
|
{
|
|
if (factor == 10)
|
|
@@ -1348,25 +1326,8 @@
|
|
int btrfs_extent_post_op(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *root)
|
|
{
|
|
- u64 start;
|
|
- u64 end;
|
|
- int ret;
|
|
-
|
|
- while(1) {
|
|
- finish_current_insert(trans, root->fs_info->extent_root, 1);
|
|
- del_pending_extents(trans, root->fs_info->extent_root, 1);
|
|
-
|
|
- /* is there more work to do? */
|
|
- ret = find_first_extent_bit(&root->fs_info->pending_del,
|
|
- 0, &start, &end, EXTENT_WRITEBACK);
|
|
- if (!ret)
|
|
- continue;
|
|
- ret = find_first_extent_bit(&root->fs_info->extent_ins,
|
|
- 0, &start, &end, EXTENT_WRITEBACK);
|
|
- if (!ret)
|
|
- continue;
|
|
- break;
|
|
- }
|
|
+ finish_current_insert(trans, root->fs_info->extent_root, 1);
|
|
+ del_pending_extents(trans, root->fs_info->extent_root, 1);
|
|
return 0;
|
|
}
|
|
|
|
@@ -1564,55 +1525,15 @@
|
|
return ret;
|
|
}
|
|
|
|
-/* when a block goes through cow, we update the reference counts of
|
|
- * everything that block points to. The internal pointers of the block
|
|
- * can be in just about any order, and it is likely to have clusters of
|
|
- * things that are close together and clusters of things that are not.
|
|
- *
|
|
- * To help reduce the seeks that come with updating all of these reference
|
|
- * counts, sort them by byte number before actual updates are done.
|
|
- *
|
|
- * struct refsort is used to match byte number to slot in the btree block.
|
|
- * we sort based on the byte number and then use the slot to actually
|
|
- * find the item.
|
|
- *
|
|
- * struct refsort is smaller than strcut btrfs_item and smaller than
|
|
- * struct btrfs_key_ptr. Since we're currently limited to the page size
|
|
- * for a btree block, there's no way for a kmalloc of refsorts for a
|
|
- * single node to be bigger than a page.
|
|
- */
|
|
-struct refsort {
|
|
- u64 bytenr;
|
|
- u32 slot;
|
|
-};
|
|
-
|
|
-/*
|
|
- * for passing into sort()
|
|
- */
|
|
-static int refsort_cmp(const void *a_void, const void *b_void)
|
|
-{
|
|
- const struct refsort *a = a_void;
|
|
- const struct refsort *b = b_void;
|
|
-
|
|
- if (a->bytenr < b->bytenr)
|
|
- return -1;
|
|
- if (a->bytenr > b->bytenr)
|
|
- return 1;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-
|
|
-noinline int btrfs_inc_ref(struct btrfs_trans_handle *trans,
|
|
- struct btrfs_root *root,
|
|
- struct extent_buffer *orig_buf,
|
|
- struct extent_buffer *buf, u32 *nr_extents)
|
|
+int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
|
|
+ struct extent_buffer *orig_buf, struct extent_buffer *buf,
|
|
+ u32 *nr_extents)
|
|
{
|
|
u64 bytenr;
|
|
u64 ref_root;
|
|
u64 orig_root;
|
|
u64 ref_generation;
|
|
u64 orig_generation;
|
|
- struct refsort *sorted;
|
|
u32 nritems;
|
|
u32 nr_file_extents = 0;
|
|
struct btrfs_key key;
|
|
@@ -1621,8 +1542,6 @@
|
|
int level;
|
|
int ret = 0;
|
|
int faili = 0;
|
|
- int refi = 0;
|
|
- int slot;
|
|
int (*process_func)(struct btrfs_trans_handle *, struct btrfs_root *,
|
|
u64, u64, u64, u64, u64, u64, u64, u64);
|
|
|
|
@@ -1634,9 +1553,6 @@
|
|
nritems = btrfs_header_nritems(buf);
|
|
level = btrfs_header_level(buf);
|
|
|
|
- sorted = kmalloc(sizeof(struct refsort) * nritems, GFP_NOFS);
|
|
- BUG_ON(!sorted);
|
|
-
|
|
if (root->ref_cows) {
|
|
process_func = __btrfs_inc_extent_ref;
|
|
} else {
|
|
@@ -1649,11 +1565,6 @@
|
|
process_func = __btrfs_update_extent_ref;
|
|
}
|
|
|
|
- /*
|
|
- * we make two passes through the items. In the first pass we
|
|
- * only record the byte number and slot. Then we sort based on
|
|
- * byte number and do the actual work based on the sorted results
|
|
- */
|
|
for (i = 0; i < nritems; i++) {
|
|
cond_resched();
|
|
if (level == 0) {
|
|
@@ -1670,32 +1581,6 @@
|
|
continue;
|
|
|
|
nr_file_extents++;
|
|
- sorted[refi].bytenr = bytenr;
|
|
- sorted[refi].slot = i;
|
|
- refi++;
|
|
- } else {
|
|
- bytenr = btrfs_node_blockptr(buf, i);
|
|
- sorted[refi].bytenr = bytenr;
|
|
- sorted[refi].slot = i;
|
|
- refi++;
|
|
- }
|
|
- }
|
|
- /*
|
|
- * if refi == 0, we didn't actually put anything into the sorted
|
|
- * array and we're done
|
|
- */
|
|
- if (refi == 0)
|
|
- goto out;
|
|
-
|
|
- sort(sorted, refi, sizeof(struct refsort), refsort_cmp, NULL);
|
|
-
|
|
- for (i = 0; i < refi; i++) {
|
|
- cond_resched();
|
|
- slot = sorted[i].slot;
|
|
- bytenr = sorted[i].bytenr;
|
|
-
|
|
- if (level == 0) {
|
|
- btrfs_item_key_to_cpu(buf, &key, slot);
|
|
|
|
ret = process_func(trans, root, bytenr,
|
|
orig_buf->start, buf->start,
|
|
@@ -1704,25 +1589,25 @@
|
|
key.objectid);
|
|
|
|
if (ret) {
|
|
- faili = slot;
|
|
+ faili = i;
|
|
WARN_ON(1);
|
|
goto fail;
|
|
}
|
|
} else {
|
|
+ bytenr = btrfs_node_blockptr(buf, i);
|
|
ret = process_func(trans, root, bytenr,
|
|
orig_buf->start, buf->start,
|
|
orig_root, ref_root,
|
|
orig_generation, ref_generation,
|
|
level - 1);
|
|
if (ret) {
|
|
- faili = slot;
|
|
+ faili = i;
|
|
WARN_ON(1);
|
|
goto fail;
|
|
}
|
|
}
|
|
}
|
|
out:
|
|
- kfree(sorted);
|
|
if (nr_extents) {
|
|
if (level == 0)
|
|
*nr_extents = nr_file_extents;
|
|
@@ -1731,7 +1616,6 @@
|
|
}
|
|
return 0;
|
|
fail:
|
|
- kfree(sorted);
|
|
WARN_ON(1);
|
|
return ret;
|
|
}
|
|
@@ -1924,6 +1808,7 @@
|
|
if (!found)
|
|
return -ENOMEM;
|
|
|
|
+ list_add(&found->list, &info->space_info);
|
|
INIT_LIST_HEAD(&found->block_groups);
|
|
init_rwsem(&found->groups_sem);
|
|
spin_lock_init(&found->lock);
|
|
@@ -1933,11 +1818,9 @@
|
|
found->bytes_pinned = 0;
|
|
found->bytes_reserved = 0;
|
|
found->bytes_readonly = 0;
|
|
- found->bytes_delalloc = 0;
|
|
found->full = 0;
|
|
found->force_alloc = 0;
|
|
*space_info = found;
|
|
- list_add_rcu(&found->list, &info->space_info);
|
|
return 0;
|
|
}
|
|
|
|
@@ -1998,233 +1881,6 @@
|
|
return flags;
|
|
}
|
|
|
|
-static u64 btrfs_get_alloc_profile(struct btrfs_root *root, u64 data)
|
|
-{
|
|
- struct btrfs_fs_info *info = root->fs_info;
|
|
- u64 alloc_profile;
|
|
-
|
|
- if (data) {
|
|
- alloc_profile = info->avail_data_alloc_bits &
|
|
- info->data_alloc_profile;
|
|
- data = BTRFS_BLOCK_GROUP_DATA | alloc_profile;
|
|
- } else if (root == root->fs_info->chunk_root) {
|
|
- alloc_profile = info->avail_system_alloc_bits &
|
|
- info->system_alloc_profile;
|
|
- data = BTRFS_BLOCK_GROUP_SYSTEM | alloc_profile;
|
|
- } else {
|
|
- alloc_profile = info->avail_metadata_alloc_bits &
|
|
- info->metadata_alloc_profile;
|
|
- data = BTRFS_BLOCK_GROUP_METADATA | alloc_profile;
|
|
- }
|
|
-
|
|
- return btrfs_reduce_alloc_profile(root, data);
|
|
-}
|
|
-
|
|
-void btrfs_set_inode_space_info(struct btrfs_root *root, struct inode *inode)
|
|
-{
|
|
- u64 alloc_target;
|
|
-
|
|
- alloc_target = btrfs_get_alloc_profile(root, 1);
|
|
- BTRFS_I(inode)->space_info = __find_space_info(root->fs_info,
|
|
- alloc_target);
|
|
-}
|
|
-
|
|
-/*
|
|
- * for now this just makes sure we have at least 5% of our metadata space free
|
|
- * for use.
|
|
- */
|
|
-int btrfs_check_metadata_free_space(struct btrfs_root *root)
|
|
-{
|
|
- struct btrfs_fs_info *info = root->fs_info;
|
|
- struct btrfs_space_info *meta_sinfo;
|
|
- u64 alloc_target, thresh;
|
|
- int committed = 0, ret;
|
|
-
|
|
- /* get the space info for where the metadata will live */
|
|
- alloc_target = btrfs_get_alloc_profile(root, 0);
|
|
- meta_sinfo = __find_space_info(info, alloc_target);
|
|
-
|
|
-again:
|
|
- spin_lock(&meta_sinfo->lock);
|
|
- if (!meta_sinfo->full)
|
|
- thresh = meta_sinfo->total_bytes * 80;
|
|
- else
|
|
- thresh = meta_sinfo->total_bytes * 95;
|
|
-
|
|
- do_div(thresh, 100);
|
|
-
|
|
- if (meta_sinfo->bytes_used + meta_sinfo->bytes_reserved +
|
|
- meta_sinfo->bytes_pinned + meta_sinfo->bytes_readonly > thresh) {
|
|
- struct btrfs_trans_handle *trans;
|
|
- if (!meta_sinfo->full) {
|
|
- meta_sinfo->force_alloc = 1;
|
|
- spin_unlock(&meta_sinfo->lock);
|
|
-
|
|
- trans = btrfs_start_transaction(root, 1);
|
|
- if (!trans)
|
|
- return -ENOMEM;
|
|
-
|
|
- ret = do_chunk_alloc(trans, root->fs_info->extent_root,
|
|
- 2 * 1024 * 1024, alloc_target, 0);
|
|
- btrfs_end_transaction(trans, root);
|
|
- goto again;
|
|
- }
|
|
- spin_unlock(&meta_sinfo->lock);
|
|
-
|
|
- if (!committed) {
|
|
- committed = 1;
|
|
- trans = btrfs_join_transaction(root, 1);
|
|
- if (!trans)
|
|
- return -ENOMEM;
|
|
- ret = btrfs_commit_transaction(trans, root);
|
|
- if (ret)
|
|
- return ret;
|
|
- goto again;
|
|
- }
|
|
- return -ENOSPC;
|
|
- }
|
|
- spin_unlock(&meta_sinfo->lock);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
- * This will check the space that the inode allocates from to make sure we have
|
|
- * enough space for bytes.
|
|
- */
|
|
-int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode,
|
|
- u64 bytes)
|
|
-{
|
|
- struct btrfs_space_info *data_sinfo;
|
|
- int ret = 0, committed = 0;
|
|
-
|
|
- /* make sure bytes are sectorsize aligned */
|
|
- bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
|
|
-
|
|
- data_sinfo = BTRFS_I(inode)->space_info;
|
|
-again:
|
|
- /* make sure we have enough space to handle the data first */
|
|
- spin_lock(&data_sinfo->lock);
|
|
- if (data_sinfo->total_bytes - data_sinfo->bytes_used -
|
|
- data_sinfo->bytes_delalloc - data_sinfo->bytes_reserved -
|
|
- data_sinfo->bytes_pinned - data_sinfo->bytes_readonly -
|
|
- data_sinfo->bytes_may_use < bytes) {
|
|
- struct btrfs_trans_handle *trans;
|
|
-
|
|
- /*
|
|
- * if we don't have enough free bytes in this space then we need
|
|
- * to alloc a new chunk.
|
|
- */
|
|
- if (!data_sinfo->full) {
|
|
- u64 alloc_target;
|
|
-
|
|
- data_sinfo->force_alloc = 1;
|
|
- spin_unlock(&data_sinfo->lock);
|
|
-
|
|
- alloc_target = btrfs_get_alloc_profile(root, 1);
|
|
- trans = btrfs_start_transaction(root, 1);
|
|
- if (!trans)
|
|
- return -ENOMEM;
|
|
-
|
|
- ret = do_chunk_alloc(trans, root->fs_info->extent_root,
|
|
- bytes + 2 * 1024 * 1024,
|
|
- alloc_target, 0);
|
|
- btrfs_end_transaction(trans, root);
|
|
- if (ret)
|
|
- return ret;
|
|
- goto again;
|
|
- }
|
|
- spin_unlock(&data_sinfo->lock);
|
|
-
|
|
- /* commit the current transaction and try again */
|
|
- if (!committed) {
|
|
- committed = 1;
|
|
- trans = btrfs_join_transaction(root, 1);
|
|
- if (!trans)
|
|
- return -ENOMEM;
|
|
- ret = btrfs_commit_transaction(trans, root);
|
|
- if (ret)
|
|
- return ret;
|
|
- goto again;
|
|
- }
|
|
-
|
|
- printk(KERN_ERR "no space left, need %llu, %llu delalloc bytes"
|
|
- ", %llu bytes_used, %llu bytes_reserved, "
|
|
- "%llu bytes_pinned, %llu bytes_readonly, %llu may use"
|
|
- "%llu total\n", bytes, data_sinfo->bytes_delalloc,
|
|
- data_sinfo->bytes_used, data_sinfo->bytes_reserved,
|
|
- data_sinfo->bytes_pinned, data_sinfo->bytes_readonly,
|
|
- data_sinfo->bytes_may_use, data_sinfo->total_bytes);
|
|
- return -ENOSPC;
|
|
- }
|
|
- data_sinfo->bytes_may_use += bytes;
|
|
- BTRFS_I(inode)->reserved_bytes += bytes;
|
|
- spin_unlock(&data_sinfo->lock);
|
|
-
|
|
- return btrfs_check_metadata_free_space(root);
|
|
-}
|
|
-
|
|
-/*
|
|
- * if there was an error for whatever reason after calling
|
|
- * btrfs_check_data_free_space, call this so we can cleanup the counters.
|
|
- */
|
|
-void btrfs_free_reserved_data_space(struct btrfs_root *root,
|
|
- struct inode *inode, u64 bytes)
|
|
-{
|
|
- struct btrfs_space_info *data_sinfo;
|
|
-
|
|
- /* make sure bytes are sectorsize aligned */
|
|
- bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
|
|
-
|
|
- data_sinfo = BTRFS_I(inode)->space_info;
|
|
- spin_lock(&data_sinfo->lock);
|
|
- data_sinfo->bytes_may_use -= bytes;
|
|
- BTRFS_I(inode)->reserved_bytes -= bytes;
|
|
- spin_unlock(&data_sinfo->lock);
|
|
-}
|
|
-
|
|
-/* called when we are adding a delalloc extent to the inode's io_tree */
|
|
-void btrfs_delalloc_reserve_space(struct btrfs_root *root, struct inode *inode,
|
|
- u64 bytes)
|
|
-{
|
|
- struct btrfs_space_info *data_sinfo;
|
|
-
|
|
- /* get the space info for where this inode will be storing its data */
|
|
- data_sinfo = BTRFS_I(inode)->space_info;
|
|
-
|
|
- /* make sure we have enough space to handle the data first */
|
|
- spin_lock(&data_sinfo->lock);
|
|
- data_sinfo->bytes_delalloc += bytes;
|
|
-
|
|
- /*
|
|
- * we are adding a delalloc extent without calling
|
|
- * btrfs_check_data_free_space first. This happens on a weird
|
|
- * writepage condition, but shouldn't hurt our accounting
|
|
- */
|
|
- if (unlikely(bytes > BTRFS_I(inode)->reserved_bytes)) {
|
|
- data_sinfo->bytes_may_use -= BTRFS_I(inode)->reserved_bytes;
|
|
- BTRFS_I(inode)->reserved_bytes = 0;
|
|
- } else {
|
|
- data_sinfo->bytes_may_use -= bytes;
|
|
- BTRFS_I(inode)->reserved_bytes -= bytes;
|
|
- }
|
|
-
|
|
- spin_unlock(&data_sinfo->lock);
|
|
-}
|
|
-
|
|
-/* called when we are clearing an delalloc extent from the inode's io_tree */
|
|
-void btrfs_delalloc_free_space(struct btrfs_root *root, struct inode *inode,
|
|
- u64 bytes)
|
|
-{
|
|
- struct btrfs_space_info *info;
|
|
-
|
|
- info = BTRFS_I(inode)->space_info;
|
|
-
|
|
- spin_lock(&info->lock);
|
|
- info->bytes_delalloc -= bytes;
|
|
- spin_unlock(&info->lock);
|
|
-}
|
|
-
|
|
static int do_chunk_alloc(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *extent_root, u64 alloc_bytes,
|
|
u64 flags, int force)
|
|
@@ -2481,12 +2137,13 @@
|
|
u64 end;
|
|
u64 priv;
|
|
u64 search = 0;
|
|
+ u64 skipped = 0;
|
|
struct btrfs_fs_info *info = extent_root->fs_info;
|
|
struct btrfs_path *path;
|
|
struct pending_extent_op *extent_op, *tmp;
|
|
struct list_head insert_list, update_list;
|
|
int ret;
|
|
- int num_inserts = 0, max_inserts, restart = 0;
|
|
+ int num_inserts = 0, max_inserts;
|
|
|
|
path = btrfs_alloc_path();
|
|
INIT_LIST_HEAD(&insert_list);
|
|
@@ -2502,19 +2159,18 @@
|
|
ret = find_first_extent_bit(&info->extent_ins, search, &start,
|
|
&end, EXTENT_WRITEBACK);
|
|
if (ret) {
|
|
- if (restart && !num_inserts &&
|
|
- list_empty(&update_list)) {
|
|
- restart = 0;
|
|
+ if (skipped && all && !num_inserts) {
|
|
+ skipped = 0;
|
|
search = 0;
|
|
continue;
|
|
}
|
|
+ mutex_unlock(&info->extent_ins_mutex);
|
|
break;
|
|
}
|
|
|
|
ret = try_lock_extent(&info->extent_ins, start, end, GFP_NOFS);
|
|
if (!ret) {
|
|
- if (all)
|
|
- restart = 1;
|
|
+ skipped = 1;
|
|
search = end + 1;
|
|
if (need_resched()) {
|
|
mutex_unlock(&info->extent_ins_mutex);
|
|
@@ -2533,7 +2189,7 @@
|
|
list_add_tail(&extent_op->list, &insert_list);
|
|
search = end + 1;
|
|
if (num_inserts == max_inserts) {
|
|
- restart = 1;
|
|
+ mutex_unlock(&info->extent_ins_mutex);
|
|
break;
|
|
}
|
|
} else if (extent_op->type == PENDING_BACKREF_UPDATE) {
|
|
@@ -2549,6 +2205,7 @@
|
|
* somebody marked this thing for deletion then just unlock it and be
|
|
* done, the free_extents will handle it
|
|
*/
|
|
+ mutex_lock(&info->extent_ins_mutex);
|
|
list_for_each_entry_safe(extent_op, tmp, &update_list, list) {
|
|
clear_extent_bits(&info->extent_ins, extent_op->bytenr,
|
|
extent_op->bytenr + extent_op->num_bytes - 1,
|
|
@@ -2570,10 +2227,6 @@
|
|
if (!list_empty(&update_list)) {
|
|
ret = update_backrefs(trans, extent_root, path, &update_list);
|
|
BUG_ON(ret);
|
|
-
|
|
- /* we may have COW'ed new blocks, so lets start over */
|
|
- if (all)
|
|
- restart = 1;
|
|
}
|
|
|
|
/*
|
|
@@ -2581,9 +2234,9 @@
|
|
* need to make sure everything is cleaned then reset everything and
|
|
* go back to the beginning
|
|
*/
|
|
- if (!num_inserts && restart) {
|
|
+ if (!num_inserts && all && skipped) {
|
|
search = 0;
|
|
- restart = 0;
|
|
+ skipped = 0;
|
|
INIT_LIST_HEAD(&update_list);
|
|
INIT_LIST_HEAD(&insert_list);
|
|
goto again;
|
|
@@ -2640,19 +2293,27 @@
|
|
BUG_ON(ret);
|
|
|
|
/*
|
|
- * if restart is set for whatever reason we need to go back and start
|
|
- * searching through the pending list again.
|
|
- *
|
|
- * We just inserted some extents, which could have resulted in new
|
|
- * blocks being allocated, which would result in new blocks needing
|
|
- * updates, so if all is set we _must_ restart to get the updated
|
|
- * blocks.
|
|
+ * if we broke out of the loop in order to insert stuff because we hit
|
|
+ * the maximum number of inserts at a time we can handle, then loop
|
|
+ * back and pick up where we left off
|
|
*/
|
|
- if (restart || all) {
|
|
+ if (num_inserts == max_inserts) {
|
|
+ INIT_LIST_HEAD(&insert_list);
|
|
+ INIT_LIST_HEAD(&update_list);
|
|
+ num_inserts = 0;
|
|
+ goto again;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * again, if we need to make absolutely sure there are no more pending
|
|
+ * extent operations left and we know that we skipped some, go back to
|
|
+ * the beginning and do it all again
|
|
+ */
|
|
+ if (all && skipped) {
|
|
INIT_LIST_HEAD(&insert_list);
|
|
INIT_LIST_HEAD(&update_list);
|
|
search = 0;
|
|
- restart = 0;
|
|
+ skipped = 0;
|
|
num_inserts = 0;
|
|
goto again;
|
|
}
|
|
@@ -2886,7 +2547,6 @@
|
|
if (ret) {
|
|
if (all && skipped && !nr) {
|
|
search = 0;
|
|
- skipped = 0;
|
|
continue;
|
|
}
|
|
mutex_unlock(&info->extent_ins_mutex);
|
|
@@ -2973,8 +2633,6 @@
|
|
goto again;
|
|
}
|
|
|
|
- if (!err)
|
|
- finish_current_insert(trans, extent_root, 0);
|
|
return err;
|
|
}
|
|
|
|
@@ -3042,9 +2700,13 @@
|
|
/* if metadata always pin */
|
|
if (owner_objectid < BTRFS_FIRST_FREE_OBJECTID) {
|
|
if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
|
|
- mutex_lock(&root->fs_info->pinned_mutex);
|
|
- btrfs_update_pinned_extents(root, bytenr, num_bytes, 1);
|
|
- mutex_unlock(&root->fs_info->pinned_mutex);
|
|
+ struct btrfs_block_group_cache *cache;
|
|
+
|
|
+ /* btrfs_free_reserved_extent */
|
|
+ cache = btrfs_lookup_block_group(root->fs_info, bytenr);
|
|
+ BUG_ON(!cache);
|
|
+ btrfs_add_free_space(cache, bytenr, num_bytes);
|
|
+ put_block_group(cache);
|
|
update_reserved_extents(root, bytenr, num_bytes, 0);
|
|
return 0;
|
|
}
|
|
@@ -3125,8 +2787,7 @@
|
|
|
|
if (data & BTRFS_BLOCK_GROUP_METADATA) {
|
|
last_ptr = &root->fs_info->last_alloc;
|
|
- if (!btrfs_test_opt(root, SSD))
|
|
- empty_cluster = 64 * 1024;
|
|
+ empty_cluster = 64 * 1024;
|
|
}
|
|
|
|
if ((data & BTRFS_BLOCK_GROUP_DATA) && btrfs_test_opt(root, SSD))
|
|
@@ -3353,18 +3014,16 @@
|
|
static void dump_space_info(struct btrfs_space_info *info, u64 bytes)
|
|
{
|
|
struct btrfs_block_group_cache *cache;
|
|
+ struct list_head *l;
|
|
|
|
printk(KERN_INFO "space_info has %llu free, is %sfull\n",
|
|
(unsigned long long)(info->total_bytes - info->bytes_used -
|
|
info->bytes_pinned - info->bytes_reserved),
|
|
(info->full) ? "" : "not ");
|
|
- printk(KERN_INFO "space_info total=%llu, pinned=%llu, delalloc=%llu,"
|
|
- " may_use=%llu, used=%llu\n", info->total_bytes,
|
|
- info->bytes_pinned, info->bytes_delalloc, info->bytes_may_use,
|
|
- info->bytes_used);
|
|
|
|
down_read(&info->groups_sem);
|
|
- list_for_each_entry(cache, &info->block_groups, list) {
|
|
+ list_for_each(l, &info->block_groups) {
|
|
+ cache = list_entry(l, struct btrfs_block_group_cache, list);
|
|
spin_lock(&cache->lock);
|
|
printk(KERN_INFO "block group %llu has %llu bytes, %llu used "
|
|
"%llu pinned %llu reserved\n",
|
|
@@ -3388,10 +3047,24 @@
|
|
{
|
|
int ret;
|
|
u64 search_start = 0;
|
|
+ u64 alloc_profile;
|
|
struct btrfs_fs_info *info = root->fs_info;
|
|
|
|
- data = btrfs_get_alloc_profile(root, data);
|
|
+ if (data) {
|
|
+ alloc_profile = info->avail_data_alloc_bits &
|
|
+ info->data_alloc_profile;
|
|
+ data = BTRFS_BLOCK_GROUP_DATA | alloc_profile;
|
|
+ } else if (root == root->fs_info->chunk_root) {
|
|
+ alloc_profile = info->avail_system_alloc_bits &
|
|
+ info->system_alloc_profile;
|
|
+ data = BTRFS_BLOCK_GROUP_SYSTEM | alloc_profile;
|
|
+ } else {
|
|
+ alloc_profile = info->avail_metadata_alloc_bits &
|
|
+ info->metadata_alloc_profile;
|
|
+ data = BTRFS_BLOCK_GROUP_METADATA | alloc_profile;
|
|
+ }
|
|
again:
|
|
+ data = btrfs_reduce_alloc_profile(root, data);
|
|
/*
|
|
* the only place that sets empty_size is btrfs_realloc_node, which
|
|
* is not called recursively on allocations
|
|
@@ -3659,8 +3332,7 @@
|
|
|
|
struct extent_buffer *btrfs_init_new_buffer(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *root,
|
|
- u64 bytenr, u32 blocksize,
|
|
- int level)
|
|
+ u64 bytenr, u32 blocksize)
|
|
{
|
|
struct extent_buffer *buf;
|
|
|
|
@@ -3668,13 +3340,9 @@
|
|
if (!buf)
|
|
return ERR_PTR(-ENOMEM);
|
|
btrfs_set_header_generation(buf, trans->transid);
|
|
- btrfs_set_buffer_lockdep_class(buf, level);
|
|
btrfs_tree_lock(buf);
|
|
clean_tree_block(trans, root, buf);
|
|
-
|
|
- btrfs_set_lock_blocking(buf);
|
|
btrfs_set_buffer_uptodate(buf);
|
|
-
|
|
if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
|
|
set_extent_dirty(&root->dirty_log_pages, buf->start,
|
|
buf->start + buf->len - 1, GFP_NOFS);
|
|
@@ -3683,7 +3351,6 @@
|
|
buf->start + buf->len - 1, GFP_NOFS);
|
|
}
|
|
trans->blocks_used++;
|
|
- /* this returns a buffer locked for blocking */
|
|
return buf;
|
|
}
|
|
|
|
@@ -3712,8 +3379,7 @@
|
|
return ERR_PTR(ret);
|
|
}
|
|
|
|
- buf = btrfs_init_new_buffer(trans, root, ins.objectid,
|
|
- blocksize, level);
|
|
+ buf = btrfs_init_new_buffer(trans, root, ins.objectid, blocksize);
|
|
return buf;
|
|
}
|
|
|
|
@@ -3722,73 +3388,36 @@
|
|
{
|
|
u64 leaf_owner;
|
|
u64 leaf_generation;
|
|
- struct refsort *sorted;
|
|
struct btrfs_key key;
|
|
struct btrfs_file_extent_item *fi;
|
|
int i;
|
|
int nritems;
|
|
int ret;
|
|
- int refi = 0;
|
|
- int slot;
|
|
|
|
BUG_ON(!btrfs_is_leaf(leaf));
|
|
nritems = btrfs_header_nritems(leaf);
|
|
leaf_owner = btrfs_header_owner(leaf);
|
|
leaf_generation = btrfs_header_generation(leaf);
|
|
|
|
- sorted = kmalloc(sizeof(*sorted) * nritems, GFP_NOFS);
|
|
- /* we do this loop twice. The first time we build a list
|
|
- * of the extents we have a reference on, then we sort the list
|
|
- * by bytenr. The second time around we actually do the
|
|
- * extent freeing.
|
|
- */
|
|
for (i = 0; i < nritems; i++) {
|
|
u64 disk_bytenr;
|
|
cond_resched();
|
|
|
|
btrfs_item_key_to_cpu(leaf, &key, i);
|
|
-
|
|
- /* only extents have references, skip everything else */
|
|
if (btrfs_key_type(&key) != BTRFS_EXTENT_DATA_KEY)
|
|
continue;
|
|
-
|
|
fi = btrfs_item_ptr(leaf, i, struct btrfs_file_extent_item);
|
|
-
|
|
- /* inline extents live in the btree, they don't have refs */
|
|
if (btrfs_file_extent_type(leaf, fi) ==
|
|
BTRFS_FILE_EXTENT_INLINE)
|
|
continue;
|
|
-
|
|
+ /*
|
|
+ * FIXME make sure to insert a trans record that
|
|
+ * repeats the snapshot del on crash
|
|
+ */
|
|
disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
|
|
-
|
|
- /* holes don't have refs */
|
|
if (disk_bytenr == 0)
|
|
continue;
|
|
|
|
- sorted[refi].bytenr = disk_bytenr;
|
|
- sorted[refi].slot = i;
|
|
- refi++;
|
|
- }
|
|
-
|
|
- if (refi == 0)
|
|
- goto out;
|
|
-
|
|
- sort(sorted, refi, sizeof(struct refsort), refsort_cmp, NULL);
|
|
-
|
|
- for (i = 0; i < refi; i++) {
|
|
- u64 disk_bytenr;
|
|
-
|
|
- disk_bytenr = sorted[i].bytenr;
|
|
- slot = sorted[i].slot;
|
|
-
|
|
- cond_resched();
|
|
-
|
|
- btrfs_item_key_to_cpu(leaf, &key, slot);
|
|
- if (btrfs_key_type(&key) != BTRFS_EXTENT_DATA_KEY)
|
|
- continue;
|
|
-
|
|
- fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
|
|
-
|
|
ret = __btrfs_free_extent(trans, root, disk_bytenr,
|
|
btrfs_file_extent_disk_num_bytes(leaf, fi),
|
|
leaf->start, leaf_owner, leaf_generation,
|
|
@@ -3799,8 +3428,6 @@
|
|
wake_up(&root->fs_info->transaction_throttle);
|
|
cond_resched();
|
|
}
|
|
-out:
|
|
- kfree(sorted);
|
|
return 0;
|
|
}
|
|
|
|
@@ -3810,25 +3437,9 @@
|
|
{
|
|
int i;
|
|
int ret;
|
|
- struct btrfs_extent_info *info;
|
|
- struct refsort *sorted;
|
|
-
|
|
- if (ref->nritems == 0)
|
|
- return 0;
|
|
+ struct btrfs_extent_info *info = ref->extents;
|
|
|
|
- sorted = kmalloc(sizeof(*sorted) * ref->nritems, GFP_NOFS);
|
|
for (i = 0; i < ref->nritems; i++) {
|
|
- sorted[i].bytenr = ref->extents[i].bytenr;
|
|
- sorted[i].slot = i;
|
|
- }
|
|
- sort(sorted, ref->nritems, sizeof(struct refsort), refsort_cmp, NULL);
|
|
-
|
|
- /*
|
|
- * the items in the ref were sorted when the ref was inserted
|
|
- * into the ref cache, so this is already in order
|
|
- */
|
|
- for (i = 0; i < ref->nritems; i++) {
|
|
- info = ref->extents + sorted[i].slot;
|
|
ret = __btrfs_free_extent(trans, root, info->bytenr,
|
|
info->num_bytes, ref->bytenr,
|
|
ref->owner, ref->generation,
|
|
@@ -3842,7 +3453,6 @@
|
|
info++;
|
|
}
|
|
|
|
- kfree(sorted);
|
|
return 0;
|
|
}
|
|
|
|
@@ -3887,152 +3497,6 @@
|
|
}
|
|
|
|
/*
|
|
- * this is used while deleting old snapshots, and it drops the refs
|
|
- * on a whole subtree starting from a level 1 node.
|
|
- *
|
|
- * The idea is to sort all the leaf pointers, and then drop the
|
|
- * ref on all the leaves in order. Most of the time the leaves
|
|
- * will have ref cache entries, so no leaf IOs will be required to
|
|
- * find the extents they have references on.
|
|
- *
|
|
- * For each leaf, any references it has are also dropped in order
|
|
- *
|
|
- * This ends up dropping the references in something close to optimal
|
|
- * order for reading and modifying the extent allocation tree.
|
|
- */
|
|
-static noinline int drop_level_one_refs(struct btrfs_trans_handle *trans,
|
|
- struct btrfs_root *root,
|
|
- struct btrfs_path *path)
|
|
-{
|
|
- u64 bytenr;
|
|
- u64 root_owner;
|
|
- u64 root_gen;
|
|
- struct extent_buffer *eb = path->nodes[1];
|
|
- struct extent_buffer *leaf;
|
|
- struct btrfs_leaf_ref *ref;
|
|
- struct refsort *sorted = NULL;
|
|
- int nritems = btrfs_header_nritems(eb);
|
|
- int ret;
|
|
- int i;
|
|
- int refi = 0;
|
|
- int slot = path->slots[1];
|
|
- u32 blocksize = btrfs_level_size(root, 0);
|
|
- u32 refs;
|
|
-
|
|
- if (nritems == 0)
|
|
- goto out;
|
|
-
|
|
- root_owner = btrfs_header_owner(eb);
|
|
- root_gen = btrfs_header_generation(eb);
|
|
- sorted = kmalloc(sizeof(*sorted) * nritems, GFP_NOFS);
|
|
-
|
|
- /*
|
|
- * step one, sort all the leaf pointers so we don't scribble
|
|
- * randomly into the extent allocation tree
|
|
- */
|
|
- for (i = slot; i < nritems; i++) {
|
|
- sorted[refi].bytenr = btrfs_node_blockptr(eb, i);
|
|
- sorted[refi].slot = i;
|
|
- refi++;
|
|
- }
|
|
-
|
|
- /*
|
|
- * nritems won't be zero, but if we're picking up drop_snapshot
|
|
- * after a crash, slot might be > 0, so double check things
|
|
- * just in case.
|
|
- */
|
|
- if (refi == 0)
|
|
- goto out;
|
|
-
|
|
- sort(sorted, refi, sizeof(struct refsort), refsort_cmp, NULL);
|
|
-
|
|
- /*
|
|
- * the first loop frees everything the leaves point to
|
|
- */
|
|
- for (i = 0; i < refi; i++) {
|
|
- u64 ptr_gen;
|
|
-
|
|
- bytenr = sorted[i].bytenr;
|
|
-
|
|
- /*
|
|
- * check the reference count on this leaf. If it is > 1
|
|
- * we just decrement it below and don't update any
|
|
- * of the refs the leaf points to.
|
|
- */
|
|
- ret = drop_snap_lookup_refcount(root, bytenr, blocksize, &refs);
|
|
- BUG_ON(ret);
|
|
- if (refs != 1)
|
|
- continue;
|
|
-
|
|
- ptr_gen = btrfs_node_ptr_generation(eb, sorted[i].slot);
|
|
-
|
|
- /*
|
|
- * the leaf only had one reference, which means the
|
|
- * only thing pointing to this leaf is the snapshot
|
|
- * we're deleting. It isn't possible for the reference
|
|
- * count to increase again later
|
|
- *
|
|
- * The reference cache is checked for the leaf,
|
|
- * and if found we'll be able to drop any refs held by
|
|
- * the leaf without needing to read it in.
|
|
- */
|
|
- ref = btrfs_lookup_leaf_ref(root, bytenr);
|
|
- if (ref && ref->generation != ptr_gen) {
|
|
- btrfs_free_leaf_ref(root, ref);
|
|
- ref = NULL;
|
|
- }
|
|
- if (ref) {
|
|
- ret = cache_drop_leaf_ref(trans, root, ref);
|
|
- BUG_ON(ret);
|
|
- btrfs_remove_leaf_ref(root, ref);
|
|
- btrfs_free_leaf_ref(root, ref);
|
|
- } else {
|
|
- /*
|
|
- * the leaf wasn't in the reference cache, so
|
|
- * we have to read it.
|
|
- */
|
|
- leaf = read_tree_block(root, bytenr, blocksize,
|
|
- ptr_gen);
|
|
- ret = btrfs_drop_leaf_ref(trans, root, leaf);
|
|
- BUG_ON(ret);
|
|
- free_extent_buffer(leaf);
|
|
- }
|
|
- atomic_inc(&root->fs_info->throttle_gen);
|
|
- wake_up(&root->fs_info->transaction_throttle);
|
|
- cond_resched();
|
|
- }
|
|
-
|
|
- /*
|
|
- * run through the loop again to free the refs on the leaves.
|
|
- * This is faster than doing it in the loop above because
|
|
- * the leaves are likely to be clustered together. We end up
|
|
- * working in nice chunks on the extent allocation tree.
|
|
- */
|
|
- for (i = 0; i < refi; i++) {
|
|
- bytenr = sorted[i].bytenr;
|
|
- ret = __btrfs_free_extent(trans, root, bytenr,
|
|
- blocksize, eb->start,
|
|
- root_owner, root_gen, 0, 1);
|
|
- BUG_ON(ret);
|
|
-
|
|
- atomic_inc(&root->fs_info->throttle_gen);
|
|
- wake_up(&root->fs_info->transaction_throttle);
|
|
- cond_resched();
|
|
- }
|
|
-out:
|
|
- kfree(sorted);
|
|
-
|
|
- /*
|
|
- * update the path to show we've processed the entire level 1
|
|
- * node. This will get saved into the root's drop_snapshot_progress
|
|
- * field so these drops are not repeated again if this transaction
|
|
- * commits.
|
|
- */
|
|
- path->slots[1] = nritems;
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
* helper function for drop_snapshot, this walks down the tree dropping ref
|
|
* counts as it goes.
|
|
*/
|
|
@@ -4047,6 +3511,7 @@
|
|
struct extent_buffer *next;
|
|
struct extent_buffer *cur;
|
|
struct extent_buffer *parent;
|
|
+ struct btrfs_leaf_ref *ref;
|
|
u32 blocksize;
|
|
int ret;
|
|
u32 refs;
|
|
@@ -4073,46 +3538,17 @@
|
|
if (path->slots[*level] >=
|
|
btrfs_header_nritems(cur))
|
|
break;
|
|
-
|
|
- /* the new code goes down to level 1 and does all the
|
|
- * leaves pointed to that node in bulk. So, this check
|
|
- * for level 0 will always be false.
|
|
- *
|
|
- * But, the disk format allows the drop_snapshot_progress
|
|
- * field in the root to leave things in a state where
|
|
- * a leaf will need cleaning up here. If someone crashes
|
|
- * with the old code and then boots with the new code,
|
|
- * we might find a leaf here.
|
|
- */
|
|
if (*level == 0) {
|
|
ret = btrfs_drop_leaf_ref(trans, root, cur);
|
|
BUG_ON(ret);
|
|
break;
|
|
}
|
|
-
|
|
- /*
|
|
- * once we get to level one, process the whole node
|
|
- * at once, including everything below it.
|
|
- */
|
|
- if (*level == 1) {
|
|
- ret = drop_level_one_refs(trans, root, path);
|
|
- BUG_ON(ret);
|
|
- break;
|
|
- }
|
|
-
|
|
bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
|
|
ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
|
|
blocksize = btrfs_level_size(root, *level - 1);
|
|
|
|
ret = drop_snap_lookup_refcount(root, bytenr, blocksize, &refs);
|
|
BUG_ON(ret);
|
|
-
|
|
- /*
|
|
- * if there is more than one reference, we don't need
|
|
- * to read that node to drop any references it has. We
|
|
- * just drop the ref we hold on that node and move on to the
|
|
- * next slot in this level.
|
|
- */
|
|
if (refs != 1) {
|
|
parent = path->nodes[*level];
|
|
root_owner = btrfs_header_owner(parent);
|
|
@@ -4131,12 +3567,46 @@
|
|
|
|
continue;
|
|
}
|
|
-
|
|
/*
|
|
- * we need to keep freeing things in the next level down.
|
|
- * read the block and loop around to process it
|
|
+ * at this point, we have a single ref, and since the
|
|
+ * only place referencing this extent is a dead root
|
|
+ * the reference count should never go higher.
|
|
+ * So, we don't need to check it again
|
|
*/
|
|
- next = read_tree_block(root, bytenr, blocksize, ptr_gen);
|
|
+ if (*level == 1) {
|
|
+ ref = btrfs_lookup_leaf_ref(root, bytenr);
|
|
+ if (ref && ref->generation != ptr_gen) {
|
|
+ btrfs_free_leaf_ref(root, ref);
|
|
+ ref = NULL;
|
|
+ }
|
|
+ if (ref) {
|
|
+ ret = cache_drop_leaf_ref(trans, root, ref);
|
|
+ BUG_ON(ret);
|
|
+ btrfs_remove_leaf_ref(root, ref);
|
|
+ btrfs_free_leaf_ref(root, ref);
|
|
+ *level = 0;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ next = btrfs_find_tree_block(root, bytenr, blocksize);
|
|
+ if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
|
|
+ free_extent_buffer(next);
|
|
+
|
|
+ next = read_tree_block(root, bytenr, blocksize,
|
|
+ ptr_gen);
|
|
+ cond_resched();
|
|
+#if 0
|
|
+ /*
|
|
+ * this is a debugging check and can go away
|
|
+ * the ref should never go all the way down to 1
|
|
+ * at this point
|
|
+ */
|
|
+ ret = lookup_extent_ref(NULL, root, bytenr, blocksize,
|
|
+ &refs);
|
|
+ BUG_ON(ret);
|
|
+ WARN_ON(refs != 1);
|
|
+#endif
|
|
+ }
|
|
WARN_ON(*level <= 0);
|
|
if (path->nodes[*level-1])
|
|
free_extent_buffer(path->nodes[*level-1]);
|
|
@@ -4161,16 +3631,11 @@
|
|
root_owner = btrfs_header_owner(parent);
|
|
root_gen = btrfs_header_generation(parent);
|
|
|
|
- /*
|
|
- * cleanup and free the reference on the last node
|
|
- * we processed
|
|
- */
|
|
ret = __btrfs_free_extent(trans, root, bytenr, blocksize,
|
|
parent->start, root_owner, root_gen,
|
|
*level, 1);
|
|
free_extent_buffer(path->nodes[*level]);
|
|
path->nodes[*level] = NULL;
|
|
-
|
|
*level += 1;
|
|
BUG_ON(ret);
|
|
|
|
@@ -4222,7 +3687,6 @@
|
|
|
|
next = read_tree_block(root, bytenr, blocksize, ptr_gen);
|
|
btrfs_tree_lock(next);
|
|
- btrfs_set_lock_blocking(next);
|
|
|
|
ret = btrfs_lookup_extent_ref(trans, root, bytenr, blocksize,
|
|
&refs);
|
|
@@ -4290,13 +3754,6 @@
|
|
if (slot < btrfs_header_nritems(path->nodes[i]) - 1) {
|
|
struct extent_buffer *node;
|
|
struct btrfs_disk_key disk_key;
|
|
-
|
|
- /*
|
|
- * there is more work to do in this level.
|
|
- * Update the drop_progress marker to reflect
|
|
- * the work we've done so far, and then bump
|
|
- * the slot number
|
|
- */
|
|
node = path->nodes[i];
|
|
path->slots[i]++;
|
|
*level = i;
|
|
@@ -4308,11 +3765,6 @@
|
|
return 0;
|
|
} else {
|
|
struct extent_buffer *parent;
|
|
-
|
|
- /*
|
|
- * this whole node is done, free our reference
|
|
- * on it and go up one level
|
|
- */
|
|
if (path->nodes[*level] == root->node)
|
|
parent = path->nodes[*level];
|
|
else
|
|
@@ -4439,13 +3891,13 @@
|
|
path = btrfs_alloc_path();
|
|
BUG_ON(!path);
|
|
|
|
- btrfs_assert_tree_locked(parent);
|
|
+ BUG_ON(!btrfs_tree_locked(parent));
|
|
parent_level = btrfs_header_level(parent);
|
|
extent_buffer_get(parent);
|
|
path->nodes[parent_level] = parent;
|
|
path->slots[parent_level] = btrfs_header_nritems(parent);
|
|
|
|
- btrfs_assert_tree_locked(node);
|
|
+ BUG_ON(!btrfs_tree_locked(node));
|
|
level = btrfs_header_level(node);
|
|
extent_buffer_get(node);
|
|
path->nodes[level] = node;
|
|
@@ -4992,7 +4444,7 @@
|
|
u64 lock_end = 0;
|
|
u64 num_bytes;
|
|
u64 ext_offset;
|
|
- u64 search_end = (u64)-1;
|
|
+ u64 first_pos;
|
|
u32 nritems;
|
|
int nr_scaned = 0;
|
|
int extent_locked = 0;
|
|
@@ -5000,6 +4452,7 @@
|
|
int ret;
|
|
|
|
memcpy(&key, leaf_key, sizeof(key));
|
|
+ first_pos = INT_LIMIT(loff_t) - extent_key->offset;
|
|
if (ref_path->owner_objectid != BTRFS_MULTIPLE_OBJECTIDS) {
|
|
if (key.objectid < ref_path->owner_objectid ||
|
|
(key.objectid == ref_path->owner_objectid &&
|
|
@@ -5048,7 +4501,7 @@
|
|
if ((key.objectid > ref_path->owner_objectid) ||
|
|
(key.objectid == ref_path->owner_objectid &&
|
|
key.type > BTRFS_EXTENT_DATA_KEY) ||
|
|
- key.offset >= search_end)
|
|
+ (key.offset >= first_pos + extent_key->offset))
|
|
break;
|
|
}
|
|
|
|
@@ -5081,10 +4534,8 @@
|
|
num_bytes = btrfs_file_extent_num_bytes(leaf, fi);
|
|
ext_offset = btrfs_file_extent_offset(leaf, fi);
|
|
|
|
- if (search_end == (u64)-1) {
|
|
- search_end = key.offset - ext_offset +
|
|
- btrfs_file_extent_ram_bytes(leaf, fi);
|
|
- }
|
|
+ if (first_pos > key.offset - ext_offset)
|
|
+ first_pos = key.offset - ext_offset;
|
|
|
|
if (!extent_locked) {
|
|
lock_start = key.offset;
|
|
@@ -5273,7 +4724,7 @@
|
|
}
|
|
skip:
|
|
if (ref_path->owner_objectid != BTRFS_MULTIPLE_OBJECTIDS &&
|
|
- key.offset >= search_end)
|
|
+ key.offset >= first_pos + extent_key->offset)
|
|
break;
|
|
|
|
cond_resched();
|
|
@@ -5327,7 +4778,6 @@
|
|
ref->bytenr = buf->start;
|
|
ref->owner = btrfs_header_owner(buf);
|
|
ref->generation = btrfs_header_generation(buf);
|
|
-
|
|
ret = btrfs_add_leaf_ref(root, ref, 0);
|
|
WARN_ON(ret);
|
|
btrfs_free_leaf_ref(root, ref);
|
|
@@ -5901,9 +5351,7 @@
|
|
prev_block = block_start;
|
|
}
|
|
|
|
- mutex_lock(&extent_root->fs_info->trans_mutex);
|
|
btrfs_record_root_in_trans(found_root);
|
|
- mutex_unlock(&extent_root->fs_info->trans_mutex);
|
|
if (ref_path->owner_objectid >= BTRFS_FIRST_FREE_OBJECTID) {
|
|
/*
|
|
* try to update data extent references while
|
|
@@ -6341,7 +5789,6 @@
|
|
int btrfs_free_block_groups(struct btrfs_fs_info *info)
|
|
{
|
|
struct btrfs_block_group_cache *block_group;
|
|
- struct btrfs_space_info *space_info;
|
|
struct rb_node *n;
|
|
|
|
spin_lock(&info->block_group_cache_lock);
|
|
@@ -6363,23 +5810,6 @@
|
|
spin_lock(&info->block_group_cache_lock);
|
|
}
|
|
spin_unlock(&info->block_group_cache_lock);
|
|
-
|
|
- /* now that all the block groups are freed, go through and
|
|
- * free all the space_info structs. This is only called during
|
|
- * the final stages of unmount, and so we know nobody is
|
|
- * using them. We call synchronize_rcu() once before we start,
|
|
- * just to be on the safe side.
|
|
- */
|
|
- synchronize_rcu();
|
|
-
|
|
- while(!list_empty(&info->space_info)) {
|
|
- space_info = list_entry(info->space_info.next,
|
|
- struct btrfs_space_info,
|
|
- list);
|
|
-
|
|
- list_del(&space_info->list);
|
|
- kfree(space_info);
|
|
- }
|
|
return 0;
|
|
}
|
|
|
|
@@ -6527,11 +5957,9 @@
|
|
path = btrfs_alloc_path();
|
|
BUG_ON(!path);
|
|
|
|
- spin_lock(&root->fs_info->block_group_cache_lock);
|
|
+ btrfs_remove_free_space_cache(block_group);
|
|
rb_erase(&block_group->cache_node,
|
|
&root->fs_info->block_group_cache_tree);
|
|
- spin_unlock(&root->fs_info->block_group_cache_lock);
|
|
- btrfs_remove_free_space_cache(block_group);
|
|
down_write(&block_group->space_info->groups_sem);
|
|
list_del(&block_group->list);
|
|
up_write(&block_group->space_info->groups_sem);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/file.c linux-2.6.29-rc3.owrt/fs/btrfs/file.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/file.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/file.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -29,6 +29,7 @@
|
|
#include <linux/writeback.h>
|
|
#include <linux/statfs.h>
|
|
#include <linux/compat.h>
|
|
+#include <linux/version.h>
|
|
#include "ctree.h"
|
|
#include "disk-io.h"
|
|
#include "transaction.h"
|
|
@@ -1091,24 +1092,19 @@
|
|
WARN_ON(num_pages > nrptrs);
|
|
memset(pages, 0, sizeof(struct page *) * nrptrs);
|
|
|
|
- ret = btrfs_check_data_free_space(root, inode, write_bytes);
|
|
+ ret = btrfs_check_free_space(root, write_bytes, 0);
|
|
if (ret)
|
|
goto out;
|
|
|
|
ret = prepare_pages(root, file, pages, num_pages,
|
|
pos, first_index, last_index,
|
|
write_bytes);
|
|
- if (ret) {
|
|
- btrfs_free_reserved_data_space(root, inode,
|
|
- write_bytes);
|
|
+ if (ret)
|
|
goto out;
|
|
- }
|
|
|
|
ret = btrfs_copy_from_user(pos, num_pages,
|
|
write_bytes, pages, buf);
|
|
if (ret) {
|
|
- btrfs_free_reserved_data_space(root, inode,
|
|
- write_bytes);
|
|
btrfs_drop_pages(pages, num_pages);
|
|
goto out;
|
|
}
|
|
@@ -1116,11 +1112,8 @@
|
|
ret = dirty_and_release_pages(NULL, root, file, pages,
|
|
num_pages, pos, write_bytes);
|
|
btrfs_drop_pages(pages, num_pages);
|
|
- if (ret) {
|
|
- btrfs_free_reserved_data_space(root, inode,
|
|
- write_bytes);
|
|
+ if (ret)
|
|
goto out;
|
|
- }
|
|
|
|
if (will_write) {
|
|
btrfs_fdatawrite_range(inode->i_mapping, pos,
|
|
@@ -1144,8 +1137,6 @@
|
|
}
|
|
out:
|
|
mutex_unlock(&inode->i_mutex);
|
|
- if (ret)
|
|
- err = ret;
|
|
|
|
out_nolock:
|
|
kfree(pages);
|
|
@@ -1224,15 +1215,15 @@
|
|
}
|
|
mutex_unlock(&root->fs_info->trans_mutex);
|
|
|
|
- root->log_batch++;
|
|
+ root->fs_info->tree_log_batch++;
|
|
filemap_fdatawrite(inode->i_mapping);
|
|
btrfs_wait_ordered_range(inode, 0, (u64)-1);
|
|
- root->log_batch++;
|
|
+ root->fs_info->tree_log_batch++;
|
|
|
|
/*
|
|
* ok we haven't committed the transaction yet, lets do a commit
|
|
*/
|
|
- if (file && file->private_data)
|
|
+ if (file->private_data)
|
|
btrfs_ioctl_trans_end(file);
|
|
|
|
trans = btrfs_start_transaction(root, 1);
|
|
@@ -1241,7 +1232,7 @@
|
|
goto out;
|
|
}
|
|
|
|
- ret = btrfs_log_dentry_safe(trans, root, dentry);
|
|
+ ret = btrfs_log_dentry_safe(trans, root, file->f_dentry);
|
|
if (ret < 0)
|
|
goto out;
|
|
|
|
@@ -1255,7 +1246,7 @@
|
|
* file again, but that will end up using the synchronization
|
|
* inside btrfs_sync_log to keep things safe.
|
|
*/
|
|
- mutex_unlock(&dentry->d_inode->i_mutex);
|
|
+ mutex_unlock(&file->f_dentry->d_inode->i_mutex);
|
|
|
|
if (ret > 0) {
|
|
ret = btrfs_commit_transaction(trans, root);
|
|
@@ -1263,7 +1254,7 @@
|
|
btrfs_sync_log(trans, root);
|
|
ret = btrfs_end_transaction(trans, root);
|
|
}
|
|
- mutex_lock(&dentry->d_inode->i_mutex);
|
|
+ mutex_lock(&file->f_dentry->d_inode->i_mutex);
|
|
out:
|
|
return ret > 0 ? EIO : ret;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/inode.c linux-2.6.29-rc3.owrt/fs/btrfs/inode.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -34,6 +34,7 @@
|
|
#include <linux/statfs.h>
|
|
#include <linux/compat.h>
|
|
#include <linux/bit_spinlock.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/xattr.h>
|
|
#include <linux/posix_acl.h>
|
|
#include <linux/falloc.h>
|
|
@@ -50,7 +51,6 @@
|
|
#include "tree-log.h"
|
|
#include "ref-cache.h"
|
|
#include "compression.h"
|
|
-#include "locking.h"
|
|
|
|
struct btrfs_iget_args {
|
|
u64 ino;
|
|
@@ -91,14 +91,32 @@
|
|
u64 start, u64 end, int *page_started,
|
|
unsigned long *nr_written, int unlock);
|
|
|
|
-static int btrfs_init_inode_security(struct inode *inode, struct inode *dir)
|
|
+/*
|
|
+ * a very lame attempt at stopping writes when the FS is 85% full. There
|
|
+ * are countless ways this is incorrect, but it is better than nothing.
|
|
+ */
|
|
+int btrfs_check_free_space(struct btrfs_root *root, u64 num_required,
|
|
+ int for_del)
|
|
{
|
|
- int err;
|
|
+ u64 total;
|
|
+ u64 used;
|
|
+ u64 thresh;
|
|
+ int ret = 0;
|
|
|
|
- err = btrfs_init_acl(inode, dir);
|
|
- if (!err)
|
|
- err = btrfs_xattr_security_init(inode, dir);
|
|
- return err;
|
|
+ spin_lock(&root->fs_info->delalloc_lock);
|
|
+ total = btrfs_super_total_bytes(&root->fs_info->super_copy);
|
|
+ used = btrfs_super_bytes_used(&root->fs_info->super_copy);
|
|
+ if (for_del)
|
|
+ thresh = total * 90;
|
|
+ else
|
|
+ thresh = total * 85;
|
|
+
|
|
+ do_div(thresh, 100);
|
|
+
|
|
+ if (used + root->fs_info->delalloc_bytes + num_required > thresh)
|
|
+ ret = -ENOSPC;
|
|
+ spin_unlock(&root->fs_info->delalloc_lock);
|
|
+ return ret;
|
|
}
|
|
|
|
/*
|
|
@@ -332,19 +350,6 @@
|
|
nr_pages = (end >> PAGE_CACHE_SHIFT) - (start >> PAGE_CACHE_SHIFT) + 1;
|
|
nr_pages = min(nr_pages, (128 * 1024UL) / PAGE_CACHE_SIZE);
|
|
|
|
- /*
|
|
- * we don't want to send crud past the end of i_size through
|
|
- * compression, that's just a waste of CPU time. So, if the
|
|
- * end of the file is before the start of our current
|
|
- * requested range of bytes, we bail out to the uncompressed
|
|
- * cleanup code that can deal with all of this.
|
|
- *
|
|
- * It isn't really the fastest way to fix things, but this is a
|
|
- * very uncommon corner.
|
|
- */
|
|
- if (actual_end <= start)
|
|
- goto cleanup_and_bail_uncompressed;
|
|
-
|
|
total_compressed = actual_end - start;
|
|
|
|
/* we want to make sure that amount of ram required to uncompress
|
|
@@ -489,7 +494,6 @@
|
|
goto again;
|
|
}
|
|
} else {
|
|
-cleanup_and_bail_uncompressed:
|
|
/*
|
|
* No compression, but we still need to write the pages in
|
|
* the file we've been given so far. redirty the locked
|
|
@@ -1162,7 +1166,6 @@
|
|
*/
|
|
if (!(old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) {
|
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
- btrfs_delalloc_reserve_space(root, inode, end - start + 1);
|
|
spin_lock(&root->fs_info->delalloc_lock);
|
|
BTRFS_I(inode)->delalloc_bytes += end - start + 1;
|
|
root->fs_info->delalloc_bytes += end - start + 1;
|
|
@@ -1196,12 +1199,9 @@
|
|
(unsigned long long)end - start + 1,
|
|
(unsigned long long)
|
|
root->fs_info->delalloc_bytes);
|
|
- btrfs_delalloc_free_space(root, inode, (u64)-1);
|
|
root->fs_info->delalloc_bytes = 0;
|
|
BTRFS_I(inode)->delalloc_bytes = 0;
|
|
} else {
|
|
- btrfs_delalloc_free_space(root, inode,
|
|
- end - start + 1);
|
|
root->fs_info->delalloc_bytes -= end - start + 1;
|
|
BTRFS_I(inode)->delalloc_bytes -= end - start + 1;
|
|
}
|
|
@@ -1324,11 +1324,12 @@
|
|
struct inode *inode, u64 file_offset,
|
|
struct list_head *list)
|
|
{
|
|
+ struct list_head *cur;
|
|
struct btrfs_ordered_sum *sum;
|
|
|
|
btrfs_set_trans_block_group(trans, inode);
|
|
-
|
|
- list_for_each_entry(sum, list, list) {
|
|
+ list_for_each(cur, list) {
|
|
+ sum = list_entry(cur, struct btrfs_ordered_sum, list);
|
|
btrfs_csum_file_blocks(trans,
|
|
BTRFS_I(inode)->root->fs_info->csum_root, sum);
|
|
}
|
|
@@ -2012,7 +2013,6 @@
|
|
BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item);
|
|
|
|
alloc_group_block = btrfs_inode_block_group(leaf, inode_item);
|
|
-
|
|
BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0,
|
|
alloc_group_block, 0);
|
|
btrfs_free_path(path);
|
|
@@ -2039,7 +2039,6 @@
|
|
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
|
|
break;
|
|
default:
|
|
- inode->i_op = &btrfs_special_inode_operations;
|
|
init_special_inode(inode, inode->i_mode, rdev);
|
|
break;
|
|
}
|
|
@@ -2109,7 +2108,6 @@
|
|
goto failed;
|
|
}
|
|
|
|
- btrfs_unlock_up_safe(path, 1);
|
|
leaf = path->nodes[0];
|
|
inode_item = btrfs_item_ptr(leaf, path->slots[0],
|
|
struct btrfs_inode_item);
|
|
@@ -2221,6 +2219,10 @@
|
|
|
|
root = BTRFS_I(dir)->root;
|
|
|
|
+ ret = btrfs_check_free_space(root, 1, 1);
|
|
+ if (ret)
|
|
+ goto fail;
|
|
+
|
|
trans = btrfs_start_transaction(root, 1);
|
|
|
|
btrfs_set_trans_block_group(trans, dir);
|
|
@@ -2233,6 +2235,7 @@
|
|
nr = trans->blocks_used;
|
|
|
|
btrfs_end_transaction_throttle(trans, root);
|
|
+fail:
|
|
btrfs_btree_balance_dirty(root, nr);
|
|
return ret;
|
|
}
|
|
@@ -2255,6 +2258,10 @@
|
|
return -ENOTEMPTY;
|
|
}
|
|
|
|
+ ret = btrfs_check_free_space(root, 1, 1);
|
|
+ if (ret)
|
|
+ goto fail;
|
|
+
|
|
trans = btrfs_start_transaction(root, 1);
|
|
btrfs_set_trans_block_group(trans, dir);
|
|
|
|
@@ -2271,6 +2278,7 @@
|
|
fail_trans:
|
|
nr = trans->blocks_used;
|
|
ret = btrfs_end_transaction_throttle(trans, root);
|
|
+fail:
|
|
btrfs_btree_balance_dirty(root, nr);
|
|
|
|
if (ret && !err)
|
|
@@ -2421,8 +2429,6 @@
|
|
ref->generation = leaf_gen;
|
|
ref->nritems = 0;
|
|
|
|
- btrfs_sort_leaf_ref(ref);
|
|
-
|
|
ret = btrfs_add_leaf_ref(root, ref, 0);
|
|
WARN_ON(ret);
|
|
btrfs_free_leaf_ref(root, ref);
|
|
@@ -2470,7 +2476,7 @@
|
|
struct btrfs_path *path;
|
|
struct btrfs_key key;
|
|
struct btrfs_key found_key;
|
|
- u32 found_type = (u8)-1;
|
|
+ u32 found_type;
|
|
struct extent_buffer *leaf;
|
|
struct btrfs_file_extent_item *fi;
|
|
u64 extent_start = 0;
|
|
@@ -2497,6 +2503,8 @@
|
|
key.offset = (u64)-1;
|
|
key.type = (u8)-1;
|
|
|
|
+ btrfs_init_path(path);
|
|
+
|
|
search_again:
|
|
ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
|
|
if (ret < 0)
|
|
@@ -2655,8 +2663,6 @@
|
|
if (pending_del_nr)
|
|
goto del_pending;
|
|
btrfs_release_path(root, path);
|
|
- if (found_type == BTRFS_INODE_ITEM_KEY)
|
|
- break;
|
|
goto search_again;
|
|
}
|
|
|
|
@@ -2673,8 +2679,6 @@
|
|
BUG_ON(ret);
|
|
pending_del_nr = 0;
|
|
btrfs_release_path(root, path);
|
|
- if (found_type == BTRFS_INODE_ITEM_KEY)
|
|
- break;
|
|
goto search_again;
|
|
}
|
|
}
|
|
@@ -2784,7 +2788,7 @@
|
|
if (size <= hole_start)
|
|
return 0;
|
|
|
|
- err = btrfs_check_metadata_free_space(root);
|
|
+ err = btrfs_check_free_space(root, 1, 0);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -2980,7 +2984,6 @@
|
|
bi->last_trans = 0;
|
|
bi->logged_trans = 0;
|
|
bi->delalloc_bytes = 0;
|
|
- bi->reserved_bytes = 0;
|
|
bi->disk_i_size = 0;
|
|
bi->flags = 0;
|
|
bi->index_cnt = (u64)-1;
|
|
@@ -3002,7 +3005,6 @@
|
|
inode->i_ino = args->ino;
|
|
init_btrfs_i(inode);
|
|
BTRFS_I(inode)->root = args->root;
|
|
- btrfs_set_inode_space_info(args->root, inode);
|
|
return 0;
|
|
}
|
|
|
|
@@ -3263,7 +3265,7 @@
|
|
|
|
/* Reached end of directory/root. Bump pos past the last item. */
|
|
if (key_type == BTRFS_DIR_INDEX_KEY)
|
|
- filp->f_pos = INT_LIMIT(off_t);
|
|
+ filp->f_pos = INT_LIMIT(typeof(filp->f_pos));
|
|
else
|
|
filp->f_pos++;
|
|
nopos:
|
|
@@ -3423,7 +3425,6 @@
|
|
BTRFS_I(inode)->index_cnt = 2;
|
|
BTRFS_I(inode)->root = root;
|
|
BTRFS_I(inode)->generation = trans->transid;
|
|
- btrfs_set_inode_space_info(root, inode);
|
|
|
|
if (mode & S_IFDIR)
|
|
owner = 0;
|
|
@@ -3457,14 +3458,7 @@
|
|
root->highest_inode = objectid;
|
|
|
|
inode->i_uid = current_fsuid();
|
|
-
|
|
- if (dir && (dir->i_mode & S_ISGID)) {
|
|
- inode->i_gid = dir->i_gid;
|
|
- if (S_ISDIR(mode))
|
|
- mode |= S_ISGID;
|
|
- } else
|
|
- inode->i_gid = current_fsgid();
|
|
-
|
|
+ inode->i_gid = current_fsgid();
|
|
inode->i_mode = mode;
|
|
inode->i_ino = objectid;
|
|
inode_set_bytes(inode, 0);
|
|
@@ -3571,7 +3565,7 @@
|
|
if (!new_valid_dev(rdev))
|
|
return -EINVAL;
|
|
|
|
- err = btrfs_check_metadata_free_space(root);
|
|
+ err = btrfs_check_free_space(root, 1, 0);
|
|
if (err)
|
|
goto fail;
|
|
|
|
@@ -3592,7 +3586,7 @@
|
|
if (IS_ERR(inode))
|
|
goto out_unlock;
|
|
|
|
- err = btrfs_init_inode_security(inode, dir);
|
|
+ err = btrfs_init_acl(inode, dir);
|
|
if (err) {
|
|
drop_inode = 1;
|
|
goto out_unlock;
|
|
@@ -3634,7 +3628,7 @@
|
|
u64 objectid;
|
|
u64 index = 0;
|
|
|
|
- err = btrfs_check_metadata_free_space(root);
|
|
+ err = btrfs_check_free_space(root, 1, 0);
|
|
if (err)
|
|
goto fail;
|
|
trans = btrfs_start_transaction(root, 1);
|
|
@@ -3655,7 +3649,7 @@
|
|
if (IS_ERR(inode))
|
|
goto out_unlock;
|
|
|
|
- err = btrfs_init_inode_security(inode, dir);
|
|
+ err = btrfs_init_acl(inode, dir);
|
|
if (err) {
|
|
drop_inode = 1;
|
|
goto out_unlock;
|
|
@@ -3702,7 +3696,7 @@
|
|
return -ENOENT;
|
|
|
|
btrfs_inc_nlink(inode);
|
|
- err = btrfs_check_metadata_free_space(root);
|
|
+ err = btrfs_check_free_space(root, 1, 0);
|
|
if (err)
|
|
goto fail;
|
|
err = btrfs_set_inode_index(dir, &index);
|
|
@@ -3748,7 +3742,7 @@
|
|
u64 index = 0;
|
|
unsigned long nr = 1;
|
|
|
|
- err = btrfs_check_metadata_free_space(root);
|
|
+ err = btrfs_check_free_space(root, 1, 0);
|
|
if (err)
|
|
goto out_unlock;
|
|
|
|
@@ -3778,7 +3772,7 @@
|
|
|
|
drop_on_err = 1;
|
|
|
|
- err = btrfs_init_inode_security(inode, dir);
|
|
+ err = btrfs_init_acl(inode, dir);
|
|
if (err)
|
|
goto out_fail;
|
|
|
|
@@ -4164,10 +4158,9 @@
|
|
return -EINVAL;
|
|
}
|
|
|
|
-static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|
- __u64 start, __u64 len)
|
|
+static sector_t btrfs_bmap(struct address_space *mapping, sector_t iblock)
|
|
{
|
|
- return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent);
|
|
+ return extent_bmap(mapping, iblock, btrfs_get_extent);
|
|
}
|
|
|
|
int btrfs_readpage(struct file *file, struct page *page)
|
|
@@ -4230,7 +4223,7 @@
|
|
{
|
|
if (PageWriteback(page) || PageDirty(page))
|
|
return 0;
|
|
- return __btrfs_releasepage(page, gfp_flags & GFP_NOFS);
|
|
+ return __btrfs_releasepage(page, gfp_flags);
|
|
}
|
|
|
|
static void btrfs_invalidatepage(struct page *page, unsigned long offset)
|
|
@@ -4305,7 +4298,7 @@
|
|
u64 page_start;
|
|
u64 page_end;
|
|
|
|
- ret = btrfs_check_data_free_space(root, inode, PAGE_CACHE_SIZE);
|
|
+ ret = btrfs_check_free_space(root, PAGE_CACHE_SIZE, 0);
|
|
if (ret)
|
|
goto out;
|
|
|
|
@@ -4318,7 +4311,6 @@
|
|
|
|
if ((page->mapping != inode->i_mapping) ||
|
|
(page_start >= size)) {
|
|
- btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE);
|
|
/* page got truncated out from underneath us */
|
|
goto out_unlock;
|
|
}
|
|
@@ -4601,7 +4593,7 @@
|
|
if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)
|
|
return -EXDEV;
|
|
|
|
- ret = btrfs_check_metadata_free_space(root);
|
|
+ ret = btrfs_check_free_space(root, 1, 0);
|
|
if (ret)
|
|
goto out_unlock;
|
|
|
|
@@ -4719,7 +4711,7 @@
|
|
if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root))
|
|
return -ENAMETOOLONG;
|
|
|
|
- err = btrfs_check_metadata_free_space(root);
|
|
+ err = btrfs_check_free_space(root, 1, 0);
|
|
if (err)
|
|
goto out_fail;
|
|
|
|
@@ -4741,7 +4733,7 @@
|
|
if (IS_ERR(inode))
|
|
goto out_unlock;
|
|
|
|
- err = btrfs_init_inode_security(inode, dir);
|
|
+ err = btrfs_init_acl(inode, dir);
|
|
if (err) {
|
|
drop_inode = 1;
|
|
goto out_unlock;
|
|
@@ -4995,24 +4987,13 @@
|
|
.clear_bit_hook = btrfs_clear_bit_hook,
|
|
};
|
|
|
|
-/*
|
|
- * btrfs doesn't support the bmap operation because swapfiles
|
|
- * use bmap to make a mapping of extents in the file. They assume
|
|
- * these extents won't change over the life of the file and they
|
|
- * use the bmap result to do IO directly to the drive.
|
|
- *
|
|
- * the btrfs bmap call would return logical addresses that aren't
|
|
- * suitable for IO and they also will change frequently as COW
|
|
- * operations happen. So, swapfile + btrfs == corruption.
|
|
- *
|
|
- * For now we're avoiding this by dropping bmap.
|
|
- */
|
|
static struct address_space_operations btrfs_aops = {
|
|
.readpage = btrfs_readpage,
|
|
.writepage = btrfs_writepage,
|
|
.writepages = btrfs_writepages,
|
|
.readpages = btrfs_readpages,
|
|
.sync_page = block_sync_page,
|
|
+ .bmap = btrfs_bmap,
|
|
.direct_IO = btrfs_direct_IO,
|
|
.invalidatepage = btrfs_invalidatepage,
|
|
.releasepage = btrfs_releasepage,
|
|
@@ -5036,7 +5017,6 @@
|
|
.removexattr = btrfs_removexattr,
|
|
.permission = btrfs_permission,
|
|
.fallocate = btrfs_fallocate,
|
|
- .fiemap = btrfs_fiemap,
|
|
};
|
|
static struct inode_operations btrfs_special_inode_operations = {
|
|
.getattr = btrfs_getattr,
|
|
@@ -5052,8 +5032,4 @@
|
|
.follow_link = page_follow_link_light,
|
|
.put_link = page_put_link,
|
|
.permission = btrfs_permission,
|
|
- .setxattr = btrfs_setxattr,
|
|
- .getxattr = btrfs_getxattr,
|
|
- .listxattr = btrfs_listxattr,
|
|
- .removexattr = btrfs_removexattr,
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/inode-map.c linux-2.6.29-rc3.owrt/fs/btrfs/inode-map.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/inode-map.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/inode-map.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -84,6 +84,7 @@
|
|
search_key.type = 0;
|
|
search_key.offset = 0;
|
|
|
|
+ btrfs_init_path(path);
|
|
start_found = 0;
|
|
ret = btrfs_search_slot(trans, root, &search_key, path, 0, 0);
|
|
if (ret < 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/ioctl.c linux-2.6.29-rc3.owrt/fs/btrfs/ioctl.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/ioctl.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/ioctl.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -38,6 +38,7 @@
|
|
#include <linux/compat.h>
|
|
#include <linux/bit_spinlock.h>
|
|
#include <linux/security.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/xattr.h>
|
|
#include <linux/vmalloc.h>
|
|
#include "compat.h"
|
|
@@ -70,7 +71,7 @@
|
|
u64 index = 0;
|
|
unsigned long nr = 1;
|
|
|
|
- ret = btrfs_check_metadata_free_space(root);
|
|
+ ret = btrfs_check_free_space(root, 1, 0);
|
|
if (ret)
|
|
goto fail_commit;
|
|
|
|
@@ -203,7 +204,7 @@
|
|
if (!root->ref_cows)
|
|
return -EINVAL;
|
|
|
|
- ret = btrfs_check_metadata_free_space(root);
|
|
+ ret = btrfs_check_free_space(root, 1, 0);
|
|
if (ret)
|
|
goto fail_unlock;
|
|
|
|
@@ -374,7 +375,7 @@
|
|
unsigned long i;
|
|
int ret;
|
|
|
|
- ret = btrfs_check_data_free_space(root, inode, inode->i_size);
|
|
+ ret = btrfs_check_free_space(root, inode->i_size, 0);
|
|
if (ret)
|
|
return -ENOSPC;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/Kconfig linux-2.6.29-rc3.owrt/fs/btrfs/Kconfig
|
|
--- linux-2.6.29.owrt/fs/btrfs/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -16,16 +16,3 @@
|
|
module will be called btrfs.
|
|
|
|
If unsure, say N.
|
|
-
|
|
-config BTRFS_FS_POSIX_ACL
|
|
- bool "Btrfs POSIX Access Control Lists"
|
|
- depends on BTRFS_FS
|
|
- select FS_POSIX_ACL
|
|
- help
|
|
- POSIX Access Control Lists (ACLs) support permissions for users and
|
|
- groups beyond the owner/group/world scheme.
|
|
-
|
|
- To learn more about Access Control Lists, visit the POSIX ACLs for
|
|
- Linux website <http://acl.bestbits.at/>.
|
|
-
|
|
- If you don't know what Access Control Lists are, say N
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/locking.c linux-2.6.29-rc3.owrt/fs/btrfs/locking.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/locking.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/locking.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -25,203 +25,64 @@
|
|
#include "extent_io.h"
|
|
#include "locking.h"
|
|
|
|
-static inline void spin_nested(struct extent_buffer *eb)
|
|
-{
|
|
- spin_lock(&eb->lock);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Setting a lock to blocking will drop the spinlock and set the
|
|
- * flag that forces other procs who want the lock to wait. After
|
|
- * this you can safely schedule with the lock held.
|
|
- */
|
|
-void btrfs_set_lock_blocking(struct extent_buffer *eb)
|
|
-{
|
|
- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags)) {
|
|
- set_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags);
|
|
- spin_unlock(&eb->lock);
|
|
- }
|
|
- /* exit with the spin lock released and the bit set */
|
|
-}
|
|
-
|
|
/*
|
|
- * clearing the blocking flag will take the spinlock again.
|
|
- * After this you can't safely schedule
|
|
- */
|
|
-void btrfs_clear_lock_blocking(struct extent_buffer *eb)
|
|
-{
|
|
- if (test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags)) {
|
|
- spin_nested(eb);
|
|
- clear_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags);
|
|
- smp_mb__after_clear_bit();
|
|
- }
|
|
- /* exit with the spin lock held */
|
|
-}
|
|
-
|
|
-/*
|
|
- * unfortunately, many of the places that currently set a lock to blocking
|
|
- * don't end up blocking for every long, and often they don't block
|
|
- * at all. For a dbench 50 run, if we don't spin one the blocking bit
|
|
- * at all, the context switch rate can jump up to 400,000/sec or more.
|
|
+ * locks the per buffer mutex in an extent buffer. This uses adaptive locks
|
|
+ * and the spin is not tuned very extensively. The spinning does make a big
|
|
+ * difference in almost every workload, but spinning for the right amount of
|
|
+ * time needs some help.
|
|
*
|
|
- * So, we're still stuck with this crummy spin on the blocking bit,
|
|
- * at least until the most common causes of the short blocks
|
|
- * can be dealt with.
|
|
+ * In general, we want to spin as long as the lock holder is doing btree
|
|
+ * searches, and we should give up if they are in more expensive code.
|
|
*/
|
|
-static int btrfs_spin_on_block(struct extent_buffer *eb)
|
|
+
|
|
+int btrfs_tree_lock(struct extent_buffer *eb)
|
|
{
|
|
int i;
|
|
+
|
|
+ if (mutex_trylock(&eb->mutex))
|
|
+ return 0;
|
|
for (i = 0; i < 512; i++) {
|
|
cpu_relax();
|
|
- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
|
|
- return 1;
|
|
- if (need_resched())
|
|
- break;
|
|
+ if (mutex_trylock(&eb->mutex))
|
|
+ return 0;
|
|
}
|
|
+ cpu_relax();
|
|
+ mutex_lock_nested(&eb->mutex, BTRFS_MAX_LEVEL - btrfs_header_level(eb));
|
|
return 0;
|
|
}
|
|
|
|
-/*
|
|
- * This is somewhat different from trylock. It will take the
|
|
- * spinlock but if it finds the lock is set to blocking, it will
|
|
- * return without the lock held.
|
|
- *
|
|
- * returns 1 if it was able to take the lock and zero otherwise
|
|
- *
|
|
- * After this call, scheduling is not safe without first calling
|
|
- * btrfs_set_lock_blocking()
|
|
- */
|
|
-int btrfs_try_spin_lock(struct extent_buffer *eb)
|
|
+int btrfs_try_tree_lock(struct extent_buffer *eb)
|
|
{
|
|
- int i;
|
|
-
|
|
- spin_nested(eb);
|
|
- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
|
|
- return 1;
|
|
- spin_unlock(&eb->lock);
|
|
-
|
|
- /* spin for a bit on the BLOCKING flag */
|
|
- for (i = 0; i < 2; i++) {
|
|
- if (!btrfs_spin_on_block(eb))
|
|
- break;
|
|
-
|
|
- spin_nested(eb);
|
|
- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
|
|
- return 1;
|
|
- spin_unlock(&eb->lock);
|
|
- }
|
|
- return 0;
|
|
+ return mutex_trylock(&eb->mutex);
|
|
}
|
|
|
|
-/*
|
|
- * the autoremove wake function will return 0 if it tried to wake up
|
|
- * a process that was already awake, which means that process won't
|
|
- * count as an exclusive wakeup. The waitq code will continue waking
|
|
- * procs until it finds one that was actually sleeping.
|
|
- *
|
|
- * For btrfs, this isn't quite what we want. We want a single proc
|
|
- * to be notified that the lock is ready for taking. If that proc
|
|
- * already happen to be awake, great, it will loop around and try for
|
|
- * the lock.
|
|
- *
|
|
- * So, btrfs_wake_function always returns 1, even when the proc that we
|
|
- * tried to wake up was already awake.
|
|
- */
|
|
-static int btrfs_wake_function(wait_queue_t *wait, unsigned mode,
|
|
- int sync, void *key)
|
|
+int btrfs_tree_unlock(struct extent_buffer *eb)
|
|
{
|
|
- autoremove_wake_function(wait, mode, sync, key);
|
|
- return 1;
|
|
+ mutex_unlock(&eb->mutex);
|
|
+ return 0;
|
|
}
|
|
|
|
-/*
|
|
- * returns with the extent buffer spinlocked.
|
|
- *
|
|
- * This will spin and/or wait as required to take the lock, and then
|
|
- * return with the spinlock held.
|
|
- *
|
|
- * After this call, scheduling is not safe without first calling
|
|
- * btrfs_set_lock_blocking()
|
|
- */
|
|
-int btrfs_tree_lock(struct extent_buffer *eb)
|
|
+int btrfs_tree_locked(struct extent_buffer *eb)
|
|
{
|
|
- DEFINE_WAIT(wait);
|
|
- wait.func = btrfs_wake_function;
|
|
-
|
|
- while(1) {
|
|
- spin_nested(eb);
|
|
-
|
|
- /* nobody is blocking, exit with the spinlock held */
|
|
- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
|
|
- return 0;
|
|
-
|
|
- /*
|
|
- * we have the spinlock, but the real owner is blocking.
|
|
- * wait for them
|
|
- */
|
|
- spin_unlock(&eb->lock);
|
|
-
|
|
- /*
|
|
- * spin for a bit, and if the blocking flag goes away,
|
|
- * loop around
|
|
- */
|
|
- if (btrfs_spin_on_block(eb))
|
|
- continue;
|
|
-
|
|
- prepare_to_wait_exclusive(&eb->lock_wq, &wait,
|
|
- TASK_UNINTERRUPTIBLE);
|
|
-
|
|
- if (test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
|
|
- schedule();
|
|
-
|
|
- finish_wait(&eb->lock_wq, &wait);
|
|
- }
|
|
- return 0;
|
|
+ return mutex_is_locked(&eb->mutex);
|
|
}
|
|
|
|
/*
|
|
- * Very quick trylock, this does not spin or schedule. It returns
|
|
- * 1 with the spinlock held if it was able to take the lock, or it
|
|
- * returns zero if it was unable to take the lock.
|
|
- *
|
|
- * After this call, scheduling is not safe without first calling
|
|
- * btrfs_set_lock_blocking()
|
|
+ * btrfs_search_slot uses this to decide if it should drop its locks
|
|
+ * before doing something expensive like allocating free blocks for cow.
|
|
*/
|
|
-int btrfs_try_tree_lock(struct extent_buffer *eb)
|
|
+int btrfs_path_lock_waiting(struct btrfs_path *path, int level)
|
|
{
|
|
- if (spin_trylock(&eb->lock)) {
|
|
- if (test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags)) {
|
|
- /*
|
|
- * we've got the spinlock, but the real owner is
|
|
- * blocking. Drop the spinlock and return failure
|
|
- */
|
|
- spin_unlock(&eb->lock);
|
|
- return 0;
|
|
- }
|
|
- return 1;
|
|
+ int i;
|
|
+ struct extent_buffer *eb;
|
|
+ for (i = level; i <= level + 1 && i < BTRFS_MAX_LEVEL; i++) {
|
|
+ eb = path->nodes[i];
|
|
+ if (!eb)
|
|
+ break;
|
|
+ smp_mb();
|
|
+ if (!list_empty(&eb->mutex.wait_list))
|
|
+ return 1;
|
|
}
|
|
- /* someone else has the spinlock giveup */
|
|
return 0;
|
|
}
|
|
|
|
-int btrfs_tree_unlock(struct extent_buffer *eb)
|
|
-{
|
|
- /*
|
|
- * if we were a blocking owner, we don't have the spinlock held
|
|
- * just clear the bit and look for waiters
|
|
- */
|
|
- if (test_and_clear_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
|
|
- smp_mb__after_clear_bit();
|
|
- else
|
|
- spin_unlock(&eb->lock);
|
|
-
|
|
- if (waitqueue_active(&eb->lock_wq))
|
|
- wake_up(&eb->lock_wq);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void btrfs_assert_tree_locked(struct extent_buffer *eb)
|
|
-{
|
|
- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
|
|
- assert_spin_locked(&eb->lock);
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/locking.h linux-2.6.29-rc3.owrt/fs/btrfs/locking.h
|
|
--- linux-2.6.29.owrt/fs/btrfs/locking.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/locking.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -21,11 +21,7 @@
|
|
|
|
int btrfs_tree_lock(struct extent_buffer *eb);
|
|
int btrfs_tree_unlock(struct extent_buffer *eb);
|
|
-
|
|
+int btrfs_tree_locked(struct extent_buffer *eb);
|
|
int btrfs_try_tree_lock(struct extent_buffer *eb);
|
|
-int btrfs_try_spin_lock(struct extent_buffer *eb);
|
|
-
|
|
-void btrfs_set_lock_blocking(struct extent_buffer *eb);
|
|
-void btrfs_clear_lock_blocking(struct extent_buffer *eb);
|
|
-void btrfs_assert_tree_locked(struct extent_buffer *eb);
|
|
+int btrfs_path_lock_waiting(struct btrfs_path *path, int level);
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/ordered-data.c linux-2.6.29-rc3.owrt/fs/btrfs/ordered-data.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/ordered-data.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/ordered-data.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -613,6 +613,7 @@
|
|
struct btrfs_sector_sum *sector_sums;
|
|
struct btrfs_ordered_extent *ordered;
|
|
struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree;
|
|
+ struct list_head *cur;
|
|
unsigned long num_sectors;
|
|
unsigned long i;
|
|
u32 sectorsize = BTRFS_I(inode)->root->sectorsize;
|
|
@@ -623,7 +624,8 @@
|
|
return 1;
|
|
|
|
mutex_lock(&tree->mutex);
|
|
- list_for_each_entry_reverse(ordered_sum, &ordered->list, list) {
|
|
+ list_for_each_prev(cur, &ordered->list) {
|
|
+ ordered_sum = list_entry(cur, struct btrfs_ordered_sum, list);
|
|
if (disk_bytenr >= ordered_sum->bytenr) {
|
|
num_sectors = ordered_sum->len / sectorsize;
|
|
sector_sums = ordered_sum->sums;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/ref-cache.c linux-2.6.29-rc3.owrt/fs/btrfs/ref-cache.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/ref-cache.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/ref-cache.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -17,7 +17,6 @@
|
|
*/
|
|
|
|
#include <linux/sched.h>
|
|
-#include <linux/sort.h>
|
|
#include "ctree.h"
|
|
#include "ref-cache.h"
|
|
#include "transaction.h"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/ref-cache.h linux-2.6.29-rc3.owrt/fs/btrfs/ref-cache.h
|
|
--- linux-2.6.29.owrt/fs/btrfs/ref-cache.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/ref-cache.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -73,4 +73,5 @@
|
|
int btrfs_remove_leaf_refs(struct btrfs_root *root, u64 max_root_gen,
|
|
int shared);
|
|
int btrfs_remove_leaf_ref(struct btrfs_root *root, struct btrfs_leaf_ref *ref);
|
|
+
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/super.c linux-2.6.29-rc3.owrt/fs/btrfs/super.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -37,6 +37,7 @@
|
|
#include <linux/ctype.h>
|
|
#include <linux/namei.h>
|
|
#include <linux/miscdevice.h>
|
|
+#include <linux/version.h>
|
|
#include <linux/magic.h>
|
|
#include "compat.h"
|
|
#include "ctree.h"
|
|
@@ -379,6 +380,7 @@
|
|
btrfs_start_delalloc_inodes(root);
|
|
btrfs_wait_ordered_extents(root, 0);
|
|
|
|
+ btrfs_clean_old_snapshots(root);
|
|
trans = btrfs_start_transaction(root, 1);
|
|
ret = btrfs_commit_transaction(trans, root);
|
|
sb->s_dirt = 0;
|
|
@@ -510,10 +512,6 @@
|
|
struct btrfs_root *root = btrfs_sb(sb);
|
|
int ret;
|
|
|
|
- ret = btrfs_parse_options(root, data);
|
|
- if (ret)
|
|
- return -EINVAL;
|
|
-
|
|
if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
|
|
return 0;
|
|
|
|
@@ -585,18 +583,17 @@
|
|
struct btrfs_ioctl_vol_args *vol;
|
|
struct btrfs_fs_devices *fs_devices;
|
|
int ret = -ENOTTY;
|
|
+ int len;
|
|
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
return -EPERM;
|
|
|
|
vol = kmalloc(sizeof(*vol), GFP_KERNEL);
|
|
- if (!vol)
|
|
- return -ENOMEM;
|
|
-
|
|
if (copy_from_user(vol, (void __user *)arg, sizeof(*vol))) {
|
|
ret = -EFAULT;
|
|
goto out;
|
|
}
|
|
+ len = strnlen(vol->name, BTRFS_PATH_NAME_MAX);
|
|
|
|
switch (cmd) {
|
|
case BTRFS_IOC_SCAN_DEV:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/transaction.c linux-2.6.29-rc3.owrt/fs/btrfs/transaction.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/transaction.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/transaction.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -688,9 +688,7 @@
|
|
num_bytes -= btrfs_root_used(&dirty->root->root_item);
|
|
bytes_used = btrfs_root_used(&root->root_item);
|
|
if (num_bytes) {
|
|
- mutex_lock(&root->fs_info->trans_mutex);
|
|
btrfs_record_root_in_trans(root);
|
|
- mutex_unlock(&root->fs_info->trans_mutex);
|
|
btrfs_set_root_used(&root->root_item,
|
|
bytes_used - num_bytes);
|
|
}
|
|
@@ -854,9 +852,11 @@
|
|
{
|
|
struct btrfs_pending_snapshot *pending;
|
|
struct list_head *head = &trans->transaction->pending_snapshots;
|
|
+ struct list_head *cur;
|
|
int ret;
|
|
|
|
- list_for_each_entry(pending, head, list) {
|
|
+ list_for_each(cur, head) {
|
|
+ pending = list_entry(cur, struct btrfs_pending_snapshot, list);
|
|
ret = create_pending_snapshot(trans, fs_info, pending);
|
|
BUG_ON(ret);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/tree-defrag.c linux-2.6.29-rc3.owrt/fs/btrfs/tree-defrag.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/tree-defrag.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/tree-defrag.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -74,7 +74,6 @@
|
|
u32 nritems;
|
|
|
|
root_node = btrfs_lock_root_node(root);
|
|
- btrfs_set_lock_blocking(root_node);
|
|
nritems = btrfs_header_nritems(root_node);
|
|
root->defrag_max.objectid = 0;
|
|
/* from above we know this is not a leaf */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/tree-log.c linux-2.6.29-rc3.owrt/fs/btrfs/tree-log.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/tree-log.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/tree-log.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -78,6 +78,104 @@
|
|
*/
|
|
|
|
/*
|
|
+ * btrfs_add_log_tree adds a new per-subvolume log tree into the
|
|
+ * tree of log tree roots. This must be called with a tree log transaction
|
|
+ * running (see start_log_trans).
|
|
+ */
|
|
+static int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
|
|
+ struct btrfs_root *root)
|
|
+{
|
|
+ struct btrfs_key key;
|
|
+ struct btrfs_root_item root_item;
|
|
+ struct btrfs_inode_item *inode_item;
|
|
+ struct extent_buffer *leaf;
|
|
+ struct btrfs_root *new_root = root;
|
|
+ int ret;
|
|
+ u64 objectid = root->root_key.objectid;
|
|
+
|
|
+ leaf = btrfs_alloc_free_block(trans, root, root->leafsize, 0,
|
|
+ BTRFS_TREE_LOG_OBJECTID,
|
|
+ trans->transid, 0, 0, 0);
|
|
+ if (IS_ERR(leaf)) {
|
|
+ ret = PTR_ERR(leaf);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ btrfs_set_header_nritems(leaf, 0);
|
|
+ btrfs_set_header_level(leaf, 0);
|
|
+ btrfs_set_header_bytenr(leaf, leaf->start);
|
|
+ btrfs_set_header_generation(leaf, trans->transid);
|
|
+ btrfs_set_header_owner(leaf, BTRFS_TREE_LOG_OBJECTID);
|
|
+
|
|
+ write_extent_buffer(leaf, root->fs_info->fsid,
|
|
+ (unsigned long)btrfs_header_fsid(leaf),
|
|
+ BTRFS_FSID_SIZE);
|
|
+ btrfs_mark_buffer_dirty(leaf);
|
|
+
|
|
+ inode_item = &root_item.inode;
|
|
+ memset(inode_item, 0, sizeof(*inode_item));
|
|
+ inode_item->generation = cpu_to_le64(1);
|
|
+ inode_item->size = cpu_to_le64(3);
|
|
+ inode_item->nlink = cpu_to_le32(1);
|
|
+ inode_item->nbytes = cpu_to_le64(root->leafsize);
|
|
+ inode_item->mode = cpu_to_le32(S_IFDIR | 0755);
|
|
+
|
|
+ btrfs_set_root_bytenr(&root_item, leaf->start);
|
|
+ btrfs_set_root_generation(&root_item, trans->transid);
|
|
+ btrfs_set_root_level(&root_item, 0);
|
|
+ btrfs_set_root_refs(&root_item, 0);
|
|
+ btrfs_set_root_used(&root_item, 0);
|
|
+
|
|
+ memset(&root_item.drop_progress, 0, sizeof(root_item.drop_progress));
|
|
+ root_item.drop_level = 0;
|
|
+
|
|
+ btrfs_tree_unlock(leaf);
|
|
+ free_extent_buffer(leaf);
|
|
+ leaf = NULL;
|
|
+
|
|
+ btrfs_set_root_dirid(&root_item, 0);
|
|
+
|
|
+ key.objectid = BTRFS_TREE_LOG_OBJECTID;
|
|
+ key.offset = objectid;
|
|
+ btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY);
|
|
+ ret = btrfs_insert_root(trans, root->fs_info->log_root_tree, &key,
|
|
+ &root_item);
|
|
+ if (ret)
|
|
+ goto fail;
|
|
+
|
|
+ new_root = btrfs_read_fs_root_no_radix(root->fs_info->log_root_tree,
|
|
+ &key);
|
|
+ BUG_ON(!new_root);
|
|
+
|
|
+ WARN_ON(root->log_root);
|
|
+ root->log_root = new_root;
|
|
+
|
|
+ /*
|
|
+ * log trees do not get reference counted because they go away
|
|
+ * before a real commit is actually done. They do store pointers
|
|
+ * to file data extents, and those reference counts still get
|
|
+ * updated (along with back refs to the log tree).
|
|
+ */
|
|
+ new_root->ref_cows = 0;
|
|
+ new_root->last_trans = trans->transid;
|
|
+
|
|
+ /*
|
|
+ * we need to make sure the root block for this new tree
|
|
+ * is marked as dirty in the dirty_log_pages tree. This
|
|
+ * is how it gets flushed down to disk at tree log commit time.
|
|
+ *
|
|
+ * the tree logging mutex keeps others from coming in and changing
|
|
+ * the new_root->node, so we can safely access it here
|
|
+ */
|
|
+ set_extent_dirty(&new_root->dirty_log_pages, new_root->node->start,
|
|
+ new_root->node->start + new_root->node->len - 1,
|
|
+ GFP_NOFS);
|
|
+
|
|
+fail:
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+/*
|
|
* start a sub transaction and setup the log tree
|
|
* this increments the log tree writer count to make the people
|
|
* syncing the tree wait for us to finish
|
|
@@ -86,14 +184,6 @@
|
|
struct btrfs_root *root)
|
|
{
|
|
int ret;
|
|
-
|
|
- mutex_lock(&root->log_mutex);
|
|
- if (root->log_root) {
|
|
- root->log_batch++;
|
|
- atomic_inc(&root->log_writers);
|
|
- mutex_unlock(&root->log_mutex);
|
|
- return 0;
|
|
- }
|
|
mutex_lock(&root->fs_info->tree_log_mutex);
|
|
if (!root->fs_info->log_root_tree) {
|
|
ret = btrfs_init_log_root_tree(trans, root->fs_info);
|
|
@@ -103,10 +193,9 @@
|
|
ret = btrfs_add_log_tree(trans, root);
|
|
BUG_ON(ret);
|
|
}
|
|
+ atomic_inc(&root->fs_info->tree_log_writers);
|
|
+ root->fs_info->tree_log_batch++;
|
|
mutex_unlock(&root->fs_info->tree_log_mutex);
|
|
- root->log_batch++;
|
|
- atomic_inc(&root->log_writers);
|
|
- mutex_unlock(&root->log_mutex);
|
|
return 0;
|
|
}
|
|
|
|
@@ -123,12 +212,13 @@
|
|
if (!root->log_root)
|
|
return -ENOENT;
|
|
|
|
- mutex_lock(&root->log_mutex);
|
|
+ mutex_lock(&root->fs_info->tree_log_mutex);
|
|
if (root->log_root) {
|
|
ret = 0;
|
|
- atomic_inc(&root->log_writers);
|
|
+ atomic_inc(&root->fs_info->tree_log_writers);
|
|
+ root->fs_info->tree_log_batch++;
|
|
}
|
|
- mutex_unlock(&root->log_mutex);
|
|
+ mutex_unlock(&root->fs_info->tree_log_mutex);
|
|
return ret;
|
|
}
|
|
|
|
@@ -138,11 +228,10 @@
|
|
*/
|
|
static int end_log_trans(struct btrfs_root *root)
|
|
{
|
|
- if (atomic_dec_and_test(&root->log_writers)) {
|
|
- smp_mb();
|
|
- if (waitqueue_active(&root->log_writer_wait))
|
|
- wake_up(&root->log_writer_wait);
|
|
- }
|
|
+ atomic_dec(&root->fs_info->tree_log_writers);
|
|
+ smp_mb();
|
|
+ if (waitqueue_active(&root->fs_info->tree_log_wait))
|
|
+ wake_up(&root->fs_info->tree_log_wait);
|
|
return 0;
|
|
}
|
|
|
|
@@ -1615,7 +1704,6 @@
|
|
|
|
btrfs_tree_lock(next);
|
|
clean_tree_block(trans, root, next);
|
|
- btrfs_set_lock_blocking(next);
|
|
btrfs_wait_tree_block_writeback(next);
|
|
btrfs_tree_unlock(next);
|
|
|
|
@@ -1662,7 +1750,6 @@
|
|
next = path->nodes[*level];
|
|
btrfs_tree_lock(next);
|
|
clean_tree_block(trans, root, next);
|
|
- btrfs_set_lock_blocking(next);
|
|
btrfs_wait_tree_block_writeback(next);
|
|
btrfs_tree_unlock(next);
|
|
|
|
@@ -1720,7 +1807,6 @@
|
|
|
|
btrfs_tree_lock(next);
|
|
clean_tree_block(trans, root, next);
|
|
- btrfs_set_lock_blocking(next);
|
|
btrfs_wait_tree_block_writeback(next);
|
|
btrfs_tree_unlock(next);
|
|
|
|
@@ -1793,7 +1879,6 @@
|
|
|
|
btrfs_tree_lock(next);
|
|
clean_tree_block(trans, log, next);
|
|
- btrfs_set_lock_blocking(next);
|
|
btrfs_wait_tree_block_writeback(next);
|
|
btrfs_tree_unlock(next);
|
|
|
|
@@ -1817,65 +1902,26 @@
|
|
}
|
|
}
|
|
btrfs_free_path(path);
|
|
+ if (wc->free)
|
|
+ free_extent_buffer(log->node);
|
|
return ret;
|
|
}
|
|
|
|
-/*
|
|
- * helper function to update the item for a given subvolumes log root
|
|
- * in the tree of log roots
|
|
- */
|
|
-static int update_log_root(struct btrfs_trans_handle *trans,
|
|
- struct btrfs_root *log)
|
|
-{
|
|
- int ret;
|
|
-
|
|
- if (log->log_transid == 1) {
|
|
- /* insert root item on the first sync */
|
|
- ret = btrfs_insert_root(trans, log->fs_info->log_root_tree,
|
|
- &log->root_key, &log->root_item);
|
|
- } else {
|
|
- ret = btrfs_update_root(trans, log->fs_info->log_root_tree,
|
|
- &log->root_key, &log->root_item);
|
|
- }
|
|
- return ret;
|
|
-}
|
|
-
|
|
-static int wait_log_commit(struct btrfs_root *root, unsigned long transid)
|
|
+static int wait_log_commit(struct btrfs_root *log)
|
|
{
|
|
DEFINE_WAIT(wait);
|
|
- int index = transid % 2;
|
|
+ u64 transid = log->fs_info->tree_log_transid;
|
|
|
|
- /*
|
|
- * we only allow two pending log transactions at a time,
|
|
- * so we know that if ours is more than 2 older than the
|
|
- * current transaction, we're done
|
|
- */
|
|
do {
|
|
- prepare_to_wait(&root->log_commit_wait[index],
|
|
- &wait, TASK_UNINTERRUPTIBLE);
|
|
- mutex_unlock(&root->log_mutex);
|
|
- if (root->log_transid < transid + 2 &&
|
|
- atomic_read(&root->log_commit[index]))
|
|
+ prepare_to_wait(&log->fs_info->tree_log_wait, &wait,
|
|
+ TASK_UNINTERRUPTIBLE);
|
|
+ mutex_unlock(&log->fs_info->tree_log_mutex);
|
|
+ if (atomic_read(&log->fs_info->tree_log_commit))
|
|
schedule();
|
|
- finish_wait(&root->log_commit_wait[index], &wait);
|
|
- mutex_lock(&root->log_mutex);
|
|
- } while (root->log_transid < transid + 2 &&
|
|
- atomic_read(&root->log_commit[index]));
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int wait_for_writer(struct btrfs_root *root)
|
|
-{
|
|
- DEFINE_WAIT(wait);
|
|
- while (atomic_read(&root->log_writers)) {
|
|
- prepare_to_wait(&root->log_writer_wait,
|
|
- &wait, TASK_UNINTERRUPTIBLE);
|
|
- mutex_unlock(&root->log_mutex);
|
|
- if (atomic_read(&root->log_writers))
|
|
- schedule();
|
|
- mutex_lock(&root->log_mutex);
|
|
- finish_wait(&root->log_writer_wait, &wait);
|
|
- }
|
|
+ finish_wait(&log->fs_info->tree_log_wait, &wait);
|
|
+ mutex_lock(&log->fs_info->tree_log_mutex);
|
|
+ } while (transid == log->fs_info->tree_log_transid &&
|
|
+ atomic_read(&log->fs_info->tree_log_commit));
|
|
return 0;
|
|
}
|
|
|
|
@@ -1887,114 +1933,57 @@
|
|
int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *root)
|
|
{
|
|
- int index1;
|
|
- int index2;
|
|
int ret;
|
|
+ unsigned long batch;
|
|
struct btrfs_root *log = root->log_root;
|
|
- struct btrfs_root *log_root_tree = root->fs_info->log_root_tree;
|
|
|
|
- mutex_lock(&root->log_mutex);
|
|
- index1 = root->log_transid % 2;
|
|
- if (atomic_read(&root->log_commit[index1])) {
|
|
- wait_log_commit(root, root->log_transid);
|
|
- mutex_unlock(&root->log_mutex);
|
|
- return 0;
|
|
+ mutex_lock(&log->fs_info->tree_log_mutex);
|
|
+ if (atomic_read(&log->fs_info->tree_log_commit)) {
|
|
+ wait_log_commit(log);
|
|
+ goto out;
|
|
}
|
|
- atomic_set(&root->log_commit[index1], 1);
|
|
-
|
|
- /* wait for previous tree log sync to complete */
|
|
- if (atomic_read(&root->log_commit[(index1 + 1) % 2]))
|
|
- wait_log_commit(root, root->log_transid - 1);
|
|
+ atomic_set(&log->fs_info->tree_log_commit, 1);
|
|
|
|
while (1) {
|
|
- unsigned long batch = root->log_batch;
|
|
- mutex_unlock(&root->log_mutex);
|
|
+ batch = log->fs_info->tree_log_batch;
|
|
+ mutex_unlock(&log->fs_info->tree_log_mutex);
|
|
schedule_timeout_uninterruptible(1);
|
|
- mutex_lock(&root->log_mutex);
|
|
- wait_for_writer(root);
|
|
- if (batch == root->log_batch)
|
|
+ mutex_lock(&log->fs_info->tree_log_mutex);
|
|
+
|
|
+ while (atomic_read(&log->fs_info->tree_log_writers)) {
|
|
+ DEFINE_WAIT(wait);
|
|
+ prepare_to_wait(&log->fs_info->tree_log_wait, &wait,
|
|
+ TASK_UNINTERRUPTIBLE);
|
|
+ mutex_unlock(&log->fs_info->tree_log_mutex);
|
|
+ if (atomic_read(&log->fs_info->tree_log_writers))
|
|
+ schedule();
|
|
+ mutex_lock(&log->fs_info->tree_log_mutex);
|
|
+ finish_wait(&log->fs_info->tree_log_wait, &wait);
|
|
+ }
|
|
+ if (batch == log->fs_info->tree_log_batch)
|
|
break;
|
|
}
|
|
|
|
ret = btrfs_write_and_wait_marked_extents(log, &log->dirty_log_pages);
|
|
BUG_ON(ret);
|
|
-
|
|
- btrfs_set_root_bytenr(&log->root_item, log->node->start);
|
|
- btrfs_set_root_generation(&log->root_item, trans->transid);
|
|
- btrfs_set_root_level(&log->root_item, btrfs_header_level(log->node));
|
|
-
|
|
- root->log_batch = 0;
|
|
- root->log_transid++;
|
|
- log->log_transid = root->log_transid;
|
|
- smp_mb();
|
|
- /*
|
|
- * log tree has been flushed to disk, new modifications of
|
|
- * the log will be written to new positions. so it's safe to
|
|
- * allow log writers to go in.
|
|
- */
|
|
- mutex_unlock(&root->log_mutex);
|
|
-
|
|
- mutex_lock(&log_root_tree->log_mutex);
|
|
- log_root_tree->log_batch++;
|
|
- atomic_inc(&log_root_tree->log_writers);
|
|
- mutex_unlock(&log_root_tree->log_mutex);
|
|
-
|
|
- ret = update_log_root(trans, log);
|
|
- BUG_ON(ret);
|
|
-
|
|
- mutex_lock(&log_root_tree->log_mutex);
|
|
- if (atomic_dec_and_test(&log_root_tree->log_writers)) {
|
|
- smp_mb();
|
|
- if (waitqueue_active(&log_root_tree->log_writer_wait))
|
|
- wake_up(&log_root_tree->log_writer_wait);
|
|
- }
|
|
-
|
|
- index2 = log_root_tree->log_transid % 2;
|
|
- if (atomic_read(&log_root_tree->log_commit[index2])) {
|
|
- wait_log_commit(log_root_tree, log_root_tree->log_transid);
|
|
- mutex_unlock(&log_root_tree->log_mutex);
|
|
- goto out;
|
|
- }
|
|
- atomic_set(&log_root_tree->log_commit[index2], 1);
|
|
-
|
|
- if (atomic_read(&log_root_tree->log_commit[(index2 + 1) % 2]))
|
|
- wait_log_commit(log_root_tree, log_root_tree->log_transid - 1);
|
|
-
|
|
- wait_for_writer(log_root_tree);
|
|
-
|
|
- ret = btrfs_write_and_wait_marked_extents(log_root_tree,
|
|
- &log_root_tree->dirty_log_pages);
|
|
+ ret = btrfs_write_and_wait_marked_extents(root->fs_info->log_root_tree,
|
|
+ &root->fs_info->log_root_tree->dirty_log_pages);
|
|
BUG_ON(ret);
|
|
|
|
btrfs_set_super_log_root(&root->fs_info->super_for_commit,
|
|
- log_root_tree->node->start);
|
|
+ log->fs_info->log_root_tree->node->start);
|
|
btrfs_set_super_log_root_level(&root->fs_info->super_for_commit,
|
|
- btrfs_header_level(log_root_tree->node));
|
|
-
|
|
- log_root_tree->log_batch = 0;
|
|
- log_root_tree->log_transid++;
|
|
- smp_mb();
|
|
-
|
|
- mutex_unlock(&log_root_tree->log_mutex);
|
|
-
|
|
- /*
|
|
- * nobody else is going to jump in and write the the ctree
|
|
- * super here because the log_commit atomic below is protecting
|
|
- * us. We must be called with a transaction handle pinning
|
|
- * the running transaction open, so a full commit can't hop
|
|
- * in and cause problems either.
|
|
- */
|
|
- write_ctree_super(trans, root->fs_info->tree_root, 2);
|
|
+ btrfs_header_level(log->fs_info->log_root_tree->node));
|
|
|
|
- atomic_set(&log_root_tree->log_commit[index2], 0);
|
|
+ write_ctree_super(trans, log->fs_info->tree_root, 2);
|
|
+ log->fs_info->tree_log_transid++;
|
|
+ log->fs_info->tree_log_batch = 0;
|
|
+ atomic_set(&log->fs_info->tree_log_commit, 0);
|
|
smp_mb();
|
|
- if (waitqueue_active(&log_root_tree->log_commit_wait[index2]))
|
|
- wake_up(&log_root_tree->log_commit_wait[index2]);
|
|
+ if (waitqueue_active(&log->fs_info->tree_log_wait))
|
|
+ wake_up(&log->fs_info->tree_log_wait);
|
|
out:
|
|
- atomic_set(&root->log_commit[index1], 0);
|
|
- smp_mb();
|
|
- if (waitqueue_active(&root->log_commit_wait[index1]))
|
|
- wake_up(&root->log_commit_wait[index1]);
|
|
+ mutex_unlock(&log->fs_info->tree_log_mutex);
|
|
return 0;
|
|
}
|
|
|
|
@@ -2030,18 +2019,38 @@
|
|
start, end, GFP_NOFS);
|
|
}
|
|
|
|
- if (log->log_transid > 0) {
|
|
- ret = btrfs_del_root(trans, root->fs_info->log_root_tree,
|
|
- &log->root_key);
|
|
- BUG_ON(ret);
|
|
- }
|
|
+ log = root->log_root;
|
|
+ ret = btrfs_del_root(trans, root->fs_info->log_root_tree,
|
|
+ &log->root_key);
|
|
+ BUG_ON(ret);
|
|
root->log_root = NULL;
|
|
- free_extent_buffer(log->node);
|
|
- kfree(log);
|
|
+ kfree(root->log_root);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
+ * helper function to update the item for a given subvolumes log root
|
|
+ * in the tree of log roots
|
|
+ */
|
|
+static int update_log_root(struct btrfs_trans_handle *trans,
|
|
+ struct btrfs_root *log)
|
|
+{
|
|
+ u64 bytenr = btrfs_root_bytenr(&log->root_item);
|
|
+ int ret;
|
|
+
|
|
+ if (log->node->start == bytenr)
|
|
+ return 0;
|
|
+
|
|
+ btrfs_set_root_bytenr(&log->root_item, log->node->start);
|
|
+ btrfs_set_root_generation(&log->root_item, trans->transid);
|
|
+ btrfs_set_root_level(&log->root_item, btrfs_header_level(log->node));
|
|
+ ret = btrfs_update_root(trans, log->fs_info->log_root_tree,
|
|
+ &log->root_key, &log->root_item);
|
|
+ BUG_ON(ret);
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+/*
|
|
* If both a file and directory are logged, and unlinks or renames are
|
|
* mixed in, we have a few interesting corners:
|
|
*
|
|
@@ -2702,6 +2711,11 @@
|
|
|
|
btrfs_free_path(path);
|
|
btrfs_free_path(dst_path);
|
|
+
|
|
+ mutex_lock(&root->fs_info->tree_log_mutex);
|
|
+ ret = update_log_root(trans, log);
|
|
+ BUG_ON(ret);
|
|
+ mutex_unlock(&root->fs_info->tree_log_mutex);
|
|
out:
|
|
return 0;
|
|
}
|
|
@@ -2832,9 +2846,7 @@
|
|
BUG_ON(!wc.replay_dest);
|
|
|
|
wc.replay_dest->log_root = log;
|
|
- mutex_lock(&fs_info->trans_mutex);
|
|
btrfs_record_root_in_trans(wc.replay_dest);
|
|
- mutex_unlock(&fs_info->trans_mutex);
|
|
ret = walk_log_tree(trans, log, &wc);
|
|
BUG_ON(ret);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/volumes.c linux-2.6.29-rc3.owrt/fs/btrfs/volumes.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/volumes.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/volumes.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -20,6 +20,7 @@
|
|
#include <linux/buffer_head.h>
|
|
#include <linux/blkdev.h>
|
|
#include <linux/random.h>
|
|
+#include <linux/version.h>
|
|
#include <asm/div64.h>
|
|
#include "compat.h"
|
|
#include "ctree.h"
|
|
@@ -103,8 +104,10 @@
|
|
u64 devid, u8 *uuid)
|
|
{
|
|
struct btrfs_device *dev;
|
|
+ struct list_head *cur;
|
|
|
|
- list_for_each_entry(dev, head, dev_list) {
|
|
+ list_for_each(cur, head) {
|
|
+ dev = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (dev->devid == devid &&
|
|
(!uuid || !memcmp(dev->uuid, uuid, BTRFS_UUID_SIZE))) {
|
|
return dev;
|
|
@@ -115,9 +118,11 @@
|
|
|
|
static noinline struct btrfs_fs_devices *find_fsid(u8 *fsid)
|
|
{
|
|
+ struct list_head *cur;
|
|
struct btrfs_fs_devices *fs_devices;
|
|
|
|
- list_for_each_entry(fs_devices, &fs_uuids, list) {
|
|
+ list_for_each(cur, &fs_uuids) {
|
|
+ fs_devices = list_entry(cur, struct btrfs_fs_devices, list);
|
|
if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0)
|
|
return fs_devices;
|
|
}
|
|
@@ -154,7 +159,6 @@
|
|
loop:
|
|
spin_lock(&device->io_lock);
|
|
|
|
-loop_lock:
|
|
/* take all the bios off the list at once and process them
|
|
* later on (without the lock held). But, remember the
|
|
* tail and other pointers so the bios can be properly reinserted
|
|
@@ -204,7 +208,7 @@
|
|
* is now congested. Back off and let other work structs
|
|
* run instead
|
|
*/
|
|
- if (pending && bdi_write_congested(bdi) && num_run > 16 &&
|
|
+ if (pending && bdi_write_congested(bdi) &&
|
|
fs_info->fs_devices->open_devices > 1) {
|
|
struct bio *old_head;
|
|
|
|
@@ -216,8 +220,7 @@
|
|
tail->bi_next = old_head;
|
|
else
|
|
device->pending_bio_tail = tail;
|
|
-
|
|
- device->running_pending = 1;
|
|
+ device->running_pending = 0;
|
|
|
|
spin_unlock(&device->io_lock);
|
|
btrfs_requeue_work(&device->work);
|
|
@@ -226,11 +229,6 @@
|
|
}
|
|
if (again)
|
|
goto loop;
|
|
-
|
|
- spin_lock(&device->io_lock);
|
|
- if (device->pending_bios)
|
|
- goto loop_lock;
|
|
- spin_unlock(&device->io_lock);
|
|
done:
|
|
return 0;
|
|
}
|
|
@@ -347,11 +345,14 @@
|
|
|
|
int btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices)
|
|
{
|
|
- struct btrfs_device *device, *next;
|
|
+ struct list_head *tmp;
|
|
+ struct list_head *cur;
|
|
+ struct btrfs_device *device;
|
|
|
|
mutex_lock(&uuid_mutex);
|
|
again:
|
|
- list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) {
|
|
+ list_for_each_safe(cur, tmp, &fs_devices->devices) {
|
|
+ device = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (device->in_fs_metadata)
|
|
continue;
|
|
|
|
@@ -382,12 +383,14 @@
|
|
|
|
static int __btrfs_close_devices(struct btrfs_fs_devices *fs_devices)
|
|
{
|
|
+ struct list_head *cur;
|
|
struct btrfs_device *device;
|
|
|
|
if (--fs_devices->opened > 0)
|
|
return 0;
|
|
|
|
- list_for_each_entry(device, &fs_devices->devices, dev_list) {
|
|
+ list_for_each(cur, &fs_devices->devices) {
|
|
+ device = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (device->bdev) {
|
|
close_bdev_exclusive(device->bdev, device->mode);
|
|
fs_devices->open_devices--;
|
|
@@ -436,6 +439,7 @@
|
|
{
|
|
struct block_device *bdev;
|
|
struct list_head *head = &fs_devices->devices;
|
|
+ struct list_head *cur;
|
|
struct btrfs_device *device;
|
|
struct block_device *latest_bdev = NULL;
|
|
struct buffer_head *bh;
|
|
@@ -446,7 +450,8 @@
|
|
int seeding = 1;
|
|
int ret = 0;
|
|
|
|
- list_for_each_entry(device, head, dev_list) {
|
|
+ list_for_each(cur, head) {
|
|
+ device = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (device->bdev)
|
|
continue;
|
|
if (!device->name)
|
|
@@ -573,7 +578,7 @@
|
|
*(unsigned long long *)disk_super->fsid,
|
|
*(unsigned long long *)(disk_super->fsid + 8));
|
|
}
|
|
- printk(KERN_CONT "devid %llu transid %llu %s\n",
|
|
+ printk(KERN_INFO "devid %llu transid %llu %s\n",
|
|
(unsigned long long)devid, (unsigned long long)transid, path);
|
|
ret = device_list_add(path, disk_super, devid, fs_devices_ret);
|
|
|
|
@@ -1012,12 +1017,14 @@
|
|
}
|
|
|
|
if (strcmp(device_path, "missing") == 0) {
|
|
+ struct list_head *cur;
|
|
struct list_head *devices;
|
|
struct btrfs_device *tmp;
|
|
|
|
device = NULL;
|
|
devices = &root->fs_info->fs_devices->devices;
|
|
- list_for_each_entry(tmp, devices, dev_list) {
|
|
+ list_for_each(cur, devices) {
|
|
+ tmp = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (tmp->in_fs_metadata && !tmp->bdev) {
|
|
device = tmp;
|
|
break;
|
|
@@ -1273,6 +1280,7 @@
|
|
struct btrfs_trans_handle *trans;
|
|
struct btrfs_device *device;
|
|
struct block_device *bdev;
|
|
+ struct list_head *cur;
|
|
struct list_head *devices;
|
|
struct super_block *sb = root->fs_info->sb;
|
|
u64 total_bytes;
|
|
@@ -1296,7 +1304,8 @@
|
|
mutex_lock(&root->fs_info->volume_mutex);
|
|
|
|
devices = &root->fs_info->fs_devices->devices;
|
|
- list_for_each_entry(device, devices, dev_list) {
|
|
+ list_for_each(cur, devices) {
|
|
+ device = list_entry(cur, struct btrfs_device, dev_list);
|
|
if (device->bdev == bdev) {
|
|
ret = -EEXIST;
|
|
goto error;
|
|
@@ -1374,12 +1383,6 @@
|
|
ret = btrfs_add_device(trans, root, device);
|
|
}
|
|
|
|
- /*
|
|
- * we've got more storage, clear any full flags on the space
|
|
- * infos
|
|
- */
|
|
- btrfs_clear_space_info_full(root->fs_info);
|
|
-
|
|
unlock_chunks(root);
|
|
btrfs_commit_transaction(trans, root);
|
|
|
|
@@ -1465,8 +1468,6 @@
|
|
device->fs_devices->total_rw_bytes += diff;
|
|
|
|
device->total_bytes = new_size;
|
|
- btrfs_clear_space_info_full(device->dev_root->fs_info);
|
|
-
|
|
return btrfs_update_device(trans, device);
|
|
}
|
|
|
|
@@ -1703,6 +1704,7 @@
|
|
int btrfs_balance(struct btrfs_root *dev_root)
|
|
{
|
|
int ret;
|
|
+ struct list_head *cur;
|
|
struct list_head *devices = &dev_root->fs_info->fs_devices->devices;
|
|
struct btrfs_device *device;
|
|
u64 old_size;
|
|
@@ -1721,7 +1723,8 @@
|
|
dev_root = dev_root->fs_info->dev_root;
|
|
|
|
/* step one make some room on all the devices */
|
|
- list_for_each_entry(device, devices, dev_list) {
|
|
+ list_for_each(cur, devices) {
|
|
+ device = list_entry(cur, struct btrfs_device, dev_list);
|
|
old_size = device->total_bytes;
|
|
size_to_free = div_factor(old_size, 1);
|
|
size_to_free = min(size_to_free, (u64)1 * 1024 * 1024);
|
|
@@ -2902,6 +2905,10 @@
|
|
free_extent_map(em);
|
|
}
|
|
|
|
+ map = kzalloc(sizeof(*map), GFP_NOFS);
|
|
+ if (!map)
|
|
+ return -ENOMEM;
|
|
+
|
|
em = alloc_extent_map(GFP_NOFS);
|
|
if (!em)
|
|
return -ENOMEM;
|
|
@@ -3110,8 +3117,6 @@
|
|
if (!sb)
|
|
return -ENOMEM;
|
|
btrfs_set_buffer_uptodate(sb);
|
|
- btrfs_set_buffer_lockdep_class(sb, 0);
|
|
-
|
|
write_extent_buffer(sb, super_copy, 0, BTRFS_SUPER_INFO_SIZE);
|
|
array_size = btrfs_super_sys_array_size(super_copy);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/xattr.c linux-2.6.29-rc3.owrt/fs/btrfs/xattr.c
|
|
--- linux-2.6.29.owrt/fs/btrfs/xattr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/xattr.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -21,7 +21,6 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/rwsem.h>
|
|
#include <linux/xattr.h>
|
|
-#include <linux/security.h>
|
|
#include "ctree.h"
|
|
#include "btrfs_inode.h"
|
|
#include "transaction.h"
|
|
@@ -46,12 +45,9 @@
|
|
/* lookup the xattr by name */
|
|
di = btrfs_lookup_xattr(NULL, root, path, inode->i_ino, name,
|
|
strlen(name), 0);
|
|
- if (!di) {
|
|
+ if (!di || IS_ERR(di)) {
|
|
ret = -ENODATA;
|
|
goto out;
|
|
- } else if (IS_ERR(di)) {
|
|
- ret = PTR_ERR(di);
|
|
- goto out;
|
|
}
|
|
|
|
leaf = path->nodes[0];
|
|
@@ -66,14 +62,6 @@
|
|
ret = -ERANGE;
|
|
goto out;
|
|
}
|
|
-
|
|
- /*
|
|
- * The way things are packed into the leaf is like this
|
|
- * |struct btrfs_dir_item|name|data|
|
|
- * where name is the xattr name, so security.foo, and data is the
|
|
- * content of the xattr. data_ptr points to the location in memory
|
|
- * where the data starts in the in memory leaf
|
|
- */
|
|
data_ptr = (unsigned long)((char *)(di + 1) +
|
|
btrfs_dir_name_len(leaf, di));
|
|
read_extent_buffer(leaf, buffer, data_ptr,
|
|
@@ -98,7 +86,7 @@
|
|
if (!path)
|
|
return -ENOMEM;
|
|
|
|
- trans = btrfs_join_transaction(root, 1);
|
|
+ trans = btrfs_start_transaction(root, 1);
|
|
btrfs_set_trans_block_group(trans, inode);
|
|
|
|
/* first lets see if we already have this xattr */
|
|
@@ -188,6 +176,7 @@
|
|
ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
|
|
if (ret < 0)
|
|
goto err;
|
|
+ ret = 0;
|
|
advance = 0;
|
|
while (1) {
|
|
leaf = path->nodes[0];
|
|
@@ -331,34 +320,3 @@
|
|
return -EOPNOTSUPP;
|
|
return __btrfs_setxattr(dentry->d_inode, name, NULL, 0, XATTR_REPLACE);
|
|
}
|
|
-
|
|
-int btrfs_xattr_security_init(struct inode *inode, struct inode *dir)
|
|
-{
|
|
- int err;
|
|
- size_t len;
|
|
- void *value;
|
|
- char *suffix;
|
|
- char *name;
|
|
-
|
|
- err = security_inode_init_security(inode, dir, &suffix, &value, &len);
|
|
- if (err) {
|
|
- if (err == -EOPNOTSUPP)
|
|
- return 0;
|
|
- return err;
|
|
- }
|
|
-
|
|
- name = kmalloc(XATTR_SECURITY_PREFIX_LEN + strlen(suffix) + 1,
|
|
- GFP_NOFS);
|
|
- if (!name) {
|
|
- err = -ENOMEM;
|
|
- } else {
|
|
- strcpy(name, XATTR_SECURITY_PREFIX);
|
|
- strcpy(name + XATTR_SECURITY_PREFIX_LEN, suffix);
|
|
- err = __btrfs_setxattr(inode, name, value, len, 0);
|
|
- kfree(name);
|
|
- }
|
|
-
|
|
- kfree(suffix);
|
|
- kfree(value);
|
|
- return err;
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/btrfs/xattr.h linux-2.6.29-rc3.owrt/fs/btrfs/xattr.h
|
|
--- linux-2.6.29.owrt/fs/btrfs/xattr.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/btrfs/xattr.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -36,6 +36,4 @@
|
|
const void *value, size_t size, int flags);
|
|
extern int btrfs_removexattr(struct dentry *dentry, const char *name);
|
|
|
|
-extern int btrfs_xattr_security_init(struct inode *inode, struct inode *dir);
|
|
-
|
|
#endif /* __XATTR__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/buffer.c linux-2.6.29-rc3.owrt/fs/buffer.c
|
|
--- linux-2.6.29.owrt/fs/buffer.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/buffer.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -760,9 +760,15 @@
|
|
* If warn is true, then emit a warning if the page is not uptodate and has
|
|
* not been truncated.
|
|
*/
|
|
-static void __set_page_dirty(struct page *page,
|
|
+static int __set_page_dirty(struct page *page,
|
|
struct address_space *mapping, int warn)
|
|
{
|
|
+ if (unlikely(!mapping))
|
|
+ return !TestSetPageDirty(page);
|
|
+
|
|
+ if (TestSetPageDirty(page))
|
|
+ return 0;
|
|
+
|
|
spin_lock_irq(&mapping->tree_lock);
|
|
if (page->mapping) { /* Race with truncate? */
|
|
WARN_ON_ONCE(warn && !PageUptodate(page));
|
|
@@ -771,7 +777,6 @@
|
|
__inc_zone_page_state(page, NR_FILE_DIRTY);
|
|
__inc_bdi_stat(mapping->backing_dev_info,
|
|
BDI_RECLAIMABLE);
|
|
- task_dirty_inc(current);
|
|
task_io_account_write(PAGE_CACHE_SIZE);
|
|
}
|
|
radix_tree_tag_set(&mapping->page_tree,
|
|
@@ -779,6 +784,8 @@
|
|
}
|
|
spin_unlock_irq(&mapping->tree_lock);
|
|
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
|
+
|
|
+ return 1;
|
|
}
|
|
|
|
/*
|
|
@@ -808,7 +815,6 @@
|
|
*/
|
|
int __set_page_dirty_buffers(struct page *page)
|
|
{
|
|
- int newly_dirty;
|
|
struct address_space *mapping = page_mapping(page);
|
|
|
|
if (unlikely(!mapping))
|
|
@@ -824,12 +830,9 @@
|
|
bh = bh->b_this_page;
|
|
} while (bh != head);
|
|
}
|
|
- newly_dirty = !TestSetPageDirty(page);
|
|
spin_unlock(&mapping->private_lock);
|
|
|
|
- if (newly_dirty)
|
|
- __set_page_dirty(page, mapping, 1);
|
|
- return newly_dirty;
|
|
+ return __set_page_dirty(page, mapping, 1);
|
|
}
|
|
EXPORT_SYMBOL(__set_page_dirty_buffers);
|
|
|
|
@@ -1258,11 +1261,8 @@
|
|
return;
|
|
}
|
|
|
|
- if (!test_set_buffer_dirty(bh)) {
|
|
- struct page *page = bh->b_page;
|
|
- if (!TestSetPageDirty(page))
|
|
- __set_page_dirty(page, page_mapping(page), 0);
|
|
- }
|
|
+ if (!test_set_buffer_dirty(bh))
|
|
+ __set_page_dirty(bh->b_page, page_mapping(bh->b_page), 0);
|
|
}
|
|
|
|
/*
|
|
@@ -2688,7 +2688,7 @@
|
|
struct buffer_head *bh;
|
|
BUG_ON(fsdata != NULL && page_has_buffers(page));
|
|
|
|
- if (unlikely(copied < len) && head)
|
|
+ if (unlikely(copied < len) && !page_has_buffers(page))
|
|
attach_nobh_buffers(page, head);
|
|
if (page_has_buffers(page))
|
|
return generic_write_end(file, mapping, pos, len,
|
|
@@ -3108,7 +3108,7 @@
|
|
if (test_clear_buffer_dirty(bh)) {
|
|
get_bh(bh);
|
|
bh->b_end_io = end_buffer_write_sync;
|
|
- ret = submit_bh(WRITE, bh);
|
|
+ ret = submit_bh(WRITE_SYNC, bh);
|
|
wait_on_buffer(bh);
|
|
if (buffer_eopnotsupp(bh)) {
|
|
clear_buffer_eopnotsupp(bh);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/CHANGES linux-2.6.29-rc3.owrt/fs/cifs/CHANGES
|
|
--- linux-2.6.29.owrt/fs/cifs/CHANGES 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/CHANGES 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,13 +1,3 @@
|
|
-Version 1.57
|
|
-------------
|
|
-Improve support for multiple security contexts to the same server. We
|
|
-used to use the same "vcnumber" for all connections which could cause
|
|
-the server to treat subsequent connections, especially those that
|
|
-are authenticated as guest, as reconnections, invalidating the earlier
|
|
-user's smb session. This fix allows cifs to mount multiple times to the
|
|
-same server with different userids without risking invalidating earlier
|
|
-established security contexts.
|
|
-
|
|
Version 1.56
|
|
------------
|
|
Add "forcemandatorylock" mount option to allow user to use mandatory
|
|
@@ -15,12 +5,7 @@
|
|
support posix byte range locks. Fix query of root inode when prefixpath
|
|
specified and user does not have access to query information about the
|
|
top of the share. Fix problem in 2.6.28 resolving DFS paths to
|
|
-Samba servers (worked to Windows). Fix rmdir so that pending search
|
|
-(readdir) requests do not get invalid results which include the now
|
|
-removed directory. Fix oops in cifs_dfs_ref.c when prefixpath is not reachable
|
|
-when using DFS. Add better file create support to servers which support
|
|
-the CIFS POSIX protocol extensions (this adds support for new flags
|
|
-on create, and improves semantics for write of locked ranges).
|
|
+Samba servers (worked to Windows).
|
|
|
|
Version 1.55
|
|
------------
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/cifsencrypt.c linux-2.6.29-rc3.owrt/fs/cifs/cifsencrypt.c
|
|
--- linux-2.6.29.owrt/fs/cifs/cifsencrypt.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/cifsencrypt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -48,11 +48,11 @@
|
|
if ((cifs_pdu == NULL) || (signature == NULL) || (key == NULL))
|
|
return -EINVAL;
|
|
|
|
- cifs_MD5_init(&context);
|
|
- cifs_MD5_update(&context, (char *)&key->data, key->len);
|
|
- cifs_MD5_update(&context, cifs_pdu->Protocol, cifs_pdu->smb_buf_length);
|
|
+ MD5Init(&context);
|
|
+ MD5Update(&context, (char *)&key->data, key->len);
|
|
+ MD5Update(&context, cifs_pdu->Protocol, cifs_pdu->smb_buf_length);
|
|
|
|
- cifs_MD5_final(signature, &context);
|
|
+ MD5Final(signature, &context);
|
|
return 0;
|
|
}
|
|
|
|
@@ -96,8 +96,8 @@
|
|
if ((iov == NULL) || (signature == NULL) || (key == NULL))
|
|
return -EINVAL;
|
|
|
|
- cifs_MD5_init(&context);
|
|
- cifs_MD5_update(&context, (char *)&key->data, key->len);
|
|
+ MD5Init(&context);
|
|
+ MD5Update(&context, (char *)&key->data, key->len);
|
|
for (i = 0; i < n_vec; i++) {
|
|
if (iov[i].iov_len == 0)
|
|
continue;
|
|
@@ -110,13 +110,13 @@
|
|
if (i == 0) {
|
|
if (iov[0].iov_len <= 8) /* cmd field at offset 9 */
|
|
break; /* nothing to sign or corrupt header */
|
|
- cifs_MD5_update(&context, iov[0].iov_base+4,
|
|
+ MD5Update(&context, iov[0].iov_base+4,
|
|
iov[0].iov_len-4);
|
|
} else
|
|
- cifs_MD5_update(&context, iov[i].iov_base, iov[i].iov_len);
|
|
+ MD5Update(&context, iov[i].iov_base, iov[i].iov_len);
|
|
}
|
|
|
|
- cifs_MD5_final(signature, &context);
|
|
+ MD5Final(signature, &context);
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/cifsfs.h linux-2.6.29-rc3.owrt/fs/cifs/cifsfs.h
|
|
--- linux-2.6.29.owrt/fs/cifs/cifsfs.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/cifsfs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -100,5 +100,5 @@
|
|
extern const struct export_operations cifs_export_ops;
|
|
#endif /* EXPERIMENTAL */
|
|
|
|
-#define CIFS_VERSION "1.57"
|
|
+#define CIFS_VERSION "1.56"
|
|
#endif /* _CIFSFS_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/cifsglob.h linux-2.6.29-rc3.owrt/fs/cifs/cifsglob.h
|
|
--- linux-2.6.29.owrt/fs/cifs/cifsglob.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/cifsglob.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -164,12 +164,9 @@
|
|
/* multiplexed reads or writes */
|
|
unsigned int maxBuf; /* maxBuf specifies the maximum */
|
|
/* message size the server can send or receive for non-raw SMBs */
|
|
- unsigned int max_rw; /* maxRw specifies the maximum */
|
|
+ unsigned int maxRw; /* maxRw specifies the maximum */
|
|
/* message size the server can send or receive for */
|
|
/* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
|
|
- unsigned int max_vcs; /* maximum number of smb sessions, at least
|
|
- those that can be specified uniquely with
|
|
- vcnumbers */
|
|
char sessid[4]; /* unique token id for this session */
|
|
/* (returned on Negotiate */
|
|
int capabilities; /* allow selective disabling of caps by smb sess */
|
|
@@ -213,7 +210,6 @@
|
|
unsigned overrideSecFlg; /* if non-zero override global sec flags */
|
|
__u16 ipc_tid; /* special tid for connection to IPC share */
|
|
__u16 flags;
|
|
- __u16 vcnum;
|
|
char *serverOS; /* name of operating system underlying server */
|
|
char *serverNOS; /* name of network operating system of server */
|
|
char *serverDomain; /* security realm of server */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/cifsproto.h linux-2.6.29-rc3.owrt/fs/cifs/cifsproto.h
|
|
--- linux-2.6.29.owrt/fs/cifs/cifsproto.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/cifsproto.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -35,14 +35,13 @@
|
|
extern void cifs_buf_release(void *);
|
|
extern struct smb_hdr *cifs_small_buf_get(void);
|
|
extern void cifs_small_buf_release(void *);
|
|
-extern int smb_send(struct TCP_Server_Info *, struct smb_hdr *,
|
|
- unsigned int /* length */);
|
|
+extern int smb_send(struct socket *, struct smb_hdr *,
|
|
+ unsigned int /* length */ , struct sockaddr *, bool);
|
|
extern unsigned int _GetXid(void);
|
|
extern void _FreeXid(unsigned int);
|
|
#define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__func__, xid,current_fsuid()));
|
|
#define FreeXid(curr_xid) {_FreeXid(curr_xid); cFYI(1,("CIFS VFS: leaving %s (xid = %d) rc = %d",__func__,curr_xid,(int)rc));}
|
|
extern char *build_path_from_dentry(struct dentry *);
|
|
-extern char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb);
|
|
extern char *build_wildcard_path_from_dentry(struct dentry *direntry);
|
|
/* extern void renew_parental_timestamps(struct dentry *direntry);*/
|
|
extern int SendReceive(const unsigned int /* xid */ , struct cifsSesInfo *,
|
|
@@ -92,9 +91,6 @@
|
|
extern __le64 cnvrtDosCifsTm(__u16 date, __u16 time);
|
|
extern struct timespec cnvrtDosUnixTm(__u16 date, __u16 time);
|
|
|
|
-extern void posix_fill_in_inode(struct inode *tmp_inode,
|
|
- FILE_UNIX_BASIC_INFO *pData, int isNewInode);
|
|
-extern struct inode *cifs_new_inode(struct super_block *sb, __u64 *inum);
|
|
extern int cifs_get_inode_info(struct inode **pinode,
|
|
const unsigned char *search_path,
|
|
FILE_ALL_INFO *pfile_info,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/cifssmb.c linux-2.6.29-rc3.owrt/fs/cifs/cifssmb.c
|
|
--- linux-2.6.29.owrt/fs/cifs/cifssmb.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/cifssmb.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -528,15 +528,14 @@
|
|
server->maxReq = le16_to_cpu(rsp->MaxMpxCount);
|
|
server->maxBuf = min((__u32)le16_to_cpu(rsp->MaxBufSize),
|
|
(__u32)CIFSMaxBufSize + MAX_CIFS_HDR_SIZE);
|
|
- server->max_vcs = le16_to_cpu(rsp->MaxNumberVcs);
|
|
GETU32(server->sessid) = le32_to_cpu(rsp->SessionKey);
|
|
/* even though we do not use raw we might as well set this
|
|
accurately, in case we ever find a need for it */
|
|
if ((le16_to_cpu(rsp->RawMode) & RAW_ENABLE) == RAW_ENABLE) {
|
|
- server->max_rw = 0xFF00;
|
|
+ server->maxRw = 0xFF00;
|
|
server->capabilities = CAP_MPX_MODE | CAP_RAW_MODE;
|
|
} else {
|
|
- server->max_rw = 0;/* do not need to use raw anyway */
|
|
+ server->maxRw = 0;/* we do not need to use raw anyway */
|
|
server->capabilities = CAP_MPX_MODE;
|
|
}
|
|
tmp = (__s16)le16_to_cpu(rsp->ServerTimeZone);
|
|
@@ -639,7 +638,7 @@
|
|
/* probably no need to store and check maxvcs */
|
|
server->maxBuf = min(le32_to_cpu(pSMBr->MaxBufferSize),
|
|
(__u32) CIFSMaxBufSize + MAX_CIFS_HDR_SIZE);
|
|
- server->max_rw = le32_to_cpu(pSMBr->MaxRawSize);
|
|
+ server->maxRw = le32_to_cpu(pSMBr->MaxRawSize);
|
|
cFYI(DBG2, ("Max buf = %d", ses->server->maxBuf));
|
|
GETU32(ses->server->sessid) = le32_to_cpu(pSMBr->SessionKey);
|
|
server->capabilities = le32_to_cpu(pSMBr->Capabilities);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/connect.c linux-2.6.29-rc3.owrt/fs/cifs/connect.c
|
|
--- linux-2.6.29.owrt/fs/cifs/connect.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/connect.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -23,6 +23,7 @@
|
|
#include <linux/string.h>
|
|
#include <linux/list.h>
|
|
#include <linux/wait.h>
|
|
+#include <linux/ipv6.h>
|
|
#include <linux/pagemap.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/utsname.h>
|
|
@@ -34,7 +35,6 @@
|
|
#include <linux/freezer.h>
|
|
#include <asm/uaccess.h>
|
|
#include <asm/processor.h>
|
|
-#include <net/ipv6.h>
|
|
#include "cifspdu.h"
|
|
#include "cifsglob.h"
|
|
#include "cifsproto.h"
|
|
@@ -1354,7 +1354,7 @@
|
|
}
|
|
|
|
static struct TCP_Server_Info *
|
|
-cifs_find_tcp_session(struct sockaddr_storage *addr)
|
|
+cifs_find_tcp_session(struct sockaddr *addr)
|
|
{
|
|
struct list_head *tmp;
|
|
struct TCP_Server_Info *server;
|
|
@@ -1374,13 +1374,13 @@
|
|
if (server->tcpStatus == CifsNew)
|
|
continue;
|
|
|
|
- if (addr->ss_family == AF_INET &&
|
|
+ if (addr->sa_family == AF_INET &&
|
|
(addr4->sin_addr.s_addr !=
|
|
server->addr.sockAddr.sin_addr.s_addr))
|
|
continue;
|
|
- else if (addr->ss_family == AF_INET6 &&
|
|
- !ipv6_addr_equal(&server->addr.sockAddr6.sin6_addr,
|
|
- &addr6->sin6_addr))
|
|
+ else if (addr->sa_family == AF_INET6 &&
|
|
+ memcmp(&server->addr.sockAddr6.sin6_addr,
|
|
+ &addr6->sin6_addr, sizeof(addr6->sin6_addr)))
|
|
continue;
|
|
|
|
++server->srv_count;
|
|
@@ -1419,12 +1419,12 @@
|
|
cifs_get_tcp_session(struct smb_vol *volume_info)
|
|
{
|
|
struct TCP_Server_Info *tcp_ses = NULL;
|
|
- struct sockaddr_storage addr;
|
|
+ struct sockaddr addr;
|
|
struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
|
|
struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
|
|
int rc;
|
|
|
|
- memset(&addr, 0, sizeof(struct sockaddr_storage));
|
|
+ memset(&addr, 0, sizeof(struct sockaddr));
|
|
|
|
if (volume_info->UNCip && volume_info->UNC) {
|
|
rc = cifs_inet_pton(AF_INET, volume_info->UNCip,
|
|
@@ -1435,9 +1435,9 @@
|
|
rc = cifs_inet_pton(AF_INET6, volume_info->UNCip,
|
|
&sin_server6->sin6_addr.in6_u);
|
|
if (rc > 0)
|
|
- addr.ss_family = AF_INET6;
|
|
+ addr.sa_family = AF_INET6;
|
|
} else {
|
|
- addr.ss_family = AF_INET;
|
|
+ addr.sa_family = AF_INET;
|
|
}
|
|
|
|
if (rc <= 0) {
|
|
@@ -1502,7 +1502,7 @@
|
|
tcp_ses->tcpStatus = CifsNew;
|
|
++tcp_ses->srv_count;
|
|
|
|
- if (addr.ss_family == AF_INET6) {
|
|
+ if (addr.sa_family == AF_INET6) {
|
|
cFYI(1, ("attempting ipv6 connect"));
|
|
/* BB should we allow ipv6 on port 139? */
|
|
/* other OS never observed in Wild doing 139 with v6 */
|
|
@@ -1802,7 +1802,7 @@
|
|
* user space buffer
|
|
*/
|
|
socket->sk->sk_rcvtimeo = 7 * HZ;
|
|
- socket->sk->sk_sndtimeo = 5 * HZ;
|
|
+ socket->sk->sk_sndtimeo = 3 * HZ;
|
|
|
|
/* make the bufsizes depend on wsize/rsize and max requests */
|
|
if (server->noautotune) {
|
|
@@ -1860,7 +1860,9 @@
|
|
smb_buf = (struct smb_hdr *)ses_init_buf;
|
|
/* sizeof RFC1002_SESSION_REQUEST with no scope */
|
|
smb_buf->smb_buf_length = 0x81000044;
|
|
- rc = smb_send(server, smb_buf, 0x44);
|
|
+ rc = smb_send(socket, smb_buf, 0x44,
|
|
+ (struct sockaddr *) &server->addr.sockAddr,
|
|
+ server->noblocksnd);
|
|
kfree(ses_init_buf);
|
|
msleep(1); /* RFC1001 layer in at least one server
|
|
requires very short break before negprot
|
|
@@ -1953,7 +1955,7 @@
|
|
* user space buffer
|
|
*/
|
|
socket->sk->sk_rcvtimeo = 7 * HZ;
|
|
- socket->sk->sk_sndtimeo = 5 * HZ;
|
|
+ socket->sk->sk_sndtimeo = 3 * HZ;
|
|
server->ssocket = socket;
|
|
|
|
return rc;
|
|
@@ -2180,33 +2182,6 @@
|
|
"mount option supported"));
|
|
}
|
|
|
|
-static int
|
|
-is_path_accessible(int xid, struct cifsTconInfo *tcon,
|
|
- struct cifs_sb_info *cifs_sb, const char *full_path)
|
|
-{
|
|
- int rc;
|
|
- __u64 inode_num;
|
|
- FILE_ALL_INFO *pfile_info;
|
|
-
|
|
- rc = CIFSGetSrvInodeNumber(xid, tcon, full_path, &inode_num,
|
|
- cifs_sb->local_nls,
|
|
- cifs_sb->mnt_cifs_flags &
|
|
- CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
- if (rc != -EOPNOTSUPP)
|
|
- return rc;
|
|
-
|
|
- pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
|
|
- if (pfile_info == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
- rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
|
|
- 0 /* not legacy */, cifs_sb->local_nls,
|
|
- cifs_sb->mnt_cifs_flags &
|
|
- CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
- kfree(pfile_info);
|
|
- return rc;
|
|
-}
|
|
-
|
|
int
|
|
cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
|
|
char *mount_data, const char *devname)
|
|
@@ -2217,7 +2192,6 @@
|
|
struct cifsSesInfo *pSesInfo = NULL;
|
|
struct cifsTconInfo *tcon = NULL;
|
|
struct TCP_Server_Info *srvTcp = NULL;
|
|
- char *full_path;
|
|
|
|
xid = GetXid();
|
|
|
|
@@ -2454,23 +2428,6 @@
|
|
cifs_sb->rsize = min(cifs_sb->rsize,
|
|
(tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
|
|
|
|
- if (!rc && cifs_sb->prepathlen) {
|
|
- /* build_path_to_root works only when we have a valid tcon */
|
|
- full_path = cifs_build_path_to_root(cifs_sb);
|
|
- if (full_path == NULL) {
|
|
- rc = -ENOMEM;
|
|
- goto mount_fail_check;
|
|
- }
|
|
- rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
|
|
- if (rc) {
|
|
- cERROR(1, ("Path %s in not accessible: %d",
|
|
- full_path, rc));
|
|
- kfree(full_path);
|
|
- goto mount_fail_check;
|
|
- }
|
|
- kfree(full_path);
|
|
- }
|
|
-
|
|
/* volume_info->password is freed above when existing session found
|
|
(in which case it is not needed anymore) but when new sesion is created
|
|
the password ptr is put in the new session structure (in which case the
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/dir.c linux-2.6.29-rc3.owrt/fs/cifs/dir.c
|
|
--- linux-2.6.29.owrt/fs/cifs/dir.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/dir.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -3,7 +3,7 @@
|
|
*
|
|
* vfs operations that deal with dentries
|
|
*
|
|
- * Copyright (C) International Business Machines Corp., 2002,2009
|
|
+ * Copyright (C) International Business Machines Corp., 2002,2008
|
|
* Author(s): Steve French (sfrench@us.ibm.com)
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
@@ -129,89 +129,6 @@
|
|
return full_path;
|
|
}
|
|
|
|
-static int cifs_posix_open(char *full_path, struct inode **pinode,
|
|
- struct super_block *sb, int mode, int oflags,
|
|
- int *poplock, __u16 *pnetfid, int xid)
|
|
-{
|
|
- int rc;
|
|
- __u32 oplock;
|
|
- FILE_UNIX_BASIC_INFO *presp_data;
|
|
- __u32 posix_flags = 0;
|
|
- struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
|
|
-
|
|
- cFYI(1, ("posix open %s", full_path));
|
|
-
|
|
- presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
|
|
- if (presp_data == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
-/* So far cifs posix extensions can only map the following flags.
|
|
- There are other valid fmode oflags such as FMODE_LSEEK, FMODE_PREAD, but
|
|
- so far we do not seem to need them, and we can treat them as local only */
|
|
- if ((oflags & (FMODE_READ | FMODE_WRITE)) ==
|
|
- (FMODE_READ | FMODE_WRITE))
|
|
- posix_flags = SMB_O_RDWR;
|
|
- else if (oflags & FMODE_READ)
|
|
- posix_flags = SMB_O_RDONLY;
|
|
- else if (oflags & FMODE_WRITE)
|
|
- posix_flags = SMB_O_WRONLY;
|
|
- if (oflags & O_CREAT)
|
|
- posix_flags |= SMB_O_CREAT;
|
|
- if (oflags & O_EXCL)
|
|
- posix_flags |= SMB_O_EXCL;
|
|
- if (oflags & O_TRUNC)
|
|
- posix_flags |= SMB_O_TRUNC;
|
|
- if (oflags & O_APPEND)
|
|
- posix_flags |= SMB_O_APPEND;
|
|
- if (oflags & O_SYNC)
|
|
- posix_flags |= SMB_O_SYNC;
|
|
- if (oflags & O_DIRECTORY)
|
|
- posix_flags |= SMB_O_DIRECTORY;
|
|
- if (oflags & O_NOFOLLOW)
|
|
- posix_flags |= SMB_O_NOFOLLOW;
|
|
- if (oflags & O_DIRECT)
|
|
- posix_flags |= SMB_O_DIRECT;
|
|
-
|
|
-
|
|
- rc = CIFSPOSIXCreate(xid, cifs_sb->tcon, posix_flags, mode,
|
|
- pnetfid, presp_data, &oplock, full_path,
|
|
- cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
|
|
- CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
- if (rc)
|
|
- goto posix_open_ret;
|
|
-
|
|
- if (presp_data->Type == cpu_to_le32(-1))
|
|
- goto posix_open_ret; /* open ok, caller does qpathinfo */
|
|
-
|
|
- /* get new inode and set it up */
|
|
- if (!pinode)
|
|
- goto posix_open_ret; /* caller does not need info */
|
|
-
|
|
- *pinode = cifs_new_inode(sb, &presp_data->UniqueId);
|
|
-
|
|
- /* We do not need to close the file if new_inode fails since
|
|
- the caller will retry qpathinfo as long as inode is null */
|
|
- if (*pinode == NULL)
|
|
- goto posix_open_ret;
|
|
-
|
|
- posix_fill_in_inode(*pinode, presp_data, 1);
|
|
-
|
|
-posix_open_ret:
|
|
- kfree(presp_data);
|
|
- return rc;
|
|
-}
|
|
-
|
|
-static void setup_cifs_dentry(struct cifsTconInfo *tcon,
|
|
- struct dentry *direntry,
|
|
- struct inode *newinode)
|
|
-{
|
|
- if (tcon->nocase)
|
|
- direntry->d_op = &cifs_ci_dentry_ops;
|
|
- else
|
|
- direntry->d_op = &cifs_dentry_ops;
|
|
- d_instantiate(direntry, newinode);
|
|
-}
|
|
-
|
|
/* Inode operations in similar order to how they appear in Linux file fs.h */
|
|
|
|
int
|
|
@@ -222,21 +139,14 @@
|
|
int xid;
|
|
int create_options = CREATE_NOT_DIR;
|
|
int oplock = 0;
|
|
- int oflags;
|
|
- /*
|
|
- * BB below access is probably too much for mknod to request
|
|
- * but we have to do query and setpathinfo so requesting
|
|
- * less could fail (unless we want to request getatr and setatr
|
|
- * permissions (only). At least for POSIX we do not have to
|
|
- * request so much.
|
|
- */
|
|
int desiredAccess = GENERIC_READ | GENERIC_WRITE;
|
|
__u16 fileHandle;
|
|
struct cifs_sb_info *cifs_sb;
|
|
- struct cifsTconInfo *tcon;
|
|
+ struct cifsTconInfo *pTcon;
|
|
char *full_path = NULL;
|
|
FILE_ALL_INFO *buf = NULL;
|
|
struct inode *newinode = NULL;
|
|
+ struct cifsFileInfo *pCifsFile = NULL;
|
|
struct cifsInodeInfo *pCifsInode;
|
|
int disposition = FILE_OVERWRITE_IF;
|
|
bool write_only = false;
|
|
@@ -244,7 +154,7 @@
|
|
xid = GetXid();
|
|
|
|
cifs_sb = CIFS_SB(inode->i_sb);
|
|
- tcon = cifs_sb->tcon;
|
|
+ pTcon = cifs_sb->tcon;
|
|
|
|
full_path = build_path_from_dentry(direntry);
|
|
if (full_path == NULL) {
|
|
@@ -252,44 +162,12 @@
|
|
return -ENOMEM;
|
|
}
|
|
|
|
- mode &= ~current->fs->umask;
|
|
- if (oplockEnabled)
|
|
- oplock = REQ_OPLOCK;
|
|
-
|
|
- if (nd && (nd->flags & LOOKUP_OPEN))
|
|
- oflags = nd->intent.open.flags;
|
|
- else
|
|
- oflags = FMODE_READ;
|
|
-
|
|
- if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) &&
|
|
- (CIFS_UNIX_POSIX_PATH_OPS_CAP &
|
|
- le64_to_cpu(tcon->fsUnixInfo.Capability))) {
|
|
- rc = cifs_posix_open(full_path, &newinode, inode->i_sb,
|
|
- mode, oflags, &oplock, &fileHandle, xid);
|
|
- /* EIO could indicate that (posix open) operation is not
|
|
- supported, despite what server claimed in capability
|
|
- negotation. EREMOTE indicates DFS junction, which is not
|
|
- handled in posix open */
|
|
-
|
|
- if ((rc == 0) && (newinode == NULL))
|
|
- goto cifs_create_get_file_info; /* query inode info */
|
|
- else if (rc == 0) /* success, no need to query */
|
|
- goto cifs_create_set_dentry;
|
|
- else if ((rc != -EIO) && (rc != -EREMOTE) &&
|
|
- (rc != -EOPNOTSUPP)) /* path not found or net err */
|
|
- goto cifs_create_out;
|
|
- /* else fallthrough to retry, using older open call, this is
|
|
- case where server does not support this SMB level, and
|
|
- falsely claims capability (also get here for DFS case
|
|
- which should be rare for path not covered on files) */
|
|
- }
|
|
-
|
|
if (nd && (nd->flags & LOOKUP_OPEN)) {
|
|
- /* if the file is going to stay open, then we
|
|
- need to set the desired access properly */
|
|
+ int oflags = nd->intent.open.flags;
|
|
+
|
|
desiredAccess = 0;
|
|
if (oflags & FMODE_READ)
|
|
- desiredAccess |= GENERIC_READ; /* is this too little? */
|
|
+ desiredAccess |= GENERIC_READ;
|
|
if (oflags & FMODE_WRITE) {
|
|
desiredAccess |= GENERIC_WRITE;
|
|
if (!(oflags & FMODE_READ))
|
|
@@ -308,6 +186,8 @@
|
|
|
|
/* BB add processing to set equivalent of mode - e.g. via CreateX with
|
|
ACLs */
|
|
+ if (oplockEnabled)
|
|
+ oplock = REQ_OPLOCK;
|
|
|
|
buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
|
|
if (buf == NULL) {
|
|
@@ -316,15 +196,17 @@
|
|
return -ENOMEM;
|
|
}
|
|
|
|
+ mode &= ~current->fs->umask;
|
|
+
|
|
/*
|
|
* if we're not using unix extensions, see if we need to set
|
|
* ATTR_READONLY on the create call
|
|
*/
|
|
- if (!tcon->unix_ext && (mode & S_IWUGO) == 0)
|
|
+ if (!pTcon->unix_ext && (mode & S_IWUGO) == 0)
|
|
create_options |= CREATE_OPTION_READONLY;
|
|
|
|
if (cifs_sb->tcon->ses->capabilities & CAP_NT_SMBS)
|
|
- rc = CIFSSMBOpen(xid, tcon, full_path, disposition,
|
|
+ rc = CIFSSMBOpen(xid, pTcon, full_path, disposition,
|
|
desiredAccess, create_options,
|
|
&fileHandle, &oplock, buf, cifs_sb->local_nls,
|
|
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
@@ -333,119 +215,128 @@
|
|
|
|
if (rc == -EIO) {
|
|
/* old server, retry the open legacy style */
|
|
- rc = SMBLegacyOpen(xid, tcon, full_path, disposition,
|
|
+ rc = SMBLegacyOpen(xid, pTcon, full_path, disposition,
|
|
desiredAccess, create_options,
|
|
&fileHandle, &oplock, buf, cifs_sb->local_nls,
|
|
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
}
|
|
if (rc) {
|
|
cFYI(1, ("cifs_create returned 0x%x", rc));
|
|
- goto cifs_create_out;
|
|
- }
|
|
-
|
|
- /* If Open reported that we actually created a file
|
|
- then we now have to set the mode if possible */
|
|
- if ((tcon->unix_ext) && (oplock & CIFS_CREATE_ACTION)) {
|
|
- struct cifs_unix_set_info_args args = {
|
|
+ } else {
|
|
+ /* If Open reported that we actually created a file
|
|
+ then we now have to set the mode if possible */
|
|
+ if ((pTcon->unix_ext) && (oplock & CIFS_CREATE_ACTION)) {
|
|
+ struct cifs_unix_set_info_args args = {
|
|
.mode = mode,
|
|
.ctime = NO_CHANGE_64,
|
|
.atime = NO_CHANGE_64,
|
|
.mtime = NO_CHANGE_64,
|
|
.device = 0,
|
|
- };
|
|
+ };
|
|
|
|
- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
|
|
- args.uid = (__u64) current_fsuid();
|
|
- if (inode->i_mode & S_ISGID)
|
|
- args.gid = (__u64) inode->i_gid;
|
|
- else
|
|
- args.gid = (__u64) current_fsgid();
|
|
- } else {
|
|
- args.uid = NO_CHANGE_64;
|
|
- args.gid = NO_CHANGE_64;
|
|
- }
|
|
- CIFSSMBUnixSetInfo(xid, tcon, full_path, &args,
|
|
- cifs_sb->local_nls,
|
|
- cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
- } else {
|
|
- /* BB implement mode setting via Windows security
|
|
- descriptors e.g. */
|
|
- /* CIFSSMBWinSetPerms(xid,tcon,path,mode,-1,-1,nls);*/
|
|
-
|
|
- /* Could set r/o dos attribute if mode & 0222 == 0 */
|
|
- }
|
|
-
|
|
-cifs_create_get_file_info:
|
|
- /* server might mask mode so we have to query for it */
|
|
- if (tcon->unix_ext)
|
|
- rc = cifs_get_inode_info_unix(&newinode, full_path,
|
|
- inode->i_sb, xid);
|
|
- else {
|
|
- rc = cifs_get_inode_info(&newinode, full_path, buf,
|
|
- inode->i_sb, xid, &fileHandle);
|
|
- if (newinode) {
|
|
- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
|
|
- newinode->i_mode = mode;
|
|
- if ((oplock & CIFS_CREATE_ACTION) &&
|
|
- (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)) {
|
|
- newinode->i_uid = current_fsuid();
|
|
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
|
|
+ args.uid = (__u64) current_fsuid();
|
|
if (inode->i_mode & S_ISGID)
|
|
- newinode->i_gid = inode->i_gid;
|
|
+ args.gid = (__u64) inode->i_gid;
|
|
else
|
|
- newinode->i_gid = current_fsgid();
|
|
+ args.gid = (__u64) current_fsgid();
|
|
+ } else {
|
|
+ args.uid = NO_CHANGE_64;
|
|
+ args.gid = NO_CHANGE_64;
|
|
}
|
|
+ CIFSSMBUnixSetInfo(xid, pTcon, full_path, &args,
|
|
+ cifs_sb->local_nls,
|
|
+ cifs_sb->mnt_cifs_flags &
|
|
+ CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
+ } else {
|
|
+ /* BB implement mode setting via Windows security
|
|
+ descriptors e.g. */
|
|
+ /* CIFSSMBWinSetPerms(xid,pTcon,path,mode,-1,-1,nls);*/
|
|
+
|
|
+ /* Could set r/o dos attribute if mode & 0222 == 0 */
|
|
}
|
|
- }
|
|
|
|
-cifs_create_set_dentry:
|
|
- if (rc == 0)
|
|
- setup_cifs_dentry(tcon, direntry, newinode);
|
|
- else
|
|
- cFYI(1, ("Create worked, get_inode_info failed rc = %d", rc));
|
|
+ /* server might mask mode so we have to query for it */
|
|
+ if (pTcon->unix_ext)
|
|
+ rc = cifs_get_inode_info_unix(&newinode, full_path,
|
|
+ inode->i_sb, xid);
|
|
+ else {
|
|
+ rc = cifs_get_inode_info(&newinode, full_path,
|
|
+ buf, inode->i_sb, xid,
|
|
+ &fileHandle);
|
|
+ if (newinode) {
|
|
+ if (cifs_sb->mnt_cifs_flags &
|
|
+ CIFS_MOUNT_DYNPERM)
|
|
+ newinode->i_mode = mode;
|
|
+ if ((oplock & CIFS_CREATE_ACTION) &&
|
|
+ (cifs_sb->mnt_cifs_flags &
|
|
+ CIFS_MOUNT_SET_UID)) {
|
|
+ newinode->i_uid = current_fsuid();
|
|
+ if (inode->i_mode & S_ISGID)
|
|
+ newinode->i_gid =
|
|
+ inode->i_gid;
|
|
+ else
|
|
+ newinode->i_gid =
|
|
+ current_fsgid();
|
|
+ }
|
|
+ }
|
|
+ }
|
|
|
|
- /* nfsd case - nfs srv does not set nd */
|
|
- if ((nd == NULL) || (!(nd->flags & LOOKUP_OPEN))) {
|
|
- /* mknod case - do not leave file open */
|
|
- CIFSSMBClose(xid, tcon, fileHandle);
|
|
- } else if (newinode) {
|
|
- struct cifsFileInfo *pCifsFile =
|
|
- kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
|
|
-
|
|
- if (pCifsFile == NULL)
|
|
- goto cifs_create_out;
|
|
- pCifsFile->netfid = fileHandle;
|
|
- pCifsFile->pid = current->tgid;
|
|
- pCifsFile->pInode = newinode;
|
|
- pCifsFile->invalidHandle = false;
|
|
- pCifsFile->closePend = false;
|
|
- init_MUTEX(&pCifsFile->fh_sem);
|
|
- mutex_init(&pCifsFile->lock_mutex);
|
|
- INIT_LIST_HEAD(&pCifsFile->llist);
|
|
- atomic_set(&pCifsFile->wrtPending, 0);
|
|
+ if (rc != 0) {
|
|
+ cFYI(1,
|
|
+ ("Create worked but get_inode_info failed rc = %d",
|
|
+ rc));
|
|
+ } else {
|
|
+ if (pTcon->nocase)
|
|
+ direntry->d_op = &cifs_ci_dentry_ops;
|
|
+ else
|
|
+ direntry->d_op = &cifs_dentry_ops;
|
|
+ d_instantiate(direntry, newinode);
|
|
+ }
|
|
+ if ((nd == NULL /* nfsd case - nfs srv does not set nd */) ||
|
|
+ (!(nd->flags & LOOKUP_OPEN))) {
|
|
+ /* mknod case - do not leave file open */
|
|
+ CIFSSMBClose(xid, pTcon, fileHandle);
|
|
+ } else if (newinode) {
|
|
+ pCifsFile =
|
|
+ kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
|
|
+
|
|
+ if (pCifsFile == NULL)
|
|
+ goto cifs_create_out;
|
|
+ pCifsFile->netfid = fileHandle;
|
|
+ pCifsFile->pid = current->tgid;
|
|
+ pCifsFile->pInode = newinode;
|
|
+ pCifsFile->invalidHandle = false;
|
|
+ pCifsFile->closePend = false;
|
|
+ init_MUTEX(&pCifsFile->fh_sem);
|
|
+ mutex_init(&pCifsFile->lock_mutex);
|
|
+ INIT_LIST_HEAD(&pCifsFile->llist);
|
|
+ atomic_set(&pCifsFile->wrtPending, 0);
|
|
|
|
- /* set the following in open now
|
|
+ /* set the following in open now
|
|
pCifsFile->pfile = file; */
|
|
- write_lock(&GlobalSMBSeslock);
|
|
- list_add(&pCifsFile->tlist, &tcon->openFileList);
|
|
- pCifsInode = CIFS_I(newinode);
|
|
- if (pCifsInode) {
|
|
- /* if readable file instance put first in list*/
|
|
- if (write_only) {
|
|
- list_add_tail(&pCifsFile->flist,
|
|
- &pCifsInode->openFileList);
|
|
- } else {
|
|
- list_add(&pCifsFile->flist,
|
|
- &pCifsInode->openFileList);
|
|
+ write_lock(&GlobalSMBSeslock);
|
|
+ list_add(&pCifsFile->tlist, &pTcon->openFileList);
|
|
+ pCifsInode = CIFS_I(newinode);
|
|
+ if (pCifsInode) {
|
|
+ /* if readable file instance put first in list*/
|
|
+ if (write_only) {
|
|
+ list_add_tail(&pCifsFile->flist,
|
|
+ &pCifsInode->openFileList);
|
|
+ } else {
|
|
+ list_add(&pCifsFile->flist,
|
|
+ &pCifsInode->openFileList);
|
|
+ }
|
|
+ if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
|
|
+ pCifsInode->clientCanCacheAll = true;
|
|
+ pCifsInode->clientCanCacheRead = true;
|
|
+ cFYI(1, ("Exclusive Oplock inode %p",
|
|
+ newinode));
|
|
+ } else if ((oplock & 0xF) == OPLOCK_READ)
|
|
+ pCifsInode->clientCanCacheRead = true;
|
|
}
|
|
- if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
|
|
- pCifsInode->clientCanCacheAll = true;
|
|
- pCifsInode->clientCanCacheRead = true;
|
|
- cFYI(1, ("Exclusive Oplock inode %p",
|
|
- newinode));
|
|
- } else if ((oplock & 0xF) == OPLOCK_READ)
|
|
- pCifsInode->clientCanCacheRead = true;
|
|
+ write_unlock(&GlobalSMBSeslock);
|
|
}
|
|
- write_unlock(&GlobalSMBSeslock);
|
|
}
|
|
cifs_create_out:
|
|
kfree(buf);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/inode.c linux-2.6.29-rc3.owrt/fs/cifs/inode.c
|
|
--- linux-2.6.29.owrt/fs/cifs/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -199,49 +199,6 @@
|
|
pfnd_dat->Gid = cpu_to_le64(pinode->i_gid);
|
|
}
|
|
|
|
-/**
|
|
- * cifs_new inode - create new inode, initialize, and hash it
|
|
- * @sb - pointer to superblock
|
|
- * @inum - if valid pointer and serverino is enabled, replace i_ino with val
|
|
- *
|
|
- * Create a new inode, initialize it for CIFS and hash it. Returns the new
|
|
- * inode or NULL if one couldn't be allocated.
|
|
- *
|
|
- * If the share isn't mounted with "serverino" or inum is a NULL pointer then
|
|
- * we'll just use the inode number assigned by new_inode(). Note that this can
|
|
- * mean i_ino collisions since the i_ino assigned by new_inode is not
|
|
- * guaranteed to be unique.
|
|
- */
|
|
-struct inode *
|
|
-cifs_new_inode(struct super_block *sb, __u64 *inum)
|
|
-{
|
|
- struct inode *inode;
|
|
-
|
|
- inode = new_inode(sb);
|
|
- if (inode == NULL)
|
|
- return NULL;
|
|
-
|
|
- /*
|
|
- * BB: Is i_ino == 0 legal? Here, we assume that it is. If it isn't we
|
|
- * stop passing inum as ptr. Are there sanity checks we can use to
|
|
- * ensure that the server is really filling in that field? Also,
|
|
- * if serverino is disabled, perhaps we should be using iunique()?
|
|
- */
|
|
- if (inum && (CIFS_SB(sb)->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM))
|
|
- inode->i_ino = (unsigned long) *inum;
|
|
-
|
|
- /*
|
|
- * must set this here instead of cifs_alloc_inode since VFS will
|
|
- * clobber i_flags
|
|
- */
|
|
- if (sb->s_flags & MS_NOATIME)
|
|
- inode->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
-
|
|
- insert_inode_hash(inode);
|
|
-
|
|
- return inode;
|
|
-}
|
|
-
|
|
int cifs_get_inode_info_unix(struct inode **pinode,
|
|
const unsigned char *full_path, struct super_block *sb, int xid)
|
|
{
|
|
@@ -276,11 +233,22 @@
|
|
|
|
/* get new inode */
|
|
if (*pinode == NULL) {
|
|
- *pinode = cifs_new_inode(sb, &find_data.UniqueId);
|
|
+ *pinode = new_inode(sb);
|
|
if (*pinode == NULL) {
|
|
rc = -ENOMEM;
|
|
goto cgiiu_exit;
|
|
}
|
|
+ /* Is an i_ino of zero legal? */
|
|
+ /* note ino incremented to unique num in new_inode */
|
|
+ /* Are there sanity checks we can use to ensure that
|
|
+ the server is really filling in that field? */
|
|
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
|
|
+ (*pinode)->i_ino = (unsigned long)find_data.UniqueId;
|
|
+
|
|
+ if (sb->s_flags & MS_NOATIME)
|
|
+ (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
+
|
|
+ insert_inode_hash(*pinode);
|
|
}
|
|
|
|
inode = *pinode;
|
|
@@ -497,9 +465,11 @@
|
|
|
|
/* get new inode */
|
|
if (*pinode == NULL) {
|
|
- __u64 inode_num;
|
|
- __u64 *pinum = &inode_num;
|
|
-
|
|
+ *pinode = new_inode(sb);
|
|
+ if (*pinode == NULL) {
|
|
+ rc = -ENOMEM;
|
|
+ goto cgii_exit;
|
|
+ }
|
|
/* Is an i_ino of zero legal? Can we use that to check
|
|
if the server supports returning inode numbers? Are
|
|
there other sanity checks we can use to ensure that
|
|
@@ -516,26 +486,22 @@
|
|
|
|
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
|
|
int rc1 = 0;
|
|
+ __u64 inode_num;
|
|
|
|
rc1 = CIFSGetSrvInodeNumber(xid, pTcon,
|
|
- full_path, pinum,
|
|
+ full_path, &inode_num,
|
|
cifs_sb->local_nls,
|
|
cifs_sb->mnt_cifs_flags &
|
|
CIFS_MOUNT_MAP_SPECIAL_CHR);
|
|
if (rc1) {
|
|
cFYI(1, ("GetSrvInodeNum rc %d", rc1));
|
|
- pinum = NULL;
|
|
/* BB EOPNOSUPP disable SERVER_INUM? */
|
|
- }
|
|
- } else {
|
|
- pinum = NULL;
|
|
- }
|
|
-
|
|
- *pinode = cifs_new_inode(sb, pinum);
|
|
- if (*pinode == NULL) {
|
|
- rc = -ENOMEM;
|
|
- goto cgii_exit;
|
|
- }
|
|
+ } else /* do we need cast or hash to ino? */
|
|
+ (*pinode)->i_ino = inode_num;
|
|
+ } /* else ino incremented to unique num in new_inode*/
|
|
+ if (sb->s_flags & MS_NOATIME)
|
|
+ (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
+ insert_inode_hash(*pinode);
|
|
}
|
|
inode = *pinode;
|
|
cifsInfo = CIFS_I(inode);
|
|
@@ -655,7 +621,7 @@
|
|
.lookup = cifs_lookup,
|
|
};
|
|
|
|
-char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb)
|
|
+static char *build_path_to_root(struct cifs_sb_info *cifs_sb)
|
|
{
|
|
int pplen = cifs_sb->prepathlen;
|
|
int dfsplen;
|
|
@@ -712,7 +678,7 @@
|
|
return inode;
|
|
|
|
cifs_sb = CIFS_SB(inode->i_sb);
|
|
- full_path = cifs_build_path_to_root(cifs_sb);
|
|
+ full_path = build_path_to_root(cifs_sb);
|
|
if (full_path == NULL)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
@@ -1051,7 +1017,7 @@
|
|
return rc;
|
|
}
|
|
|
|
-void posix_fill_in_inode(struct inode *tmp_inode,
|
|
+static void posix_fill_in_inode(struct inode *tmp_inode,
|
|
FILE_UNIX_BASIC_INFO *pData, int isNewInode)
|
|
{
|
|
struct cifsInodeInfo *cifsInfo = CIFS_I(tmp_inode);
|
|
@@ -1148,14 +1114,24 @@
|
|
else
|
|
direntry->d_op = &cifs_dentry_ops;
|
|
|
|
- newinode = cifs_new_inode(inode->i_sb,
|
|
- &pInfo->UniqueId);
|
|
+ newinode = new_inode(inode->i_sb);
|
|
if (newinode == NULL) {
|
|
kfree(pInfo);
|
|
goto mkdir_get_info;
|
|
}
|
|
|
|
+ /* Is an i_ino of zero legal? */
|
|
+ /* Are there sanity checks we can use to ensure that
|
|
+ the server is really filling in that field? */
|
|
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
|
|
+ newinode->i_ino =
|
|
+ (unsigned long)pInfo->UniqueId;
|
|
+ } /* note ino incremented to unique num in new_inode */
|
|
+ if (inode->i_sb->s_flags & MS_NOATIME)
|
|
+ newinode->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
newinode->i_nlink = 2;
|
|
+
|
|
+ insert_inode_hash(newinode);
|
|
d_instantiate(direntry, newinode);
|
|
|
|
/* we already checked in POSIXCreate whether
|
|
@@ -1309,11 +1285,6 @@
|
|
cifsInode = CIFS_I(direntry->d_inode);
|
|
cifsInode->time = 0; /* force revalidate to go get info when
|
|
needed */
|
|
-
|
|
- cifsInode = CIFS_I(inode);
|
|
- cifsInode->time = 0; /* force revalidate to get parent dir info
|
|
- since cached search results now invalid */
|
|
-
|
|
direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime =
|
|
current_fs_time(inode->i_sb);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/md5.c linux-2.6.29-rc3.owrt/fs/cifs/md5.c
|
|
--- linux-2.6.29.owrt/fs/cifs/md5.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/md5.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -10,8 +10,8 @@
|
|
* with every copy.
|
|
*
|
|
* To compute the message digest of a chunk of bytes, declare an
|
|
- * MD5Context structure, pass it to cifs_MD5_init, call cifs_MD5_update as
|
|
- * needed on buffers full of bytes, and then call cifs_MD5_final, which
|
|
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
|
|
+ * needed on buffers full of bytes, and then call MD5Final, which
|
|
* will fill a supplied 16-byte array with the digest.
|
|
*/
|
|
|
|
@@ -45,7 +45,7 @@
|
|
* initialization constants.
|
|
*/
|
|
void
|
|
-cifs_MD5_init(struct MD5Context *ctx)
|
|
+MD5Init(struct MD5Context *ctx)
|
|
{
|
|
ctx->buf[0] = 0x67452301;
|
|
ctx->buf[1] = 0xefcdab89;
|
|
@@ -61,7 +61,7 @@
|
|
* of bytes.
|
|
*/
|
|
void
|
|
-cifs_MD5_update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
|
|
+MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
|
|
{
|
|
register __u32 t;
|
|
|
|
@@ -110,7 +110,7 @@
|
|
* 1 0* (64-bit count of bits processed, MSB-first)
|
|
*/
|
|
void
|
|
-cifs_MD5_final(unsigned char digest[16], struct MD5Context *ctx)
|
|
+MD5Final(unsigned char digest[16], struct MD5Context *ctx)
|
|
{
|
|
unsigned int count;
|
|
unsigned char *p;
|
|
@@ -165,7 +165,7 @@
|
|
|
|
/*
|
|
* The core of the MD5 algorithm, this alters an existing MD5 hash to
|
|
- * reflect the addition of 16 longwords of new data. cifs_MD5_update blocks
|
|
+ * reflect the addition of 16 longwords of new data. MD5Update blocks
|
|
* the data and converts bytes into longwords for this routine.
|
|
*/
|
|
static void
|
|
@@ -267,9 +267,9 @@
|
|
unsigned char tk[16];
|
|
struct MD5Context tctx;
|
|
|
|
- cifs_MD5_init(&tctx);
|
|
- cifs_MD5_update(&tctx, key, key_len);
|
|
- cifs_MD5_final(tk, &tctx);
|
|
+ MD5Init(&tctx);
|
|
+ MD5Update(&tctx, key, key_len);
|
|
+ MD5Final(tk, &tctx);
|
|
|
|
key = tk;
|
|
key_len = 16;
|
|
@@ -287,8 +287,8 @@
|
|
ctx->k_opad[i] ^= 0x5c;
|
|
}
|
|
|
|
- cifs_MD5_init(&ctx->ctx);
|
|
- cifs_MD5_update(&ctx->ctx, ctx->k_ipad, 64);
|
|
+ MD5Init(&ctx->ctx);
|
|
+ MD5Update(&ctx->ctx, ctx->k_ipad, 64);
|
|
}
|
|
#endif
|
|
|
|
@@ -317,8 +317,8 @@
|
|
ctx->k_opad[i] ^= 0x5c;
|
|
}
|
|
|
|
- cifs_MD5_init(&ctx->ctx);
|
|
- cifs_MD5_update(&ctx->ctx, ctx->k_ipad, 64);
|
|
+ MD5Init(&ctx->ctx);
|
|
+ MD5Update(&ctx->ctx, ctx->k_ipad, 64);
|
|
}
|
|
|
|
/***********************************************************************
|
|
@@ -328,7 +328,7 @@
|
|
hmac_md5_update(const unsigned char *text, int text_len,
|
|
struct HMACMD5Context *ctx)
|
|
{
|
|
- cifs_MD5_update(&ctx->ctx, text, text_len); /* then text of datagram */
|
|
+ MD5Update(&ctx->ctx, text, text_len); /* then text of datagram */
|
|
}
|
|
|
|
/***********************************************************************
|
|
@@ -339,12 +339,12 @@
|
|
{
|
|
struct MD5Context ctx_o;
|
|
|
|
- cifs_MD5_final(digest, &ctx->ctx);
|
|
+ MD5Final(digest, &ctx->ctx);
|
|
|
|
- cifs_MD5_init(&ctx_o);
|
|
- cifs_MD5_update(&ctx_o, ctx->k_opad, 64);
|
|
- cifs_MD5_update(&ctx_o, digest, 16);
|
|
- cifs_MD5_final(digest, &ctx_o);
|
|
+ MD5Init(&ctx_o);
|
|
+ MD5Update(&ctx_o, ctx->k_opad, 64);
|
|
+ MD5Update(&ctx_o, digest, 16);
|
|
+ MD5Final(digest, &ctx_o);
|
|
}
|
|
|
|
/***********************************************************
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/md5.h linux-2.6.29-rc3.owrt/fs/cifs/md5.h
|
|
--- linux-2.6.29.owrt/fs/cifs/md5.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/md5.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -20,10 +20,10 @@
|
|
};
|
|
#endif /* _HMAC_MD5_H */
|
|
|
|
-void cifs_MD5_init(struct MD5Context *context);
|
|
-void cifs_MD5_update(struct MD5Context *context, unsigned char const *buf,
|
|
+void MD5Init(struct MD5Context *context);
|
|
+void MD5Update(struct MD5Context *context, unsigned char const *buf,
|
|
unsigned len);
|
|
-void cifs_MD5_final(unsigned char digest[16], struct MD5Context *context);
|
|
+void MD5Final(unsigned char digest[16], struct MD5Context *context);
|
|
|
|
/* The following definitions come from lib/hmacmd5.c */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/readdir.c linux-2.6.29-rc3.owrt/fs/cifs/readdir.c
|
|
--- linux-2.6.29.owrt/fs/cifs/readdir.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/readdir.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -56,34 +56,35 @@
|
|
}
|
|
#endif /* DEBUG2 */
|
|
|
|
-/* Returns 1 if new inode created, 2 if both dentry and inode were */
|
|
+/* Returns one if new inode created (which therefore needs to be hashed) */
|
|
/* Might check in the future if inode number changed so we can rehash inode */
|
|
-static int
|
|
-construct_dentry(struct qstr *qstring, struct file *file,
|
|
- struct inode **ptmp_inode, struct dentry **pnew_dentry,
|
|
- __u64 *inum)
|
|
+static int construct_dentry(struct qstr *qstring, struct file *file,
|
|
+ struct inode **ptmp_inode, struct dentry **pnew_dentry)
|
|
{
|
|
- struct dentry *tmp_dentry = NULL;
|
|
- struct super_block *sb = file->f_path.dentry->d_sb;
|
|
+ struct dentry *tmp_dentry;
|
|
+ struct cifs_sb_info *cifs_sb;
|
|
+ struct cifsTconInfo *pTcon;
|
|
int rc = 0;
|
|
|
|
cFYI(1, ("For %s", qstring->name));
|
|
+ cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
|
|
+ pTcon = cifs_sb->tcon;
|
|
|
|
qstring->hash = full_name_hash(qstring->name, qstring->len);
|
|
tmp_dentry = d_lookup(file->f_path.dentry, qstring);
|
|
if (tmp_dentry) {
|
|
- /* BB: overwrite old name? i.e. tmp_dentry->d_name and
|
|
- * tmp_dentry->d_name.len??
|
|
- */
|
|
cFYI(0, ("existing dentry with inode 0x%p",
|
|
tmp_dentry->d_inode));
|
|
*ptmp_inode = tmp_dentry->d_inode;
|
|
+/* BB overwrite old name? i.e. tmp_dentry->d_name and tmp_dentry->d_name.len??*/
|
|
if (*ptmp_inode == NULL) {
|
|
- *ptmp_inode = cifs_new_inode(sb, inum);
|
|
+ *ptmp_inode = new_inode(file->f_path.dentry->d_sb);
|
|
if (*ptmp_inode == NULL)
|
|
return rc;
|
|
rc = 1;
|
|
}
|
|
+ if (file->f_path.dentry->d_sb->s_flags & MS_NOATIME)
|
|
+ (*ptmp_inode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
} else {
|
|
tmp_dentry = d_alloc(file->f_path.dentry, qstring);
|
|
if (tmp_dentry == NULL) {
|
|
@@ -92,14 +93,15 @@
|
|
return rc;
|
|
}
|
|
|
|
- if (CIFS_SB(sb)->tcon->nocase)
|
|
+ *ptmp_inode = new_inode(file->f_path.dentry->d_sb);
|
|
+ if (pTcon->nocase)
|
|
tmp_dentry->d_op = &cifs_ci_dentry_ops;
|
|
else
|
|
tmp_dentry->d_op = &cifs_dentry_ops;
|
|
-
|
|
- *ptmp_inode = cifs_new_inode(sb, inum);
|
|
if (*ptmp_inode == NULL)
|
|
return rc;
|
|
+ if (file->f_path.dentry->d_sb->s_flags & MS_NOATIME)
|
|
+ (*ptmp_inode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
rc = 2;
|
|
}
|
|
|
|
@@ -820,7 +822,7 @@
|
|
/* inode num, inode type and filename returned */
|
|
static int cifs_get_name_from_search_buf(struct qstr *pqst,
|
|
char *current_entry, __u16 level, unsigned int unicode,
|
|
- struct cifs_sb_info *cifs_sb, int max_len, __u64 *pinum)
|
|
+ struct cifs_sb_info *cifs_sb, int max_len, ino_t *pinum)
|
|
{
|
|
int rc = 0;
|
|
unsigned int len = 0;
|
|
@@ -840,7 +842,9 @@
|
|
len = strnlen(filename, PATH_MAX);
|
|
}
|
|
|
|
- *pinum = pFindData->UniqueId;
|
|
+ /* BB fixme - hash low and high 32 bits if not 64 bit arch BB */
|
|
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
|
|
+ *pinum = pFindData->UniqueId;
|
|
} else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
|
|
FILE_DIRECTORY_INFO *pFindData =
|
|
(FILE_DIRECTORY_INFO *)current_entry;
|
|
@@ -903,7 +907,7 @@
|
|
struct qstr qstring;
|
|
struct cifsFileInfo *pCifsF;
|
|
unsigned int obj_type;
|
|
- __u64 inum;
|
|
+ ino_t inum;
|
|
struct cifs_sb_info *cifs_sb;
|
|
struct inode *tmp_inode;
|
|
struct dentry *tmp_dentry;
|
|
@@ -936,18 +940,20 @@
|
|
if (rc)
|
|
return rc;
|
|
|
|
- /* only these two infolevels return valid inode numbers */
|
|
- if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_UNIX ||
|
|
- pCifsF->srch_inf.info_level == SMB_FIND_FILE_ID_FULL_DIR_INFO)
|
|
- rc = construct_dentry(&qstring, file, &tmp_inode, &tmp_dentry,
|
|
- &inum);
|
|
- else
|
|
- rc = construct_dentry(&qstring, file, &tmp_inode, &tmp_dentry,
|
|
- NULL);
|
|
-
|
|
+ rc = construct_dentry(&qstring, file, &tmp_inode, &tmp_dentry);
|
|
if ((tmp_inode == NULL) || (tmp_dentry == NULL))
|
|
return -ENOMEM;
|
|
|
|
+ if (rc) {
|
|
+ /* inode created, we need to hash it with right inode number */
|
|
+ if (inum != 0) {
|
|
+ /* BB fixme - hash the 2 32 quantities bits together if
|
|
+ * necessary BB */
|
|
+ tmp_inode->i_ino = inum;
|
|
+ }
|
|
+ insert_inode_hash(tmp_inode);
|
|
+ }
|
|
+
|
|
/* we pass in rc below, indicating whether it is a new inode,
|
|
so we can figure out whether to invalidate the inode cached
|
|
data if the file has changed */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/sess.c linux-2.6.29-rc3.owrt/fs/cifs/sess.c
|
|
--- linux-2.6.29.owrt/fs/cifs/sess.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/sess.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -34,99 +34,15 @@
|
|
extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
|
|
unsigned char *p24);
|
|
|
|
-/* Checks if this is the first smb session to be reconnected after
|
|
- the socket has been reestablished (so we know whether to use vc 0).
|
|
- Called while holding the cifs_tcp_ses_lock, so do not block */
|
|
-static bool is_first_ses_reconnect(struct cifsSesInfo *ses)
|
|
-{
|
|
- struct list_head *tmp;
|
|
- struct cifsSesInfo *tmp_ses;
|
|
-
|
|
- list_for_each(tmp, &ses->server->smb_ses_list) {
|
|
- tmp_ses = list_entry(tmp, struct cifsSesInfo,
|
|
- smb_ses_list);
|
|
- if (tmp_ses->need_reconnect == false)
|
|
- return false;
|
|
- }
|
|
- /* could not find a session that was already connected,
|
|
- this must be the first one we are reconnecting */
|
|
- return true;
|
|
-}
|
|
-
|
|
-/*
|
|
- * vc number 0 is treated specially by some servers, and should be the
|
|
- * first one we request. After that we can use vcnumbers up to maxvcs,
|
|
- * one for each smb session (some Windows versions set maxvcs incorrectly
|
|
- * so maxvc=1 can be ignored). If we have too many vcs, we can reuse
|
|
- * any vc but zero (some servers reset the connection on vcnum zero)
|
|
- *
|
|
- */
|
|
-static __le16 get_next_vcnum(struct cifsSesInfo *ses)
|
|
-{
|
|
- __u16 vcnum = 0;
|
|
- struct list_head *tmp;
|
|
- struct cifsSesInfo *tmp_ses;
|
|
- __u16 max_vcs = ses->server->max_vcs;
|
|
- __u16 i;
|
|
- int free_vc_found = 0;
|
|
-
|
|
- /* Quoting the MS-SMB specification: "Windows-based SMB servers set this
|
|
- field to one but do not enforce this limit, which allows an SMB client
|
|
- to establish more virtual circuits than allowed by this value ... but
|
|
- other server implementations can enforce this limit." */
|
|
- if (max_vcs < 2)
|
|
- max_vcs = 0xFFFF;
|
|
-
|
|
- write_lock(&cifs_tcp_ses_lock);
|
|
- if ((ses->need_reconnect) && is_first_ses_reconnect(ses))
|
|
- goto get_vc_num_exit; /* vcnum will be zero */
|
|
- for (i = ses->server->srv_count - 1; i < max_vcs; i++) {
|
|
- if (i == 0) /* this is the only connection, use vc 0 */
|
|
- break;
|
|
-
|
|
- free_vc_found = 1;
|
|
-
|
|
- list_for_each(tmp, &ses->server->smb_ses_list) {
|
|
- tmp_ses = list_entry(tmp, struct cifsSesInfo,
|
|
- smb_ses_list);
|
|
- if (tmp_ses->vcnum == i) {
|
|
- free_vc_found = 0;
|
|
- break; /* found duplicate, try next vcnum */
|
|
- }
|
|
- }
|
|
- if (free_vc_found)
|
|
- break; /* we found a vcnumber that will work - use it */
|
|
- }
|
|
-
|
|
- if (i == 0)
|
|
- vcnum = 0; /* for most common case, ie if one smb session, use
|
|
- vc zero. Also for case when no free vcnum, zero
|
|
- is safest to send (some clients only send zero) */
|
|
- else if (free_vc_found == 0)
|
|
- vcnum = 1; /* we can not reuse vc=0 safely, since some servers
|
|
- reset all uids on that, but 1 is ok. */
|
|
- else
|
|
- vcnum = i;
|
|
- ses->vcnum = vcnum;
|
|
-get_vc_num_exit:
|
|
- write_unlock(&cifs_tcp_ses_lock);
|
|
-
|
|
- return le16_to_cpu(vcnum);
|
|
-}
|
|
-
|
|
static __u32 cifs_ssetup_hdr(struct cifsSesInfo *ses, SESSION_SETUP_ANDX *pSMB)
|
|
{
|
|
__u32 capabilities = 0;
|
|
|
|
/* init fields common to all four types of SessSetup */
|
|
- /* Note that offsets for first seven fields in req struct are same */
|
|
- /* in CIFS Specs so does not matter which of 3 forms of struct */
|
|
- /* that we use in next few lines */
|
|
- /* Note that header is initialized to zero in header_assemble */
|
|
+ /* note that header is initialized to zero in header_assemble */
|
|
pSMB->req.AndXCommand = 0xFF;
|
|
pSMB->req.MaxBufferSize = cpu_to_le16(ses->server->maxBuf);
|
|
pSMB->req.MaxMpxCount = cpu_to_le16(ses->server->maxReq);
|
|
- pSMB->req.VcNumber = get_next_vcnum(ses);
|
|
|
|
/* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
|
|
|
|
@@ -155,6 +71,7 @@
|
|
if (ses->capabilities & CAP_UNIX)
|
|
capabilities |= CAP_UNIX;
|
|
|
|
+ /* BB check whether to init vcnum BB */
|
|
return capabilities;
|
|
}
|
|
|
|
@@ -311,7 +228,7 @@
|
|
|
|
kfree(ses->serverOS);
|
|
/* UTF-8 string will not grow more than four times as big as UCS-16 */
|
|
- ses->serverOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL);
|
|
+ ses->serverOS = kzalloc(4 * len, GFP_KERNEL);
|
|
if (ses->serverOS != NULL)
|
|
cifs_strfromUCS_le(ses->serverOS, (__le16 *)data, len, nls_cp);
|
|
data += 2 * (len + 1);
|
|
@@ -324,7 +241,7 @@
|
|
return rc;
|
|
|
|
kfree(ses->serverNOS);
|
|
- ses->serverNOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL);
|
|
+ ses->serverNOS = kzalloc(4 * len, GFP_KERNEL); /* BB this is wrong length FIXME BB */
|
|
if (ses->serverNOS != NULL) {
|
|
cifs_strfromUCS_le(ses->serverNOS, (__le16 *)data, len,
|
|
nls_cp);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/cifs/transport.c linux-2.6.29-rc3.owrt/fs/cifs/transport.c
|
|
--- linux-2.6.29.owrt/fs/cifs/transport.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/cifs/transport.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -154,8 +154,81 @@
|
|
spin_unlock(&GlobalMid_Lock);
|
|
}
|
|
|
|
+int
|
|
+smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
|
|
+ unsigned int smb_buf_length, struct sockaddr *sin, bool noblocksnd)
|
|
+{
|
|
+ int rc = 0;
|
|
+ int i = 0;
|
|
+ struct msghdr smb_msg;
|
|
+ struct kvec iov;
|
|
+ unsigned len = smb_buf_length + 4;
|
|
+
|
|
+ if (ssocket == NULL)
|
|
+ return -ENOTSOCK; /* BB eventually add reconnect code here */
|
|
+ iov.iov_base = smb_buffer;
|
|
+ iov.iov_len = len;
|
|
+
|
|
+ smb_msg.msg_name = sin;
|
|
+ smb_msg.msg_namelen = sizeof(struct sockaddr);
|
|
+ smb_msg.msg_control = NULL;
|
|
+ smb_msg.msg_controllen = 0;
|
|
+ if (noblocksnd)
|
|
+ smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
|
|
+ else
|
|
+ smb_msg.msg_flags = MSG_NOSIGNAL;
|
|
+
|
|
+ /* smb header is converted in header_assemble. bcc and rest of SMB word
|
|
+ area, and byte area if necessary, is converted to littleendian in
|
|
+ cifssmb.c and RFC1001 len is converted to bigendian in smb_send
|
|
+ Flags2 is converted in SendReceive */
|
|
+
|
|
+ smb_buffer->smb_buf_length = cpu_to_be32(smb_buffer->smb_buf_length);
|
|
+ cFYI(1, ("Sending smb of length %d", smb_buf_length));
|
|
+ dump_smb(smb_buffer, len);
|
|
+
|
|
+ while (len > 0) {
|
|
+ rc = kernel_sendmsg(ssocket, &smb_msg, &iov, 1, len);
|
|
+ if ((rc == -ENOSPC) || (rc == -EAGAIN)) {
|
|
+ i++;
|
|
+ /* smaller timeout here than send2 since smaller size */
|
|
+ /* Although it may not be required, this also is smaller
|
|
+ oplock break time */
|
|
+ if (i > 12) {
|
|
+ cERROR(1,
|
|
+ ("sends on sock %p stuck for 7 seconds",
|
|
+ ssocket));
|
|
+ rc = -EAGAIN;
|
|
+ break;
|
|
+ }
|
|
+ msleep(1 << i);
|
|
+ continue;
|
|
+ }
|
|
+ if (rc < 0)
|
|
+ break;
|
|
+ else
|
|
+ i = 0; /* reset i after each successful send */
|
|
+ iov.iov_base += rc;
|
|
+ iov.iov_len -= rc;
|
|
+ len -= rc;
|
|
+ }
|
|
+
|
|
+ if (rc < 0) {
|
|
+ cERROR(1, ("Error %d sending data on socket to server", rc));
|
|
+ } else {
|
|
+ rc = 0;
|
|
+ }
|
|
+
|
|
+ /* Don't want to modify the buffer as a
|
|
+ side effect of this call. */
|
|
+ smb_buffer->smb_buf_length = smb_buf_length;
|
|
+
|
|
+ return rc;
|
|
+}
|
|
+
|
|
static int
|
|
-smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec)
|
|
+smb_send2(struct TCP_Server_Info *server, struct kvec *iov, int n_vec,
|
|
+ struct sockaddr *sin, bool noblocksnd)
|
|
{
|
|
int rc = 0;
|
|
int i = 0;
|
|
@@ -170,11 +243,11 @@
|
|
if (ssocket == NULL)
|
|
return -ENOTSOCK; /* BB eventually add reconnect code here */
|
|
|
|
- smb_msg.msg_name = (struct sockaddr *) &server->addr.sockAddr;
|
|
+ smb_msg.msg_name = sin;
|
|
smb_msg.msg_namelen = sizeof(struct sockaddr);
|
|
smb_msg.msg_control = NULL;
|
|
smb_msg.msg_controllen = 0;
|
|
- if (server->noblocksnd)
|
|
+ if (noblocksnd)
|
|
smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
|
|
else
|
|
smb_msg.msg_flags = MSG_NOSIGNAL;
|
|
@@ -199,25 +272,7 @@
|
|
n_vec - first_vec, total_len);
|
|
if ((rc == -ENOSPC) || (rc == -EAGAIN)) {
|
|
i++;
|
|
- /* if blocking send we try 3 times, since each can block
|
|
- for 5 seconds. For nonblocking we have to try more
|
|
- but wait increasing amounts of time allowing time for
|
|
- socket to clear. The overall time we wait in either
|
|
- case to send on the socket is about 15 seconds.
|
|
- Similarly we wait for 15 seconds for
|
|
- a response from the server in SendReceive[2]
|
|
- for the server to send a response back for
|
|
- most types of requests (except SMB Write
|
|
- past end of file which can be slow, and
|
|
- blocking lock operations). NFS waits slightly longer
|
|
- than CIFS, but this can make it take longer for
|
|
- nonresponsive servers to be detected and 15 seconds
|
|
- is more than enough time for modern networks to
|
|
- send a packet. In most cases if we fail to send
|
|
- after the retries we will kill the socket and
|
|
- reconnect which may clear the network problem.
|
|
- */
|
|
- if ((i >= 14) || (!server->noblocksnd && (i > 2))) {
|
|
+ if (i >= 14) {
|
|
cERROR(1,
|
|
("sends on sock %p stuck for 15 seconds",
|
|
ssocket));
|
|
@@ -284,18 +339,6 @@
|
|
return rc;
|
|
}
|
|
|
|
-int
|
|
-smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
|
|
- unsigned int smb_buf_length)
|
|
-{
|
|
- struct kvec iov;
|
|
-
|
|
- iov.iov_base = smb_buffer;
|
|
- iov.iov_len = smb_buf_length + 4;
|
|
-
|
|
- return smb_sendv(server, &iov, 1);
|
|
-}
|
|
-
|
|
static int wait_for_free_request(struct cifsSesInfo *ses, const int long_op)
|
|
{
|
|
if (long_op == CIFS_ASYNC_OP) {
|
|
@@ -497,7 +540,9 @@
|
|
#ifdef CONFIG_CIFS_STATS2
|
|
atomic_inc(&ses->server->inSend);
|
|
#endif
|
|
- rc = smb_sendv(ses->server, iov, n_vec);
|
|
+ rc = smb_send2(ses->server, iov, n_vec,
|
|
+ (struct sockaddr *) &(ses->server->addr.sockAddr),
|
|
+ ses->server->noblocksnd);
|
|
#ifdef CONFIG_CIFS_STATS2
|
|
atomic_dec(&ses->server->inSend);
|
|
midQ->when_sent = jiffies;
|
|
@@ -691,7 +736,9 @@
|
|
#ifdef CONFIG_CIFS_STATS2
|
|
atomic_inc(&ses->server->inSend);
|
|
#endif
|
|
- rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length);
|
|
+ rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
|
|
+ (struct sockaddr *) &(ses->server->addr.sockAddr),
|
|
+ ses->server->noblocksnd);
|
|
#ifdef CONFIG_CIFS_STATS2
|
|
atomic_dec(&ses->server->inSend);
|
|
midQ->when_sent = jiffies;
|
|
@@ -832,7 +879,9 @@
|
|
mutex_unlock(&ses->server->srv_mutex);
|
|
return rc;
|
|
}
|
|
- rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length);
|
|
+ rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
|
|
+ (struct sockaddr *) &(ses->server->addr.sockAddr),
|
|
+ ses->server->noblocksnd);
|
|
mutex_unlock(&ses->server->srv_mutex);
|
|
return rc;
|
|
}
|
|
@@ -924,7 +973,9 @@
|
|
#ifdef CONFIG_CIFS_STATS2
|
|
atomic_inc(&ses->server->inSend);
|
|
#endif
|
|
- rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length);
|
|
+ rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
|
|
+ (struct sockaddr *) &(ses->server->addr.sockAddr),
|
|
+ ses->server->noblocksnd);
|
|
#ifdef CONFIG_CIFS_STATS2
|
|
atomic_dec(&ses->server->inSend);
|
|
midQ->when_sent = jiffies;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/compat.c linux-2.6.29-rc3.owrt/fs/compat.c
|
|
--- linux-2.6.29.owrt/fs/compat.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/compat.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1407,7 +1407,7 @@
|
|
bprm->cred = prepare_exec_creds();
|
|
if (!bprm->cred)
|
|
goto out_unlock;
|
|
- check_unsafe_exec(bprm, current->files);
|
|
+ check_unsafe_exec(bprm);
|
|
|
|
file = open_exec(filename);
|
|
retval = PTR_ERR(file);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/compat_ioctl.c linux-2.6.29-rc3.owrt/fs/compat_ioctl.c
|
|
--- linux-2.6.29.owrt/fs/compat_ioctl.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/compat_ioctl.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -538,7 +538,6 @@
|
|
* cannot be fixed without breaking all existing apps.
|
|
*/
|
|
case TUNSETIFF:
|
|
- case TUNGETIFF:
|
|
case SIOCGIFFLAGS:
|
|
case SIOCGIFMETRIC:
|
|
case SIOCGIFMTU:
|
|
@@ -785,7 +784,7 @@
|
|
|
|
if (copy_in_user(&sgio->status, &sgio32->status,
|
|
(4 * sizeof(unsigned char)) +
|
|
- (2 * sizeof(unsigned short)) +
|
|
+ (2 * sizeof(unsigned (short))) +
|
|
(3 * sizeof(int))))
|
|
return -EFAULT;
|
|
|
|
@@ -1913,9 +1912,6 @@
|
|
/* 0x00 */
|
|
COMPATIBLE_IOCTL(FIBMAP)
|
|
COMPATIBLE_IOCTL(FIGETBSZ)
|
|
-/* 'X' - originally XFS but some now in the VFS */
|
|
-COMPATIBLE_IOCTL(FIFREEZE)
|
|
-COMPATIBLE_IOCTL(FITHAW)
|
|
/* RAID */
|
|
COMPATIBLE_IOCTL(RAID_VERSION)
|
|
COMPATIBLE_IOCTL(GET_ARRAY_INFO)
|
|
@@ -1941,8 +1937,6 @@
|
|
/* Big K */
|
|
COMPATIBLE_IOCTL(PIO_FONT)
|
|
COMPATIBLE_IOCTL(GIO_FONT)
|
|
-COMPATIBLE_IOCTL(PIO_CMAP)
|
|
-COMPATIBLE_IOCTL(GIO_CMAP)
|
|
ULONG_IOCTL(KDSIGACCEPT)
|
|
COMPATIBLE_IOCTL(KDGETKEYCODE)
|
|
COMPATIBLE_IOCTL(KDSETKEYCODE)
|
|
@@ -1988,11 +1982,6 @@
|
|
COMPATIBLE_IOCTL(TUNSETDEBUG)
|
|
COMPATIBLE_IOCTL(TUNSETPERSIST)
|
|
COMPATIBLE_IOCTL(TUNSETOWNER)
|
|
-COMPATIBLE_IOCTL(TUNSETLINK)
|
|
-COMPATIBLE_IOCTL(TUNSETGROUP)
|
|
-COMPATIBLE_IOCTL(TUNGETFEATURES)
|
|
-COMPATIBLE_IOCTL(TUNSETOFFLOAD)
|
|
-COMPATIBLE_IOCTL(TUNSETTXFILTER)
|
|
/* Big V */
|
|
COMPATIBLE_IOCTL(VT_SETMODE)
|
|
COMPATIBLE_IOCTL(VT_GETMODE)
|
|
@@ -2584,7 +2573,6 @@
|
|
HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
|
|
HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
|
|
HANDLE_IOCTL(TUNSETIFF, dev_ifsioc)
|
|
-HANDLE_IOCTL(TUNGETIFF, dev_ifsioc)
|
|
HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl)
|
|
HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl)
|
|
HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/dcache.c linux-2.6.29-rc3.owrt/fs/dcache.c
|
|
--- linux-2.6.29.owrt/fs/dcache.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/dcache.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1180,7 +1180,7 @@
|
|
iput(inode);
|
|
return res;
|
|
}
|
|
-EXPORT_SYMBOL(d_obtain_alias);
|
|
+EXPORT_SYMBOL_GPL(d_obtain_alias);
|
|
|
|
/**
|
|
* d_splice_alias - splice a disconnected dentry into the tree if one exists
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/devpts/inode.c linux-2.6.29-rc3.owrt/fs/devpts/inode.c
|
|
--- linux-2.6.29.owrt/fs/devpts/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/devpts/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -198,6 +198,9 @@
|
|
|
|
fsi->ptmx_dentry = dentry;
|
|
rc = 0;
|
|
+
|
|
+ printk(KERN_DEBUG "Created ptmx node in devpts ino %lu\n",
|
|
+ inode->i_ino);
|
|
out:
|
|
mutex_unlock(&root->d_inode->i_mutex);
|
|
return rc;
|
|
@@ -366,6 +369,8 @@
|
|
struct pts_fs_info *fsi;
|
|
struct pts_mount_opts *opts;
|
|
|
|
+ printk(KERN_NOTICE "devpts: newinstance mount\n");
|
|
+
|
|
err = get_sb_nodev(fs_type, flags, data, devpts_fill_super, mnt);
|
|
if (err)
|
|
return err;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ecryptfs/crypto.c linux-2.6.29-rc3.owrt/fs/ecryptfs/crypto.c
|
|
--- linux-2.6.29.owrt/fs/ecryptfs/crypto.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ecryptfs/crypto.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -946,8 +946,6 @@
|
|
list_for_each_entry(global_auth_tok,
|
|
&mount_crypt_stat->global_auth_tok_list,
|
|
mount_crypt_stat_list) {
|
|
- if (global_auth_tok->flags & ECRYPTFS_AUTH_TOK_FNEK)
|
|
- continue;
|
|
rc = ecryptfs_add_keysig(crypt_stat, global_auth_tok->sig);
|
|
if (rc) {
|
|
printk(KERN_ERR "Error adding keysig; rc = [%d]\n", rc);
|
|
@@ -1324,13 +1322,14 @@
|
|
}
|
|
|
|
static int
|
|
-ecryptfs_write_metadata_to_contents(struct dentry *ecryptfs_dentry,
|
|
- char *virt, size_t virt_len)
|
|
+ecryptfs_write_metadata_to_contents(struct ecryptfs_crypt_stat *crypt_stat,
|
|
+ struct dentry *ecryptfs_dentry,
|
|
+ char *virt)
|
|
{
|
|
int rc;
|
|
|
|
rc = ecryptfs_write_lower(ecryptfs_dentry->d_inode, virt,
|
|
- 0, virt_len);
|
|
+ 0, crypt_stat->num_header_bytes_at_front);
|
|
if (rc)
|
|
printk(KERN_ERR "%s: Error attempting to write header "
|
|
"information to lower file; rc = [%d]\n", __func__,
|
|
@@ -1340,6 +1339,7 @@
|
|
|
|
static int
|
|
ecryptfs_write_metadata_to_xattr(struct dentry *ecryptfs_dentry,
|
|
+ struct ecryptfs_crypt_stat *crypt_stat,
|
|
char *page_virt, size_t size)
|
|
{
|
|
int rc;
|
|
@@ -1349,17 +1349,6 @@
|
|
return rc;
|
|
}
|
|
|
|
-static unsigned long ecryptfs_get_zeroed_pages(gfp_t gfp_mask,
|
|
- unsigned int order)
|
|
-{
|
|
- struct page *page;
|
|
-
|
|
- page = alloc_pages(gfp_mask | __GFP_ZERO, order);
|
|
- if (page)
|
|
- return (unsigned long) page_address(page);
|
|
- return 0;
|
|
-}
|
|
-
|
|
/**
|
|
* ecryptfs_write_metadata
|
|
* @ecryptfs_dentry: The eCryptfs dentry
|
|
@@ -1376,9 +1365,7 @@
|
|
{
|
|
struct ecryptfs_crypt_stat *crypt_stat =
|
|
&ecryptfs_inode_to_private(ecryptfs_dentry->d_inode)->crypt_stat;
|
|
- unsigned int order;
|
|
char *virt;
|
|
- size_t virt_len;
|
|
size_t size = 0;
|
|
int rc = 0;
|
|
|
|
@@ -1394,35 +1381,33 @@
|
|
rc = -EINVAL;
|
|
goto out;
|
|
}
|
|
- virt_len = crypt_stat->num_header_bytes_at_front;
|
|
- order = get_order(virt_len);
|
|
/* Released in this function */
|
|
- virt = (char *)ecryptfs_get_zeroed_pages(GFP_KERNEL, order);
|
|
+ virt = (char *)get_zeroed_page(GFP_KERNEL);
|
|
if (!virt) {
|
|
printk(KERN_ERR "%s: Out of memory\n", __func__);
|
|
rc = -ENOMEM;
|
|
goto out;
|
|
}
|
|
- rc = ecryptfs_write_headers_virt(virt, virt_len, &size, crypt_stat,
|
|
- ecryptfs_dentry);
|
|
+ rc = ecryptfs_write_headers_virt(virt, PAGE_CACHE_SIZE, &size,
|
|
+ crypt_stat, ecryptfs_dentry);
|
|
if (unlikely(rc)) {
|
|
printk(KERN_ERR "%s: Error whilst writing headers; rc = [%d]\n",
|
|
__func__, rc);
|
|
goto out_free;
|
|
}
|
|
if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
|
|
- rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry, virt,
|
|
- size);
|
|
+ rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry,
|
|
+ crypt_stat, virt, size);
|
|
else
|
|
- rc = ecryptfs_write_metadata_to_contents(ecryptfs_dentry, virt,
|
|
- virt_len);
|
|
+ rc = ecryptfs_write_metadata_to_contents(crypt_stat,
|
|
+ ecryptfs_dentry, virt);
|
|
if (rc) {
|
|
printk(KERN_ERR "%s: Error writing metadata out to lower file; "
|
|
"rc = [%d]\n", __func__, rc);
|
|
goto out_free;
|
|
}
|
|
out_free:
|
|
- free_pages((unsigned long)virt, order);
|
|
+ free_page((unsigned long)virt);
|
|
out:
|
|
return rc;
|
|
}
|
|
@@ -1731,7 +1716,7 @@
|
|
{
|
|
int rc = 0;
|
|
|
|
- (*copied_name) = kmalloc((name_size + 1), GFP_KERNEL);
|
|
+ (*copied_name) = kmalloc((name_size + 2), GFP_KERNEL);
|
|
if (!(*copied_name)) {
|
|
rc = -ENOMEM;
|
|
goto out;
|
|
@@ -1741,7 +1726,7 @@
|
|
* in printing out the
|
|
* string in debug
|
|
* messages */
|
|
- (*copied_name_size) = name_size;
|
|
+ (*copied_name_size) = (name_size + 1);
|
|
out:
|
|
return rc;
|
|
}
|
|
@@ -2221,19 +2206,17 @@
|
|
struct dentry *ecryptfs_dir_dentry,
|
|
const char *name, size_t name_size)
|
|
{
|
|
- struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
|
|
- &ecryptfs_superblock_to_private(
|
|
- ecryptfs_dir_dentry->d_sb)->mount_crypt_stat;
|
|
char *decoded_name;
|
|
size_t decoded_name_size;
|
|
size_t packet_size;
|
|
int rc = 0;
|
|
|
|
- if ((mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)
|
|
- && !(mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED)
|
|
- && (name_size > ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE)
|
|
+ if ((name_size > ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE)
|
|
&& (strncmp(name, ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX,
|
|
ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE) == 0)) {
|
|
+ struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
|
|
+ &ecryptfs_superblock_to_private(
|
|
+ ecryptfs_dir_dentry->d_sb)->mount_crypt_stat;
|
|
const char *orig_name = name;
|
|
size_t orig_name_size = name_size;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ecryptfs/ecryptfs_kernel.h linux-2.6.29-rc3.owrt/fs/ecryptfs/ecryptfs_kernel.h
|
|
--- linux-2.6.29.owrt/fs/ecryptfs/ecryptfs_kernel.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ecryptfs/ecryptfs_kernel.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -328,7 +328,6 @@
|
|
*/
|
|
struct ecryptfs_global_auth_tok {
|
|
#define ECRYPTFS_AUTH_TOK_INVALID 0x00000001
|
|
-#define ECRYPTFS_AUTH_TOK_FNEK 0x00000002
|
|
u32 flags;
|
|
struct list_head mount_crypt_stat_list;
|
|
struct key *global_auth_tok_key;
|
|
@@ -620,6 +619,7 @@
|
|
u32 flags);
|
|
int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
|
|
struct dentry *lower_dentry,
|
|
+ struct ecryptfs_crypt_stat *crypt_stat,
|
|
struct inode *ecryptfs_dir_inode,
|
|
struct nameidata *ecryptfs_nd);
|
|
int ecryptfs_decode_and_decrypt_filename(char **decrypted_name,
|
|
@@ -696,7 +696,7 @@
|
|
int ecryptfs_add_keysig(struct ecryptfs_crypt_stat *crypt_stat, char *sig);
|
|
int
|
|
ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
|
|
- char *sig, u32 global_auth_tok_flags);
|
|
+ char *sig);
|
|
int ecryptfs_get_global_auth_tok_for_sig(
|
|
struct ecryptfs_global_auth_tok **global_auth_tok,
|
|
struct ecryptfs_mount_crypt_stat *mount_crypt_stat, char *sig);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ecryptfs/inode.c linux-2.6.29-rc3.owrt/fs/ecryptfs/inode.c
|
|
--- linux-2.6.29.owrt/fs/ecryptfs/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ecryptfs/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -246,6 +246,7 @@
|
|
*/
|
|
int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
|
|
struct dentry *lower_dentry,
|
|
+ struct ecryptfs_crypt_stat *crypt_stat,
|
|
struct inode *ecryptfs_dir_inode,
|
|
struct nameidata *ecryptfs_nd)
|
|
{
|
|
@@ -253,7 +254,6 @@
|
|
struct vfsmount *lower_mnt;
|
|
struct inode *lower_inode;
|
|
struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
|
|
- struct ecryptfs_crypt_stat *crypt_stat;
|
|
char *page_virt = NULL;
|
|
u64 file_size;
|
|
int rc = 0;
|
|
@@ -314,11 +314,6 @@
|
|
goto out_free_kmem;
|
|
}
|
|
}
|
|
- crypt_stat = &ecryptfs_inode_to_private(
|
|
- ecryptfs_dentry->d_inode)->crypt_stat;
|
|
- /* TODO: lock for crypt_stat comparison */
|
|
- if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED))
|
|
- ecryptfs_set_default_sizes(crypt_stat);
|
|
rc = ecryptfs_read_and_validate_header_region(page_virt,
|
|
ecryptfs_dentry->d_inode);
|
|
if (rc) {
|
|
@@ -367,7 +362,9 @@
|
|
{
|
|
char *encrypted_and_encoded_name = NULL;
|
|
size_t encrypted_and_encoded_name_size;
|
|
+ struct ecryptfs_crypt_stat *crypt_stat = NULL;
|
|
struct ecryptfs_mount_crypt_stat *mount_crypt_stat = NULL;
|
|
+ struct ecryptfs_inode_info *inode_info;
|
|
struct dentry *lower_dir_dentry, *lower_dentry;
|
|
int rc = 0;
|
|
|
|
@@ -391,15 +388,26 @@
|
|
}
|
|
if (lower_dentry->d_inode)
|
|
goto lookup_and_interpose;
|
|
- mount_crypt_stat = &ecryptfs_superblock_to_private(
|
|
- ecryptfs_dentry->d_sb)->mount_crypt_stat;
|
|
- if (!(mount_crypt_stat
|
|
- && (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)))
|
|
+ inode_info = ecryptfs_inode_to_private(ecryptfs_dentry->d_inode);
|
|
+ if (inode_info) {
|
|
+ crypt_stat = &inode_info->crypt_stat;
|
|
+ /* TODO: lock for crypt_stat comparison */
|
|
+ if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED))
|
|
+ ecryptfs_set_default_sizes(crypt_stat);
|
|
+ }
|
|
+ if (crypt_stat)
|
|
+ mount_crypt_stat = crypt_stat->mount_crypt_stat;
|
|
+ else
|
|
+ mount_crypt_stat = &ecryptfs_superblock_to_private(
|
|
+ ecryptfs_dentry->d_sb)->mount_crypt_stat;
|
|
+ if (!(crypt_stat && (crypt_stat->flags & ECRYPTFS_ENCRYPT_FILENAMES))
|
|
+ && !(mount_crypt_stat && (mount_crypt_stat->flags
|
|
+ & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)))
|
|
goto lookup_and_interpose;
|
|
dput(lower_dentry);
|
|
rc = ecryptfs_encrypt_and_encode_filename(
|
|
&encrypted_and_encoded_name, &encrypted_and_encoded_name_size,
|
|
- NULL, mount_crypt_stat, ecryptfs_dentry->d_name.name,
|
|
+ crypt_stat, mount_crypt_stat, ecryptfs_dentry->d_name.name,
|
|
ecryptfs_dentry->d_name.len);
|
|
if (rc) {
|
|
printk(KERN_ERR "%s: Error attempting to encrypt and encode "
|
|
@@ -418,7 +426,7 @@
|
|
}
|
|
lookup_and_interpose:
|
|
rc = ecryptfs_lookup_and_interpose_lower(ecryptfs_dentry, lower_dentry,
|
|
- ecryptfs_dir_inode,
|
|
+ crypt_stat, ecryptfs_dir_inode,
|
|
ecryptfs_nd);
|
|
goto out;
|
|
out_d_drop:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ecryptfs/keystore.c linux-2.6.29-rc3.owrt/fs/ecryptfs/keystore.c
|
|
--- linux-2.6.29.owrt/fs/ecryptfs/keystore.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ecryptfs/keystore.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2375,7 +2375,7 @@
|
|
|
|
int
|
|
ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
|
|
- char *sig, u32 global_auth_tok_flags)
|
|
+ char *sig)
|
|
{
|
|
struct ecryptfs_global_auth_tok *new_auth_tok;
|
|
int rc = 0;
|
|
@@ -2389,7 +2389,6 @@
|
|
goto out;
|
|
}
|
|
memcpy(new_auth_tok->sig, sig, ECRYPTFS_SIG_SIZE_HEX);
|
|
- new_auth_tok->flags = global_auth_tok_flags;
|
|
new_auth_tok->sig[ECRYPTFS_SIG_SIZE_HEX] = '\0';
|
|
mutex_lock(&mount_crypt_stat->global_auth_tok_list_mutex);
|
|
list_add(&new_auth_tok->mount_crypt_stat_list,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ecryptfs/main.c linux-2.6.29-rc3.owrt/fs/ecryptfs/main.c
|
|
--- linux-2.6.29.owrt/fs/ecryptfs/main.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ecryptfs/main.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -319,7 +319,7 @@
|
|
case ecryptfs_opt_ecryptfs_sig:
|
|
sig_src = args[0].from;
|
|
rc = ecryptfs_add_global_auth_tok(mount_crypt_stat,
|
|
- sig_src, 0);
|
|
+ sig_src);
|
|
if (rc) {
|
|
printk(KERN_ERR "Error attempting to register "
|
|
"global sig; rc = [%d]\n", rc);
|
|
@@ -370,8 +370,7 @@
|
|
ECRYPTFS_SIG_SIZE_HEX] = '\0';
|
|
rc = ecryptfs_add_global_auth_tok(
|
|
mount_crypt_stat,
|
|
- mount_crypt_stat->global_default_fnek_sig,
|
|
- ECRYPTFS_AUTH_TOK_FNEK);
|
|
+ mount_crypt_stat->global_default_fnek_sig);
|
|
if (rc) {
|
|
printk(KERN_ERR "Error attempting to register "
|
|
"global fnek sig [%s]; rc = [%d]\n",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/eventpoll.c linux-2.6.29-rc3.owrt/fs/eventpoll.c
|
|
--- linux-2.6.29.owrt/fs/eventpoll.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/eventpoll.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -234,6 +234,8 @@
|
|
/*
|
|
* Configuration options available inside /proc/sys/fs/epoll/
|
|
*/
|
|
+/* Maximum number of epoll devices, per user */
|
|
+static int max_user_instances __read_mostly;
|
|
/* Maximum number of epoll watched descriptors, per user */
|
|
static int max_user_watches __read_mostly;
|
|
|
|
@@ -259,6 +261,14 @@
|
|
|
|
ctl_table epoll_table[] = {
|
|
{
|
|
+ .procname = "max_user_instances",
|
|
+ .data = &max_user_instances,
|
|
+ .maxlen = sizeof(int),
|
|
+ .mode = 0644,
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .extra1 = &zero,
|
|
+ },
|
|
+ {
|
|
.procname = "max_user_watches",
|
|
.data = &max_user_watches,
|
|
.maxlen = sizeof(int),
|
|
@@ -481,6 +491,7 @@
|
|
|
|
mutex_unlock(&epmutex);
|
|
mutex_destroy(&ep->mtx);
|
|
+ atomic_dec(&ep->user->epoll_devs);
|
|
free_uid(ep->user);
|
|
kfree(ep);
|
|
}
|
|
@@ -570,6 +581,10 @@
|
|
struct eventpoll *ep;
|
|
|
|
user = get_current_user();
|
|
+ error = -EMFILE;
|
|
+ if (unlikely(atomic_read(&user->epoll_devs) >=
|
|
+ max_user_instances))
|
|
+ goto free_uid;
|
|
error = -ENOMEM;
|
|
ep = kzalloc(sizeof(*ep), GFP_KERNEL);
|
|
if (unlikely(!ep))
|
|
@@ -1126,6 +1141,7 @@
|
|
flags & O_CLOEXEC);
|
|
if (fd < 0)
|
|
ep_free(ep);
|
|
+ atomic_inc(&ep->user->epoll_devs);
|
|
|
|
error_return:
|
|
DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d) = %d\n",
|
|
@@ -1350,10 +1366,8 @@
|
|
struct sysinfo si;
|
|
|
|
si_meminfo(&si);
|
|
- /*
|
|
- * Allows top 4% of lomem to be allocated for epoll watches (per user).
|
|
- */
|
|
- max_user_watches = (((si.totalram - si.totalhigh) / 25) << PAGE_SHIFT) /
|
|
+ max_user_instances = 128;
|
|
+ max_user_watches = (((si.totalram - si.totalhigh) / 32) << PAGE_SHIFT) /
|
|
EP_ITEM_COST;
|
|
|
|
/* Initialize the structure used to perform safe poll wait head wake ups */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/exec.c linux-2.6.29-rc3.owrt/fs/exec.c
|
|
--- linux-2.6.29.owrt/fs/exec.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/exec.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1049,32 +1049,16 @@
|
|
* - the caller must hold current->cred_exec_mutex to protect against
|
|
* PTRACE_ATTACH
|
|
*/
|
|
-void check_unsafe_exec(struct linux_binprm *bprm, struct files_struct *files)
|
|
+void check_unsafe_exec(struct linux_binprm *bprm)
|
|
{
|
|
- struct task_struct *p = current, *t;
|
|
- unsigned long flags;
|
|
- unsigned n_fs, n_files, n_sighand;
|
|
+ struct task_struct *p = current;
|
|
|
|
bprm->unsafe = tracehook_unsafe_exec(p);
|
|
|
|
- n_fs = 1;
|
|
- n_files = 1;
|
|
- n_sighand = 1;
|
|
- lock_task_sighand(p, &flags);
|
|
- for (t = next_thread(p); t != p; t = next_thread(t)) {
|
|
- if (t->fs == p->fs)
|
|
- n_fs++;
|
|
- if (t->files == files)
|
|
- n_files++;
|
|
- n_sighand++;
|
|
- }
|
|
-
|
|
- if (atomic_read(&p->fs->count) > n_fs ||
|
|
- atomic_read(&p->files->count) > n_files ||
|
|
- atomic_read(&p->sighand->count) > n_sighand)
|
|
+ if (atomic_read(&p->fs->count) > 1 ||
|
|
+ atomic_read(&p->files->count) > 1 ||
|
|
+ atomic_read(&p->sighand->count) > 1)
|
|
bprm->unsafe |= LSM_UNSAFE_SHARE;
|
|
-
|
|
- unlock_task_sighand(p, &flags);
|
|
}
|
|
|
|
/*
|
|
@@ -1289,7 +1273,7 @@
|
|
bprm->cred = prepare_exec_creds();
|
|
if (!bprm->cred)
|
|
goto out_unlock;
|
|
- check_unsafe_exec(bprm, displaced);
|
|
+ check_unsafe_exec(bprm);
|
|
|
|
file = open_exec(filename);
|
|
retval = PTR_ERR(file);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext2/super.c linux-2.6.29-rc3.owrt/fs/ext2/super.c
|
|
--- linux-2.6.29.owrt/fs/ext2/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext2/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1185,12 +1185,9 @@
|
|
es = sbi->s_es;
|
|
if (((sbi->s_mount_opt & EXT2_MOUNT_XIP) !=
|
|
(old_mount_opt & EXT2_MOUNT_XIP)) &&
|
|
- invalidate_inodes(sb)) {
|
|
- ext2_warning(sb, __func__, "refusing change of xip flag "
|
|
- "with busy inodes while remounting");
|
|
- sbi->s_mount_opt &= ~EXT2_MOUNT_XIP;
|
|
- sbi->s_mount_opt |= old_mount_opt & EXT2_MOUNT_XIP;
|
|
- }
|
|
+ invalidate_inodes(sb))
|
|
+ ext2_warning(sb, __func__, "busy inodes while remounting "\
|
|
+ "xip remain in cache (no functional problem)");
|
|
if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
|
|
return 0;
|
|
if (*flags & MS_RDONLY) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext3/namei.c linux-2.6.29-rc3.owrt/fs/ext3/namei.c
|
|
--- linux-2.6.29.owrt/fs/ext3/namei.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext3/namei.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1358,7 +1358,7 @@
|
|
struct fake_dirent *fde;
|
|
|
|
blocksize = dir->i_sb->s_blocksize;
|
|
- dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
|
|
+ dxtrace(printk("Creating index\n"));
|
|
retval = ext3_journal_get_write_access(handle, bh);
|
|
if (retval) {
|
|
ext3_std_error(dir->i_sb, retval);
|
|
@@ -1367,19 +1367,6 @@
|
|
}
|
|
root = (struct dx_root *) bh->b_data;
|
|
|
|
- /* The 0th block becomes the root, move the dirents out */
|
|
- fde = &root->dotdot;
|
|
- de = (struct ext3_dir_entry_2 *)((char *)fde +
|
|
- ext3_rec_len_from_disk(fde->rec_len));
|
|
- if ((char *) de >= (((char *) root) + blocksize)) {
|
|
- ext3_error(dir->i_sb, __func__,
|
|
- "invalid rec_len for '..' in inode %lu",
|
|
- dir->i_ino);
|
|
- brelse(bh);
|
|
- return -EIO;
|
|
- }
|
|
- len = ((char *) root) + blocksize - (char *) de;
|
|
-
|
|
bh2 = ext3_append (handle, dir, &block, &retval);
|
|
if (!(bh2)) {
|
|
brelse(bh);
|
|
@@ -1388,6 +1375,11 @@
|
|
EXT3_I(dir)->i_flags |= EXT3_INDEX_FL;
|
|
data1 = bh2->b_data;
|
|
|
|
+ /* The 0th block becomes the root, move the dirents out */
|
|
+ fde = &root->dotdot;
|
|
+ de = (struct ext3_dir_entry_2 *)((char *)fde +
|
|
+ ext3_rec_len_from_disk(fde->rec_len));
|
|
+ len = ((char *) root) + blocksize - (char *) de;
|
|
memcpy (data1, de, len);
|
|
de = (struct ext3_dir_entry_2 *) data1;
|
|
top = data1 + len;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext3/super.c linux-2.6.29-rc3.owrt/fs/ext3/super.c
|
|
--- linux-2.6.29.owrt/fs/ext3/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext3/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2428,13 +2428,12 @@
|
|
|
|
static int ext3_sync_fs(struct super_block *sb, int wait)
|
|
{
|
|
- tid_t target;
|
|
-
|
|
sb->s_dirt = 0;
|
|
- if (journal_start_commit(EXT3_SB(sb)->s_journal, &target)) {
|
|
- if (wait)
|
|
- log_wait_commit(EXT3_SB(sb)->s_journal, target);
|
|
- }
|
|
+ if (wait)
|
|
+ ext3_force_commit(sb);
|
|
+ else
|
|
+ journal_start_commit(EXT3_SB(sb)->s_journal, NULL);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/balloc.c linux-2.6.29-rc3.owrt/fs/ext4/balloc.c
|
|
--- linux-2.6.29.owrt/fs/ext4/balloc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/balloc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -609,9 +609,7 @@
|
|
*/
|
|
int ext4_should_retry_alloc(struct super_block *sb, int *retries)
|
|
{
|
|
- if (!ext4_has_free_blocks(EXT4_SB(sb), 1) ||
|
|
- (*retries)++ > 3 ||
|
|
- !EXT4_SB(sb)->s_journal)
|
|
+ if (!ext4_has_free_blocks(EXT4_SB(sb), 1) || (*retries)++ > 3)
|
|
return 0;
|
|
|
|
jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id);
|
|
@@ -686,15 +684,15 @@
|
|
gdp = ext4_get_group_desc(sb, i, NULL);
|
|
if (!gdp)
|
|
continue;
|
|
- desc_count += ext4_free_blks_count(sb, gdp);
|
|
+ desc_count += le16_to_cpu(gdp->bg_free_blocks_count);
|
|
brelse(bitmap_bh);
|
|
bitmap_bh = ext4_read_block_bitmap(sb, i);
|
|
if (bitmap_bh == NULL)
|
|
continue;
|
|
|
|
x = ext4_count_free(bitmap_bh, sb->s_blocksize);
|
|
- printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n",
|
|
- i, ext4_free_blks_count(sb, gdp), x);
|
|
+ printk(KERN_DEBUG "group %lu: stored = %d, counted = %u\n",
|
|
+ i, le16_to_cpu(gdp->bg_free_blocks_count), x);
|
|
bitmap_count += x;
|
|
}
|
|
brelse(bitmap_bh);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/ext4.h linux-2.6.29-rc3.owrt/fs/ext4/ext4.h
|
|
--- linux-2.6.29.owrt/fs/ext4/ext4.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/ext4.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -868,7 +868,7 @@
|
|
{
|
|
unsigned len = le16_to_cpu(dlen);
|
|
|
|
- if (len == EXT4_MAX_REC_LEN || len == 0)
|
|
+ if (len == EXT4_MAX_REC_LEN)
|
|
return 1 << 16;
|
|
return len;
|
|
}
|
|
@@ -1206,11 +1206,8 @@
|
|
|
|
static inline loff_t ext4_isize(struct ext4_inode *raw_inode)
|
|
{
|
|
- if (S_ISREG(le16_to_cpu(raw_inode->i_mode)))
|
|
- return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
|
|
- le32_to_cpu(raw_inode->i_size_lo);
|
|
- else
|
|
- return (loff_t) le32_to_cpu(raw_inode->i_size_lo);
|
|
+ return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
|
|
+ le32_to_cpu(raw_inode->i_size_lo);
|
|
}
|
|
|
|
static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/extents.c linux-2.6.29-rc3.owrt/fs/ext4/extents.c
|
|
--- linux-2.6.29.owrt/fs/ext4/extents.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/extents.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1122,8 +1122,7 @@
|
|
struct ext4_extent_idx *ix;
|
|
struct ext4_extent *ex;
|
|
ext4_fsblk_t block;
|
|
- int depth; /* Note, NOT eh_depth; depth from top of tree */
|
|
- int ee_len;
|
|
+ int depth, ee_len;
|
|
|
|
BUG_ON(path == NULL);
|
|
depth = path->p_depth;
|
|
@@ -1180,8 +1179,7 @@
|
|
if (bh == NULL)
|
|
return -EIO;
|
|
eh = ext_block_hdr(bh);
|
|
- /* subtract from p_depth to get proper eh_depth */
|
|
- if (ext4_ext_check_header(inode, eh, path->p_depth - depth)) {
|
|
+ if (ext4_ext_check_header(inode, eh, depth)) {
|
|
put_bh(bh);
|
|
return -EIO;
|
|
}
|
|
@@ -3050,7 +3048,7 @@
|
|
WARN_ON(ret <= 0);
|
|
printk(KERN_ERR "%s: ext4_ext_get_blocks "
|
|
"returned error inode#%lu, block=%u, "
|
|
- "max_blocks=%u", __func__,
|
|
+ "max_blocks=%lu", __func__,
|
|
inode->i_ino, block, max_blocks);
|
|
#endif
|
|
ext4_mark_inode_dirty(handle, inode);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/ialloc.c linux-2.6.29-rc3.owrt/fs/ext4/ialloc.c
|
|
--- linux-2.6.29.owrt/fs/ext4/ialloc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/ialloc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -188,7 +188,7 @@
|
|
struct ext4_group_desc *gdp;
|
|
struct ext4_super_block *es;
|
|
struct ext4_sb_info *sbi;
|
|
- int fatal = 0, err, count, cleared;
|
|
+ int fatal = 0, err, count;
|
|
ext4_group_t flex_group;
|
|
|
|
if (atomic_read(&inode->i_count) > 1) {
|
|
@@ -248,10 +248,8 @@
|
|
goto error_return;
|
|
|
|
/* Ok, now we can actually update the inode bitmaps.. */
|
|
- spin_lock(sb_bgl_lock(sbi, block_group));
|
|
- cleared = ext4_clear_bit(bit, bitmap_bh->b_data);
|
|
- spin_unlock(sb_bgl_lock(sbi, block_group));
|
|
- if (!cleared)
|
|
+ if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
|
|
+ bit, bitmap_bh->b_data))
|
|
ext4_error(sb, "ext4_free_inode",
|
|
"bit already cleared for inode %lu", ino);
|
|
else {
|
|
@@ -698,7 +696,6 @@
|
|
struct inode *ret;
|
|
ext4_group_t i;
|
|
int free = 0;
|
|
- static int once = 1;
|
|
ext4_group_t flex_group;
|
|
|
|
/* Cannot create files in a deleted directory */
|
|
@@ -718,14 +715,6 @@
|
|
|
|
if (sbi->s_log_groups_per_flex) {
|
|
ret2 = find_group_flex(sb, dir, &group);
|
|
- if (ret2 == -1) {
|
|
- ret2 = find_group_other(sb, dir, &group);
|
|
- if (ret2 == 0 && once)
|
|
- once = 0;
|
|
- printk(KERN_NOTICE "ext4: find_group_flex "
|
|
- "failed, fallback succeeded dir %lu\n",
|
|
- dir->i_ino);
|
|
- }
|
|
goto got_group;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/inode.c linux-2.6.29-rc3.owrt/fs/ext4/inode.c
|
|
--- linux-2.6.29.owrt/fs/ext4/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -47,10 +47,8 @@
|
|
static inline int ext4_begin_ordered_truncate(struct inode *inode,
|
|
loff_t new_size)
|
|
{
|
|
- return jbd2_journal_begin_ordered_truncate(
|
|
- EXT4_SB(inode->i_sb)->s_journal,
|
|
- &EXT4_I(inode)->jinode,
|
|
- new_size);
|
|
+ return jbd2_journal_begin_ordered_truncate(&EXT4_I(inode)->jinode,
|
|
+ new_size);
|
|
}
|
|
|
|
static void ext4_invalidatepage(struct page *page, unsigned long offset);
|
|
@@ -362,9 +360,9 @@
|
|
final = ptrs;
|
|
} else {
|
|
ext4_warning(inode->i_sb, "ext4_block_to_path",
|
|
- "block %lu > max in inode %lu",
|
|
+ "block %lu > max",
|
|
i_block + direct_blocks +
|
|
- indirect_blocks + double_blocks, inode->i_ino);
|
|
+ indirect_blocks + double_blocks);
|
|
}
|
|
if (boundary)
|
|
*boundary = final - 1 - (i_block & (ptrs - 1));
|
|
@@ -1368,10 +1366,6 @@
|
|
goto out;
|
|
}
|
|
|
|
- /* We cannot recurse into the filesystem as the transaction is already
|
|
- * started */
|
|
- flags |= AOP_FLAG_NOFS;
|
|
-
|
|
page = grab_cache_page_write_begin(mapping, index, flags);
|
|
if (!page) {
|
|
ext4_journal_stop(handle);
|
|
@@ -1381,7 +1375,7 @@
|
|
*pagep = page;
|
|
|
|
ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
|
|
- ext4_get_block);
|
|
+ ext4_get_block);
|
|
|
|
if (!ret && ext4_should_journal_data(inode)) {
|
|
ret = walk_page_buffers(handle, page_buffers(page),
|
|
@@ -2443,7 +2437,6 @@
|
|
int no_nrwrite_index_update;
|
|
int pages_written = 0;
|
|
long pages_skipped;
|
|
- int range_cyclic, cycled = 1, io_done = 0;
|
|
int needed_blocks, ret = 0, nr_to_writebump = 0;
|
|
struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb);
|
|
|
|
@@ -2495,15 +2488,9 @@
|
|
if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
|
|
range_whole = 1;
|
|
|
|
- range_cyclic = wbc->range_cyclic;
|
|
- if (wbc->range_cyclic) {
|
|
+ if (wbc->range_cyclic)
|
|
index = mapping->writeback_index;
|
|
- if (index)
|
|
- cycled = 0;
|
|
- wbc->range_start = index << PAGE_CACHE_SHIFT;
|
|
- wbc->range_end = LLONG_MAX;
|
|
- wbc->range_cyclic = 0;
|
|
- } else
|
|
+ else
|
|
index = wbc->range_start >> PAGE_CACHE_SHIFT;
|
|
|
|
mpd.wbc = wbc;
|
|
@@ -2517,7 +2504,6 @@
|
|
wbc->no_nrwrite_index_update = 1;
|
|
pages_skipped = wbc->pages_skipped;
|
|
|
|
-retry:
|
|
while (!ret && wbc->nr_to_write > 0) {
|
|
|
|
/*
|
|
@@ -2544,7 +2530,7 @@
|
|
|
|
ext4_journal_stop(handle);
|
|
|
|
- if ((mpd.retval == -ENOSPC) && sbi->s_journal) {
|
|
+ if (mpd.retval == -ENOSPC) {
|
|
/* commit the transaction which would
|
|
* free blocks released in the transaction
|
|
* and try again
|
|
@@ -2560,7 +2546,6 @@
|
|
pages_written += mpd.pages_written;
|
|
wbc->pages_skipped = pages_skipped;
|
|
ret = 0;
|
|
- io_done = 1;
|
|
} else if (wbc->nr_to_write)
|
|
/*
|
|
* There is no more writeout needed
|
|
@@ -2569,13 +2554,6 @@
|
|
*/
|
|
break;
|
|
}
|
|
- if (!io_done && !cycled) {
|
|
- cycled = 1;
|
|
- index = 0;
|
|
- wbc->range_start = index << PAGE_CACHE_SHIFT;
|
|
- wbc->range_end = mapping->writeback_index - 1;
|
|
- goto retry;
|
|
- }
|
|
if (pages_skipped != wbc->pages_skipped)
|
|
printk(KERN_EMERG "This should not happen leaving %s "
|
|
"with nr_to_write = %ld ret = %d\n",
|
|
@@ -2583,7 +2561,6 @@
|
|
|
|
/* Update index */
|
|
index += pages_written;
|
|
- wbc->range_cyclic = range_cyclic;
|
|
if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
|
|
/*
|
|
* set the writeback_index so that range_cyclic
|
|
@@ -2671,9 +2648,6 @@
|
|
ret = PTR_ERR(handle);
|
|
goto out;
|
|
}
|
|
- /* We cannot recurse into the filesystem as the transaction is already
|
|
- * started */
|
|
- flags |= AOP_FLAG_NOFS;
|
|
|
|
page = grab_cache_page_write_begin(mapping, index, flags);
|
|
if (!page) {
|
|
@@ -2847,6 +2821,9 @@
|
|
filemap_write_and_wait(mapping);
|
|
}
|
|
|
|
+ BUG_ON(!EXT4_JOURNAL(inode) &&
|
|
+ EXT4_I(inode)->i_state & EXT4_STATE_JDATA);
|
|
+
|
|
if (EXT4_JOURNAL(inode) && EXT4_I(inode)->i_state & EXT4_STATE_JDATA) {
|
|
/*
|
|
* This is a REALLY heavyweight approach, but the use of
|
|
@@ -3645,7 +3622,7 @@
|
|
* block pointed to itself, it would have been detached when
|
|
* the block was cleared. Check for this instead of OOPSing.
|
|
*/
|
|
- if ((EXT4_JOURNAL(inode) == NULL) || bh2jh(this_bh))
|
|
+ if (bh2jh(this_bh))
|
|
ext4_handle_dirty_metadata(handle, inode, this_bh);
|
|
else
|
|
ext4_error(inode->i_sb, __func__,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/mballoc.c linux-2.6.29-rc3.owrt/fs/ext4/mballoc.c
|
|
--- linux-2.6.29.owrt/fs/ext4/mballoc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/mballoc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1447,7 +1447,7 @@
|
|
struct ext4_free_extent *gex = &ac->ac_g_ex;
|
|
|
|
BUG_ON(ex->fe_len <= 0);
|
|
- BUG_ON(ex->fe_len > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
|
|
+ BUG_ON(ex->fe_len >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
|
|
BUG_ON(ex->fe_start >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
|
|
BUG_ON(ac->ac_status != AC_STATUS_CONTINUE);
|
|
|
|
@@ -3025,7 +3025,7 @@
|
|
goto out_err;
|
|
|
|
ext4_debug("using block group %u(%d)\n", ac->ac_b_ex.fe_group,
|
|
- ext4_free_blks_count(sb, gdp));
|
|
+ gdp->bg_free_blocks_count);
|
|
|
|
err = ext4_journal_get_write_access(handle, gdp_bh);
|
|
if (err)
|
|
@@ -3292,7 +3292,7 @@
|
|
}
|
|
BUG_ON(start + size <= ac->ac_o_ex.fe_logical &&
|
|
start > ac->ac_o_ex.fe_logical);
|
|
- BUG_ON(size <= 0 || size > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
|
|
+ BUG_ON(size <= 0 || size >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
|
|
|
|
/* now prepare goal request */
|
|
|
|
@@ -3589,7 +3589,6 @@
|
|
struct super_block *sb, struct ext4_prealloc_space *pa)
|
|
{
|
|
ext4_group_t grp;
|
|
- ext4_fsblk_t grp_blk;
|
|
|
|
if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0)
|
|
return;
|
|
@@ -3604,12 +3603,8 @@
|
|
pa->pa_deleted = 1;
|
|
spin_unlock(&pa->pa_lock);
|
|
|
|
- grp_blk = pa->pa_pstart;
|
|
- /* If linear, pa_pstart may be in the next group when pa is used up */
|
|
- if (pa->pa_linear)
|
|
- grp_blk--;
|
|
-
|
|
- ext4_get_group_no_and_offset(sb, grp_blk, &grp, NULL);
|
|
+ /* -1 is to protect from crossing allocation group */
|
|
+ ext4_get_group_no_and_offset(sb, pa->pa_pstart - 1, &grp, NULL);
|
|
|
|
/*
|
|
* possible race:
|
|
@@ -3698,8 +3693,6 @@
|
|
pa->pa_free = pa->pa_len;
|
|
atomic_set(&pa->pa_count, 1);
|
|
spin_lock_init(&pa->pa_lock);
|
|
- INIT_LIST_HEAD(&pa->pa_inode_list);
|
|
- INIT_LIST_HEAD(&pa->pa_group_list);
|
|
pa->pa_deleted = 0;
|
|
pa->pa_linear = 0;
|
|
|
|
@@ -3762,7 +3755,6 @@
|
|
atomic_set(&pa->pa_count, 1);
|
|
spin_lock_init(&pa->pa_lock);
|
|
INIT_LIST_HEAD(&pa->pa_inode_list);
|
|
- INIT_LIST_HEAD(&pa->pa_group_list);
|
|
pa->pa_deleted = 0;
|
|
pa->pa_linear = 1;
|
|
|
|
@@ -4484,26 +4476,23 @@
|
|
pa->pa_free -= ac->ac_b_ex.fe_len;
|
|
pa->pa_len -= ac->ac_b_ex.fe_len;
|
|
spin_unlock(&pa->pa_lock);
|
|
+ /*
|
|
+ * We want to add the pa to the right bucket.
|
|
+ * Remove it from the list and while adding
|
|
+ * make sure the list to which we are adding
|
|
+ * doesn't grow big.
|
|
+ */
|
|
+ if (likely(pa->pa_free)) {
|
|
+ spin_lock(pa->pa_obj_lock);
|
|
+ list_del_rcu(&pa->pa_inode_list);
|
|
+ spin_unlock(pa->pa_obj_lock);
|
|
+ ext4_mb_add_n_trim(ac);
|
|
+ }
|
|
}
|
|
+ ext4_mb_put_pa(ac, ac->ac_sb, pa);
|
|
}
|
|
if (ac->alloc_semp)
|
|
up_read(ac->alloc_semp);
|
|
- if (pa) {
|
|
- /*
|
|
- * We want to add the pa to the right bucket.
|
|
- * Remove it from the list and while adding
|
|
- * make sure the list to which we are adding
|
|
- * doesn't grow big. We need to release
|
|
- * alloc_semp before calling ext4_mb_add_n_trim()
|
|
- */
|
|
- if (pa->pa_linear && likely(pa->pa_free)) {
|
|
- spin_lock(pa->pa_obj_lock);
|
|
- list_del_rcu(&pa->pa_inode_list);
|
|
- spin_unlock(pa->pa_obj_lock);
|
|
- ext4_mb_add_n_trim(ac);
|
|
- }
|
|
- ext4_mb_put_pa(ac, ac->ac_sb, pa);
|
|
- }
|
|
if (ac->ac_bitmap_page)
|
|
page_cache_release(ac->ac_bitmap_page);
|
|
if (ac->ac_buddy_page)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/migrate.c linux-2.6.29-rc3.owrt/fs/ext4/migrate.c
|
|
--- linux-2.6.29.owrt/fs/ext4/migrate.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/migrate.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -481,7 +481,7 @@
|
|
+ 1);
|
|
if (IS_ERR(handle)) {
|
|
retval = PTR_ERR(handle);
|
|
- return retval;
|
|
+ goto err_out;
|
|
}
|
|
tmp_inode = ext4_new_inode(handle,
|
|
inode->i_sb->s_root->d_inode,
|
|
@@ -489,7 +489,8 @@
|
|
if (IS_ERR(tmp_inode)) {
|
|
retval = -ENOMEM;
|
|
ext4_journal_stop(handle);
|
|
- return retval;
|
|
+ tmp_inode = NULL;
|
|
+ goto err_out;
|
|
}
|
|
i_size_write(tmp_inode, i_size_read(inode));
|
|
/*
|
|
@@ -617,7 +618,8 @@
|
|
|
|
ext4_journal_stop(handle);
|
|
|
|
- iput(tmp_inode);
|
|
+ if (tmp_inode)
|
|
+ iput(tmp_inode);
|
|
|
|
return retval;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/namei.c linux-2.6.29-rc3.owrt/fs/ext4/namei.c
|
|
--- linux-2.6.29.owrt/fs/ext4/namei.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/namei.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1368,7 +1368,7 @@
|
|
struct fake_dirent *fde;
|
|
|
|
blocksize = dir->i_sb->s_blocksize;
|
|
- dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
|
|
+ dxtrace(printk(KERN_DEBUG "Creating index\n"));
|
|
retval = ext4_journal_get_write_access(handle, bh);
|
|
if (retval) {
|
|
ext4_std_error(dir->i_sb, retval);
|
|
@@ -1377,20 +1377,6 @@
|
|
}
|
|
root = (struct dx_root *) bh->b_data;
|
|
|
|
- /* The 0th block becomes the root, move the dirents out */
|
|
- fde = &root->dotdot;
|
|
- de = (struct ext4_dir_entry_2 *)((char *)fde +
|
|
- ext4_rec_len_from_disk(fde->rec_len));
|
|
- if ((char *) de >= (((char *) root) + blocksize)) {
|
|
- ext4_error(dir->i_sb, __func__,
|
|
- "invalid rec_len for '..' in inode %lu",
|
|
- dir->i_ino);
|
|
- brelse(bh);
|
|
- return -EIO;
|
|
- }
|
|
- len = ((char *) root) + blocksize - (char *) de;
|
|
-
|
|
- /* Allocate new block for the 0th block's dirents */
|
|
bh2 = ext4_append(handle, dir, &block, &retval);
|
|
if (!(bh2)) {
|
|
brelse(bh);
|
|
@@ -1399,6 +1385,11 @@
|
|
EXT4_I(dir)->i_flags |= EXT4_INDEX_FL;
|
|
data1 = bh2->b_data;
|
|
|
|
+ /* The 0th block becomes the root, move the dirents out */
|
|
+ fde = &root->dotdot;
|
|
+ de = (struct ext4_dir_entry_2 *)((char *)fde +
|
|
+ ext4_rec_len_from_disk(fde->rec_len));
|
|
+ len = ((char *) root) + blocksize - (char *) de;
|
|
memcpy (data1, de, len);
|
|
de = (struct ext4_dir_entry_2 *) data1;
|
|
top = data1 + len;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/resize.c linux-2.6.29-rc3.owrt/fs/ext4/resize.c
|
|
--- linux-2.6.29.owrt/fs/ext4/resize.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/resize.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -861,13 +861,12 @@
|
|
gdp = (struct ext4_group_desc *)((char *)primary->b_data +
|
|
gdb_off * EXT4_DESC_SIZE(sb));
|
|
|
|
- memset(gdp, 0, EXT4_DESC_SIZE(sb));
|
|
ext4_block_bitmap_set(sb, gdp, input->block_bitmap); /* LV FIXME */
|
|
ext4_inode_bitmap_set(sb, gdp, input->inode_bitmap); /* LV FIXME */
|
|
ext4_inode_table_set(sb, gdp, input->inode_table); /* LV FIXME */
|
|
ext4_free_blks_set(sb, gdp, input->free_blocks_count);
|
|
ext4_free_inodes_set(sb, gdp, EXT4_INODES_PER_GROUP(sb));
|
|
- gdp->bg_flags = cpu_to_le16(EXT4_BG_INODE_ZEROED);
|
|
+ gdp->bg_flags |= cpu_to_le16(EXT4_BG_INODE_ZEROED);
|
|
gdp->bg_checksum = ext4_group_desc_csum(sbi, input->group, gdp);
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ext4/super.c linux-2.6.29-rc3.owrt/fs/ext4/super.c
|
|
--- linux-2.6.29.owrt/fs/ext4/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ext4/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -3046,17 +3046,14 @@
|
|
static int ext4_sync_fs(struct super_block *sb, int wait)
|
|
{
|
|
int ret = 0;
|
|
- tid_t target;
|
|
|
|
trace_mark(ext4_sync_fs, "dev %s wait %d", sb->s_id, wait);
|
|
sb->s_dirt = 0;
|
|
if (EXT4_SB(sb)->s_journal) {
|
|
- if (jbd2_journal_start_commit(EXT4_SB(sb)->s_journal,
|
|
- &target)) {
|
|
- if (wait)
|
|
- jbd2_log_wait_commit(EXT4_SB(sb)->s_journal,
|
|
- target);
|
|
- }
|
|
+ if (wait)
|
|
+ ret = ext4_force_commit(sb);
|
|
+ else
|
|
+ jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, NULL);
|
|
} else {
|
|
ext4_commit_super(sb, EXT4_SB(sb)->s_es, wait);
|
|
}
|
|
@@ -3091,6 +3088,7 @@
|
|
|
|
/* Journal blocked and flushed, clear needs_recovery flag. */
|
|
EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
|
|
+ ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1);
|
|
error = ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1);
|
|
if (error)
|
|
goto out;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/fat/inode.c linux-2.6.29-rc3.owrt/fs/fat/inode.c
|
|
--- linux-2.6.29.owrt/fs/fat/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/fat/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -202,9 +202,9 @@
|
|
sector_t blocknr;
|
|
|
|
/* fat_get_cluster() assumes the requested blocknr isn't truncated. */
|
|
- down_read(&mapping->host->i_alloc_sem);
|
|
+ mutex_lock(&mapping->host->i_mutex);
|
|
blocknr = generic_block_bmap(mapping, block, fat_get_block);
|
|
- up_read(&mapping->host->i_alloc_sem);
|
|
+ mutex_unlock(&mapping->host->i_mutex);
|
|
|
|
return blocknr;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/fs-writeback.c linux-2.6.29-rc3.owrt/fs/fs-writeback.c
|
|
--- linux-2.6.29.owrt/fs/fs-writeback.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/fs-writeback.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -274,7 +274,6 @@
|
|
int ret;
|
|
|
|
BUG_ON(inode->i_state & I_SYNC);
|
|
- WARN_ON(inode->i_state & I_NEW);
|
|
|
|
/* Set I_SYNC, reset I_DIRTY */
|
|
dirty = inode->i_state & I_DIRTY;
|
|
@@ -299,7 +298,6 @@
|
|
}
|
|
|
|
spin_lock(&inode_lock);
|
|
- WARN_ON(inode->i_state & I_NEW);
|
|
inode->i_state &= ~I_SYNC;
|
|
if (!(inode->i_state & I_FREEING)) {
|
|
if (!(inode->i_state & I_DIRTY) &&
|
|
@@ -472,11 +470,6 @@
|
|
break;
|
|
}
|
|
|
|
- if (inode->i_state & I_NEW) {
|
|
- requeue_io(inode);
|
|
- continue;
|
|
- }
|
|
-
|
|
if (wbc->nonblocking && bdi_write_congested(bdi)) {
|
|
wbc->encountered_congestion = 1;
|
|
if (!sb_is_blkdev_sb(sb))
|
|
@@ -538,7 +531,7 @@
|
|
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
|
|
struct address_space *mapping;
|
|
|
|
- if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW))
|
|
+ if (inode->i_state & (I_FREEING|I_WILL_FREE))
|
|
continue;
|
|
mapping = inode->i_mapping;
|
|
if (mapping->nrpages == 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/hugetlbfs/inode.c linux-2.6.29-rc3.owrt/fs/hugetlbfs/inode.c
|
|
--- linux-2.6.29.owrt/fs/hugetlbfs/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/hugetlbfs/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -108,8 +108,7 @@
|
|
|
|
if (hugetlb_reserve_pages(inode,
|
|
vma->vm_pgoff >> huge_page_order(h),
|
|
- len >> huge_page_shift(h), vma,
|
|
- vma->vm_flags))
|
|
+ len >> huge_page_shift(h), vma))
|
|
goto out;
|
|
|
|
ret = 0;
|
|
@@ -948,7 +947,7 @@
|
|
can_do_mlock());
|
|
}
|
|
|
|
-struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag)
|
|
+struct file *hugetlb_file_setup(const char *name, size_t size)
|
|
{
|
|
int error = -ENOMEM;
|
|
struct file *file;
|
|
@@ -982,8 +981,7 @@
|
|
|
|
error = -ENOMEM;
|
|
if (hugetlb_reserve_pages(inode, 0,
|
|
- size >> huge_page_shift(hstate_inode(inode)), NULL,
|
|
- acctflag))
|
|
+ size >> huge_page_shift(hstate_inode(inode)), NULL))
|
|
goto out_inode;
|
|
|
|
d_instantiate(dentry, inode);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/inode.c linux-2.6.29-rc3.owrt/fs/inode.c
|
|
--- linux-2.6.29.owrt/fs/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -359,7 +359,6 @@
|
|
invalidate_inode_buffers(inode);
|
|
if (!atomic_read(&inode->i_count)) {
|
|
list_move(&inode->i_list, dispose);
|
|
- WARN_ON(inode->i_state & I_NEW);
|
|
inode->i_state |= I_FREEING;
|
|
count++;
|
|
continue;
|
|
@@ -461,7 +460,6 @@
|
|
continue;
|
|
}
|
|
list_move(&inode->i_list, &freeable);
|
|
- WARN_ON(inode->i_state & I_NEW);
|
|
inode->i_state |= I_FREEING;
|
|
nr_pruned++;
|
|
}
|
|
@@ -658,7 +656,6 @@
|
|
* just created it (so there can be no old holders
|
|
* that haven't tested I_LOCK).
|
|
*/
|
|
- WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW));
|
|
inode->i_state &= ~(I_LOCK|I_NEW);
|
|
wake_up_inode(inode);
|
|
}
|
|
@@ -1148,7 +1145,6 @@
|
|
|
|
list_del_init(&inode->i_list);
|
|
list_del_init(&inode->i_sb_list);
|
|
- WARN_ON(inode->i_state & I_NEW);
|
|
inode->i_state |= I_FREEING;
|
|
inodes_stat.nr_inodes--;
|
|
spin_unlock(&inode_lock);
|
|
@@ -1190,19 +1186,16 @@
|
|
spin_unlock(&inode_lock);
|
|
return;
|
|
}
|
|
- WARN_ON(inode->i_state & I_NEW);
|
|
inode->i_state |= I_WILL_FREE;
|
|
spin_unlock(&inode_lock);
|
|
write_inode_now(inode, 1);
|
|
spin_lock(&inode_lock);
|
|
- WARN_ON(inode->i_state & I_NEW);
|
|
inode->i_state &= ~I_WILL_FREE;
|
|
inodes_stat.nr_unused--;
|
|
hlist_del_init(&inode->i_hash);
|
|
}
|
|
list_del_init(&inode->i_list);
|
|
list_del_init(&inode->i_sb_list);
|
|
- WARN_ON(inode->i_state & I_NEW);
|
|
inode->i_state |= I_FREEING;
|
|
inodes_stat.nr_inodes--;
|
|
spin_unlock(&inode_lock);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/internal.h linux-2.6.29-rc3.owrt/fs/internal.h
|
|
--- linux-2.6.29.owrt/fs/internal.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/internal.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -43,7 +43,7 @@
|
|
/*
|
|
* exec.c
|
|
*/
|
|
-extern void check_unsafe_exec(struct linux_binprm *, struct files_struct *);
|
|
+extern void check_unsafe_exec(struct linux_binprm *);
|
|
|
|
/*
|
|
* namespace.c
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/jbd/journal.c linux-2.6.29-rc3.owrt/fs/jbd/journal.c
|
|
--- linux-2.6.29.owrt/fs/jbd/journal.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/jbd/journal.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -427,7 +427,7 @@
|
|
}
|
|
|
|
/*
|
|
- * Called under j_state_lock. Returns true if a transaction commit was started.
|
|
+ * Called under j_state_lock. Returns true if a transaction was started.
|
|
*/
|
|
int __log_start_commit(journal_t *journal, tid_t target)
|
|
{
|
|
@@ -495,8 +495,7 @@
|
|
|
|
/*
|
|
* Start a commit of the current running transaction (if any). Returns true
|
|
- * if a transaction is going to be committed (or is currently already
|
|
- * committing), and fills its tid in at *ptid
|
|
+ * if a transaction was started, and fills its tid in at *ptid
|
|
*/
|
|
int journal_start_commit(journal_t *journal, tid_t *ptid)
|
|
{
|
|
@@ -506,19 +505,15 @@
|
|
if (journal->j_running_transaction) {
|
|
tid_t tid = journal->j_running_transaction->t_tid;
|
|
|
|
- __log_start_commit(journal, tid);
|
|
- /* There's a running transaction and we've just made sure
|
|
- * it's commit has been scheduled. */
|
|
- if (ptid)
|
|
+ ret = __log_start_commit(journal, tid);
|
|
+ if (ret && ptid)
|
|
*ptid = tid;
|
|
- ret = 1;
|
|
- } else if (journal->j_committing_transaction) {
|
|
+ } else if (journal->j_committing_transaction && ptid) {
|
|
/*
|
|
* If ext3_write_super() recently started a commit, then we
|
|
* have to wait for completion of that transaction
|
|
*/
|
|
- if (ptid)
|
|
- *ptid = journal->j_committing_transaction->t_tid;
|
|
+ *ptid = journal->j_committing_transaction->t_tid;
|
|
ret = 1;
|
|
}
|
|
spin_unlock(&journal->j_state_lock);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/jbd2/journal.c linux-2.6.29-rc3.owrt/fs/jbd2/journal.c
|
|
--- linux-2.6.29.owrt/fs/jbd2/journal.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/jbd2/journal.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -37,10 +37,10 @@
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/debugfs.h>
|
|
#include <linux/seq_file.h>
|
|
-#include <linux/math64.h>
|
|
|
|
#include <asm/uaccess.h>
|
|
#include <asm/page.h>
|
|
+#include <asm/div64.h>
|
|
|
|
EXPORT_SYMBOL(jbd2_journal_start);
|
|
EXPORT_SYMBOL(jbd2_journal_restart);
|
|
@@ -450,7 +450,7 @@
|
|
}
|
|
|
|
/*
|
|
- * Called under j_state_lock. Returns true if a transaction commit was started.
|
|
+ * Called under j_state_lock. Returns true if a transaction was started.
|
|
*/
|
|
int __jbd2_log_start_commit(journal_t *journal, tid_t target)
|
|
{
|
|
@@ -518,8 +518,7 @@
|
|
|
|
/*
|
|
* Start a commit of the current running transaction (if any). Returns true
|
|
- * if a transaction is going to be committed (or is currently already
|
|
- * committing), and fills its tid in at *ptid
|
|
+ * if a transaction was started, and fills its tid in at *ptid
|
|
*/
|
|
int jbd2_journal_start_commit(journal_t *journal, tid_t *ptid)
|
|
{
|
|
@@ -529,19 +528,15 @@
|
|
if (journal->j_running_transaction) {
|
|
tid_t tid = journal->j_running_transaction->t_tid;
|
|
|
|
- __jbd2_log_start_commit(journal, tid);
|
|
- /* There's a running transaction and we've just made sure
|
|
- * it's commit has been scheduled. */
|
|
- if (ptid)
|
|
+ ret = __jbd2_log_start_commit(journal, tid);
|
|
+ if (ret && ptid)
|
|
*ptid = tid;
|
|
- ret = 1;
|
|
- } else if (journal->j_committing_transaction) {
|
|
+ } else if (journal->j_committing_transaction && ptid) {
|
|
/*
|
|
* If ext3_write_super() recently started a commit, then we
|
|
* have to wait for completion of that transaction
|
|
*/
|
|
- if (ptid)
|
|
- *ptid = journal->j_committing_transaction->t_tid;
|
|
+ *ptid = journal->j_committing_transaction->t_tid;
|
|
ret = 1;
|
|
}
|
|
spin_unlock(&journal->j_state_lock);
|
|
@@ -851,8 +846,8 @@
|
|
jiffies_to_msecs(s->stats->u.run.rs_flushing / s->stats->ts_tid));
|
|
seq_printf(seq, " %ums logging transaction\n",
|
|
jiffies_to_msecs(s->stats->u.run.rs_logging / s->stats->ts_tid));
|
|
- seq_printf(seq, " %lluus average transaction commit time\n",
|
|
- div_u64(s->journal->j_average_commit_time, 1000));
|
|
+ seq_printf(seq, " %luus average transaction commit time\n",
|
|
+ do_div(s->journal->j_average_commit_time, 1000));
|
|
seq_printf(seq, " %lu handles per transaction\n",
|
|
s->stats->u.run.rs_handle_count / s->stats->ts_tid);
|
|
seq_printf(seq, " %lu blocks per transaction\n",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/jbd2/transaction.c linux-2.6.29-rc3.owrt/fs/jbd2/transaction.c
|
|
--- linux-2.6.29.owrt/fs/jbd2/transaction.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/jbd2/transaction.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2129,46 +2129,26 @@
|
|
}
|
|
|
|
/*
|
|
- * File truncate and transaction commit interact with each other in a
|
|
- * non-trivial way. If a transaction writing data block A is
|
|
- * committing, we cannot discard the data by truncate until we have
|
|
- * written them. Otherwise if we crashed after the transaction with
|
|
- * write has committed but before the transaction with truncate has
|
|
- * committed, we could see stale data in block A. This function is a
|
|
- * helper to solve this problem. It starts writeout of the truncated
|
|
- * part in case it is in the committing transaction.
|
|
- *
|
|
- * Filesystem code must call this function when inode is journaled in
|
|
- * ordered mode before truncation happens and after the inode has been
|
|
- * placed on orphan list with the new inode size. The second condition
|
|
- * avoids the race that someone writes new data and we start
|
|
- * committing the transaction after this function has been called but
|
|
- * before a transaction for truncate is started (and furthermore it
|
|
- * allows us to optimize the case where the addition to orphan list
|
|
- * happens in the same transaction as write --- we don't have to write
|
|
- * any data in such case).
|
|
+ * This function must be called when inode is journaled in ordered mode
|
|
+ * before truncation happens. It starts writeout of truncated part in
|
|
+ * case it is in the committing transaction so that we stand to ordered
|
|
+ * mode consistency guarantees.
|
|
*/
|
|
-int jbd2_journal_begin_ordered_truncate(journal_t *journal,
|
|
- struct jbd2_inode *jinode,
|
|
+int jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode,
|
|
loff_t new_size)
|
|
{
|
|
- transaction_t *inode_trans, *commit_trans;
|
|
+ journal_t *journal;
|
|
+ transaction_t *commit_trans;
|
|
int ret = 0;
|
|
|
|
- /* This is a quick check to avoid locking if not necessary */
|
|
- if (!jinode->i_transaction)
|
|
+ if (!inode->i_transaction && !inode->i_next_transaction)
|
|
goto out;
|
|
- /* Locks are here just to force reading of recent values, it is
|
|
- * enough that the transaction was not committing before we started
|
|
- * a transaction adding the inode to orphan list */
|
|
+ journal = inode->i_transaction->t_journal;
|
|
spin_lock(&journal->j_state_lock);
|
|
commit_trans = journal->j_committing_transaction;
|
|
spin_unlock(&journal->j_state_lock);
|
|
- spin_lock(&journal->j_list_lock);
|
|
- inode_trans = jinode->i_transaction;
|
|
- spin_unlock(&journal->j_list_lock);
|
|
- if (inode_trans == commit_trans) {
|
|
- ret = filemap_fdatawrite_range(jinode->i_vfs_inode->i_mapping,
|
|
+ if (inode->i_transaction == commit_trans) {
|
|
+ ret = filemap_fdatawrite_range(inode->i_vfs_inode->i_mapping,
|
|
new_size, LLONG_MAX);
|
|
if (ret)
|
|
jbd2_journal_abort(journal, ret);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/jffs2/background.c linux-2.6.29-rc3.owrt/fs/jffs2/background.c
|
|
--- linux-2.6.29.owrt/fs/jffs2/background.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/jffs2/background.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -95,17 +95,13 @@
|
|
spin_unlock(&c->erase_completion_lock);
|
|
|
|
|
|
- /* Problem - immediately after bootup, the GCD spends a lot
|
|
- * of time in places like jffs2_kill_fragtree(); so much so
|
|
- * that userspace processes (like gdm and X) are starved
|
|
- * despite plenty of cond_resched()s and renicing. Yield()
|
|
- * doesn't help, either (presumably because userspace and GCD
|
|
- * are generally competing for a higher latency resource -
|
|
- * disk).
|
|
- * This forces the GCD to slow the hell down. Pulling an
|
|
- * inode in with read_inode() is much preferable to having
|
|
- * the GC thread get there first. */
|
|
- schedule_timeout_interruptible(msecs_to_jiffies(50));
|
|
+ /* This thread is purely an optimisation. But if it runs when
|
|
+ other things could be running, it actually makes things a
|
|
+ lot worse. Use yield() and put it at the back of the runqueue
|
|
+ every time. Especially during boot, pulling an inode in
|
|
+ with read_inode() is much preferable to having the GC thread
|
|
+ get there first. */
|
|
+ yield();
|
|
|
|
/* Put_super will send a SIGKILL and then wait on the sem.
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/jffs2/readinode.c linux-2.6.29-rc3.owrt/fs/jffs2/readinode.c
|
|
--- linux-2.6.29.owrt/fs/jffs2/readinode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/jffs2/readinode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -220,7 +220,7 @@
|
|
struct jffs2_tmp_dnode_info *tn)
|
|
{
|
|
uint32_t fn_end = tn->fn->ofs + tn->fn->size;
|
|
- struct jffs2_tmp_dnode_info *this, *ptn;
|
|
+ struct jffs2_tmp_dnode_info *this;
|
|
|
|
dbg_readinode("insert fragment %#04x-%#04x, ver %u at %08x\n", tn->fn->ofs, fn_end, tn->version, ref_offset(tn->fn->raw));
|
|
|
|
@@ -251,18 +251,11 @@
|
|
if (this) {
|
|
/* If the node is coincident with another at a lower address,
|
|
back up until the other node is found. It may be relevant */
|
|
- while (this->overlapped) {
|
|
- ptn = tn_prev(this);
|
|
- if (!ptn) {
|
|
- /*
|
|
- * We killed a node which set the overlapped
|
|
- * flags during the scan. Fix it up.
|
|
- */
|
|
- this->overlapped = 0;
|
|
- break;
|
|
- }
|
|
- this = ptn;
|
|
- }
|
|
+ while (this->overlapped)
|
|
+ this = tn_prev(this);
|
|
+
|
|
+ /* First node should never be marked overlapped */
|
|
+ BUG_ON(!this);
|
|
dbg_readinode("'this' found %#04x-%#04x (%s)\n", this->fn->ofs, this->fn->ofs + this->fn->size, this->fn ? "data" : "hole");
|
|
}
|
|
|
|
@@ -367,17 +360,7 @@
|
|
}
|
|
if (!this->overlapped)
|
|
break;
|
|
-
|
|
- ptn = tn_prev(this);
|
|
- if (!ptn) {
|
|
- /*
|
|
- * We killed a node which set the overlapped
|
|
- * flags during the scan. Fix it up.
|
|
- */
|
|
- this->overlapped = 0;
|
|
- break;
|
|
- }
|
|
- this = ptn;
|
|
+ this = tn_prev(this);
|
|
}
|
|
}
|
|
|
|
@@ -473,15 +456,8 @@
|
|
eat_last(&rii->tn_root, &last->rb);
|
|
ver_insert(&ver_root, last);
|
|
|
|
- if (unlikely(last->overlapped)) {
|
|
- if (pen)
|
|
- continue;
|
|
- /*
|
|
- * We killed a node which set the overlapped
|
|
- * flags during the scan. Fix it up.
|
|
- */
|
|
- last->overlapped = 0;
|
|
- }
|
|
+ if (unlikely(last->overlapped))
|
|
+ continue;
|
|
|
|
/* Now we have a bunch of nodes in reverse version
|
|
order, in the tree at ver_root. Most of the time,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/lockd/clntlock.c linux-2.6.29-rc3.owrt/fs/lockd/clntlock.c
|
|
--- linux-2.6.29.owrt/fs/lockd/clntlock.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/lockd/clntlock.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -139,55 +139,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
|
-static const struct in6_addr *nlmclnt_map_v4addr(const struct sockaddr *sap,
|
|
- struct in6_addr *addr_mapped)
|
|
-{
|
|
- const struct sockaddr_in *sin = (const struct sockaddr_in *)sap;
|
|
-
|
|
- switch (sap->sa_family) {
|
|
- case AF_INET6:
|
|
- return &((const struct sockaddr_in6 *)sap)->sin6_addr;
|
|
- case AF_INET:
|
|
- ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, addr_mapped);
|
|
- return addr_mapped;
|
|
- }
|
|
-
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-/*
|
|
- * If lockd is using a PF_INET6 listener, all incoming requests appear
|
|
- * to come from AF_INET6 remotes. The address of AF_INET remotes are
|
|
- * mapped to AF_INET6 automatically by the network layer. In case the
|
|
- * user passed an AF_INET server address at mount time, ensure both
|
|
- * addresses are AF_INET6 before comparing them.
|
|
- */
|
|
-static int nlmclnt_cmp_addr(const struct nlm_host *host,
|
|
- const struct sockaddr *sap)
|
|
-{
|
|
- const struct in6_addr *addr1;
|
|
- const struct in6_addr *addr2;
|
|
- struct in6_addr addr1_mapped;
|
|
- struct in6_addr addr2_mapped;
|
|
-
|
|
- addr1 = nlmclnt_map_v4addr(nlm_addr(host), &addr1_mapped);
|
|
- if (likely(addr1 != NULL)) {
|
|
- addr2 = nlmclnt_map_v4addr(sap, &addr2_mapped);
|
|
- if (likely(addr2 != NULL))
|
|
- return ipv6_addr_equal(addr1, addr2);
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-#else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
|
|
-static int nlmclnt_cmp_addr(const struct nlm_host *host,
|
|
- const struct sockaddr *sap)
|
|
-{
|
|
- return nlm_cmp_addr(nlm_addr(host), sap);
|
|
-}
|
|
-#endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
|
|
-
|
|
/*
|
|
* The server lockd has called us back to tell us the lock was granted
|
|
*/
|
|
@@ -215,7 +166,7 @@
|
|
*/
|
|
if (fl_blocked->fl_u.nfs_fl.owner->pid != lock->svid)
|
|
continue;
|
|
- if (!nlmclnt_cmp_addr(block->b_host, addr))
|
|
+ if (!nlm_cmp_addr(nlm_addr(block->b_host), addr))
|
|
continue;
|
|
if (nfs_compare_fh(NFS_FH(fl_blocked->fl_file->f_path.dentry->d_inode) ,fh) != 0)
|
|
continue;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/lockd/svclock.c linux-2.6.29-rc3.owrt/fs/lockd/svclock.c
|
|
--- linux-2.6.29.owrt/fs/lockd/svclock.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/lockd/svclock.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -427,7 +427,7 @@
|
|
goto out;
|
|
case -EAGAIN:
|
|
ret = nlm_lck_denied;
|
|
- break;
|
|
+ goto out;
|
|
case FILE_LOCK_DEFERRED:
|
|
if (wait)
|
|
break;
|
|
@@ -443,10 +443,6 @@
|
|
goto out;
|
|
}
|
|
|
|
- ret = nlm_lck_denied;
|
|
- if (!wait)
|
|
- goto out;
|
|
-
|
|
ret = nlm_lck_blocked;
|
|
|
|
/* Append to list of blocked */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/Makefile linux-2.6.29-rc3.owrt/fs/Makefile
|
|
--- linux-2.6.29.owrt/fs/Makefile 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -69,12 +69,10 @@
|
|
# Do not add any filesystems before this line
|
|
obj-$(CONFIG_REISERFS_FS) += reiserfs/
|
|
obj-$(CONFIG_EXT3_FS) += ext3/ # Before ext2 so root fs can be ext3
|
|
-obj-$(CONFIG_EXT2_FS) += ext2/
|
|
-# We place ext4 after ext2 so plain ext2 root fs's are mounted using ext2
|
|
-# unless explicitly requested by rootfstype
|
|
-obj-$(CONFIG_EXT4_FS) += ext4/
|
|
+obj-$(CONFIG_EXT4_FS) += ext4/ # Before ext2 so root fs can be ext4
|
|
obj-$(CONFIG_JBD) += jbd/
|
|
obj-$(CONFIG_JBD2) += jbd2/
|
|
+obj-$(CONFIG_EXT2_FS) += ext2/
|
|
obj-$(CONFIG_CRAMFS) += cramfs/
|
|
obj-$(CONFIG_SQUASHFS) += squashfs/
|
|
obj-y += ramfs/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/minix/inode.c linux-2.6.29-rc3.owrt/fs/minix/inode.c
|
|
--- linux-2.6.29.owrt/fs/minix/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/minix/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -3,7 +3,7 @@
|
|
*
|
|
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
*
|
|
- * Copyright (C) 1996 Gertjan van Wingerde
|
|
+ * Copyright (C) 1996 Gertjan van Wingerde (gertjan@cs.vu.nl)
|
|
* Minix V2 fs support.
|
|
*
|
|
* Modified for 680x0 by Andreas Schwab
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/namespace.c linux-2.6.29-rc3.owrt/fs/namespace.c
|
|
--- linux-2.6.29.owrt/fs/namespace.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/namespace.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -614,11 +614,9 @@
|
|
*/
|
|
for_each_possible_cpu(cpu) {
|
|
struct mnt_writer *cpu_writer = &per_cpu(mnt_writers, cpu);
|
|
- spin_lock(&cpu_writer->lock);
|
|
- if (cpu_writer->mnt != mnt) {
|
|
- spin_unlock(&cpu_writer->lock);
|
|
+ if (cpu_writer->mnt != mnt)
|
|
continue;
|
|
- }
|
|
+ spin_lock(&cpu_writer->lock);
|
|
atomic_add(cpu_writer->count, &mnt->__mnt_writers);
|
|
cpu_writer->count = 0;
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/nfs/client.c linux-2.6.29-rc3.owrt/fs/nfs/client.c
|
|
--- linux-2.6.29.owrt/fs/nfs/client.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/nfs/client.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -255,32 +255,6 @@
|
|
}
|
|
return 0;
|
|
}
|
|
-
|
|
-/*
|
|
- * Test if two ip6 socket addresses refer to the same socket by
|
|
- * comparing relevant fields. The padding bytes specifically, are not
|
|
- * compared. sin6_flowinfo is not compared because it only affects QoS
|
|
- * and sin6_scope_id is only compared if the address is "link local"
|
|
- * because "link local" addresses need only be unique to a specific
|
|
- * link. Conversely, ordinary unicast addresses might have different
|
|
- * sin6_scope_id.
|
|
- *
|
|
- * The caller should ensure both socket addresses are AF_INET6.
|
|
- */
|
|
-static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1,
|
|
- const struct sockaddr *sa2)
|
|
-{
|
|
- const struct sockaddr_in6 *saddr1 = (const struct sockaddr_in6 *)sa1;
|
|
- const struct sockaddr_in6 *saddr2 = (const struct sockaddr_in6 *)sa2;
|
|
-
|
|
- if (!ipv6_addr_equal(&saddr1->sin6_addr,
|
|
- &saddr1->sin6_addr))
|
|
- return 0;
|
|
- if (ipv6_addr_scope(&saddr1->sin6_addr) == IPV6_ADDR_SCOPE_LINKLOCAL &&
|
|
- saddr1->sin6_scope_id != saddr2->sin6_scope_id)
|
|
- return 0;
|
|
- return saddr1->sin6_port == saddr2->sin6_port;
|
|
-}
|
|
#else
|
|
static int nfs_sockaddr_match_ipaddr4(const struct sockaddr_in *sa1,
|
|
const struct sockaddr_in *sa2)
|
|
@@ -296,52 +270,9 @@
|
|
return nfs_sockaddr_match_ipaddr4((const struct sockaddr_in *)sa1,
|
|
(const struct sockaddr_in *)sa2);
|
|
}
|
|
-
|
|
-static int nfs_sockaddr_cmp_ip6(const struct sockaddr * sa1,
|
|
- const struct sockaddr * sa2)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
#endif
|
|
|
|
/*
|
|
- * Test if two ip4 socket addresses refer to the same socket, by
|
|
- * comparing relevant fields. The padding bytes specifically, are
|
|
- * not compared.
|
|
- *
|
|
- * The caller should ensure both socket addresses are AF_INET.
|
|
- */
|
|
-static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
|
|
- const struct sockaddr *sa2)
|
|
-{
|
|
- const struct sockaddr_in *saddr1 = (const struct sockaddr_in *)sa1;
|
|
- const struct sockaddr_in *saddr2 = (const struct sockaddr_in *)sa2;
|
|
-
|
|
- if (saddr1->sin_addr.s_addr != saddr2->sin_addr.s_addr)
|
|
- return 0;
|
|
- return saddr1->sin_port == saddr2->sin_port;
|
|
-}
|
|
-
|
|
-/*
|
|
- * Test if two socket addresses represent the same actual socket,
|
|
- * by comparing (only) relevant fields.
|
|
- */
|
|
-static int nfs_sockaddr_cmp(const struct sockaddr *sa1,
|
|
- const struct sockaddr *sa2)
|
|
-{
|
|
- if (sa1->sa_family != sa2->sa_family)
|
|
- return 0;
|
|
-
|
|
- switch (sa1->sa_family) {
|
|
- case AF_INET:
|
|
- return nfs_sockaddr_cmp_ip4(sa1, sa2);
|
|
- case AF_INET6:
|
|
- return nfs_sockaddr_cmp_ip6(sa1, sa2);
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
* Find a client by IP address and protocol version
|
|
* - returns NULL if no such client
|
|
*/
|
|
@@ -413,10 +344,8 @@
|
|
static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *data)
|
|
{
|
|
struct nfs_client *clp;
|
|
- const struct sockaddr *sap = data->addr;
|
|
|
|
list_for_each_entry(clp, &nfs_client_list, cl_share_link) {
|
|
- const struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr;
|
|
/* Don't match clients that failed to initialise properly */
|
|
if (clp->cl_cons_state < 0)
|
|
continue;
|
|
@@ -429,7 +358,7 @@
|
|
continue;
|
|
|
|
/* Match the full socket address */
|
|
- if (!nfs_sockaddr_cmp(sap, clap))
|
|
+ if (memcmp(&clp->cl_addr, data->addr, sizeof(clp->cl_addr)) != 0)
|
|
continue;
|
|
|
|
atomic_inc(&clp->cl_count);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/nfs/dir.c linux-2.6.29-rc3.owrt/fs/nfs/dir.c
|
|
--- linux-2.6.29.owrt/fs/nfs/dir.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/nfs/dir.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1892,14 +1892,8 @@
|
|
cache.cred = cred;
|
|
cache.jiffies = jiffies;
|
|
status = NFS_PROTO(inode)->access(inode, &cache);
|
|
- if (status != 0) {
|
|
- if (status == -ESTALE) {
|
|
- nfs_zap_caches(inode);
|
|
- if (!S_ISDIR(inode->i_mode))
|
|
- set_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
|
|
- }
|
|
+ if (status != 0)
|
|
return status;
|
|
- }
|
|
nfs_access_add_cache(inode, &cache);
|
|
out:
|
|
if ((mask & ~cache.mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/nfs/nfs3acl.c linux-2.6.29-rc3.owrt/fs/nfs/nfs3acl.c
|
|
--- linux-2.6.29.owrt/fs/nfs/nfs3acl.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/nfs/nfs3acl.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -292,7 +292,7 @@
|
|
{
|
|
struct nfs_server *server = NFS_SERVER(inode);
|
|
struct nfs_fattr fattr;
|
|
- struct page *pages[NFSACL_MAXPAGES];
|
|
+ struct page *pages[NFSACL_MAXPAGES] = { };
|
|
struct nfs3_setaclargs args = {
|
|
.inode = inode,
|
|
.mask = NFS_ACL,
|
|
@@ -303,7 +303,7 @@
|
|
.rpc_argp = &args,
|
|
.rpc_resp = &fattr,
|
|
};
|
|
- int status;
|
|
+ int status, count;
|
|
|
|
status = -EOPNOTSUPP;
|
|
if (!nfs_server_capable(inode, NFS_CAP_ACLS))
|
|
@@ -319,20 +319,6 @@
|
|
if (S_ISDIR(inode->i_mode)) {
|
|
args.mask |= NFS_DFACL;
|
|
args.acl_default = dfacl;
|
|
- args.len = nfsacl_size(acl, dfacl);
|
|
- } else
|
|
- args.len = nfsacl_size(acl, NULL);
|
|
-
|
|
- if (args.len > NFS_ACL_INLINE_BUFSIZE) {
|
|
- unsigned int npages = 1 + ((args.len - 1) >> PAGE_SHIFT);
|
|
-
|
|
- status = -ENOMEM;
|
|
- do {
|
|
- args.pages[args.npages] = alloc_page(GFP_KERNEL);
|
|
- if (args.pages[args.npages] == NULL)
|
|
- goto out_freepages;
|
|
- args.npages++;
|
|
- } while (args.npages < npages);
|
|
}
|
|
|
|
dprintk("NFS call setacl\n");
|
|
@@ -343,6 +329,10 @@
|
|
nfs_zap_acl_cache(inode);
|
|
dprintk("NFS reply setacl: %d\n", status);
|
|
|
|
+ /* pages may have been allocated at the xdr layer. */
|
|
+ for (count = 0; count < NFSACL_MAXPAGES && args.pages[count]; count++)
|
|
+ __free_page(args.pages[count]);
|
|
+
|
|
switch (status) {
|
|
case 0:
|
|
status = nfs_refresh_inode(inode, &fattr);
|
|
@@ -356,11 +346,6 @@
|
|
case -ENOTSUPP:
|
|
status = -EOPNOTSUPP;
|
|
}
|
|
-out_freepages:
|
|
- while (args.npages != 0) {
|
|
- args.npages--;
|
|
- __free_page(args.pages[args.npages]);
|
|
- }
|
|
out:
|
|
return status;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/nfs/nfs3xdr.c linux-2.6.29-rc3.owrt/fs/nfs/nfs3xdr.c
|
|
--- linux-2.6.29.owrt/fs/nfs/nfs3xdr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/nfs/nfs3xdr.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -82,10 +82,8 @@
|
|
#define NFS3_commitres_sz (1+NFS3_wcc_data_sz+2)
|
|
|
|
#define ACL3_getaclargs_sz (NFS3_fh_sz+1)
|
|
-#define ACL3_setaclargs_sz (NFS3_fh_sz+1+ \
|
|
- XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
|
|
-#define ACL3_getaclres_sz (1+NFS3_post_op_attr_sz+1+ \
|
|
- XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
|
|
+#define ACL3_setaclargs_sz (NFS3_fh_sz+1+2*(2+5*3))
|
|
+#define ACL3_getaclres_sz (1+NFS3_post_op_attr_sz+1+2*(2+5*3))
|
|
#define ACL3_setaclres_sz (1+NFS3_post_op_attr_sz)
|
|
|
|
/*
|
|
@@ -705,18 +703,28 @@
|
|
struct nfs3_setaclargs *args)
|
|
{
|
|
struct xdr_buf *buf = &req->rq_snd_buf;
|
|
- unsigned int base;
|
|
- int err;
|
|
+ unsigned int base, len_in_head, len = nfsacl_size(
|
|
+ (args->mask & NFS_ACL) ? args->acl_access : NULL,
|
|
+ (args->mask & NFS_DFACL) ? args->acl_default : NULL);
|
|
+ int count, err;
|
|
|
|
p = xdr_encode_fhandle(p, NFS_FH(args->inode));
|
|
*p++ = htonl(args->mask);
|
|
- req->rq_slen = xdr_adjust_iovec(req->rq_svec, p);
|
|
- base = req->rq_slen;
|
|
-
|
|
- if (args->npages != 0)
|
|
- xdr_encode_pages(buf, args->pages, 0, args->len);
|
|
- else
|
|
- req->rq_slen += args->len;
|
|
+ base = (char *)p - (char *)buf->head->iov_base;
|
|
+ /* put as much of the acls into head as possible. */
|
|
+ len_in_head = min_t(unsigned int, buf->head->iov_len - base, len);
|
|
+ len -= len_in_head;
|
|
+ req->rq_slen = xdr_adjust_iovec(req->rq_svec, p + (len_in_head >> 2));
|
|
+
|
|
+ for (count = 0; (count << PAGE_SHIFT) < len; count++) {
|
|
+ args->pages[count] = alloc_page(GFP_KERNEL);
|
|
+ if (!args->pages[count]) {
|
|
+ while (count)
|
|
+ __free_page(args->pages[--count]);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+ }
|
|
+ xdr_encode_pages(buf, args->pages, 0, len);
|
|
|
|
err = nfsacl_encode(buf, base, args->inode,
|
|
(args->mask & NFS_ACL) ?
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/nfs/nfs4namespace.c linux-2.6.29-rc3.owrt/fs/nfs/nfs4namespace.c
|
|
--- linux-2.6.29.owrt/fs/nfs/nfs4namespace.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/nfs/nfs4namespace.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -21,9 +21,7 @@
|
|
#define NFSDBG_FACILITY NFSDBG_VFS
|
|
|
|
/*
|
|
- * Convert the NFSv4 pathname components into a standard posix path.
|
|
- *
|
|
- * Note that the resulting string will be placed at the end of the buffer
|
|
+ * Check if fs_root is valid
|
|
*/
|
|
static inline char *nfs4_pathname_string(const struct nfs4_pathname *pathname,
|
|
char *buffer, ssize_t buflen)
|
|
@@ -101,20 +99,21 @@
|
|
{
|
|
struct vfsmount *mnt = ERR_PTR(-ENOENT);
|
|
char *mnt_path;
|
|
- unsigned int maxbuflen;
|
|
+ int page2len;
|
|
unsigned int s;
|
|
|
|
mnt_path = nfs4_pathname_string(&location->rootpath, page2, PAGE_SIZE);
|
|
if (IS_ERR(mnt_path))
|
|
return mnt;
|
|
mountdata->mnt_path = mnt_path;
|
|
- maxbuflen = mnt_path - 1 - page2;
|
|
+ page2 += strlen(mnt_path) + 1;
|
|
+ page2len = PAGE_SIZE - strlen(mnt_path) - 1;
|
|
|
|
for (s = 0; s < location->nservers; s++) {
|
|
const struct nfs4_string *buf = &location->servers[s];
|
|
struct sockaddr_storage addr;
|
|
|
|
- if (buf->len <= 0 || buf->len >= maxbuflen)
|
|
+ if (buf->len <= 0 || buf->len >= PAGE_SIZE)
|
|
continue;
|
|
|
|
mountdata->addr = (struct sockaddr *)&addr;
|
|
@@ -127,8 +126,8 @@
|
|
continue;
|
|
nfs_set_port(mountdata->addr, NFS_PORT);
|
|
|
|
- memcpy(page2, buf->data, buf->len);
|
|
- page2[buf->len] = '\0';
|
|
+ strncpy(page2, buf->data, page2len);
|
|
+ page2[page2len] = '\0';
|
|
mountdata->hostname = page2;
|
|
|
|
snprintf(page, PAGE_SIZE, "%s:%s",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/nfsd/nfs4xdr.c linux-2.6.29-rc3.owrt/fs/nfsd/nfs4xdr.c
|
|
--- linux-2.6.29.owrt/fs/nfsd/nfs4xdr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/nfsd/nfs4xdr.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2596,7 +2596,6 @@
|
|
[OP_LOOKUPP] = (nfsd4_enc)nfsd4_encode_noop,
|
|
[OP_NVERIFY] = (nfsd4_enc)nfsd4_encode_noop,
|
|
[OP_OPEN] = (nfsd4_enc)nfsd4_encode_open,
|
|
- [OP_OPENATTR] = (nfsd4_enc)nfsd4_encode_noop,
|
|
[OP_OPEN_CONFIRM] = (nfsd4_enc)nfsd4_encode_open_confirm,
|
|
[OP_OPEN_DOWNGRADE] = (nfsd4_enc)nfsd4_encode_open_downgrade,
|
|
[OP_PUTFH] = (nfsd4_enc)nfsd4_encode_noop,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/notify/inotify/inotify.c linux-2.6.29-rc3.owrt/fs/notify/inotify/inotify.c
|
|
--- linux-2.6.29.owrt/fs/notify/inotify/inotify.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/notify/inotify/inotify.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -156,7 +156,7 @@
|
|
int ret;
|
|
|
|
do {
|
|
- if (unlikely(!idr_pre_get(&ih->idr, GFP_NOFS)))
|
|
+ if (unlikely(!idr_pre_get(&ih->idr, GFP_KERNEL)))
|
|
return -ENOSPC;
|
|
ret = idr_get_new_above(&ih->idr, watch, ih->last_wd+1, &watch->wd);
|
|
} while (ret == -EAGAIN);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/alloc.c linux-2.6.29-rc3.owrt/fs/ocfs2/alloc.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/alloc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/alloc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -176,8 +176,7 @@
|
|
|
|
BUG_ON(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL);
|
|
mlog_bug_on_msg(!ocfs2_sparse_alloc(osb) &&
|
|
- (OCFS2_I(inode)->ip_clusters !=
|
|
- le32_to_cpu(rec->e_cpos)),
|
|
+ (OCFS2_I(inode)->ip_clusters != rec->e_cpos),
|
|
"Device %s, asking for sparse allocation: inode %llu, "
|
|
"cpos %u, clusters %u\n",
|
|
osb->dev_str,
|
|
@@ -4797,29 +4796,6 @@
|
|
return ret;
|
|
}
|
|
|
|
-static int ocfs2_replace_extent_rec(struct inode *inode,
|
|
- handle_t *handle,
|
|
- struct ocfs2_path *path,
|
|
- struct ocfs2_extent_list *el,
|
|
- int split_index,
|
|
- struct ocfs2_extent_rec *split_rec)
|
|
-{
|
|
- int ret;
|
|
-
|
|
- ret = ocfs2_path_bh_journal_access(handle, inode, path,
|
|
- path_num_items(path) - 1);
|
|
- if (ret) {
|
|
- mlog_errno(ret);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- el->l_recs[split_index] = *split_rec;
|
|
-
|
|
- ocfs2_journal_dirty(handle, path_leaf_bh(path));
|
|
-out:
|
|
- return ret;
|
|
-}
|
|
-
|
|
/*
|
|
* Mark part or all of the extent record at split_index in the leaf
|
|
* pointed to by path as written. This removes the unwritten
|
|
@@ -4909,9 +4885,7 @@
|
|
|
|
if (ctxt.c_contig_type == CONTIG_NONE) {
|
|
if (ctxt.c_split_covers_rec)
|
|
- ret = ocfs2_replace_extent_rec(inode, handle,
|
|
- path, el,
|
|
- split_index, split_rec);
|
|
+ el->l_recs[split_index] = *split_rec;
|
|
else
|
|
ret = ocfs2_split_and_insert(inode, handle, path, et,
|
|
&last_eb_bh, split_index,
|
|
@@ -5416,9 +5390,6 @@
|
|
goto out;
|
|
}
|
|
|
|
- vfs_dq_free_space_nodirty(inode,
|
|
- ocfs2_clusters_to_bytes(inode->i_sb, len));
|
|
-
|
|
ret = ocfs2_remove_extent(inode, et, cpos, len, handle, meta_ac,
|
|
dealloc);
|
|
if (ret) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/aops.c linux-2.6.29-rc3.owrt/fs/ocfs2/aops.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/aops.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/aops.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -227,7 +227,7 @@
|
|
size = i_size_read(inode);
|
|
|
|
if (size > PAGE_CACHE_SIZE ||
|
|
- size > ocfs2_max_inline_data_with_xattr(inode->i_sb, di)) {
|
|
+ size > ocfs2_max_inline_data(inode->i_sb)) {
|
|
ocfs2_error(inode->i_sb,
|
|
"Inode %llu has with inline data has bad size: %Lu",
|
|
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
|
@@ -1555,7 +1555,6 @@
|
|
int ret, written = 0;
|
|
loff_t end = pos + len;
|
|
struct ocfs2_inode_info *oi = OCFS2_I(inode);
|
|
- struct ocfs2_dinode *di = NULL;
|
|
|
|
mlog(0, "Inode %llu, write of %u bytes at off %llu. features: 0x%x\n",
|
|
(unsigned long long)oi->ip_blkno, len, (unsigned long long)pos,
|
|
@@ -1588,9 +1587,7 @@
|
|
/*
|
|
* Check whether the write can fit.
|
|
*/
|
|
- di = (struct ocfs2_dinode *)wc->w_di_bh->b_data;
|
|
- if (mmap_page ||
|
|
- end > ocfs2_max_inline_data_with_xattr(inode->i_sb, di))
|
|
+ if (mmap_page || end > ocfs2_max_inline_data(inode->i_sb))
|
|
return 0;
|
|
|
|
do_inline_write:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/dcache.c linux-2.6.29-rc3.owrt/fs/ocfs2/dcache.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/dcache.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/dcache.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -38,7 +38,6 @@
|
|
#include "dlmglue.h"
|
|
#include "file.h"
|
|
#include "inode.h"
|
|
-#include "super.h"
|
|
|
|
|
|
static int ocfs2_dentry_revalidate(struct dentry *dentry,
|
|
@@ -295,34 +294,6 @@
|
|
return ret;
|
|
}
|
|
|
|
-static DEFINE_SPINLOCK(dentry_list_lock);
|
|
-
|
|
-/* We limit the number of dentry locks to drop in one go. We have
|
|
- * this limit so that we don't starve other users of ocfs2_wq. */
|
|
-#define DL_INODE_DROP_COUNT 64
|
|
-
|
|
-/* Drop inode references from dentry locks */
|
|
-void ocfs2_drop_dl_inodes(struct work_struct *work)
|
|
-{
|
|
- struct ocfs2_super *osb = container_of(work, struct ocfs2_super,
|
|
- dentry_lock_work);
|
|
- struct ocfs2_dentry_lock *dl;
|
|
- int drop_count = DL_INODE_DROP_COUNT;
|
|
-
|
|
- spin_lock(&dentry_list_lock);
|
|
- while (osb->dentry_lock_list && drop_count--) {
|
|
- dl = osb->dentry_lock_list;
|
|
- osb->dentry_lock_list = dl->dl_next;
|
|
- spin_unlock(&dentry_list_lock);
|
|
- iput(dl->dl_inode);
|
|
- kfree(dl);
|
|
- spin_lock(&dentry_list_lock);
|
|
- }
|
|
- if (osb->dentry_lock_list)
|
|
- queue_work(ocfs2_wq, &osb->dentry_lock_work);
|
|
- spin_unlock(&dentry_list_lock);
|
|
-}
|
|
-
|
|
/*
|
|
* ocfs2_dentry_iput() and friends.
|
|
*
|
|
@@ -347,23 +318,16 @@
|
|
static void ocfs2_drop_dentry_lock(struct ocfs2_super *osb,
|
|
struct ocfs2_dentry_lock *dl)
|
|
{
|
|
+ iput(dl->dl_inode);
|
|
ocfs2_simple_drop_lockres(osb, &dl->dl_lockres);
|
|
ocfs2_lock_res_free(&dl->dl_lockres);
|
|
-
|
|
- /* We leave dropping of inode reference to ocfs2_wq as that can
|
|
- * possibly lead to inode deletion which gets tricky */
|
|
- spin_lock(&dentry_list_lock);
|
|
- if (!osb->dentry_lock_list)
|
|
- queue_work(ocfs2_wq, &osb->dentry_lock_work);
|
|
- dl->dl_next = osb->dentry_lock_list;
|
|
- osb->dentry_lock_list = dl;
|
|
- spin_unlock(&dentry_list_lock);
|
|
+ kfree(dl);
|
|
}
|
|
|
|
void ocfs2_dentry_lock_put(struct ocfs2_super *osb,
|
|
struct ocfs2_dentry_lock *dl)
|
|
{
|
|
- int unlock;
|
|
+ int unlock = 0;
|
|
|
|
BUG_ON(dl->dl_count == 0);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/dcache.h linux-2.6.29-rc3.owrt/fs/ocfs2/dcache.h
|
|
--- linux-2.6.29.owrt/fs/ocfs2/dcache.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/dcache.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -29,13 +29,8 @@
|
|
extern struct dentry_operations ocfs2_dentry_ops;
|
|
|
|
struct ocfs2_dentry_lock {
|
|
- /* Use count of dentry lock */
|
|
unsigned int dl_count;
|
|
- union {
|
|
- /* Linked list of dentry locks to release */
|
|
- struct ocfs2_dentry_lock *dl_next;
|
|
- u64 dl_parent_blkno;
|
|
- };
|
|
+ u64 dl_parent_blkno;
|
|
|
|
/*
|
|
* The ocfs2_dentry_lock keeps an inode reference until
|
|
@@ -52,8 +47,6 @@
|
|
void ocfs2_dentry_lock_put(struct ocfs2_super *osb,
|
|
struct ocfs2_dentry_lock *dl);
|
|
|
|
-void ocfs2_drop_dl_inodes(struct work_struct *work);
|
|
-
|
|
struct dentry *ocfs2_find_local_alias(struct inode *inode, u64 parent_blkno,
|
|
int skip_unhashed);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/dlm/dlmmaster.c linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmmaster.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/dlm/dlmmaster.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmmaster.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1849,12 +1849,12 @@
|
|
if (!mle) {
|
|
if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN &&
|
|
res->owner != assert->node_idx) {
|
|
- mlog(ML_ERROR, "DIE! Mastery assert from %u, "
|
|
- "but current owner is %u! (%.*s)\n",
|
|
- assert->node_idx, res->owner, namelen,
|
|
- name);
|
|
- __dlm_print_one_lock_resource(res);
|
|
- BUG();
|
|
+ mlog(ML_ERROR, "assert_master from "
|
|
+ "%u, but current owner is "
|
|
+ "%u! (%.*s)\n",
|
|
+ assert->node_idx, res->owner,
|
|
+ namelen, name);
|
|
+ goto kill;
|
|
}
|
|
} else if (mle->type != DLM_MLE_MIGRATION) {
|
|
if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/dlm/dlmthread.c linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmthread.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/dlm/dlmthread.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmthread.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -181,7 +181,8 @@
|
|
|
|
spin_lock(&res->spinlock);
|
|
/* This ensures that clear refmap is sent after the set */
|
|
- __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG);
|
|
+ __dlm_wait_on_lockres_flags(res, (DLM_LOCK_RES_SETREF_INPROG |
|
|
+ DLM_LOCK_RES_MIGRATING));
|
|
spin_unlock(&res->spinlock);
|
|
|
|
/* clear our bit from the master's refmap, ignore errors */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/dlm/dlmunlock.c linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmunlock.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/dlm/dlmunlock.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmunlock.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -117,11 +117,11 @@
|
|
else
|
|
BUG_ON(res->owner == dlm->node_num);
|
|
|
|
- spin_lock(&dlm->ast_lock);
|
|
+ spin_lock(&dlm->spinlock);
|
|
/* We want to be sure that we're not freeing a lock
|
|
* that still has AST's pending... */
|
|
in_use = !list_empty(&lock->ast_list);
|
|
- spin_unlock(&dlm->ast_lock);
|
|
+ spin_unlock(&dlm->spinlock);
|
|
if (in_use) {
|
|
mlog(ML_ERROR, "lockres %.*s: Someone is calling dlmunlock "
|
|
"while waiting for an ast!", res->lockname.len,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/dlmglue.c linux-2.6.29-rc3.owrt/fs/ocfs2/dlmglue.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/dlmglue.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/dlmglue.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -320,14 +320,9 @@
|
|
struct ocfs2_lock_res *lockres);
|
|
static inline void ocfs2_recover_from_dlm_error(struct ocfs2_lock_res *lockres,
|
|
int convert);
|
|
-#define ocfs2_log_dlm_error(_func, _err, _lockres) do { \
|
|
- if ((_lockres)->l_type != OCFS2_LOCK_TYPE_DENTRY) \
|
|
- mlog(ML_ERROR, "DLM error %d while calling %s on resource %s\n", \
|
|
- _err, _func, _lockres->l_name); \
|
|
- else \
|
|
- mlog(ML_ERROR, "DLM error %d while calling %s on resource %.*s%08x\n", \
|
|
- _err, _func, OCFS2_DENTRY_LOCK_INO_START - 1, (_lockres)->l_name, \
|
|
- (unsigned int)ocfs2_get_dentry_lock_ino(_lockres)); \
|
|
+#define ocfs2_log_dlm_error(_func, _err, _lockres) do { \
|
|
+ mlog(ML_ERROR, "DLM error %d while calling %s on resource %s\n", \
|
|
+ _err, _func, _lockres->l_name); \
|
|
} while (0)
|
|
static int ocfs2_downconvert_thread(void *arg);
|
|
static void ocfs2_downconvert_on_unlock(struct ocfs2_super *osb,
|
|
@@ -2865,10 +2860,6 @@
|
|
case OCFS2_UNLOCK_CANCEL_CONVERT:
|
|
mlog(0, "Cancel convert success for %s\n", lockres->l_name);
|
|
lockres->l_action = OCFS2_AST_INVALID;
|
|
- /* Downconvert thread may have requeued this lock, we
|
|
- * need to wake it. */
|
|
- if (lockres->l_flags & OCFS2_LOCK_BLOCKED)
|
|
- ocfs2_wake_downconvert_thread(ocfs2_get_lockres_osb(lockres));
|
|
break;
|
|
case OCFS2_UNLOCK_DROP_LOCK:
|
|
lockres->l_level = DLM_LOCK_IV;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/journal.h linux-2.6.29-rc3.owrt/fs/ocfs2/journal.h
|
|
--- linux-2.6.29.owrt/fs/ocfs2/journal.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/journal.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -513,10 +513,8 @@
|
|
static inline int ocfs2_begin_ordered_truncate(struct inode *inode,
|
|
loff_t new_size)
|
|
{
|
|
- return jbd2_journal_begin_ordered_truncate(
|
|
- OCFS2_SB(inode->i_sb)->journal->j_journal,
|
|
- &OCFS2_I(inode)->ip_jinode,
|
|
- new_size);
|
|
+ return jbd2_journal_begin_ordered_truncate(&OCFS2_I(inode)->ip_jinode,
|
|
+ new_size);
|
|
}
|
|
|
|
#endif /* OCFS2_JOURNAL_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/namei.c linux-2.6.29-rc3.owrt/fs/ocfs2/namei.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/namei.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/namei.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -532,8 +532,7 @@
|
|
|
|
fe->i_dyn_features = cpu_to_le16(feat | OCFS2_INLINE_DATA_FL);
|
|
|
|
- fe->id2.i_data.id_count = cpu_to_le16(
|
|
- ocfs2_max_inline_data_with_xattr(osb->sb, fe));
|
|
+ fe->id2.i_data.id_count = cpu_to_le16(ocfs2_max_inline_data(osb->sb));
|
|
} else {
|
|
fel = &fe->id2.i_list;
|
|
fel->l_tree_depth = 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/ocfs2_fs.h linux-2.6.29-rc3.owrt/fs/ocfs2/ocfs2_fs.h
|
|
--- linux-2.6.29.owrt/fs/ocfs2/ocfs2_fs.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/ocfs2_fs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1070,6 +1070,12 @@
|
|
offsetof(struct ocfs2_dinode, id2.i_symlink);
|
|
}
|
|
|
|
+static inline int ocfs2_max_inline_data(struct super_block *sb)
|
|
+{
|
|
+ return sb->s_blocksize -
|
|
+ offsetof(struct ocfs2_dinode, id2.i_data.id_data);
|
|
+}
|
|
+
|
|
static inline int ocfs2_max_inline_data_with_xattr(struct super_block *sb,
|
|
struct ocfs2_dinode *di)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/ocfs2.h linux-2.6.29-rc3.owrt/fs/ocfs2/ocfs2.h
|
|
--- linux-2.6.29.owrt/fs/ocfs2/ocfs2.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/ocfs2.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -210,7 +210,6 @@
|
|
struct ocfs2_slot_info;
|
|
struct ocfs2_recovery_map;
|
|
struct ocfs2_quota_recovery;
|
|
-struct ocfs2_dentry_lock;
|
|
struct ocfs2_super
|
|
{
|
|
struct task_struct *commit_task;
|
|
@@ -326,11 +325,6 @@
|
|
struct list_head blocked_lock_list;
|
|
unsigned long blocked_lock_count;
|
|
|
|
- /* List of dentry locks to release. Anyone can add locks to
|
|
- * the list, ocfs2_wq processes the list */
|
|
- struct ocfs2_dentry_lock *dentry_lock_list;
|
|
- struct work_struct dentry_lock_work;
|
|
-
|
|
wait_queue_head_t osb_mount_event;
|
|
|
|
/* Truncate log info */
|
|
@@ -341,9 +335,6 @@
|
|
struct ocfs2_node_map osb_recovering_orphan_dirs;
|
|
unsigned int *osb_orphan_wipes;
|
|
wait_queue_head_t osb_wipe_event;
|
|
-
|
|
- /* used to protect metaecc calculation check of xattr. */
|
|
- spinlock_t osb_xattr_lock;
|
|
};
|
|
|
|
#define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/quota_global.c linux-2.6.29-rc3.owrt/fs/ocfs2/quota_global.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/quota_global.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/quota_global.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -754,9 +754,7 @@
|
|
if (dquot->dq_flags & mask)
|
|
sync = 1;
|
|
spin_unlock(&dq_data_lock);
|
|
- /* This is a slight hack but we can't afford getting global quota
|
|
- * lock if we already have a transaction started. */
|
|
- if (!sync || journal_current_handle()) {
|
|
+ if (!sync) {
|
|
status = ocfs2_write_dquot(dquot);
|
|
goto out;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/super.c linux-2.6.29-rc3.owrt/fs/ocfs2/super.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1537,13 +1537,6 @@
|
|
unlock_buffer(*bh);
|
|
ll_rw_block(READ, 1, bh);
|
|
wait_on_buffer(*bh);
|
|
- if (!buffer_uptodate(*bh)) {
|
|
- mlog_errno(-EIO);
|
|
- brelse(*bh);
|
|
- *bh = NULL;
|
|
- return -EIO;
|
|
- }
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -1754,7 +1747,6 @@
|
|
INIT_LIST_HEAD(&osb->blocked_lock_list);
|
|
osb->blocked_lock_count = 0;
|
|
spin_lock_init(&osb->osb_lock);
|
|
- spin_lock_init(&osb->osb_xattr_lock);
|
|
ocfs2_init_inode_steal_slot(osb);
|
|
|
|
atomic_set(&osb->alloc_stats.moves, 0);
|
|
@@ -1895,9 +1887,6 @@
|
|
INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery);
|
|
journal->j_state = OCFS2_JOURNAL_FREE;
|
|
|
|
- INIT_WORK(&osb->dentry_lock_work, ocfs2_drop_dl_inodes);
|
|
- osb->dentry_lock_list = NULL;
|
|
-
|
|
/* get some pseudo constants for clustersize bits */
|
|
osb->s_clustersize_bits =
|
|
le32_to_cpu(di->id2.i_super.s_clustersize_bits);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ocfs2/xattr.c linux-2.6.29-rc3.owrt/fs/ocfs2/xattr.c
|
|
--- linux-2.6.29.owrt/fs/ocfs2/xattr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ocfs2/xattr.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -82,14 +82,13 @@
|
|
|
|
#define OCFS2_XATTR_ROOT_SIZE (sizeof(struct ocfs2_xattr_def_value_root))
|
|
#define OCFS2_XATTR_INLINE_SIZE 80
|
|
-#define OCFS2_XATTR_HEADER_GAP 4
|
|
#define OCFS2_XATTR_FREE_IN_IBODY (OCFS2_MIN_XATTR_INLINE_SIZE \
|
|
- sizeof(struct ocfs2_xattr_header) \
|
|
- - OCFS2_XATTR_HEADER_GAP)
|
|
+ - sizeof(__u32))
|
|
#define OCFS2_XATTR_FREE_IN_BLOCK(ptr) ((ptr)->i_sb->s_blocksize \
|
|
- sizeof(struct ocfs2_xattr_block) \
|
|
- sizeof(struct ocfs2_xattr_header) \
|
|
- - OCFS2_XATTR_HEADER_GAP)
|
|
+ - sizeof(__u32))
|
|
|
|
static struct ocfs2_xattr_def_value_root def_xv = {
|
|
.xv.xr_list.l_count = cpu_to_le16(1),
|
|
@@ -275,12 +274,10 @@
|
|
bucket->bu_blocks, bucket->bu_bhs, 0,
|
|
NULL);
|
|
if (!rc) {
|
|
- spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
|
|
rc = ocfs2_validate_meta_ecc_bhs(bucket->bu_inode->i_sb,
|
|
bucket->bu_bhs,
|
|
bucket->bu_blocks,
|
|
&bucket_xh(bucket)->xh_check);
|
|
- spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
|
|
if (rc)
|
|
mlog_errno(rc);
|
|
}
|
|
@@ -313,11 +310,9 @@
|
|
{
|
|
int i;
|
|
|
|
- spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
|
|
ocfs2_compute_meta_ecc_bhs(bucket->bu_inode->i_sb,
|
|
bucket->bu_bhs, bucket->bu_blocks,
|
|
&bucket_xh(bucket)->xh_check);
|
|
- spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
|
|
|
|
for (i = 0; i < bucket->bu_blocks; i++)
|
|
ocfs2_journal_dirty(handle, bucket->bu_bhs[i]);
|
|
@@ -547,12 +542,8 @@
|
|
* when blocksize = 512, may reserve one more cluser for
|
|
* xattr bucket, otherwise reserve one metadata block
|
|
* for them is ok.
|
|
- * If this is a new directory with inline data,
|
|
- * we choose to reserve the entire inline area for
|
|
- * directory contents and force an external xattr block.
|
|
*/
|
|
if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE ||
|
|
- (S_ISDIR(mode) && ocfs2_supports_inline_data(osb)) ||
|
|
(s_size + a_size) > OCFS2_XATTR_FREE_IN_IBODY) {
|
|
ret = ocfs2_reserve_new_metadata_blocks(osb, 1, xattr_ac);
|
|
if (ret) {
|
|
@@ -1516,7 +1507,7 @@
|
|
last += 1;
|
|
}
|
|
|
|
- free = min_offs - ((void *)last - xs->base) - OCFS2_XATTR_HEADER_GAP;
|
|
+ free = min_offs - ((void *)last - xs->base) - sizeof(__u32);
|
|
if (free < 0)
|
|
return -EIO;
|
|
|
|
@@ -2199,7 +2190,7 @@
|
|
last += 1;
|
|
}
|
|
|
|
- free = min_offs - ((void *)last - xs->base) - OCFS2_XATTR_HEADER_GAP;
|
|
+ free = min_offs - ((void *)last - xs->base) - sizeof(__u32);
|
|
if (free < 0)
|
|
return 0;
|
|
|
|
@@ -2601,9 +2592,8 @@
|
|
|
|
if (!ret) {
|
|
/* Update inode ctime. */
|
|
- ret = ocfs2_journal_access_di(ctxt->handle, inode,
|
|
- xis->inode_bh,
|
|
- OCFS2_JOURNAL_ACCESS_WRITE);
|
|
+ ret = ocfs2_journal_access(ctxt->handle, inode, xis->inode_bh,
|
|
+ OCFS2_JOURNAL_ACCESS_WRITE);
|
|
if (ret) {
|
|
mlog_errno(ret);
|
|
goto out;
|
|
@@ -4739,6 +4729,13 @@
|
|
vb.vb_xv = (struct ocfs2_xattr_value_root *)
|
|
(vb.vb_bh->b_data + offset % blocksize);
|
|
|
|
+ ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket,
|
|
+ OCFS2_JOURNAL_ACCESS_WRITE);
|
|
+ if (ret) {
|
|
+ mlog_errno(ret);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
/*
|
|
* From here on out we have to dirty the bucket. The generic
|
|
* value calls only modify one of the bucket's bhs, but we need
|
|
@@ -4751,18 +4748,12 @@
|
|
ret = ocfs2_xattr_value_truncate(inode, &vb, len, ctxt);
|
|
if (ret) {
|
|
mlog_errno(ret);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket,
|
|
- OCFS2_JOURNAL_ACCESS_WRITE);
|
|
- if (ret) {
|
|
- mlog_errno(ret);
|
|
- goto out;
|
|
+ goto out_dirty;
|
|
}
|
|
|
|
xe->xe_value_size = cpu_to_le64(len);
|
|
|
|
+out_dirty:
|
|
ocfs2_xattr_bucket_journal_dirty(ctxt->handle, bucket);
|
|
|
|
out:
|
|
@@ -4795,33 +4786,19 @@
|
|
char *val,
|
|
int value_len)
|
|
{
|
|
- int ret, offset, block_off;
|
|
+ int offset;
|
|
struct ocfs2_xattr_value_root *xv;
|
|
struct ocfs2_xattr_entry *xe = xs->here;
|
|
- struct ocfs2_xattr_header *xh = bucket_xh(xs->bucket);
|
|
- void *base;
|
|
|
|
BUG_ON(!xs->base || !xe || ocfs2_xattr_is_local(xe));
|
|
|
|
- ret = ocfs2_xattr_bucket_get_name_value(inode, xh,
|
|
- xe - xh->xh_entries,
|
|
- &block_off,
|
|
- &offset);
|
|
- if (ret) {
|
|
- mlog_errno(ret);
|
|
- goto out;
|
|
- }
|
|
+ offset = le16_to_cpu(xe->xe_name_offset) +
|
|
+ OCFS2_XATTR_SIZE(xe->xe_name_len);
|
|
|
|
- base = bucket_block(xs->bucket, block_off);
|
|
- xv = (struct ocfs2_xattr_value_root *)(base + offset +
|
|
- OCFS2_XATTR_SIZE(xe->xe_name_len));
|
|
+ xv = (struct ocfs2_xattr_value_root *)(xs->base + offset);
|
|
|
|
- ret = __ocfs2_xattr_set_value_outside(inode, handle,
|
|
- xv, val, value_len);
|
|
- if (ret)
|
|
- mlog_errno(ret);
|
|
-out:
|
|
- return ret;
|
|
+ return __ocfs2_xattr_set_value_outside(inode, handle,
|
|
+ xv, val, value_len);
|
|
}
|
|
|
|
static int ocfs2_rm_xattr_cluster(struct inode *inode,
|
|
@@ -5084,8 +5061,8 @@
|
|
xh_free_start = le16_to_cpu(xh->xh_free_start);
|
|
header_size = sizeof(struct ocfs2_xattr_header) +
|
|
count * sizeof(struct ocfs2_xattr_entry);
|
|
- max_free = OCFS2_XATTR_BUCKET_SIZE - header_size -
|
|
- le16_to_cpu(xh->xh_name_value_len) - OCFS2_XATTR_HEADER_GAP;
|
|
+ max_free = OCFS2_XATTR_BUCKET_SIZE -
|
|
+ le16_to_cpu(xh->xh_name_value_len) - header_size;
|
|
|
|
mlog_bug_on_msg(header_size > blocksize, "bucket %llu has header size "
|
|
"of %u which exceed block size\n",
|
|
@@ -5118,7 +5095,7 @@
|
|
need = 0;
|
|
}
|
|
|
|
- free = xh_free_start - header_size - OCFS2_XATTR_HEADER_GAP;
|
|
+ free = xh_free_start - header_size;
|
|
/*
|
|
* We need to make sure the new name/value pair
|
|
* can exist in the same block.
|
|
@@ -5151,8 +5128,7 @@
|
|
}
|
|
|
|
xh_free_start = le16_to_cpu(xh->xh_free_start);
|
|
- free = xh_free_start - header_size
|
|
- - OCFS2_XATTR_HEADER_GAP;
|
|
+ free = xh_free_start - header_size;
|
|
if (xh_free_start % blocksize < need)
|
|
free -= xh_free_start % blocksize;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/pipe.c linux-2.6.29-rc3.owrt/fs/pipe.c
|
|
--- linux-2.6.29.owrt/fs/pipe.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/pipe.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -699,12 +699,12 @@
|
|
int retval;
|
|
|
|
mutex_lock(&inode->i_mutex);
|
|
+
|
|
retval = fasync_helper(fd, filp, on, &pipe->fasync_readers);
|
|
- if (retval >= 0) {
|
|
+
|
|
+ if (retval >= 0)
|
|
retval = fasync_helper(fd, filp, on, &pipe->fasync_writers);
|
|
- if (retval < 0) /* this can happen only if on == T */
|
|
- fasync_helper(-1, filp, 0, &pipe->fasync_readers);
|
|
- }
|
|
+
|
|
mutex_unlock(&inode->i_mutex);
|
|
|
|
if (retval < 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/proc/base.c linux-2.6.29-rc3.owrt/fs/proc/base.c
|
|
--- linux-2.6.29.owrt/fs/proc/base.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/proc/base.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -3066,6 +3066,7 @@
|
|
int retval = -ENOENT;
|
|
ino_t ino;
|
|
int tid;
|
|
+ unsigned long pos = filp->f_pos; /* avoiding "long long" filp->f_pos */
|
|
struct pid_namespace *ns;
|
|
|
|
task = get_proc_task(inode);
|
|
@@ -3082,18 +3083,18 @@
|
|
goto out_no_task;
|
|
retval = 0;
|
|
|
|
- switch ((unsigned long)filp->f_pos) {
|
|
+ switch (pos) {
|
|
case 0:
|
|
ino = inode->i_ino;
|
|
- if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) < 0)
|
|
+ if (filldir(dirent, ".", 1, pos, ino, DT_DIR) < 0)
|
|
goto out;
|
|
- filp->f_pos++;
|
|
+ pos++;
|
|
/* fall through */
|
|
case 1:
|
|
ino = parent_ino(dentry);
|
|
- if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) < 0)
|
|
+ if (filldir(dirent, "..", 2, pos, ino, DT_DIR) < 0)
|
|
goto out;
|
|
- filp->f_pos++;
|
|
+ pos++;
|
|
/* fall through */
|
|
}
|
|
|
|
@@ -3103,9 +3104,9 @@
|
|
ns = filp->f_dentry->d_sb->s_fs_info;
|
|
tid = (int)filp->f_version;
|
|
filp->f_version = 0;
|
|
- for (task = first_tid(leader, tid, filp->f_pos - 2, ns);
|
|
+ for (task = first_tid(leader, tid, pos - 2, ns);
|
|
task;
|
|
- task = next_tid(task), filp->f_pos++) {
|
|
+ task = next_tid(task), pos++) {
|
|
tid = task_pid_nr_ns(task, ns);
|
|
if (proc_task_fill_cache(filp, dirent, filldir, task, tid) < 0) {
|
|
/* returning this tgid failed, save it as the first
|
|
@@ -3116,6 +3117,7 @@
|
|
}
|
|
}
|
|
out:
|
|
+ filp->f_pos = pos;
|
|
put_task_struct(leader);
|
|
out_no_task:
|
|
return retval;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/proc/inode.c linux-2.6.29-rc3.owrt/fs/proc/inode.c
|
|
--- linux-2.6.29.owrt/fs/proc/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/proc/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -485,10 +485,8 @@
|
|
}
|
|
}
|
|
unlock_new_inode(inode);
|
|
- } else {
|
|
+ } else
|
|
module_put(de->owner);
|
|
- de_put(de);
|
|
- }
|
|
return inode;
|
|
|
|
out_ino:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/proc/page.c linux-2.6.29-rc3.owrt/fs/proc/page.c
|
|
--- linux-2.6.29.owrt/fs/proc/page.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/proc/page.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -80,7 +80,7 @@
|
|
#define KPF_RECLAIM 9
|
|
#define KPF_BUDDY 10
|
|
|
|
-#define kpf_copy_bit(flags, dstpos, srcpos) (((flags >> srcpos) & 1) << dstpos)
|
|
+#define kpf_copy_bit(flags, srcpos, dstpos) (((flags >> srcpos) & 1) << dstpos)
|
|
|
|
static ssize_t kpageflags_read(struct file *file, char __user *buf,
|
|
size_t count, loff_t *ppos)
|
|
@@ -107,7 +107,7 @@
|
|
else
|
|
kflags = ppage->flags;
|
|
|
|
- uflags = kpf_copy_bit(kflags, KPF_LOCKED, PG_locked) |
|
|
+ uflags = kpf_copy_bit(KPF_LOCKED, PG_locked, kflags) |
|
|
kpf_copy_bit(kflags, KPF_ERROR, PG_error) |
|
|
kpf_copy_bit(kflags, KPF_REFERENCED, PG_referenced) |
|
|
kpf_copy_bit(kflags, KPF_UPTODATE, PG_uptodate) |
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ramfs/file-nommu.c linux-2.6.29-rc3.owrt/fs/ramfs/file-nommu.c
|
|
--- linux-2.6.29.owrt/fs/ramfs/file-nommu.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ramfs/file-nommu.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -114,9 +114,6 @@
|
|
if (!pagevec_add(&lru_pvec, page))
|
|
__pagevec_lru_add_file(&lru_pvec);
|
|
|
|
- /* prevent the page from being discarded on memory pressure */
|
|
- SetPageDirty(page);
|
|
-
|
|
unlock_page(page);
|
|
}
|
|
|
|
@@ -129,7 +126,6 @@
|
|
return -EFBIG;
|
|
|
|
add_error:
|
|
- pagevec_lru_add_file(&lru_pvec);
|
|
page_cache_release(pages + loop);
|
|
for (loop++; loop < npages; loop++)
|
|
__free_page(pages + loop);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/seq_file.c linux-2.6.29-rc3.owrt/fs/seq_file.c
|
|
--- linux-2.6.29.owrt/fs/seq_file.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/seq_file.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -48,78 +48,12 @@
|
|
*/
|
|
file->f_version = 0;
|
|
|
|
- /*
|
|
- * seq_files support lseek() and pread(). They do not implement
|
|
- * write() at all, but we clear FMODE_PWRITE here for historical
|
|
- * reasons.
|
|
- *
|
|
- * If a client of seq_files a) implements file.write() and b) wishes to
|
|
- * support pwrite() then that client will need to implement its own
|
|
- * file.open() which calls seq_open() and then sets FMODE_PWRITE.
|
|
- */
|
|
- file->f_mode &= ~FMODE_PWRITE;
|
|
+ /* SEQ files support lseek, but not pread/pwrite */
|
|
+ file->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL(seq_open);
|
|
|
|
-static int traverse(struct seq_file *m, loff_t offset)
|
|
-{
|
|
- loff_t pos = 0, index;
|
|
- int error = 0;
|
|
- void *p;
|
|
-
|
|
- m->version = 0;
|
|
- index = 0;
|
|
- m->count = m->from = 0;
|
|
- if (!offset) {
|
|
- m->index = index;
|
|
- return 0;
|
|
- }
|
|
- if (!m->buf) {
|
|
- m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
|
|
- if (!m->buf)
|
|
- return -ENOMEM;
|
|
- }
|
|
- p = m->op->start(m, &index);
|
|
- while (p) {
|
|
- error = PTR_ERR(p);
|
|
- if (IS_ERR(p))
|
|
- break;
|
|
- error = m->op->show(m, p);
|
|
- if (error < 0)
|
|
- break;
|
|
- if (unlikely(error)) {
|
|
- error = 0;
|
|
- m->count = 0;
|
|
- }
|
|
- if (m->count == m->size)
|
|
- goto Eoverflow;
|
|
- if (pos + m->count > offset) {
|
|
- m->from = offset - pos;
|
|
- m->count -= m->from;
|
|
- m->index = index;
|
|
- break;
|
|
- }
|
|
- pos += m->count;
|
|
- m->count = 0;
|
|
- if (pos == offset) {
|
|
- index++;
|
|
- m->index = index;
|
|
- break;
|
|
- }
|
|
- p = m->op->next(m, p, &index);
|
|
- }
|
|
- m->op->stop(m, p);
|
|
- m->index = index;
|
|
- return error;
|
|
-
|
|
-Eoverflow:
|
|
- m->op->stop(m, p);
|
|
- kfree(m->buf);
|
|
- m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
|
|
- return !m->buf ? -ENOMEM : -EAGAIN;
|
|
-}
|
|
-
|
|
/**
|
|
* seq_read - ->read() method for sequential files.
|
|
* @file: the file to read from
|
|
@@ -139,22 +73,6 @@
|
|
int err = 0;
|
|
|
|
mutex_lock(&m->lock);
|
|
-
|
|
- /* Don't assume *ppos is where we left it */
|
|
- if (unlikely(*ppos != m->read_pos)) {
|
|
- m->read_pos = *ppos;
|
|
- while ((err = traverse(m, *ppos)) == -EAGAIN)
|
|
- ;
|
|
- if (err) {
|
|
- /* With prejudice... */
|
|
- m->read_pos = 0;
|
|
- m->version = 0;
|
|
- m->index = 0;
|
|
- m->count = 0;
|
|
- goto Done;
|
|
- }
|
|
- }
|
|
-
|
|
/*
|
|
* seq_file->op->..m_start/m_stop/m_next may do special actions
|
|
* or optimisations based on the file->f_version, so we want to
|
|
@@ -254,10 +172,8 @@
|
|
Done:
|
|
if (!copied)
|
|
copied = err;
|
|
- else {
|
|
+ else
|
|
*ppos += copied;
|
|
- m->read_pos += copied;
|
|
- }
|
|
file->f_version = m->version;
|
|
mutex_unlock(&m->lock);
|
|
return copied;
|
|
@@ -270,6 +186,63 @@
|
|
}
|
|
EXPORT_SYMBOL(seq_read);
|
|
|
|
+static int traverse(struct seq_file *m, loff_t offset)
|
|
+{
|
|
+ loff_t pos = 0, index;
|
|
+ int error = 0;
|
|
+ void *p;
|
|
+
|
|
+ m->version = 0;
|
|
+ index = 0;
|
|
+ m->count = m->from = 0;
|
|
+ if (!offset) {
|
|
+ m->index = index;
|
|
+ return 0;
|
|
+ }
|
|
+ if (!m->buf) {
|
|
+ m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
|
|
+ if (!m->buf)
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+ p = m->op->start(m, &index);
|
|
+ while (p) {
|
|
+ error = PTR_ERR(p);
|
|
+ if (IS_ERR(p))
|
|
+ break;
|
|
+ error = m->op->show(m, p);
|
|
+ if (error < 0)
|
|
+ break;
|
|
+ if (unlikely(error)) {
|
|
+ error = 0;
|
|
+ m->count = 0;
|
|
+ }
|
|
+ if (m->count == m->size)
|
|
+ goto Eoverflow;
|
|
+ if (pos + m->count > offset) {
|
|
+ m->from = offset - pos;
|
|
+ m->count -= m->from;
|
|
+ m->index = index;
|
|
+ break;
|
|
+ }
|
|
+ pos += m->count;
|
|
+ m->count = 0;
|
|
+ if (pos == offset) {
|
|
+ index++;
|
|
+ m->index = index;
|
|
+ break;
|
|
+ }
|
|
+ p = m->op->next(m, p, &index);
|
|
+ }
|
|
+ m->op->stop(m, p);
|
|
+ return error;
|
|
+
|
|
+Eoverflow:
|
|
+ m->op->stop(m, p);
|
|
+ kfree(m->buf);
|
|
+ m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
|
|
+ return !m->buf ? -ENOMEM : -EAGAIN;
|
|
+}
|
|
+
|
|
/**
|
|
* seq_lseek - ->llseek() method for sequential files.
|
|
* @file: the file in question
|
|
@@ -292,18 +265,16 @@
|
|
if (offset < 0)
|
|
break;
|
|
retval = offset;
|
|
- if (offset != m->read_pos) {
|
|
+ if (offset != file->f_pos) {
|
|
while ((retval=traverse(m, offset)) == -EAGAIN)
|
|
;
|
|
if (retval) {
|
|
/* with extreme prejudice... */
|
|
file->f_pos = 0;
|
|
- m->read_pos = 0;
|
|
m->version = 0;
|
|
m->index = 0;
|
|
m->count = 0;
|
|
} else {
|
|
- m->read_pos = offset;
|
|
retval = file->f_pos = offset;
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/squashfs/block.c linux-2.6.29-rc3.owrt/fs/squashfs/block.c
|
|
--- linux-2.6.29.owrt/fs/squashfs/block.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/squashfs/block.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -80,7 +80,7 @@
|
|
* generated a larger block - this does occasionally happen with zlib).
|
|
*/
|
|
int squashfs_read_data(struct super_block *sb, void **buffer, u64 index,
|
|
- int length, u64 *next_index, int srclength, int pages)
|
|
+ int length, u64 *next_index, int srclength)
|
|
{
|
|
struct squashfs_sb_info *msblk = sb->s_fs_info;
|
|
struct buffer_head **bh;
|
|
@@ -184,7 +184,7 @@
|
|
offset = 0;
|
|
}
|
|
|
|
- if (msblk->stream.avail_out == 0 && page < pages) {
|
|
+ if (msblk->stream.avail_out == 0) {
|
|
msblk->stream.next_out = buffer[page++];
|
|
msblk->stream.avail_out = PAGE_CACHE_SIZE;
|
|
}
|
|
@@ -201,20 +201,25 @@
|
|
zlib_init = 1;
|
|
}
|
|
|
|
- zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_FLUSH);
|
|
+ zlib_err = zlib_inflate(&msblk->stream, Z_NO_FLUSH);
|
|
|
|
if (msblk->stream.avail_in == 0 && k < b)
|
|
put_bh(bh[k++]);
|
|
} while (zlib_err == Z_OK);
|
|
|
|
if (zlib_err != Z_STREAM_END) {
|
|
- ERROR("zlib_inflate error, data probably corrupt\n");
|
|
+ ERROR("zlib_inflate returned unexpected result"
|
|
+ " 0x%x, srclength %d, avail_in %d,"
|
|
+ " avail_out %d\n", zlib_err, srclength,
|
|
+ msblk->stream.avail_in,
|
|
+ msblk->stream.avail_out);
|
|
goto release_mutex;
|
|
}
|
|
|
|
zlib_err = zlib_inflateEnd(&msblk->stream);
|
|
if (zlib_err != Z_OK) {
|
|
- ERROR("zlib_inflate error, data probably corrupt\n");
|
|
+ ERROR("zlib_inflateEnd returned unexpected result 0x%x,"
|
|
+ " srclength %d\n", zlib_err, srclength);
|
|
goto release_mutex;
|
|
}
|
|
length = msblk->stream.total_out;
|
|
@@ -263,8 +268,7 @@
|
|
put_bh(bh[k]);
|
|
|
|
read_failure:
|
|
- ERROR("squashfs_read_data failed to read block 0x%llx\n",
|
|
- (unsigned long long) index);
|
|
+ ERROR("sb_bread failed reading block 0x%llx\n", cur_index);
|
|
kfree(bh);
|
|
return -EIO;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/squashfs/cache.c linux-2.6.29-rc3.owrt/fs/squashfs/cache.c
|
|
--- linux-2.6.29.owrt/fs/squashfs/cache.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/squashfs/cache.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -119,7 +119,7 @@
|
|
|
|
entry->length = squashfs_read_data(sb, entry->data,
|
|
block, length, &entry->next_index,
|
|
- cache->block_size, cache->pages);
|
|
+ cache->block_size);
|
|
|
|
spin_lock(&cache->lock);
|
|
|
|
@@ -406,7 +406,7 @@
|
|
for (i = 0; i < pages; i++, buffer += PAGE_CACHE_SIZE)
|
|
data[i] = buffer;
|
|
res = squashfs_read_data(sb, data, block, length |
|
|
- SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length, pages);
|
|
+ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length);
|
|
kfree(data);
|
|
return res;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/squashfs/inode.c linux-2.6.29-rc3.owrt/fs/squashfs/inode.c
|
|
--- linux-2.6.29.owrt/fs/squashfs/inode.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/squashfs/inode.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -133,8 +133,7 @@
|
|
type = le16_to_cpu(sqshb_ino->inode_type);
|
|
switch (type) {
|
|
case SQUASHFS_REG_TYPE: {
|
|
- unsigned int frag_offset, frag;
|
|
- int frag_size;
|
|
+ unsigned int frag_offset, frag_size, frag;
|
|
u64 frag_blk;
|
|
struct squashfs_reg_inode *sqsh_ino = &squashfs_ino.reg;
|
|
|
|
@@ -176,8 +175,7 @@
|
|
break;
|
|
}
|
|
case SQUASHFS_LREG_TYPE: {
|
|
- unsigned int frag_offset, frag;
|
|
- int frag_size;
|
|
+ unsigned int frag_offset, frag_size, frag;
|
|
u64 frag_blk;
|
|
struct squashfs_lreg_inode *sqsh_ino = &squashfs_ino.lreg;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/squashfs/squashfs.h linux-2.6.29-rc3.owrt/fs/squashfs/squashfs.h
|
|
--- linux-2.6.29.owrt/fs/squashfs/squashfs.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/squashfs/squashfs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -34,7 +34,7 @@
|
|
|
|
/* block.c */
|
|
extern int squashfs_read_data(struct super_block *, void **, u64, int, u64 *,
|
|
- int, int);
|
|
+ int);
|
|
|
|
/* cache.c */
|
|
extern struct squashfs_cache *squashfs_cache_init(char *, int, int);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/squashfs/super.c linux-2.6.29-rc3.owrt/fs/squashfs/super.c
|
|
--- linux-2.6.29.owrt/fs/squashfs/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/squashfs/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -389,7 +389,7 @@
|
|
return err;
|
|
}
|
|
|
|
- printk(KERN_INFO "squashfs: version 4.0 (2009/01/31) "
|
|
+ printk(KERN_INFO "squashfs: version 4.0 (2009/01/03) "
|
|
"Phillip Lougher\n");
|
|
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/super.c linux-2.6.29-rc3.owrt/fs/super.c
|
|
--- linux-2.6.29.owrt/fs/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -82,22 +82,7 @@
|
|
* lock ordering than usbfs:
|
|
*/
|
|
lockdep_set_class(&s->s_lock, &type->s_lock_key);
|
|
- /*
|
|
- * sget() can have s_umount recursion.
|
|
- *
|
|
- * When it cannot find a suitable sb, it allocates a new
|
|
- * one (this one), and tries again to find a suitable old
|
|
- * one.
|
|
- *
|
|
- * In case that succeeds, it will acquire the s_umount
|
|
- * lock of the old one. Since these are clearly distrinct
|
|
- * locks, and this object isn't exposed yet, there's no
|
|
- * risk of deadlocks.
|
|
- *
|
|
- * Annotate this by putting this lock in a different
|
|
- * subclass.
|
|
- */
|
|
- down_write_nested(&s->s_umount, SINGLE_DEPTH_NESTING);
|
|
+ down_write(&s->s_umount);
|
|
s->s_count = S_BIAS;
|
|
atomic_set(&s->s_active, 1);
|
|
mutex_init(&s->s_vfs_rename_mutex);
|
|
@@ -316,7 +301,7 @@
|
|
/*
|
|
* wait for asynchronous fs operations to finish before going further
|
|
*/
|
|
- async_synchronize_full_domain(&sb->s_async_list);
|
|
+ async_synchronize_full_special(&sb->s_async_list);
|
|
|
|
/* bad name - it should be evict_inodes() */
|
|
invalidate_inodes(sb);
|
|
@@ -371,10 +356,8 @@
|
|
continue;
|
|
if (!grab_super(old))
|
|
goto retry;
|
|
- if (s) {
|
|
- up_write(&s->s_umount);
|
|
+ if (s)
|
|
destroy_super(s);
|
|
- }
|
|
return old;
|
|
}
|
|
}
|
|
@@ -389,7 +372,6 @@
|
|
err = set(s, data);
|
|
if (err) {
|
|
spin_unlock(&sb_lock);
|
|
- up_write(&s->s_umount);
|
|
destroy_super(s);
|
|
return ERR_PTR(err);
|
|
}
|
|
@@ -488,7 +470,7 @@
|
|
sb->s_count++;
|
|
spin_unlock(&sb_lock);
|
|
down_read(&sb->s_umount);
|
|
- async_synchronize_full_domain(&sb->s_async_list);
|
|
+ async_synchronize_full_special(&sb->s_async_list);
|
|
if (sb->s_root && (wait || sb->s_dirt))
|
|
sb->s_op->sync_fs(sb, wait);
|
|
up_read(&sb->s_umount);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/timerfd.c linux-2.6.29-rc3.owrt/fs/timerfd.c
|
|
--- linux-2.6.29.owrt/fs/timerfd.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/timerfd.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -186,9 +186,10 @@
|
|
BUILD_BUG_ON(TFD_CLOEXEC != O_CLOEXEC);
|
|
BUILD_BUG_ON(TFD_NONBLOCK != O_NONBLOCK);
|
|
|
|
- if ((flags & ~TFD_CREATE_FLAGS) ||
|
|
- (clockid != CLOCK_MONOTONIC &&
|
|
- clockid != CLOCK_REALTIME))
|
|
+ if (flags & ~(TFD_CLOEXEC | TFD_NONBLOCK))
|
|
+ return -EINVAL;
|
|
+ if (clockid != CLOCK_MONOTONIC &&
|
|
+ clockid != CLOCK_REALTIME)
|
|
return -EINVAL;
|
|
|
|
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
|
@@ -200,7 +201,7 @@
|
|
hrtimer_init(&ctx->tmr, clockid, HRTIMER_MODE_ABS);
|
|
|
|
ufd = anon_inode_getfd("[timerfd]", &timerfd_fops, ctx,
|
|
- flags & TFD_SHARED_FCNTL_FLAGS);
|
|
+ flags & (O_CLOEXEC | O_NONBLOCK));
|
|
if (ufd < 0)
|
|
kfree(ctx);
|
|
|
|
@@ -218,8 +219,7 @@
|
|
if (copy_from_user(&ktmr, utmr, sizeof(ktmr)))
|
|
return -EFAULT;
|
|
|
|
- if ((flags & ~TFD_SETTIME_FLAGS) ||
|
|
- !timespec_valid(&ktmr.it_value) ||
|
|
+ if (!timespec_valid(&ktmr.it_value) ||
|
|
!timespec_valid(&ktmr.it_interval))
|
|
return -EINVAL;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/budget.c linux-2.6.29-rc3.owrt/fs/ubifs/budget.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/budget.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/budget.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -689,7 +689,7 @@
|
|
}
|
|
|
|
/**
|
|
- * ubifs_get_free_space_nolock - return amount of free space.
|
|
+ * ubifs_get_free_space - return amount of free space.
|
|
* @c: UBIFS file-system description object
|
|
*
|
|
* This function calculates amount of free space to report to user-space.
|
|
@@ -704,14 +704,16 @@
|
|
* traditional file-systems, because they have way less overhead than UBIFS.
|
|
* So, to keep users happy, UBIFS tries to take the overhead into account.
|
|
*/
|
|
-long long ubifs_get_free_space_nolock(struct ubifs_info *c)
|
|
+long long ubifs_get_free_space(struct ubifs_info *c)
|
|
{
|
|
- int rsvd_idx_lebs, lebs;
|
|
+ int min_idx_lebs, rsvd_idx_lebs, lebs;
|
|
long long available, outstanding, free;
|
|
|
|
- ubifs_assert(c->min_idx_lebs == ubifs_calc_min_idx_lebs(c));
|
|
+ spin_lock(&c->space_lock);
|
|
+ min_idx_lebs = c->min_idx_lebs;
|
|
+ ubifs_assert(min_idx_lebs == ubifs_calc_min_idx_lebs(c));
|
|
outstanding = c->budg_data_growth + c->budg_dd_growth;
|
|
- available = ubifs_calc_available(c, c->min_idx_lebs);
|
|
+ available = ubifs_calc_available(c, min_idx_lebs);
|
|
|
|
/*
|
|
* When reporting free space to user-space, UBIFS guarantees that it is
|
|
@@ -724,14 +726,15 @@
|
|
* Note, the calculations below are similar to what we have in
|
|
* 'do_budget_space()', so refer there for comments.
|
|
*/
|
|
- if (c->min_idx_lebs > c->lst.idx_lebs)
|
|
- rsvd_idx_lebs = c->min_idx_lebs - c->lst.idx_lebs;
|
|
+ if (min_idx_lebs > c->lst.idx_lebs)
|
|
+ rsvd_idx_lebs = min_idx_lebs - c->lst.idx_lebs;
|
|
else
|
|
rsvd_idx_lebs = 0;
|
|
lebs = c->lst.empty_lebs + c->freeable_cnt + c->idx_gc_cnt -
|
|
c->lst.taken_empty_lebs;
|
|
lebs -= rsvd_idx_lebs;
|
|
available += lebs * (c->dark_wm - c->leb_overhead);
|
|
+ spin_unlock(&c->space_lock);
|
|
|
|
if (available > outstanding)
|
|
free = ubifs_reported_space(c, available - outstanding);
|
|
@@ -739,21 +742,3 @@
|
|
free = 0;
|
|
return free;
|
|
}
|
|
-
|
|
-/**
|
|
- * ubifs_get_free_space - return amount of free space.
|
|
- * @c: UBIFS file-system description object
|
|
- *
|
|
- * This function calculates and retuns amount of free space to report to
|
|
- * user-space.
|
|
- */
|
|
-long long ubifs_get_free_space(struct ubifs_info *c)
|
|
-{
|
|
- long long free;
|
|
-
|
|
- spin_lock(&c->space_lock);
|
|
- free = ubifs_get_free_space_nolock(c);
|
|
- spin_unlock(&c->space_lock);
|
|
-
|
|
- return free;
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/debug.c linux-2.6.29-rc3.owrt/fs/ubifs/debug.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/debug.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/debug.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -620,11 +620,9 @@
|
|
c->dark_wm, c->dead_wm, c->max_idx_node_sz);
|
|
printk(KERN_DEBUG "\tgc_lnum %d, ihead_lnum %d\n",
|
|
c->gc_lnum, c->ihead_lnum);
|
|
- /* If we are in R/O mode, journal heads do not exist */
|
|
- if (c->jheads)
|
|
- for (i = 0; i < c->jhead_cnt; i++)
|
|
- printk(KERN_DEBUG "\tjhead %d\t LEB %d\n",
|
|
- c->jheads[i].wbuf.jhead, c->jheads[i].wbuf.lnum);
|
|
+ for (i = 0; i < c->jhead_cnt; i++)
|
|
+ printk(KERN_DEBUG "\tjhead %d\t LEB %d\n",
|
|
+ c->jheads[i].wbuf.jhead, c->jheads[i].wbuf.lnum);
|
|
for (rb = rb_first(&c->buds); rb; rb = rb_next(rb)) {
|
|
bud = rb_entry(rb, struct ubifs_bud, rb);
|
|
printk(KERN_DEBUG "\tbud LEB %d\n", bud->lnum);
|
|
@@ -639,7 +637,10 @@
|
|
/* Print budgeting predictions */
|
|
available = ubifs_calc_available(c, c->min_idx_lebs);
|
|
outstanding = c->budg_data_growth + c->budg_dd_growth;
|
|
- free = ubifs_get_free_space_nolock(c);
|
|
+ if (available > outstanding)
|
|
+ free = ubifs_reported_space(c, available - outstanding);
|
|
+ else
|
|
+ free = 0;
|
|
printk(KERN_DEBUG "Budgeting predictions:\n");
|
|
printk(KERN_DEBUG "\tavailable: %lld, outstanding %lld, free %lld\n",
|
|
available, outstanding, free);
|
|
@@ -860,65 +861,6 @@
|
|
}
|
|
|
|
/**
|
|
- * dbg_save_space_info - save information about flash space.
|
|
- * @c: UBIFS file-system description object
|
|
- *
|
|
- * This function saves information about UBIFS free space, dirty space, etc, in
|
|
- * order to check it later.
|
|
- */
|
|
-void dbg_save_space_info(struct ubifs_info *c)
|
|
-{
|
|
- struct ubifs_debug_info *d = c->dbg;
|
|
-
|
|
- ubifs_get_lp_stats(c, &d->saved_lst);
|
|
-
|
|
- spin_lock(&c->space_lock);
|
|
- d->saved_free = ubifs_get_free_space_nolock(c);
|
|
- spin_unlock(&c->space_lock);
|
|
-}
|
|
-
|
|
-/**
|
|
- * dbg_check_space_info - check flash space information.
|
|
- * @c: UBIFS file-system description object
|
|
- *
|
|
- * This function compares current flash space information with the information
|
|
- * which was saved when the 'dbg_save_space_info()' function was called.
|
|
- * Returns zero if the information has not changed, and %-EINVAL it it has
|
|
- * changed.
|
|
- */
|
|
-int dbg_check_space_info(struct ubifs_info *c)
|
|
-{
|
|
- struct ubifs_debug_info *d = c->dbg;
|
|
- struct ubifs_lp_stats lst;
|
|
- long long avail, free;
|
|
-
|
|
- spin_lock(&c->space_lock);
|
|
- avail = ubifs_calc_available(c, c->min_idx_lebs);
|
|
- spin_unlock(&c->space_lock);
|
|
- free = ubifs_get_free_space(c);
|
|
-
|
|
- if (free != d->saved_free) {
|
|
- ubifs_err("free space changed from %lld to %lld",
|
|
- d->saved_free, free);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-
|
|
-out:
|
|
- ubifs_msg("saved lprops statistics dump");
|
|
- dbg_dump_lstats(&d->saved_lst);
|
|
- ubifs_get_lp_stats(c, &lst);
|
|
- ubifs_msg("current lprops statistics dump");
|
|
- dbg_dump_lstats(&d->saved_lst);
|
|
- spin_lock(&c->space_lock);
|
|
- dbg_dump_budg(c);
|
|
- spin_unlock(&c->space_lock);
|
|
- dump_stack();
|
|
- return -EINVAL;
|
|
-}
|
|
-
|
|
-/**
|
|
* dbg_check_synced_i_size - check synchronized inode size.
|
|
* @inode: inode to check
|
|
*
|
|
@@ -1407,7 +1349,7 @@
|
|
* @c: UBIFS file-system description object
|
|
* @leaf_cb: called for each leaf node
|
|
* @znode_cb: called for each indexing node
|
|
- * @priv: private data which is passed to callbacks
|
|
+ * @priv: private date which is passed to callbacks
|
|
*
|
|
* This function walks the UBIFS index and calls the @leaf_cb for each leaf
|
|
* node and @znode_cb for each indexing node. Returns zero in case of success
|
|
@@ -2467,7 +2409,7 @@
|
|
* Root directory for UBIFS stuff in debugfs. Contains sub-directories which
|
|
* contain the stuff specific to particular file-system mounts.
|
|
*/
|
|
-static struct dentry *dfs_rootdir;
|
|
+static struct dentry *debugfs_rootdir;
|
|
|
|
/**
|
|
* dbg_debugfs_init - initialize debugfs file-system.
|
|
@@ -2479,9 +2421,9 @@
|
|
*/
|
|
int dbg_debugfs_init(void)
|
|
{
|
|
- dfs_rootdir = debugfs_create_dir("ubifs", NULL);
|
|
- if (IS_ERR(dfs_rootdir)) {
|
|
- int err = PTR_ERR(dfs_rootdir);
|
|
+ debugfs_rootdir = debugfs_create_dir("ubifs", NULL);
|
|
+ if (IS_ERR(debugfs_rootdir)) {
|
|
+ int err = PTR_ERR(debugfs_rootdir);
|
|
ubifs_err("cannot create \"ubifs\" debugfs directory, "
|
|
"error %d\n", err);
|
|
return err;
|
|
@@ -2495,7 +2437,7 @@
|
|
*/
|
|
void dbg_debugfs_exit(void)
|
|
{
|
|
- debugfs_remove(dfs_rootdir);
|
|
+ debugfs_remove(debugfs_rootdir);
|
|
}
|
|
|
|
static int open_debugfs_file(struct inode *inode, struct file *file)
|
|
@@ -2510,13 +2452,13 @@
|
|
struct ubifs_info *c = file->private_data;
|
|
struct ubifs_debug_info *d = c->dbg;
|
|
|
|
- if (file->f_path.dentry == d->dfs_dump_lprops)
|
|
+ if (file->f_path.dentry == d->dump_lprops)
|
|
dbg_dump_lprops(c);
|
|
- else if (file->f_path.dentry == d->dfs_dump_budg) {
|
|
+ else if (file->f_path.dentry == d->dump_budg) {
|
|
spin_lock(&c->space_lock);
|
|
dbg_dump_budg(c);
|
|
spin_unlock(&c->space_lock);
|
|
- } else if (file->f_path.dentry == d->dfs_dump_tnc) {
|
|
+ } else if (file->f_path.dentry == d->dump_tnc) {
|
|
mutex_lock(&c->tnc_mutex);
|
|
dbg_dump_tnc(c);
|
|
mutex_unlock(&c->tnc_mutex);
|
|
@@ -2527,7 +2469,7 @@
|
|
return count;
|
|
}
|
|
|
|
-static const struct file_operations dfs_fops = {
|
|
+static const struct file_operations debugfs_fops = {
|
|
.open = open_debugfs_file,
|
|
.write = write_debugfs_file,
|
|
.owner = THIS_MODULE,
|
|
@@ -2552,32 +2494,36 @@
|
|
struct dentry *dent;
|
|
struct ubifs_debug_info *d = c->dbg;
|
|
|
|
- sprintf(d->dfs_dir_name, "ubi%d_%d", c->vi.ubi_num, c->vi.vol_id);
|
|
- d->dfs_dir = debugfs_create_dir(d->dfs_dir_name, dfs_rootdir);
|
|
- if (IS_ERR(d->dfs_dir)) {
|
|
- err = PTR_ERR(d->dfs_dir);
|
|
+ sprintf(d->debugfs_dir_name, "ubi%d_%d", c->vi.ubi_num, c->vi.vol_id);
|
|
+ d->debugfs_dir = debugfs_create_dir(d->debugfs_dir_name,
|
|
+ debugfs_rootdir);
|
|
+ if (IS_ERR(d->debugfs_dir)) {
|
|
+ err = PTR_ERR(d->debugfs_dir);
|
|
ubifs_err("cannot create \"%s\" debugfs directory, error %d\n",
|
|
- d->dfs_dir_name, err);
|
|
+ d->debugfs_dir_name, err);
|
|
goto out;
|
|
}
|
|
|
|
fname = "dump_lprops";
|
|
- dent = debugfs_create_file(fname, S_IWUGO, d->dfs_dir, c, &dfs_fops);
|
|
+ dent = debugfs_create_file(fname, S_IWUGO, d->debugfs_dir, c,
|
|
+ &debugfs_fops);
|
|
if (IS_ERR(dent))
|
|
goto out_remove;
|
|
- d->dfs_dump_lprops = dent;
|
|
+ d->dump_lprops = dent;
|
|
|
|
fname = "dump_budg";
|
|
- dent = debugfs_create_file(fname, S_IWUGO, d->dfs_dir, c, &dfs_fops);
|
|
+ dent = debugfs_create_file(fname, S_IWUGO, d->debugfs_dir, c,
|
|
+ &debugfs_fops);
|
|
if (IS_ERR(dent))
|
|
goto out_remove;
|
|
- d->dfs_dump_budg = dent;
|
|
+ d->dump_budg = dent;
|
|
|
|
fname = "dump_tnc";
|
|
- dent = debugfs_create_file(fname, S_IWUGO, d->dfs_dir, c, &dfs_fops);
|
|
+ dent = debugfs_create_file(fname, S_IWUGO, d->debugfs_dir, c,
|
|
+ &debugfs_fops);
|
|
if (IS_ERR(dent))
|
|
goto out_remove;
|
|
- d->dfs_dump_tnc = dent;
|
|
+ d->dump_tnc = dent;
|
|
|
|
return 0;
|
|
|
|
@@ -2585,7 +2531,7 @@
|
|
err = PTR_ERR(dent);
|
|
ubifs_err("cannot create \"%s\" debugfs directory, error %d\n",
|
|
fname, err);
|
|
- debugfs_remove_recursive(d->dfs_dir);
|
|
+ debugfs_remove_recursive(d->debugfs_dir);
|
|
out:
|
|
return err;
|
|
}
|
|
@@ -2596,7 +2542,7 @@
|
|
*/
|
|
void dbg_debugfs_exit_fs(struct ubifs_info *c)
|
|
{
|
|
- debugfs_remove_recursive(c->dbg->dfs_dir);
|
|
+ debugfs_remove_recursive(c->dbg->debugfs_dir);
|
|
}
|
|
|
|
#endif /* CONFIG_UBIFS_FS_DEBUG */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/debug.h linux-2.6.29-rc3.owrt/fs/ubifs/debug.h
|
|
--- linux-2.6.29.owrt/fs/ubifs/debug.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/debug.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -41,17 +41,15 @@
|
|
* @chk_lpt_wastage: used by LPT tree size checker
|
|
* @chk_lpt_lebs: used by LPT tree size checker
|
|
* @new_nhead_offs: used by LPT tree size checker
|
|
- * @new_ihead_lnum: used by debugging to check @c->ihead_lnum
|
|
- * @new_ihead_offs: used by debugging to check @c->ihead_offs
|
|
+ * @new_ihead_lnum: used by debugging to check ihead_lnum
|
|
+ * @new_ihead_offs: used by debugging to check ihead_offs
|
|
*
|
|
- * @saved_lst: saved lprops statistics (used by 'dbg_save_space_info()')
|
|
- * @saved_free: saved free space (used by 'dbg_save_space_info()')
|
|
- *
|
|
- * dfs_dir_name: name of debugfs directory containing this file-system's files
|
|
- * dfs_dir: direntry object of the file-system debugfs directory
|
|
- * dfs_dump_lprops: "dump lprops" debugfs knob
|
|
- * dfs_dump_budg: "dump budgeting information" debugfs knob
|
|
- * dfs_dump_tnc: "dump TNC" debugfs knob
|
|
+ * debugfs_dir_name: name of debugfs directory containing this file-system's
|
|
+ * files
|
|
+ * debugfs_dir: direntry object of the file-system debugfs directory
|
|
+ * dump_lprops: "dump lprops" debugfs knob
|
|
+ * dump_budg: "dump budgeting information" debugfs knob
|
|
+ * dump_tnc: "dump TNC" debugfs knob
|
|
*/
|
|
struct ubifs_debug_info {
|
|
void *buf;
|
|
@@ -71,14 +69,11 @@
|
|
int new_ihead_lnum;
|
|
int new_ihead_offs;
|
|
|
|
- struct ubifs_lp_stats saved_lst;
|
|
- long long saved_free;
|
|
-
|
|
- char dfs_dir_name[100];
|
|
- struct dentry *dfs_dir;
|
|
- struct dentry *dfs_dump_lprops;
|
|
- struct dentry *dfs_dump_budg;
|
|
- struct dentry *dfs_dump_tnc;
|
|
+ char debugfs_dir_name[100];
|
|
+ struct dentry *debugfs_dir;
|
|
+ struct dentry *dump_lprops;
|
|
+ struct dentry *dump_budg;
|
|
+ struct dentry *dump_tnc;
|
|
};
|
|
|
|
#define ubifs_assert(expr) do { \
|
|
@@ -302,8 +297,7 @@
|
|
dbg_znode_callback znode_cb, void *priv);
|
|
|
|
/* Checking functions */
|
|
-void dbg_save_space_info(struct ubifs_info *c);
|
|
-int dbg_check_space_info(struct ubifs_info *c);
|
|
+
|
|
int dbg_check_lprops(struct ubifs_info *c);
|
|
int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot);
|
|
int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot);
|
|
@@ -445,8 +439,6 @@
|
|
|
|
#define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0
|
|
#define dbg_old_index_check_init(c, zroot) 0
|
|
-#define dbg_save_space_info(c) ({})
|
|
-#define dbg_check_space_info(c) 0
|
|
#define dbg_check_old_index(c, zroot) 0
|
|
#define dbg_check_cats(c) 0
|
|
#define dbg_check_ltab(c) 0
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/dir.c linux-2.6.29-rc3.owrt/fs/ubifs/dir.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/dir.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/dir.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -482,29 +482,30 @@
|
|
}
|
|
|
|
/**
|
|
- * lock_2_inodes - a wrapper for locking two UBIFS inodes.
|
|
+ * lock_2_inodes - lock two UBIFS inodes.
|
|
* @inode1: first inode
|
|
* @inode2: second inode
|
|
- *
|
|
- * We do not implement any tricks to guarantee strict lock ordering, because
|
|
- * VFS has already done it for us on the @i_mutex. So this is just a simple
|
|
- * wrapper function.
|
|
*/
|
|
static void lock_2_inodes(struct inode *inode1, struct inode *inode2)
|
|
{
|
|
- mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
|
|
- mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
|
|
+ if (inode1->i_ino < inode2->i_ino) {
|
|
+ mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_2);
|
|
+ mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_3);
|
|
+ } else {
|
|
+ mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
|
|
+ mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_3);
|
|
+ }
|
|
}
|
|
|
|
/**
|
|
- * unlock_2_inodes - a wrapper for unlocking two UBIFS inodes.
|
|
+ * unlock_2_inodes - unlock two UBIFS inodes inodes.
|
|
* @inode1: first inode
|
|
* @inode2: second inode
|
|
*/
|
|
static void unlock_2_inodes(struct inode *inode1, struct inode *inode2)
|
|
{
|
|
- mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
|
|
mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
|
|
+ mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
|
|
}
|
|
|
|
static int ubifs_link(struct dentry *old_dentry, struct inode *dir,
|
|
@@ -526,8 +527,6 @@
|
|
dbg_gen("dent '%.*s' to ino %lu (nlink %d) in dir ino %lu",
|
|
dentry->d_name.len, dentry->d_name.name, inode->i_ino,
|
|
inode->i_nlink, dir->i_ino);
|
|
- ubifs_assert(mutex_is_locked(&dir->i_mutex));
|
|
- ubifs_assert(mutex_is_locked(&inode->i_mutex));
|
|
err = dbg_check_synced_i_size(inode);
|
|
if (err)
|
|
return err;
|
|
@@ -581,8 +580,6 @@
|
|
dbg_gen("dent '%.*s' from ino %lu (nlink %d) in dir ino %lu",
|
|
dentry->d_name.len, dentry->d_name.name, inode->i_ino,
|
|
inode->i_nlink, dir->i_ino);
|
|
- ubifs_assert(mutex_is_locked(&dir->i_mutex));
|
|
- ubifs_assert(mutex_is_locked(&inode->i_mutex));
|
|
err = dbg_check_synced_i_size(inode);
|
|
if (err)
|
|
return err;
|
|
@@ -670,8 +667,7 @@
|
|
|
|
dbg_gen("directory '%.*s', ino %lu in dir ino %lu", dentry->d_name.len,
|
|
dentry->d_name.name, inode->i_ino, dir->i_ino);
|
|
- ubifs_assert(mutex_is_locked(&dir->i_mutex));
|
|
- ubifs_assert(mutex_is_locked(&inode->i_mutex));
|
|
+
|
|
err = check_dir_empty(c, dentry->d_inode);
|
|
if (err)
|
|
return err;
|
|
@@ -926,30 +922,59 @@
|
|
}
|
|
|
|
/**
|
|
- * lock_3_inodes - a wrapper for locking three UBIFS inodes.
|
|
+ * lock_3_inodes - lock three UBIFS inodes for rename.
|
|
* @inode1: first inode
|
|
* @inode2: second inode
|
|
* @inode3: third inode
|
|
*
|
|
- * This function is used for 'ubifs_rename()' and @inode1 may be the same as
|
|
- * @inode2 whereas @inode3 may be %NULL.
|
|
- *
|
|
- * We do not implement any tricks to guarantee strict lock ordering, because
|
|
- * VFS has already done it for us on the @i_mutex. So this is just a simple
|
|
- * wrapper function.
|
|
+ * For 'ubifs_rename()', @inode1 may be the same as @inode2 whereas @inode3 may
|
|
+ * be null.
|
|
*/
|
|
static void lock_3_inodes(struct inode *inode1, struct inode *inode2,
|
|
struct inode *inode3)
|
|
{
|
|
- mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
|
|
- if (inode2 != inode1)
|
|
- mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
|
|
- if (inode3)
|
|
- mutex_lock_nested(&ubifs_inode(inode3)->ui_mutex, WB_MUTEX_3);
|
|
+ struct inode *i1, *i2, *i3;
|
|
+
|
|
+ if (!inode3) {
|
|
+ if (inode1 != inode2) {
|
|
+ lock_2_inodes(inode1, inode2);
|
|
+ return;
|
|
+ }
|
|
+ mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (inode1 == inode2) {
|
|
+ lock_2_inodes(inode1, inode3);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* 3 different inodes */
|
|
+ if (inode1 < inode2) {
|
|
+ i3 = inode2;
|
|
+ if (inode1 < inode3) {
|
|
+ i1 = inode1;
|
|
+ i2 = inode3;
|
|
+ } else {
|
|
+ i1 = inode3;
|
|
+ i2 = inode1;
|
|
+ }
|
|
+ } else {
|
|
+ i3 = inode1;
|
|
+ if (inode2 < inode3) {
|
|
+ i1 = inode2;
|
|
+ i2 = inode3;
|
|
+ } else {
|
|
+ i1 = inode3;
|
|
+ i2 = inode2;
|
|
+ }
|
|
+ }
|
|
+ mutex_lock_nested(&ubifs_inode(i1)->ui_mutex, WB_MUTEX_1);
|
|
+ lock_2_inodes(i2, i3);
|
|
}
|
|
|
|
/**
|
|
- * unlock_3_inodes - a wrapper for unlocking three UBIFS inodes for rename.
|
|
+ * unlock_3_inodes - unlock three UBIFS inodes for rename.
|
|
* @inode1: first inode
|
|
* @inode2: second inode
|
|
* @inode3: third inode
|
|
@@ -957,11 +982,11 @@
|
|
static void unlock_3_inodes(struct inode *inode1, struct inode *inode2,
|
|
struct inode *inode3)
|
|
{
|
|
- if (inode3)
|
|
- mutex_unlock(&ubifs_inode(inode3)->ui_mutex);
|
|
+ mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
|
|
if (inode1 != inode2)
|
|
mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
|
|
- mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
|
|
+ if (inode3)
|
|
+ mutex_unlock(&ubifs_inode(inode3)->ui_mutex);
|
|
}
|
|
|
|
static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
@@ -995,11 +1020,6 @@
|
|
"dir ino %lu", old_dentry->d_name.len, old_dentry->d_name.name,
|
|
old_inode->i_ino, old_dir->i_ino, new_dentry->d_name.len,
|
|
new_dentry->d_name.name, new_dir->i_ino);
|
|
- ubifs_assert(mutex_is_locked(&old_dir->i_mutex));
|
|
- ubifs_assert(mutex_is_locked(&new_dir->i_mutex));
|
|
- if (unlink)
|
|
- ubifs_assert(mutex_is_locked(&new_inode->i_mutex));
|
|
-
|
|
|
|
if (unlink && is_dir) {
|
|
err = check_dir_empty(c, new_inode);
|
|
@@ -1179,7 +1199,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-const struct inode_operations ubifs_dir_inode_operations = {
|
|
+struct inode_operations ubifs_dir_inode_operations = {
|
|
.lookup = ubifs_lookup,
|
|
.create = ubifs_create,
|
|
.link = ubifs_link,
|
|
@@ -1199,7 +1219,7 @@
|
|
#endif
|
|
};
|
|
|
|
-const struct file_operations ubifs_dir_operations = {
|
|
+struct file_operations ubifs_dir_operations = {
|
|
.llseek = ubifs_dir_llseek,
|
|
.release = ubifs_dir_release,
|
|
.read = generic_read_dir,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/file.c linux-2.6.29-rc3.owrt/fs/ubifs/file.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/file.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/file.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -432,6 +432,7 @@
|
|
int uninitialized_var(err), appending = !!(pos + len > inode->i_size);
|
|
struct page *page;
|
|
|
|
+
|
|
ubifs_assert(ubifs_inode(inode)->ui_size == inode->i_size);
|
|
|
|
if (unlikely(c->ro_media))
|
|
@@ -1540,7 +1541,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-const struct address_space_operations ubifs_file_address_operations = {
|
|
+struct address_space_operations ubifs_file_address_operations = {
|
|
.readpage = ubifs_readpage,
|
|
.writepage = ubifs_writepage,
|
|
.write_begin = ubifs_write_begin,
|
|
@@ -1550,7 +1551,7 @@
|
|
.releasepage = ubifs_releasepage,
|
|
};
|
|
|
|
-const struct inode_operations ubifs_file_inode_operations = {
|
|
+struct inode_operations ubifs_file_inode_operations = {
|
|
.setattr = ubifs_setattr,
|
|
.getattr = ubifs_getattr,
|
|
#ifdef CONFIG_UBIFS_FS_XATTR
|
|
@@ -1561,14 +1562,14 @@
|
|
#endif
|
|
};
|
|
|
|
-const struct inode_operations ubifs_symlink_inode_operations = {
|
|
+struct inode_operations ubifs_symlink_inode_operations = {
|
|
.readlink = generic_readlink,
|
|
.follow_link = ubifs_follow_link,
|
|
.setattr = ubifs_setattr,
|
|
.getattr = ubifs_getattr,
|
|
};
|
|
|
|
-const struct file_operations ubifs_file_operations = {
|
|
+struct file_operations ubifs_file_operations = {
|
|
.llseek = generic_file_llseek,
|
|
.read = do_sync_read,
|
|
.write = do_sync_write,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/gc.c linux-2.6.29-rc3.owrt/fs/ubifs/gc.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/gc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/gc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -31,26 +31,6 @@
|
|
* to be reused. Garbage collection will cause the number of dirty index nodes
|
|
* to grow, however sufficient space is reserved for the index to ensure the
|
|
* commit will never run out of space.
|
|
- *
|
|
- * Notes about dead watermark. At current UBIFS implementation we assume that
|
|
- * LEBs which have less than @c->dead_wm bytes of free + dirty space are full
|
|
- * and not worth garbage-collecting. The dead watermark is one min. I/O unit
|
|
- * size, or min. UBIFS node size, depending on what is greater. Indeed, UBIFS
|
|
- * Garbage Collector has to synchronize the GC head's write buffer before
|
|
- * returning, so this is about wasting one min. I/O unit. However, UBIFS GC can
|
|
- * actually reclaim even very small pieces of dirty space by garbage collecting
|
|
- * enough dirty LEBs, but we do not bother doing this at this implementation.
|
|
- *
|
|
- * Notes about dark watermark. The results of GC work depends on how big are
|
|
- * the UBIFS nodes GC deals with. Large nodes make GC waste more space. Indeed,
|
|
- * if GC move data from LEB A to LEB B and nodes in LEB A are large, GC would
|
|
- * have to waste large pieces of free space at the end of LEB B, because nodes
|
|
- * from LEB A would not fit. And the worst situation is when all nodes are of
|
|
- * maximum size. So dark watermark is the amount of free + dirty space in LEB
|
|
- * which are guaranteed to be reclaimable. If LEB has less space, the GC migh
|
|
- * be unable to reclaim it. So, LEBs with free + dirty greater than dark
|
|
- * watermark are "good" LEBs from GC's point of few. The other LEBs are not so
|
|
- * good, and GC takes extra care when moving them.
|
|
*/
|
|
|
|
#include <linux/pagemap.h>
|
|
@@ -401,7 +381,7 @@
|
|
|
|
/*
|
|
* Don't release the LEB until after the next commit, because
|
|
- * it may contain data which is needed for recovery. So
|
|
+ * it may contain date which is needed for recovery. So
|
|
* although we freed this LEB, it will become usable only after
|
|
* the commit.
|
|
*/
|
|
@@ -830,9 +810,8 @@
|
|
* ubifs_destroy_idx_gc - destroy idx_gc list.
|
|
* @c: UBIFS file-system description object
|
|
*
|
|
- * This function destroys the @c->idx_gc list. It is called when unmounting
|
|
- * so locks are not needed. Returns zero in case of success and a negative
|
|
- * error code in case of failure.
|
|
+ * This function destroys the idx_gc list. It is called when unmounting or
|
|
+ * remounting read-only so locks are not needed.
|
|
*/
|
|
void ubifs_destroy_idx_gc(struct ubifs_info *c)
|
|
{
|
|
@@ -845,6 +824,7 @@
|
|
list_del(&idx_gc->list);
|
|
kfree(idx_gc);
|
|
}
|
|
+
|
|
}
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/io.c linux-2.6.29-rc3.owrt/fs/ubifs/io.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/io.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/io.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -29,7 +29,7 @@
|
|
* would have been wasted for padding to the nearest minimal I/O unit boundary.
|
|
* Instead, data first goes to the write-buffer and is flushed when the
|
|
* buffer is full or when it is not used for some time (by timer). This is
|
|
- * similar to the mechanism is used by JFFS2.
|
|
+ * similarto the mechanism is used by JFFS2.
|
|
*
|
|
* Write-buffers are defined by 'struct ubifs_wbuf' objects and protected by
|
|
* mutexes defined inside these objects. Since sometimes upper-level code
|
|
@@ -75,7 +75,7 @@
|
|
* @lnum: logical eraseblock number
|
|
* @offs: offset within the logical eraseblock
|
|
* @quiet: print no messages
|
|
- * @must_chk_crc: indicates whether to always check the CRC
|
|
+ * @chk_crc: indicates whether to always check the CRC
|
|
*
|
|
* This function checks node magic number and CRC checksum. This function also
|
|
* validates node length to prevent UBIFS from becoming crazy when an attacker
|
|
@@ -83,17 +83,11 @@
|
|
* node length in the common header could cause UBIFS to read memory outside of
|
|
* allocated buffer when checking the CRC checksum.
|
|
*
|
|
- * This function may skip data nodes CRC checking if @c->no_chk_data_crc is
|
|
- * true, which is controlled by corresponding UBIFS mount option. However, if
|
|
- * @must_chk_crc is true, then @c->no_chk_data_crc is ignored and CRC is
|
|
- * checked. Similarly, if @c->always_chk_crc is true, @c->no_chk_data_crc is
|
|
- * ignored and CRC is checked.
|
|
- *
|
|
- * This function returns zero in case of success and %-EUCLEAN in case of bad
|
|
- * CRC or magic.
|
|
+ * This function returns zero in case of success %-EUCLEAN in case of bad CRC
|
|
+ * or magic.
|
|
*/
|
|
int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
|
|
- int offs, int quiet, int must_chk_crc)
|
|
+ int offs, int quiet, int chk_crc)
|
|
{
|
|
int err = -EINVAL, type, node_len;
|
|
uint32_t crc, node_crc, magic;
|
|
@@ -129,9 +123,9 @@
|
|
node_len > c->ranges[type].max_len)
|
|
goto out_len;
|
|
|
|
- if (!must_chk_crc && type == UBIFS_DATA_NODE && !c->always_chk_crc &&
|
|
- c->no_chk_data_crc)
|
|
- return 0;
|
|
+ if (!chk_crc && type == UBIFS_DATA_NODE && !c->always_chk_crc)
|
|
+ if (c->no_chk_data_crc)
|
|
+ return 0;
|
|
|
|
crc = crc32(UBIFS_CRC32_INIT, buf + 8, node_len - 8);
|
|
node_crc = le32_to_cpu(ch->crc);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/journal.c linux-2.6.29-rc3.owrt/fs/ubifs/journal.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/journal.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/journal.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -208,7 +208,7 @@
|
|
offs = 0;
|
|
|
|
out:
|
|
- err = ubifs_wbuf_seek_nolock(wbuf, lnum, offs, wbuf->dtype);
|
|
+ err = ubifs_wbuf_seek_nolock(wbuf, lnum, offs, UBI_SHORTTERM);
|
|
if (err)
|
|
goto out_unlock;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/lprops.c linux-2.6.29-rc3.owrt/fs/ubifs/lprops.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/lprops.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/lprops.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -635,10 +635,10 @@
|
|
* @c: UBIFS file-system description object
|
|
* @st: return statistics
|
|
*/
|
|
-void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *lst)
|
|
+void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *st)
|
|
{
|
|
spin_lock(&c->space_lock);
|
|
- memcpy(lst, &c->lst, sizeof(struct ubifs_lp_stats));
|
|
+ memcpy(st, &c->lst, sizeof(struct ubifs_lp_stats));
|
|
spin_unlock(&c->space_lock);
|
|
}
|
|
|
|
@@ -678,9 +678,6 @@
|
|
|
|
out:
|
|
ubifs_release_lprops(c);
|
|
- if (err)
|
|
- ubifs_err("cannot change properties of LEB %d, error %d",
|
|
- lnum, err);
|
|
return err;
|
|
}
|
|
|
|
@@ -717,9 +714,6 @@
|
|
|
|
out:
|
|
ubifs_release_lprops(c);
|
|
- if (err)
|
|
- ubifs_err("cannot update properties of LEB %d, error %d",
|
|
- lnum, err);
|
|
return err;
|
|
}
|
|
|
|
@@ -743,8 +737,6 @@
|
|
lpp = ubifs_lpt_lookup(c, lnum);
|
|
if (IS_ERR(lpp)) {
|
|
err = PTR_ERR(lpp);
|
|
- ubifs_err("cannot read properties of LEB %d, error %d",
|
|
- lnum, err);
|
|
goto out;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/lpt_commit.c linux-2.6.29-rc3.owrt/fs/ubifs/lpt_commit.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/lpt_commit.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/lpt_commit.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -556,23 +556,23 @@
|
|
}
|
|
|
|
/**
|
|
- * next_pnode_to_dirty - find next pnode to dirty.
|
|
+ * next_pnode - find next pnode.
|
|
* @c: UBIFS file-system description object
|
|
* @pnode: pnode
|
|
*
|
|
- * This function returns the next pnode to dirty or %NULL if there are no more
|
|
- * pnodes. Note that pnodes that have never been written (lnum == 0) are
|
|
- * skipped.
|
|
+ * This function returns the next pnode or %NULL if there are no more pnodes.
|
|
*/
|
|
-static struct ubifs_pnode *next_pnode_to_dirty(struct ubifs_info *c,
|
|
- struct ubifs_pnode *pnode)
|
|
+static struct ubifs_pnode *next_pnode(struct ubifs_info *c,
|
|
+ struct ubifs_pnode *pnode)
|
|
{
|
|
struct ubifs_nnode *nnode;
|
|
int iip;
|
|
|
|
/* Try to go right */
|
|
nnode = pnode->parent;
|
|
- for (iip = pnode->iip + 1; iip < UBIFS_LPT_FANOUT; iip++) {
|
|
+ iip = pnode->iip + 1;
|
|
+ if (iip < UBIFS_LPT_FANOUT) {
|
|
+ /* We assume here that LEB zero is never an LPT LEB */
|
|
if (nnode->nbranch[iip].lnum)
|
|
return ubifs_get_pnode(c, nnode, iip);
|
|
}
|
|
@@ -583,11 +583,8 @@
|
|
nnode = nnode->parent;
|
|
if (!nnode)
|
|
return NULL;
|
|
- for (; iip < UBIFS_LPT_FANOUT; iip++) {
|
|
- if (nnode->nbranch[iip].lnum)
|
|
- break;
|
|
- }
|
|
- } while (iip >= UBIFS_LPT_FANOUT);
|
|
+ /* We assume here that LEB zero is never an LPT LEB */
|
|
+ } while (iip >= UBIFS_LPT_FANOUT || !nnode->nbranch[iip].lnum);
|
|
|
|
/* Go right */
|
|
nnode = ubifs_get_nnode(c, nnode, iip);
|
|
@@ -596,29 +593,12 @@
|
|
|
|
/* Go down to level 1 */
|
|
while (nnode->level > 1) {
|
|
- for (iip = 0; iip < UBIFS_LPT_FANOUT; iip++) {
|
|
- if (nnode->nbranch[iip].lnum)
|
|
- break;
|
|
- }
|
|
- if (iip >= UBIFS_LPT_FANOUT) {
|
|
- /*
|
|
- * Should not happen, but we need to keep going
|
|
- * if it does.
|
|
- */
|
|
- iip = 0;
|
|
- }
|
|
- nnode = ubifs_get_nnode(c, nnode, iip);
|
|
+ nnode = ubifs_get_nnode(c, nnode, 0);
|
|
if (IS_ERR(nnode))
|
|
return (void *)nnode;
|
|
}
|
|
|
|
- for (iip = 0; iip < UBIFS_LPT_FANOUT; iip++)
|
|
- if (nnode->nbranch[iip].lnum)
|
|
- break;
|
|
- if (iip >= UBIFS_LPT_FANOUT)
|
|
- /* Should not happen, but we need to keep going if it does */
|
|
- iip = 0;
|
|
- return ubifs_get_pnode(c, nnode, iip);
|
|
+ return ubifs_get_pnode(c, nnode, 0);
|
|
}
|
|
|
|
/**
|
|
@@ -708,7 +688,7 @@
|
|
pnode = pnode_lookup(c, 0);
|
|
while (pnode) {
|
|
do_make_pnode_dirty(c, pnode);
|
|
- pnode = next_pnode_to_dirty(c, pnode);
|
|
+ pnode = next_pnode(c, pnode);
|
|
if (IS_ERR(pnode))
|
|
return PTR_ERR(pnode);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/master.c linux-2.6.29-rc3.owrt/fs/ubifs/master.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/master.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/master.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -354,7 +354,7 @@
|
|
int err, lnum, offs, len;
|
|
|
|
if (c->ro_media)
|
|
- return -EROFS;
|
|
+ return -EINVAL;
|
|
|
|
lnum = UBIFS_MST_LNUM;
|
|
offs = c->mst_offs + c->mst_node_alsz;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/orphan.c linux-2.6.29-rc3.owrt/fs/ubifs/orphan.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/orphan.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/orphan.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -46,7 +46,7 @@
|
|
* Orphans are accumulated in a rb-tree. When an inode's link count drops to
|
|
* zero, the inode number is added to the rb-tree. It is removed from the tree
|
|
* when the inode is deleted. Any new orphans that are in the orphan tree when
|
|
- * the commit is run, are written to the orphan area in 1 or more orphan nodes.
|
|
+ * the commit is run, are written to the orphan area in 1 or more orph nodes.
|
|
* If the orphan area is full, it is consolidated to make space. There is
|
|
* always enough space because validation prevents the user from creating more
|
|
* than the maximum number of orphans allowed.
|
|
@@ -231,7 +231,7 @@
|
|
}
|
|
|
|
/**
|
|
- * do_write_orph_node - write a node to the orphan head.
|
|
+ * do_write_orph_node - write a node
|
|
* @c: UBIFS file-system description object
|
|
* @len: length of node
|
|
* @atomic: write atomically
|
|
@@ -264,11 +264,11 @@
|
|
}
|
|
|
|
/**
|
|
- * write_orph_node - write an orphan node.
|
|
+ * write_orph_node - write an orph node
|
|
* @c: UBIFS file-system description object
|
|
* @atomic: write atomically
|
|
*
|
|
- * This function builds an orphan node from the cnext list and writes it to the
|
|
+ * This function builds an orph node from the cnext list and writes it to the
|
|
* orphan head. On success, %0 is returned, otherwise a negative error code
|
|
* is returned.
|
|
*/
|
|
@@ -326,11 +326,11 @@
|
|
}
|
|
|
|
/**
|
|
- * write_orph_nodes - write orphan nodes until there are no more to commit.
|
|
+ * write_orph_nodes - write orph nodes until there are no more to commit
|
|
* @c: UBIFS file-system description object
|
|
* @atomic: write atomically
|
|
*
|
|
- * This function writes orphan nodes for all the orphans to commit. On success,
|
|
+ * This function writes orph nodes for all the orphans to commit. On success,
|
|
* %0 is returned, otherwise a negative error code is returned.
|
|
*/
|
|
static int write_orph_nodes(struct ubifs_info *c, int atomic)
|
|
@@ -478,14 +478,14 @@
|
|
}
|
|
|
|
/**
|
|
- * ubifs_clear_orphans - erase all LEBs used for orphans.
|
|
+ * clear_orphans - erase all LEBs used for orphans.
|
|
* @c: UBIFS file-system description object
|
|
*
|
|
* If recovery is not required, then the orphans from the previous session
|
|
* are not needed. This function locates the LEBs used to record
|
|
* orphans, and un-maps them.
|
|
*/
|
|
-int ubifs_clear_orphans(struct ubifs_info *c)
|
|
+static int clear_orphans(struct ubifs_info *c)
|
|
{
|
|
int lnum, err;
|
|
|
|
@@ -547,9 +547,9 @@
|
|
* do_kill_orphans - remove orphan inodes from the index.
|
|
* @c: UBIFS file-system description object
|
|
* @sleb: scanned LEB
|
|
- * @last_cmt_no: cmt_no of last orphan node read is passed and returned here
|
|
+ * @last_cmt_no: cmt_no of last orph node read is passed and returned here
|
|
* @outofdate: whether the LEB is out of date is returned here
|
|
- * @last_flagged: whether the end orphan node is encountered
|
|
+ * @last_flagged: whether the end orph node is encountered
|
|
*
|
|
* This function is a helper to the 'kill_orphans()' function. It goes through
|
|
* every orphan node in a LEB and for every inode number recorded, removes
|
|
@@ -580,8 +580,8 @@
|
|
/*
|
|
* The commit number on the master node may be less, because
|
|
* of a failed commit. If there are several failed commits in a
|
|
- * row, the commit number written on orphan nodes will continue
|
|
- * to increase (because the commit number is adjusted here) even
|
|
+ * row, the commit number written on orph nodes will continue to
|
|
+ * increase (because the commit number is adjusted here) even
|
|
* though the commit number on the master node stays the same
|
|
* because the master node has not been re-written.
|
|
*/
|
|
@@ -589,9 +589,9 @@
|
|
c->cmt_no = cmt_no;
|
|
if (cmt_no < *last_cmt_no && *last_flagged) {
|
|
/*
|
|
- * The last orphan node had a higher commit number and
|
|
- * was flagged as the last written for that commit
|
|
- * number. That makes this orphan node, out of date.
|
|
+ * The last orph node had a higher commit number and was
|
|
+ * flagged as the last written for that commit number.
|
|
+ * That makes this orph node, out of date.
|
|
*/
|
|
if (!first) {
|
|
ubifs_err("out of order commit number %llu in "
|
|
@@ -658,10 +658,10 @@
|
|
/*
|
|
* Orph nodes always start at c->orph_first and are written to each
|
|
* successive LEB in turn. Generally unused LEBs will have been unmapped
|
|
- * but may contain out of date orphan nodes if the unmap didn't go
|
|
- * through. In addition, the last orphan node written for each commit is
|
|
+ * but may contain out of date orph nodes if the unmap didn't go
|
|
+ * through. In addition, the last orph node written for each commit is
|
|
* marked (top bit of orph->cmt_no is set to 1). It is possible that
|
|
- * there are orphan nodes from the next commit (i.e. the commit did not
|
|
+ * there are orph nodes from the next commit (i.e. the commit did not
|
|
* complete successfully). In that case, no orphans will have been lost
|
|
* due to the way that orphans are written, and any orphans added will
|
|
* be valid orphans anyway and so can be deleted.
|
|
@@ -718,7 +718,7 @@
|
|
if (unclean)
|
|
err = kill_orphans(c);
|
|
else if (!read_only)
|
|
- err = ubifs_clear_orphans(c);
|
|
+ err = clear_orphans(c);
|
|
|
|
return err;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/super.c linux-2.6.29-rc3.owrt/fs/ubifs/super.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -397,7 +397,6 @@
|
|
buf->f_namelen = UBIFS_MAX_NLEN;
|
|
buf->f_fsid.val[0] = le32_to_cpu(uuid[0]) ^ le32_to_cpu(uuid[2]);
|
|
buf->f_fsid.val[1] = le32_to_cpu(uuid[1]) ^ le32_to_cpu(uuid[3]);
|
|
- ubifs_assert(buf->f_bfree <= c->block_cnt);
|
|
return 0;
|
|
}
|
|
|
|
@@ -433,24 +432,33 @@
|
|
int i, err;
|
|
struct ubifs_info *c = sb->s_fs_info;
|
|
struct writeback_control wbc = {
|
|
- .sync_mode = WB_SYNC_ALL,
|
|
+ .sync_mode = wait ? WB_SYNC_ALL : WB_SYNC_NONE,
|
|
.range_start = 0,
|
|
.range_end = LLONG_MAX,
|
|
.nr_to_write = LONG_MAX,
|
|
};
|
|
|
|
/*
|
|
- * Zero @wait is just an advisory thing to help the file system shove
|
|
- * lots of data into the queues, and there will be the second
|
|
+ * Note by akpm about WB_SYNC_NONE used above: zero @wait is just an
|
|
+ * advisory thing to help the file system shove lots of data into the
|
|
+ * queues. If some gets missed then it'll be picked up on the second
|
|
* '->sync_fs()' call, with non-zero @wait.
|
|
*/
|
|
- if (!wait)
|
|
- return 0;
|
|
|
|
if (sb->s_flags & MS_RDONLY)
|
|
return 0;
|
|
|
|
/*
|
|
+ * Synchronize write buffers, because 'ubifs_run_commit()' does not
|
|
+ * do this if it waits for an already running commit.
|
|
+ */
|
|
+ for (i = 0; i < c->jhead_cnt; i++) {
|
|
+ err = ubifs_wbuf_sync(&c->jheads[i].wbuf);
|
|
+ if (err)
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ /*
|
|
* VFS calls '->sync_fs()' before synchronizing all dirty inodes and
|
|
* pages, so synchronize them first, then commit the journal. Strictly
|
|
* speaking, it is not necessary to commit the journal here,
|
|
@@ -461,16 +469,6 @@
|
|
*/
|
|
generic_sync_sb_inodes(sb, &wbc);
|
|
|
|
- /*
|
|
- * Synchronize write buffers, because 'ubifs_run_commit()' does not
|
|
- * do this if it waits for an already running commit.
|
|
- */
|
|
- for (i = 0; i < c->jhead_cnt; i++) {
|
|
- err = ubifs_wbuf_sync(&c->jheads[i].wbuf);
|
|
- if (err)
|
|
- return err;
|
|
- }
|
|
-
|
|
err = ubifs_run_commit(c);
|
|
if (err)
|
|
return err;
|
|
@@ -574,8 +572,15 @@
|
|
c->ranges[UBIFS_IDX_NODE].max_len = INT_MAX;
|
|
|
|
/*
|
|
- * Initialize dead and dark LEB space watermarks. See gc.c for comments
|
|
- * about these values.
|
|
+ * Initialize dead and dark LEB space watermarks.
|
|
+ *
|
|
+ * Dead space is the space which cannot be used. Its watermark is
|
|
+ * equivalent to min. I/O unit or minimum node size if it is greater
|
|
+ * then min. I/O unit.
|
|
+ *
|
|
+ * Dark space is the space which might be used, or might not, depending
|
|
+ * on which node should be written to the LEB. Its watermark is
|
|
+ * equivalent to maximum UBIFS node size.
|
|
*/
|
|
c->dead_wm = ALIGN(MIN_WRITE_SZ, c->min_io_size);
|
|
c->dark_wm = ALIGN(UBIFS_MAX_NODE_SZ, c->min_io_size);
|
|
@@ -736,12 +741,12 @@
|
|
* take_gc_lnum - reserve GC LEB.
|
|
* @c: UBIFS file-system description object
|
|
*
|
|
- * This function ensures that the LEB reserved for garbage collection is marked
|
|
- * as "taken" in lprops. We also have to set free space to LEB size and dirty
|
|
- * space to zero, because lprops may contain out-of-date information if the
|
|
- * file-system was un-mounted before it has been committed. This function
|
|
- * returns zero in case of success and a negative error code in case of
|
|
- * failure.
|
|
+ * This function ensures that the LEB reserved for garbage collection is
|
|
+ * unmapped and is marked as "taken" in lprops. We also have to set free space
|
|
+ * to LEB size and dirty space to zero, because lprops may contain out-of-date
|
|
+ * information if the file-system was un-mounted before it has been committed.
|
|
+ * This function returns zero in case of success and a negative error code in
|
|
+ * case of failure.
|
|
*/
|
|
static int take_gc_lnum(struct ubifs_info *c)
|
|
{
|
|
@@ -752,6 +757,10 @@
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ err = ubifs_leb_unmap(c, c->gc_lnum);
|
|
+ if (err)
|
|
+ return err;
|
|
+
|
|
/* And we have to tell lprops that this LEB is taken */
|
|
err = ubifs_change_one_lp(c, c->gc_lnum, c->leb_size, 0,
|
|
LPROPS_TAKEN, 0, 0);
|
|
@@ -957,16 +966,13 @@
|
|
|
|
token = match_token(p, tokens, args);
|
|
switch (token) {
|
|
- /*
|
|
- * %Opt_fast_unmount and %Opt_norm_unmount options are ignored.
|
|
- * We accepte them in order to be backware-compatible. But this
|
|
- * should be removed at some point.
|
|
- */
|
|
case Opt_fast_unmount:
|
|
c->mount_opts.unmount_mode = 2;
|
|
+ c->fast_unmount = 1;
|
|
break;
|
|
case Opt_norm_unmount:
|
|
c->mount_opts.unmount_mode = 1;
|
|
+ c->fast_unmount = 0;
|
|
break;
|
|
case Opt_bulk_read:
|
|
c->mount_opts.bulk_read = 2;
|
|
@@ -1088,7 +1094,12 @@
|
|
ubifs_err("insufficient free space to mount in read/write mode");
|
|
dbg_dump_budg(c);
|
|
dbg_dump_lprops(c);
|
|
- return -ENOSPC;
|
|
+ /*
|
|
+ * We return %-EINVAL instead of %-ENOSPC because it seems to
|
|
+ * be the closest error code mentioned in the mount function
|
|
+ * documentation.
|
|
+ */
|
|
+ return -EINVAL;
|
|
}
|
|
return 0;
|
|
}
|
|
@@ -1275,19 +1286,10 @@
|
|
if (err)
|
|
goto out_orphans;
|
|
err = ubifs_rcvry_gc_commit(c);
|
|
- } else {
|
|
+ } else
|
|
err = take_gc_lnum(c);
|
|
- if (err)
|
|
- goto out_orphans;
|
|
-
|
|
- /*
|
|
- * GC LEB may contain garbage if there was an unclean
|
|
- * reboot, and it should be un-mapped.
|
|
- */
|
|
- err = ubifs_leb_unmap(c, c->gc_lnum);
|
|
- if (err)
|
|
- return err;
|
|
- }
|
|
+ if (err)
|
|
+ goto out_orphans;
|
|
|
|
err = dbg_check_lprops(c);
|
|
if (err)
|
|
@@ -1296,16 +1298,6 @@
|
|
err = ubifs_recover_size(c);
|
|
if (err)
|
|
goto out_orphans;
|
|
- } else {
|
|
- /*
|
|
- * Even if we mount read-only, we have to set space in GC LEB
|
|
- * to proper value because this affects UBIFS free space
|
|
- * reporting. We do not want to have a situation when
|
|
- * re-mounting from R/O to R/W changes amount of free space.
|
|
- */
|
|
- err = take_gc_lnum(c);
|
|
- if (err)
|
|
- goto out_orphans;
|
|
}
|
|
|
|
spin_lock(&ubifs_infos_lock);
|
|
@@ -1318,17 +1310,14 @@
|
|
else {
|
|
c->need_recovery = 0;
|
|
ubifs_msg("recovery completed");
|
|
- /* GC LEB has to be empty and taken at this point */
|
|
- ubifs_assert(c->lst.taken_empty_lebs == 1);
|
|
}
|
|
- } else
|
|
- ubifs_assert(c->lst.taken_empty_lebs == 1);
|
|
+ }
|
|
|
|
- err = dbg_check_filesystem(c);
|
|
+ err = dbg_debugfs_init_fs(c);
|
|
if (err)
|
|
goto out_infos;
|
|
|
|
- err = dbg_debugfs_init_fs(c);
|
|
+ err = dbg_check_filesystem(c);
|
|
if (err)
|
|
goto out_infos;
|
|
|
|
@@ -1362,6 +1351,7 @@
|
|
c->uuid[4], c->uuid[5], c->uuid[6], c->uuid[7],
|
|
c->uuid[8], c->uuid[9], c->uuid[10], c->uuid[11],
|
|
c->uuid[12], c->uuid[13], c->uuid[14], c->uuid[15]);
|
|
+ dbg_msg("fast unmount: %d", c->fast_unmount);
|
|
dbg_msg("big_lpt %d", c->big_lpt);
|
|
dbg_msg("log LEBs: %d (%d - %d)",
|
|
c->log_lebs, UBIFS_LOG_LNUM, c->log_last);
|
|
@@ -1485,8 +1475,10 @@
|
|
{
|
|
int err, lnum;
|
|
|
|
+ if (c->ro_media)
|
|
+ return -EINVAL;
|
|
+
|
|
mutex_lock(&c->umount_mutex);
|
|
- dbg_save_space_info(c);
|
|
c->remounting_rw = 1;
|
|
c->always_chk_crc = 1;
|
|
|
|
@@ -1522,12 +1514,6 @@
|
|
err = ubifs_recover_inl_heads(c, c->sbuf);
|
|
if (err)
|
|
goto out;
|
|
- } else {
|
|
- /* A readonly mount is not allowed to have orphans */
|
|
- ubifs_assert(c->tot_orphans == 0);
|
|
- err = ubifs_clear_orphans(c);
|
|
- if (err)
|
|
- goto out;
|
|
}
|
|
|
|
if (!(c->mst_node->flags & cpu_to_le32(UBIFS_MST_DIRTY))) {
|
|
@@ -1583,7 +1569,7 @@
|
|
if (c->need_recovery)
|
|
err = ubifs_rcvry_gc_commit(c);
|
|
else
|
|
- err = ubifs_leb_unmap(c, c->gc_lnum);
|
|
+ err = take_gc_lnum(c);
|
|
if (err)
|
|
goto out;
|
|
|
|
@@ -1596,9 +1582,8 @@
|
|
c->vfs_sb->s_flags &= ~MS_RDONLY;
|
|
c->remounting_rw = 0;
|
|
c->always_chk_crc = 0;
|
|
- err = dbg_check_space_info(c);
|
|
mutex_unlock(&c->umount_mutex);
|
|
- return err;
|
|
+ return 0;
|
|
|
|
out:
|
|
vfree(c->orph_buf);
|
|
@@ -1618,18 +1603,43 @@
|
|
}
|
|
|
|
/**
|
|
+ * commit_on_unmount - commit the journal when un-mounting.
|
|
+ * @c: UBIFS file-system description object
|
|
+ *
|
|
+ * This function is called during un-mounting and re-mounting, and it commits
|
|
+ * the journal unless the "fast unmount" mode is enabled.
|
|
+ */
|
|
+static void commit_on_unmount(struct ubifs_info *c)
|
|
+{
|
|
+ struct super_block *sb = c->vfs_sb;
|
|
+ long long bud_bytes;
|
|
+
|
|
+ /*
|
|
+ * This function is called before the background thread is stopped, so
|
|
+ * we may race with ongoing commit, which means we have to take
|
|
+ * @c->bud_lock to access @c->bud_bytes.
|
|
+ */
|
|
+ spin_lock(&c->buds_lock);
|
|
+ bud_bytes = c->bud_bytes;
|
|
+ spin_unlock(&c->buds_lock);
|
|
+
|
|
+ if (!c->fast_unmount && !(sb->s_flags & MS_RDONLY) && bud_bytes)
|
|
+ ubifs_run_commit(c);
|
|
+}
|
|
+
|
|
+/**
|
|
* ubifs_remount_ro - re-mount in read-only mode.
|
|
* @c: UBIFS file-system description object
|
|
*
|
|
- * We assume VFS has stopped writing. Possibly the background thread could be
|
|
- * running a commit, however kthread_stop will wait in that case.
|
|
+ * We rely on VFS to have stopped writing. Possibly the background thread could
|
|
+ * be running a commit, however kthread_stop will wait in that case.
|
|
*/
|
|
static void ubifs_remount_ro(struct ubifs_info *c)
|
|
{
|
|
int i, err;
|
|
|
|
ubifs_assert(!c->need_recovery);
|
|
- ubifs_assert(!(c->vfs_sb->s_flags & MS_RDONLY));
|
|
+ commit_on_unmount(c);
|
|
|
|
mutex_lock(&c->umount_mutex);
|
|
if (c->bgt) {
|
|
@@ -1637,29 +1647,27 @@
|
|
c->bgt = NULL;
|
|
}
|
|
|
|
- dbg_save_space_info(c);
|
|
-
|
|
for (i = 0; i < c->jhead_cnt; i++) {
|
|
ubifs_wbuf_sync(&c->jheads[i].wbuf);
|
|
del_timer_sync(&c->jheads[i].wbuf.timer);
|
|
}
|
|
|
|
- c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_DIRTY);
|
|
- c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS);
|
|
- c->mst_node->gc_lnum = cpu_to_le32(c->gc_lnum);
|
|
- err = ubifs_write_master(c);
|
|
- if (err)
|
|
- ubifs_ro_mode(c, err);
|
|
+ if (!c->ro_media) {
|
|
+ c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_DIRTY);
|
|
+ c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS);
|
|
+ c->mst_node->gc_lnum = cpu_to_le32(c->gc_lnum);
|
|
+ err = ubifs_write_master(c);
|
|
+ if (err)
|
|
+ ubifs_ro_mode(c, err);
|
|
+ }
|
|
|
|
+ ubifs_destroy_idx_gc(c);
|
|
free_wbufs(c);
|
|
vfree(c->orph_buf);
|
|
c->orph_buf = NULL;
|
|
vfree(c->ileb_buf);
|
|
c->ileb_buf = NULL;
|
|
ubifs_lpt_free(c, 1);
|
|
- err = dbg_check_space_info(c);
|
|
- if (err)
|
|
- ubifs_ro_mode(c, err);
|
|
mutex_unlock(&c->umount_mutex);
|
|
}
|
|
|
|
@@ -1752,20 +1760,11 @@
|
|
}
|
|
|
|
if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {
|
|
- if (c->ro_media) {
|
|
- ubifs_msg("cannot re-mount due to prior errors");
|
|
- return -EROFS;
|
|
- }
|
|
err = ubifs_remount_rw(c);
|
|
if (err)
|
|
return err;
|
|
- } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) {
|
|
- if (c->ro_media) {
|
|
- ubifs_msg("cannot re-mount due to prior errors");
|
|
- return -EROFS;
|
|
- }
|
|
+ } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY))
|
|
ubifs_remount_ro(c);
|
|
- }
|
|
|
|
if (c->bulk_read == 1)
|
|
bu_init(c);
|
|
@@ -1775,11 +1774,10 @@
|
|
c->bu.buf = NULL;
|
|
}
|
|
|
|
- ubifs_assert(c->lst.taken_empty_lebs == 1);
|
|
return 0;
|
|
}
|
|
|
|
-const struct super_operations ubifs_super_operations = {
|
|
+struct super_operations ubifs_super_operations = {
|
|
.alloc_inode = ubifs_alloc_inode,
|
|
.destroy_inode = ubifs_destroy_inode,
|
|
.put_super = ubifs_put_super,
|
|
@@ -2046,6 +2044,15 @@
|
|
|
|
static void ubifs_kill_sb(struct super_block *sb)
|
|
{
|
|
+ struct ubifs_info *c = sb->s_fs_info;
|
|
+
|
|
+ /*
|
|
+ * We do 'commit_on_unmount()' here instead of 'ubifs_put_super()'
|
|
+ * in order to be outside BKL.
|
|
+ */
|
|
+ if (sb->s_root)
|
|
+ commit_on_unmount(c);
|
|
+ /* The un-mount routine is actually done in put_super() */
|
|
generic_shutdown_super(sb);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/tnc.c linux-2.6.29-rc3.owrt/fs/ubifs/tnc.c
|
|
--- linux-2.6.29.owrt/fs/ubifs/tnc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/tnc.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -443,11 +443,6 @@
|
|
* This function performs that same function as ubifs_read_node except that
|
|
* it does not require that there is actually a node present and instead
|
|
* the return code indicates if a node was read.
|
|
- *
|
|
- * Note, this function does not check CRC of data nodes if @c->no_chk_data_crc
|
|
- * is true (it is controlled by corresponding mount option). However, if
|
|
- * @c->always_chk_crc is true, @c->no_chk_data_crc is ignored and CRC is always
|
|
- * checked.
|
|
*/
|
|
static int try_read_node(const struct ubifs_info *c, void *buf, int type,
|
|
int len, int lnum, int offs)
|
|
@@ -475,8 +470,9 @@
|
|
if (node_len != len)
|
|
return 0;
|
|
|
|
- if (type == UBIFS_DATA_NODE && !c->always_chk_crc && c->no_chk_data_crc)
|
|
- return 1;
|
|
+ if (type == UBIFS_DATA_NODE && !c->always_chk_crc)
|
|
+ if (c->no_chk_data_crc)
|
|
+ return 0;
|
|
|
|
crc = crc32(UBIFS_CRC32_INIT, buf + 8, node_len - 8);
|
|
node_crc = le32_to_cpu(ch->crc);
|
|
@@ -1510,7 +1506,7 @@
|
|
*
|
|
* Note, if the bulk-read buffer length (@bu->buf_len) is known, this function
|
|
* makes sure bulk-read nodes fit the buffer. Otherwise, this function prepares
|
|
- * maximum possible amount of nodes for bulk-read.
|
|
+ * maxumum possible amount of nodes for bulk-read.
|
|
*/
|
|
int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ubifs/ubifs.h linux-2.6.29-rc3.owrt/fs/ubifs/ubifs.h
|
|
--- linux-2.6.29.owrt/fs/ubifs/ubifs.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ubifs/ubifs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -426,9 +426,9 @@
|
|
* LEB properties flags.
|
|
*
|
|
* LPROPS_UNCAT: not categorized
|
|
- * LPROPS_DIRTY: dirty > free, dirty >= @c->dead_wm, not index
|
|
+ * LPROPS_DIRTY: dirty > 0, not index
|
|
* LPROPS_DIRTY_IDX: dirty + free > @c->min_idx_node_sze and index
|
|
- * LPROPS_FREE: free > 0, dirty < @c->dead_wm, not empty, not index
|
|
+ * LPROPS_FREE: free > 0, not empty, not index
|
|
* LPROPS_HEAP_CNT: number of heaps used for storing categorized LEBs
|
|
* LPROPS_EMPTY: LEB is empty, not taken
|
|
* LPROPS_FREEABLE: free + dirty == leb_size, not index, not taken
|
|
@@ -961,6 +961,7 @@
|
|
* @cs_lock: commit state lock
|
|
* @cmt_wq: wait queue to sleep on if the log is full and a commit is running
|
|
*
|
|
+ * @fast_unmount: do not run journal commit before un-mounting
|
|
* @big_lpt: flag that LPT is too big to write whole during commit
|
|
* @no_chk_data_crc: do not check CRCs when reading data nodes (except during
|
|
* recovery)
|
|
@@ -1201,6 +1202,7 @@
|
|
spinlock_t cs_lock;
|
|
wait_queue_head_t cmt_wq;
|
|
|
|
+ unsigned int fast_unmount:1;
|
|
unsigned int big_lpt:1;
|
|
unsigned int no_chk_data_crc:1;
|
|
unsigned int bulk_read:1;
|
|
@@ -1403,13 +1405,13 @@
|
|
extern spinlock_t ubifs_infos_lock;
|
|
extern atomic_long_t ubifs_clean_zn_cnt;
|
|
extern struct kmem_cache *ubifs_inode_slab;
|
|
-extern const struct super_operations ubifs_super_operations;
|
|
-extern const struct address_space_operations ubifs_file_address_operations;
|
|
-extern const struct file_operations ubifs_file_operations;
|
|
-extern const struct inode_operations ubifs_file_inode_operations;
|
|
-extern const struct file_operations ubifs_dir_operations;
|
|
-extern const struct inode_operations ubifs_dir_inode_operations;
|
|
-extern const struct inode_operations ubifs_symlink_inode_operations;
|
|
+extern struct super_operations ubifs_super_operations;
|
|
+extern struct address_space_operations ubifs_file_address_operations;
|
|
+extern struct file_operations ubifs_file_operations;
|
|
+extern struct inode_operations ubifs_file_inode_operations;
|
|
+extern struct file_operations ubifs_dir_operations;
|
|
+extern struct inode_operations ubifs_dir_inode_operations;
|
|
+extern struct inode_operations ubifs_symlink_inode_operations;
|
|
extern struct backing_dev_info ubifs_backing_dev_info;
|
|
extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
|
|
|
|
@@ -1426,7 +1428,7 @@
|
|
int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum,
|
|
int offs, int dtype);
|
|
int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
|
|
- int offs, int quiet, int must_chk_crc);
|
|
+ int offs, int quiet, int chk_crc);
|
|
void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad);
|
|
void ubifs_prep_grp_node(struct ubifs_info *c, void *node, int len, int last);
|
|
int ubifs_io_init(struct ubifs_info *c);
|
|
@@ -1493,7 +1495,6 @@
|
|
void ubifs_cancel_ino_op(struct ubifs_info *c, struct inode *inode,
|
|
struct ubifs_budget_req *req);
|
|
long long ubifs_get_free_space(struct ubifs_info *c);
|
|
-long long ubifs_get_free_space_nolock(struct ubifs_info *c);
|
|
int ubifs_calc_min_idx_lebs(struct ubifs_info *c);
|
|
void ubifs_convert_page_budget(struct ubifs_info *c);
|
|
long long ubifs_reported_space(const struct ubifs_info *c, long long free);
|
|
@@ -1602,7 +1603,6 @@
|
|
int ubifs_orphan_start_commit(struct ubifs_info *c);
|
|
int ubifs_orphan_end_commit(struct ubifs_info *c);
|
|
int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only);
|
|
-int ubifs_clear_orphans(struct ubifs_info *c);
|
|
|
|
/* lpt.c */
|
|
int ubifs_calc_lpt_geom(struct ubifs_info *c);
|
|
@@ -1646,7 +1646,7 @@
|
|
const struct ubifs_lprops *lp,
|
|
int free, int dirty, int flags,
|
|
int idx_gc_cnt);
|
|
-void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *lst);
|
|
+void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *stats);
|
|
void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops,
|
|
int cat);
|
|
void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/ufs/super.c linux-2.6.29-rc3.owrt/fs/ufs/super.c
|
|
--- linux-2.6.29.owrt/fs/ufs/super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/ufs/super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -41,7 +41,7 @@
|
|
* Stefan Reinauer <stepan@home.culture.mipt.ru>
|
|
*
|
|
* Module usage counts added on 96/04/29 by
|
|
- * Gertjan van Wingerde <gwingerde@gmail.com>
|
|
+ * Gertjan van Wingerde <gertjan@cs.vu.nl>
|
|
*
|
|
* Clean swab support on 19970406 by
|
|
* Francois-Rene Rideau <fare@tunes.org>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_buf.c linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_buf.c
|
|
--- linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_buf.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_buf.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -34,12 +34,6 @@
|
|
#include <linux/backing-dev.h>
|
|
#include <linux/freezer.h>
|
|
|
|
-#include "xfs_sb.h"
|
|
-#include "xfs_inum.h"
|
|
-#include "xfs_ag.h"
|
|
-#include "xfs_dmapi.h"
|
|
-#include "xfs_mount.h"
|
|
-
|
|
static kmem_zone_t *xfs_buf_zone;
|
|
STATIC int xfsbufd(void *);
|
|
STATIC int xfsbufd_wakeup(int, gfp_t);
|
|
@@ -172,75 +166,6 @@
|
|
}
|
|
|
|
/*
|
|
- * Mapping of multi-page buffers into contiguous virtual space
|
|
- */
|
|
-
|
|
-typedef struct a_list {
|
|
- void *vm_addr;
|
|
- struct a_list *next;
|
|
-} a_list_t;
|
|
-
|
|
-static a_list_t *as_free_head;
|
|
-static int as_list_len;
|
|
-static DEFINE_SPINLOCK(as_lock);
|
|
-
|
|
-/*
|
|
- * Try to batch vunmaps because they are costly.
|
|
- */
|
|
-STATIC void
|
|
-free_address(
|
|
- void *addr)
|
|
-{
|
|
- a_list_t *aentry;
|
|
-
|
|
-#ifdef CONFIG_XEN
|
|
- /*
|
|
- * Xen needs to be able to make sure it can get an exclusive
|
|
- * RO mapping of pages it wants to turn into a pagetable. If
|
|
- * a newly allocated page is also still being vmap()ed by xfs,
|
|
- * it will cause pagetable construction to fail. This is a
|
|
- * quick workaround to always eagerly unmap pages so that Xen
|
|
- * is happy.
|
|
- */
|
|
- vunmap(addr);
|
|
- return;
|
|
-#endif
|
|
-
|
|
- aentry = kmalloc(sizeof(a_list_t), GFP_NOWAIT);
|
|
- if (likely(aentry)) {
|
|
- spin_lock(&as_lock);
|
|
- aentry->next = as_free_head;
|
|
- aentry->vm_addr = addr;
|
|
- as_free_head = aentry;
|
|
- as_list_len++;
|
|
- spin_unlock(&as_lock);
|
|
- } else {
|
|
- vunmap(addr);
|
|
- }
|
|
-}
|
|
-
|
|
-STATIC void
|
|
-purge_addresses(void)
|
|
-{
|
|
- a_list_t *aentry, *old;
|
|
-
|
|
- if (as_free_head == NULL)
|
|
- return;
|
|
-
|
|
- spin_lock(&as_lock);
|
|
- aentry = as_free_head;
|
|
- as_free_head = NULL;
|
|
- as_list_len = 0;
|
|
- spin_unlock(&as_lock);
|
|
-
|
|
- while ((old = aentry) != NULL) {
|
|
- vunmap(aentry->vm_addr);
|
|
- aentry = aentry->next;
|
|
- kfree(old);
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
* Internal xfs_buf_t object manipulation
|
|
*/
|
|
|
|
@@ -339,7 +264,7 @@
|
|
uint i;
|
|
|
|
if ((bp->b_flags & XBF_MAPPED) && (bp->b_page_count > 1))
|
|
- free_address(bp->b_addr - bp->b_offset);
|
|
+ vm_unmap_ram(bp->b_addr - bp->b_offset, bp->b_page_count);
|
|
|
|
for (i = 0; i < bp->b_page_count; i++) {
|
|
struct page *page = bp->b_pages[i];
|
|
@@ -461,10 +386,8 @@
|
|
bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset;
|
|
bp->b_flags |= XBF_MAPPED;
|
|
} else if (flags & XBF_MAPPED) {
|
|
- if (as_list_len > 64)
|
|
- purge_addresses();
|
|
- bp->b_addr = vmap(bp->b_pages, bp->b_page_count,
|
|
- VM_MAP, PAGE_KERNEL);
|
|
+ bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
|
|
+ -1, PAGE_KERNEL);
|
|
if (unlikely(bp->b_addr == NULL))
|
|
return -ENOMEM;
|
|
bp->b_addr += bp->b_offset;
|
|
@@ -1441,12 +1364,10 @@
|
|
|
|
void
|
|
xfs_free_buftarg(
|
|
- struct xfs_mount *mp,
|
|
- struct xfs_buftarg *btp)
|
|
+ xfs_buftarg_t *btp)
|
|
{
|
|
xfs_flush_buftarg(btp, 1);
|
|
- if (mp->m_flags & XFS_MOUNT_BARRIER)
|
|
- xfs_blkdev_issue_flush(btp);
|
|
+ xfs_blkdev_issue_flush(btp);
|
|
xfs_free_bufhash(btp);
|
|
iput(btp->bt_mapping->host);
|
|
|
|
@@ -1751,8 +1672,6 @@
|
|
count++;
|
|
}
|
|
|
|
- if (as_list_len > 0)
|
|
- purge_addresses();
|
|
if (count)
|
|
blk_run_address_space(target->bt_mapping);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_buf.h linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_buf.h
|
|
--- linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_buf.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_buf.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -413,7 +413,7 @@
|
|
* Handling of buftargs.
|
|
*/
|
|
extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int);
|
|
-extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *);
|
|
+extern void xfs_free_buftarg(xfs_buftarg_t *);
|
|
extern void xfs_wait_buftarg(xfs_buftarg_t *);
|
|
extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int);
|
|
extern int xfs_flush_buftarg(xfs_buftarg_t *, int);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_super.c linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_super.c
|
|
--- linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_super.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_super.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -734,15 +734,15 @@
|
|
{
|
|
if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
|
|
struct block_device *logdev = mp->m_logdev_targp->bt_bdev;
|
|
- xfs_free_buftarg(mp, mp->m_logdev_targp);
|
|
+ xfs_free_buftarg(mp->m_logdev_targp);
|
|
xfs_blkdev_put(logdev);
|
|
}
|
|
if (mp->m_rtdev_targp) {
|
|
struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev;
|
|
- xfs_free_buftarg(mp, mp->m_rtdev_targp);
|
|
+ xfs_free_buftarg(mp->m_rtdev_targp);
|
|
xfs_blkdev_put(rtdev);
|
|
}
|
|
- xfs_free_buftarg(mp, mp->m_ddev_targp);
|
|
+ xfs_free_buftarg(mp->m_ddev_targp);
|
|
}
|
|
|
|
/*
|
|
@@ -811,9 +811,9 @@
|
|
|
|
out_free_rtdev_targ:
|
|
if (mp->m_rtdev_targp)
|
|
- xfs_free_buftarg(mp, mp->m_rtdev_targp);
|
|
+ xfs_free_buftarg(mp->m_rtdev_targp);
|
|
out_free_ddev_targ:
|
|
- xfs_free_buftarg(mp, mp->m_ddev_targp);
|
|
+ xfs_free_buftarg(mp->m_ddev_targp);
|
|
out_close_rtdev:
|
|
if (rtdev)
|
|
xfs_blkdev_put(rtdev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_sync.c linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_sync.c
|
|
--- linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_sync.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_sync.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -371,11 +371,7 @@
|
|
/* flush inodes and push all remaining buffers out to disk */
|
|
xfs_quiesce_fs(mp);
|
|
|
|
- /*
|
|
- * Just warn here till VFS can correctly support
|
|
- * read-only remount without racing.
|
|
- */
|
|
- WARN_ON(atomic_read(&mp->m_active_trans) != 0);
|
|
+ ASSERT_ALWAYS(atomic_read(&mp->m_active_trans) == 0);
|
|
|
|
/* Push the superblock and write an unmount record */
|
|
error = xfs_log_sbcount(mp, 1);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/xfs/xfs_dfrag.c linux-2.6.29-rc3.owrt/fs/xfs/xfs_dfrag.c
|
|
--- linux-2.6.29.owrt/fs/xfs/xfs_dfrag.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/xfs/xfs_dfrag.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -55,11 +55,17 @@
|
|
struct file *file, *target_file;
|
|
int error = 0;
|
|
|
|
+ sxp = kmem_alloc(sizeof(xfs_swapext_t), KM_MAYFAIL);
|
|
+ if (!sxp) {
|
|
+ error = XFS_ERROR(ENOMEM);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
/* Pull information for the target fd */
|
|
file = fget((int)sxp->sx_fdtarget);
|
|
if (!file) {
|
|
error = XFS_ERROR(EINVAL);
|
|
- goto out;
|
|
+ goto out_free_sxp;
|
|
}
|
|
|
|
if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) {
|
|
@@ -103,6 +109,8 @@
|
|
fput(target_file);
|
|
out_put_file:
|
|
fput(file);
|
|
+ out_free_sxp:
|
|
+ kmem_free(sxp);
|
|
out:
|
|
return error;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/xfs/xfs_iget.c linux-2.6.29-rc3.owrt/fs/xfs/xfs_iget.c
|
|
--- linux-2.6.29.owrt/fs/xfs/xfs_iget.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/xfs/xfs_iget.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -246,6 +246,9 @@
|
|
goto out_destroy;
|
|
}
|
|
|
|
+ if (lock_flags)
|
|
+ xfs_ilock(ip, lock_flags);
|
|
+
|
|
/*
|
|
* Preload the radix tree so we can insert safely under the
|
|
* write spinlock. Note that we cannot sleep inside the preload
|
|
@@ -253,16 +256,7 @@
|
|
*/
|
|
if (radix_tree_preload(GFP_KERNEL)) {
|
|
error = EAGAIN;
|
|
- goto out_destroy;
|
|
- }
|
|
-
|
|
- /*
|
|
- * Because the inode hasn't been added to the radix-tree yet it can't
|
|
- * be found by another thread, so we can do the non-sleeping lock here.
|
|
- */
|
|
- if (lock_flags) {
|
|
- if (!xfs_ilock_nowait(ip, lock_flags))
|
|
- BUG();
|
|
+ goto out_unlock;
|
|
}
|
|
|
|
mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1);
|
|
@@ -290,6 +284,7 @@
|
|
out_preload_end:
|
|
write_unlock(&pag->pag_ici_lock);
|
|
radix_tree_preload_end();
|
|
+out_unlock:
|
|
if (lock_flags)
|
|
xfs_iunlock(ip, lock_flags);
|
|
out_destroy:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/fs/xfs/xfs_log_recover.c linux-2.6.29-rc3.owrt/fs/xfs/xfs_log_recover.c
|
|
--- linux-2.6.29.owrt/fs/xfs/xfs_log_recover.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/fs/xfs/xfs_log_recover.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -70,21 +70,16 @@
|
|
xfs_buf_t *
|
|
xlog_get_bp(
|
|
xlog_t *log,
|
|
- int nbblks)
|
|
+ int num_bblks)
|
|
{
|
|
- if (nbblks <= 0 || nbblks > log->l_logBBsize) {
|
|
- xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks);
|
|
- XFS_ERROR_REPORT("xlog_get_bp(1)",
|
|
- XFS_ERRLEVEL_HIGH, log->l_mp);
|
|
- return NULL;
|
|
- }
|
|
+ ASSERT(num_bblks > 0);
|
|
|
|
if (log->l_sectbb_log) {
|
|
- if (nbblks > 1)
|
|
- nbblks += XLOG_SECTOR_ROUNDUP_BBCOUNT(log, 1);
|
|
- nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks);
|
|
+ if (num_bblks > 1)
|
|
+ num_bblks += XLOG_SECTOR_ROUNDUP_BBCOUNT(log, 1);
|
|
+ num_bblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, num_bblks);
|
|
}
|
|
- return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp);
|
|
+ return xfs_buf_get_noaddr(BBTOB(num_bblks), log->l_mp->m_logdev_targp);
|
|
}
|
|
|
|
void
|
|
@@ -107,13 +102,6 @@
|
|
{
|
|
int error;
|
|
|
|
- if (nbblks <= 0 || nbblks > log->l_logBBsize) {
|
|
- xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks);
|
|
- XFS_ERROR_REPORT("xlog_bread(1)",
|
|
- XFS_ERRLEVEL_HIGH, log->l_mp);
|
|
- return EFSCORRUPTED;
|
|
- }
|
|
-
|
|
if (log->l_sectbb_log) {
|
|
blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no);
|
|
nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks);
|
|
@@ -151,13 +139,6 @@
|
|
{
|
|
int error;
|
|
|
|
- if (nbblks <= 0 || nbblks > log->l_logBBsize) {
|
|
- xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks);
|
|
- XFS_ERROR_REPORT("xlog_bwrite(1)",
|
|
- XFS_ERRLEVEL_HIGH, log->l_mp);
|
|
- return EFSCORRUPTED;
|
|
- }
|
|
-
|
|
if (log->l_sectbb_log) {
|
|
blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no);
|
|
nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks);
|
|
@@ -1455,19 +1436,10 @@
|
|
item = item->ri_prev;
|
|
|
|
if (item->ri_total == 0) { /* first region to be added */
|
|
- if (in_f->ilf_size == 0 ||
|
|
- in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) {
|
|
- xlog_warn(
|
|
- "XFS: bad number of regions (%d) in inode log format",
|
|
- in_f->ilf_size);
|
|
- ASSERT(0);
|
|
- return XFS_ERROR(EIO);
|
|
- }
|
|
-
|
|
- item->ri_total = in_f->ilf_size;
|
|
- item->ri_buf =
|
|
- kmem_zalloc(item->ri_total * sizeof(xfs_log_iovec_t),
|
|
- KM_SLEEP);
|
|
+ item->ri_total = in_f->ilf_size;
|
|
+ ASSERT(item->ri_total <= XLOG_MAX_REGIONS_IN_ITEM);
|
|
+ item->ri_buf = kmem_zalloc((item->ri_total *
|
|
+ sizeof(xfs_log_iovec_t)), KM_SLEEP);
|
|
}
|
|
ASSERT(item->ri_total > item->ri_cnt);
|
|
/* Description region is ri_buf[0] */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/acpi/pdc_intel.h linux-2.6.29-rc3.owrt/include/acpi/pdc_intel.h
|
|
--- linux-2.6.29.owrt/include/acpi/pdc_intel.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/acpi/pdc_intel.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -14,7 +14,6 @@
|
|
#define ACPI_PDC_SMP_T_SWCOORD (0x0080)
|
|
#define ACPI_PDC_C_C1_FFH (0x0100)
|
|
#define ACPI_PDC_C_C2C3_FFH (0x0200)
|
|
-#define ACPI_PDC_SMP_P_HWCOORD (0x0800)
|
|
|
|
#define ACPI_PDC_EST_CAPABILITY_SMP (ACPI_PDC_SMP_C1PT | \
|
|
ACPI_PDC_C_C1_HALT | \
|
|
@@ -23,7 +22,6 @@
|
|
#define ACPI_PDC_EST_CAPABILITY_SWSMP (ACPI_PDC_SMP_C1PT | \
|
|
ACPI_PDC_C_C1_HALT | \
|
|
ACPI_PDC_SMP_P_SWCOORD | \
|
|
- ACPI_PDC_SMP_P_HWCOORD | \
|
|
ACPI_PDC_P_FFH)
|
|
|
|
#define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/asm-frv/pgtable.h linux-2.6.29-rc3.owrt/include/asm-frv/pgtable.h
|
|
--- linux-2.6.29.owrt/include/asm-frv/pgtable.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/asm-frv/pgtable.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -478,7 +478,7 @@
|
|
#define __swp_type(x) (((x).val >> 2) & 0x1f)
|
|
#define __swp_offset(x) ((x).val >> 8)
|
|
#define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 8) })
|
|
-#define __pte_to_swp_entry(_pte) ((swp_entry_t) { (_pte).pte })
|
|
+#define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).pte })
|
|
#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
|
|
|
static inline int pte_file(pte_t pte)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/crypto/hash.h linux-2.6.29-rc3.owrt/include/crypto/hash.h
|
|
--- linux-2.6.29.owrt/include/crypto/hash.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/crypto/hash.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -222,7 +222,7 @@
|
|
|
|
static inline void crypto_free_shash(struct crypto_shash *tfm)
|
|
{
|
|
- crypto_destroy_tfm(tfm, crypto_shash_tfm(tfm));
|
|
+ crypto_free_tfm(crypto_shash_tfm(tfm));
|
|
}
|
|
|
|
static inline unsigned int crypto_shash_alignmask(
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/drm/drm_crtc.h linux-2.6.29-rc3.owrt/include/drm/drm_crtc.h
|
|
--- linux-2.6.29.owrt/include/drm/drm_crtc.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/drm/drm_crtc.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -609,7 +609,7 @@
|
|
extern char *drm_get_dvi_i_select_name(int val);
|
|
extern char *drm_get_tv_subconnector_name(int val);
|
|
extern char *drm_get_tv_select_name(int val);
|
|
-extern void drm_fb_release(struct drm_file *file_priv);
|
|
+extern void drm_fb_release(struct file *filp);
|
|
extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
|
|
extern struct edid *drm_get_edid(struct drm_connector *connector,
|
|
struct i2c_adapter *adapter);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/drm/drm_crtc_helper.h linux-2.6.29-rc3.owrt/include/drm/drm_crtc_helper.h
|
|
--- linux-2.6.29.owrt/include/drm/drm_crtc_helper.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/drm/drm_crtc_helper.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -54,13 +54,13 @@
|
|
struct drm_display_mode *mode,
|
|
struct drm_display_mode *adjusted_mode);
|
|
/* Actually set the mode */
|
|
- int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
|
- struct drm_display_mode *adjusted_mode, int x, int y,
|
|
- struct drm_framebuffer *old_fb);
|
|
+ void (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
|
+ struct drm_display_mode *adjusted_mode, int x, int y,
|
|
+ struct drm_framebuffer *old_fb);
|
|
|
|
/* Move the crtc on the current fb to the given position *optional* */
|
|
- int (*mode_set_base)(struct drm_crtc *crtc, int x, int y,
|
|
- struct drm_framebuffer *old_fb);
|
|
+ void (*mode_set_base)(struct drm_crtc *crtc, int x, int y,
|
|
+ struct drm_framebuffer *old_fb);
|
|
};
|
|
|
|
struct drm_encoder_helper_funcs {
|
|
@@ -76,7 +76,6 @@
|
|
void (*mode_set)(struct drm_encoder *encoder,
|
|
struct drm_display_mode *mode,
|
|
struct drm_display_mode *adjusted_mode);
|
|
- struct drm_crtc *(*get_crtc)(struct drm_encoder *encoder);
|
|
/* detect for DAC style encoders */
|
|
enum drm_connector_status (*detect)(struct drm_encoder *encoder,
|
|
struct drm_connector *connector);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/drm/drm_edid.h linux-2.6.29-rc3.owrt/include/drm/drm_edid.h
|
|
--- linux-2.6.29.owrt/include/drm/drm_edid.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/drm/drm_edid.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -58,10 +58,10 @@
|
|
u8 hsync_pulse_width_lo;
|
|
u8 vsync_pulse_width_lo:4;
|
|
u8 vsync_offset_lo:4;
|
|
- u8 vsync_pulse_width_hi:2;
|
|
- u8 vsync_offset_hi:2;
|
|
u8 hsync_pulse_width_hi:2;
|
|
u8 hsync_offset_hi:2;
|
|
+ u8 vsync_pulse_width_hi:2;
|
|
+ u8 vsync_offset_hi:2;
|
|
u8 width_mm_lo;
|
|
u8 height_mm_lo;
|
|
u8 height_mm_hi:4;
|
|
@@ -69,8 +69,8 @@
|
|
u8 hborder;
|
|
u8 vborder;
|
|
u8 unknown0:1;
|
|
- u8 hsync_positive:1;
|
|
u8 vsync_positive:1;
|
|
+ u8 hsync_positive:1;
|
|
u8 separate_sync:2;
|
|
u8 stereo:1;
|
|
u8 unknown6:1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/drm/drmP.h linux-2.6.29-rc3.owrt/include/drm/drmP.h
|
|
--- linux-2.6.29.owrt/include/drm/drmP.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/drm/drmP.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1321,8 +1321,6 @@
|
|
struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
|
|
size_t size);
|
|
void drm_gem_object_handle_free(struct kref *kref);
|
|
-void drm_gem_vm_open(struct vm_area_struct *vma);
|
|
-void drm_gem_vm_close(struct vm_area_struct *vma);
|
|
int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
|
|
|
|
static inline void
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/drm/i915_drm.h linux-2.6.29-rc3.owrt/include/drm/i915_drm.h
|
|
--- linux-2.6.29.owrt/include/drm/i915_drm.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/drm/i915_drm.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -261,7 +261,6 @@
|
|
#define I915_PARAM_LAST_DISPATCH 3
|
|
#define I915_PARAM_CHIPSET_ID 4
|
|
#define I915_PARAM_HAS_GEM 5
|
|
-#define I915_PARAM_NUM_FENCES_AVAIL 6
|
|
|
|
typedef struct drm_i915_getparam {
|
|
int param;
|
|
@@ -273,7 +272,6 @@
|
|
#define I915_SETPARAM_USE_MI_BATCHBUFFER_START 1
|
|
#define I915_SETPARAM_TEX_LRU_LOG_GRANULARITY 2
|
|
#define I915_SETPARAM_ALLOW_BATCHBUFFER 3
|
|
-#define I915_SETPARAM_NUM_USED_FENCES 4
|
|
|
|
typedef struct drm_i915_setparam {
|
|
int param;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/aio_abi.h linux-2.6.29-rc3.owrt/include/linux/aio_abi.h
|
|
--- linux-2.6.29.owrt/include/linux/aio_abi.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/aio_abi.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -27,7 +27,6 @@
|
|
#ifndef __LINUX__AIO_ABI_H
|
|
#define __LINUX__AIO_ABI_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
typedef unsigned long aio_context_t;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/async.h linux-2.6.29-rc3.owrt/include/linux/async.h
|
|
--- linux-2.6.29.owrt/include/linux/async.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/async.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -17,11 +17,9 @@
|
|
typedef void (async_func_ptr) (void *data, async_cookie_t cookie);
|
|
|
|
extern async_cookie_t async_schedule(async_func_ptr *ptr, void *data);
|
|
-extern async_cookie_t async_schedule_domain(async_func_ptr *ptr, void *data,
|
|
- struct list_head *list);
|
|
+extern async_cookie_t async_schedule_special(async_func_ptr *ptr, void *data, struct list_head *list);
|
|
extern void async_synchronize_full(void);
|
|
-extern void async_synchronize_full_domain(struct list_head *list);
|
|
+extern void async_synchronize_full_special(struct list_head *list);
|
|
extern void async_synchronize_cookie(async_cookie_t cookie);
|
|
-extern void async_synchronize_cookie_domain(async_cookie_t cookie,
|
|
- struct list_head *list);
|
|
+extern void async_synchronize_cookie_special(async_cookie_t cookie, struct list_head *list);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/ata.h linux-2.6.29-rc3.owrt/include/linux/ata.h
|
|
--- linux-2.6.29.owrt/include/linux/ata.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/ata.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -89,8 +89,6 @@
|
|
ATA_ID_DLF = 128,
|
|
ATA_ID_CSFO = 129,
|
|
ATA_ID_CFA_POWER = 160,
|
|
- ATA_ID_CFA_KEY_MGMT = 162,
|
|
- ATA_ID_CFA_MODES = 163,
|
|
ATA_ID_ROT_SPEED = 217,
|
|
ATA_ID_PIO4 = (1 << 1),
|
|
|
|
@@ -733,17 +731,12 @@
|
|
|
|
static inline int ata_id_is_cfa(const u16 *id)
|
|
{
|
|
- if (id[ATA_ID_CONFIG] == 0x848A) /* Traditional CF */
|
|
+ if (id[ATA_ID_CONFIG] == 0x848A) /* Standard CF */
|
|
return 1;
|
|
- /*
|
|
- * CF specs don't require specific value in the word 0 anymore and yet
|
|
- * they forbid to report the ATA version in the word 80 and require the
|
|
- * CFA feature set support to be indicated in the word 83 in this case.
|
|
- * Unfortunately, some cards only follow either of this requirements,
|
|
- * and while those that don't indicate CFA feature support need some
|
|
- * sort of quirk list, it seems impractical for the ones that do...
|
|
- */
|
|
- if ((id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004)
|
|
+ /* Could be CF hiding as standard ATA */
|
|
+ if (ata_id_major_version(id) >= 3 &&
|
|
+ id[ATA_ID_COMMAND_SET_1] != 0xFFFF &&
|
|
+ (id[ATA_ID_COMMAND_SET_1] & (1 << 2)))
|
|
return 1;
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/atalk.h linux-2.6.29-rc3.owrt/include/linux/atalk.h
|
|
--- linux-2.6.29.owrt/include/linux/atalk.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/atalk.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_ATALK_H__
|
|
#define __LINUX_ATALK_H__
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/atmbr2684.h linux-2.6.29-rc3.owrt/include/linux/atmbr2684.h
|
|
--- linux-2.6.29.owrt/include/linux/atmbr2684.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/atmbr2684.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef _LINUX_ATMBR2684_H
|
|
#define _LINUX_ATMBR2684_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/atm.h>
|
|
#include <linux/if.h> /* For IFNAMSIZ */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/auto_fs4.h linux-2.6.29-rc3.owrt/include/linux/auto_fs4.h
|
|
--- linux-2.6.29.owrt/include/linux/auto_fs4.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/auto_fs4.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -12,7 +12,6 @@
|
|
#define _LINUX_AUTO_FS4_H
|
|
|
|
/* Include common v3 definitions */
|
|
-#include <linux/types.h>
|
|
#include <linux/auto_fs.h>
|
|
|
|
/* autofs v4 definitions */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/bfs_fs.h linux-2.6.29-rc3.owrt/include/linux/bfs_fs.h
|
|
--- linux-2.6.29.owrt/include/linux/bfs_fs.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/bfs_fs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -6,8 +6,6 @@
|
|
#ifndef _LINUX_BFS_FS_H
|
|
#define _LINUX_BFS_FS_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define BFS_BSIZE_BITS 9
|
|
#define BFS_BSIZE (1<<BFS_BSIZE_BITS)
|
|
|
|
@@ -19,6 +17,7 @@
|
|
#define BFS_VDIR 2L
|
|
#define BFS_VREG 1L
|
|
|
|
+
|
|
/* BFS inode layout on disk */
|
|
struct bfs_inode {
|
|
__le16 i_ino;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/bio.h linux-2.6.29-rc3.owrt/include/linux/bio.h
|
|
--- linux-2.6.29.owrt/include/linux/bio.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/bio.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -144,7 +144,7 @@
|
|
* bit 1 -- rw-ahead when set
|
|
* bit 2 -- barrier
|
|
* Insert a serialization point in the IO queue, forcing previously
|
|
- * submitted IO to be completed before this one is issued.
|
|
+ * submitted IO to be completed before this oen is issued.
|
|
* bit 3 -- synchronous I/O hint: the block layer will unplug immediately
|
|
* Note that this does NOT indicate that the IO itself is sync, just
|
|
* that the block layer will not postpone issue of this IO by plugging.
|
|
@@ -163,31 +163,12 @@
|
|
#define BIO_RW 0 /* Must match RW in req flags (blkdev.h) */
|
|
#define BIO_RW_AHEAD 1 /* Must match FAILFAST in req flags */
|
|
#define BIO_RW_BARRIER 2
|
|
-#define BIO_RW_SYNCIO 3
|
|
-#define BIO_RW_UNPLUG 4
|
|
-#define BIO_RW_META 5
|
|
-#define BIO_RW_DISCARD 6
|
|
-#define BIO_RW_FAILFAST_DEV 7
|
|
-#define BIO_RW_FAILFAST_TRANSPORT 8
|
|
-#define BIO_RW_FAILFAST_DRIVER 9
|
|
-
|
|
-#define bio_rw_flagged(bio, flag) ((bio)->bi_rw & (1 << (flag)))
|
|
-
|
|
-/*
|
|
- * Old defines, these should eventually be replaced by direct usage of
|
|
- * bio_rw_flagged()
|
|
- */
|
|
-#define bio_barrier(bio) bio_rw_flagged(bio, BIO_RW_BARRIER)
|
|
-#define bio_sync(bio) bio_rw_flagged(bio, BIO_RW_SYNCIO)
|
|
-#define bio_unplug(bio) bio_rw_flagged(bio, BIO_RW_UNPLUG)
|
|
-#define bio_failfast_dev(bio) bio_rw_flagged(bio, BIO_RW_FAILFAST_DEV)
|
|
-#define bio_failfast_transport(bio) \
|
|
- bio_rw_flagged(bio, BIO_RW_FAILFAST_TRANSPORT)
|
|
-#define bio_failfast_driver(bio) \
|
|
- bio_rw_flagged(bio, BIO_RW_FAILFAST_DRIVER)
|
|
-#define bio_rw_ahead(bio) bio_rw_flagged(bio, BIO_RW_AHEAD)
|
|
-#define bio_rw_meta(bio) bio_rw_flagged(bio, BIO_RW_META)
|
|
-#define bio_discard(bio) bio_rw_flagged(bio, BIO_RW_DISCARD)
|
|
+#define BIO_RW_SYNC 3
|
|
+#define BIO_RW_META 4
|
|
+#define BIO_RW_DISCARD 5
|
|
+#define BIO_RW_FAILFAST_DEV 6
|
|
+#define BIO_RW_FAILFAST_TRANSPORT 7
|
|
+#define BIO_RW_FAILFAST_DRIVER 8
|
|
|
|
/*
|
|
* upper 16 bits of bi_rw define the io priority of this bio
|
|
@@ -212,6 +193,15 @@
|
|
#define bio_offset(bio) bio_iovec((bio))->bv_offset
|
|
#define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx)
|
|
#define bio_sectors(bio) ((bio)->bi_size >> 9)
|
|
+#define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_RW_BARRIER))
|
|
+#define bio_sync(bio) ((bio)->bi_rw & (1 << BIO_RW_SYNC))
|
|
+#define bio_failfast_dev(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_DEV))
|
|
+#define bio_failfast_transport(bio) \
|
|
+ ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_TRANSPORT))
|
|
+#define bio_failfast_driver(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_DRIVER))
|
|
+#define bio_rw_ahead(bio) ((bio)->bi_rw & (1 << BIO_RW_AHEAD))
|
|
+#define bio_rw_meta(bio) ((bio)->bi_rw & (1 << BIO_RW_META))
|
|
+#define bio_discard(bio) ((bio)->bi_rw & (1 << BIO_RW_DISCARD))
|
|
#define bio_empty_barrier(bio) (bio_barrier(bio) && !bio_has_data(bio) && !bio_discard(bio))
|
|
|
|
static inline unsigned int bio_cur_sectors(struct bio *bio)
|
|
@@ -322,6 +312,7 @@
|
|
void *bip_buf; /* generated integrity data */
|
|
bio_end_io_t *bip_end_io; /* saved I/O completion fn */
|
|
|
|
+ int bip_error; /* saved I/O error */
|
|
unsigned int bip_size;
|
|
|
|
unsigned short bip_pool; /* pool the ivec came from */
|
|
@@ -449,13 +440,12 @@
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
/*
|
|
- * remember never ever reenable interrupts between a bvec_kmap_irq and
|
|
- * bvec_kunmap_irq!
|
|
+ * remember to add offset! and never ever reenable interrupts between a
|
|
+ * bvec_kmap_irq and bvec_kunmap_irq!!
|
|
*
|
|
* This function MUST be inlined - it plays with the CPU interrupt flags.
|
|
*/
|
|
-static __always_inline char *bvec_kmap_irq(struct bio_vec *bvec,
|
|
- unsigned long *flags)
|
|
+static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags)
|
|
{
|
|
unsigned long addr;
|
|
|
|
@@ -471,8 +461,7 @@
|
|
return (char *) addr + bvec->bv_offset;
|
|
}
|
|
|
|
-static __always_inline void bvec_kunmap_irq(char *buffer,
|
|
- unsigned long *flags)
|
|
+static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags)
|
|
{
|
|
unsigned long ptr = (unsigned long) buffer & PAGE_MASK;
|
|
|
|
@@ -531,7 +520,7 @@
|
|
extern void bio_integrity_advance(struct bio *, unsigned int);
|
|
extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int);
|
|
extern void bio_integrity_split(struct bio *, struct bio_pair *, int);
|
|
-extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t, struct bio_set *);
|
|
+extern int bio_integrity_clone(struct bio *, struct bio *, struct bio_set *);
|
|
extern int bioset_integrity_create(struct bio_set *, int);
|
|
extern void bioset_integrity_free(struct bio_set *);
|
|
extern void bio_integrity_init_slab(void);
|
|
@@ -542,7 +531,7 @@
|
|
#define bioset_integrity_create(a, b) (0)
|
|
#define bio_integrity_prep(a) (0)
|
|
#define bio_integrity_enabled(a) (0)
|
|
-#define bio_integrity_clone(a, b, c,d ) (0)
|
|
+#define bio_integrity_clone(a, b, c) (0)
|
|
#define bioset_integrity_free(a) do { } while (0)
|
|
#define bio_integrity_free(a, b) do { } while (0)
|
|
#define bio_integrity_endio(a, b) do { } while (0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/blkdev.h linux-2.6.29-rc3.owrt/include/linux/blkdev.h
|
|
--- linux-2.6.29.owrt/include/linux/blkdev.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/blkdev.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -108,7 +108,6 @@
|
|
__REQ_RW_META, /* metadata io request */
|
|
__REQ_COPY_USER, /* contains copies of user pages */
|
|
__REQ_INTEGRITY, /* integrity metadata has been remapped */
|
|
- __REQ_UNPLUG, /* unplug queue on submission */
|
|
__REQ_NR_BITS, /* stops here */
|
|
};
|
|
|
|
@@ -135,7 +134,6 @@
|
|
#define REQ_RW_META (1 << __REQ_RW_META)
|
|
#define REQ_COPY_USER (1 << __REQ_COPY_USER)
|
|
#define REQ_INTEGRITY (1 << __REQ_INTEGRITY)
|
|
-#define REQ_UNPLUG (1 << __REQ_UNPLUG)
|
|
|
|
#define BLK_MAX_CDB 16
|
|
|
|
@@ -451,11 +449,6 @@
|
|
#define QUEUE_FLAG_STACKABLE 13 /* supports request stacking */
|
|
#define QUEUE_FLAG_NONROT 14 /* non-rotational device (SSD) */
|
|
#define QUEUE_FLAG_VIRT QUEUE_FLAG_NONROT /* paravirt device */
|
|
-#define QUEUE_FLAG_IO_STAT 15 /* do IO stats */
|
|
-
|
|
-#define QUEUE_FLAG_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \
|
|
- (1 << QUEUE_FLAG_CLUSTER) | \
|
|
- (1 << QUEUE_FLAG_STACKABLE))
|
|
|
|
static inline int queue_is_locked(struct request_queue *q)
|
|
{
|
|
@@ -572,7 +565,6 @@
|
|
#define blk_queue_stopped(q) test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags)
|
|
#define blk_queue_nomerges(q) test_bit(QUEUE_FLAG_NOMERGES, &(q)->queue_flags)
|
|
#define blk_queue_nonrot(q) test_bit(QUEUE_FLAG_NONROT, &(q)->queue_flags)
|
|
-#define blk_queue_io_stat(q) test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags)
|
|
#define blk_queue_flushing(q) ((q)->ordseq)
|
|
#define blk_queue_stackable(q) \
|
|
test_bit(QUEUE_FLAG_STACKABLE, &(q)->queue_flags)
|
|
@@ -708,8 +700,6 @@
|
|
};
|
|
|
|
/* This should not be used directly - use rq_for_each_segment */
|
|
-#define for_each_bio(_bio) \
|
|
- for (; _bio; _bio = _bio->bi_next)
|
|
#define __rq_for_each_bio(_bio, rq) \
|
|
if ((rq->bio)) \
|
|
for (_bio = (rq)->bio; _bio; _bio = _bio->bi_next)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/blktrace_api.h linux-2.6.29-rc3.owrt/include/linux/blktrace_api.h
|
|
--- linux-2.6.29.owrt/include/linux/blktrace_api.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/blktrace_api.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef BLKTRACE_H
|
|
#define BLKTRACE_H
|
|
|
|
-#include <linux/types.h>
|
|
#ifdef __KERNEL__
|
|
#include <linux/blkdev.h>
|
|
#include <linux/relay.h>
|
|
@@ -15,7 +14,6 @@
|
|
BLK_TC_WRITE = 1 << 1, /* writes */
|
|
BLK_TC_BARRIER = 1 << 2, /* barrier */
|
|
BLK_TC_SYNC = 1 << 3, /* sync IO */
|
|
- BLK_TC_SYNCIO = BLK_TC_SYNC,
|
|
BLK_TC_QUEUE = 1 << 4, /* queueing/merging */
|
|
BLK_TC_REQUEUE = 1 << 5, /* requeueing */
|
|
BLK_TC_ISSUE = 1 << 6, /* issue */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/can/bcm.h linux-2.6.29-rc3.owrt/include/linux/can/bcm.h
|
|
--- linux-2.6.29.owrt/include/linux/can/bcm.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/can/bcm.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -14,8 +14,6 @@
|
|
#ifndef CAN_BCM_H
|
|
#define CAN_BCM_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/**
|
|
* struct bcm_msg_head - head of messages to/from the broadcast manager
|
|
* @opcode: opcode, see enum below.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/capability.h linux-2.6.29-rc3.owrt/include/linux/capability.h
|
|
--- linux-2.6.29.owrt/include/linux/capability.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/capability.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -69,6 +69,10 @@
|
|
#define VFS_CAP_U32 VFS_CAP_U32_2
|
|
#define VFS_CAP_REVISION VFS_CAP_REVISION_2
|
|
|
|
+#ifdef CONFIG_SECURITY_FILE_CAPABILITIES
|
|
+extern int file_caps_enabled;
|
|
+#endif
|
|
+
|
|
struct vfs_cap_data {
|
|
__le32 magic_etc; /* Little endian */
|
|
struct {
|
|
@@ -92,10 +96,6 @@
|
|
#define _KERNEL_CAPABILITY_VERSION _LINUX_CAPABILITY_VERSION_3
|
|
#define _KERNEL_CAPABILITY_U32S _LINUX_CAPABILITY_U32S_3
|
|
|
|
-#ifdef CONFIG_SECURITY_FILE_CAPABILITIES
|
|
-extern int file_caps_enabled;
|
|
-#endif
|
|
-
|
|
typedef struct kernel_cap_struct {
|
|
__u32 cap[_KERNEL_CAPABILITY_U32S];
|
|
} kernel_cap_t;
|
|
@@ -393,10 +393,8 @@
|
|
# define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }})
|
|
# define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }})
|
|
# define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } })
|
|
-# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \
|
|
- | CAP_TO_MASK(CAP_SYS_RESOURCE) \
|
|
- | CAP_TO_MASK(CAP_MKNOD), \
|
|
- CAP_FS_MASK_B1 } })
|
|
+# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \
|
|
+ CAP_FS_MASK_B1 } })
|
|
|
|
#endif /* _KERNEL_CAPABILITY_U32S != 2 */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/cdrom.h linux-2.6.29-rc3.owrt/include/linux/cdrom.h
|
|
--- linux-2.6.29.owrt/include/linux/cdrom.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/cdrom.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -11,7 +11,6 @@
|
|
#ifndef _LINUX_CDROM_H
|
|
#define _LINUX_CDROM_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
/*******************************************************
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/cgroup.h linux-2.6.29-rc3.owrt/include/linux/cgroup.h
|
|
--- linux-2.6.29.owrt/include/linux/cgroup.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/cgroup.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -99,7 +99,6 @@
|
|
while (!atomic_inc_not_zero(&css->refcnt)) {
|
|
if (test_bit(CSS_REMOVED, &css->flags))
|
|
return false;
|
|
- cpu_relax();
|
|
}
|
|
return true;
|
|
}
|
|
@@ -378,7 +377,6 @@
|
|
* - initiating hotplug events
|
|
*/
|
|
struct mutex hierarchy_mutex;
|
|
- struct lock_class_key subsys_key;
|
|
|
|
/*
|
|
* Link to parent, and list entry in parent's children.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/cgroupstats.h linux-2.6.29-rc3.owrt/include/linux/cgroupstats.h
|
|
--- linux-2.6.29.owrt/include/linux/cgroupstats.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/cgroupstats.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -15,7 +15,6 @@
|
|
#ifndef _LINUX_CGROUPSTATS_H
|
|
#define _LINUX_CGROUPSTATS_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/taskstats.h>
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/clockchips.h linux-2.6.29-rc3.owrt/include/linux/clockchips.h
|
|
--- linux-2.6.29.owrt/include/linux/clockchips.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/clockchips.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -36,7 +36,6 @@
|
|
CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
|
|
CLOCK_EVT_NOTIFY_SUSPEND,
|
|
CLOCK_EVT_NOTIFY_RESUME,
|
|
- CLOCK_EVT_NOTIFY_CPU_DYING,
|
|
CLOCK_EVT_NOTIFY_CPU_DEAD,
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/compiler-gcc.h linux-2.6.29-rc3.owrt/include/linux/compiler-gcc.h
|
|
--- linux-2.6.29.owrt/include/linux/compiler-gcc.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/compiler-gcc.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -52,15 +52,7 @@
|
|
#define __deprecated __attribute__((deprecated))
|
|
#define __packed __attribute__((packed))
|
|
#define __weak __attribute__((weak))
|
|
-
|
|
-/*
|
|
- * it doesn't make sense on ARM (currently the only user of __naked) to trace
|
|
- * naked functions because then mcount is called without stack and frame pointer
|
|
- * being set up and there is no chance to restore the lr register to the value
|
|
- * before mcount was called.
|
|
- */
|
|
-#define __naked __attribute__((naked)) notrace
|
|
-
|
|
+#define __naked __attribute__((naked))
|
|
#define __noreturn __attribute__((noreturn))
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/cpufreq.h linux-2.6.29-rc3.owrt/include/linux/cpufreq.h
|
|
--- linux-2.6.29.owrt/include/linux/cpufreq.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/cpufreq.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -234,6 +234,7 @@
|
|
int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg);
|
|
int (*resume) (struct cpufreq_policy *policy);
|
|
struct freq_attr **attr;
|
|
+ bool hide_interface;
|
|
};
|
|
|
|
/* flags */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/crypto.h linux-2.6.29-rc3.owrt/include/linux/crypto.h
|
|
--- linux-2.6.29.owrt/include/linux/crypto.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/crypto.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -552,12 +552,7 @@
|
|
const struct crypto_type *frontend,
|
|
u32 type, u32 mask);
|
|
struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask);
|
|
-void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm);
|
|
-
|
|
-static inline void crypto_free_tfm(struct crypto_tfm *tfm)
|
|
-{
|
|
- return crypto_destroy_tfm(tfm, tfm);
|
|
-}
|
|
+void crypto_free_tfm(struct crypto_tfm *tfm);
|
|
|
|
int alg_test(const char *driver, const char *alg, u32 type, u32 mask);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dca.h linux-2.6.29-rc3.owrt/include/linux/dca.h
|
|
--- linux-2.6.29.owrt/include/linux/dca.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dca.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,23 +1,3 @@
|
|
-/*
|
|
- * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU General Public License as published by the Free
|
|
- * Software Foundation; either version 2 of the License, or (at your option)
|
|
- * any later version.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but WITHOUT
|
|
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
- * more details.
|
|
- *
|
|
- * You should have received a copy of the GNU General Public License along with
|
|
- * this program; if not, write to the Free Software Foundation, Inc., 59
|
|
- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
- *
|
|
- * The full GNU General Public License is included in this distribution in the
|
|
- * file called COPYING.
|
|
- */
|
|
#ifndef DCA_H
|
|
#define DCA_H
|
|
/* DCA Provider API */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dcbnl.h linux-2.6.29-rc3.owrt/include/linux/dcbnl.h
|
|
--- linux-2.6.29.owrt/include/linux/dcbnl.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dcbnl.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -20,12 +20,10 @@
|
|
#ifndef __LINUX_DCBNL_H__
|
|
#define __LINUX_DCBNL_H__
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define DCB_PROTO_VERSION 1
|
|
|
|
struct dcbmsg {
|
|
- __u8 dcb_family;
|
|
+ unsigned char dcb_family;
|
|
__u8 cmd;
|
|
__u16 dcb_pad;
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/device.h linux-2.6.29-rc3.owrt/include/linux/device.h
|
|
--- linux-2.6.29.owrt/include/linux/device.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/device.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -147,8 +147,6 @@
|
|
extern struct device_driver *driver_find(const char *name,
|
|
struct bus_type *bus);
|
|
extern int driver_probe_done(void);
|
|
-extern int wait_for_device_probe(void);
|
|
-
|
|
|
|
/* sysfs interface for exporting driver attributes */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dlm_plock.h linux-2.6.29-rc3.owrt/include/linux/dlm_plock.h
|
|
--- linux-2.6.29.owrt/include/linux/dlm_plock.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dlm_plock.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -9,8 +9,6 @@
|
|
#ifndef __DLM_PLOCK_DOT_H__
|
|
#define __DLM_PLOCK_DOT_H__
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define DLM_PLOCK_MISC_NAME "dlm_plock"
|
|
|
|
#define DLM_PLOCK_VERSION_MAJOR 1
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dmaengine.h linux-2.6.29-rc3.owrt/include/linux/dmaengine.h
|
|
--- linux-2.6.29.owrt/include/linux/dmaengine.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dmaengine.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -97,6 +97,7 @@
|
|
|
|
/**
|
|
* struct dma_chan_percpu - the per-CPU part of struct dma_chan
|
|
+ * @refcount: local_t used for open-coded "bigref" counting
|
|
* @memcpy_count: transaction counter
|
|
* @bytes_transferred: byte counter
|
|
*/
|
|
@@ -113,11 +114,13 @@
|
|
* @cookie: last cookie value returned to client
|
|
* @chan_id: channel ID for sysfs
|
|
* @dev: class device for sysfs
|
|
+ * @refcount: kref, used in "bigref" slow-mode
|
|
+ * @slow_ref: indicates that the DMA channel is free
|
|
+ * @rcu: the DMA channel's RCU head
|
|
* @device_node: used to add this to the device chan list
|
|
* @local: per-cpu pointer to a struct dma_chan_percpu
|
|
* @client-count: how many clients are using this channel
|
|
* @table_count: number of appearances in the mem-to-mem allocation table
|
|
- * @private: private data for certain client-channel associations
|
|
*/
|
|
struct dma_chan {
|
|
struct dma_device *device;
|
|
@@ -131,7 +134,6 @@
|
|
struct dma_chan_percpu *local;
|
|
int client_count;
|
|
int table_count;
|
|
- void *private;
|
|
};
|
|
|
|
/**
|
|
@@ -209,6 +211,8 @@
|
|
* @global_node: list_head for global dma_device_list
|
|
* @cap_mask: one or more dma_capability flags
|
|
* @max_xor: maximum number of xor sources, 0 if no capability
|
|
+ * @refcount: reference count
|
|
+ * @done: IO completion struct
|
|
* @dev_id: unique device ID
|
|
* @dev: struct device reference for dma mapping api
|
|
* @device_alloc_chan_resources: allocate resources and return the
|
|
@@ -221,7 +225,6 @@
|
|
* @device_prep_dma_interrupt: prepares an end of chain interrupt operation
|
|
* @device_prep_slave_sg: prepares a slave dma operation
|
|
* @device_terminate_all: terminate all pending operations
|
|
- * @device_is_tx_complete: poll for transaction completion
|
|
* @device_issue_pending: push pending transactions to hardware
|
|
*/
|
|
struct dma_device {
|
|
@@ -279,18 +282,6 @@
|
|
}
|
|
#endif
|
|
|
|
-#ifdef CONFIG_NET_DMA
|
|
-#define net_dmaengine_get() dmaengine_get()
|
|
-#define net_dmaengine_put() dmaengine_put()
|
|
-#else
|
|
-static inline void net_dmaengine_get(void)
|
|
-{
|
|
-}
|
|
-static inline void net_dmaengine_put(void)
|
|
-{
|
|
-}
|
|
-#endif
|
|
-
|
|
dma_cookie_t dma_async_memcpy_buf_to_buf(struct dma_chan *chan,
|
|
void *dest, void *src, size_t len);
|
|
dma_cookie_t dma_async_memcpy_buf_to_pg(struct dma_chan *chan,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dn.h linux-2.6.29-rc3.owrt/include/linux/dn.h
|
|
--- linux-2.6.29.owrt/include/linux/dn.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dn.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef _LINUX_DN_H
|
|
#define _LINUX_DN_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/*
|
|
|
|
DECnet Data Structures and Constants
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dvb/audio.h linux-2.6.29-rc3.owrt/include/linux/dvb/audio.h
|
|
--- linux-2.6.29.owrt/include/linux/dvb/audio.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dvb/audio.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -24,7 +24,12 @@
|
|
#ifndef _DVBAUDIO_H_
|
|
#define _DVBAUDIO_H_
|
|
|
|
+#ifdef __KERNEL__
|
|
#include <linux/types.h>
|
|
+#else
|
|
+#include <stdint.h>
|
|
+#endif
|
|
+
|
|
|
|
typedef enum {
|
|
AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dvb/dmx.h linux-2.6.29-rc3.owrt/include/linux/dvb/dmx.h
|
|
--- linux-2.6.29.owrt/include/linux/dvb/dmx.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dvb/dmx.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -24,7 +24,7 @@
|
|
#ifndef _DVBDMX_H_
|
|
#define _DVBDMX_H_
|
|
|
|
-#include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
#ifdef __KERNEL__
|
|
#include <linux/time.h>
|
|
#else
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dvb/frontend.h linux-2.6.29-rc3.owrt/include/linux/dvb/frontend.h
|
|
--- linux-2.6.29.owrt/include/linux/dvb/frontend.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dvb/frontend.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -26,7 +26,8 @@
|
|
#ifndef _DVBFRONTEND_H_
|
|
#define _DVBFRONTEND_H_
|
|
|
|
-#include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
+
|
|
|
|
typedef enum fe_type {
|
|
FE_QPSK,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dvb/net.h linux-2.6.29-rc3.owrt/include/linux/dvb/net.h
|
|
--- linux-2.6.29.owrt/include/linux/dvb/net.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dvb/net.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -24,7 +24,8 @@
|
|
#ifndef _DVBNET_H_
|
|
#define _DVBNET_H_
|
|
|
|
-#include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
+
|
|
|
|
struct dvb_net_if {
|
|
__u16 pid;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/dvb/video.h linux-2.6.29-rc3.owrt/include/linux/dvb/video.h
|
|
--- linux-2.6.29.owrt/include/linux/dvb/video.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/dvb/video.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -24,14 +24,17 @@
|
|
#ifndef _DVBVIDEO_H_
|
|
#define _DVBVIDEO_H_
|
|
|
|
-#include <linux/types.h>
|
|
-#ifdef __KERNEL__
|
|
#include <linux/compiler.h>
|
|
+
|
|
+#ifdef __KERNEL__
|
|
+#include <linux/types.h>
|
|
#else
|
|
+#include <asm/types.h>
|
|
#include <stdint.h>
|
|
#include <time.h>
|
|
#endif
|
|
|
|
+
|
|
typedef enum {
|
|
VIDEO_FORMAT_4_3, /* Select 4:3 format */
|
|
VIDEO_FORMAT_16_9, /* Select 16:9 format. */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/edd.h linux-2.6.29-rc3.owrt/include/linux/edd.h
|
|
--- linux-2.6.29.owrt/include/linux/edd.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/edd.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -30,8 +30,6 @@
|
|
#ifndef _LINUX_EDD_H
|
|
#define _LINUX_EDD_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define EDDNR 0x1e9 /* addr of number of edd_info structs at EDDBUF
|
|
in boot_params - treat this as 1 byte */
|
|
#define EDDBUF 0xd00 /* addr of edd_info structs in boot_params */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/efs_fs_sb.h linux-2.6.29-rc3.owrt/include/linux/efs_fs_sb.h
|
|
--- linux-2.6.29.owrt/include/linux/efs_fs_sb.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/efs_fs_sb.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -9,7 +9,6 @@
|
|
#ifndef __EFS_FS_SB_H__
|
|
#define __EFS_FS_SB_H__
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/magic.h>
|
|
|
|
/* EFS superblock magic numbers */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/elf-fdpic.h linux-2.6.29-rc3.owrt/include/linux/elf-fdpic.h
|
|
--- linux-2.6.29.owrt/include/linux/elf-fdpic.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/elf-fdpic.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -58,13 +58,11 @@
|
|
#define ELF_FDPIC_FLAG_PRESENT 0x80000000 /* T if this object is present */
|
|
};
|
|
|
|
-#ifdef __KERNEL__
|
|
#ifdef CONFIG_MMU
|
|
extern void elf_fdpic_arch_lay_out_mm(struct elf_fdpic_params *exec_params,
|
|
struct elf_fdpic_params *interp_params,
|
|
unsigned long *start_stack,
|
|
unsigned long *start_brk);
|
|
#endif
|
|
-#endif /* __KERNEL__ */
|
|
|
|
#endif /* _LINUX_ELF_FDPIC_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/elf.h linux-2.6.29-rc3.owrt/include/linux/elf.h
|
|
--- linux-2.6.29.owrt/include/linux/elf.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/elf.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -377,7 +377,6 @@
|
|
Elf64_Word n_type; /* Content type */
|
|
} Elf64_Nhdr;
|
|
|
|
-#ifdef __KERNEL__
|
|
#if ELF_CLASS == ELFCLASS32
|
|
|
|
extern Elf32_Dyn _DYNAMIC [];
|
|
@@ -405,5 +404,5 @@
|
|
extern int elf_coredump_extra_notes_size(void);
|
|
extern int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset);
|
|
#endif
|
|
-#endif /* __KERNEL__ */
|
|
+
|
|
#endif /* _LINUX_ELF_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/errqueue.h linux-2.6.29-rc3.owrt/include/linux/errqueue.h
|
|
--- linux-2.6.29.owrt/include/linux/errqueue.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/errqueue.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef _LINUX_ERRQUEUE_H
|
|
#define _LINUX_ERRQUEUE_H 1
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
struct sock_extended_err
|
|
{
|
|
__u32 ee_errno;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/fb.h linux-2.6.29-rc3.owrt/include/linux/fb.h
|
|
--- linux-2.6.29.owrt/include/linux/fb.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/fb.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -960,21 +960,6 @@
|
|
extern int num_registered_fb;
|
|
extern struct class *fb_class;
|
|
|
|
-static inline int lock_fb_info(struct fb_info *info)
|
|
-{
|
|
- mutex_lock(&info->lock);
|
|
- if (!info->fbops) {
|
|
- mutex_unlock(&info->lock);
|
|
- return 0;
|
|
- }
|
|
- return 1;
|
|
-}
|
|
-
|
|
-static inline void unlock_fb_info(struct fb_info *info)
|
|
-{
|
|
- mutex_unlock(&info->lock);
|
|
-}
|
|
-
|
|
static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch,
|
|
u8 *src, u32 s_pitch, u32 height)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/firmware-map.h linux-2.6.29-rc3.owrt/include/linux/firmware-map.h
|
|
--- linux-2.6.29.owrt/include/linux/firmware-map.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/firmware-map.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* include/linux/firmware-map.h:
|
|
* Copyright (C) 2008 SUSE LINUX Products GmbH
|
|
- * by Bernhard Walle <bernhard.walle@gmx.de>
|
|
+ * by Bernhard Walle <bwalle@suse.de>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License v2.0 as published by
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/fs.h linux-2.6.29-rc3.owrt/include/linux/fs.h
|
|
--- linux-2.6.29.owrt/include/linux/fs.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/fs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -54,30 +54,24 @@
|
|
#define MAY_ACCESS 16
|
|
#define MAY_OPEN 32
|
|
|
|
-/*
|
|
- * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond
|
|
- * to O_WRONLY and O_RDWR via the strange trick in __dentry_open()
|
|
- */
|
|
-
|
|
/* file is open for reading */
|
|
#define FMODE_READ ((__force fmode_t)1)
|
|
/* file is open for writing */
|
|
#define FMODE_WRITE ((__force fmode_t)2)
|
|
/* file is seekable */
|
|
#define FMODE_LSEEK ((__force fmode_t)4)
|
|
-/* file can be accessed using pread */
|
|
+/* file can be accessed using pread/pwrite */
|
|
#define FMODE_PREAD ((__force fmode_t)8)
|
|
-/* file can be accessed using pwrite */
|
|
-#define FMODE_PWRITE ((__force fmode_t)16)
|
|
+#define FMODE_PWRITE FMODE_PREAD /* These go hand in hand */
|
|
/* File is opened for execution with sys_execve / sys_uselib */
|
|
-#define FMODE_EXEC ((__force fmode_t)32)
|
|
+#define FMODE_EXEC ((__force fmode_t)16)
|
|
/* File is opened with O_NDELAY (only set for block devices) */
|
|
-#define FMODE_NDELAY ((__force fmode_t)64)
|
|
+#define FMODE_NDELAY ((__force fmode_t)32)
|
|
/* File is opened with O_EXCL (only set for block devices) */
|
|
-#define FMODE_EXCL ((__force fmode_t)128)
|
|
+#define FMODE_EXCL ((__force fmode_t)64)
|
|
/* File is opened using open(.., 3, ..) and is writeable only for ioctls
|
|
(specialy hack for floppy.c) */
|
|
-#define FMODE_WRITE_IOCTL ((__force fmode_t)256)
|
|
+#define FMODE_WRITE_IOCTL ((__force fmode_t)128)
|
|
|
|
/*
|
|
* Don't update ctime and mtime.
|
|
@@ -93,10 +87,10 @@
|
|
#define WRITE 1
|
|
#define READA 2 /* read-ahead - don't block if no resources */
|
|
#define SWRITE 3 /* for ll_rw_block() - wait for buffer lock */
|
|
-#define READ_SYNC (READ | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
|
|
+#define READ_SYNC (READ | (1 << BIO_RW_SYNC))
|
|
#define READ_META (READ | (1 << BIO_RW_META))
|
|
-#define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
|
|
-#define SWRITE_SYNC (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
|
|
+#define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNC))
|
|
+#define SWRITE_SYNC (SWRITE | (1 << BIO_RW_SYNC))
|
|
#define WRITE_BARRIER (WRITE | (1 << BIO_RW_BARRIER))
|
|
#define DISCARD_NOBARRIER (1 << BIO_RW_DISCARD)
|
|
#define DISCARD_BARRIER ((1 << BIO_RW_DISCARD) | (1 << BIO_RW_BARRIER))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/genetlink.h linux-2.6.29-rc3.owrt/include/linux/genetlink.h
|
|
--- linux-2.6.29.owrt/include/linux/genetlink.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/genetlink.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_GENERIC_NETLINK_H
|
|
#define __LINUX_GENERIC_NETLINK_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/netlink.h>
|
|
|
|
#define GENL_NAMSIZ 16 /* length of family name */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/gfs2_ondisk.h linux-2.6.29-rc3.owrt/include/linux/gfs2_ondisk.h
|
|
--- linux-2.6.29.owrt/include/linux/gfs2_ondisk.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/gfs2_ondisk.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -10,8 +10,6 @@
|
|
#ifndef __GFS2_ONDISK_DOT_H__
|
|
#define __GFS2_ONDISK_DOT_H__
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define GFS2_MAGIC 0x01161970
|
|
#define GFS2_BASIC_BLOCK 512
|
|
#define GFS2_BASIC_BLOCK_SHIFT 9
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/hdreg.h linux-2.6.29-rc3.owrt/include/linux/hdreg.h
|
|
--- linux-2.6.29.owrt/include/linux/hdreg.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/hdreg.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -511,6 +511,7 @@
|
|
unsigned short words69_70[2]; /* reserved words 69-70
|
|
* future command overlap and queuing
|
|
*/
|
|
+ /* HDIO_GET_IDENTITY currently returns only words 0 through 70 */
|
|
unsigned short words71_74[4]; /* reserved words 71-74
|
|
* for IDENTIFY PACKET DEVICE command
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/hiddev.h linux-2.6.29-rc3.owrt/include/linux/hiddev.h
|
|
--- linux-2.6.29.owrt/include/linux/hiddev.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/hiddev.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -27,8 +27,6 @@
|
|
* Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
|
|
*/
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/*
|
|
* The event structure itself
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/hid.h linux-2.6.29-rc3.owrt/include/linux/hid.h
|
|
--- linux-2.6.29.owrt/include/linux/hid.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/hid.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -791,7 +791,6 @@
|
|
__FILE__ , ## arg)
|
|
#endif /* HID_FF */
|
|
|
|
-#ifdef __KERNEL__
|
|
#ifdef CONFIG_HID_COMPAT
|
|
#define HID_COMPAT_LOAD_DRIVER(name) \
|
|
/* prototype to avoid sparse warning */ \
|
|
@@ -805,7 +804,6 @@
|
|
extern void hid_compat_##name(void); \
|
|
hid_compat_##name(); \
|
|
} while (0)
|
|
-#endif /* __KERNEL__ */
|
|
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/hugetlb.h linux-2.6.29-rc3.owrt/include/linux/hugetlb.h
|
|
--- linux-2.6.29.owrt/include/linux/hugetlb.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/hugetlb.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -33,8 +33,7 @@
|
|
int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
unsigned long address, int write_access);
|
|
int hugetlb_reserve_pages(struct inode *inode, long from, long to,
|
|
- struct vm_area_struct *vma,
|
|
- int acctflags);
|
|
+ struct vm_area_struct *vma);
|
|
void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed);
|
|
|
|
extern unsigned long hugepages_treat_as_movable;
|
|
@@ -139,7 +138,7 @@
|
|
|
|
extern const struct file_operations hugetlbfs_file_operations;
|
|
extern struct vm_operations_struct hugetlb_vm_ops;
|
|
-struct file *hugetlb_file_setup(const char *name, size_t, int);
|
|
+struct file *hugetlb_file_setup(const char *name, size_t);
|
|
int hugetlb_get_quota(struct address_space *mapping, long delta);
|
|
void hugetlb_put_quota(struct address_space *mapping, long delta);
|
|
|
|
@@ -159,9 +158,9 @@
|
|
}
|
|
#else /* !CONFIG_HUGETLBFS */
|
|
|
|
-#define is_file_hugepages(file) 0
|
|
-#define set_file_hugepages(file) BUG()
|
|
-#define hugetlb_file_setup(name,size,acctflag) ERR_PTR(-ENOSYS)
|
|
+#define is_file_hugepages(file) 0
|
|
+#define set_file_hugepages(file) BUG()
|
|
+#define hugetlb_file_setup(name,size) ERR_PTR(-ENOSYS)
|
|
|
|
#endif /* !CONFIG_HUGETLBFS */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/i2c-dev.h linux-2.6.29-rc3.owrt/include/linux/i2c-dev.h
|
|
--- linux-2.6.29.owrt/include/linux/i2c-dev.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/i2c-dev.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -33,7 +33,7 @@
|
|
*/
|
|
#define I2C_RETRIES 0x0701 /* number of times a device address should
|
|
be polled when not acknowledging */
|
|
-#define I2C_TIMEOUT 0x0702 /* set timeout in units of 10 ms */
|
|
+#define I2C_TIMEOUT 0x0702 /* set timeout in jiffies - call with int */
|
|
|
|
/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses
|
|
* are NOT supported! (due to code brokenness)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/i2c.h linux-2.6.29-rc3.owrt/include/linux/i2c.h
|
|
--- linux-2.6.29.owrt/include/linux/i2c.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/i2c.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -361,7 +361,7 @@
|
|
struct mutex bus_lock;
|
|
struct mutex clist_lock;
|
|
|
|
- int timeout; /* in jiffies */
|
|
+ int timeout;
|
|
int retries;
|
|
struct device dev; /* the adapter device */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/icmpv6.h linux-2.6.29-rc3.owrt/include/linux/icmpv6.h
|
|
--- linux-2.6.29.owrt/include/linux/icmpv6.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/icmpv6.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef _LINUX_ICMPV6_H
|
|
#define _LINUX_ICMPV6_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
struct icmp6hdr {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/ide.h linux-2.6.29-rc3.owrt/include/linux/ide.h
|
|
--- linux-2.6.29.owrt/include/linux/ide.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/ide.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -663,7 +663,7 @@
|
|
#define to_ide_device(dev) container_of(dev, ide_drive_t, gendev)
|
|
|
|
#define to_ide_drv(obj, cont_type) \
|
|
- container_of(obj, struct cont_type, dev)
|
|
+ container_of(obj, struct cont_type, kref)
|
|
|
|
#define ide_drv_g(disk, cont_type) \
|
|
container_of((disk)->private_data, struct cont_type, driver)
|
|
@@ -797,7 +797,6 @@
|
|
struct scatterlist *sg_table;
|
|
int sg_max_nents; /* Maximum number of entries in it */
|
|
int sg_nents; /* Current number of entries in it */
|
|
- int orig_sg_nents;
|
|
int sg_dma_direction; /* dma transfer direction */
|
|
|
|
/* data phase of the active command (currently only valid for PIO/DMA) */
|
|
@@ -867,7 +866,6 @@
|
|
unsigned int n_ports;
|
|
struct device *dev[2];
|
|
unsigned int (*init_chipset)(struct pci_dev *);
|
|
- irq_handler_t irq_handler;
|
|
unsigned long host_flags;
|
|
void *host_priv;
|
|
ide_hwif_t *cur_port; /* for hosts requiring serialization */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_addr.h linux-2.6.29-rc3.owrt/include/linux/if_addr.h
|
|
--- linux-2.6.29.owrt/include/linux/if_addr.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_addr.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_IF_ADDR_H
|
|
#define __LINUX_IF_ADDR_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/netlink.h>
|
|
|
|
struct ifaddrmsg
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_addrlabel.h linux-2.6.29-rc3.owrt/include/linux/if_addrlabel.h
|
|
--- linux-2.6.29.owrt/include/linux/if_addrlabel.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_addrlabel.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -10,8 +10,6 @@
|
|
#ifndef __LINUX_IF_ADDRLABEL_H
|
|
#define __LINUX_IF_ADDRLABEL_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
struct ifaddrlblmsg
|
|
{
|
|
__u8 ifal_family; /* Address family */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_fc.h linux-2.6.29-rc3.owrt/include/linux/if_fc.h
|
|
--- linux-2.6.29.owrt/include/linux/if_fc.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_fc.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -20,7 +20,6 @@
|
|
#ifndef _LINUX_IF_FC_H
|
|
#define _LINUX_IF_FC_H
|
|
|
|
-#include <linux/types.h>
|
|
|
|
#define FC_ALEN 6 /* Octets in one ethernet addr */
|
|
#define FC_HLEN (sizeof(struct fch_hdr)+sizeof(struct fcllc))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_hippi.h linux-2.6.29-rc3.owrt/include/linux/if_hippi.h
|
|
--- linux-2.6.29.owrt/include/linux/if_hippi.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_hippi.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -22,7 +22,6 @@
|
|
#ifndef _LINUX_IF_HIPPI_H
|
|
#define _LINUX_IF_HIPPI_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_link.h linux-2.6.29-rc3.owrt/include/linux/if_link.h
|
|
--- linux-2.6.29.owrt/include/linux/if_link.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_link.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef _LINUX_IF_LINK_H
|
|
#define _LINUX_IF_LINK_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/netlink.h>
|
|
|
|
/* The struct should be in sync with struct net_device_stats */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_ppp.h linux-2.6.29-rc3.owrt/include/linux/if_ppp.h
|
|
--- linux-2.6.29.owrt/include/linux/if_ppp.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_ppp.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -33,7 +33,6 @@
|
|
#ifndef _IF_PPP_H_
|
|
#define _IF_PPP_H_
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/compiler.h>
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_strip.h linux-2.6.29-rc3.owrt/include/linux/if_strip.h
|
|
--- linux-2.6.29.owrt/include/linux/if_strip.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_strip.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -18,8 +18,6 @@
|
|
#ifndef __LINUX_STRIP_H
|
|
#define __LINUX_STRIP_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
typedef struct {
|
|
__u8 c[6];
|
|
} MetricomAddress;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_tr.h linux-2.6.29-rc3.owrt/include/linux/if_tr.h
|
|
--- linux-2.6.29.owrt/include/linux/if_tr.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_tr.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
#ifndef _LINUX_IF_TR_H
|
|
#define _LINUX_IF_TR_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/byteorder.h> /* For __be16 */
|
|
|
|
/* IEEE 802.5 Token-Ring magic constants. The frame sizes omit the preamble
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_tunnel.h linux-2.6.29-rc3.owrt/include/linux/if_tunnel.h
|
|
--- linux-2.6.29.owrt/include/linux/if_tunnel.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_tunnel.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2,10 +2,7 @@
|
|
#define _IF_TUNNEL_H_
|
|
|
|
#include <linux/types.h>
|
|
-
|
|
-#ifdef __KERNEL__
|
|
#include <linux/ip.h>
|
|
-#endif
|
|
|
|
#define SIOCGETTUNNEL (SIOCDEVPRIVATE + 0)
|
|
#define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/if_vlan.h linux-2.6.29-rc3.owrt/include/linux/if_vlan.h
|
|
--- linux-2.6.29.owrt/include/linux/if_vlan.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/if_vlan.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -210,7 +210,6 @@
|
|
|
|
/* Move the mac addresses to the beginning of the new header. */
|
|
memmove(skb->data, skb->data + VLAN_HLEN, 2 * VLAN_ETH_ALEN);
|
|
- skb->mac_header -= VLAN_HLEN;
|
|
|
|
/* first, the ethernet type */
|
|
veth->h_vlan_proto = htons(ETH_P_8021Q);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/igmp.h linux-2.6.29-rc3.owrt/include/linux/igmp.h
|
|
--- linux-2.6.29.owrt/include/linux/igmp.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/igmp.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -16,7 +16,6 @@
|
|
#ifndef _LINUX_IGMP_H
|
|
#define _LINUX_IGMP_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/inet_diag.h linux-2.6.29-rc3.owrt/include/linux/inet_diag.h
|
|
--- linux-2.6.29.owrt/include/linux/inet_diag.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/inet_diag.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef _INET_DIAG_H_
|
|
#define _INET_DIAG_H_ 1
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/* Just some random number */
|
|
#define TCPDIAG_GETSOCK 18
|
|
#define DCCPDIAG_GETSOCK 19
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/init_task.h linux-2.6.29-rc3.owrt/include/linux/init_task.h
|
|
--- linux-2.6.29.owrt/include/linux/init_task.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/init_task.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -48,11 +48,12 @@
|
|
.posix_timers = LIST_HEAD_INIT(sig.posix_timers), \
|
|
.cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers), \
|
|
.rlim = INIT_RLIMITS, \
|
|
- .cputimer = { \
|
|
- .cputime = INIT_CPUTIME, \
|
|
- .running = 0, \
|
|
- .lock = __SPIN_LOCK_UNLOCKED(sig.cputimer.lock), \
|
|
- }, \
|
|
+ .cputime = { .totals = { \
|
|
+ .utime = cputime_zero, \
|
|
+ .stime = cputime_zero, \
|
|
+ .sum_exec_runtime = 0, \
|
|
+ .lock = __SPIN_LOCK_UNLOCKED(sig.cputime.totals.lock), \
|
|
+ }, }, \
|
|
}
|
|
|
|
extern struct nsproxy init_nsproxy;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/intel-iommu.h linux-2.6.29-rc3.owrt/include/linux/intel-iommu.h
|
|
--- linux-2.6.29.owrt/include/linux/intel-iommu.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/intel-iommu.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -194,7 +194,6 @@
|
|
/* FSTS_REG */
|
|
#define DMA_FSTS_PPF ((u32)2)
|
|
#define DMA_FSTS_PFO ((u32)1)
|
|
-#define DMA_FSTS_IQE (1 << 4)
|
|
#define dma_fsts_fault_record_index(s) (((s) >> 8) & 0xff)
|
|
|
|
/* FRCD_REG, 32 bits access */
|
|
@@ -329,7 +328,7 @@
|
|
unsigned int size_order, u64 type,
|
|
int non_present_entry_flush);
|
|
|
|
-extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu);
|
|
+extern void qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu);
|
|
|
|
extern void *intel_alloc_coherent(struct device *, size_t, dma_addr_t *, gfp_t);
|
|
extern void intel_free_coherent(struct device *, size_t, void *, dma_addr_t);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/io-mapping.h linux-2.6.29-rc3.owrt/include/linux/io-mapping.h
|
|
--- linux-2.6.29.owrt/include/linux/io-mapping.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/io-mapping.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -30,13 +30,10 @@
|
|
* See Documentation/io_mapping.txt
|
|
*/
|
|
|
|
-#ifdef CONFIG_HAVE_ATOMIC_IOMAP
|
|
+/* this struct isn't actually defined anywhere */
|
|
+struct io_mapping;
|
|
|
|
-struct io_mapping {
|
|
- resource_size_t base;
|
|
- unsigned long size;
|
|
- pgprot_t prot;
|
|
-};
|
|
+#ifdef CONFIG_HAVE_ATOMIC_IOMAP
|
|
|
|
/*
|
|
* For small address space machines, mapping large objects
|
|
@@ -46,40 +43,23 @@
|
|
*/
|
|
|
|
static inline struct io_mapping *
|
|
-io_mapping_create_wc(resource_size_t base, unsigned long size)
|
|
+io_mapping_create_wc(unsigned long base, unsigned long size)
|
|
{
|
|
- struct io_mapping *iomap;
|
|
-
|
|
- if (!is_io_mapping_possible(base, size))
|
|
- return NULL;
|
|
-
|
|
- iomap = kmalloc(sizeof(*iomap), GFP_KERNEL);
|
|
- if (!iomap)
|
|
- return NULL;
|
|
-
|
|
- iomap->base = base;
|
|
- iomap->size = size;
|
|
- iomap->prot = pgprot_writecombine(__pgprot(__PAGE_KERNEL));
|
|
- return iomap;
|
|
+ return (struct io_mapping *) base;
|
|
}
|
|
|
|
static inline void
|
|
io_mapping_free(struct io_mapping *mapping)
|
|
{
|
|
- kfree(mapping);
|
|
}
|
|
|
|
/* Atomic map/unmap */
|
|
static inline void *
|
|
io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset)
|
|
{
|
|
- resource_size_t phys_addr;
|
|
- unsigned long pfn;
|
|
-
|
|
- BUG_ON(offset >= mapping->size);
|
|
- phys_addr = mapping->base + offset;
|
|
- pfn = (unsigned long) (phys_addr >> PAGE_SHIFT);
|
|
- return iomap_atomic_prot_pfn(pfn, KM_USER0, mapping->prot);
|
|
+ offset += (unsigned long) mapping;
|
|
+ return iomap_atomic_prot_pfn(offset >> PAGE_SHIFT, KM_USER0,
|
|
+ __pgprot(__PAGE_KERNEL_WC));
|
|
}
|
|
|
|
static inline void
|
|
@@ -91,12 +71,8 @@
|
|
static inline void *
|
|
io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset)
|
|
{
|
|
- resource_size_t phys_addr;
|
|
-
|
|
- BUG_ON(offset >= mapping->size);
|
|
- phys_addr = mapping->base + offset;
|
|
-
|
|
- return ioremap_wc(phys_addr, PAGE_SIZE);
|
|
+ offset += (unsigned long) mapping;
|
|
+ return ioremap_wc(offset, PAGE_SIZE);
|
|
}
|
|
|
|
static inline void
|
|
@@ -107,12 +83,9 @@
|
|
|
|
#else
|
|
|
|
-/* this struct isn't actually defined anywhere */
|
|
-struct io_mapping;
|
|
-
|
|
/* Create the io_mapping object*/
|
|
static inline struct io_mapping *
|
|
-io_mapping_create_wc(resource_size_t base, unsigned long size)
|
|
+io_mapping_create_wc(unsigned long base, unsigned long size)
|
|
{
|
|
return (struct io_mapping *) ioremap_wc(base, size);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/ip6_tunnel.h linux-2.6.29-rc3.owrt/include/linux/ip6_tunnel.h
|
|
--- linux-2.6.29.owrt/include/linux/ip6_tunnel.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/ip6_tunnel.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef _IP6_TUNNEL_H
|
|
#define _IP6_TUNNEL_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define IPV6_TLV_TNL_ENCAP_LIMIT 4
|
|
#define IPV6_DEFAULT_TNL_ENCAP_LIMIT 4
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/ipv6.h linux-2.6.29-rc3.owrt/include/linux/ipv6.h
|
|
--- linux-2.6.29.owrt/include/linux/ipv6.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/ipv6.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef _IPV6_H
|
|
#define _IPV6_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/in6.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/ipv6_route.h linux-2.6.29-rc3.owrt/include/linux/ipv6_route.h
|
|
--- linux-2.6.29.owrt/include/linux/ipv6_route.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/ipv6_route.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -13,8 +13,6 @@
|
|
#ifndef _LINUX_IPV6_ROUTE_H
|
|
#define _LINUX_IPV6_ROUTE_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define RTF_DEFAULT 0x00010000 /* default - learned via ND */
|
|
#define RTF_ALLONLINK 0x00020000 /* (deprecated and will be removed)
|
|
fallback, no routers on link */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/ipx.h linux-2.6.29-rc3.owrt/include/linux/ipx.h
|
|
--- linux-2.6.29.owrt/include/linux/ipx.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/ipx.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,6 +1,5 @@
|
|
#ifndef _IPX_H_
|
|
#define _IPX_H_
|
|
-#include <linux/types.h>
|
|
#include <linux/sockios.h>
|
|
#include <linux/socket.h>
|
|
#define IPX_NODE_LEN 6
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/irda.h linux-2.6.29-rc3.owrt/include/linux/irda.h
|
|
--- linux-2.6.29.owrt/include/linux/irda.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/irda.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -25,8 +25,6 @@
|
|
#ifndef KERNEL_IRDA_H
|
|
#define KERNEL_IRDA_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/* Please do *not* add any #include in this file, this file is
|
|
* included as-is in user space.
|
|
* Please fix the calling file to properly included needed files before
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/jbd2.h linux-2.6.29-rc3.owrt/include/linux/jbd2.h
|
|
--- linux-2.6.29.owrt/include/linux/jbd2.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/jbd2.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -308,8 +308,7 @@
|
|
int val = (expr); \
|
|
if (!val) { \
|
|
printk(KERN_ERR \
|
|
- "JBD2 unexpected failure: %s: %s;\n", \
|
|
- __func__, #expr); \
|
|
+ "EXT3-fs unexpected failure: %s;\n",# expr); \
|
|
printk(KERN_ERR why "\n"); \
|
|
} \
|
|
val; \
|
|
@@ -1150,8 +1149,7 @@
|
|
extern int jbd2_journal_bmap(journal_t *, unsigned long, unsigned long long *);
|
|
extern int jbd2_journal_force_commit(journal_t *);
|
|
extern int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *inode);
|
|
-extern int jbd2_journal_begin_ordered_truncate(journal_t *journal,
|
|
- struct jbd2_inode *inode, loff_t new_size);
|
|
+extern int jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode, loff_t new_size);
|
|
extern void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode);
|
|
extern void jbd2_journal_release_jbd_inode(journal_t *journal, struct jbd2_inode *jinode);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/Kbuild linux-2.6.29-rc3.owrt/include/linux/Kbuild
|
|
--- linux-2.6.29.owrt/include/linux/Kbuild 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/Kbuild 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -41,7 +41,6 @@
|
|
header-y += bfs_fs.h
|
|
header-y += blkpg.h
|
|
header-y += bpqether.h
|
|
-header-y += bsg.h
|
|
header-y += can.h
|
|
header-y += cdk.h
|
|
header-y += chio.h
|
|
@@ -52,7 +51,6 @@
|
|
header-y += cgroupstats.h
|
|
header-y += cramfs_fs.h
|
|
header-y += cycx_cfm.h
|
|
-header-y += dcbnl.h
|
|
header-y += dlmconstants.h
|
|
header-y += dlm_device.h
|
|
header-y += dlm_netlink.h
|
|
@@ -91,6 +89,7 @@
|
|
header-y += if_slip.h
|
|
header-y += if_strip.h
|
|
header-y += if_tun.h
|
|
+header-y += if_tunnel.h
|
|
header-y += in_route.h
|
|
header-y += ioctl.h
|
|
header-y += ip6_tunnel.h
|
|
@@ -236,7 +235,6 @@
|
|
unifdef-y += if_pppol2tp.h
|
|
unifdef-y += if_pppox.h
|
|
unifdef-y += if_tr.h
|
|
-unifdef-y += if_tunnel.h
|
|
unifdef-y += if_vlan.h
|
|
unifdef-y += igmp.h
|
|
unifdef-y += inet_diag.h
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/kernel.h linux-2.6.29-rc3.owrt/include/linux/kernel.h
|
|
--- linux-2.6.29.owrt/include/linux/kernel.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/kernel.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -480,8 +480,7 @@
|
|
/*
|
|
* swap - swap value of @a and @b
|
|
*/
|
|
-#define swap(a, b) \
|
|
- do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
|
|
+#define swap(a, b) ({ typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; })
|
|
|
|
/**
|
|
* container_of - cast a member of a structure out to the containing structure
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/kprobes.h linux-2.6.29-rc3.owrt/include/linux/kprobes.h
|
|
--- linux-2.6.29.owrt/include/linux/kprobes.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/kprobes.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -49,13 +49,6 @@
|
|
|
|
/* Attach to insert probes on any functions which should be ignored*/
|
|
#define __kprobes __attribute__((__section__(".kprobes.text"))) notrace
|
|
-#else /* CONFIG_KPROBES */
|
|
-typedef int kprobe_opcode_t;
|
|
-struct arch_specific_insn {
|
|
- int dummy;
|
|
-};
|
|
-#define __kprobes notrace
|
|
-#endif /* CONFIG_KPROBES */
|
|
|
|
struct kprobe;
|
|
struct pt_regs;
|
|
@@ -138,6 +131,23 @@
|
|
/* For backward compatibility with old code using JPROBE_ENTRY() */
|
|
#define JPROBE_ENTRY(handler) (handler)
|
|
|
|
+DECLARE_PER_CPU(struct kprobe *, current_kprobe);
|
|
+DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
|
+
|
|
+#ifdef CONFIG_KRETPROBES
|
|
+extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
|
|
+ struct pt_regs *regs);
|
|
+extern int arch_trampoline_kprobe(struct kprobe *p);
|
|
+#else /* CONFIG_KRETPROBES */
|
|
+static inline void arch_prepare_kretprobe(struct kretprobe *rp,
|
|
+ struct pt_regs *regs)
|
|
+{
|
|
+}
|
|
+static inline int arch_trampoline_kprobe(struct kprobe *p)
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
+#endif /* CONFIG_KRETPROBES */
|
|
/*
|
|
* Function-return probe -
|
|
* Note:
|
|
@@ -178,25 +188,6 @@
|
|
unsigned long range;
|
|
};
|
|
|
|
-#ifdef CONFIG_KPROBES
|
|
-DECLARE_PER_CPU(struct kprobe *, current_kprobe);
|
|
-DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
|
-
|
|
-#ifdef CONFIG_KRETPROBES
|
|
-extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
|
|
- struct pt_regs *regs);
|
|
-extern int arch_trampoline_kprobe(struct kprobe *p);
|
|
-#else /* CONFIG_KRETPROBES */
|
|
-static inline void arch_prepare_kretprobe(struct kretprobe *rp,
|
|
- struct pt_regs *regs)
|
|
-{
|
|
-}
|
|
-static inline int arch_trampoline_kprobe(struct kprobe *p)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-#endif /* CONFIG_KRETPROBES */
|
|
-
|
|
extern struct kretprobe_blackpoint kretprobe_blacklist[];
|
|
|
|
static inline void kretprobe_assert(struct kretprobe_instance *ri,
|
|
@@ -273,6 +264,10 @@
|
|
|
|
#else /* CONFIG_KPROBES */
|
|
|
|
+#define __kprobes notrace
|
|
+struct jprobe;
|
|
+struct kretprobe;
|
|
+
|
|
static inline struct kprobe *get_kprobe(void *addr)
|
|
{
|
|
return NULL;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/kvm.h linux-2.6.29-rc3.owrt/include/linux/kvm.h
|
|
--- linux-2.6.29.owrt/include/linux/kvm.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/kvm.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -58,10 +58,10 @@
|
|
__u32 pad;
|
|
union {
|
|
char dummy[512]; /* reserving space */
|
|
-#ifdef __KVM_HAVE_PIT
|
|
+#ifdef CONFIG_X86
|
|
struct kvm_pic_state pic;
|
|
#endif
|
|
-#ifdef __KVM_HAVE_IOAPIC
|
|
+#if defined(CONFIG_X86) || defined(CONFIG_IA64)
|
|
struct kvm_ioapic_state ioapic;
|
|
#endif
|
|
} chip;
|
|
@@ -384,16 +384,16 @@
|
|
#define KVM_CAP_MP_STATE 14
|
|
#define KVM_CAP_COALESCED_MMIO 15
|
|
#define KVM_CAP_SYNC_MMU 16 /* Changes to host mmap are reflected in guest */
|
|
-#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
|
|
+#if defined(CONFIG_X86)||defined(CONFIG_IA64)
|
|
#define KVM_CAP_DEVICE_ASSIGNMENT 17
|
|
#endif
|
|
#define KVM_CAP_IOMMU 18
|
|
-#ifdef __KVM_HAVE_MSI
|
|
+#if defined(CONFIG_X86)
|
|
#define KVM_CAP_DEVICE_MSI 20
|
|
#endif
|
|
/* Bug in KVM_SET_USER_MEMORY_REGION fixed: */
|
|
#define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21
|
|
-#ifdef __KVM_HAVE_USER_NMI
|
|
+#if defined(CONFIG_X86)
|
|
#define KVM_CAP_USER_NMI 22
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/kvm_host.h linux-2.6.29-rc3.owrt/include/linux/kvm_host.h
|
|
--- linux-2.6.29.owrt/include/linux/kvm_host.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/kvm_host.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -285,7 +285,6 @@
|
|
struct kvm *kvm_arch_create_vm(void);
|
|
void kvm_arch_destroy_vm(struct kvm *kvm);
|
|
void kvm_free_all_assigned_devices(struct kvm *kvm);
|
|
-void kvm_arch_sync_events(struct kvm *kvm);
|
|
|
|
int kvm_cpu_get_interrupt(struct kvm_vcpu *v);
|
|
int kvm_cpu_has_interrupt(struct kvm_vcpu *v);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/libata.h linux-2.6.29-rc3.owrt/include/linux/libata.h
|
|
--- linux-2.6.29.owrt/include/linux/libata.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/libata.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -275,7 +275,7 @@
|
|
* advised to wait only for the following duration before
|
|
* doing SRST.
|
|
*/
|
|
- ATA_TMOUT_PMP_SRST_WAIT = 5000,
|
|
+ ATA_TMOUT_PMP_SRST_WAIT = 1000,
|
|
|
|
/* ATA bus states */
|
|
BUS_UNKNOWN = 0,
|
|
@@ -380,7 +380,6 @@
|
|
ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands
|
|
not multiple of 16 bytes */
|
|
ATA_HORKAGE_FIRMWARE_WARN = (1 << 12), /* firwmare update warning */
|
|
- ATA_HORKAGE_1_5_GBPS = (1 << 13), /* force 1.5 Gbps */
|
|
|
|
/* DMA mask for user DMA control: User visible values; DO NOT
|
|
renumber */
|
|
@@ -530,7 +529,6 @@
|
|
unsigned long flags; /* ATA_QCFLAG_xxx */
|
|
unsigned int tag;
|
|
unsigned int n_elem;
|
|
- unsigned int orig_n_elem;
|
|
|
|
int dma_dir;
|
|
|
|
@@ -582,7 +580,7 @@
|
|
acpi_handle acpi_handle;
|
|
union acpi_object *gtf_cache;
|
|
#endif
|
|
- /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */
|
|
+ /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */
|
|
u64 n_sectors; /* size of device, if ATA */
|
|
unsigned int class; /* ATA_DEV_xxx */
|
|
unsigned long unpark_deadline;
|
|
@@ -607,22 +605,20 @@
|
|
u16 heads; /* Number of heads */
|
|
u16 sectors; /* Number of sectors per track */
|
|
|
|
+ /* error history */
|
|
+ int spdn_cnt;
|
|
+ struct ata_ering ering;
|
|
+
|
|
union {
|
|
u16 id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */
|
|
u32 gscr[SATA_PMP_GSCR_DWORDS]; /* PMP GSCR block */
|
|
};
|
|
-
|
|
- /* error history */
|
|
- int spdn_cnt;
|
|
- /* ering is CLEAR_END, read comment above CLEAR_END */
|
|
- struct ata_ering ering;
|
|
};
|
|
|
|
-/* Fields between ATA_DEVICE_CLEAR_BEGIN and ATA_DEVICE_CLEAR_END are
|
|
- * cleared to zero on ata_dev_init().
|
|
+/* Offset into struct ata_device. Fields above it are maintained
|
|
+ * acress device init. Fields below are zeroed.
|
|
*/
|
|
-#define ATA_DEVICE_CLEAR_BEGIN offsetof(struct ata_device, n_sectors)
|
|
-#define ATA_DEVICE_CLEAR_END offsetof(struct ata_device, ering)
|
|
+#define ATA_DEVICE_CLEAR_OFFSET offsetof(struct ata_device, n_sectors)
|
|
|
|
struct ata_eh_info {
|
|
struct ata_device *dev; /* offending device */
|
|
@@ -751,8 +747,7 @@
|
|
acpi_handle acpi_handle;
|
|
struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */
|
|
#endif
|
|
- /* owned by EH */
|
|
- u8 sector_buf[ATA_SECT_SIZE] ____cacheline_aligned;
|
|
+ u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */
|
|
};
|
|
|
|
/* The following initializer overrides a method to NULL whether one of
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/lockd/lockd.h linux-2.6.29-rc3.owrt/include/linux/lockd/lockd.h
|
|
--- linux-2.6.29.owrt/include/linux/lockd/lockd.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/lockd/lockd.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -346,7 +346,6 @@
|
|
return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr;
|
|
}
|
|
|
|
-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
|
static inline int __nlm_cmp_addr6(const struct sockaddr *sap1,
|
|
const struct sockaddr *sap2)
|
|
{
|
|
@@ -354,13 +353,6 @@
|
|
const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2;
|
|
return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr);
|
|
}
|
|
-#else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
|
|
-static inline int __nlm_cmp_addr6(const struct sockaddr *sap1,
|
|
- const struct sockaddr *sap2)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-#endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
|
|
|
|
/*
|
|
* Compare two host addresses
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/minix_fs.h linux-2.6.29-rc3.owrt/include/linux/minix_fs.h
|
|
--- linux-2.6.29.owrt/include/linux/minix_fs.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/minix_fs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef _LINUX_MINIX_FS_H
|
|
#define _LINUX_MINIX_FS_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/magic.h>
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/mm.h linux-2.6.29-rc3.owrt/include/linux/mm.h
|
|
--- linux-2.6.29.owrt/include/linux/mm.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/mm.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1041,23 +1041,10 @@
|
|
typedef int (*work_fn_t)(unsigned long, unsigned long, void *);
|
|
extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data);
|
|
extern void sparse_memory_present_with_active_regions(int nid);
|
|
-#endif /* CONFIG_ARCH_POPULATES_NODE_MAP */
|
|
-
|
|
-#if !defined(CONFIG_ARCH_POPULATES_NODE_MAP) && \
|
|
- !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID)
|
|
-static inline int __early_pfn_to_nid(unsigned long pfn)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-#else
|
|
-/* please see mm/page_alloc.c */
|
|
-extern int __meminit early_pfn_to_nid(unsigned long pfn);
|
|
-#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
|
|
-/* there is a per-arch backend function. */
|
|
-extern int __meminit __early_pfn_to_nid(unsigned long pfn);
|
|
+#ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
|
|
+extern int early_pfn_to_nid(unsigned long pfn);
|
|
#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
|
|
-#endif
|
|
-
|
|
+#endif /* CONFIG_ARCH_POPULATES_NODE_MAP */
|
|
extern void set_dma_reserve(unsigned long new_dma_reserve);
|
|
extern void memmap_init_zone(unsigned long, int, unsigned long,
|
|
unsigned long, enum memmap_context);
|
|
@@ -1142,7 +1129,8 @@
|
|
unsigned long flag, unsigned long pgoff);
|
|
extern unsigned long mmap_region(struct file *file, unsigned long addr,
|
|
unsigned long len, unsigned long flags,
|
|
- unsigned int vm_flags, unsigned long pgoff);
|
|
+ unsigned int vm_flags, unsigned long pgoff,
|
|
+ int accountable);
|
|
|
|
static inline unsigned long do_mmap(struct file *file, unsigned long addr,
|
|
unsigned long len, unsigned long prot,
|
|
@@ -1172,7 +1160,6 @@
|
|
|
|
/* mm/page-writeback.c */
|
|
int write_one_page(struct page *page, int wait);
|
|
-void task_dirty_inc(struct task_struct *tsk);
|
|
|
|
/* readahead.c */
|
|
#define VM_MAX_READAHEAD 128 /* kbytes */
|
|
@@ -1318,6 +1305,5 @@
|
|
|
|
extern void *alloc_locked_buffer(size_t size);
|
|
extern void free_locked_buffer(void *buffer, size_t size);
|
|
-extern void release_locked_buffer(void *buffer, size_t size);
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _LINUX_MM_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/mm_types.h linux-2.6.29-rc3.owrt/include/linux/mm_types.h
|
|
--- linux-2.6.29.owrt/include/linux/mm_types.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/mm_types.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -276,7 +276,4 @@
|
|
#endif
|
|
};
|
|
|
|
-/* Future-safe accessor for struct mm_struct's cpu_vm_mask. */
|
|
-#define mm_cpumask(mm) (&(mm)->cpu_vm_mask)
|
|
-
|
|
#endif /* _LINUX_MM_TYPES_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/mmzone.h linux-2.6.29-rc3.owrt/include/linux/mmzone.h
|
|
--- linux-2.6.29.owrt/include/linux/mmzone.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/mmzone.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1071,7 +1071,7 @@
|
|
#endif /* CONFIG_SPARSEMEM */
|
|
|
|
#ifdef CONFIG_NODES_SPAN_OTHER_NODES
|
|
-bool early_pfn_in_nid(unsigned long pfn, int nid);
|
|
+#define early_pfn_in_nid(pfn, nid) (early_pfn_to_nid(pfn) == (nid))
|
|
#else
|
|
#define early_pfn_in_nid(pfn, nid) (1)
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/module.h linux-2.6.29-rc3.owrt/include/linux/module.h
|
|
--- linux-2.6.29.owrt/include/linux/module.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/module.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -219,6 +219,11 @@
|
|
|
|
#endif
|
|
|
|
+struct module_ref
|
|
+{
|
|
+ local_t count;
|
|
+} ____cacheline_aligned;
|
|
+
|
|
enum module_state
|
|
{
|
|
MODULE_STATE_LIVE,
|
|
@@ -339,11 +344,8 @@
|
|
/* Destruction function. */
|
|
void (*exit)(void);
|
|
|
|
-#ifdef CONFIG_SMP
|
|
- char *refptr;
|
|
-#else
|
|
- local_t ref;
|
|
-#endif
|
|
+ /* Reference counts */
|
|
+ struct module_ref ref[NR_CPUS];
|
|
#endif
|
|
};
|
|
#ifndef MODULE_ARCH_INIT
|
|
@@ -393,21 +395,13 @@
|
|
#define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x)
|
|
void symbol_put_addr(void *addr);
|
|
|
|
-static inline local_t *__module_ref_addr(struct module *mod, int cpu)
|
|
-{
|
|
-#ifdef CONFIG_SMP
|
|
- return (local_t *) (mod->refptr + per_cpu_offset(cpu));
|
|
-#else
|
|
- return &mod->ref;
|
|
-#endif
|
|
-}
|
|
-
|
|
/* Sometimes we know we already have a refcount, and it's easier not
|
|
to handle the error case (which only happens with rmmod --wait). */
|
|
static inline void __module_get(struct module *module)
|
|
{
|
|
if (module) {
|
|
- local_inc(__module_ref_addr(module, get_cpu()));
|
|
+ BUG_ON(module_refcount(module) == 0);
|
|
+ local_inc(&module->ref[get_cpu()].count);
|
|
put_cpu();
|
|
}
|
|
}
|
|
@@ -419,7 +413,7 @@
|
|
if (module) {
|
|
unsigned int cpu = get_cpu();
|
|
if (likely(module_is_live(module)))
|
|
- local_inc(__module_ref_addr(module, cpu));
|
|
+ local_inc(&module->ref[cpu].count);
|
|
else
|
|
ret = 0;
|
|
put_cpu();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/msdos_fs.h linux-2.6.29-rc3.owrt/include/linux/msdos_fs.h
|
|
--- linux-2.6.29.owrt/include/linux/msdos_fs.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/msdos_fs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef _LINUX_MSDOS_FS_H
|
|
#define _LINUX_MSDOS_FS_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/magic.h>
|
|
#include <asm/byteorder.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/neighbour.h linux-2.6.29-rc3.owrt/include/linux/neighbour.h
|
|
--- linux-2.6.29.owrt/include/linux/neighbour.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/neighbour.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_NEIGHBOUR_H
|
|
#define __LINUX_NEIGHBOUR_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/netlink.h>
|
|
|
|
struct ndmsg
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/netdevice.h linux-2.6.29-rc3.owrt/include/linux/netdevice.h
|
|
--- linux-2.6.29.owrt/include/linux/netdevice.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/netdevice.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1081,7 +1081,6 @@
|
|
extern int register_netdevice_notifier(struct notifier_block *nb);
|
|
extern int unregister_netdevice_notifier(struct notifier_block *nb);
|
|
extern int init_dummy_netdev(struct net_device *dev);
|
|
-extern void netdev_resync_ops(struct net_device *dev);
|
|
|
|
extern int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
|
|
extern struct net_device *dev_get_by_index(struct net *net, int ifindex);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/netfilter/xt_conntrack.h linux-2.6.29-rc3.owrt/include/linux/netfilter/xt_conntrack.h
|
|
--- linux-2.6.29.owrt/include/linux/netfilter/xt_conntrack.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/netfilter/xt_conntrack.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -5,7 +5,6 @@
|
|
#ifndef _XT_CONNTRACK_H
|
|
#define _XT_CONNTRACK_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/netfilter/nf_conntrack_tuple_common.h>
|
|
|
|
#define XT_CONNTRACK_STATE_BIT(ctinfo) (1 << ((ctinfo)%IP_CT_IS_REPLY+1))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/netfilter/xt_NFLOG.h linux-2.6.29-rc3.owrt/include/linux/netfilter/xt_NFLOG.h
|
|
--- linux-2.6.29.owrt/include/linux/netfilter/xt_NFLOG.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/netfilter/xt_NFLOG.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
#define _XT_NFLOG_TARGET
|
|
|
|
#define XT_NFLOG_DEFAULT_GROUP 0x1
|
|
-#define XT_NFLOG_DEFAULT_THRESHOLD 0
|
|
+#define XT_NFLOG_DEFAULT_THRESHOLD 1
|
|
|
|
#define XT_NFLOG_MASK 0x0
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/nfsacl.h linux-2.6.29-rc3.owrt/include/linux/nfsacl.h
|
|
--- linux-2.6.29.owrt/include/linux/nfsacl.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/nfsacl.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -37,9 +37,6 @@
|
|
#define NFSACL_MAXPAGES ((2*(8+12*NFS_ACL_MAX_ENTRIES) + PAGE_SIZE-1) \
|
|
>> PAGE_SHIFT)
|
|
|
|
-#define NFS_ACL_MAX_ENTRIES_INLINE (5)
|
|
-#define NFS_ACL_INLINE_BUFSIZE ((2*(2+3*NFS_ACL_MAX_ENTRIES_INLINE)) << 2)
|
|
-
|
|
static inline unsigned int
|
|
nfsacl_size(struct posix_acl *acl_access, struct posix_acl *acl_default)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/nfsd/export.h linux-2.6.29-rc3.owrt/include/linux/nfsd/export.h
|
|
--- linux-2.6.29.owrt/include/linux/nfsd/export.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/nfsd/export.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -10,8 +10,9 @@
|
|
#ifndef NFSD_EXPORT_H
|
|
#define NFSD_EXPORT_H
|
|
|
|
-# include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
#ifdef __KERNEL__
|
|
+# include <linux/types.h>
|
|
# include <linux/in.h>
|
|
#endif
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/nfsd/nfsfh.h linux-2.6.29-rc3.owrt/include/linux/nfsd/nfsfh.h
|
|
--- linux-2.6.29.owrt/include/linux/nfsd/nfsfh.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/nfsd/nfsfh.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -14,8 +14,9 @@
|
|
#ifndef _LINUX_NFSD_FH_H
|
|
#define _LINUX_NFSD_FH_H
|
|
|
|
-# include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
#ifdef __KERNEL__
|
|
+# include <linux/types.h>
|
|
# include <linux/string.h>
|
|
# include <linux/fs.h>
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/nfsd/syscall.h linux-2.6.29-rc3.owrt/include/linux/nfsd/syscall.h
|
|
--- linux-2.6.29.owrt/include/linux/nfsd/syscall.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/nfsd/syscall.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -9,8 +9,9 @@
|
|
#ifndef NFSD_SYSCALL_H
|
|
#define NFSD_SYSCALL_H
|
|
|
|
-# include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
#ifdef __KERNEL__
|
|
+# include <linux/types.h>
|
|
# include <linux/in.h>
|
|
#endif
|
|
#include <linux/posix_types.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/nfs_idmap.h linux-2.6.29-rc3.owrt/include/linux/nfs_idmap.h
|
|
--- linux-2.6.29.owrt/include/linux/nfs_idmap.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/nfs_idmap.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -37,8 +37,6 @@
|
|
#ifndef NFS_IDMAP_H
|
|
#define NFS_IDMAP_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/* XXX from bits/utmp.h */
|
|
#define IDMAP_NAMESZ 128
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/nfs_xdr.h linux-2.6.29-rc3.owrt/include/linux/nfs_xdr.h
|
|
--- linux-2.6.29.owrt/include/linux/nfs_xdr.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/nfs_xdr.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -406,8 +406,6 @@
|
|
int mask;
|
|
struct posix_acl * acl_access;
|
|
struct posix_acl * acl_default;
|
|
- size_t len;
|
|
- unsigned int npages;
|
|
struct page ** pages;
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/nubus.h linux-2.6.29-rc3.owrt/include/linux/nubus.h
|
|
--- linux-2.6.29.owrt/include/linux/nubus.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/nubus.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -12,7 +12,6 @@
|
|
#ifndef LINUX_NUBUS_H
|
|
#define LINUX_NUBUS_H
|
|
|
|
-#include <linux/types.h>
|
|
#ifdef __KERNEL__
|
|
#include <asm/nubus.h>
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/pci.h linux-2.6.29-rc3.owrt/include/linux/pci.h
|
|
--- linux-2.6.29.owrt/include/linux/pci.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/pci.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -684,7 +684,7 @@
|
|
void pci_disable_rom(struct pci_dev *pdev);
|
|
void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);
|
|
void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);
|
|
-size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size);
|
|
+size_t pci_get_rom_size(void __iomem *rom, size_t size);
|
|
|
|
/* Power management related routines */
|
|
int pci_save_state(struct pci_dev *dev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/pci_ids.h linux-2.6.29-rc3.owrt/include/linux/pci_ids.h
|
|
--- linux-2.6.29.owrt/include/linux/pci_ids.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/pci_ids.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1312,7 +1312,6 @@
|
|
#define PCI_DEVICE_ID_VIA_VT3351 0x0351
|
|
#define PCI_DEVICE_ID_VIA_VT3364 0x0364
|
|
#define PCI_DEVICE_ID_VIA_8371_0 0x0391
|
|
-#define PCI_DEVICE_ID_VIA_6415 0x0415
|
|
#define PCI_DEVICE_ID_VIA_8501_0 0x0501
|
|
#define PCI_DEVICE_ID_VIA_82C561 0x0561
|
|
#define PCI_DEVICE_ID_VIA_82C586_1 0x0571
|
|
@@ -1445,7 +1444,6 @@
|
|
#define PCI_DEVICE_ID_DIGI_DF_M_E 0x0071
|
|
#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_A 0x0072
|
|
#define PCI_DEVICE_ID_DIGI_DF_M_A 0x0073
|
|
-#define PCI_DEVICE_ID_DIGI_NEO_8 0x00B1
|
|
#define PCI_DEVICE_ID_NEO_2DB9 0x00C8
|
|
#define PCI_DEVICE_ID_NEO_2DB9PRI 0x00C9
|
|
#define PCI_DEVICE_ID_NEO_2RJ45 0x00CA
|
|
@@ -2323,9 +2321,6 @@
|
|
#define PCI_DEVICE_ID_INTEL_82378 0x0484
|
|
#define PCI_DEVICE_ID_INTEL_I960 0x0960
|
|
#define PCI_DEVICE_ID_INTEL_I960RM 0x0962
|
|
-#define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062
|
|
-#define PCI_DEVICE_ID_INTEL_82573E_SOL 0x1085
|
|
-#define PCI_DEVICE_ID_INTEL_82573L_SOL 0x108F
|
|
#define PCI_DEVICE_ID_INTEL_82815_MC 0x1130
|
|
#define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132
|
|
#define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221
|
|
@@ -2430,7 +2425,6 @@
|
|
#define PCI_DEVICE_ID_INTEL_ICH7_0 0x27b8
|
|
#define PCI_DEVICE_ID_INTEL_ICH7_1 0x27b9
|
|
#define PCI_DEVICE_ID_INTEL_ICH7_30 0x27b0
|
|
-#define PCI_DEVICE_ID_INTEL_TGP_LPC 0x27bc
|
|
#define PCI_DEVICE_ID_INTEL_ICH7_31 0x27bd
|
|
#define PCI_DEVICE_ID_INTEL_ICH7_17 0x27da
|
|
#define PCI_DEVICE_ID_INTEL_ICH7_19 0x27dd
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/phonet.h linux-2.6.29-rc3.owrt/include/linux/phonet.h
|
|
--- linux-2.6.29.owrt/include/linux/phonet.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/phonet.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -23,8 +23,6 @@
|
|
#ifndef LINUX_PHONET_H
|
|
#define LINUX_PHONET_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/* Automatic protocol selection */
|
|
#define PN_PROTO_TRANSPORT 0
|
|
/* Phonet datagram socket */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/pkt_cls.h linux-2.6.29-rc3.owrt/include/linux/pkt_cls.h
|
|
--- linux-2.6.29.owrt/include/linux/pkt_cls.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/pkt_cls.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_PKT_CLS_H
|
|
#define __LINUX_PKT_CLS_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/pkt_sched.h>
|
|
|
|
/* I think i could have done better macros ; for now this is stolen from
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/pkt_sched.h linux-2.6.29-rc3.owrt/include/linux/pkt_sched.h
|
|
--- linux-2.6.29.owrt/include/linux/pkt_sched.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/pkt_sched.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef __LINUX_PKT_SCHED_H
|
|
#define __LINUX_PKT_SCHED_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/* Logical priority bands not depending on specific packet scheduler.
|
|
Every scheduler will map them to real traffic classes, if it has
|
|
no more precise mechanism to classify packets.
|
|
@@ -544,7 +542,7 @@
|
|
|
|
struct tc_drr_stats
|
|
{
|
|
- __u32 deficit;
|
|
+ u32 deficit;
|
|
};
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/pm.h linux-2.6.29-rc3.owrt/include/linux/pm.h
|
|
--- linux-2.6.29.owrt/include/linux/pm.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/pm.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -381,12 +381,10 @@
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
extern void device_pm_lock(void);
|
|
-extern int sysdev_resume(void);
|
|
extern void device_power_up(pm_message_t state);
|
|
extern void device_resume(pm_message_t state);
|
|
|
|
extern void device_pm_unlock(void);
|
|
-extern int sysdev_suspend(pm_message_t state);
|
|
extern int device_power_down(pm_message_t state);
|
|
extern int device_suspend(pm_message_t state);
|
|
extern int device_prepare_suspend(pm_message_t state);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/ppp_defs.h linux-2.6.29-rc3.owrt/include/linux/ppp_defs.h
|
|
--- linux-2.6.29.owrt/include/linux/ppp_defs.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/ppp_defs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -25,8 +25,6 @@
|
|
* OR MODIFICATIONS.
|
|
*/
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/*
|
|
* ==FILEVERSION 20000114==
|
|
*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/raid/md_p.h linux-2.6.29-rc3.owrt/include/linux/raid/md_p.h
|
|
--- linux-2.6.29.owrt/include/linux/raid/md_p.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/raid/md_p.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -15,8 +15,6 @@
|
|
#ifndef _MD_P_H
|
|
#define _MD_P_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/*
|
|
* RAID superblock.
|
|
*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/random.h linux-2.6.29-rc3.owrt/include/linux/random.h
|
|
--- linux-2.6.29.owrt/include/linux/random.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/random.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -7,7 +7,6 @@
|
|
#ifndef _LINUX_RANDOM_H
|
|
#define _LINUX_RANDOM_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/ioctl.h>
|
|
#include <linux/irqnr.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/rcuclassic.h linux-2.6.29-rc3.owrt/include/linux/rcuclassic.h
|
|
--- linux-2.6.29.owrt/include/linux/rcuclassic.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/rcuclassic.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -181,10 +181,4 @@
|
|
#define rcu_enter_nohz() do { } while (0)
|
|
#define rcu_exit_nohz() do { } while (0)
|
|
|
|
-/* A context switch is a grace period for rcuclassic. */
|
|
-static inline int rcu_blocking_is_gp(void)
|
|
-{
|
|
- return num_online_cpus() == 1;
|
|
-}
|
|
-
|
|
#endif /* __LINUX_RCUCLASSIC_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/rcupdate.h linux-2.6.29-rc3.owrt/include/linux/rcupdate.h
|
|
--- linux-2.6.29.owrt/include/linux/rcupdate.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/rcupdate.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -52,9 +52,6 @@
|
|
void (*func)(struct rcu_head *head);
|
|
};
|
|
|
|
-/* Internal to kernel, but needed by rcupreempt.h. */
|
|
-extern int rcu_scheduler_active;
|
|
-
|
|
#if defined(CONFIG_CLASSIC_RCU)
|
|
#include <linux/rcuclassic.h>
|
|
#elif defined(CONFIG_TREE_RCU)
|
|
@@ -268,7 +265,6 @@
|
|
|
|
/* Internal to kernel */
|
|
extern void rcu_init(void);
|
|
-extern void rcu_scheduler_starting(void);
|
|
extern int rcu_needs_cpu(int cpu);
|
|
|
|
#endif /* __LINUX_RCUPDATE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/rcupreempt.h linux-2.6.29-rc3.owrt/include/linux/rcupreempt.h
|
|
--- linux-2.6.29.owrt/include/linux/rcupreempt.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/rcupreempt.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -142,19 +142,4 @@
|
|
#define rcu_exit_nohz() do { } while (0)
|
|
#endif /* CONFIG_NO_HZ */
|
|
|
|
-/*
|
|
- * A context switch is a grace period for rcupreempt synchronize_rcu()
|
|
- * only during early boot, before the scheduler has been initialized.
|
|
- * So, how the heck do we get a context switch? Well, if the caller
|
|
- * invokes synchronize_rcu(), they are willing to accept a context
|
|
- * switch, so we simply pretend that one happened.
|
|
- *
|
|
- * After boot, there might be a blocked or preempted task in an RCU
|
|
- * read-side critical section, so we cannot then take the fastpath.
|
|
- */
|
|
-static inline int rcu_blocking_is_gp(void)
|
|
-{
|
|
- return num_online_cpus() == 1 && !rcu_scheduler_active;
|
|
-}
|
|
-
|
|
#endif /* __LINUX_RCUPREEMPT_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/rcutree.h linux-2.6.29-rc3.owrt/include/linux/rcutree.h
|
|
--- linux-2.6.29.owrt/include/linux/rcutree.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/rcutree.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -326,10 +326,4 @@
|
|
}
|
|
#endif /* CONFIG_NO_HZ */
|
|
|
|
-/* A context switch is a grace period for rcutree. */
|
|
-static inline int rcu_blocking_is_gp(void)
|
|
-{
|
|
- return num_online_cpus() == 1;
|
|
-}
|
|
-
|
|
#endif /* __LINUX_RCUTREE_H */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/rtnetlink.h linux-2.6.29-rc3.owrt/include/linux/rtnetlink.h
|
|
--- linux-2.6.29.owrt/include/linux/rtnetlink.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/rtnetlink.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_RTNETLINK_H
|
|
#define __LINUX_RTNETLINK_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/netlink.h>
|
|
#include <linux/if_link.h>
|
|
#include <linux/if_addr.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/sched.h linux-2.6.29-rc3.owrt/include/linux/sched.h
|
|
--- linux-2.6.29.owrt/include/linux/sched.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/sched.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -453,33 +453,23 @@
|
|
cputime_t utime;
|
|
cputime_t stime;
|
|
unsigned long long sum_exec_runtime;
|
|
+ spinlock_t lock;
|
|
};
|
|
/* Alternate field names when used to cache expirations. */
|
|
#define prof_exp stime
|
|
#define virt_exp utime
|
|
#define sched_exp sum_exec_runtime
|
|
|
|
-#define INIT_CPUTIME \
|
|
- (struct task_cputime) { \
|
|
- .utime = cputime_zero, \
|
|
- .stime = cputime_zero, \
|
|
- .sum_exec_runtime = 0, \
|
|
- }
|
|
-
|
|
/**
|
|
- * struct thread_group_cputimer - thread group interval timer counts
|
|
- * @cputime: thread group interval timers.
|
|
- * @running: non-zero when there are timers running and
|
|
- * @cputime receives updates.
|
|
- * @lock: lock for fields in this struct.
|
|
+ * struct thread_group_cputime - thread group interval timer counts
|
|
+ * @totals: thread group interval timers; substructure for
|
|
+ * uniprocessor kernel, per-cpu for SMP kernel.
|
|
*
|
|
* This structure contains the version of task_cputime, above, that is
|
|
- * used for thread group CPU timer calculations.
|
|
+ * used for thread group CPU clock calculations.
|
|
*/
|
|
-struct thread_group_cputimer {
|
|
- struct task_cputime cputime;
|
|
- int running;
|
|
- spinlock_t lock;
|
|
+struct thread_group_cputime {
|
|
+ struct task_cputime totals;
|
|
};
|
|
|
|
/*
|
|
@@ -528,10 +518,10 @@
|
|
cputime_t it_prof_incr, it_virt_incr;
|
|
|
|
/*
|
|
- * Thread group totals for process CPU timers.
|
|
- * See thread_group_cputimer(), et al, for details.
|
|
+ * Thread group totals for process CPU clocks.
|
|
+ * See thread_group_cputime(), et al, for details.
|
|
*/
|
|
- struct thread_group_cputimer cputimer;
|
|
+ struct thread_group_cputime cputime;
|
|
|
|
/* Earliest-expiration cache. */
|
|
struct task_cputime cputime_expires;
|
|
@@ -568,7 +558,7 @@
|
|
* Live threads maintain their own counters and add to these
|
|
* in __exit_signal, except for the group leader.
|
|
*/
|
|
- cputime_t utime, stime, cutime, cstime;
|
|
+ cputime_t cutime, cstime;
|
|
cputime_t gtime;
|
|
cputime_t cgtime;
|
|
unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw;
|
|
@@ -577,14 +567,6 @@
|
|
struct task_io_accounting ioac;
|
|
|
|
/*
|
|
- * Cumulative ns of schedule CPU time fo dead threads in the
|
|
- * group, not including a zombie group leader, (This only differs
|
|
- * from jiffies_to_ns(utime + stime) if sched_clock uses something
|
|
- * other than jiffies.)
|
|
- */
|
|
- unsigned long long sum_sched_runtime;
|
|
-
|
|
- /*
|
|
* We don't bother to synchronize most readers of this at all,
|
|
* because there is no reader checking a limit that actually needs
|
|
* to get both rlim_cur and rlim_max atomically, and either one
|
|
@@ -648,6 +630,7 @@
|
|
atomic_t inotify_devs; /* How many inotify devs does this user have opened? */
|
|
#endif
|
|
#ifdef CONFIG_EPOLL
|
|
+ atomic_t epoll_devs; /* The number of epoll descriptors currently open */
|
|
atomic_t epoll_watches; /* The number of file descriptors currently watched */
|
|
#endif
|
|
#ifdef CONFIG_POSIX_MQUEUE
|
|
@@ -1419,9 +1402,6 @@
|
|
#endif
|
|
};
|
|
|
|
-/* Future-safe accessor for struct task_struct's cpus_allowed. */
|
|
-#define tsk_cpumask(tsk) (&(tsk)->cpus_allowed)
|
|
-
|
|
/*
|
|
* Priority of a process goes from 0..MAX_PRIO-1, valid RT
|
|
* priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
|
|
@@ -2203,14 +2183,27 @@
|
|
/*
|
|
* Thread group CPU time accounting.
|
|
*/
|
|
-void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times);
|
|
-void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times);
|
|
+
|
|
+static inline
|
|
+void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
|
|
+{
|
|
+ struct task_cputime *totals = &tsk->signal->cputime.totals;
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&totals->lock, flags);
|
|
+ *times = *totals;
|
|
+ spin_unlock_irqrestore(&totals->lock, flags);
|
|
+}
|
|
|
|
static inline void thread_group_cputime_init(struct signal_struct *sig)
|
|
{
|
|
- sig->cputimer.cputime = INIT_CPUTIME;
|
|
- spin_lock_init(&sig->cputimer.lock);
|
|
- sig->cputimer.running = 0;
|
|
+ sig->cputime.totals = (struct task_cputime){
|
|
+ .utime = cputime_zero,
|
|
+ .stime = cputime_zero,
|
|
+ .sum_exec_runtime = 0,
|
|
+ };
|
|
+
|
|
+ spin_lock_init(&sig->cputime.totals.lock);
|
|
}
|
|
|
|
static inline void thread_group_cputime_free(struct signal_struct *sig)
|
|
@@ -2294,13 +2287,9 @@
|
|
extern int sched_group_set_rt_period(struct task_group *tg,
|
|
long rt_period_us);
|
|
extern long sched_group_rt_period(struct task_group *tg);
|
|
-extern int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk);
|
|
#endif
|
|
#endif
|
|
|
|
-extern int task_can_switch_user(struct user_struct *up,
|
|
- struct task_struct *tsk);
|
|
-
|
|
#ifdef CONFIG_TASK_XACCT
|
|
static inline void add_rchar(struct task_struct *tsk, ssize_t amt)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/seq_file.h linux-2.6.29-rc3.owrt/include/linux/seq_file.h
|
|
--- linux-2.6.29.owrt/include/linux/seq_file.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/seq_file.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -19,7 +19,6 @@
|
|
size_t from;
|
|
size_t count;
|
|
loff_t index;
|
|
- loff_t read_pos;
|
|
u64 version;
|
|
struct mutex lock;
|
|
const struct seq_operations *op;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/serial_core.h linux-2.6.29-rc3.owrt/include/linux/serial_core.h
|
|
--- linux-2.6.29.owrt/include/linux/serial_core.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/serial_core.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -296,7 +296,6 @@
|
|
#define UPF_HARDPPS_CD ((__force upf_t) (1 << 11))
|
|
#define UPF_LOW_LATENCY ((__force upf_t) (1 << 13))
|
|
#define UPF_BUGGY_UART ((__force upf_t) (1 << 14))
|
|
-#define UPF_NO_TXEN_TEST ((__force upf_t) (1 << 15))
|
|
#define UPF_MAGIC_MULTIPLIER ((__force upf_t) (1 << 16))
|
|
#define UPF_CONS_FLOW ((__force upf_t) (1 << 23))
|
|
#define UPF_SHARE_IRQ ((__force upf_t) (1 << 24))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/serio.h linux-2.6.29-rc3.owrt/include/linux/serio.h
|
|
--- linux-2.6.29.owrt/include/linux/serio.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/serio.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -212,7 +212,7 @@
|
|
#define SERIO_FUJITSU 0x35
|
|
#define SERIO_ZHENHUA 0x36
|
|
#define SERIO_INEXIO 0x37
|
|
-#define SERIO_TOUCHIT213 0x38
|
|
+#define SERIO_TOUCHIT213 0x37
|
|
#define SERIO_W8001 0x39
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/signalfd.h linux-2.6.29-rc3.owrt/include/linux/signalfd.h
|
|
--- linux-2.6.29.owrt/include/linux/signalfd.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/signalfd.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -8,7 +8,6 @@
|
|
#ifndef _LINUX_SIGNALFD_H
|
|
#define _LINUX_SIGNALFD_H
|
|
|
|
-#include <linux/types.h>
|
|
/* For O_CLOEXEC and O_NONBLOCK */
|
|
#include <linux/fcntl.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/skbuff.h linux-2.6.29-rc3.owrt/include/linux/skbuff.h
|
|
--- linux-2.6.29.owrt/include/linux/skbuff.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/skbuff.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -434,6 +434,15 @@
|
|
void *here);
|
|
extern void skb_under_panic(struct sk_buff *skb, int len,
|
|
void *here);
|
|
+extern void skb_truesize_bug(struct sk_buff *skb);
|
|
+
|
|
+static inline void skb_truesize_check(struct sk_buff *skb)
|
|
+{
|
|
+ int len = sizeof(struct sk_buff) + skb->len;
|
|
+
|
|
+ if (unlikely((int)skb->truesize < len))
|
|
+ skb_truesize_bug(skb);
|
|
+}
|
|
|
|
extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
|
|
int getfrag(void *from, char *to, int offset,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/slab_def.h linux-2.6.29-rc3.owrt/include/linux/slab_def.h
|
|
--- linux-2.6.29.owrt/include/linux/slab_def.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/slab_def.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -43,7 +43,10 @@
|
|
i++;
|
|
#include <linux/kmalloc_sizes.h>
|
|
#undef CACHE
|
|
- return NULL;
|
|
+ {
|
|
+ extern void __you_cannot_kmalloc_that_much(void);
|
|
+ __you_cannot_kmalloc_that_much();
|
|
+ }
|
|
found:
|
|
#ifdef CONFIG_ZONE_DMA
|
|
if (flags & GFP_DMA)
|
|
@@ -74,7 +77,10 @@
|
|
i++;
|
|
#include <linux/kmalloc_sizes.h>
|
|
#undef CACHE
|
|
- return NULL;
|
|
+ {
|
|
+ extern void __you_cannot_kmalloc_that_much(void);
|
|
+ __you_cannot_kmalloc_that_much();
|
|
+ }
|
|
found:
|
|
#ifdef CONFIG_ZONE_DMA
|
|
if (flags & GFP_DMA)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/slab.h linux-2.6.29-rc3.owrt/include/linux/slab.h
|
|
--- linux-2.6.29.owrt/include/linux/slab.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/slab.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -127,7 +127,6 @@
|
|
void * __must_check __krealloc(const void *, size_t, gfp_t);
|
|
void * __must_check krealloc(const void *, size_t, gfp_t);
|
|
void kfree(const void *);
|
|
-void kzfree(const void *);
|
|
size_t ksize(const void *);
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/soundcard.h linux-2.6.29-rc3.owrt/include/linux/soundcard.h
|
|
--- linux-2.6.29.owrt/include/linux/soundcard.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/soundcard.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1045,36 +1045,50 @@
|
|
*/
|
|
#define LOCL_STARTAUDIO 1
|
|
|
|
-#if !defined(__KERNEL__) || defined(USE_SEQ_MACROS)
|
|
+#if (!defined(__KERNEL__) && !defined(KERNEL) && !defined(INKERNEL) && !defined(_KERNEL)) || defined(USE_SEQ_MACROS)
|
|
/*
|
|
* Some convenience macros to simplify programming of the
|
|
* /dev/sequencer interface
|
|
*
|
|
- * This is a legacy interface for applications written against
|
|
- * the OSSlib-3.8 style interface. It is no longer possible
|
|
- * to actually link against OSSlib with this header, but we
|
|
- * still provide these macros for programs using them.
|
|
- *
|
|
- * If you want to use OSSlib, it is recommended that you get
|
|
- * the GPL version of OSS-4.x and build against that version
|
|
- * of the header.
|
|
- *
|
|
- * We redefine the extern keyword so that make headers_check
|
|
- * does not complain about SEQ_USE_EXTBUF.
|
|
+ * These macros define the API which should be used when possible.
|
|
*/
|
|
#define SEQ_DECLAREBUF() SEQ_USE_EXTBUF()
|
|
|
|
void seqbuf_dump(void); /* This function must be provided by programs */
|
|
|
|
-#define SEQ_PM_DEFINES int __foo_bar___
|
|
-
|
|
-#define SEQ_LOAD_GMINSTR(dev, instr)
|
|
-#define SEQ_LOAD_GMDRUM(dev, drum)
|
|
+extern int OSS_init(int seqfd, int buflen);
|
|
+extern void OSS_seqbuf_dump(int fd, unsigned char *buf, int buflen);
|
|
+extern void OSS_seq_advbuf(int len, int fd, unsigned char *buf, int buflen);
|
|
+extern void OSS_seq_needbuf(int len, int fd, unsigned char *buf, int buflen);
|
|
+extern void OSS_patch_caching(int dev, int chn, int patch,
|
|
+ int fd, unsigned char *buf, int buflen);
|
|
+extern void OSS_drum_caching(int dev, int chn, int patch,
|
|
+ int fd, unsigned char *buf, int buflen);
|
|
+extern void OSS_write_patch(int fd, unsigned char *buf, int len);
|
|
+extern int OSS_write_patch2(int fd, unsigned char *buf, int len);
|
|
|
|
-#define _SEQ_EXTERN extern
|
|
-#define SEQ_USE_EXTBUF() \
|
|
- _SEQ_EXTERN unsigned char _seqbuf[]; \
|
|
- _SEQ_EXTERN int _seqbuflen; _SEQ_EXTERN int _seqbufptr
|
|
+#define SEQ_PM_DEFINES int __foo_bar___
|
|
+#ifdef OSSLIB
|
|
+# define SEQ_USE_EXTBUF() \
|
|
+ extern unsigned char *_seqbuf; \
|
|
+ extern int _seqbuflen;extern int _seqbufptr
|
|
+# define SEQ_DEFINEBUF(len) SEQ_USE_EXTBUF();static int _requested_seqbuflen=len
|
|
+# define _SEQ_ADVBUF(len) OSS_seq_advbuf(len, seqfd, _seqbuf, _seqbuflen)
|
|
+# define _SEQ_NEEDBUF(len) OSS_seq_needbuf(len, seqfd, _seqbuf, _seqbuflen)
|
|
+# define SEQ_DUMPBUF() OSS_seqbuf_dump(seqfd, _seqbuf, _seqbuflen)
|
|
+
|
|
+# define SEQ_LOAD_GMINSTR(dev, instr) \
|
|
+ OSS_patch_caching(dev, -1, instr, seqfd, _seqbuf, _seqbuflen)
|
|
+# define SEQ_LOAD_GMDRUM(dev, drum) \
|
|
+ OSS_drum_caching(dev, -1, drum, seqfd, _seqbuf, _seqbuflen)
|
|
+#else /* !OSSLIB */
|
|
+
|
|
+# define SEQ_LOAD_GMINSTR(dev, instr)
|
|
+# define SEQ_LOAD_GMDRUM(dev, drum)
|
|
+
|
|
+# define SEQ_USE_EXTBUF() \
|
|
+ extern unsigned char _seqbuf[]; \
|
|
+ extern int _seqbuflen;extern int _seqbufptr
|
|
|
|
#ifndef USE_SIMPLE_MACROS
|
|
/* Sample seqbuf_dump() implementation:
|
|
@@ -1117,6 +1131,7 @@
|
|
*/
|
|
#define _SEQ_NEEDBUF(len) /* empty */
|
|
#endif
|
|
+#endif /* !OSSLIB */
|
|
|
|
#define SEQ_VOLUME_MODE(dev, mode) {_SEQ_NEEDBUF(8);\
|
|
_seqbuf[_seqbufptr] = SEQ_EXTENDED;\
|
|
@@ -1200,8 +1215,14 @@
|
|
_CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)
|
|
|
|
#define SEQ_SET_PATCH SEQ_PGM_CHANGE
|
|
-#define SEQ_PGM_CHANGE(dev, chn, patch) \
|
|
+#ifdef OSSLIB
|
|
+# define SEQ_PGM_CHANGE(dev, chn, patch) \
|
|
+ {OSS_patch_caching(dev, chn, patch, seqfd, _seqbuf, _seqbuflen); \
|
|
+ _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0);}
|
|
+#else
|
|
+# define SEQ_PGM_CHANGE(dev, chn, patch) \
|
|
_CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)
|
|
+#endif
|
|
|
|
#define SEQ_CONTROL(dev, chn, controller, value) \
|
|
_CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)
|
|
@@ -1279,12 +1300,19 @@
|
|
/*
|
|
* Patch loading.
|
|
*/
|
|
-#define SEQ_WRPATCH(patchx, len) \
|
|
+#ifdef OSSLIB
|
|
+# define SEQ_WRPATCH(patchx, len) \
|
|
+ OSS_write_patch(seqfd, (char*)(patchx), len)
|
|
+# define SEQ_WRPATCH2(patchx, len) \
|
|
+ OSS_write_patch2(seqfd, (char*)(patchx), len)
|
|
+#else
|
|
+# define SEQ_WRPATCH(patchx, len) \
|
|
{if (_seqbufptr) SEQ_DUMPBUF();\
|
|
if (write(seqfd, (char*)(patchx), len)==-1) \
|
|
perror("Write patch: /dev/sequencer");}
|
|
-#define SEQ_WRPATCH2(patchx, len) \
|
|
+# define SEQ_WRPATCH2(patchx, len) \
|
|
(SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len))
|
|
+#endif
|
|
|
|
#endif
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/sound.h linux-2.6.29-rc3.owrt/include/linux/sound.h
|
|
--- linux-2.6.29.owrt/include/linux/sound.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/sound.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -25,7 +25,6 @@
|
|
#define SND_DEV_AMIDI 13 /* Like /dev/midi (obsolete) */
|
|
#define SND_DEV_ADMMIDI 14 /* Like /dev/dmmidi (onsolete) */
|
|
|
|
-#ifdef __KERNEL__
|
|
/*
|
|
* Sound core interface functions
|
|
*/
|
|
@@ -41,4 +40,3 @@
|
|
extern void unregister_sound_mixer(int unit);
|
|
extern void unregister_sound_midi(int unit);
|
|
extern void unregister_sound_dsp(int unit);
|
|
-#endif /* __KERNEL__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/spi/spi_bitbang.h linux-2.6.29-rc3.owrt/include/linux/spi/spi_bitbang.h
|
|
--- linux-2.6.29.owrt/include/linux/spi/spi_bitbang.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/spi/spi_bitbang.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -83,13 +83,6 @@
|
|
* int getmiso(struct spi_device *);
|
|
* void spidelay(unsigned);
|
|
*
|
|
- * setsck()'s is_on parameter is a zero/nonzero boolean.
|
|
- *
|
|
- * setmosi()'s is_on parameter is a zero/nonzero boolean.
|
|
- *
|
|
- * getmiso() is required to return 0 or 1 only. Any other value is invalid
|
|
- * and will result in improper operation.
|
|
- *
|
|
* A non-inlined routine would call bitbang_txrx_*() routines. The
|
|
* main loop could easily compile down to a handful of instructions,
|
|
* especially if the delay is a NOP (to run at peak speed).
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/spi/spidev.h linux-2.6.29-rc3.owrt/include/linux/spi/spidev.h
|
|
--- linux-2.6.29.owrt/include/linux/spi/spidev.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/spi/spidev.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -22,7 +22,6 @@
|
|
#ifndef SPIDEV_H
|
|
#define SPIDEV_H
|
|
|
|
-#include <linux/types.h>
|
|
|
|
/* User space versions of kernel symbols for SPI clocking modes,
|
|
* matching <linux/spi/spi.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/spinlock.h linux-2.6.29-rc3.owrt/include/linux/spinlock.h
|
|
--- linux-2.6.29.owrt/include/linux/spinlock.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/spinlock.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -124,12 +124,7 @@
|
|
#ifdef CONFIG_GENERIC_LOCKBREAK
|
|
#define spin_is_contended(lock) ((lock)->break_lock)
|
|
#else
|
|
-
|
|
-#ifdef __raw_spin_is_contended
|
|
#define spin_is_contended(lock) __raw_spin_is_contended(&(lock)->raw_lock)
|
|
-#else
|
|
-#define spin_is_contended(lock) (((void)(lock), 0))
|
|
-#endif /*__raw_spin_is_contended*/
|
|
#endif
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/synclink.h linux-2.6.29-rc3.owrt/include/linux/synclink.h
|
|
--- linux-2.6.29.owrt/include/linux/synclink.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/synclink.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -13,8 +13,6 @@
|
|
#define _SYNCLINK_H_
|
|
#define SYNCLINK_H_VERSION 3.6
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define BIT0 0x0001
|
|
#define BIT1 0x0002
|
|
#define BIT2 0x0004
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/syscalls.h linux-2.6.29-rc3.owrt/include/linux/syscalls.h
|
|
--- linux-2.6.29.owrt/include/linux/syscalls.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/syscalls.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -95,47 +95,42 @@
|
|
#define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__)
|
|
#define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__)
|
|
|
|
-#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
|
|
-#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
|
|
-#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
|
|
-#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
|
|
-#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
|
|
-#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
|
|
-#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
|
|
+#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
|
|
+#define SYSCALL_DEFINE1(...) SYSCALL_DEFINEx(1, __VA_ARGS__)
|
|
+#define SYSCALL_DEFINE2(...) SYSCALL_DEFINEx(2, __VA_ARGS__)
|
|
+#define SYSCALL_DEFINE3(...) SYSCALL_DEFINEx(3, __VA_ARGS__)
|
|
+#define SYSCALL_DEFINE4(...) SYSCALL_DEFINEx(4, __VA_ARGS__)
|
|
+#define SYSCALL_DEFINE5(...) SYSCALL_DEFINEx(5, __VA_ARGS__)
|
|
+#define SYSCALL_DEFINE6(...) SYSCALL_DEFINEx(6, __VA_ARGS__)
|
|
|
|
#ifdef CONFIG_PPC64
|
|
#define SYSCALL_ALIAS(alias, name) \
|
|
asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n" \
|
|
"\t.globl ." #alias "\n\t.set ." #alias ", ." #name)
|
|
#else
|
|
-#ifdef CONFIG_ALPHA
|
|
-#define SYSCALL_ALIAS(alias, name) \
|
|
- asm ( #alias " = " #name "\n\t.globl " #alias)
|
|
-#else
|
|
#define SYSCALL_ALIAS(alias, name) \
|
|
asm ("\t.globl " #alias "\n\t.set " #alias ", " #name)
|
|
#endif
|
|
-#endif
|
|
|
|
#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
|
|
|
|
#define SYSCALL_DEFINE(name) static inline long SYSC_##name
|
|
#define SYSCALL_DEFINEx(x, name, ...) \
|
|
- asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); \
|
|
- static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)); \
|
|
- asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__)) \
|
|
+ asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__)); \
|
|
+ static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__)); \
|
|
+ asmlinkage long SyS_##name(__SC_LONG##x(__VA_ARGS__)) \
|
|
{ \
|
|
__SC_TEST##x(__VA_ARGS__); \
|
|
- return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__)); \
|
|
+ return (long) SYSC_##name(__SC_CAST##x(__VA_ARGS__)); \
|
|
} \
|
|
- SYSCALL_ALIAS(sys##name, SyS##name); \
|
|
- static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))
|
|
+ SYSCALL_ALIAS(sys_##name, SyS_##name); \
|
|
+ static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__))
|
|
|
|
#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
|
|
|
|
#define SYSCALL_DEFINE(name) asmlinkage long sys_##name
|
|
#define SYSCALL_DEFINEx(x, name, ...) \
|
|
- asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
|
|
+ asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__))
|
|
|
|
#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/taskstats.h linux-2.6.29-rc3.owrt/include/linux/taskstats.h
|
|
--- linux-2.6.29.owrt/include/linux/taskstats.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/taskstats.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -16,8 +16,6 @@
|
|
#ifndef _LINUX_TASKSTATS_H
|
|
#define _LINUX_TASKSTATS_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
/* Format for per-task data returned to userland when
|
|
* - a task exits
|
|
* - listener requests stats for a task
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/tc_act/tc_gact.h linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_gact.h
|
|
--- linux-2.6.29.owrt/include/linux/tc_act/tc_gact.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_gact.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_TC_GACT_H
|
|
#define __LINUX_TC_GACT_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/pkt_cls.h>
|
|
|
|
#define TCA_ACT_GACT 5
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/tc_act/tc_mirred.h linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_mirred.h
|
|
--- linux-2.6.29.owrt/include/linux/tc_act/tc_mirred.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_mirred.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_TC_MIR_H
|
|
#define __LINUX_TC_MIR_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/pkt_cls.h>
|
|
|
|
#define TCA_ACT_MIRRED 8
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/tc_act/tc_pedit.h linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_pedit.h
|
|
--- linux-2.6.29.owrt/include/linux/tc_act/tc_pedit.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_pedit.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_TC_PED_H
|
|
#define __LINUX_TC_PED_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/pkt_cls.h>
|
|
|
|
#define TCA_ACT_PEDIT 7
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_cmp.h linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_cmp.h
|
|
--- linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_cmp.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_cmp.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_TC_EM_CMP_H
|
|
#define __LINUX_TC_EM_CMP_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/pkt_cls.h>
|
|
|
|
struct tcf_em_cmp
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_meta.h linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_meta.h
|
|
--- linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_meta.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_meta.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_TC_EM_META_H
|
|
#define __LINUX_TC_EM_META_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/pkt_cls.h>
|
|
|
|
enum
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_nbyte.h linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_nbyte.h
|
|
--- linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_nbyte.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_nbyte.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_TC_EM_NBYTE_H
|
|
#define __LINUX_TC_EM_NBYTE_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/pkt_cls.h>
|
|
|
|
struct tcf_em_nbyte
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_text.h linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_text.h
|
|
--- linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_text.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_text.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,7 +1,6 @@
|
|
#ifndef __LINUX_TC_EM_TEXT_H
|
|
#define __LINUX_TC_EM_TEXT_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/pkt_cls.h>
|
|
|
|
#define TC_EM_TEXT_ALGOSIZ 16
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/timerfd.h linux-2.6.29-rc3.owrt/include/linux/timerfd.h
|
|
--- linux-2.6.29.owrt/include/linux/timerfd.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/timerfd.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -11,21 +11,13 @@
|
|
/* For O_CLOEXEC and O_NONBLOCK */
|
|
#include <linux/fcntl.h>
|
|
|
|
-/*
|
|
- * CAREFUL: Check include/asm-generic/fcntl.h when defining
|
|
- * new flags, since they might collide with O_* ones. We want
|
|
- * to re-use O_* flags that couldn't possibly have a meaning
|
|
- * from eventfd, in order to leave a free define-space for
|
|
- * shared O_* flags.
|
|
- */
|
|
+/* Flags for timerfd_settime. */
|
|
#define TFD_TIMER_ABSTIME (1 << 0)
|
|
+
|
|
+/* Flags for timerfd_create. */
|
|
#define TFD_CLOEXEC O_CLOEXEC
|
|
#define TFD_NONBLOCK O_NONBLOCK
|
|
|
|
-#define TFD_SHARED_FCNTL_FLAGS (TFD_CLOEXEC | TFD_NONBLOCK)
|
|
-/* Flags for timerfd_create. */
|
|
-#define TFD_CREATE_FLAGS TFD_SHARED_FCNTL_FLAGS
|
|
-/* Flags for timerfd_settime. */
|
|
-#define TFD_SETTIME_FLAGS TFD_TIMER_ABSTIME
|
|
|
|
#endif /* _LINUX_TIMERFD_H */
|
|
+
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/usb/cdc.h linux-2.6.29-rc3.owrt/include/linux/usb/cdc.h
|
|
--- linux-2.6.29.owrt/include/linux/usb/cdc.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/usb/cdc.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -9,8 +9,6 @@
|
|
#ifndef __LINUX_USB_CDC_H
|
|
#define __LINUX_USB_CDC_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define USB_CDC_SUBCLASS_ACM 0x02
|
|
#define USB_CDC_SUBCLASS_ETHERNET 0x06
|
|
#define USB_CDC_SUBCLASS_WHCM 0x08
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/usb/gadgetfs.h linux-2.6.29-rc3.owrt/include/linux/usb/gadgetfs.h
|
|
--- linux-2.6.29.owrt/include/linux/usb/gadgetfs.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/usb/gadgetfs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -18,7 +18,7 @@
|
|
#ifndef __LINUX_USB_GADGETFS_H
|
|
#define __LINUX_USB_GADGETFS_H
|
|
|
|
-#include <linux/types.h>
|
|
+#include <asm/types.h>
|
|
#include <asm/ioctl.h>
|
|
|
|
#include <linux/usb/ch9.h>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/user_namespace.h linux-2.6.29-rc3.owrt/include/linux/user_namespace.h
|
|
--- linux-2.6.29.owrt/include/linux/user_namespace.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/user_namespace.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -13,7 +13,6 @@
|
|
struct kref kref;
|
|
struct hlist_head uidhash_table[UIDHASH_SZ];
|
|
struct user_struct *creator;
|
|
- struct work_struct destroyer;
|
|
};
|
|
|
|
extern struct user_namespace init_user_ns;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/video_decoder.h linux-2.6.29-rc3.owrt/include/linux/video_decoder.h
|
|
--- linux-2.6.29.owrt/include/linux/video_decoder.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/video_decoder.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef _LINUX_VIDEO_DECODER_H
|
|
#define _LINUX_VIDEO_DECODER_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define HAVE_VIDEO_DECODER 1
|
|
|
|
struct video_decoder_capability { /* this name is too long */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/videodev.h linux-2.6.29-rc3.owrt/include/linux/videodev.h
|
|
--- linux-2.6.29.owrt/include/linux/videodev.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/videodev.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -12,7 +12,6 @@
|
|
#ifndef __LINUX_VIDEODEV_H
|
|
#define __LINUX_VIDEODEV_H
|
|
|
|
-#include <linux/types.h>
|
|
#include <linux/ioctl.h>
|
|
#include <linux/videodev2.h>
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/video_encoder.h linux-2.6.29-rc3.owrt/include/linux/video_encoder.h
|
|
--- linux-2.6.29.owrt/include/linux/video_encoder.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/video_encoder.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef _LINUX_VIDEO_ENCODER_H
|
|
#define _LINUX_VIDEO_ENCODER_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
struct video_encoder_capability { /* this name is too long */
|
|
__u32 flags;
|
|
#define VIDEO_ENCODER_PAL 1 /* can encode PAL signal */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/virtio_blk.h linux-2.6.29-rc3.owrt/include/linux/virtio_blk.h
|
|
--- linux-2.6.29.owrt/include/linux/virtio_blk.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/virtio_blk.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2,7 +2,6 @@
|
|
#define _LINUX_VIRTIO_BLK_H
|
|
/* This header is BSD licensed so anyone can use the definitions to implement
|
|
* compatible drivers/servers. */
|
|
-#include <linux/types.h>
|
|
#include <linux/virtio_config.h>
|
|
|
|
/* The ID for virtio_block */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/virtio_console.h linux-2.6.29-rc3.owrt/include/linux/virtio_console.h
|
|
--- linux-2.6.29.owrt/include/linux/virtio_console.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/virtio_console.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,6 +1,5 @@
|
|
#ifndef _LINUX_VIRTIO_CONSOLE_H
|
|
#define _LINUX_VIRTIO_CONSOLE_H
|
|
-#include <linux/types.h>
|
|
#include <linux/virtio_config.h>
|
|
/* This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so
|
|
* anyone can use the definitions to implement compatible drivers/servers. */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/virtio_net.h linux-2.6.29-rc3.owrt/include/linux/virtio_net.h
|
|
--- linux-2.6.29.owrt/include/linux/virtio_net.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/virtio_net.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -2,7 +2,6 @@
|
|
#define _LINUX_VIRTIO_NET_H
|
|
/* This header is BSD licensed so anyone can use the definitions to implement
|
|
* compatible drivers/servers. */
|
|
-#include <linux/types.h>
|
|
#include <linux/virtio_config.h>
|
|
|
|
/* The ID for virtio_net */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/vmalloc.h linux-2.6.29-rc3.owrt/include/linux/vmalloc.h
|
|
--- linux-2.6.29.owrt/include/linux/vmalloc.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/vmalloc.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -84,10 +84,6 @@
|
|
unsigned long flags, void *caller);
|
|
extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags,
|
|
unsigned long start, unsigned long end);
|
|
-extern struct vm_struct *__get_vm_area_caller(unsigned long size,
|
|
- unsigned long flags,
|
|
- unsigned long start, unsigned long end,
|
|
- void *caller);
|
|
extern struct vm_struct *get_vm_area_node(unsigned long size,
|
|
unsigned long flags, int node,
|
|
gfp_t gfp_mask);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/linux/wait.h linux-2.6.29-rc3.owrt/include/linux/wait.h
|
|
--- linux-2.6.29.owrt/include/linux/wait.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/linux/wait.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -132,8 +132,6 @@
|
|
list_del(&old->task_list);
|
|
}
|
|
|
|
-void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
|
|
- int nr_exclusive, int sync, void *key);
|
|
void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key);
|
|
extern void __wake_up_locked(wait_queue_head_t *q, unsigned int mode);
|
|
extern void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr);
|
|
@@ -335,19 +333,16 @@
|
|
for (;;) { \
|
|
prepare_to_wait_exclusive(&wq, &__wait, \
|
|
TASK_INTERRUPTIBLE); \
|
|
- if (condition) { \
|
|
- finish_wait(&wq, &__wait); \
|
|
+ if (condition) \
|
|
break; \
|
|
- } \
|
|
if (!signal_pending(current)) { \
|
|
schedule(); \
|
|
continue; \
|
|
} \
|
|
ret = -ERESTARTSYS; \
|
|
- abort_exclusive_wait(&wq, &__wait, \
|
|
- TASK_INTERRUPTIBLE, NULL); \
|
|
break; \
|
|
} \
|
|
+ finish_wait(&wq, &__wait); \
|
|
} while (0)
|
|
|
|
#define wait_event_interruptible_exclusive(wq, condition) \
|
|
@@ -436,8 +431,6 @@
|
|
void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state);
|
|
void prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state);
|
|
void finish_wait(wait_queue_head_t *q, wait_queue_t *wait);
|
|
-void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
|
|
- unsigned int mode, void *key);
|
|
int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
|
|
int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/media/v4l2-device.h linux-2.6.29-rc3.owrt/include/media/v4l2-device.h
|
|
--- linux-2.6.29.owrt/include/media/v4l2-device.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/media/v4l2-device.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -94,16 +94,16 @@
|
|
/* Call the specified callback for all subdevs matching grp_id (if 0, then
|
|
match them all). Ignore any errors. Note that you cannot add or delete
|
|
a subdev while walking the subdevs list. */
|
|
-#define v4l2_device_call_all(dev, grpid, o, f, args...) \
|
|
+#define v4l2_device_call_all(dev, grp_id, o, f, args...) \
|
|
__v4l2_device_call_subdevs(dev, \
|
|
- !(grpid) || sd->grp_id == (grpid), o, f , ##args)
|
|
+ !(grp_id) || sd->grp_id == (grp_id), o, f , ##args)
|
|
|
|
/* Call the specified callback for all subdevs matching grp_id (if 0, then
|
|
match them all). If the callback returns an error other than 0 or
|
|
-ENOIOCTLCMD, then return with that error code. Note that you cannot
|
|
add or delete a subdev while walking the subdevs list. */
|
|
-#define v4l2_device_call_until_err(dev, grpid, o, f, args...) \
|
|
+#define v4l2_device_call_until_err(dev, grp_id, o, f, args...) \
|
|
__v4l2_device_call_subdevs_until_err(dev, \
|
|
- !(grpid) || sd->grp_id == (grpid), o, f , ##args)
|
|
+ !(grp_id) || sd->grp_id == (grp_id), o, f , ##args)
|
|
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/media/videobuf-dma-sg.h linux-2.6.29-rc3.owrt/include/media/videobuf-dma-sg.h
|
|
--- linux-2.6.29.owrt/include/media/videobuf-dma-sg.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/media/videobuf-dma-sg.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -49,7 +49,7 @@
|
|
* does memory allocation too using vmalloc_32().
|
|
*
|
|
* videobuf_dma_*()
|
|
- * see Documentation/PCI/PCI-DMA-mapping.txt, these functions to
|
|
+ * see Documentation/DMA-mapping.txt, these functions to
|
|
* basically the same. The map function does also build a
|
|
* scatterlist for the buffer (and unmap frees it ...)
|
|
*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/mtd/inftl-user.h linux-2.6.29-rc3.owrt/include/mtd/inftl-user.h
|
|
--- linux-2.6.29.owrt/include/mtd/inftl-user.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/mtd/inftl-user.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -6,8 +6,6 @@
|
|
#ifndef __MTD_INFTL_USER_H__
|
|
#define __MTD_INFTL_USER_H__
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define OSAK_VERSION 0x5120
|
|
#define PERCENTUSED 98
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/mtd/ubi-user.h linux-2.6.29-rc3.owrt/include/mtd/ubi-user.h
|
|
--- linux-2.6.29.owrt/include/mtd/ubi-user.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/mtd/ubi-user.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -40,37 +40,37 @@
|
|
* UBI volume creation
|
|
* ~~~~~~~~~~~~~~~~~~~
|
|
*
|
|
- * UBI volumes are created via the %UBI_IOCMKVOL ioctl command of UBI character
|
|
+ * UBI volumes are created via the %UBI_IOCMKVOL IOCTL command of UBI character
|
|
* device. A &struct ubi_mkvol_req object has to be properly filled and a
|
|
- * pointer to it has to be passed to the ioctl.
|
|
+ * pointer to it has to be passed to the IOCTL.
|
|
*
|
|
* UBI volume deletion
|
|
* ~~~~~~~~~~~~~~~~~~~
|
|
*
|
|
- * To delete a volume, the %UBI_IOCRMVOL ioctl command of the UBI character
|
|
+ * To delete a volume, the %UBI_IOCRMVOL IOCTL command of the UBI character
|
|
* device should be used. A pointer to the 32-bit volume ID hast to be passed
|
|
- * to the ioctl.
|
|
+ * to the IOCTL.
|
|
*
|
|
* UBI volume re-size
|
|
* ~~~~~~~~~~~~~~~~~~
|
|
*
|
|
- * To re-size a volume, the %UBI_IOCRSVOL ioctl command of the UBI character
|
|
+ * To re-size a volume, the %UBI_IOCRSVOL IOCTL command of the UBI character
|
|
* device should be used. A &struct ubi_rsvol_req object has to be properly
|
|
- * filled and a pointer to it has to be passed to the ioctl.
|
|
+ * filled and a pointer to it has to be passed to the IOCTL.
|
|
*
|
|
* UBI volumes re-name
|
|
* ~~~~~~~~~~~~~~~~~~~
|
|
*
|
|
* To re-name several volumes atomically at one go, the %UBI_IOCRNVOL command
|
|
* of the UBI character device should be used. A &struct ubi_rnvol_req object
|
|
- * has to be properly filled and a pointer to it has to be passed to the ioctl.
|
|
+ * has to be properly filled and a pointer to it has to be passed to the IOCTL.
|
|
*
|
|
* UBI volume update
|
|
* ~~~~~~~~~~~~~~~~~
|
|
*
|
|
- * Volume update should be done via the %UBI_IOCVOLUP ioctl command of the
|
|
+ * Volume update should be done via the %UBI_IOCVOLUP IOCTL command of the
|
|
* corresponding UBI volume character device. A pointer to a 64-bit update
|
|
- * size should be passed to the ioctl. After this, UBI expects user to write
|
|
+ * size should be passed to the IOCTL. After this, UBI expects user to write
|
|
* this number of bytes to the volume character device. The update is finished
|
|
* when the claimed number of bytes is passed. So, the volume update sequence
|
|
* is something like:
|
|
@@ -80,58 +80,14 @@
|
|
* write(fd, buf, image_size);
|
|
* close(fd);
|
|
*
|
|
- * Logical eraseblock erase
|
|
+ * Atomic eraseblock change
|
|
* ~~~~~~~~~~~~~~~~~~~~~~~~
|
|
*
|
|
- * To erase a logical eraseblock, the %UBI_IOCEBER ioctl command of the
|
|
- * corresponding UBI volume character device should be used. This command
|
|
- * unmaps the requested logical eraseblock, makes sure the corresponding
|
|
- * physical eraseblock is successfully erased, and returns.
|
|
- *
|
|
- * Atomic logical eraseblock change
|
|
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
- *
|
|
- * Atomic logical eraseblock change operation is called using the %UBI_IOCEBCH
|
|
- * ioctl command of the corresponding UBI volume character device. A pointer to
|
|
- * a &struct ubi_leb_change_req object has to be passed to the ioctl. Then the
|
|
- * user is expected to write the requested amount of bytes (similarly to what
|
|
- * should be done in case of the "volume update" ioctl).
|
|
- *
|
|
- * Logical eraseblock map
|
|
- * ~~~~~~~~~~~~~~~~~~~~~
|
|
- *
|
|
- * To map a logical eraseblock to a physical eraseblock, the %UBI_IOCEBMAP
|
|
- * ioctl command should be used. A pointer to a &struct ubi_map_req object is
|
|
- * expected to be passed. The ioctl maps the requested logical eraseblock to
|
|
- * a physical eraseblock and returns. Only non-mapped logical eraseblocks can
|
|
- * be mapped. If the logical eraseblock specified in the request is already
|
|
- * mapped to a physical eraseblock, the ioctl fails and returns error.
|
|
- *
|
|
- * Logical eraseblock unmap
|
|
- * ~~~~~~~~~~~~~~~~~~~~~~~~
|
|
- *
|
|
- * To unmap a logical eraseblock to a physical eraseblock, the %UBI_IOCEBUNMAP
|
|
- * ioctl command should be used. The ioctl unmaps the logical eraseblocks,
|
|
- * schedules corresponding physical eraseblock for erasure, and returns. Unlike
|
|
- * the "LEB erase" command, it does not wait for the physical eraseblock being
|
|
- * erased. Note, the side effect of this is that if an unclean reboot happens
|
|
- * after the unmap ioctl returns, you may find the LEB mapped again to the same
|
|
- * physical eraseblock after the UBI is run again.
|
|
- *
|
|
- * Check if logical eraseblock is mapped
|
|
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
- *
|
|
- * To check if a logical eraseblock is mapped to a physical eraseblock, the
|
|
- * %UBI_IOCEBISMAP ioctl command should be used. It returns %0 if the LEB is
|
|
- * not mapped, and %1 if it is mapped.
|
|
- *
|
|
- * Set an UBI volume property
|
|
- * ~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
- *
|
|
- * To set an UBI volume property the %UBI_IOCSETPROP ioctl command should be
|
|
- * used. A pointer to a &struct ubi_set_prop_req object is expected to be
|
|
- * passed. The object describes which property should be set, and to which value
|
|
- * it should be set.
|
|
+ * Atomic eraseblock change operation is done via the %UBI_IOCEBCH IOCTL
|
|
+ * command of the corresponding UBI volume character device. A pointer to
|
|
+ * &struct ubi_leb_change_req has to be passed to the IOCTL. Then the user is
|
|
+ * expected to write the requested amount of bytes. This is similar to the
|
|
+ * "volume update" IOCTL.
|
|
*/
|
|
|
|
/*
|
|
@@ -145,7 +101,7 @@
|
|
/* Maximum volume name length */
|
|
#define UBI_MAX_VOLUME_NAME 127
|
|
|
|
-/* ioctl commands of UBI character devices */
|
|
+/* IOCTL commands of UBI character devices */
|
|
|
|
#define UBI_IOC_MAGIC 'o'
|
|
|
|
@@ -158,7 +114,7 @@
|
|
/* Re-name volumes */
|
|
#define UBI_IOCRNVOL _IOW(UBI_IOC_MAGIC, 3, struct ubi_rnvol_req)
|
|
|
|
-/* ioctl commands of the UBI control character device */
|
|
+/* IOCTL commands of the UBI control character device */
|
|
|
|
#define UBI_CTRL_IOC_MAGIC 'o'
|
|
|
|
@@ -167,24 +123,16 @@
|
|
/* Detach an MTD device */
|
|
#define UBI_IOCDET _IOW(UBI_CTRL_IOC_MAGIC, 65, int32_t)
|
|
|
|
-/* ioctl commands of UBI volume character devices */
|
|
+/* IOCTL commands of UBI volume character devices */
|
|
|
|
#define UBI_VOL_IOC_MAGIC 'O'
|
|
|
|
/* Start UBI volume update */
|
|
#define UBI_IOCVOLUP _IOW(UBI_VOL_IOC_MAGIC, 0, int64_t)
|
|
-/* LEB erasure command, used for debugging, disabled by default */
|
|
+/* An eraseblock erasure command, used for debugging, disabled by default */
|
|
#define UBI_IOCEBER _IOW(UBI_VOL_IOC_MAGIC, 1, int32_t)
|
|
-/* Atomic LEB change command */
|
|
+/* An atomic eraseblock change command */
|
|
#define UBI_IOCEBCH _IOW(UBI_VOL_IOC_MAGIC, 2, int32_t)
|
|
-/* Map LEB command */
|
|
-#define UBI_IOCEBMAP _IOW(UBI_VOL_IOC_MAGIC, 3, struct ubi_map_req)
|
|
-/* Unmap LEB command */
|
|
-#define UBI_IOCEBUNMAP _IOW(UBI_VOL_IOC_MAGIC, 4, int32_t)
|
|
-/* Check if LEB is mapped command */
|
|
-#define UBI_IOCEBISMAP _IOR(UBI_VOL_IOC_MAGIC, 5, int32_t)
|
|
-/* Set an UBI volume property */
|
|
-#define UBI_IOCSETPROP _IOW(UBI_VOL_IOC_MAGIC, 6, struct ubi_set_prop_req)
|
|
|
|
/* Maximum MTD device name length supported by UBI */
|
|
#define MAX_UBI_MTD_NAME_LEN 127
|
|
@@ -220,16 +168,6 @@
|
|
UBI_STATIC_VOLUME = 4,
|
|
};
|
|
|
|
-/*
|
|
- * UBI set property ioctl constants
|
|
- *
|
|
- * @UBI_PROP_DIRECT_WRITE: allow / disallow user to directly write and
|
|
- * erase individual eraseblocks on dynamic volumes
|
|
- */
|
|
-enum {
|
|
- UBI_PROP_DIRECT_WRITE = 1,
|
|
-};
|
|
-
|
|
/**
|
|
* struct ubi_attach_req - attach MTD device request.
|
|
* @ubi_num: UBI device number to create
|
|
@@ -367,8 +305,8 @@
|
|
} __attribute__ ((packed));
|
|
|
|
/**
|
|
- * struct ubi_leb_change_req - a data structure used in atomic LEB change
|
|
- * requests.
|
|
+ * struct ubi_leb_change_req - a data structure used in atomic logical
|
|
+ * eraseblock change requests.
|
|
* @lnum: logical eraseblock number to change
|
|
* @bytes: how many bytes will be written to the logical eraseblock
|
|
* @dtype: data type (%UBI_LONGTERM, %UBI_SHORTTERM, %UBI_UNKNOWN)
|
|
@@ -381,30 +319,4 @@
|
|
int8_t padding[7];
|
|
} __attribute__ ((packed));
|
|
|
|
-/**
|
|
- * struct ubi_map_req - a data structure used in map LEB requests.
|
|
- * @lnum: logical eraseblock number to unmap
|
|
- * @dtype: data type (%UBI_LONGTERM, %UBI_SHORTTERM, %UBI_UNKNOWN)
|
|
- * @padding: reserved for future, not used, has to be zeroed
|
|
- */
|
|
-struct ubi_map_req {
|
|
- int32_t lnum;
|
|
- int8_t dtype;
|
|
- int8_t padding[3];
|
|
-} __attribute__ ((packed));
|
|
-
|
|
-
|
|
-/**
|
|
- * struct ubi_set_prop_req - a data structure used to set an ubi volume
|
|
- * property.
|
|
- * @property: property to set (%UBI_PROP_DIRECT_WRITE)
|
|
- * @padding: reserved for future, not used, has to be zeroed
|
|
- * @value: value to set
|
|
- */
|
|
-struct ubi_set_prop_req {
|
|
- uint8_t property;
|
|
- uint8_t padding[7];
|
|
- uint64_t value;
|
|
-} __attribute__ ((packed));
|
|
-
|
|
#endif /* __UBI_USER_H__ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/net/inet_hashtables.h linux-2.6.29-rc3.owrt/include/net/inet_hashtables.h
|
|
--- linux-2.6.29.owrt/include/net/inet_hashtables.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/net/inet_hashtables.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -182,7 +182,7 @@
|
|
size = 2048;
|
|
if (nr_pcpus >= 32)
|
|
size = 4096;
|
|
- if (sizeof(spinlock_t) != 0) {
|
|
+ if (sizeof(rwlock_t) != 0) {
|
|
#ifdef CONFIG_NUMA
|
|
if (size * sizeof(spinlock_t) > PAGE_SIZE)
|
|
hashinfo->ehash_locks = vmalloc(size * sizeof(spinlock_t));
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/net/netfilter/nf_conntrack_core.h linux-2.6.29-rc3.owrt/include/net/netfilter/nf_conntrack_core.h
|
|
--- linux-2.6.29.owrt/include/net/netfilter/nf_conntrack_core.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/net/netfilter/nf_conntrack_core.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -59,11 +59,10 @@
|
|
struct nf_conn *ct = (struct nf_conn *)skb->nfct;
|
|
int ret = NF_ACCEPT;
|
|
|
|
- if (ct && ct != &nf_conntrack_untracked) {
|
|
+ if (ct) {
|
|
if (!nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct))
|
|
ret = __nf_conntrack_confirm(skb);
|
|
- if (likely(ret == NF_ACCEPT))
|
|
- nf_ct_deliver_cached_events(ct);
|
|
+ nf_ct_deliver_cached_events(ct);
|
|
}
|
|
return ret;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/net/net_namespace.h linux-2.6.29-rc3.owrt/include/net/net_namespace.h
|
|
--- linux-2.6.29.owrt/include/net/net_namespace.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/net/net_namespace.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -109,6 +109,11 @@
|
|
#ifdef CONFIG_NET_NS
|
|
extern void __put_net(struct net *net);
|
|
|
|
+static inline int net_alive(struct net *net)
|
|
+{
|
|
+ return net && atomic_read(&net->count);
|
|
+}
|
|
+
|
|
static inline struct net *get_net(struct net *net)
|
|
{
|
|
atomic_inc(&net->count);
|
|
@@ -140,6 +145,11 @@
|
|
}
|
|
#else
|
|
|
|
+static inline int net_alive(struct net *net)
|
|
+{
|
|
+ return 1;
|
|
+}
|
|
+
|
|
static inline struct net *get_net(struct net *net)
|
|
{
|
|
return net;
|
|
@@ -224,23 +234,6 @@
|
|
void (*exit)(struct net *net);
|
|
};
|
|
|
|
-/*
|
|
- * Use these carefully. If you implement a network device and it
|
|
- * needs per network namespace operations use device pernet operations,
|
|
- * otherwise use pernet subsys operations.
|
|
- *
|
|
- * This is critically important. Most of the network code cleanup
|
|
- * runs with the assumption that dev_remove_pack has been called so no
|
|
- * new packets will arrive during and after the cleanup functions have
|
|
- * been called. dev_remove_pack is not per namespace so instead the
|
|
- * guarantee of no more packets arriving in a network namespace is
|
|
- * provided by ensuring that all network devices and all sockets have
|
|
- * left the network namespace before the cleanup methods are called.
|
|
- *
|
|
- * For the longest time the ipv4 icmp code was registered as a pernet
|
|
- * device which caused kernel oops, and panics during network
|
|
- * namespace cleanup. So please don't get this wrong.
|
|
- */
|
|
extern int register_pernet_subsys(struct pernet_operations *);
|
|
extern void unregister_pernet_subsys(struct pernet_operations *);
|
|
extern int register_pernet_gen_subsys(int *id, struct pernet_operations *);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/net/sock.h linux-2.6.29-rc3.owrt/include/net/sock.h
|
|
--- linux-2.6.29.owrt/include/net/sock.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/net/sock.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -860,6 +860,7 @@
|
|
|
|
static inline void sk_wmem_free_skb(struct sock *sk, struct sk_buff *skb)
|
|
{
|
|
+ skb_truesize_check(skb);
|
|
sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
|
|
sk->sk_wmem_queued -= skb->truesize;
|
|
sk_mem_uncharge(sk, skb->truesize);
|
|
@@ -1307,7 +1308,7 @@
|
|
|
|
static inline gfp_t gfp_any(void)
|
|
{
|
|
- return in_softirq() ? GFP_ATOMIC : GFP_KERNEL;
|
|
+ return in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
|
|
}
|
|
|
|
static inline long sock_rcvtimeo(const struct sock *sk, int noblock)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/scsi/fc/fc_fcoe.h linux-2.6.29-rc3.owrt/include/scsi/fc/fc_fcoe.h
|
|
--- linux-2.6.29.owrt/include/scsi/fc/fc_fcoe.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/scsi/fc/fc_fcoe.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -31,6 +31,10 @@
|
|
#define ETH_P_FCOE 0x8906 /* FCOE ether type */
|
|
#endif
|
|
|
|
+#ifndef ETH_P_8021Q
|
|
+#define ETH_P_8021Q 0x8100
|
|
+#endif
|
|
+
|
|
/*
|
|
* FC_FCOE_OUI hasn't been standardized yet. XXX TBD.
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/scsi/fc/fc_fs.h linux-2.6.29-rc3.owrt/include/scsi/fc/fc_fs.h
|
|
--- linux-2.6.29.owrt/include/scsi/fc/fc_fs.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/scsi/fc/fc_fs.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -337,9 +337,4 @@
|
|
FC_RJT_VENDOR = 0xff, /* vendor specific reject */
|
|
};
|
|
|
|
-/* default timeout values */
|
|
-
|
|
-#define FC_DEF_E_D_TOV 2000UL
|
|
-#define FC_DEF_R_A_TOV 10000UL
|
|
-
|
|
#endif /* _FC_FS_H_ */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/scsi/libfc.h linux-2.6.29-rc3.owrt/include/scsi/libfc.h
|
|
--- linux-2.6.29.owrt/include/scsi/libfc.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/scsi/libfc.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -68,6 +68,9 @@
|
|
/*
|
|
* FC HBA status
|
|
*/
|
|
+#define FC_PAUSE (1 << 1)
|
|
+#define FC_LINK_UP (1 << 0)
|
|
+
|
|
enum fc_lport_state {
|
|
LPORT_ST_NONE = 0,
|
|
LPORT_ST_FLOGI,
|
|
@@ -336,17 +339,31 @@
|
|
|
|
struct libfc_function_template {
|
|
|
|
+ /**
|
|
+ * Mandatory Fields
|
|
+ *
|
|
+ * These handlers must be implemented by the LLD.
|
|
+ */
|
|
+
|
|
/*
|
|
* Interface to send a FC frame
|
|
- *
|
|
- * STATUS: REQUIRED
|
|
*/
|
|
int (*frame_send)(struct fc_lport *lp, struct fc_frame *fp);
|
|
|
|
- /*
|
|
- * Interface to send ELS/CT frames
|
|
+ /**
|
|
+ * Optional Fields
|
|
*
|
|
- * STATUS: OPTIONAL
|
|
+ * The LLD may choose to implement any of the following handlers.
|
|
+ * If LLD doesn't specify hander and leaves its pointer NULL then
|
|
+ * the default libfc function will be used for that handler.
|
|
+ */
|
|
+
|
|
+ /**
|
|
+ * ELS/CT interfaces
|
|
+ */
|
|
+
|
|
+ /*
|
|
+ * elsct_send - sends ELS/CT frame
|
|
*/
|
|
struct fc_seq *(*elsct_send)(struct fc_lport *lport,
|
|
struct fc_rport *rport,
|
|
@@ -356,6 +373,9 @@
|
|
struct fc_frame *fp,
|
|
void *arg),
|
|
void *arg, u32 timer_msec);
|
|
+ /**
|
|
+ * Exhance Manager interfaces
|
|
+ */
|
|
|
|
/*
|
|
* Send the FC frame payload using a new exchange and sequence.
|
|
@@ -387,8 +407,6 @@
|
|
* timer_msec argument is specified. The timer is canceled when
|
|
* it fires or when the exchange is done. The exchange timeout handler
|
|
* is registered by EM layer.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
struct fc_seq *(*exch_seq_send)(struct fc_lport *lp,
|
|
struct fc_frame *fp,
|
|
@@ -400,18 +418,14 @@
|
|
void *arg, unsigned int timer_msec);
|
|
|
|
/*
|
|
- * Send a frame using an existing sequence and exchange.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
+ * send a frame using existing sequence and exchange.
|
|
*/
|
|
int (*seq_send)(struct fc_lport *lp, struct fc_seq *sp,
|
|
struct fc_frame *fp);
|
|
|
|
/*
|
|
- * Send an ELS response using infomation from a previous
|
|
- * exchange and sequence.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
+ * Send ELS response using mainly infomation
|
|
+ * in exchange and sequence in EM layer.
|
|
*/
|
|
void (*seq_els_rsp_send)(struct fc_seq *sp, enum fc_els_cmd els_cmd,
|
|
struct fc_seq_els_data *els_data);
|
|
@@ -423,8 +437,6 @@
|
|
* A timer_msec can be specified for abort timeout, if non-zero
|
|
* timer_msec value is specified then exchange resp handler
|
|
* will be called with timeout error if no response to abort.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
int (*seq_exch_abort)(const struct fc_seq *req_sp,
|
|
unsigned int timer_msec);
|
|
@@ -432,8 +444,6 @@
|
|
/*
|
|
* Indicate that an exchange/sequence tuple is complete and the memory
|
|
* allocated for the related objects may be freed.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
void (*exch_done)(struct fc_seq *sp);
|
|
|
|
@@ -441,8 +451,6 @@
|
|
* Assigns a EM and a free XID for an new exchange and then
|
|
* allocates a new exchange and sequence pair.
|
|
* The fp can be used to determine free XID.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
struct fc_exch *(*exch_get)(struct fc_lport *lp, struct fc_frame *fp);
|
|
|
|
@@ -450,16 +458,12 @@
|
|
* Release previously assigned XID by exch_get API.
|
|
* The LLD may implement this if XID is assigned by LLD
|
|
* in exch_get().
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
void (*exch_put)(struct fc_lport *lp, struct fc_exch_mgr *mp,
|
|
u16 ex_id);
|
|
|
|
/*
|
|
* Start a new sequence on the same exchange/sequence tuple.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
struct fc_seq *(*seq_start_next)(struct fc_seq *sp);
|
|
|
|
@@ -467,38 +471,26 @@
|
|
* Reset an exchange manager, completing all sequences and exchanges.
|
|
* If s_id is non-zero, reset only exchanges originating from that FID.
|
|
* If d_id is non-zero, reset only exchanges sending to that FID.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
- void (*exch_mgr_reset)(struct fc_lport *,
|
|
+ void (*exch_mgr_reset)(struct fc_exch_mgr *,
|
|
u32 s_id, u32 d_id);
|
|
|
|
- /*
|
|
- * Flush the rport work queue. Generally used before shutdown.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
- */
|
|
void (*rport_flush_queue)(void);
|
|
+ /**
|
|
+ * Local Port interfaces
|
|
+ */
|
|
|
|
/*
|
|
- * Receive a frame for a local port.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
+ * Receive a frame to a local port.
|
|
*/
|
|
void (*lport_recv)(struct fc_lport *lp, struct fc_seq *sp,
|
|
struct fc_frame *fp);
|
|
|
|
- /*
|
|
- * Reset the local port.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
- */
|
|
int (*lport_reset)(struct fc_lport *);
|
|
|
|
- /*
|
|
- * Create a remote port
|
|
+ /**
|
|
+ * Remote Port interfaces
|
|
*/
|
|
- struct fc_rport *(*rport_create)(struct fc_disc_port *);
|
|
|
|
/*
|
|
* Initiates the RP state machine. It is called from the LP module.
|
|
@@ -508,72 +500,57 @@
|
|
* - PLOGI
|
|
* - PRLI
|
|
* - RTV
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
int (*rport_login)(struct fc_rport *rport);
|
|
|
|
/*
|
|
* Logoff, and remove the rport from the transport if
|
|
* it had been added. This will send a LOGO to the target.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
int (*rport_logoff)(struct fc_rport *rport);
|
|
|
|
/*
|
|
* Recieve a request from a remote port.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
void (*rport_recv_req)(struct fc_seq *, struct fc_frame *,
|
|
struct fc_rport *);
|
|
|
|
- /*
|
|
- * lookup an rport by it's port ID.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
- */
|
|
struct fc_rport *(*rport_lookup)(const struct fc_lport *, u32);
|
|
|
|
+ /**
|
|
+ * FCP interfaces
|
|
+ */
|
|
+
|
|
/*
|
|
* Send a fcp cmd from fsp pkt.
|
|
* Called with the SCSI host lock unlocked and irqs disabled.
|
|
*
|
|
* The resp handler is called when FCP_RSP received.
|
|
*
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
int (*fcp_cmd_send)(struct fc_lport *lp, struct fc_fcp_pkt *fsp,
|
|
void (*resp)(struct fc_seq *, struct fc_frame *fp,
|
|
void *arg));
|
|
|
|
/*
|
|
- * Cleanup the FCP layer, used durring link down and reset
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
+ * Used at least durring linkdown and reset
|
|
*/
|
|
void (*fcp_cleanup)(struct fc_lport *lp);
|
|
|
|
/*
|
|
* Abort all I/O on a local port
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
void (*fcp_abort_io)(struct fc_lport *lp);
|
|
|
|
- /*
|
|
- * Receive a request for the discovery layer.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
+ /**
|
|
+ * Discovery interfaces
|
|
*/
|
|
+
|
|
void (*disc_recv_req)(struct fc_seq *,
|
|
struct fc_frame *, struct fc_lport *);
|
|
|
|
/*
|
|
* Start discovery for a local port.
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
void (*disc_start)(void (*disc_callback)(struct fc_lport *,
|
|
enum fc_disc_event),
|
|
@@ -582,8 +559,6 @@
|
|
/*
|
|
* Stop discovery for a given lport. This will remove
|
|
* all discovered rports
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
void (*disc_stop) (struct fc_lport *);
|
|
|
|
@@ -591,8 +566,6 @@
|
|
* Stop discovery for a given lport. This will block
|
|
* until all discovered rports are deleted from the
|
|
* FC transport class
|
|
- *
|
|
- * STATUS: OPTIONAL
|
|
*/
|
|
void (*disc_stop_final) (struct fc_lport *);
|
|
};
|
|
@@ -630,8 +603,7 @@
|
|
|
|
/* Operational Information */
|
|
struct libfc_function_template tt;
|
|
- u8 link_up;
|
|
- u8 qfull;
|
|
+ u16 link_status;
|
|
enum fc_lport_state state;
|
|
unsigned long boot_time;
|
|
|
|
@@ -665,7 +637,7 @@
|
|
struct delayed_work disc_work;
|
|
};
|
|
|
|
-/*
|
|
+/**
|
|
* FC_LPORT HELPER FUNCTIONS
|
|
*****************************/
|
|
static inline void *lport_priv(const struct fc_lport *lp)
|
|
@@ -697,7 +669,7 @@
|
|
}
|
|
|
|
|
|
-/*
|
|
+/**
|
|
* LOCAL PORT LAYER
|
|
*****************************/
|
|
int fc_lport_init(struct fc_lport *lp);
|
|
@@ -732,6 +704,12 @@
|
|
void fc_linkdown(struct fc_lport *);
|
|
|
|
/*
|
|
+ * Pause and unpause traffic.
|
|
+ */
|
|
+void fc_pause(struct fc_lport *);
|
|
+void fc_unpause(struct fc_lport *);
|
|
+
|
|
+/*
|
|
* Configure the local port.
|
|
*/
|
|
int fc_lport_config(struct fc_lport *);
|
|
@@ -747,19 +725,19 @@
|
|
int fc_set_mfs(struct fc_lport *lp, u32 mfs);
|
|
|
|
|
|
-/*
|
|
+/**
|
|
* REMOTE PORT LAYER
|
|
*****************************/
|
|
int fc_rport_init(struct fc_lport *lp);
|
|
void fc_rport_terminate_io(struct fc_rport *rp);
|
|
|
|
-/*
|
|
+/**
|
|
* DISCOVERY LAYER
|
|
*****************************/
|
|
int fc_disc_init(struct fc_lport *lp);
|
|
|
|
|
|
-/*
|
|
+/**
|
|
* SCSI LAYER
|
|
*****************************/
|
|
/*
|
|
@@ -820,7 +798,7 @@
|
|
*/
|
|
void fc_fcp_destroy(struct fc_lport *);
|
|
|
|
-/*
|
|
+/**
|
|
* ELS/CT interface
|
|
*****************************/
|
|
/*
|
|
@@ -829,7 +807,7 @@
|
|
int fc_elsct_init(struct fc_lport *lp);
|
|
|
|
|
|
-/*
|
|
+/**
|
|
* EXCHANGE MANAGER LAYER
|
|
*****************************/
|
|
/*
|
|
@@ -938,7 +916,7 @@
|
|
* If s_id is non-zero, reset only exchanges originating from that FID.
|
|
* If d_id is non-zero, reset only exchanges sending to that FID.
|
|
*/
|
|
-void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);
|
|
+void fc_exch_mgr_reset(struct fc_exch_mgr *, u32 s_id, u32 d_id);
|
|
|
|
/*
|
|
* Functions for fc_functions_template
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/scsi/libfcoe.h linux-2.6.29-rc3.owrt/include/scsi/libfcoe.h
|
|
--- linux-2.6.29.owrt/include/scsi/libfcoe.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/scsi/libfcoe.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -46,7 +46,6 @@
|
|
struct net_device *phys_dev; /* device with ethtool_ops */
|
|
struct packet_type fcoe_packet_type;
|
|
struct sk_buff_head fcoe_pending_queue;
|
|
- u8 fcoe_pending_queue_active;
|
|
|
|
u8 dest_addr[ETH_ALEN];
|
|
u8 ctl_src_addr[ETH_ALEN];
|
|
@@ -59,10 +58,16 @@
|
|
u8 address_mode;
|
|
};
|
|
|
|
+static inline struct fcoe_softc *fcoe_softc(
|
|
+ const struct fc_lport *lp)
|
|
+{
|
|
+ return (struct fcoe_softc *)lport_priv(lp);
|
|
+}
|
|
+
|
|
static inline struct net_device *fcoe_netdev(
|
|
const struct fc_lport *lp)
|
|
{
|
|
- return ((struct fcoe_softc *)lport_priv(lp))->real_dev;
|
|
+ return fcoe_softc(lp)->real_dev;
|
|
}
|
|
|
|
static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/sound/hdsp.h linux-2.6.29-rc3.owrt/include/sound/hdsp.h
|
|
--- linux-2.6.29.owrt/include/sound/hdsp.h 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/sound/hdsp.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -19,8 +19,6 @@
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
#define HDSP_MATRIX_MIXER_SIZE 2048
|
|
|
|
enum HDSP_IO_Type {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/video/aty128.h linux-2.6.29-rc3.owrt/include/video/aty128.h
|
|
--- linux-2.6.29.owrt/include/video/aty128.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/video/aty128.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -21,9 +21,9 @@
|
|
#define I2C_CNTL_1 0x0094
|
|
#define PALETTE_INDEX 0x00b0
|
|
#define PALETTE_DATA 0x00b4
|
|
-#define CNFG_CNTL 0x00e0
|
|
+#define CONFIG_CNTL 0x00e0
|
|
#define GEN_RESET_CNTL 0x00f0
|
|
-#define CNFG_MEMSIZE 0x00f8
|
|
+#define CONFIG_MEMSIZE 0x00f8
|
|
#define MEM_CNTL 0x0140
|
|
#define MEM_POWER_MISC 0x015c
|
|
#define AGP_BASE 0x0170
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/video/mach64.h linux-2.6.29-rc3.owrt/include/video/mach64.h
|
|
--- linux-2.6.29.owrt/include/video/mach64.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/video/mach64.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -103,7 +103,7 @@
|
|
#define CUR_HORZ_VERT_OFF 0x0070 /* Dword offset 0_1C */
|
|
#define CUR2_HORZ_VERT_OFF 0x0070 /* Dword offset 0_1C */
|
|
|
|
-#define CNFG_PANEL_LG 0x0074 /* Dword offset 0_1D (LG) */
|
|
+#define CONFIG_PANEL_LG 0x0074 /* Dword offset 0_1D (LG) */
|
|
|
|
/* General I/O Control */
|
|
#define GP_IO 0x0078 /* Dword offset 0_1E */
|
|
@@ -146,8 +146,8 @@
|
|
#define CLOCK_SEL_CNTL 0x0090 /* Dword offset 0_24 */
|
|
|
|
/* Configuration */
|
|
-#define CNFG_STAT1 0x0094 /* Dword offset 0_25 */
|
|
-#define CNFG_STAT2 0x0098 /* Dword offset 0_26 */
|
|
+#define CONFIG_STAT1 0x0094 /* Dword offset 0_25 */
|
|
+#define CONFIG_STAT2 0x0098 /* Dword offset 0_26 */
|
|
|
|
/* Bus Control */
|
|
#define BUS_CNTL 0x00A0 /* Dword offset 0_28 */
|
|
@@ -190,9 +190,9 @@
|
|
#define POWER_MANAGEMENT_LG 0x00D8 /* Dword offset 0_36 (LG) */
|
|
|
|
/* Configuration */
|
|
-#define CNFG_CNTL 0x00DC /* Dword offset 0_37 (CT, ET, VT) */
|
|
-#define CNFG_CHIP_ID 0x00E0 /* Dword offset 0_38 */
|
|
-#define CNFG_STAT0 0x00E4 /* Dword offset 0_39 */
|
|
+#define CONFIG_CNTL 0x00DC /* Dword offset 0_37 (CT, ET, VT) */
|
|
+#define CONFIG_CHIP_ID 0x00E0 /* Dword offset 0_38 */
|
|
+#define CONFIG_STAT0 0x00E4 /* Dword offset 0_39 */
|
|
|
|
/* Test and Debug */
|
|
#define CRC_SIG 0x00E8 /* Dword offset 0_3A */
|
|
@@ -851,17 +851,17 @@
|
|
#define PLL_YCLK_CNTL 0x29
|
|
#define PM_DYN_CLK_CNTL 0x2A
|
|
|
|
-/* CNFG_CNTL register constants */
|
|
+/* CONFIG_CNTL register constants */
|
|
#define APERTURE_4M_ENABLE 1
|
|
#define APERTURE_8M_ENABLE 2
|
|
#define VGA_APERTURE_ENABLE 4
|
|
|
|
-/* CNFG_STAT0 register constants (GX, CX) */
|
|
+/* CONFIG_STAT0 register constants (GX, CX) */
|
|
#define CFG_BUS_TYPE 0x00000007
|
|
#define CFG_MEM_TYPE 0x00000038
|
|
#define CFG_INIT_DAC_TYPE 0x00000e00
|
|
|
|
-/* CNFG_STAT0 register constants (CT, ET, VT) */
|
|
+/* CONFIG_STAT0 register constants (CT, ET, VT) */
|
|
#define CFG_MEM_TYPE_xT 0x00000007
|
|
|
|
#define ISA 0
|
|
@@ -942,7 +942,7 @@
|
|
#define PCI_ATI_VENDOR_ID 0x1002
|
|
|
|
|
|
-/* CNFG_CHIP_ID register constants */
|
|
+/* CONFIG_CHIP_ID register constants */
|
|
#define CFG_CHIP_TYPE 0x0000FFFF
|
|
#define CFG_CHIP_CLASS 0x00FF0000
|
|
#define CFG_CHIP_REV 0xFF000000
|
|
@@ -951,7 +951,7 @@
|
|
#define CFG_CHIP_MINOR 0xC0000000
|
|
|
|
|
|
-/* Chip IDs read from CNFG_CHIP_ID */
|
|
+/* Chip IDs read from CONFIG_CHIP_ID */
|
|
|
|
/* mach64GX family */
|
|
#define GX_CHIP_ID 0xD7 /* mach64GX (ATI888GX00) */
|
|
@@ -1254,7 +1254,7 @@
|
|
#define CRTC2_DISPLAY_DIS 0x00000400
|
|
|
|
/* LCD register indices */
|
|
-#define CNFG_PANEL 0x00
|
|
+#define CONFIG_PANEL 0x00
|
|
#define LCD_GEN_CNTL 0x01
|
|
#define DSTN_CONTROL 0x02
|
|
#define HFB_PITCH_ADDR 0x03
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/video/radeon.h linux-2.6.29-rc3.owrt/include/video/radeon.h
|
|
--- linux-2.6.29.owrt/include/video/radeon.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/video/radeon.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -11,13 +11,13 @@
|
|
#define HI_STAT 0x004C
|
|
#define BUS_CNTL1 0x0034
|
|
#define I2C_CNTL_1 0x0094
|
|
-#define CNFG_CNTL 0x00E0
|
|
-#define CNFG_MEMSIZE 0x00F8
|
|
-#define CNFG_APER_0_BASE 0x0100
|
|
-#define CNFG_APER_1_BASE 0x0104
|
|
-#define CNFG_APER_SIZE 0x0108
|
|
-#define CNFG_REG_1_BASE 0x010C
|
|
-#define CNFG_REG_APER_SIZE 0x0110
|
|
+#define CONFIG_CNTL 0x00E0
|
|
+#define CONFIG_MEMSIZE 0x00F8
|
|
+#define CONFIG_APER_0_BASE 0x0100
|
|
+#define CONFIG_APER_1_BASE 0x0104
|
|
+#define CONFIG_APER_SIZE 0x0108
|
|
+#define CONFIG_REG_1_BASE 0x010C
|
|
+#define CONFIG_REG_APER_SIZE 0x0110
|
|
#define PAD_AGPINPUT_DELAY 0x0164
|
|
#define PAD_CTLR_STRENGTH 0x0168
|
|
#define PAD_CTLR_UPDATE 0x016C
|
|
@@ -509,7 +509,7 @@
|
|
/* CLOCK_CNTL_INDEX bit constants */
|
|
#define PLL_WR_EN 0x00000080
|
|
|
|
-/* CNFG_CNTL bit constants */
|
|
+/* CONFIG_CNTL bit constants */
|
|
#define CFG_VGA_RAM_EN 0x00000100
|
|
#define CFG_ATI_REV_ID_MASK (0xf << 16)
|
|
#define CFG_ATI_REV_A11 (0 << 16)
|
|
@@ -980,7 +980,7 @@
|
|
|
|
/* masks */
|
|
|
|
-#define CNFG_MEMSIZE_MASK 0x1f000000
|
|
+#define CONFIG_MEMSIZE_MASK 0x1f000000
|
|
#define MEM_CFG_TYPE 0x40000000
|
|
#define DST_OFFSET_MASK 0x003fffff
|
|
#define DST_PITCH_MASK 0x3fc00000
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/video/sisfb.h linux-2.6.29-rc3.owrt/include/video/sisfb.h
|
|
--- linux-2.6.29.owrt/include/video/sisfb.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/video/sisfb.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -21,8 +21,8 @@
|
|
#ifndef _LINUX_SISFB_H_
|
|
#define _LINUX_SISFB_H_
|
|
|
|
-#include <linux/types.h>
|
|
#include <asm/ioctl.h>
|
|
+#include <asm/types.h>
|
|
|
|
/**********************************************/
|
|
/* PUBLIC */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/include/video/uvesafb.h linux-2.6.29-rc3.owrt/include/video/uvesafb.h
|
|
--- linux-2.6.29.owrt/include/video/uvesafb.h 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/include/video/uvesafb.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1,8 +1,6 @@
|
|
#ifndef _UVESAFB_H
|
|
#define _UVESAFB_H
|
|
|
|
-#include <linux/types.h>
|
|
-
|
|
struct v86_regs {
|
|
__u32 ebx;
|
|
__u32 ecx;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/init/do_mounts.c linux-2.6.29-rc3.owrt/init/do_mounts.c
|
|
--- linux-2.6.29.owrt/init/do_mounts.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/init/do_mounts.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -370,14 +370,10 @@
|
|
ssleep(root_delay);
|
|
}
|
|
|
|
- /*
|
|
- * wait for the known devices to complete their probing
|
|
- *
|
|
- * Note: this is a potential source of long boot delays.
|
|
- * For example, it is not atypical to wait 5 seconds here
|
|
- * for the touchpad of a laptop to initialize.
|
|
- */
|
|
- wait_for_device_probe();
|
|
+ /* wait for the known devices to complete their probing */
|
|
+ while (driver_probe_done() != 0)
|
|
+ msleep(100);
|
|
+ async_synchronize_full();
|
|
|
|
md_run_setup();
|
|
|
|
@@ -403,7 +399,6 @@
|
|
while (driver_probe_done() != 0 ||
|
|
(ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
|
|
msleep(100);
|
|
- async_synchronize_full();
|
|
}
|
|
|
|
is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/init/do_mounts_md.c linux-2.6.29-rc3.owrt/init/do_mounts_md.c
|
|
--- linux-2.6.29.owrt/init/do_mounts_md.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/init/do_mounts_md.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -281,9 +281,8 @@
|
|
*/
|
|
printk(KERN_INFO "md: Waiting for all devices to be available before autodetect\n");
|
|
printk(KERN_INFO "md: If you don't use raid, use raid=noautodetect\n");
|
|
-
|
|
- wait_for_device_probe();
|
|
-
|
|
+ while (driver_probe_done() < 0)
|
|
+ msleep(100);
|
|
fd = sys_open("/dev/md0", 0, 0);
|
|
if (fd >= 0) {
|
|
sys_ioctl(fd, RAID_AUTORUN, raid_autopart);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/init/Kconfig linux-2.6.29-rc3.owrt/init/Kconfig
|
|
--- linux-2.6.29.owrt/init/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/init/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -675,9 +675,6 @@
|
|
config SYSCTL
|
|
bool
|
|
|
|
-config ANON_INODES
|
|
- bool
|
|
-
|
|
menuconfig EMBEDDED
|
|
bool "Configure standard kernel features (for small systems)"
|
|
help
|
|
@@ -783,6 +780,18 @@
|
|
This option allows to disable the internal PC-Speaker
|
|
support, saving some memory.
|
|
|
|
+config COMPAT_BRK
|
|
+ bool "Disable heap randomization"
|
|
+ default y
|
|
+ help
|
|
+ Randomizing heap placement makes heap exploits harder, but it
|
|
+ also breaks ancient binaries (including anything libc5 based).
|
|
+ This option changes the bootup default to heap randomization
|
|
+ disabled, and can be overriden runtime by setting
|
|
+ /proc/sys/kernel/randomize_va_space to 2.
|
|
+
|
|
+ On non-ancient distros (post-2000 ones) N is usually a safe choice.
|
|
+
|
|
config BASE_FULL
|
|
default y
|
|
bool "Enable full-sized data structures for core" if EMBEDDED
|
|
@@ -800,6 +809,9 @@
|
|
support for "fast userspace mutexes". The resulting kernel may not
|
|
run glibc-based applications correctly.
|
|
|
|
+config ANON_INODES
|
|
+ bool
|
|
+
|
|
config EPOLL
|
|
bool "Enable eventpoll support" if EMBEDDED
|
|
default y
|
|
@@ -885,18 +897,6 @@
|
|
SLUB sysfs support. /sys/slab will not exist and there will be
|
|
no support for cache validation etc.
|
|
|
|
-config COMPAT_BRK
|
|
- bool "Disable heap randomization"
|
|
- default y
|
|
- help
|
|
- Randomizing heap placement makes heap exploits harder, but it
|
|
- also breaks ancient binaries (including anything libc5 based).
|
|
- This option changes the bootup default to heap randomization
|
|
- disabled, and can be overriden runtime by setting
|
|
- /proc/sys/kernel/randomize_va_space to 2.
|
|
-
|
|
- On non-ancient distros (post-2000 ones) N is usually a safe choice.
|
|
-
|
|
choice
|
|
prompt "Choose SLAB allocator"
|
|
default SLUB
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/init/main.c linux-2.6.29-rc3.owrt/init/main.c
|
|
--- linux-2.6.29.owrt/init/main.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/init/main.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -97,7 +97,7 @@
|
|
extern void tc_init(void);
|
|
#endif
|
|
|
|
-enum system_states system_state __read_mostly;
|
|
+enum system_states system_state;
|
|
EXPORT_SYMBOL(system_state);
|
|
|
|
/*
|
|
@@ -463,7 +463,6 @@
|
|
* at least once to get things moving:
|
|
*/
|
|
init_idle_bootup_task(current);
|
|
- rcu_scheduler_starting();
|
|
preempt_enable_no_resched();
|
|
schedule();
|
|
preempt_disable();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/ipc/shm.c linux-2.6.29-rc3.owrt/ipc/shm.c
|
|
--- linux-2.6.29.owrt/ipc/shm.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/ipc/shm.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -340,7 +340,6 @@
|
|
struct file * file;
|
|
char name[13];
|
|
int id;
|
|
- int acctflag = 0;
|
|
|
|
if (size < SHMMIN || size > ns->shm_ctlmax)
|
|
return -EINVAL;
|
|
@@ -365,19 +364,18 @@
|
|
|
|
sprintf (name, "SYSV%08x", key);
|
|
if (shmflg & SHM_HUGETLB) {
|
|
- /* hugetlb_file_setup applies strict accounting */
|
|
- if (shmflg & SHM_NORESERVE)
|
|
- acctflag = VM_NORESERVE;
|
|
- file = hugetlb_file_setup(name, size, acctflag);
|
|
+ /* hugetlb_file_setup takes care of mlock user accounting */
|
|
+ file = hugetlb_file_setup(name, size);
|
|
shp->mlock_user = current_user();
|
|
} else {
|
|
+ int acctflag = VM_ACCOUNT;
|
|
/*
|
|
* Do not allow no accounting for OVERCOMMIT_NEVER, even
|
|
* if it's asked for.
|
|
*/
|
|
if ((shmflg & SHM_NORESERVE) &&
|
|
sysctl_overcommit_memory != OVERCOMMIT_NEVER)
|
|
- acctflag = VM_NORESERVE;
|
|
+ acctflag = 0;
|
|
file = shmem_file_setup(name, size, acctflag);
|
|
}
|
|
error = PTR_ERR(file);
|
|
@@ -567,15 +565,11 @@
|
|
struct hstate *h = hstate_file(shp->shm_file);
|
|
*rss += pages_per_huge_page(h) * mapping->nrpages;
|
|
} else {
|
|
-#ifdef CONFIG_SHMEM
|
|
struct shmem_inode_info *info = SHMEM_I(inode);
|
|
spin_lock(&info->lock);
|
|
*rss += inode->i_mapping->nrpages;
|
|
*swp += info->swapped;
|
|
spin_unlock(&info->lock);
|
|
-#else
|
|
- *rss += inode->i_mapping->nrpages;
|
|
-#endif
|
|
}
|
|
|
|
total++;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/async.c linux-2.6.29-rc3.owrt/kernel/async.c
|
|
--- linux-2.6.29.owrt/kernel/async.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/async.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -54,7 +54,6 @@
|
|
#include <linux/sched.h>
|
|
#include <linux/init.h>
|
|
#include <linux/kthread.h>
|
|
-#include <linux/delay.h>
|
|
#include <asm/atomic.h>
|
|
|
|
static async_cookie_t next_cookie = 1;
|
|
@@ -133,23 +132,21 @@
|
|
entry = list_first_entry(&async_pending, struct async_entry, list);
|
|
|
|
/* 2) move it to the running queue */
|
|
- list_move_tail(&entry->list, entry->running);
|
|
+ list_del(&entry->list);
|
|
+ list_add_tail(&entry->list, &async_running);
|
|
spin_unlock_irqrestore(&async_lock, flags);
|
|
|
|
/* 3) run it (and print duration)*/
|
|
if (initcall_debug && system_state == SYSTEM_BOOTING) {
|
|
- printk("calling %lli_%pF @ %i\n", (long long)entry->cookie,
|
|
- entry->func, task_pid_nr(current));
|
|
+ printk("calling %lli_%pF @ %i\n", entry->cookie, entry->func, task_pid_nr(current));
|
|
calltime = ktime_get();
|
|
}
|
|
entry->func(entry->data, entry->cookie);
|
|
if (initcall_debug && system_state == SYSTEM_BOOTING) {
|
|
rettime = ktime_get();
|
|
delta = ktime_sub(rettime, calltime);
|
|
- printk("initcall %lli_%pF returned 0 after %lld usecs\n",
|
|
- (long long)entry->cookie,
|
|
- entry->func,
|
|
- (long long)ktime_to_ns(delta) >> 10);
|
|
+ printk("initcall %lli_%pF returned 0 after %lld usecs\n", entry->cookie,
|
|
+ entry->func, ktime_to_ns(delta) >> 10);
|
|
}
|
|
|
|
/* 4) remove it from the running queue */
|
|
@@ -208,44 +205,18 @@
|
|
return newcookie;
|
|
}
|
|
|
|
-/**
|
|
- * async_schedule - schedule a function for asynchronous execution
|
|
- * @ptr: function to execute asynchronously
|
|
- * @data: data pointer to pass to the function
|
|
- *
|
|
- * Returns an async_cookie_t that may be used for checkpointing later.
|
|
- * Note: This function may be called from atomic or non-atomic contexts.
|
|
- */
|
|
async_cookie_t async_schedule(async_func_ptr *ptr, void *data)
|
|
{
|
|
- return __async_schedule(ptr, data, &async_running);
|
|
+ return __async_schedule(ptr, data, &async_pending);
|
|
}
|
|
EXPORT_SYMBOL_GPL(async_schedule);
|
|
|
|
-/**
|
|
- * async_schedule_domain - schedule a function for asynchronous execution within a certain domain
|
|
- * @ptr: function to execute asynchronously
|
|
- * @data: data pointer to pass to the function
|
|
- * @running: running list for the domain
|
|
- *
|
|
- * Returns an async_cookie_t that may be used for checkpointing later.
|
|
- * @running may be used in the async_synchronize_*_domain() functions
|
|
- * to wait within a certain synchronization domain rather than globally.
|
|
- * A synchronization domain is specified via the running queue @running to use.
|
|
- * Note: This function may be called from atomic or non-atomic contexts.
|
|
- */
|
|
-async_cookie_t async_schedule_domain(async_func_ptr *ptr, void *data,
|
|
- struct list_head *running)
|
|
+async_cookie_t async_schedule_special(async_func_ptr *ptr, void *data, struct list_head *running)
|
|
{
|
|
return __async_schedule(ptr, data, running);
|
|
}
|
|
-EXPORT_SYMBOL_GPL(async_schedule_domain);
|
|
+EXPORT_SYMBOL_GPL(async_schedule_special);
|
|
|
|
-/**
|
|
- * async_synchronize_full - synchronize all asynchronous function calls
|
|
- *
|
|
- * This function waits until all asynchronous function calls have been done.
|
|
- */
|
|
void async_synchronize_full(void)
|
|
{
|
|
do {
|
|
@@ -254,30 +225,13 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(async_synchronize_full);
|
|
|
|
-/**
|
|
- * async_synchronize_full_domain - synchronize all asynchronous function within a certain domain
|
|
- * @list: running list to synchronize on
|
|
- *
|
|
- * This function waits until all asynchronous function calls for the
|
|
- * synchronization domain specified by the running list @list have been done.
|
|
- */
|
|
-void async_synchronize_full_domain(struct list_head *list)
|
|
+void async_synchronize_full_special(struct list_head *list)
|
|
{
|
|
- async_synchronize_cookie_domain(next_cookie, list);
|
|
+ async_synchronize_cookie_special(next_cookie, list);
|
|
}
|
|
-EXPORT_SYMBOL_GPL(async_synchronize_full_domain);
|
|
+EXPORT_SYMBOL_GPL(async_synchronize_full_special);
|
|
|
|
-/**
|
|
- * async_synchronize_cookie_domain - synchronize asynchronous function calls within a certain domain with cookie checkpointing
|
|
- * @cookie: async_cookie_t to use as checkpoint
|
|
- * @running: running list to synchronize on
|
|
- *
|
|
- * This function waits until all asynchronous function calls for the
|
|
- * synchronization domain specified by the running list @list submitted
|
|
- * prior to @cookie have been done.
|
|
- */
|
|
-void async_synchronize_cookie_domain(async_cookie_t cookie,
|
|
- struct list_head *running)
|
|
+void async_synchronize_cookie_special(async_cookie_t cookie, struct list_head *running)
|
|
{
|
|
ktime_t starttime, delta, endtime;
|
|
|
|
@@ -293,22 +247,14 @@
|
|
delta = ktime_sub(endtime, starttime);
|
|
|
|
printk("async_continuing @ %i after %lli usec\n",
|
|
- task_pid_nr(current),
|
|
- (long long)ktime_to_ns(delta) >> 10);
|
|
+ task_pid_nr(current), ktime_to_ns(delta) >> 10);
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(async_synchronize_cookie_domain);
|
|
+EXPORT_SYMBOL_GPL(async_synchronize_cookie_special);
|
|
|
|
-/**
|
|
- * async_synchronize_cookie - synchronize asynchronous function calls with cookie checkpointing
|
|
- * @cookie: async_cookie_t to use as checkpoint
|
|
- *
|
|
- * This function waits until all asynchronous function calls prior to @cookie
|
|
- * have been done.
|
|
- */
|
|
void async_synchronize_cookie(async_cookie_t cookie)
|
|
{
|
|
- async_synchronize_cookie_domain(cookie, &async_running);
|
|
+ async_synchronize_cookie_special(cookie, &async_running);
|
|
}
|
|
EXPORT_SYMBOL_GPL(async_synchronize_cookie);
|
|
|
|
@@ -369,11 +315,7 @@
|
|
ec = atomic_read(&entry_count);
|
|
|
|
while (tc < ec && tc < MAX_THREADS) {
|
|
- if (IS_ERR(kthread_run(async_thread, NULL, "async/%i",
|
|
- tc))) {
|
|
- msleep(100);
|
|
- continue;
|
|
- }
|
|
+ kthread_run(async_thread, NULL, "async/%i", tc);
|
|
atomic_inc(&thread_count);
|
|
tc++;
|
|
}
|
|
@@ -388,9 +330,7 @@
|
|
static int __init async_init(void)
|
|
{
|
|
if (async_enabled)
|
|
- if (IS_ERR(kthread_run(async_manager_thread, NULL,
|
|
- "async/mgr")))
|
|
- async_enabled = 0;
|
|
+ kthread_run(async_manager_thread, NULL, "async/mgr");
|
|
return 0;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/cgroup.c linux-2.6.29-rc3.owrt/kernel/cgroup.c
|
|
--- linux-2.6.29.owrt/kernel/cgroup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/cgroup.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1115,15 +1115,13 @@
|
|
}
|
|
write_unlock(&css_set_lock);
|
|
|
|
- if (!list_empty(&root->root_list)) {
|
|
- list_del(&root->root_list);
|
|
- root_count--;
|
|
- }
|
|
+ list_del(&root->root_list);
|
|
+ root_count--;
|
|
|
|
mutex_unlock(&cgroup_mutex);
|
|
|
|
- kill_litter_super(sb);
|
|
kfree(root);
|
|
+ kill_litter_super(sb);
|
|
}
|
|
|
|
static struct file_system_type cgroup_fs_type = {
|
|
@@ -2351,7 +2349,7 @@
|
|
for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
|
|
struct cgroup_subsys *ss = subsys[i];
|
|
if (ss->root == root)
|
|
- mutex_lock(&ss->hierarchy_mutex);
|
|
+ mutex_lock_nested(&ss->hierarchy_mutex, i);
|
|
}
|
|
}
|
|
|
|
@@ -2436,9 +2434,7 @@
|
|
|
|
err_remove:
|
|
|
|
- cgroup_lock_hierarchy(root);
|
|
list_del(&cgrp->sibling);
|
|
- cgroup_unlock_hierarchy(root);
|
|
root->number_of_cgroups--;
|
|
|
|
err_destroy:
|
|
@@ -2511,7 +2507,7 @@
|
|
for_each_subsys(cgrp->root, ss) {
|
|
struct cgroup_subsys_state *css = cgrp->subsys[ss->subsys_id];
|
|
int refcnt;
|
|
- while (1) {
|
|
+ do {
|
|
/* We can only remove a CSS with a refcnt==1 */
|
|
refcnt = atomic_read(&css->refcnt);
|
|
if (refcnt > 1) {
|
|
@@ -2525,10 +2521,7 @@
|
|
* css_tryget() to spin until we set the
|
|
* CSS_REMOVED bits or abort
|
|
*/
|
|
- if (atomic_cmpxchg(&css->refcnt, refcnt, 0) == refcnt)
|
|
- break;
|
|
- cpu_relax();
|
|
- }
|
|
+ } while (atomic_cmpxchg(&css->refcnt, refcnt, 0) != refcnt);
|
|
}
|
|
done:
|
|
for_each_subsys(cgrp->root, ss) {
|
|
@@ -2637,7 +2630,6 @@
|
|
BUG_ON(!list_empty(&init_task.tasks));
|
|
|
|
mutex_init(&ss->hierarchy_mutex);
|
|
- lockdep_set_class(&ss->hierarchy_mutex, &ss->subsys_key);
|
|
ss->active = 1;
|
|
}
|
|
|
|
@@ -2999,21 +2991,20 @@
|
|
mutex_unlock(&cgroup_mutex);
|
|
return 0;
|
|
}
|
|
+ task_lock(tsk);
|
|
+ cg = tsk->cgroups;
|
|
+ parent = task_cgroup(tsk, subsys->subsys_id);
|
|
|
|
/* Pin the hierarchy */
|
|
- if (!atomic_inc_not_zero(&root->sb->s_active)) {
|
|
+ if (!atomic_inc_not_zero(&parent->root->sb->s_active)) {
|
|
/* We race with the final deactivate_super() */
|
|
mutex_unlock(&cgroup_mutex);
|
|
return 0;
|
|
}
|
|
|
|
/* Keep the cgroup alive */
|
|
- task_lock(tsk);
|
|
- parent = task_cgroup(tsk, subsys->subsys_id);
|
|
- cg = tsk->cgroups;
|
|
get_css_set(cg);
|
|
task_unlock(tsk);
|
|
-
|
|
mutex_unlock(&cgroup_mutex);
|
|
|
|
/* Now do the VFS work to create a cgroup */
|
|
@@ -3052,7 +3043,7 @@
|
|
mutex_unlock(&inode->i_mutex);
|
|
put_css_set(cg);
|
|
|
|
- deactivate_super(root->sb);
|
|
+ deactivate_super(parent->root->sb);
|
|
/* The cgroup is still accessible in the VFS, but
|
|
* we're not going to try to rmdir() it at this
|
|
* point. */
|
|
@@ -3078,7 +3069,7 @@
|
|
mutex_lock(&cgroup_mutex);
|
|
put_css_set(cg);
|
|
mutex_unlock(&cgroup_mutex);
|
|
- deactivate_super(root->sb);
|
|
+ deactivate_super(parent->root->sb);
|
|
return ret;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/cpuset.c linux-2.6.29-rc3.owrt/kernel/cpuset.c
|
|
--- linux-2.6.29.owrt/kernel/cpuset.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/cpuset.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -61,14 +61,6 @@
|
|
#include <linux/cgroup.h>
|
|
|
|
/*
|
|
- * Workqueue for cpuset related tasks.
|
|
- *
|
|
- * Using kevent workqueue may cause deadlock when memory_migrate
|
|
- * is set. So we create a separate workqueue thread for cpuset.
|
|
- */
|
|
-static struct workqueue_struct *cpuset_wq;
|
|
-
|
|
-/*
|
|
* Tracks how many cpusets are currently defined in system.
|
|
* When there is only one cpuset (the root cpuset) we can
|
|
* short circuit some hooks.
|
|
@@ -839,7 +831,7 @@
|
|
*/
|
|
static void async_rebuild_sched_domains(void)
|
|
{
|
|
- queue_work(cpuset_wq, &rebuild_sched_domains_work);
|
|
+ schedule_work(&rebuild_sched_domains_work);
|
|
}
|
|
|
|
/*
|
|
@@ -2119,9 +2111,6 @@
|
|
|
|
hotcpu_notifier(cpuset_track_online_cpus, 0);
|
|
hotplug_memory_notifier(cpuset_track_online_nodes, 10);
|
|
-
|
|
- cpuset_wq = create_singlethread_workqueue("cpuset");
|
|
- BUG_ON(!cpuset_wq);
|
|
}
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/exit.c linux-2.6.29-rc3.owrt/kernel/exit.c
|
|
--- linux-2.6.29.owrt/kernel/exit.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/exit.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -118,8 +118,6 @@
|
|
* We won't ever get here for the group leader, since it
|
|
* will have been the last reference on the signal_struct.
|
|
*/
|
|
- sig->utime = cputime_add(sig->utime, task_utime(tsk));
|
|
- sig->stime = cputime_add(sig->stime, task_stime(tsk));
|
|
sig->gtime = cputime_add(sig->gtime, task_gtime(tsk));
|
|
sig->min_flt += tsk->min_flt;
|
|
sig->maj_flt += tsk->maj_flt;
|
|
@@ -128,7 +126,6 @@
|
|
sig->inblock += task_io_get_inblock(tsk);
|
|
sig->oublock += task_io_get_oublock(tsk);
|
|
task_io_accounting_add(&sig->ioac, &tsk->ioac);
|
|
- sig->sum_sched_runtime += tsk->se.sum_exec_runtime;
|
|
sig = NULL; /* Marker for below. */
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/fork.c linux-2.6.29-rc3.owrt/kernel/fork.c
|
|
--- linux-2.6.29.owrt/kernel/fork.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/fork.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -852,14 +852,13 @@
|
|
sig->tty_old_pgrp = NULL;
|
|
sig->tty = NULL;
|
|
|
|
- sig->utime = sig->stime = sig->cutime = sig->cstime = cputime_zero;
|
|
+ sig->cutime = sig->cstime = cputime_zero;
|
|
sig->gtime = cputime_zero;
|
|
sig->cgtime = cputime_zero;
|
|
sig->nvcsw = sig->nivcsw = sig->cnvcsw = sig->cnivcsw = 0;
|
|
sig->min_flt = sig->maj_flt = sig->cmin_flt = sig->cmaj_flt = 0;
|
|
sig->inblock = sig->oublock = sig->cinblock = sig->coublock = 0;
|
|
task_io_accounting_init(&sig->ioac);
|
|
- sig->sum_sched_runtime = 0;
|
|
taskstats_tgid_init(sig);
|
|
|
|
task_lock(current->group_leader);
|
|
@@ -1007,7 +1006,6 @@
|
|
* triggers too late. This doesn't hurt, the check is only there
|
|
* to stop root fork bombs.
|
|
*/
|
|
- retval = -EAGAIN;
|
|
if (nr_threads >= max_threads)
|
|
goto bad_fork_cleanup_count;
|
|
|
|
@@ -1096,7 +1094,7 @@
|
|
#ifdef CONFIG_DEBUG_MUTEXES
|
|
p->blocked_on = NULL; /* not blocked yet */
|
|
#endif
|
|
- if (unlikely(current->ptrace))
|
|
+ if (unlikely(ptrace_reparented(current)))
|
|
ptrace_fork(p, clone_flags);
|
|
|
|
/* Perform scheduler related setup. Assign this task to a CPU. */
|
|
@@ -1180,6 +1178,10 @@
|
|
#endif
|
|
clear_all_latency_tracing(p);
|
|
|
|
+ /* Our parent execution domain becomes current domain
|
|
+ These must match for thread signalling to apply */
|
|
+ p->parent_exec_id = p->self_exec_id;
|
|
+
|
|
/* ok, now we should be set up.. */
|
|
p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : (clone_flags & CSIGNAL);
|
|
p->pdeath_signal = 0;
|
|
@@ -1217,13 +1219,10 @@
|
|
set_task_cpu(p, smp_processor_id());
|
|
|
|
/* CLONE_PARENT re-uses the old parent */
|
|
- if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) {
|
|
+ if (clone_flags & (CLONE_PARENT|CLONE_THREAD))
|
|
p->real_parent = current->real_parent;
|
|
- p->parent_exec_id = current->parent_exec_id;
|
|
- } else {
|
|
+ else
|
|
p->real_parent = current;
|
|
- p->parent_exec_id = current->self_exec_id;
|
|
- }
|
|
|
|
spin_lock(¤t->sighand->siglock);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/futex.c linux-2.6.29-rc3.owrt/kernel/futex.c
|
|
--- linux-2.6.29.owrt/kernel/futex.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/futex.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1165,7 +1165,6 @@
|
|
u32 val, ktime_t *abs_time, u32 bitset, int clockrt)
|
|
{
|
|
struct task_struct *curr = current;
|
|
- struct restart_block *restart;
|
|
DECLARE_WAITQUEUE(wait, curr);
|
|
struct futex_hash_bucket *hb;
|
|
struct futex_q q;
|
|
@@ -1217,13 +1216,11 @@
|
|
|
|
if (!ret)
|
|
goto retry;
|
|
- goto out;
|
|
+ return ret;
|
|
}
|
|
ret = -EWOULDBLOCK;
|
|
- if (unlikely(uval != val)) {
|
|
- queue_unlock(&q, hb);
|
|
- goto out_put_key;
|
|
- }
|
|
+ if (uval != val)
|
|
+ goto out_unlock_put_key;
|
|
|
|
/* Only actually queue if *uaddr contained val. */
|
|
queue_me(&q, hb);
|
|
@@ -1287,38 +1284,38 @@
|
|
*/
|
|
|
|
/* If we were woken (and unqueued), we succeeded, whatever. */
|
|
- ret = 0;
|
|
if (!unqueue_me(&q))
|
|
- goto out_put_key;
|
|
- ret = -ETIMEDOUT;
|
|
+ return 0;
|
|
if (rem)
|
|
- goto out_put_key;
|
|
+ return -ETIMEDOUT;
|
|
|
|
/*
|
|
* We expect signal_pending(current), but another thread may
|
|
* have handled it for us already.
|
|
*/
|
|
- ret = -ERESTARTSYS;
|
|
if (!abs_time)
|
|
- goto out_put_key;
|
|
-
|
|
- restart = ¤t_thread_info()->restart_block;
|
|
- restart->fn = futex_wait_restart;
|
|
- restart->futex.uaddr = (u32 *)uaddr;
|
|
- restart->futex.val = val;
|
|
- restart->futex.time = abs_time->tv64;
|
|
- restart->futex.bitset = bitset;
|
|
- restart->futex.flags = 0;
|
|
-
|
|
- if (fshared)
|
|
- restart->futex.flags |= FLAGS_SHARED;
|
|
- if (clockrt)
|
|
- restart->futex.flags |= FLAGS_CLOCKRT;
|
|
-
|
|
- ret = -ERESTART_RESTARTBLOCK;
|
|
+ return -ERESTARTSYS;
|
|
+ else {
|
|
+ struct restart_block *restart;
|
|
+ restart = ¤t_thread_info()->restart_block;
|
|
+ restart->fn = futex_wait_restart;
|
|
+ restart->futex.uaddr = (u32 *)uaddr;
|
|
+ restart->futex.val = val;
|
|
+ restart->futex.time = abs_time->tv64;
|
|
+ restart->futex.bitset = bitset;
|
|
+ restart->futex.flags = 0;
|
|
+
|
|
+ if (fshared)
|
|
+ restart->futex.flags |= FLAGS_SHARED;
|
|
+ if (clockrt)
|
|
+ restart->futex.flags |= FLAGS_CLOCKRT;
|
|
+ return -ERESTART_RESTARTBLOCK;
|
|
+ }
|
|
|
|
-out_put_key:
|
|
+out_unlock_put_key:
|
|
+ queue_unlock(&q, hb);
|
|
put_futex_key(fshared, &q.key);
|
|
+
|
|
out:
|
|
return ret;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/hrtimer.c linux-2.6.29-rc3.owrt/kernel/hrtimer.c
|
|
--- linux-2.6.29.owrt/kernel/hrtimer.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/hrtimer.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -501,13 +501,6 @@
|
|
continue;
|
|
timer = rb_entry(base->first, struct hrtimer, node);
|
|
expires = ktime_sub(hrtimer_get_expires(timer), base->offset);
|
|
- /*
|
|
- * clock_was_set() has changed base->offset so the
|
|
- * result might be negative. Fix it up to prevent a
|
|
- * false positive in clockevents_program_event()
|
|
- */
|
|
- if (expires.tv64 < 0)
|
|
- expires.tv64 = 0;
|
|
if (expires.tv64 < cpu_base->expires_next.tv64)
|
|
cpu_base->expires_next = expires;
|
|
}
|
|
@@ -1165,29 +1158,6 @@
|
|
|
|
#ifdef CONFIG_HIGH_RES_TIMERS
|
|
|
|
-static int force_clock_reprogram;
|
|
-
|
|
-/*
|
|
- * After 5 iteration's attempts, we consider that hrtimer_interrupt()
|
|
- * is hanging, which could happen with something that slows the interrupt
|
|
- * such as the tracing. Then we force the clock reprogramming for each future
|
|
- * hrtimer interrupts to avoid infinite loops and use the min_delta_ns
|
|
- * threshold that we will overwrite.
|
|
- * The next tick event will be scheduled to 3 times we currently spend on
|
|
- * hrtimer_interrupt(). This gives a good compromise, the cpus will spend
|
|
- * 1/4 of their time to process the hrtimer interrupts. This is enough to
|
|
- * let it running without serious starvation.
|
|
- */
|
|
-
|
|
-static inline void
|
|
-hrtimer_interrupt_hanging(struct clock_event_device *dev,
|
|
- ktime_t try_time)
|
|
-{
|
|
- force_clock_reprogram = 1;
|
|
- dev->min_delta_ns = (unsigned long)try_time.tv64 * 3;
|
|
- printk(KERN_WARNING "hrtimer: interrupt too slow, "
|
|
- "forcing clock min delta to %lu ns\n", dev->min_delta_ns);
|
|
-}
|
|
/*
|
|
* High resolution timer interrupt
|
|
* Called with interrupts disabled
|
|
@@ -1197,7 +1167,6 @@
|
|
struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
|
|
struct hrtimer_clock_base *base;
|
|
ktime_t expires_next, now;
|
|
- int nr_retries = 0;
|
|
int i;
|
|
|
|
BUG_ON(!cpu_base->hres_active);
|
|
@@ -1205,10 +1174,6 @@
|
|
dev->next_event.tv64 = KTIME_MAX;
|
|
|
|
retry:
|
|
- /* 5 retries is enough to notice a hang */
|
|
- if (!(++nr_retries % 5))
|
|
- hrtimer_interrupt_hanging(dev, ktime_sub(ktime_get(), now));
|
|
-
|
|
now = ktime_get();
|
|
|
|
expires_next.tv64 = KTIME_MAX;
|
|
@@ -1261,7 +1226,7 @@
|
|
|
|
/* Reprogramming necessary ? */
|
|
if (expires_next.tv64 != KTIME_MAX) {
|
|
- if (tick_program_event(expires_next, force_clock_reprogram))
|
|
+ if (tick_program_event(expires_next, 0))
|
|
goto retry;
|
|
}
|
|
}
|
|
@@ -1615,10 +1580,6 @@
|
|
break;
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
- case CPU_DYING:
|
|
- case CPU_DYING_FROZEN:
|
|
- clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DYING, &scpu);
|
|
- break;
|
|
case CPU_DEAD:
|
|
case CPU_DEAD_FROZEN:
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/irq/chip.c linux-2.6.29-rc3.owrt/kernel/irq/chip.c
|
|
--- linux-2.6.29.owrt/kernel/irq/chip.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/irq/chip.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -383,7 +383,6 @@
|
|
out_unlock:
|
|
spin_unlock(&desc->lock);
|
|
}
|
|
-EXPORT_SYMBOL_GPL(handle_level_irq);
|
|
|
|
/**
|
|
* handle_fasteoi_irq - irq handler for transparent controllers
|
|
@@ -594,7 +593,6 @@
|
|
}
|
|
spin_unlock_irqrestore(&desc->lock, flags);
|
|
}
|
|
-EXPORT_SYMBOL_GPL(__set_irq_handler);
|
|
|
|
void
|
|
set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/irq/numa_migrate.c linux-2.6.29-rc3.owrt/kernel/irq/numa_migrate.c
|
|
--- linux-2.6.29.owrt/kernel/irq/numa_migrate.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/irq/numa_migrate.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -71,7 +71,7 @@
|
|
desc = irq_desc_ptrs[irq];
|
|
|
|
if (desc && old_desc != desc)
|
|
- goto out_unlock;
|
|
+ goto out_unlock;
|
|
|
|
node = cpu_to_node(cpu);
|
|
desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
|
|
@@ -84,15 +84,10 @@
|
|
init_copy_one_irq_desc(irq, old_desc, desc, cpu);
|
|
|
|
irq_desc_ptrs[irq] = desc;
|
|
- spin_unlock_irqrestore(&sparse_irq_lock, flags);
|
|
|
|
/* free the old one */
|
|
free_one_irq_desc(old_desc, desc);
|
|
- spin_unlock(&old_desc->lock);
|
|
kfree(old_desc);
|
|
- spin_lock(&desc->lock);
|
|
-
|
|
- return desc;
|
|
|
|
out_unlock:
|
|
spin_unlock_irqrestore(&sparse_irq_lock, flags);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/itimer.c linux-2.6.29-rc3.owrt/kernel/itimer.c
|
|
--- linux-2.6.29.owrt/kernel/itimer.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/itimer.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -62,7 +62,7 @@
|
|
struct task_cputime cputime;
|
|
cputime_t utime;
|
|
|
|
- thread_group_cputimer(tsk, &cputime);
|
|
+ thread_group_cputime(tsk, &cputime);
|
|
utime = cputime.utime;
|
|
if (cputime_le(cval, utime)) { /* about to fire */
|
|
cval = jiffies_to_cputime(1);
|
|
@@ -82,7 +82,7 @@
|
|
struct task_cputime times;
|
|
cputime_t ptime;
|
|
|
|
- thread_group_cputimer(tsk, ×);
|
|
+ thread_group_cputime(tsk, ×);
|
|
ptime = cputime_add(times.utime, times.stime);
|
|
if (cputime_le(cval, ptime)) { /* about to fire */
|
|
cval = jiffies_to_cputime(1);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/kexec.c linux-2.6.29-rc3.owrt/kernel/kexec.c
|
|
--- linux-2.6.29.owrt/kernel/kexec.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/kexec.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1465,11 +1465,6 @@
|
|
error = device_power_down(PMSG_FREEZE);
|
|
if (error)
|
|
goto Enable_irqs;
|
|
-
|
|
- /* Suspend system devices */
|
|
- error = sysdev_suspend(PMSG_FREEZE);
|
|
- if (error)
|
|
- goto Power_up_devices;
|
|
} else
|
|
#endif
|
|
{
|
|
@@ -1482,8 +1477,6 @@
|
|
|
|
#ifdef CONFIG_KEXEC_JUMP
|
|
if (kexec_image->preserve_context) {
|
|
- sysdev_resume();
|
|
- Power_up_devices:
|
|
device_power_up(PMSG_RESTORE);
|
|
Enable_irqs:
|
|
local_irq_enable();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/Makefile linux-2.6.29-rc3.owrt/kernel/Makefile
|
|
--- linux-2.6.29.owrt/kernel/Makefile 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -51,7 +51,6 @@
|
|
obj-$(CONFIG_MODULES) += module.o
|
|
obj-$(CONFIG_KALLSYMS) += kallsyms.o
|
|
obj-$(CONFIG_PM) += power/
|
|
-obj-$(CONFIG_FREEZER) += power/
|
|
obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
|
|
obj-$(CONFIG_KEXEC) += kexec.o
|
|
obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/module.c linux-2.6.29-rc3.owrt/kernel/module.c
|
|
--- linux-2.6.29.owrt/kernel/module.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/module.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -573,13 +573,13 @@
|
|
/* Init the unload section of the module. */
|
|
static void module_unload_init(struct module *mod)
|
|
{
|
|
- int cpu;
|
|
+ unsigned int i;
|
|
|
|
INIT_LIST_HEAD(&mod->modules_which_use_me);
|
|
- for_each_possible_cpu(cpu)
|
|
- local_set(__module_ref_addr(mod, cpu), 0);
|
|
+ for (i = 0; i < NR_CPUS; i++)
|
|
+ local_set(&mod->ref[i].count, 0);
|
|
/* Hold reference count during initialization. */
|
|
- local_set(__module_ref_addr(mod, raw_smp_processor_id()), 1);
|
|
+ local_set(&mod->ref[raw_smp_processor_id()].count, 1);
|
|
/* Backwards compatibility macros put refcount during init. */
|
|
mod->waiter = current;
|
|
}
|
|
@@ -717,11 +717,10 @@
|
|
|
|
unsigned int module_refcount(struct module *mod)
|
|
{
|
|
- unsigned int total = 0;
|
|
- int cpu;
|
|
+ unsigned int i, total = 0;
|
|
|
|
- for_each_possible_cpu(cpu)
|
|
- total += local_read(__module_ref_addr(mod, cpu));
|
|
+ for (i = 0; i < NR_CPUS; i++)
|
|
+ total += local_read(&mod->ref[i].count);
|
|
return total;
|
|
}
|
|
EXPORT_SYMBOL(module_refcount);
|
|
@@ -895,7 +894,7 @@
|
|
{
|
|
if (module) {
|
|
unsigned int cpu = get_cpu();
|
|
- local_dec(__module_ref_addr(module, cpu));
|
|
+ local_dec(&module->ref[cpu].count);
|
|
/* Maybe they're waiting for us to drop reference? */
|
|
if (unlikely(!module_is_live(module)))
|
|
wake_up_process(module->waiter);
|
|
@@ -1465,10 +1464,7 @@
|
|
kfree(mod->args);
|
|
if (mod->percpu)
|
|
percpu_modfree(mod->percpu);
|
|
-#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
|
|
- if (mod->refptr)
|
|
- percpu_modfree(mod->refptr);
|
|
-#endif
|
|
+
|
|
/* Free lock-classes: */
|
|
lockdep_free_key_range(mod->module_core, mod->core_size);
|
|
|
|
@@ -2074,14 +2070,6 @@
|
|
/* Module has been moved. */
|
|
mod = (void *)sechdrs[modindex].sh_addr;
|
|
|
|
-#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
|
|
- mod->refptr = percpu_modalloc(sizeof(local_t), __alignof__(local_t),
|
|
- mod->name);
|
|
- if (!mod->refptr) {
|
|
- err = -ENOMEM;
|
|
- goto free_init;
|
|
- }
|
|
-#endif
|
|
/* Now we've moved module, initialize linked lists, etc. */
|
|
module_unload_init(mod);
|
|
|
|
@@ -2288,14 +2276,9 @@
|
|
ftrace_release(mod->module_core, mod->core_size);
|
|
free_unload:
|
|
module_unload_free(mod);
|
|
- free_init:
|
|
-#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
|
|
- percpu_modfree(mod->refptr);
|
|
-#endif
|
|
module_free(mod, mod->module_init);
|
|
free_core:
|
|
module_free(mod, mod->module_core);
|
|
- /* mod will be freed with core. Don't access it beyond this line! */
|
|
free_percpu:
|
|
if (percpu)
|
|
percpu_modfree(percpu);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/posix-cpu-timers.c linux-2.6.29-rc3.owrt/kernel/posix-cpu-timers.c
|
|
--- linux-2.6.29.owrt/kernel/posix-cpu-timers.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/posix-cpu-timers.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -230,71 +230,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
|
|
-{
|
|
- struct sighand_struct *sighand;
|
|
- struct signal_struct *sig;
|
|
- struct task_struct *t;
|
|
-
|
|
- *times = INIT_CPUTIME;
|
|
-
|
|
- rcu_read_lock();
|
|
- sighand = rcu_dereference(tsk->sighand);
|
|
- if (!sighand)
|
|
- goto out;
|
|
-
|
|
- sig = tsk->signal;
|
|
-
|
|
- t = tsk;
|
|
- do {
|
|
- times->utime = cputime_add(times->utime, t->utime);
|
|
- times->stime = cputime_add(times->stime, t->stime);
|
|
- times->sum_exec_runtime += t->se.sum_exec_runtime;
|
|
-
|
|
- t = next_thread(t);
|
|
- } while (t != tsk);
|
|
-
|
|
- times->utime = cputime_add(times->utime, sig->utime);
|
|
- times->stime = cputime_add(times->stime, sig->stime);
|
|
- times->sum_exec_runtime += sig->sum_sched_runtime;
|
|
-out:
|
|
- rcu_read_unlock();
|
|
-}
|
|
-
|
|
-static void update_gt_cputime(struct task_cputime *a, struct task_cputime *b)
|
|
-{
|
|
- if (cputime_gt(b->utime, a->utime))
|
|
- a->utime = b->utime;
|
|
-
|
|
- if (cputime_gt(b->stime, a->stime))
|
|
- a->stime = b->stime;
|
|
-
|
|
- if (b->sum_exec_runtime > a->sum_exec_runtime)
|
|
- a->sum_exec_runtime = b->sum_exec_runtime;
|
|
-}
|
|
-
|
|
-void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)
|
|
-{
|
|
- struct thread_group_cputimer *cputimer = &tsk->signal->cputimer;
|
|
- struct task_cputime sum;
|
|
- unsigned long flags;
|
|
-
|
|
- spin_lock_irqsave(&cputimer->lock, flags);
|
|
- if (!cputimer->running) {
|
|
- cputimer->running = 1;
|
|
- /*
|
|
- * The POSIX timer interface allows for absolute time expiry
|
|
- * values through the TIMER_ABSTIME flag, therefore we have
|
|
- * to synchronize the timer to the clock every time we start
|
|
- * it.
|
|
- */
|
|
- thread_group_cputime(tsk, &sum);
|
|
- update_gt_cputime(&cputimer->cputime, &sum);
|
|
- }
|
|
- *times = cputimer->cputime;
|
|
- spin_unlock_irqrestore(&cputimer->lock, flags);
|
|
-}
|
|
-
|
|
/*
|
|
* Sample a process (thread group) clock for the given group_leader task.
|
|
* Must be called with tasklist_lock held for reading.
|
|
@@ -522,7 +457,7 @@
|
|
{
|
|
struct task_cputime cputime;
|
|
|
|
- thread_group_cputimer(tsk, &cputime);
|
|
+ thread_group_cputime(tsk, &cputime);
|
|
cleanup_timers(tsk->signal->cpu_timers,
|
|
cputime.utime, cputime.stime, cputime.sum_exec_runtime);
|
|
}
|
|
@@ -681,33 +616,6 @@
|
|
}
|
|
|
|
/*
|
|
- * Sample a process (thread group) timer for the given group_leader task.
|
|
- * Must be called with tasklist_lock held for reading.
|
|
- */
|
|
-static int cpu_timer_sample_group(const clockid_t which_clock,
|
|
- struct task_struct *p,
|
|
- union cpu_time_count *cpu)
|
|
-{
|
|
- struct task_cputime cputime;
|
|
-
|
|
- thread_group_cputimer(p, &cputime);
|
|
- switch (CPUCLOCK_WHICH(which_clock)) {
|
|
- default:
|
|
- return -EINVAL;
|
|
- case CPUCLOCK_PROF:
|
|
- cpu->cpu = cputime_add(cputime.utime, cputime.stime);
|
|
- break;
|
|
- case CPUCLOCK_VIRT:
|
|
- cpu->cpu = cputime.utime;
|
|
- break;
|
|
- case CPUCLOCK_SCHED:
|
|
- cpu->sched = cputime.sum_exec_runtime + task_delta_exec(p);
|
|
- break;
|
|
- }
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/*
|
|
* Guts of sys_timer_settime for CPU timers.
|
|
* This is called with the timer locked and interrupts disabled.
|
|
* If we return TIMER_RETRY, it's necessary to release the timer's lock
|
|
@@ -768,7 +676,7 @@
|
|
if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
|
|
cpu_clock_sample(timer->it_clock, p, &val);
|
|
} else {
|
|
- cpu_timer_sample_group(timer->it_clock, p, &val);
|
|
+ cpu_clock_sample_group(timer->it_clock, p, &val);
|
|
}
|
|
|
|
if (old) {
|
|
@@ -916,7 +824,7 @@
|
|
read_unlock(&tasklist_lock);
|
|
goto dead;
|
|
} else {
|
|
- cpu_timer_sample_group(timer->it_clock, p, &now);
|
|
+ cpu_clock_sample_group(timer->it_clock, p, &now);
|
|
clear_dead = (unlikely(p->exit_state) &&
|
|
thread_group_empty(p));
|
|
}
|
|
@@ -1056,19 +964,6 @@
|
|
}
|
|
}
|
|
|
|
-static void stop_process_timers(struct task_struct *tsk)
|
|
-{
|
|
- struct thread_group_cputimer *cputimer = &tsk->signal->cputimer;
|
|
- unsigned long flags;
|
|
-
|
|
- if (!cputimer->running)
|
|
- return;
|
|
-
|
|
- spin_lock_irqsave(&cputimer->lock, flags);
|
|
- cputimer->running = 0;
|
|
- spin_unlock_irqrestore(&cputimer->lock, flags);
|
|
-}
|
|
-
|
|
/*
|
|
* Check for any per-thread CPU timers that have fired and move them
|
|
* off the tsk->*_timers list onto the firing list. Per-thread timers
|
|
@@ -1092,15 +987,13 @@
|
|
sig->rlim[RLIMIT_CPU].rlim_cur == RLIM_INFINITY &&
|
|
list_empty(&timers[CPUCLOCK_VIRT]) &&
|
|
cputime_eq(sig->it_virt_expires, cputime_zero) &&
|
|
- list_empty(&timers[CPUCLOCK_SCHED])) {
|
|
- stop_process_timers(tsk);
|
|
+ list_empty(&timers[CPUCLOCK_SCHED]))
|
|
return;
|
|
- }
|
|
|
|
/*
|
|
* Collect the current process totals.
|
|
*/
|
|
- thread_group_cputimer(tsk, &cputime);
|
|
+ thread_group_cputime(tsk, &cputime);
|
|
utime = cputime.utime;
|
|
ptime = cputime_add(utime, cputime.stime);
|
|
sum_sched_runtime = cputime.sum_exec_runtime;
|
|
@@ -1271,7 +1164,7 @@
|
|
clear_dead_task(timer, now);
|
|
goto out_unlock;
|
|
}
|
|
- cpu_timer_sample_group(timer->it_clock, p, &now);
|
|
+ cpu_clock_sample_group(timer->it_clock, p, &now);
|
|
bump_cpu_timer(timer, now);
|
|
/* Leave the tasklist_lock locked for the call below. */
|
|
}
|
|
@@ -1366,7 +1259,7 @@
|
|
if (!task_cputime_zero(&sig->cputime_expires)) {
|
|
struct task_cputime group_sample;
|
|
|
|
- thread_group_cputimer(tsk, &group_sample);
|
|
+ thread_group_cputime(tsk, &group_sample);
|
|
if (task_cputime_expired(&group_sample, &sig->cputime_expires))
|
|
return 1;
|
|
}
|
|
@@ -1448,7 +1341,7 @@
|
|
struct list_head *head;
|
|
|
|
BUG_ON(clock_idx == CPUCLOCK_SCHED);
|
|
- cpu_timer_sample_group(clock_idx, tsk, &now);
|
|
+ cpu_clock_sample_group(clock_idx, tsk, &now);
|
|
|
|
if (oldval) {
|
|
if (!cputime_eq(*oldval, cputime_zero)) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/power/console.c linux-2.6.29-rc3.owrt/kernel/power/console.c
|
|
--- linux-2.6.29.owrt/kernel/power/console.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/power/console.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -78,12 +78,6 @@
|
|
}
|
|
set_console(orig_fgconsole);
|
|
release_console_sem();
|
|
-
|
|
- if (vt_waitactive(orig_fgconsole)) {
|
|
- pr_debug("Resume: Can't switch VCs.");
|
|
- return;
|
|
- }
|
|
-
|
|
kmsg_redirect = orig_kmsg;
|
|
}
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/power/disk.c linux-2.6.29-rc3.owrt/kernel/power/disk.c
|
|
--- linux-2.6.29.owrt/kernel/power/disk.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/power/disk.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -227,12 +227,6 @@
|
|
"aborting hibernation\n");
|
|
goto Enable_irqs;
|
|
}
|
|
- sysdev_suspend(PMSG_FREEZE);
|
|
- if (error) {
|
|
- printk(KERN_ERR "PM: Some devices failed to power down, "
|
|
- "aborting hibernation\n");
|
|
- goto Power_up_devices;
|
|
- }
|
|
|
|
if (hibernation_test(TEST_CORE))
|
|
goto Power_up;
|
|
@@ -248,11 +242,9 @@
|
|
if (!in_suspend)
|
|
platform_leave(platform_mode);
|
|
Power_up:
|
|
- sysdev_resume();
|
|
/* NOTE: device_power_up() is just a resume() for devices
|
|
* that suspended with irqs off ... no overall powerup.
|
|
*/
|
|
- Power_up_devices:
|
|
device_power_up(in_suspend ?
|
|
(error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
|
|
Enable_irqs:
|
|
@@ -343,7 +335,6 @@
|
|
"aborting resume\n");
|
|
goto Enable_irqs;
|
|
}
|
|
- sysdev_suspend(PMSG_QUIESCE);
|
|
/* We'll ignore saved state, but this gets preempt count (etc) right */
|
|
save_processor_state();
|
|
error = restore_highmem();
|
|
@@ -366,7 +357,6 @@
|
|
swsusp_free();
|
|
restore_processor_state();
|
|
touch_softlockup_watchdog();
|
|
- sysdev_resume();
|
|
device_power_up(PMSG_RECOVER);
|
|
Enable_irqs:
|
|
local_irq_enable();
|
|
@@ -450,7 +440,6 @@
|
|
local_irq_disable();
|
|
error = device_power_down(PMSG_HIBERNATE);
|
|
if (!error) {
|
|
- sysdev_suspend(PMSG_HIBERNATE);
|
|
hibernation_ops->enter();
|
|
/* We should never get here */
|
|
while (1);
|
|
@@ -606,12 +595,6 @@
|
|
unsigned int flags;
|
|
|
|
/*
|
|
- * If the user said "noresume".. bail out early.
|
|
- */
|
|
- if (noresume)
|
|
- return 0;
|
|
-
|
|
- /*
|
|
* name_to_dev_t() below takes a sysfs buffer mutex when sysfs
|
|
* is configured into the kernel. Since the regular hibernate
|
|
* trigger path is via sysfs which takes a buffer mutex before
|
|
@@ -627,11 +610,6 @@
|
|
mutex_unlock(&pm_mutex);
|
|
return -ENOENT;
|
|
}
|
|
- /*
|
|
- * Some device discovery might still be in progress; we need
|
|
- * to wait for this to finish.
|
|
- */
|
|
- wait_for_device_probe();
|
|
swsusp_resume_device = name_to_dev_t(resume_file);
|
|
pr_debug("PM: Resume from partition %s\n", resume_file);
|
|
} else {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/power/main.c linux-2.6.29-rc3.owrt/kernel/power/main.c
|
|
--- linux-2.6.29.owrt/kernel/power/main.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/power/main.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -57,6 +57,16 @@
|
|
#ifdef CONFIG_PM_DEBUG
|
|
int pm_test_level = TEST_NONE;
|
|
|
|
+static int suspend_test(int level)
|
|
+{
|
|
+ if (pm_test_level == level) {
|
|
+ printk(KERN_INFO "suspend debug: Waiting for 5 seconds.\n");
|
|
+ mdelay(5000);
|
|
+ return 1;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static const char * const pm_tests[__TEST_AFTER_LAST] = {
|
|
[TEST_NONE] = "none",
|
|
[TEST_CORE] = "core",
|
|
@@ -115,24 +125,14 @@
|
|
}
|
|
|
|
power_attr(pm_test);
|
|
-#endif /* CONFIG_PM_DEBUG */
|
|
+#else /* !CONFIG_PM_DEBUG */
|
|
+static inline int suspend_test(int level) { return 0; }
|
|
+#endif /* !CONFIG_PM_DEBUG */
|
|
|
|
#endif /* CONFIG_PM_SLEEP */
|
|
|
|
#ifdef CONFIG_SUSPEND
|
|
|
|
-static int suspend_test(int level)
|
|
-{
|
|
-#ifdef CONFIG_PM_DEBUG
|
|
- if (pm_test_level == level) {
|
|
- printk(KERN_INFO "suspend debug: Waiting for 5 seconds.\n");
|
|
- mdelay(5000);
|
|
- return 1;
|
|
- }
|
|
-#endif /* !CONFIG_PM_DEBUG */
|
|
- return 0;
|
|
-}
|
|
-
|
|
#ifdef CONFIG_PM_TEST_SUSPEND
|
|
|
|
/*
|
|
@@ -298,12 +298,8 @@
|
|
goto Done;
|
|
}
|
|
|
|
- error = sysdev_suspend(PMSG_SUSPEND);
|
|
- if (!error) {
|
|
- if (!suspend_test(TEST_CORE))
|
|
- error = suspend_ops->enter(state);
|
|
- sysdev_resume();
|
|
- }
|
|
+ if (!suspend_test(TEST_CORE))
|
|
+ error = suspend_ops->enter(state);
|
|
|
|
device_power_up(PMSG_RESUME);
|
|
Done:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/power/Makefile linux-2.6.29-rc3.owrt/kernel/power/Makefile
|
|
--- linux-2.6.29.owrt/kernel/power/Makefile 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/power/Makefile 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -3,7 +3,7 @@
|
|
EXTRA_CFLAGS += -DDEBUG
|
|
endif
|
|
|
|
-obj-$(CONFIG_PM) += main.o
|
|
+obj-y := main.o
|
|
obj-$(CONFIG_PM_SLEEP) += console.o
|
|
obj-$(CONFIG_FREEZER) += process.o
|
|
obj-$(CONFIG_HIBERNATION) += swsusp.o disk.o snapshot.o swap.o user.o
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/power/swap.c linux-2.6.29-rc3.owrt/kernel/power/swap.c
|
|
--- linux-2.6.29.owrt/kernel/power/swap.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/power/swap.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -60,7 +60,6 @@
|
|
static int submit(int rw, pgoff_t page_off, struct page *page,
|
|
struct bio **bio_chain)
|
|
{
|
|
- const int bio_rw = rw | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);
|
|
struct bio *bio;
|
|
|
|
bio = bio_alloc(__GFP_WAIT | __GFP_HIGH, 1);
|
|
@@ -81,7 +80,7 @@
|
|
bio_get(bio);
|
|
|
|
if (bio_chain == NULL) {
|
|
- submit_bio(bio_rw, bio);
|
|
+ submit_bio(rw | (1 << BIO_RW_SYNC), bio);
|
|
wait_on_page_locked(page);
|
|
if (rw == READ)
|
|
bio_set_pages_dirty(bio);
|
|
@@ -91,7 +90,7 @@
|
|
get_page(page); /* These pages are freed later */
|
|
bio->bi_private = *bio_chain;
|
|
*bio_chain = bio;
|
|
- submit_bio(bio_rw, bio);
|
|
+ submit_bio(rw | (1 << BIO_RW_SYNC), bio);
|
|
}
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/power/user.c linux-2.6.29-rc3.owrt/kernel/power/user.c
|
|
--- linux-2.6.29.owrt/kernel/power/user.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/power/user.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -95,15 +95,15 @@
|
|
data->swap = swsusp_resume_device ?
|
|
swap_type_of(swsusp_resume_device, 0, NULL) : -1;
|
|
data->mode = O_RDONLY;
|
|
- error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
|
|
+ error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
|
|
if (error)
|
|
- pm_notifier_call_chain(PM_POST_HIBERNATION);
|
|
+ pm_notifier_call_chain(PM_POST_RESTORE);
|
|
} else {
|
|
data->swap = -1;
|
|
data->mode = O_WRONLY;
|
|
- error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
|
|
+ error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
|
|
if (error)
|
|
- pm_notifier_call_chain(PM_POST_RESTORE);
|
|
+ pm_notifier_call_chain(PM_POST_HIBERNATION);
|
|
}
|
|
if (error)
|
|
atomic_inc(&snapshot_device_available);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/printk.c linux-2.6.29-rc3.owrt/kernel/printk.c
|
|
--- linux-2.6.29.owrt/kernel/printk.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/printk.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -73,6 +73,7 @@
|
|
* driver system.
|
|
*/
|
|
static DECLARE_MUTEX(console_sem);
|
|
+static DECLARE_MUTEX(secondary_console_sem);
|
|
struct console *console_drivers;
|
|
EXPORT_SYMBOL_GPL(console_drivers);
|
|
|
|
@@ -890,14 +891,12 @@
|
|
printk("Suspending console(s) (use no_console_suspend to debug)\n");
|
|
acquire_console_sem();
|
|
console_suspended = 1;
|
|
- up(&console_sem);
|
|
}
|
|
|
|
void resume_console(void)
|
|
{
|
|
if (!console_suspend_enabled)
|
|
return;
|
|
- down(&console_sem);
|
|
console_suspended = 0;
|
|
release_console_sem();
|
|
}
|
|
@@ -913,9 +912,11 @@
|
|
void acquire_console_sem(void)
|
|
{
|
|
BUG_ON(in_interrupt());
|
|
- down(&console_sem);
|
|
- if (console_suspended)
|
|
+ if (console_suspended) {
|
|
+ down(&secondary_console_sem);
|
|
return;
|
|
+ }
|
|
+ down(&console_sem);
|
|
console_locked = 1;
|
|
console_may_schedule = 1;
|
|
}
|
|
@@ -925,10 +926,6 @@
|
|
{
|
|
if (down_trylock(&console_sem))
|
|
return -1;
|
|
- if (console_suspended) {
|
|
- up(&console_sem);
|
|
- return -1;
|
|
- }
|
|
console_locked = 1;
|
|
console_may_schedule = 0;
|
|
return 0;
|
|
@@ -982,7 +979,7 @@
|
|
unsigned wake_klogd = 0;
|
|
|
|
if (console_suspended) {
|
|
- up(&console_sem);
|
|
+ up(&secondary_console_sem);
|
|
return;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/profile.c linux-2.6.29-rc3.owrt/kernel/profile.c
|
|
--- linux-2.6.29.owrt/kernel/profile.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/profile.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -114,15 +114,12 @@
|
|
if (!slab_is_available()) {
|
|
prof_buffer = alloc_bootmem(buffer_bytes);
|
|
alloc_bootmem_cpumask_var(&prof_cpu_mask);
|
|
- cpumask_copy(prof_cpu_mask, cpu_possible_mask);
|
|
return 0;
|
|
}
|
|
|
|
if (!alloc_cpumask_var(&prof_cpu_mask, GFP_KERNEL))
|
|
return -ENOMEM;
|
|
|
|
- cpumask_copy(prof_cpu_mask, cpu_possible_mask);
|
|
-
|
|
prof_buffer = kzalloc(buffer_bytes, GFP_KERNEL);
|
|
if (prof_buffer)
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/rcuclassic.c linux-2.6.29-rc3.owrt/kernel/rcuclassic.c
|
|
--- linux-2.6.29.owrt/kernel/rcuclassic.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/rcuclassic.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -679,8 +679,8 @@
|
|
void rcu_check_callbacks(int cpu, int user)
|
|
{
|
|
if (user ||
|
|
- (idle_cpu(cpu) && rcu_scheduler_active &&
|
|
- !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) {
|
|
+ (idle_cpu(cpu) && !in_softirq() &&
|
|
+ hardirq_count() <= (1 << HARDIRQ_SHIFT))) {
|
|
|
|
/*
|
|
* Get here if this CPU took its interrupt from user
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/rcupdate.c linux-2.6.29-rc3.owrt/kernel/rcupdate.c
|
|
--- linux-2.6.29.owrt/kernel/rcupdate.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/rcupdate.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -44,7 +44,6 @@
|
|
#include <linux/cpu.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/module.h>
|
|
-#include <linux/kernel_stat.h>
|
|
|
|
enum rcu_barrier {
|
|
RCU_BARRIER_STD,
|
|
@@ -56,7 +55,6 @@
|
|
static atomic_t rcu_barrier_cpu_count;
|
|
static DEFINE_MUTEX(rcu_barrier_mutex);
|
|
static struct completion rcu_barrier_completion;
|
|
-int rcu_scheduler_active __read_mostly;
|
|
|
|
/*
|
|
* Awaken the corresponding synchronize_rcu() instance now that a
|
|
@@ -82,10 +80,6 @@
|
|
void synchronize_rcu(void)
|
|
{
|
|
struct rcu_synchronize rcu;
|
|
-
|
|
- if (rcu_blocking_is_gp())
|
|
- return;
|
|
-
|
|
init_completion(&rcu.completion);
|
|
/* Will wake me after RCU finished. */
|
|
call_rcu(&rcu.head, wakeme_after_rcu);
|
|
@@ -181,9 +175,3 @@
|
|
__rcu_init();
|
|
}
|
|
|
|
-void rcu_scheduler_starting(void)
|
|
-{
|
|
- WARN_ON(num_online_cpus() != 1);
|
|
- WARN_ON(nr_context_switches() > 0);
|
|
- rcu_scheduler_active = 1;
|
|
-}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/rcupreempt.c linux-2.6.29-rc3.owrt/kernel/rcupreempt.c
|
|
--- linux-2.6.29.owrt/kernel/rcupreempt.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/rcupreempt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -1181,9 +1181,6 @@
|
|
{
|
|
struct rcu_synchronize rcu;
|
|
|
|
- if (num_online_cpus() == 1)
|
|
- return; /* blocking is gp if only one CPU! */
|
|
-
|
|
init_completion(&rcu.completion);
|
|
/* Will wake me after RCU finished. */
|
|
call_rcu_sched(&rcu.head, wakeme_after_rcu);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/rcutree.c linux-2.6.29-rc3.owrt/kernel/rcutree.c
|
|
--- linux-2.6.29.owrt/kernel/rcutree.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/rcutree.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -948,8 +948,8 @@
|
|
void rcu_check_callbacks(int cpu, int user)
|
|
{
|
|
if (user ||
|
|
- (idle_cpu(cpu) && rcu_scheduler_active &&
|
|
- !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) {
|
|
+ (idle_cpu(cpu) && !in_softirq() &&
|
|
+ hardirq_count() <= (1 << HARDIRQ_SHIFT))) {
|
|
|
|
/*
|
|
* Get here if this CPU took its interrupt from user
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/sched.c linux-2.6.29-rc3.owrt/kernel/sched.c
|
|
--- linux-2.6.29.owrt/kernel/sched.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/sched.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -223,7 +223,7 @@
|
|
{
|
|
ktime_t now;
|
|
|
|
- if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF)
|
|
+ if (rt_bandwidth_enabled() && rt_b->rt_runtime == RUNTIME_INF)
|
|
return;
|
|
|
|
if (hrtimer_active(&rt_b->rt_period_timer))
|
|
@@ -3880,24 +3880,19 @@
|
|
int cpu = smp_processor_id();
|
|
|
|
if (stop_tick) {
|
|
+ cpumask_set_cpu(cpu, nohz.cpu_mask);
|
|
cpu_rq(cpu)->in_nohz_recently = 1;
|
|
|
|
- if (!cpu_active(cpu)) {
|
|
- if (atomic_read(&nohz.load_balancer) != cpu)
|
|
- return 0;
|
|
-
|
|
- /*
|
|
- * If we are going offline and still the leader,
|
|
- * give up!
|
|
- */
|
|
+ /*
|
|
+ * If we are going offline and still the leader, give up!
|
|
+ */
|
|
+ if (!cpu_active(cpu) &&
|
|
+ atomic_read(&nohz.load_balancer) == cpu) {
|
|
if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu)
|
|
BUG();
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
- cpumask_set_cpu(cpu, nohz.cpu_mask);
|
|
-
|
|
/* time for ilb owner also to sleep */
|
|
if (cpumask_weight(nohz.cpu_mask) == num_online_cpus()) {
|
|
if (atomic_read(&nohz.load_balancer) == cpu)
|
|
@@ -4692,8 +4687,8 @@
|
|
* started to run but is not in state TASK_RUNNING. try_to_wake_up() returns
|
|
* zero in this (rare) case, and we handle it by continuing to scan the queue.
|
|
*/
|
|
-void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
|
|
- int nr_exclusive, int sync, void *key)
|
|
+static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
|
|
+ int nr_exclusive, int sync, void *key)
|
|
{
|
|
wait_queue_t *curr, *next;
|
|
|
|
@@ -6945,26 +6940,20 @@
|
|
|
|
static void rq_attach_root(struct rq *rq, struct root_domain *rd)
|
|
{
|
|
- struct root_domain *old_rd = NULL;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&rq->lock, flags);
|
|
|
|
if (rq->rd) {
|
|
- old_rd = rq->rd;
|
|
+ struct root_domain *old_rd = rq->rd;
|
|
|
|
if (cpumask_test_cpu(rq->cpu, old_rd->online))
|
|
set_rq_offline(rq);
|
|
|
|
cpumask_clear_cpu(rq->cpu, old_rd->span);
|
|
|
|
- /*
|
|
- * If we dont want to free the old_rt yet then
|
|
- * set old_rd to NULL to skip the freeing later
|
|
- * in this function:
|
|
- */
|
|
- if (!atomic_dec_and_test(&old_rd->refcount))
|
|
- old_rd = NULL;
|
|
+ if (atomic_dec_and_test(&old_rd->refcount))
|
|
+ free_rootdomain(old_rd);
|
|
}
|
|
|
|
atomic_inc(&rd->refcount);
|
|
@@ -6975,9 +6964,6 @@
|
|
set_rq_online(rq);
|
|
|
|
spin_unlock_irqrestore(&rq->lock, flags);
|
|
-
|
|
- if (old_rd)
|
|
- free_rootdomain(old_rd);
|
|
}
|
|
|
|
static int __init_refok init_rootdomain(struct root_domain *rd, bool bootmem)
|
|
@@ -9225,16 +9211,6 @@
|
|
|
|
return ret;
|
|
}
|
|
-
|
|
-int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk)
|
|
-{
|
|
- /* Don't accept realtime tasks when there is no way for them to run */
|
|
- if (rt_task(tsk) && tg->rt_bandwidth.rt_runtime == 0)
|
|
- return 0;
|
|
-
|
|
- return 1;
|
|
-}
|
|
-
|
|
#else /* !CONFIG_RT_GROUP_SCHED */
|
|
static int sched_rt_global_constraints(void)
|
|
{
|
|
@@ -9328,7 +9304,8 @@
|
|
struct task_struct *tsk)
|
|
{
|
|
#ifdef CONFIG_RT_GROUP_SCHED
|
|
- if (!sched_rt_can_attach(cgroup_tg(cgrp), tsk))
|
|
+ /* Don't accept realtime tasks when there is no way for them to run */
|
|
+ if (rt_task(tsk) && cgroup_tg(cgrp)->rt_bandwidth.rt_runtime == 0)
|
|
return -EINVAL;
|
|
#else
|
|
/* We don't support RT-tasks being in separate groups */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/sched_fair.c linux-2.6.29-rc3.owrt/kernel/sched_fair.c
|
|
--- linux-2.6.29.owrt/kernel/sched_fair.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/sched_fair.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -719,7 +719,7 @@
|
|
__enqueue_entity(cfs_rq, se);
|
|
}
|
|
|
|
-static void __clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
|
|
+static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
|
|
{
|
|
if (cfs_rq->last == se)
|
|
cfs_rq->last = NULL;
|
|
@@ -728,12 +728,6 @@
|
|
cfs_rq->next = NULL;
|
|
}
|
|
|
|
-static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
|
|
-{
|
|
- for_each_sched_entity(se)
|
|
- __clear_buddies(cfs_rq_of(se), se);
|
|
-}
|
|
-
|
|
static void
|
|
dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep)
|
|
{
|
|
@@ -774,14 +768,8 @@
|
|
|
|
ideal_runtime = sched_slice(cfs_rq, curr);
|
|
delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
|
|
- if (delta_exec > ideal_runtime) {
|
|
+ if (delta_exec > ideal_runtime)
|
|
resched_task(rq_of(cfs_rq)->curr);
|
|
- /*
|
|
- * The current task ran long enough, ensure it doesn't get
|
|
- * re-elected due to buddy favours.
|
|
- */
|
|
- clear_buddies(cfs_rq, curr);
|
|
- }
|
|
}
|
|
|
|
static void
|
|
@@ -1464,11 +1452,6 @@
|
|
|
|
do {
|
|
se = pick_next_entity(cfs_rq);
|
|
- /*
|
|
- * If se was a buddy, clear it so that it will have to earn
|
|
- * the favour again.
|
|
- */
|
|
- __clear_buddies(cfs_rq, se);
|
|
set_next_entity(cfs_rq, se);
|
|
cfs_rq = group_cfs_rq(se);
|
|
} while (cfs_rq);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/sched_rt.c linux-2.6.29-rc3.owrt/kernel/sched_rt.c
|
|
--- linux-2.6.29.owrt/kernel/sched_rt.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/sched_rt.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -968,8 +968,8 @@
|
|
if ((this_cpu != -1) && cpu_isset(this_cpu, *mask))
|
|
return this_cpu;
|
|
|
|
- first = cpumask_first(mask);
|
|
- if (first < nr_cpu_ids)
|
|
+ first = first_cpu(*mask);
|
|
+ if (first != NR_CPUS)
|
|
return first;
|
|
|
|
return -1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/sched_stats.h linux-2.6.29-rc3.owrt/kernel/sched_stats.h
|
|
--- linux-2.6.29.owrt/kernel/sched_stats.h 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/sched_stats.h 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -296,21 +296,19 @@
|
|
static inline void account_group_user_time(struct task_struct *tsk,
|
|
cputime_t cputime)
|
|
{
|
|
- struct thread_group_cputimer *cputimer;
|
|
+ struct task_cputime *times;
|
|
+ struct signal_struct *sig;
|
|
|
|
/* tsk == current, ensure it is safe to use ->signal */
|
|
if (unlikely(tsk->exit_state))
|
|
return;
|
|
|
|
- cputimer = &tsk->signal->cputimer;
|
|
-
|
|
- if (!cputimer->running)
|
|
- return;
|
|
+ sig = tsk->signal;
|
|
+ times = &sig->cputime.totals;
|
|
|
|
- spin_lock(&cputimer->lock);
|
|
- cputimer->cputime.utime =
|
|
- cputime_add(cputimer->cputime.utime, cputime);
|
|
- spin_unlock(&cputimer->lock);
|
|
+ spin_lock(×->lock);
|
|
+ times->utime = cputime_add(times->utime, cputime);
|
|
+ spin_unlock(×->lock);
|
|
}
|
|
|
|
/**
|
|
@@ -326,21 +324,19 @@
|
|
static inline void account_group_system_time(struct task_struct *tsk,
|
|
cputime_t cputime)
|
|
{
|
|
- struct thread_group_cputimer *cputimer;
|
|
+ struct task_cputime *times;
|
|
+ struct signal_struct *sig;
|
|
|
|
/* tsk == current, ensure it is safe to use ->signal */
|
|
if (unlikely(tsk->exit_state))
|
|
return;
|
|
|
|
- cputimer = &tsk->signal->cputimer;
|
|
-
|
|
- if (!cputimer->running)
|
|
- return;
|
|
+ sig = tsk->signal;
|
|
+ times = &sig->cputime.totals;
|
|
|
|
- spin_lock(&cputimer->lock);
|
|
- cputimer->cputime.stime =
|
|
- cputime_add(cputimer->cputime.stime, cputime);
|
|
- spin_unlock(&cputimer->lock);
|
|
+ spin_lock(×->lock);
|
|
+ times->stime = cputime_add(times->stime, cputime);
|
|
+ spin_unlock(×->lock);
|
|
}
|
|
|
|
/**
|
|
@@ -356,7 +352,7 @@
|
|
static inline void account_group_exec_runtime(struct task_struct *tsk,
|
|
unsigned long long ns)
|
|
{
|
|
- struct thread_group_cputimer *cputimer;
|
|
+ struct task_cputime *times;
|
|
struct signal_struct *sig;
|
|
|
|
sig = tsk->signal;
|
|
@@ -365,12 +361,9 @@
|
|
if (unlikely(!sig))
|
|
return;
|
|
|
|
- cputimer = &sig->cputimer;
|
|
-
|
|
- if (!cputimer->running)
|
|
- return;
|
|
+ times = &sig->cputime.totals;
|
|
|
|
- spin_lock(&cputimer->lock);
|
|
- cputimer->cputime.sum_exec_runtime += ns;
|
|
- spin_unlock(&cputimer->lock);
|
|
+ spin_lock(×->lock);
|
|
+ times->sum_exec_runtime += ns;
|
|
+ spin_unlock(×->lock);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/seccomp.c linux-2.6.29-rc3.owrt/kernel/seccomp.c
|
|
--- linux-2.6.29.owrt/kernel/seccomp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/seccomp.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -8,7 +8,6 @@
|
|
|
|
#include <linux/seccomp.h>
|
|
#include <linux/sched.h>
|
|
-#include <linux/compat.h>
|
|
|
|
/* #define SECCOMP_DEBUG 1 */
|
|
#define NR_SECCOMP_MODES 1
|
|
@@ -23,7 +22,7 @@
|
|
0, /* null terminated */
|
|
};
|
|
|
|
-#ifdef CONFIG_COMPAT
|
|
+#ifdef TIF_32BIT
|
|
static int mode1_syscalls_32[] = {
|
|
__NR_seccomp_read_32, __NR_seccomp_write_32, __NR_seccomp_exit_32, __NR_seccomp_sigreturn_32,
|
|
0, /* null terminated */
|
|
@@ -38,8 +37,8 @@
|
|
switch (mode) {
|
|
case 1:
|
|
syscall = mode1_syscalls;
|
|
-#ifdef CONFIG_COMPAT
|
|
- if (is_compat_task())
|
|
+#ifdef TIF_32BIT
|
|
+ if (test_thread_flag(TIF_32BIT))
|
|
syscall = mode1_syscalls_32;
|
|
#endif
|
|
do {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/signal.c linux-2.6.29-rc3.owrt/kernel/signal.c
|
|
--- linux-2.6.29.owrt/kernel/signal.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/signal.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -909,9 +909,7 @@
|
|
}
|
|
#endif
|
|
printk("\n");
|
|
- preempt_disable();
|
|
show_regs(regs);
|
|
- preempt_enable();
|
|
}
|
|
|
|
static int __init setup_print_fatal_signals(char *str)
|
|
@@ -1367,6 +1365,7 @@
|
|
struct siginfo info;
|
|
unsigned long flags;
|
|
struct sighand_struct *psig;
|
|
+ struct task_cputime cputime;
|
|
int ret = sig;
|
|
|
|
BUG_ON(sig == -1);
|
|
@@ -1396,10 +1395,9 @@
|
|
info.si_uid = __task_cred(tsk)->uid;
|
|
rcu_read_unlock();
|
|
|
|
- info.si_utime = cputime_to_clock_t(cputime_add(tsk->utime,
|
|
- tsk->signal->utime));
|
|
- info.si_stime = cputime_to_clock_t(cputime_add(tsk->stime,
|
|
- tsk->signal->stime));
|
|
+ thread_group_cputime(tsk, &cputime);
|
|
+ info.si_utime = cputime_to_jiffies(cputime.utime);
|
|
+ info.si_stime = cputime_to_jiffies(cputime.stime);
|
|
|
|
info.si_status = tsk->exit_code & 0x7f;
|
|
if (tsk->exit_code & 0x80)
|
|
@@ -1575,15 +1573,7 @@
|
|
read_lock(&tasklist_lock);
|
|
if (may_ptrace_stop()) {
|
|
do_notify_parent_cldstop(current, CLD_TRAPPED);
|
|
- /*
|
|
- * Don't want to allow preemption here, because
|
|
- * sys_ptrace() needs this task to be inactive.
|
|
- *
|
|
- * XXX: implement read_unlock_no_resched().
|
|
- */
|
|
- preempt_disable();
|
|
read_unlock(&tasklist_lock);
|
|
- preempt_enable_no_resched();
|
|
schedule();
|
|
} else {
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/smp.c linux-2.6.29-rc3.owrt/kernel/smp.c
|
|
--- linux-2.6.29.owrt/kernel/smp.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/smp.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -18,7 +18,6 @@
|
|
enum {
|
|
CSD_FLAG_WAIT = 0x01,
|
|
CSD_FLAG_ALLOC = 0x02,
|
|
- CSD_FLAG_LOCK = 0x04,
|
|
};
|
|
|
|
struct call_function_data {
|
|
@@ -187,9 +186,6 @@
|
|
if (data_flags & CSD_FLAG_WAIT) {
|
|
smp_wmb();
|
|
data->flags &= ~CSD_FLAG_WAIT;
|
|
- } else if (data_flags & CSD_FLAG_LOCK) {
|
|
- smp_wmb();
|
|
- data->flags &= ~CSD_FLAG_LOCK;
|
|
} else if (data_flags & CSD_FLAG_ALLOC)
|
|
kfree(data);
|
|
}
|
|
@@ -200,8 +196,6 @@
|
|
}
|
|
}
|
|
|
|
-static DEFINE_PER_CPU(struct call_single_data, csd_data);
|
|
-
|
|
/*
|
|
* smp_call_function_single - Run a function on a specific CPU
|
|
* @func: The function to run. This must be fast and non-blocking.
|
|
@@ -230,38 +224,14 @@
|
|
func(info);
|
|
local_irq_restore(flags);
|
|
} else if ((unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) {
|
|
- struct call_single_data *data;
|
|
+ struct call_single_data *data = NULL;
|
|
|
|
if (!wait) {
|
|
- /*
|
|
- * We are calling a function on a single CPU
|
|
- * and we are not going to wait for it to finish.
|
|
- * We first try to allocate the data, but if we
|
|
- * fail, we fall back to use a per cpu data to pass
|
|
- * the information to that CPU. Since all callers
|
|
- * of this code will use the same data, we must
|
|
- * synchronize the callers to prevent a new caller
|
|
- * from corrupting the data before the callee
|
|
- * can access it.
|
|
- *
|
|
- * The CSD_FLAG_LOCK is used to let us know when
|
|
- * the IPI handler is done with the data.
|
|
- * The first caller will set it, and the callee
|
|
- * will clear it. The next caller must wait for
|
|
- * it to clear before we set it again. This
|
|
- * will make sure the callee is done with the
|
|
- * data before a new caller will use it.
|
|
- */
|
|
data = kmalloc(sizeof(*data), GFP_ATOMIC);
|
|
if (data)
|
|
data->flags = CSD_FLAG_ALLOC;
|
|
- else {
|
|
- data = &per_cpu(csd_data, me);
|
|
- while (data->flags & CSD_FLAG_LOCK)
|
|
- cpu_relax();
|
|
- data->flags = CSD_FLAG_LOCK;
|
|
- }
|
|
- } else {
|
|
+ }
|
|
+ if (!data) {
|
|
data = &d;
|
|
data->flags = CSD_FLAG_WAIT;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/softirq.c linux-2.6.29-rc3.owrt/kernel/softirq.c
|
|
--- linux-2.6.29.owrt/kernel/softirq.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/softirq.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -626,7 +626,6 @@
|
|
preempt_enable_no_resched();
|
|
cond_resched();
|
|
preempt_disable();
|
|
- rcu_qsctr_inc((long)__bind_cpu);
|
|
}
|
|
preempt_enable();
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/sys.c linux-2.6.29-rc3.owrt/kernel/sys.c
|
|
--- linux-2.6.29.owrt/kernel/sys.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/sys.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -559,7 +559,7 @@
|
|
abort_creds(new);
|
|
return retval;
|
|
}
|
|
-
|
|
+
|
|
/*
|
|
* change the user struct in a credentials set to match the new UID
|
|
*/
|
|
@@ -571,11 +571,6 @@
|
|
if (!new_user)
|
|
return -EAGAIN;
|
|
|
|
- if (!task_can_switch_user(new_user, current)) {
|
|
- free_uid(new_user);
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
if (atomic_read(&new_user->processes) >=
|
|
current->signal->rlim[RLIMIT_NPROC].rlim_cur &&
|
|
new_user != INIT_USER) {
|
|
@@ -636,11 +631,10 @@
|
|
goto error;
|
|
}
|
|
|
|
- if (new->uid != old->uid) {
|
|
- retval = set_user(new);
|
|
- if (retval < 0)
|
|
- goto error;
|
|
- }
|
|
+ retval = -EAGAIN;
|
|
+ if (new->uid != old->uid && set_user(new) < 0)
|
|
+ goto error;
|
|
+
|
|
if (ruid != (uid_t) -1 ||
|
|
(euid != (uid_t) -1 && euid != old->uid))
|
|
new->suid = new->euid;
|
|
@@ -686,10 +680,9 @@
|
|
retval = -EPERM;
|
|
if (capable(CAP_SETUID)) {
|
|
new->suid = new->uid = uid;
|
|
- if (uid != old->uid) {
|
|
- retval = set_user(new);
|
|
- if (retval < 0)
|
|
- goto error;
|
|
+ if (uid != old->uid && set_user(new) < 0) {
|
|
+ retval = -EAGAIN;
|
|
+ goto error;
|
|
}
|
|
} else if (uid != old->uid && uid != new->suid) {
|
|
goto error;
|
|
@@ -741,13 +734,11 @@
|
|
goto error;
|
|
}
|
|
|
|
+ retval = -EAGAIN;
|
|
if (ruid != (uid_t) -1) {
|
|
new->uid = ruid;
|
|
- if (ruid != old->uid) {
|
|
- retval = set_user(new);
|
|
- if (retval < 0)
|
|
- goto error;
|
|
- }
|
|
+ if (ruid != old->uid && set_user(new) < 0)
|
|
+ goto error;
|
|
}
|
|
if (euid != (uid_t) -1)
|
|
new->euid = euid;
|
|
@@ -1534,14 +1525,22 @@
|
|
return -EINVAL;
|
|
if (copy_from_user(&new_rlim, rlim, sizeof(*rlim)))
|
|
return -EFAULT;
|
|
- if (new_rlim.rlim_cur > new_rlim.rlim_max)
|
|
- return -EINVAL;
|
|
old_rlim = current->signal->rlim + resource;
|
|
if ((new_rlim.rlim_max > old_rlim->rlim_max) &&
|
|
!capable(CAP_SYS_RESOURCE))
|
|
return -EPERM;
|
|
- if (resource == RLIMIT_NOFILE && new_rlim.rlim_max > sysctl_nr_open)
|
|
- return -EPERM;
|
|
+
|
|
+ if (resource == RLIMIT_NOFILE) {
|
|
+ if (new_rlim.rlim_max == RLIM_INFINITY)
|
|
+ new_rlim.rlim_max = sysctl_nr_open;
|
|
+ if (new_rlim.rlim_cur == RLIM_INFINITY)
|
|
+ new_rlim.rlim_cur = sysctl_nr_open;
|
|
+ if (new_rlim.rlim_max > sysctl_nr_open)
|
|
+ return -EPERM;
|
|
+ }
|
|
+
|
|
+ if (new_rlim.rlim_cur > new_rlim.rlim_max)
|
|
+ return -EINVAL;
|
|
|
|
retval = security_task_setrlimit(resource, &new_rlim);
|
|
if (retval)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/sysctl.c linux-2.6.29-rc3.owrt/kernel/sysctl.c
|
|
--- linux-2.6.29.owrt/kernel/sysctl.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/sysctl.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -101,7 +101,6 @@
|
|
|
|
static int zero;
|
|
static int one = 1;
|
|
-static unsigned long one_ul = 1;
|
|
static int one_hundred = 100;
|
|
|
|
/* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
|
|
@@ -975,7 +974,7 @@
|
|
.mode = 0644,
|
|
.proc_handler = &dirty_background_bytes_handler,
|
|
.strategy = &sysctl_intvec,
|
|
- .extra1 = &one_ul,
|
|
+ .extra1 = &one,
|
|
},
|
|
{
|
|
.ctl_name = VM_DIRTY_RATIO,
|
|
@@ -996,7 +995,7 @@
|
|
.mode = 0644,
|
|
.proc_handler = &dirty_bytes_handler,
|
|
.strategy = &sysctl_intvec,
|
|
- .extra1 = &one_ul,
|
|
+ .extra1 = &one,
|
|
},
|
|
{
|
|
.procname = "dirty_writeback_centisecs",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/time/tick-common.c linux-2.6.29-rc3.owrt/kernel/time/tick-common.c
|
|
--- linux-2.6.29.owrt/kernel/time/tick-common.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/time/tick-common.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -274,21 +274,6 @@
|
|
}
|
|
|
|
/*
|
|
- * Transfer the do_timer job away from a dying cpu.
|
|
- *
|
|
- * Called with interrupts disabled.
|
|
- */
|
|
-static void tick_handover_do_timer(int *cpup)
|
|
-{
|
|
- if (*cpup == tick_do_timer_cpu) {
|
|
- int cpu = cpumask_first(cpu_online_mask);
|
|
-
|
|
- tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu :
|
|
- TICK_DO_TIMER_NONE;
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
* Shutdown an event device on a given cpu:
|
|
*
|
|
* This is called on a life CPU, when a CPU is dead. So we cannot
|
|
@@ -312,6 +297,13 @@
|
|
clockevents_exchange_device(dev, NULL);
|
|
td->evtdev = NULL;
|
|
}
|
|
+ /* Transfer the do_timer job away from this cpu */
|
|
+ if (*cpup == tick_do_timer_cpu) {
|
|
+ int cpu = cpumask_first(cpu_online_mask);
|
|
+
|
|
+ tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu :
|
|
+ TICK_DO_TIMER_NONE;
|
|
+ }
|
|
spin_unlock_irqrestore(&tick_device_lock, flags);
|
|
}
|
|
|
|
@@ -365,10 +357,6 @@
|
|
tick_broadcast_oneshot_control(reason);
|
|
break;
|
|
|
|
- case CLOCK_EVT_NOTIFY_CPU_DYING:
|
|
- tick_handover_do_timer(dev);
|
|
- break;
|
|
-
|
|
case CLOCK_EVT_NOTIFY_CPU_DEAD:
|
|
tick_shutdown_broadcast_oneshot(dev);
|
|
tick_shutdown_broadcast(dev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/trace/ftrace.c linux-2.6.29-rc3.owrt/kernel/trace/ftrace.c
|
|
--- linux-2.6.29.owrt/kernel/trace/ftrace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/trace/ftrace.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -17,7 +17,6 @@
|
|
#include <linux/clocksource.h>
|
|
#include <linux/kallsyms.h>
|
|
#include <linux/seq_file.h>
|
|
-#include <linux/suspend.h>
|
|
#include <linux/debugfs.h>
|
|
#include <linux/hardirq.h>
|
|
#include <linux/kthread.h>
|
|
@@ -1737,12 +1736,9 @@
|
|
{
|
|
struct task_struct *p;
|
|
|
|
- rcu_read_lock();
|
|
do_each_pid_task(pid, PIDTYPE_PID, p) {
|
|
clear_tsk_trace_trace(p);
|
|
} while_each_pid_task(pid, PIDTYPE_PID, p);
|
|
- rcu_read_unlock();
|
|
-
|
|
put_pid(pid);
|
|
}
|
|
|
|
@@ -1750,11 +1746,9 @@
|
|
{
|
|
struct task_struct *p;
|
|
|
|
- rcu_read_lock();
|
|
do_each_pid_task(pid, PIDTYPE_PID, p) {
|
|
set_tsk_trace_trace(p);
|
|
} while_each_pid_task(pid, PIDTYPE_PID, p);
|
|
- rcu_read_unlock();
|
|
}
|
|
|
|
static void clear_ftrace_pid_task(struct pid **pid)
|
|
@@ -1971,7 +1965,6 @@
|
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
|
|
|
static atomic_t ftrace_graph_active;
|
|
-static struct notifier_block ftrace_suspend_notifier;
|
|
|
|
int ftrace_graph_entry_stub(struct ftrace_graph_ent *trace)
|
|
{
|
|
@@ -2033,7 +2026,7 @@
|
|
static int start_graph_tracing(void)
|
|
{
|
|
struct ftrace_ret_stack **ret_stack_list;
|
|
- int ret, cpu;
|
|
+ int ret;
|
|
|
|
ret_stack_list = kmalloc(FTRACE_RETSTACK_ALLOC_SIZE *
|
|
sizeof(struct ftrace_ret_stack *),
|
|
@@ -2042,10 +2035,6 @@
|
|
if (!ret_stack_list)
|
|
return -ENOMEM;
|
|
|
|
- /* The cpu_boot init_task->ret_stack will never be freed */
|
|
- for_each_online_cpu(cpu)
|
|
- ftrace_graph_init_task(idle_task(cpu));
|
|
-
|
|
do {
|
|
ret = alloc_retstack_tasklist(ret_stack_list);
|
|
} while (ret == -EAGAIN);
|
|
@@ -2054,27 +2043,6 @@
|
|
return ret;
|
|
}
|
|
|
|
-/*
|
|
- * Hibernation protection.
|
|
- * The state of the current task is too much unstable during
|
|
- * suspend/restore to disk. We want to protect against that.
|
|
- */
|
|
-static int
|
|
-ftrace_suspend_notifier_call(struct notifier_block *bl, unsigned long state,
|
|
- void *unused)
|
|
-{
|
|
- switch (state) {
|
|
- case PM_HIBERNATION_PREPARE:
|
|
- pause_graph_tracing();
|
|
- break;
|
|
-
|
|
- case PM_POST_HIBERNATION:
|
|
- unpause_graph_tracing();
|
|
- break;
|
|
- }
|
|
- return NOTIFY_DONE;
|
|
-}
|
|
-
|
|
int register_ftrace_graph(trace_func_graph_ret_t retfunc,
|
|
trace_func_graph_ent_t entryfunc)
|
|
{
|
|
@@ -2082,9 +2050,6 @@
|
|
|
|
mutex_lock(&ftrace_sysctl_lock);
|
|
|
|
- ftrace_suspend_notifier.notifier_call = ftrace_suspend_notifier_call;
|
|
- register_pm_notifier(&ftrace_suspend_notifier);
|
|
-
|
|
atomic_inc(&ftrace_graph_active);
|
|
ret = start_graph_tracing();
|
|
if (ret) {
|
|
@@ -2110,7 +2075,6 @@
|
|
ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub;
|
|
ftrace_graph_entry = ftrace_graph_entry_stub;
|
|
ftrace_shutdown(FTRACE_STOP_FUNC_RET);
|
|
- unregister_pm_notifier(&ftrace_suspend_notifier);
|
|
|
|
mutex_unlock(&ftrace_sysctl_lock);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/trace/Kconfig linux-2.6.29-rc3.owrt/kernel/trace/Kconfig
|
|
--- linux-2.6.29.owrt/kernel/trace/Kconfig 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/trace/Kconfig 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -52,7 +52,6 @@
|
|
depends on HAVE_FUNCTION_TRACER
|
|
depends on DEBUG_KERNEL
|
|
select FRAME_POINTER
|
|
- select KALLSYMS
|
|
select TRACING
|
|
select CONTEXT_SWITCH_TRACER
|
|
help
|
|
@@ -239,7 +238,6 @@
|
|
depends on DEBUG_KERNEL
|
|
select FUNCTION_TRACER
|
|
select STACKTRACE
|
|
- select KALLSYMS
|
|
help
|
|
This special tracer records the maximum stack footprint of the
|
|
kernel and displays it in debugfs/tracing/stack_trace.
|
|
@@ -304,27 +302,4 @@
|
|
functioning properly. It will do tests on all the configured
|
|
tracers of ftrace.
|
|
|
|
-config MMIOTRACE
|
|
- bool "Memory mapped IO tracing"
|
|
- depends on HAVE_MMIOTRACE_SUPPORT && DEBUG_KERNEL && PCI
|
|
- select TRACING
|
|
- help
|
|
- Mmiotrace traces Memory Mapped I/O access and is meant for
|
|
- debugging and reverse engineering. It is called from the ioremap
|
|
- implementation and works via page faults. Tracing is disabled by
|
|
- default and can be enabled at run-time.
|
|
-
|
|
- See Documentation/tracers/mmiotrace.txt.
|
|
- If you are not helping to develop drivers, say N.
|
|
-
|
|
-config MMIOTRACE_TEST
|
|
- tristate "Test module for mmiotrace"
|
|
- depends on MMIOTRACE && m
|
|
- help
|
|
- This is a dumb module for testing mmiotrace. It is very dangerous
|
|
- as it will write garbage to IO memory starting at a given address.
|
|
- However, it should be safe to use on e.g. unused portion of VRAM.
|
|
-
|
|
- Say N, unless you absolutely know what you are doing.
|
|
-
|
|
endmenu
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/trace/ring_buffer.c linux-2.6.29-rc3.owrt/kernel/trace/ring_buffer.c
|
|
--- linux-2.6.29.owrt/kernel/trace/ring_buffer.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/trace/ring_buffer.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -246,7 +246,7 @@
|
|
return 0;
|
|
}
|
|
|
|
-#define BUF_PAGE_SIZE (PAGE_SIZE - offsetof(struct buffer_data_page, data))
|
|
+#define BUF_PAGE_SIZE (PAGE_SIZE - sizeof(struct buffer_data_page))
|
|
|
|
/*
|
|
* head_page == tail_page && head == tail then buffer is empty.
|
|
@@ -1025,8 +1025,12 @@
|
|
}
|
|
|
|
if (next_page == head_page) {
|
|
- if (!(buffer->flags & RB_FL_OVERWRITE))
|
|
+ if (!(buffer->flags & RB_FL_OVERWRITE)) {
|
|
+ /* reset write */
|
|
+ if (tail <= BUF_PAGE_SIZE)
|
|
+ local_set(&tail_page->write, tail);
|
|
goto out_unlock;
|
|
+ }
|
|
|
|
/* tail_page has not moved yet? */
|
|
if (tail_page == cpu_buffer->tail_page) {
|
|
@@ -1101,10 +1105,6 @@
|
|
return event;
|
|
|
|
out_unlock:
|
|
- /* reset write */
|
|
- if (tail <= BUF_PAGE_SIZE)
|
|
- local_set(&tail_page->write, tail);
|
|
-
|
|
__raw_spin_unlock(&cpu_buffer->lock);
|
|
local_irq_restore(flags);
|
|
return NULL;
|
|
@@ -2174,9 +2174,6 @@
|
|
|
|
cpu_buffer->overrun = 0;
|
|
cpu_buffer->entries = 0;
|
|
-
|
|
- cpu_buffer->write_stamp = 0;
|
|
- cpu_buffer->read_stamp = 0;
|
|
}
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/trace/trace.c linux-2.6.29-rc3.owrt/kernel/trace/trace.c
|
|
--- linux-2.6.29.owrt/kernel/trace/trace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/trace/trace.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -40,7 +40,7 @@
|
|
|
|
#define TRACE_BUFFER_FLAGS (RB_FL_OVERWRITE)
|
|
|
|
-unsigned long __read_mostly tracing_max_latency;
|
|
+unsigned long __read_mostly tracing_max_latency = (cycle_t)ULONG_MAX;
|
|
unsigned long __read_mostly tracing_thresh;
|
|
|
|
/*
|
|
@@ -3736,7 +3736,7 @@
|
|
* it if we decide to change what log level the ftrace dump
|
|
* should be at.
|
|
*/
|
|
-#define KERN_TRACE KERN_EMERG
|
|
+#define KERN_TRACE KERN_INFO
|
|
|
|
static void
|
|
trace_printk_seq(struct trace_seq *s)
|
|
@@ -3770,7 +3770,6 @@
|
|
dump_ran = 1;
|
|
|
|
/* No turning back! */
|
|
- tracing_off();
|
|
ftrace_kill();
|
|
|
|
for_each_tracing_cpu(cpu) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/trace/trace_irqsoff.c linux-2.6.29-rc3.owrt/kernel/trace/trace_irqsoff.c
|
|
--- linux-2.6.29.owrt/kernel/trace/trace_irqsoff.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/trace/trace_irqsoff.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -380,7 +380,6 @@
|
|
|
|
static void __irqsoff_tracer_init(struct trace_array *tr)
|
|
{
|
|
- tracing_max_latency = 0;
|
|
irqsoff_trace = tr;
|
|
/* make sure that the tracer is visible */
|
|
smp_wmb();
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/trace/trace_mmiotrace.c linux-2.6.29-rc3.owrt/kernel/trace/trace_mmiotrace.c
|
|
--- linux-2.6.29.owrt/kernel/trace/trace_mmiotrace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/trace/trace_mmiotrace.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -9,7 +9,6 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/mmiotrace.h>
|
|
#include <linux/pci.h>
|
|
-#include <asm/atomic.h>
|
|
|
|
#include "trace.h"
|
|
|
|
@@ -20,7 +19,6 @@
|
|
static struct trace_array *mmio_trace_array;
|
|
static bool overrun_detected;
|
|
static unsigned long prev_overruns;
|
|
-static atomic_t dropped_count;
|
|
|
|
static void mmio_reset_data(struct trace_array *tr)
|
|
{
|
|
@@ -123,11 +121,11 @@
|
|
|
|
static unsigned long count_overruns(struct trace_iterator *iter)
|
|
{
|
|
- unsigned long cnt = atomic_xchg(&dropped_count, 0);
|
|
+ unsigned long cnt = 0;
|
|
unsigned long over = ring_buffer_overruns(iter->tr->buffer);
|
|
|
|
if (over > prev_overruns)
|
|
- cnt += over - prev_overruns;
|
|
+ cnt = over - prev_overruns;
|
|
prev_overruns = over;
|
|
return cnt;
|
|
}
|
|
@@ -312,10 +310,8 @@
|
|
|
|
event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry),
|
|
&irq_flags);
|
|
- if (!event) {
|
|
- atomic_inc(&dropped_count);
|
|
+ if (!event)
|
|
return;
|
|
- }
|
|
entry = ring_buffer_event_data(event);
|
|
tracing_generic_entry_update(&entry->ent, 0, preempt_count());
|
|
entry->ent.type = TRACE_MMIO_RW;
|
|
@@ -342,10 +338,8 @@
|
|
|
|
event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry),
|
|
&irq_flags);
|
|
- if (!event) {
|
|
- atomic_inc(&dropped_count);
|
|
+ if (!event)
|
|
return;
|
|
- }
|
|
entry = ring_buffer_event_data(event);
|
|
tracing_generic_entry_update(&entry->ent, 0, preempt_count());
|
|
entry->ent.type = TRACE_MMIO_MAP;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/trace/trace_sched_wakeup.c linux-2.6.29-rc3.owrt/kernel/trace/trace_sched_wakeup.c
|
|
--- linux-2.6.29.owrt/kernel/trace/trace_sched_wakeup.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/trace/trace_sched_wakeup.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -333,7 +333,6 @@
|
|
|
|
static int wakeup_tracer_init(struct trace_array *tr)
|
|
{
|
|
- tracing_max_latency = 0;
|
|
wakeup_trace = tr;
|
|
start_wakeup_tracer(tr);
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/trace/trace_selftest.c linux-2.6.29-rc3.owrt/kernel/trace/trace_selftest.c
|
|
--- linux-2.6.29.owrt/kernel/trace/trace_selftest.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/trace/trace_selftest.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -23,20 +23,10 @@
|
|
{
|
|
struct ring_buffer_event *event;
|
|
struct trace_entry *entry;
|
|
- unsigned int loops = 0;
|
|
|
|
while ((event = ring_buffer_consume(tr->buffer, cpu, NULL))) {
|
|
entry = ring_buffer_event_data(event);
|
|
|
|
- /*
|
|
- * The ring buffer is a size of trace_buf_size, if
|
|
- * we loop more than the size, there's something wrong
|
|
- * with the ring buffer.
|
|
- */
|
|
- if (loops++ > trace_buf_size) {
|
|
- printk(KERN_CONT ".. bad ring buffer ");
|
|
- goto failed;
|
|
- }
|
|
if (!trace_valid_entry(entry)) {
|
|
printk(KERN_CONT ".. invalid entry %d ",
|
|
entry->type);
|
|
@@ -67,20 +57,11 @@
|
|
|
|
cnt = ring_buffer_entries(tr->buffer);
|
|
|
|
- /*
|
|
- * The trace_test_buffer_cpu runs a while loop to consume all data.
|
|
- * If the calling tracer is broken, and is constantly filling
|
|
- * the buffer, this will run forever, and hard lock the box.
|
|
- * We disable the ring buffer while we do this test to prevent
|
|
- * a hard lock up.
|
|
- */
|
|
- tracing_off();
|
|
for_each_possible_cpu(cpu) {
|
|
ret = trace_test_buffer_cpu(tr, cpu);
|
|
if (ret)
|
|
break;
|
|
}
|
|
- tracing_on();
|
|
__raw_spin_unlock(&ftrace_max_lock);
|
|
local_irq_restore(flags);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/tsacct.c linux-2.6.29-rc3.owrt/kernel/tsacct.c
|
|
--- linux-2.6.29.owrt/kernel/tsacct.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/tsacct.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -122,10 +122,8 @@
|
|
if (likely(tsk->mm)) {
|
|
cputime_t time, dtime;
|
|
struct timeval value;
|
|
- unsigned long flags;
|
|
u64 delta;
|
|
|
|
- local_irq_save(flags);
|
|
time = tsk->stime + tsk->utime;
|
|
dtime = cputime_sub(time, tsk->acct_timexpd);
|
|
jiffies_to_timeval(cputime_to_jiffies(dtime), &value);
|
|
@@ -133,12 +131,10 @@
|
|
delta = delta * USEC_PER_SEC + value.tv_usec;
|
|
|
|
if (delta == 0)
|
|
- goto out;
|
|
+ return;
|
|
tsk->acct_timexpd = time;
|
|
tsk->acct_rss_mem1 += delta * get_mm_rss(tsk->mm);
|
|
tsk->acct_vm_mem1 += delta * tsk->mm->total_vm;
|
|
- out:
|
|
- local_irq_restore(flags);
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/user.c linux-2.6.29-rc3.owrt/kernel/user.c
|
|
--- linux-2.6.29.owrt/kernel/user.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/user.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -72,7 +72,6 @@
|
|
static void uid_hash_remove(struct user_struct *up)
|
|
{
|
|
hlist_del_init(&up->uidhash_node);
|
|
- put_user_ns(up->user_ns);
|
|
}
|
|
|
|
static struct user_struct *uid_hash_find(uid_t uid, struct hlist_head *hashent)
|
|
@@ -286,12 +285,14 @@
|
|
/* work function to remove sysfs directory for a user and free up
|
|
* corresponding structures.
|
|
*/
|
|
-static void cleanup_user_struct(struct work_struct *w)
|
|
+static void remove_user_sysfs_dir(struct work_struct *w)
|
|
{
|
|
struct user_struct *up = container_of(w, struct user_struct, work);
|
|
unsigned long flags;
|
|
int remove_user = 0;
|
|
|
|
+ if (up->user_ns != &init_user_ns)
|
|
+ return;
|
|
/* Make uid_hash_remove() + sysfs_remove_file() + kobject_del()
|
|
* atomic.
|
|
*/
|
|
@@ -310,11 +311,9 @@
|
|
if (!remove_user)
|
|
goto done;
|
|
|
|
- if (up->user_ns == &init_user_ns) {
|
|
- kobject_uevent(&up->kobj, KOBJ_REMOVE);
|
|
- kobject_del(&up->kobj);
|
|
- kobject_put(&up->kobj);
|
|
- }
|
|
+ kobject_uevent(&up->kobj, KOBJ_REMOVE);
|
|
+ kobject_del(&up->kobj);
|
|
+ kobject_put(&up->kobj);
|
|
|
|
sched_destroy_user(up);
|
|
key_put(up->uid_keyring);
|
|
@@ -335,7 +334,8 @@
|
|
atomic_inc(&up->__count);
|
|
spin_unlock_irqrestore(&uidhash_lock, flags);
|
|
|
|
- INIT_WORK(&up->work, cleanup_user_struct);
|
|
+ put_user_ns(up->user_ns);
|
|
+ INIT_WORK(&up->work, remove_user_sysfs_dir);
|
|
schedule_work(&up->work);
|
|
}
|
|
|
|
@@ -357,29 +357,12 @@
|
|
sched_destroy_user(up);
|
|
key_put(up->uid_keyring);
|
|
key_put(up->session_keyring);
|
|
+ put_user_ns(up->user_ns);
|
|
kmem_cache_free(uid_cachep, up);
|
|
}
|
|
|
|
#endif
|
|
|
|
-#if defined(CONFIG_RT_GROUP_SCHED) && defined(CONFIG_USER_SCHED)
|
|
-/*
|
|
- * We need to check if a setuid can take place. This function should be called
|
|
- * before successfully completing the setuid.
|
|
- */
|
|
-int task_can_switch_user(struct user_struct *up, struct task_struct *tsk)
|
|
-{
|
|
-
|
|
- return sched_rt_can_attach(up->tg, tsk);
|
|
-
|
|
-}
|
|
-#else
|
|
-int task_can_switch_user(struct user_struct *up, struct task_struct *tsk)
|
|
-{
|
|
- return 1;
|
|
-}
|
|
-#endif
|
|
-
|
|
/*
|
|
* Locate the user_struct for the passed UID. If found, take a ref on it. The
|
|
* caller must undo that ref with free_uid().
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/user_namespace.c linux-2.6.29-rc3.owrt/kernel/user_namespace.c
|
|
--- linux-2.6.29.owrt/kernel/user_namespace.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/user_namespace.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -60,25 +60,12 @@
|
|
return 0;
|
|
}
|
|
|
|
-/*
|
|
- * Deferred destructor for a user namespace. This is required because
|
|
- * free_user_ns() may be called with uidhash_lock held, but we need to call
|
|
- * back to free_uid() which will want to take the lock again.
|
|
- */
|
|
-static void free_user_ns_work(struct work_struct *work)
|
|
-{
|
|
- struct user_namespace *ns =
|
|
- container_of(work, struct user_namespace, destroyer);
|
|
- free_uid(ns->creator);
|
|
- kfree(ns);
|
|
-}
|
|
-
|
|
void free_user_ns(struct kref *kref)
|
|
{
|
|
- struct user_namespace *ns =
|
|
- container_of(kref, struct user_namespace, kref);
|
|
+ struct user_namespace *ns;
|
|
|
|
- INIT_WORK(&ns->destroyer, free_user_ns_work);
|
|
- schedule_work(&ns->destroyer);
|
|
+ ns = container_of(kref, struct user_namespace, kref);
|
|
+ free_uid(ns->creator);
|
|
+ kfree(ns);
|
|
}
|
|
EXPORT_SYMBOL(free_user_ns);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/kernel/wait.c linux-2.6.29-rc3.owrt/kernel/wait.c
|
|
--- linux-2.6.29.owrt/kernel/wait.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/kernel/wait.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -91,15 +91,6 @@
|
|
}
|
|
EXPORT_SYMBOL(prepare_to_wait_exclusive);
|
|
|
|
-/*
|
|
- * finish_wait - clean up after waiting in a queue
|
|
- * @q: waitqueue waited on
|
|
- * @wait: wait descriptor
|
|
- *
|
|
- * Sets current thread back to running state and removes
|
|
- * the wait descriptor from the given waitqueue if still
|
|
- * queued.
|
|
- */
|
|
void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
|
|
{
|
|
unsigned long flags;
|
|
@@ -126,39 +117,6 @@
|
|
}
|
|
EXPORT_SYMBOL(finish_wait);
|
|
|
|
-/*
|
|
- * abort_exclusive_wait - abort exclusive waiting in a queue
|
|
- * @q: waitqueue waited on
|
|
- * @wait: wait descriptor
|
|
- * @state: runstate of the waiter to be woken
|
|
- * @key: key to identify a wait bit queue or %NULL
|
|
- *
|
|
- * Sets current thread back to running state and removes
|
|
- * the wait descriptor from the given waitqueue if still
|
|
- * queued.
|
|
- *
|
|
- * Wakes up the next waiter if the caller is concurrently
|
|
- * woken up through the queue.
|
|
- *
|
|
- * This prevents waiter starvation where an exclusive waiter
|
|
- * aborts and is woken up concurrently and noone wakes up
|
|
- * the next waiter.
|
|
- */
|
|
-void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
|
|
- unsigned int mode, void *key)
|
|
-{
|
|
- unsigned long flags;
|
|
-
|
|
- __set_current_state(TASK_RUNNING);
|
|
- spin_lock_irqsave(&q->lock, flags);
|
|
- if (!list_empty(&wait->task_list))
|
|
- list_del_init(&wait->task_list);
|
|
- else if (waitqueue_active(q))
|
|
- __wake_up_common(q, mode, 1, 0, key);
|
|
- spin_unlock_irqrestore(&q->lock, flags);
|
|
-}
|
|
-EXPORT_SYMBOL(abort_exclusive_wait);
|
|
-
|
|
int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key)
|
|
{
|
|
int ret = default_wake_function(wait, mode, sync, key);
|
|
@@ -219,20 +177,17 @@
|
|
__wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,
|
|
int (*action)(void *), unsigned mode)
|
|
{
|
|
- do {
|
|
- int ret;
|
|
+ int ret = 0;
|
|
|
|
+ do {
|
|
prepare_to_wait_exclusive(wq, &q->wait, mode);
|
|
- if (!test_bit(q->key.bit_nr, q->key.flags))
|
|
- continue;
|
|
- ret = action(q->key.flags);
|
|
- if (!ret)
|
|
- continue;
|
|
- abort_exclusive_wait(wq, &q->wait, mode, &q->key);
|
|
- return ret;
|
|
+ if (test_bit(q->key.bit_nr, q->key.flags)) {
|
|
+ if ((ret = (*action)(q->key.flags)))
|
|
+ break;
|
|
+ }
|
|
} while (test_and_set_bit(q->key.bit_nr, q->key.flags));
|
|
finish_wait(wq, &q->wait);
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL(__wait_on_bit_lock);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/lib/bitmap.c linux-2.6.29-rc3.owrt/lib/bitmap.c
|
|
--- linux-2.6.29.owrt/lib/bitmap.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/lib/bitmap.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -948,15 +948,15 @@
|
|
*/
|
|
int bitmap_find_free_region(unsigned long *bitmap, int bits, int order)
|
|
{
|
|
- int pos, end; /* scans bitmap by regions of size order */
|
|
+ int pos; /* scans bitmap by regions of size order */
|
|
|
|
- for (pos = 0 ; (end = pos + (1 << order)) <= bits; pos = end) {
|
|
- if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
|
|
- continue;
|
|
- __reg_op(bitmap, pos, order, REG_OP_ALLOC);
|
|
- return pos;
|
|
- }
|
|
- return -ENOMEM;
|
|
+ for (pos = 0; pos < bits; pos += (1 << order))
|
|
+ if (__reg_op(bitmap, pos, order, REG_OP_ISFREE))
|
|
+ break;
|
|
+ if (pos == bits)
|
|
+ return -ENOMEM;
|
|
+ __reg_op(bitmap, pos, order, REG_OP_ALLOC);
|
|
+ return pos;
|
|
}
|
|
EXPORT_SYMBOL(bitmap_find_free_region);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/lib/idr.c linux-2.6.29-rc3.owrt/lib/idr.c
|
|
--- linux-2.6.29.owrt/lib/idr.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/lib/idr.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -449,7 +449,6 @@
|
|
|
|
n = idp->layers * IDR_BITS;
|
|
p = idp->top;
|
|
- rcu_assign_pointer(idp->top, NULL);
|
|
max = 1 << n;
|
|
|
|
id = 0;
|
|
@@ -468,6 +467,7 @@
|
|
p = *--paa;
|
|
}
|
|
}
|
|
+ rcu_assign_pointer(idp->top, NULL);
|
|
idp->layers = 0;
|
|
}
|
|
EXPORT_SYMBOL(idr_remove_all);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/lib/Kconfig.debug linux-2.6.29-rc3.owrt/lib/Kconfig.debug
|
|
--- linux-2.6.29.owrt/lib/Kconfig.debug 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/lib/Kconfig.debug 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -838,7 +838,7 @@
|
|
|
|
If unsure, say N.
|
|
|
|
-config BUILD_DOCSRC
|
|
+menuconfig BUILD_DOCSRC
|
|
bool "Build targets in Documentation/ tree"
|
|
depends on HEADERS_CHECK
|
|
help
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/lib/smp_processor_id.c linux-2.6.29-rc3.owrt/lib/smp_processor_id.c
|
|
--- linux-2.6.29.owrt/lib/smp_processor_id.c 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/lib/smp_processor_id.c 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -22,7 +22,7 @@
|
|
* Kernel threads bound to a single CPU can safely use
|
|
* smp_processor_id():
|
|
*/
|
|
- if (cpumask_equal(¤t->cpus_allowed, cpumask_of(this_cpu)))
|
|
+ if (cpus_equal(current->cpus_allowed, cpumask_of_cpu(this_cpu)))
|
|
goto out;
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/.mailmap linux-2.6.29-rc3.owrt/.mailmap
|
|
--- linux-2.6.29.owrt/.mailmap 2009-05-10 22:04:41.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/.mailmap 2009-05-10 23:48:29.000000000 +0200
|
|
@@ -92,7 +92,6 @@
|
|
Rui Saraiva <rmps@joel.ist.utl.pt>
|
|
Sachin P Sant <ssant@in.ibm.com>
|
|
Sam Ravnborg <sam@mars.ravnborg.org>
|
|
-Sascha Hauer <s.hauer@pengutronix.de>
|
|
S.Çağlar Onur <caglar@pardus.org.tr>
|
|
Simon Kelley <simon@thekelleys.org.uk>
|
|
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
|
@@ -101,7 +100,6 @@
|
|
Thomas Graf <tgraf@suug.ch>
|
|
Tony Luck <tony.luck@intel.com>
|
|
Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
|
|
-Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
|
|
-Uwe Kleine-König <ukl@pengutronix.de>
|
|
Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
|
|
+Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
|
|
Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/MAINTAINERS linux-2.6.29-rc3.owrt/MAINTAINERS
|
|
--- linux-2.6.29.owrt/MAINTAINERS 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/MAINTAINERS 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -692,13 +692,6 @@
|
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
|
S: Maintained
|
|
|
|
-ARM/NUVOTON W90X900 ARM ARCHITECTURE
|
|
-P: Wan ZongShun
|
|
-M: mcuos.com@gmail.com
|
|
-L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
|
-W: http://www.mcuos.com
|
|
-S: Maintained
|
|
-
|
|
ARPD SUPPORT
|
|
P: Jonathan Layes
|
|
L: netdev@vger.kernel.org
|
|
@@ -918,7 +911,7 @@
|
|
BLACKFIN ARCHITECTURE
|
|
P: Bryan Wu
|
|
M: cooloney@kernel.org
|
|
-L: uclinux-dist-devel@blackfin.uclinux.org
|
|
+L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
|
|
W: http://blackfin.uclinux.org
|
|
S: Supported
|
|
|
|
@@ -1028,14 +1021,6 @@
|
|
W: http://bu3sch.de/btgpio.php
|
|
S: Maintained
|
|
|
|
-BTRFS FILE SYSTEM
|
|
-P: Chris Mason
|
|
-M: chris.mason@oracle.com
|
|
-L: linux-btrfs@vger.kernel.org
|
|
-W: http://btrfs.wiki.kernel.org/
|
|
-T: git kernel.org:/pub/scm/linux/kernel/git/mason/btrfs-unstable.git
|
|
-S: Maintained
|
|
-
|
|
BTTV VIDEO4LINUX DRIVER
|
|
P: Mauro Carvalho Chehab
|
|
M: mchehab@infradead.org
|
|
@@ -1209,8 +1194,6 @@
|
|
CONTROL GROUPS (CGROUPS)
|
|
P: Paul Menage
|
|
M: menage@google.com
|
|
-P: Li Zefan
|
|
-M: lizf@cn.fujitsu.com
|
|
L: containers@lists.linux-foundation.org
|
|
S: Maintained
|
|
|
|
@@ -1469,6 +1452,8 @@
|
|
S: Supported
|
|
|
|
DOCUMENTATION (/Documentation directory)
|
|
+P: Michael Kerrisk
|
|
+M: mtk.manpages@gmail.com
|
|
P: Randy Dunlap
|
|
M: rdunlap@xenotime.net
|
|
L: linux-doc@vger.kernel.org
|
|
@@ -1910,10 +1895,10 @@
|
|
S: Maintained
|
|
|
|
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
|
|
-P: Frank Seidel
|
|
-M: frank@f-seidel.de
|
|
-L: lm-sensors@lm-sensors.org
|
|
-W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/
|
|
+P: Robert Love
|
|
+M: rlove@rlove.org
|
|
+M: linux-kernel@vger.kernel.org
|
|
+W: http://www.kernel.org/pub/linux/kernel/people/rml/hdaps/
|
|
S: Maintained
|
|
|
|
GSPCA FINEPIX SUBDRIVER
|
|
@@ -2011,7 +1996,7 @@
|
|
|
|
HIBERNATION (aka Software Suspend, aka swsusp)
|
|
P: Pavel Machek
|
|
-M: pavel@ucw.cz
|
|
+M: pavel@suse.cz
|
|
P: Rafael J. Wysocki
|
|
M: rjw@sisk.pl
|
|
L: linux-pm@lists.linux-foundation.org
|
|
@@ -2232,7 +2217,7 @@
|
|
M: sean.hefty@intel.com
|
|
P: Hal Rosenstock
|
|
M: hal.rosenstock@gmail.com
|
|
-L: general@lists.openfabrics.org (moderated for non-subscribers)
|
|
+L: general@lists.openfabrics.org
|
|
W: http://www.openib.org/
|
|
T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
|
|
S: Supported
|
|
@@ -2467,7 +2452,7 @@
|
|
|
|
ISDN SUBSYSTEM
|
|
P: Karsten Keil
|
|
-M: isdn@linux-pingi.de
|
|
+M: kkeil@suse.de
|
|
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
|
|
W: http://www.isdn4linux.de
|
|
T: git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git
|
|
@@ -2856,6 +2841,8 @@
|
|
MAC80211
|
|
P: Johannes Berg
|
|
M: johannes@sipsolutions.net
|
|
+P: Michael Wu
|
|
+M: flamingice@sourmilk.net
|
|
L: linux-wireless@vger.kernel.org
|
|
W: http://linuxwireless.org/
|
|
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
|
@@ -2882,7 +2869,7 @@
|
|
M: mtk.manpages@gmail.com
|
|
W: http://www.kernel.org/doc/man-pages
|
|
L: linux-man@vger.kernel.org
|
|
-S: Maintained
|
|
+S: Supported
|
|
|
|
MARVELL LIBERTAS WIRELESS DRIVER
|
|
P: Dan Williams
|
|
@@ -3337,8 +3324,8 @@
|
|
M: jeremy@xensource.com
|
|
P: Chris Wright
|
|
M: chrisw@sous-sol.org
|
|
-P: Alok Kataria
|
|
-M: akataria@vmware.com
|
|
+P: Zachary Amsden
|
|
+M: zach@vmware.com
|
|
P: Rusty Russell
|
|
M: rusty@rustcorp.com.au
|
|
L: virtualization@lists.osdl.org
|
|
@@ -3355,8 +3342,10 @@
|
|
PARISC ARCHITECTURE
|
|
P: Kyle McMartin
|
|
M: kyle@mcmartin.ca
|
|
-P: Helge Deller
|
|
-M: deller@gmx.de
|
|
+P: Matthew Wilcox
|
|
+M: matthew@wil.cx
|
|
+P: Grant Grundler
|
|
+M: grundler@parisc-linux.org
|
|
L: linux-parisc@vger.kernel.org
|
|
W: http://www.parisc-linux.org/
|
|
T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
|
|
@@ -3547,12 +3536,6 @@
|
|
PXA MMCI DRIVER
|
|
S: Orphan
|
|
|
|
-PXA RTC DRIVER
|
|
-P: Robert Jarzmik
|
|
-M: robert.jarzmik@free.fr
|
|
-L: rtc-linux@googlegroups.com
|
|
-S: Maintained
|
|
-
|
|
QLOGIC QLA2XXX FC-SCSI DRIVER
|
|
P: Andrew Vasquez
|
|
M: linux-driver@qlogic.com
|
|
@@ -3881,15 +3864,6 @@
|
|
T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
|
|
S: Supported
|
|
|
|
-SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
|
|
-P: Sathya Perla
|
|
-M: sathyap@serverengines.com
|
|
-P: Subbu Seetharaman
|
|
-M: subbus@serverengines.com
|
|
-L: netdev@vger.kernel.org
|
|
-W: http://www.serverengines.com
|
|
-S: Supported
|
|
-
|
|
SFC NETWORK DRIVER
|
|
P: Steve Hodgson
|
|
P: Ben Hutchings
|
|
@@ -4189,7 +4163,7 @@
|
|
P: Len Brown
|
|
M: len.brown@intel.com
|
|
P: Pavel Machek
|
|
-M: pavel@ucw.cz
|
|
+M: pavel@suse.cz
|
|
P: Rafael J. Wysocki
|
|
M: rjw@sisk.pl
|
|
L: linux-pm@lists.linux-foundation.org
|
|
@@ -4310,8 +4284,8 @@
|
|
M: srajiv@linux.vnet.ibm.com
|
|
W: http://tpmdd.sourceforge.net
|
|
P: Marcel Selhorst
|
|
-M: m.selhorst@sirrix.com
|
|
-W: http://www.sirrix.com
|
|
+M: tpm@selhorst.net
|
|
+W: http://www.prosec.rub.de/tpm/
|
|
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
|
|
S: Maintained
|
|
|
|
@@ -4874,7 +4848,6 @@
|
|
M: mingo@redhat.com
|
|
P: H. Peter Anvin
|
|
M: hpa@zytor.com
|
|
-M: x86@kernel.org
|
|
L: linux-kernel@vger.kernel.org
|
|
T: git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
|
S: Maintained
|
|
@@ -4941,11 +4914,11 @@
|
|
S: Maintained
|
|
|
|
ZR36067 VIDEO FOR LINUX DRIVER
|
|
+P: Ronald Bultje
|
|
+M: rbultje@ronald.bitfreak.net
|
|
L: mjpeg-users@lists.sourceforge.net
|
|
-L: linux-media@vger.kernel.org
|
|
W: http://mjpeg.sourceforge.net/driver-zoran/
|
|
-T: Mercurial http://linuxtv.org/hg/v4l-dvb
|
|
-S: Odd Fixes
|
|
+S: Maintained
|
|
|
|
ZS DECSTATION Z85C30 SERIAL DRIVER
|
|
P: Maciej W. Rozycki
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/Makefile linux-2.6.29-rc3.owrt/Makefile
|
|
--- linux-2.6.29.owrt/Makefile 2009-05-11 01:33:47.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/Makefile 2009-05-11 01:34:47.000000000 +0200
|
|
@@ -2,7 +2,7 @@
|
|
PATCHLEVEL = 6
|
|
SUBLEVEL = 29
|
|
EXTRAVERSION =
|
|
-NAME = Temporary Tasmanian Devil
|
|
+NAME = Erotic Pickled Herring
|
|
|
|
# *DOCUMENTATION*
|
|
# To see a list of typical targets execute "make help"
|
|
@@ -389,7 +389,6 @@
|
|
# output directory.
|
|
outputmakefile:
|
|
ifneq ($(KBUILD_SRC),)
|
|
- $(Q)ln -fsn $(srctree) source
|
|
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
|
|
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
|
|
endif
|
|
@@ -569,12 +568,6 @@
|
|
# disable pointer signed / unsigned warnings in gcc 4.0
|
|
KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
|
|
|
-# disable invalid "can't wrap" optimzations for signed / pointers
|
|
-KBUILD_CFLAGS += $(call cc-option,-fwrapv)
|
|
-
|
|
-# revert to pre-gcc-4.4 behaviour of .eh_frame
|
|
-KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
|
-
|
|
# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
|
|
# But warn user when we do so
|
|
warn-assign = \
|
|
@@ -913,18 +906,12 @@
|
|
# and if the SCM is know a tag from the SCM is appended.
|
|
# The appended tag is determined by the SCM used.
|
|
#
|
|
-# .scmversion is used when generating rpm packages so we do not loose
|
|
-# the version information from the SCM when we do the build of the kernel
|
|
-# from the copied source
|
|
+# Currently, only git is supported.
|
|
+# Other SCMs can edit scripts/setlocalversion and add the appropriate
|
|
+# checks as needed.
|
|
ifdef CONFIG_LOCALVERSION_AUTO
|
|
-
|
|
-ifeq ($(wildcard .scmversion),)
|
|
- _localver-auto = $(shell $(CONFIG_SHELL) \
|
|
- $(srctree)/scripts/setlocalversion $(srctree))
|
|
-else
|
|
- _localver-auto = $(shell cat .scmversion 2> /dev/null)
|
|
-endif
|
|
-
|
|
+ _localver-auto = $(shell $(CONFIG_SHELL) \
|
|
+ $(srctree)/scripts/setlocalversion $(srctree))
|
|
localver-auto = $(LOCALVERSION)$(_localver-auto)
|
|
endif
|
|
|
|
@@ -962,6 +949,7 @@
|
|
mkdir -p include2; \
|
|
ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
|
|
fi
|
|
+ ln -fsn $(srctree) source
|
|
endif
|
|
|
|
# prepare2 creates a makefile if using a separate output directory
|
|
@@ -1552,7 +1540,7 @@
|
|
cmd_depmod = \
|
|
if [ -r System.map -a -x $(DEPMOD) ]; then \
|
|
$(DEPMOD) -ae -F System.map \
|
|
- $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) ) \
|
|
+ $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) -r) \
|
|
$(KERNELRELEASE); \
|
|
fi
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/fremap.c linux-2.6.29-rc3.owrt/mm/fremap.c
|
|
--- linux-2.6.29.owrt/mm/fremap.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/fremap.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -198,7 +198,7 @@
|
|
flags &= MAP_NONBLOCK;
|
|
get_file(file);
|
|
addr = mmap_region(file, start, size,
|
|
- flags, vma->vm_flags, pgoff);
|
|
+ flags, vma->vm_flags, pgoff, 1);
|
|
fput(file);
|
|
if (IS_ERR_VALUE(addr)) {
|
|
err = addr;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/hugetlb.c linux-2.6.29-rc3.owrt/mm/hugetlb.c
|
|
--- linux-2.6.29.owrt/mm/hugetlb.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/hugetlb.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -2269,18 +2269,12 @@
|
|
|
|
int hugetlb_reserve_pages(struct inode *inode,
|
|
long from, long to,
|
|
- struct vm_area_struct *vma,
|
|
- int acctflag)
|
|
+ struct vm_area_struct *vma)
|
|
{
|
|
long ret, chg;
|
|
struct hstate *h = hstate_inode(inode);
|
|
|
|
- /*
|
|
- * Only apply hugepage reservation if asked. At fault time, an
|
|
- * attempt will be made for VM_NORESERVE to allocate a page
|
|
- * and filesystem quota without using reserves
|
|
- */
|
|
- if (acctflag & VM_NORESERVE)
|
|
+ if (vma && vma->vm_flags & VM_NORESERVE)
|
|
return 0;
|
|
|
|
/*
|
|
@@ -2305,31 +2299,13 @@
|
|
if (chg < 0)
|
|
return chg;
|
|
|
|
- /* There must be enough filesystem quota for the mapping */
|
|
if (hugetlb_get_quota(inode->i_mapping, chg))
|
|
return -ENOSPC;
|
|
-
|
|
- /*
|
|
- * Check enough hugepages are available for the reservation.
|
|
- * Hand back the quota if there are not
|
|
- */
|
|
ret = hugetlb_acct_memory(h, chg);
|
|
if (ret < 0) {
|
|
hugetlb_put_quota(inode->i_mapping, chg);
|
|
return ret;
|
|
}
|
|
-
|
|
- /*
|
|
- * Account for the reservations made. Shared mappings record regions
|
|
- * that have reservations as they are shared by multiple VMAs.
|
|
- * When the last VMA disappears, the region map says how much
|
|
- * the reservation was and the page cache tells how much of
|
|
- * the reservation was consumed. Private mappings are per-VMA and
|
|
- * only the consumed reservations are tracked. When the VMA
|
|
- * disappears, the original reservation is the VMA size and the
|
|
- * consumed reservations are stored in the map. Hence, nothing
|
|
- * else has to be done for private mappings here
|
|
- */
|
|
if (!vma || vma->vm_flags & VM_SHARED)
|
|
region_add(&inode->i_mapping->private_list, from, to);
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/memcontrol.c linux-2.6.29-rc3.owrt/mm/memcontrol.c
|
|
--- linux-2.6.29.owrt/mm/memcontrol.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/memcontrol.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -202,7 +202,6 @@
|
|
|
|
static void mem_cgroup_get(struct mem_cgroup *mem);
|
|
static void mem_cgroup_put(struct mem_cgroup *mem);
|
|
-static struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *mem);
|
|
|
|
static void mem_cgroup_charge_statistics(struct mem_cgroup *mem,
|
|
struct page_cgroup *pc,
|
|
@@ -1685,7 +1684,7 @@
|
|
/* This is for making all *used* pages to be on LRU. */
|
|
lru_add_drain_all();
|
|
ret = 0;
|
|
- for_each_node_state(node, N_HIGH_MEMORY) {
|
|
+ for_each_node_state(node, N_POSSIBLE) {
|
|
for (zid = 0; !ret && zid < MAX_NR_ZONES; zid++) {
|
|
enum lru_list l;
|
|
for_each_lru(l) {
|
|
@@ -2194,23 +2193,10 @@
|
|
|
|
static void mem_cgroup_put(struct mem_cgroup *mem)
|
|
{
|
|
- if (atomic_dec_and_test(&mem->refcnt)) {
|
|
- struct mem_cgroup *parent = parent_mem_cgroup(mem);
|
|
+ if (atomic_dec_and_test(&mem->refcnt))
|
|
__mem_cgroup_free(mem);
|
|
- if (parent)
|
|
- mem_cgroup_put(parent);
|
|
- }
|
|
}
|
|
|
|
-/*
|
|
- * Returns the parent mem_cgroup in memcgroup hierarchy with hierarchy enabled.
|
|
- */
|
|
-static struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *mem)
|
|
-{
|
|
- if (!mem->res.parent)
|
|
- return NULL;
|
|
- return mem_cgroup_from_res_counter(mem->res.parent, res);
|
|
-}
|
|
|
|
#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
|
|
static void __init enable_swap_cgroup(void)
|
|
@@ -2249,13 +2235,6 @@
|
|
if (parent && parent->use_hierarchy) {
|
|
res_counter_init(&mem->res, &parent->res);
|
|
res_counter_init(&mem->memsw, &parent->memsw);
|
|
- /*
|
|
- * We increment refcnt of the parent to ensure that we can
|
|
- * safely access it on res_counter_charge/uncharge.
|
|
- * This refcnt will be decremented when freeing this
|
|
- * mem_cgroup(see mem_cgroup_put).
|
|
- */
|
|
- mem_cgroup_get(parent);
|
|
} else {
|
|
res_counter_init(&mem->res, NULL);
|
|
res_counter_init(&mem->memsw, NULL);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/memory.c linux-2.6.29-rc3.owrt/mm/memory.c
|
|
--- linux-2.6.29.owrt/mm/memory.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/memory.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -2000,7 +2000,7 @@
|
|
* Don't let another task, with possibly unlocked vma,
|
|
* keep the mlocked page.
|
|
*/
|
|
- if ((vma->vm_flags & VM_LOCKED) && old_page) {
|
|
+ if (vma->vm_flags & VM_LOCKED) {
|
|
lock_page(old_page); /* for LRU manipulation */
|
|
clear_page_mlock(old_page);
|
|
unlock_page(old_page);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/migrate.c linux-2.6.29-rc3.owrt/mm/migrate.c
|
|
--- linux-2.6.29.owrt/mm/migrate.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/migrate.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1129,7 +1129,7 @@
|
|
struct vm_area_struct *vma;
|
|
int err = 0;
|
|
|
|
- for (vma = mm->mmap; vma && !err; vma = vma->vm_next) {
|
|
+ for(vma = mm->mmap; vma->vm_next && !err; vma = vma->vm_next) {
|
|
if (vma->vm_ops && vma->vm_ops->migrate) {
|
|
err = vma->vm_ops->migrate(vma, to, from, flags);
|
|
if (err)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/mlock.c linux-2.6.29-rc3.owrt/mm/mlock.c
|
|
--- linux-2.6.29.owrt/mm/mlock.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/mlock.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -294,10 +294,14 @@
|
|
*
|
|
* return number of pages [> 0] to be removed from locked_vm on success
|
|
* of "special" vmas.
|
|
+ *
|
|
+ * return negative error if vma spanning @start-@range disappears while
|
|
+ * mmap semaphore is dropped. Unlikely?
|
|
*/
|
|
long mlock_vma_pages_range(struct vm_area_struct *vma,
|
|
unsigned long start, unsigned long end)
|
|
{
|
|
+ struct mm_struct *mm = vma->vm_mm;
|
|
int nr_pages = (end - start) / PAGE_SIZE;
|
|
BUG_ON(!(vma->vm_flags & VM_LOCKED));
|
|
|
|
@@ -310,11 +314,20 @@
|
|
if (!((vma->vm_flags & (VM_DONTEXPAND | VM_RESERVED)) ||
|
|
is_vm_hugetlb_page(vma) ||
|
|
vma == get_gate_vma(current))) {
|
|
+ long error;
|
|
+ downgrade_write(&mm->mmap_sem);
|
|
|
|
- __mlock_vma_pages_range(vma, start, end, 1);
|
|
+ error = __mlock_vma_pages_range(vma, start, end, 1);
|
|
|
|
- /* Hide errors from mmap() and other callers */
|
|
- return 0;
|
|
+ up_read(&mm->mmap_sem);
|
|
+ /* vma can change or disappear */
|
|
+ down_write(&mm->mmap_sem);
|
|
+ vma = find_vma(mm, start);
|
|
+ /* non-NULL vma must contain @start, but need to check @end */
|
|
+ if (!vma || end > vma->vm_end)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ return 0; /* hide other errors from mmap(), et al */
|
|
}
|
|
|
|
/*
|
|
@@ -425,14 +438,41 @@
|
|
vma->vm_flags = newflags;
|
|
|
|
if (lock) {
|
|
+ /*
|
|
+ * mmap_sem is currently held for write. Downgrade the write
|
|
+ * lock to a read lock so that other faults, mmap scans, ...
|
|
+ * while we fault in all pages.
|
|
+ */
|
|
+ downgrade_write(&mm->mmap_sem);
|
|
+
|
|
ret = __mlock_vma_pages_range(vma, start, end, 1);
|
|
|
|
- if (ret > 0) {
|
|
+ /*
|
|
+ * Need to reacquire mmap sem in write mode, as our callers
|
|
+ * expect this. We have no support for atomically upgrading
|
|
+ * a sem to write, so we need to check for ranges while sem
|
|
+ * is unlocked.
|
|
+ */
|
|
+ up_read(&mm->mmap_sem);
|
|
+ /* vma can change or disappear */
|
|
+ down_write(&mm->mmap_sem);
|
|
+ *prev = find_vma(mm, start);
|
|
+ /* non-NULL *prev must contain @start, but need to check @end */
|
|
+ if (!(*prev) || end > (*prev)->vm_end)
|
|
+ ret = -ENOMEM;
|
|
+ else if (ret > 0) {
|
|
mm->locked_vm -= ret;
|
|
ret = 0;
|
|
} else
|
|
ret = __mlock_posix_error_return(ret); /* translate if needed */
|
|
} else {
|
|
+ /*
|
|
+ * TODO: for unlocking, pages will already be resident, so
|
|
+ * we don't need to wait for allocations/reclaim/pagein, ...
|
|
+ * However, unlocking a very large region can still take a
|
|
+ * while. Should we downgrade the semaphore for both lock
|
|
+ * AND unlock ?
|
|
+ */
|
|
__mlock_vma_pages_range(vma, start, end, 0);
|
|
}
|
|
|
|
@@ -660,7 +700,7 @@
|
|
return buffer;
|
|
}
|
|
|
|
-void release_locked_buffer(void *buffer, size_t size)
|
|
+void free_locked_buffer(void *buffer, size_t size)
|
|
{
|
|
unsigned long pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
|
|
|
@@ -670,11 +710,6 @@
|
|
current->mm->locked_vm -= pgsz;
|
|
|
|
up_write(¤t->mm->mmap_sem);
|
|
-}
|
|
-
|
|
-void free_locked_buffer(void *buffer, size_t size)
|
|
-{
|
|
- release_locked_buffer(buffer, size);
|
|
|
|
kfree(buffer);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/mmap.c linux-2.6.29-rc3.owrt/mm/mmap.c
|
|
--- linux-2.6.29.owrt/mm/mmap.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/mmap.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -658,9 +658,6 @@
|
|
validate_mm(mm);
|
|
}
|
|
|
|
-/* Flags that can be inherited from an existing mapping when merging */
|
|
-#define VM_MERGEABLE_FLAGS (VM_CAN_NONLINEAR)
|
|
-
|
|
/*
|
|
* If the vma has a ->close operation then the driver probably needs to release
|
|
* per-vma resources, so we don't attempt to merge those.
|
|
@@ -668,7 +665,7 @@
|
|
static inline int is_mergeable_vma(struct vm_area_struct *vma,
|
|
struct file *file, unsigned long vm_flags)
|
|
{
|
|
- if ((vma->vm_flags ^ vm_flags) & ~VM_MERGEABLE_FLAGS)
|
|
+ if (vma->vm_flags != vm_flags)
|
|
return 0;
|
|
if (vma->vm_file != file)
|
|
return 0;
|
|
@@ -918,6 +915,7 @@
|
|
struct inode *inode;
|
|
unsigned int vm_flags;
|
|
int error;
|
|
+ int accountable = 1;
|
|
unsigned long reqprot = prot;
|
|
|
|
/*
|
|
@@ -1018,6 +1016,8 @@
|
|
return -EPERM;
|
|
vm_flags &= ~VM_MAYEXEC;
|
|
}
|
|
+ if (is_file_hugepages(file))
|
|
+ accountable = 0;
|
|
|
|
if (!file->f_op || !file->f_op->mmap)
|
|
return -ENODEV;
|
|
@@ -1050,7 +1050,8 @@
|
|
if (error)
|
|
return error;
|
|
|
|
- return mmap_region(file, addr, len, flags, vm_flags, pgoff);
|
|
+ return mmap_region(file, addr, len, flags, vm_flags, pgoff,
|
|
+ accountable);
|
|
}
|
|
EXPORT_SYMBOL(do_mmap_pgoff);
|
|
|
|
@@ -1086,25 +1087,10 @@
|
|
mapping_cap_account_dirty(vma->vm_file->f_mapping);
|
|
}
|
|
|
|
-/*
|
|
- * We account for memory if it's a private writeable mapping,
|
|
- * not hugepages and VM_NORESERVE wasn't set.
|
|
- */
|
|
-static inline int accountable_mapping(struct file *file, unsigned int vm_flags)
|
|
-{
|
|
- /*
|
|
- * hugetlb has its own accounting separate from the core VM
|
|
- * VM_HUGETLB may not be set yet so we cannot check for that flag.
|
|
- */
|
|
- if (file && is_file_hugepages(file))
|
|
- return 0;
|
|
-
|
|
- return (vm_flags & (VM_NORESERVE | VM_SHARED | VM_WRITE)) == VM_WRITE;
|
|
-}
|
|
-
|
|
unsigned long mmap_region(struct file *file, unsigned long addr,
|
|
unsigned long len, unsigned long flags,
|
|
- unsigned int vm_flags, unsigned long pgoff)
|
|
+ unsigned int vm_flags, unsigned long pgoff,
|
|
+ int accountable)
|
|
{
|
|
struct mm_struct *mm = current->mm;
|
|
struct vm_area_struct *vma, *prev;
|
|
@@ -1128,38 +1114,38 @@
|
|
if (!may_expand_vm(mm, len >> PAGE_SHIFT))
|
|
return -ENOMEM;
|
|
|
|
- /*
|
|
- * Set 'VM_NORESERVE' if we should not account for the
|
|
- * memory use of this mapping.
|
|
- */
|
|
- if ((flags & MAP_NORESERVE)) {
|
|
- /* We honor MAP_NORESERVE if allowed to overcommit */
|
|
- if (sysctl_overcommit_memory != OVERCOMMIT_NEVER)
|
|
- vm_flags |= VM_NORESERVE;
|
|
+ if (flags & MAP_NORESERVE)
|
|
+ vm_flags |= VM_NORESERVE;
|
|
|
|
- /* hugetlb applies strict overcommit unless MAP_NORESERVE */
|
|
- if (file && is_file_hugepages(file))
|
|
- vm_flags |= VM_NORESERVE;
|
|
+ if (accountable && (!(flags & MAP_NORESERVE) ||
|
|
+ sysctl_overcommit_memory == OVERCOMMIT_NEVER)) {
|
|
+ if (vm_flags & VM_SHARED) {
|
|
+ /* Check memory availability in shmem_file_setup? */
|
|
+ vm_flags |= VM_ACCOUNT;
|
|
+ } else if (vm_flags & VM_WRITE) {
|
|
+ /*
|
|
+ * Private writable mapping: check memory availability
|
|
+ */
|
|
+ charged = len >> PAGE_SHIFT;
|
|
+ if (security_vm_enough_memory(charged))
|
|
+ return -ENOMEM;
|
|
+ vm_flags |= VM_ACCOUNT;
|
|
+ }
|
|
}
|
|
|
|
/*
|
|
- * Private writable mapping: check memory availability
|
|
+ * Can we just expand an old private anonymous mapping?
|
|
+ * The VM_SHARED test is necessary because shmem_zero_setup
|
|
+ * will create the file object for a shared anonymous map below.
|
|
*/
|
|
- if (accountable_mapping(file, vm_flags)) {
|
|
- charged = len >> PAGE_SHIFT;
|
|
- if (security_vm_enough_memory(charged))
|
|
- return -ENOMEM;
|
|
- vm_flags |= VM_ACCOUNT;
|
|
+ if (!file && !(vm_flags & VM_SHARED)) {
|
|
+ vma = vma_merge(mm, prev, addr, addr + len, vm_flags,
|
|
+ NULL, NULL, pgoff, NULL);
|
|
+ if (vma)
|
|
+ goto out;
|
|
}
|
|
|
|
/*
|
|
- * Can we just expand an old mapping?
|
|
- */
|
|
- vma = vma_merge(mm, prev, addr, addr + len, vm_flags, NULL, file, pgoff, NULL);
|
|
- if (vma)
|
|
- goto out;
|
|
-
|
|
- /*
|
|
* Determine the object being mapped and call the appropriate
|
|
* specific mapper. the address has already been validated, but
|
|
* not unmapped, but the maps are removed from the list.
|
|
@@ -1200,6 +1186,14 @@
|
|
goto free_vma;
|
|
}
|
|
|
|
+ /* We set VM_ACCOUNT in a shared mapping's vm_flags, to inform
|
|
+ * shmem_zero_setup (perhaps called through /dev/zero's ->mmap)
|
|
+ * that memory reservation must be checked; but that reservation
|
|
+ * belongs to shared memory object, not to vma: so now clear it.
|
|
+ */
|
|
+ if ((vm_flags & (VM_SHARED|VM_ACCOUNT)) == (VM_SHARED|VM_ACCOUNT))
|
|
+ vma->vm_flags &= ~VM_ACCOUNT;
|
|
+
|
|
/* Can addr have changed??
|
|
*
|
|
* Answer: Yes, several device drivers can do it in their
|
|
@@ -1212,8 +1206,17 @@
|
|
if (vma_wants_writenotify(vma))
|
|
vma->vm_page_prot = vm_get_page_prot(vm_flags & ~VM_SHARED);
|
|
|
|
- vma_link(mm, vma, prev, rb_link, rb_parent);
|
|
- file = vma->vm_file;
|
|
+ if (file && vma_merge(mm, prev, addr, vma->vm_end,
|
|
+ vma->vm_flags, NULL, file, pgoff, vma_policy(vma))) {
|
|
+ mpol_put(vma_policy(vma));
|
|
+ kmem_cache_free(vm_area_cachep, vma);
|
|
+ fput(file);
|
|
+ if (vm_flags & VM_EXECUTABLE)
|
|
+ removed_exe_file_vma(mm);
|
|
+ } else {
|
|
+ vma_link(mm, vma, prev, rb_link, rb_parent);
|
|
+ file = vma->vm_file;
|
|
+ }
|
|
|
|
/* Once vma denies write, undo our temporary denial count */
|
|
if (correct_wcount)
|
|
@@ -2084,8 +2087,12 @@
|
|
unsigned long end;
|
|
|
|
/* mm's last user has gone, and its about to be pulled down */
|
|
+ arch_exit_mmap(mm);
|
|
mmu_notifier_release(mm);
|
|
|
|
+ if (!mm->mmap) /* Can happen if dup_mmap() received an OOM */
|
|
+ return;
|
|
+
|
|
if (mm->locked_vm) {
|
|
vma = mm->mmap;
|
|
while (vma) {
|
|
@@ -2094,13 +2101,7 @@
|
|
vma = vma->vm_next;
|
|
}
|
|
}
|
|
-
|
|
- arch_exit_mmap(mm);
|
|
-
|
|
vma = mm->mmap;
|
|
- if (!vma) /* Can happen if dup_mmap() received an OOM */
|
|
- return;
|
|
-
|
|
lru_add_drain();
|
|
flush_cache_mm(mm);
|
|
tlb = tlb_gather_mmu(mm, 1);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/mprotect.c linux-2.6.29-rc3.owrt/mm/mprotect.c
|
|
--- linux-2.6.29.owrt/mm/mprotect.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/mprotect.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -151,11 +151,10 @@
|
|
/*
|
|
* If we make a private mapping writable we increase our commit;
|
|
* but (without finer accounting) cannot reduce our commit if we
|
|
- * make it unwritable again. hugetlb mapping were accounted for
|
|
- * even if read-only so there is no need to account for them here
|
|
+ * make it unwritable again.
|
|
*/
|
|
if (newflags & VM_WRITE) {
|
|
- if (!(oldflags & (VM_ACCOUNT|VM_WRITE|VM_HUGETLB|
|
|
+ if (!(oldflags & (VM_ACCOUNT|VM_WRITE|
|
|
VM_SHARED|VM_NORESERVE))) {
|
|
charged = nrpages;
|
|
if (security_vm_enough_memory(charged))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/page_alloc.c linux-2.6.29-rc3.owrt/mm/page_alloc.c
|
|
--- linux-2.6.29.owrt/mm/page_alloc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/page_alloc.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -2989,7 +2989,7 @@
|
|
* was used and there are no special requirements, this is a convenient
|
|
* alternative
|
|
*/
|
|
-int __meminit __early_pfn_to_nid(unsigned long pfn)
|
|
+int __meminit early_pfn_to_nid(unsigned long pfn)
|
|
{
|
|
int i;
|
|
|
|
@@ -3000,33 +3000,10 @@
|
|
if (start_pfn <= pfn && pfn < end_pfn)
|
|
return early_node_map[i].nid;
|
|
}
|
|
- /* This is a memory hole */
|
|
- return -1;
|
|
-}
|
|
-#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
|
|
-
|
|
-int __meminit early_pfn_to_nid(unsigned long pfn)
|
|
-{
|
|
- int nid;
|
|
|
|
- nid = __early_pfn_to_nid(pfn);
|
|
- if (nid >= 0)
|
|
- return nid;
|
|
- /* just returns 0 */
|
|
return 0;
|
|
}
|
|
-
|
|
-#ifdef CONFIG_NODES_SPAN_OTHER_NODES
|
|
-bool __meminit early_pfn_in_nid(unsigned long pfn, int node)
|
|
-{
|
|
- int nid;
|
|
-
|
|
- nid = __early_pfn_to_nid(pfn);
|
|
- if (nid >= 0 && nid != node)
|
|
- return false;
|
|
- return true;
|
|
-}
|
|
-#endif
|
|
+#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
|
|
|
|
/* Basic iterator support to walk early_node_map[] */
|
|
#define for_each_active_range_index_in_nid(i, nid) \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/page_cgroup.c linux-2.6.29-rc3.owrt/mm/page_cgroup.c
|
|
--- linux-2.6.29.owrt/mm/page_cgroup.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/page_cgroup.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -114,8 +114,7 @@
|
|
nid = page_to_nid(pfn_to_page(pfn));
|
|
table_size = sizeof(struct page_cgroup) * PAGES_PER_SECTION;
|
|
if (slab_is_available()) {
|
|
- base = kmalloc_node(table_size,
|
|
- GFP_KERNEL | __GFP_NOWARN, nid);
|
|
+ base = kmalloc_node(table_size, GFP_KERNEL, nid);
|
|
if (!base)
|
|
base = vmalloc_node(table_size, nid);
|
|
} else {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/page_io.c linux-2.6.29-rc3.owrt/mm/page_io.c
|
|
--- linux-2.6.29.owrt/mm/page_io.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/page_io.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -111,7 +111,7 @@
|
|
goto out;
|
|
}
|
|
if (wbc->sync_mode == WB_SYNC_ALL)
|
|
- rw |= (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);
|
|
+ rw |= (1 << BIO_RW_SYNC);
|
|
count_vm_event(PSWPOUT);
|
|
set_page_writeback(page);
|
|
unlock_page(page);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/page-writeback.c linux-2.6.29-rc3.owrt/mm/page-writeback.c
|
|
--- linux-2.6.29.owrt/mm/page-writeback.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/page-writeback.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -209,7 +209,7 @@
|
|
struct file *filp, void __user *buffer, size_t *lenp,
|
|
loff_t *ppos)
|
|
{
|
|
- unsigned long old_bytes = vm_dirty_bytes;
|
|
+ int old_bytes = vm_dirty_bytes;
|
|
int ret;
|
|
|
|
ret = proc_doulongvec_minmax(table, write, filp, buffer, lenp, ppos);
|
|
@@ -240,7 +240,7 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(bdi_writeout_inc);
|
|
|
|
-void task_dirty_inc(struct task_struct *tsk)
|
|
+static inline void task_dirty_inc(struct task_struct *tsk)
|
|
{
|
|
prop_inc_single(&vm_dirties, &tsk->dirties);
|
|
}
|
|
@@ -1051,25 +1051,13 @@
|
|
}
|
|
}
|
|
|
|
- if (nr_to_write > 0) {
|
|
- nr_to_write--;
|
|
- if (nr_to_write == 0 &&
|
|
- wbc->sync_mode == WB_SYNC_NONE) {
|
|
- /*
|
|
- * We stop writing back only if we are
|
|
- * not doing integrity sync. In case of
|
|
- * integrity sync we have to keep going
|
|
- * because someone may be concurrently
|
|
- * dirtying pages, and we might have
|
|
- * synced a lot of newly appeared dirty
|
|
- * pages, but have not synced all of the
|
|
- * old dirty pages.
|
|
- */
|
|
+ if (wbc->sync_mode == WB_SYNC_NONE) {
|
|
+ wbc->nr_to_write--;
|
|
+ if (wbc->nr_to_write <= 0) {
|
|
done = 1;
|
|
break;
|
|
}
|
|
}
|
|
-
|
|
if (wbc->nonblocking && bdi_write_congested(bdi)) {
|
|
wbc->encountered_congestion = 1;
|
|
done = 1;
|
|
@@ -1079,7 +1067,7 @@
|
|
pagevec_release(&pvec);
|
|
cond_resched();
|
|
}
|
|
- if (!cycled && !done) {
|
|
+ if (!cycled) {
|
|
/*
|
|
* range_cyclic:
|
|
* We hit the last page and there is more work to be done: wrap
|
|
@@ -1230,7 +1218,6 @@
|
|
__inc_zone_page_state(page, NR_FILE_DIRTY);
|
|
__inc_bdi_stat(mapping->backing_dev_info,
|
|
BDI_RECLAIMABLE);
|
|
- task_dirty_inc(current);
|
|
task_io_account_write(PAGE_CACHE_SIZE);
|
|
}
|
|
radix_tree_tag_set(&mapping->page_tree,
|
|
@@ -1263,7 +1250,7 @@
|
|
* If the mapping doesn't provide a set_page_dirty a_op, then
|
|
* just fall through and assume that it wants buffer_heads.
|
|
*/
|
|
-int set_page_dirty(struct page *page)
|
|
+static int __set_page_dirty(struct page *page)
|
|
{
|
|
struct address_space *mapping = page_mapping(page);
|
|
|
|
@@ -1281,6 +1268,14 @@
|
|
}
|
|
return 0;
|
|
}
|
|
+
|
|
+int set_page_dirty(struct page *page)
|
|
+{
|
|
+ int ret = __set_page_dirty(page);
|
|
+ if (ret)
|
|
+ task_dirty_inc(current);
|
|
+ return ret;
|
|
+}
|
|
EXPORT_SYMBOL(set_page_dirty);
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/rmap.c linux-2.6.29-rc3.owrt/mm/rmap.c
|
|
--- linux-2.6.29.owrt/mm/rmap.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/rmap.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1072,8 +1072,7 @@
|
|
spin_lock(&mapping->i_mmap_lock);
|
|
vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) {
|
|
if (MLOCK_PAGES && unlikely(unlock)) {
|
|
- if (!((vma->vm_flags & VM_LOCKED) &&
|
|
- page_mapped_in_vma(page, vma)))
|
|
+ if (!(vma->vm_flags & VM_LOCKED))
|
|
continue; /* must visit all vmas */
|
|
ret = SWAP_MLOCK;
|
|
} else {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/shmem.c linux-2.6.29-rc3.owrt/mm/shmem.c
|
|
--- linux-2.6.29.owrt/mm/shmem.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/shmem.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -169,13 +169,13 @@
|
|
*/
|
|
static inline int shmem_acct_size(unsigned long flags, loff_t size)
|
|
{
|
|
- return (flags & VM_NORESERVE) ?
|
|
- 0 : security_vm_enough_memory_kern(VM_ACCT(size));
|
|
+ return (flags & VM_ACCOUNT) ?
|
|
+ security_vm_enough_memory_kern(VM_ACCT(size)) : 0;
|
|
}
|
|
|
|
static inline void shmem_unacct_size(unsigned long flags, loff_t size)
|
|
{
|
|
- if (!(flags & VM_NORESERVE))
|
|
+ if (flags & VM_ACCOUNT)
|
|
vm_unacct_memory(VM_ACCT(size));
|
|
}
|
|
|
|
@@ -187,13 +187,13 @@
|
|
*/
|
|
static inline int shmem_acct_block(unsigned long flags)
|
|
{
|
|
- return (flags & VM_NORESERVE) ?
|
|
- security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE)) : 0;
|
|
+ return (flags & VM_ACCOUNT) ?
|
|
+ 0 : security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE));
|
|
}
|
|
|
|
static inline void shmem_unacct_blocks(unsigned long flags, long pages)
|
|
{
|
|
- if (flags & VM_NORESERVE)
|
|
+ if (!(flags & VM_ACCOUNT))
|
|
vm_unacct_memory(pages * VM_ACCT(PAGE_CACHE_SIZE));
|
|
}
|
|
|
|
@@ -1515,8 +1515,8 @@
|
|
return 0;
|
|
}
|
|
|
|
-static struct inode *shmem_get_inode(struct super_block *sb, int mode,
|
|
- dev_t dev, unsigned long flags)
|
|
+static struct inode *
|
|
+shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
|
|
{
|
|
struct inode *inode;
|
|
struct shmem_inode_info *info;
|
|
@@ -1537,7 +1537,6 @@
|
|
info = SHMEM_I(inode);
|
|
memset(info, 0, (char *)inode - (char *)info);
|
|
spin_lock_init(&info->lock);
|
|
- info->flags = flags & VM_NORESERVE;
|
|
INIT_LIST_HEAD(&info->swaplist);
|
|
|
|
switch (mode & S_IFMT) {
|
|
@@ -1780,10 +1779,9 @@
|
|
static int
|
|
shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
|
|
{
|
|
- struct inode *inode;
|
|
+ struct inode *inode = shmem_get_inode(dir->i_sb, mode, dev);
|
|
int error = -ENOSPC;
|
|
|
|
- inode = shmem_get_inode(dir->i_sb, mode, dev, VM_NORESERVE);
|
|
if (inode) {
|
|
error = security_inode_init_security(inode, dir, NULL, NULL,
|
|
NULL);
|
|
@@ -1922,7 +1920,7 @@
|
|
if (len > PAGE_CACHE_SIZE)
|
|
return -ENAMETOOLONG;
|
|
|
|
- inode = shmem_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0, VM_NORESERVE);
|
|
+ inode = shmem_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0);
|
|
if (!inode)
|
|
return -ENOSPC;
|
|
|
|
@@ -2334,7 +2332,7 @@
|
|
sb->s_flags |= MS_POSIXACL;
|
|
#endif
|
|
|
|
- inode = shmem_get_inode(sb, S_IFDIR | sbinfo->mode, 0, VM_NORESERVE);
|
|
+ inode = shmem_get_inode(sb, S_IFDIR | sbinfo->mode, 0);
|
|
if (!inode)
|
|
goto failed;
|
|
inode->i_uid = sbinfo->uid;
|
|
@@ -2576,12 +2574,12 @@
|
|
return 0;
|
|
}
|
|
|
|
-#define shmem_vm_ops generic_file_vm_ops
|
|
-#define shmem_file_operations ramfs_file_operations
|
|
-#define shmem_get_inode(sb, mode, dev, flags) ramfs_get_inode(sb, mode, dev)
|
|
-#define shmem_acct_size(flags, size) 0
|
|
-#define shmem_unacct_size(flags, size) do {} while (0)
|
|
-#define SHMEM_MAX_BYTES LLONG_MAX
|
|
+#define shmem_file_operations ramfs_file_operations
|
|
+#define shmem_vm_ops generic_file_vm_ops
|
|
+#define shmem_get_inode ramfs_get_inode
|
|
+#define shmem_acct_size(a, b) 0
|
|
+#define shmem_unacct_size(a, b) do {} while (0)
|
|
+#define SHMEM_MAX_BYTES LLONG_MAX
|
|
|
|
#endif /* CONFIG_SHMEM */
|
|
|
|
@@ -2600,7 +2598,7 @@
|
|
* shmem_file_setup - get an unlinked file living in tmpfs
|
|
* @name: name for dentry (to be seen in /proc/<pid>/maps
|
|
* @size: size to be set for the file
|
|
- * @flags: VM_NORESERVE suppresses pre-accounting of the entire object size
|
|
+ * @flags: vm_flags
|
|
*/
|
|
struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
|
|
{
|
|
@@ -2634,10 +2632,13 @@
|
|
goto put_dentry;
|
|
|
|
error = -ENOSPC;
|
|
- inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0, flags);
|
|
+ inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0);
|
|
if (!inode)
|
|
goto close_file;
|
|
|
|
+#ifdef CONFIG_SHMEM
|
|
+ SHMEM_I(inode)->flags = flags & VM_ACCOUNT;
|
|
+#endif
|
|
d_instantiate(dentry, inode);
|
|
inode->i_size = size;
|
|
inode->i_nlink = 0; /* It is unlinked */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/slab.c linux-2.6.29-rc3.owrt/mm/slab.c
|
|
--- linux-2.6.29.owrt/mm/slab.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/slab.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -4457,4 +4457,3 @@
|
|
|
|
return obj_size(virt_to_cache(objp));
|
|
}
|
|
-EXPORT_SYMBOL(ksize);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/slob.c linux-2.6.29-rc3.owrt/mm/slob.c
|
|
--- linux-2.6.29.owrt/mm/slob.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/slob.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -521,7 +521,6 @@
|
|
} else
|
|
return sp->page.private;
|
|
}
|
|
-EXPORT_SYMBOL(ksize);
|
|
|
|
struct kmem_cache {
|
|
unsigned int size, align;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/slub.c linux-2.6.29-rc3.owrt/mm/slub.c
|
|
--- linux-2.6.29.owrt/mm/slub.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/slub.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1996,7 +1996,7 @@
|
|
static void free_kmem_cache_cpu(struct kmem_cache_cpu *c, int cpu)
|
|
{
|
|
if (c < per_cpu(kmem_cache_cpu, cpu) ||
|
|
- c >= per_cpu(kmem_cache_cpu, cpu) + NR_KMEM_CACHE_CPU) {
|
|
+ c > per_cpu(kmem_cache_cpu, cpu) + NR_KMEM_CACHE_CPU) {
|
|
kfree(c);
|
|
return;
|
|
}
|
|
@@ -2736,7 +2736,6 @@
|
|
*/
|
|
return s->size;
|
|
}
|
|
-EXPORT_SYMBOL(ksize);
|
|
|
|
void kfree(const void *x)
|
|
{
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/swapfile.c linux-2.6.29-rc3.owrt/mm/swapfile.c
|
|
--- linux-2.6.29.owrt/mm/swapfile.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/swapfile.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -635,7 +635,7 @@
|
|
|
|
if (!bdev) {
|
|
if (bdev_p)
|
|
- *bdev_p = bdget(sis->bdev->bd_dev);
|
|
+ *bdev_p = sis->bdev;
|
|
|
|
spin_unlock(&swap_lock);
|
|
return i;
|
|
@@ -647,7 +647,7 @@
|
|
struct swap_extent, list);
|
|
if (se->start_block == offset) {
|
|
if (bdev_p)
|
|
- *bdev_p = bdget(sis->bdev->bd_dev);
|
|
+ *bdev_p = sis->bdev;
|
|
|
|
spin_unlock(&swap_lock);
|
|
bdput(bdev);
|
|
@@ -698,10 +698,8 @@
|
|
pte_t *pte;
|
|
int ret = 1;
|
|
|
|
- if (mem_cgroup_try_charge_swapin(vma->vm_mm, page, GFP_KERNEL, &ptr)) {
|
|
+ if (mem_cgroup_try_charge_swapin(vma->vm_mm, page, GFP_KERNEL, &ptr))
|
|
ret = -ENOMEM;
|
|
- goto out_nolock;
|
|
- }
|
|
|
|
pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
|
|
if (unlikely(!pte_same(*pte, swp_entry_to_pte(entry)))) {
|
|
@@ -725,7 +723,6 @@
|
|
activate_page(page);
|
|
out:
|
|
pte_unmap_unlock(pte, ptl);
|
|
-out_nolock:
|
|
return ret;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/util.c linux-2.6.29-rc3.owrt/mm/util.c
|
|
--- linux-2.6.29.owrt/mm/util.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/util.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -129,26 +129,6 @@
|
|
}
|
|
EXPORT_SYMBOL(krealloc);
|
|
|
|
-/**
|
|
- * kzfree - like kfree but zero memory
|
|
- * @p: object to free memory of
|
|
- *
|
|
- * The memory of the object @p points to is zeroed before freed.
|
|
- * If @p is %NULL, kzfree() does nothing.
|
|
- */
|
|
-void kzfree(const void *p)
|
|
-{
|
|
- size_t ks;
|
|
- void *mem = (void *)p;
|
|
-
|
|
- if (unlikely(ZERO_OR_NULL_PTR(mem)))
|
|
- return;
|
|
- ks = ksize(mem);
|
|
- memset(mem, 0, ks);
|
|
- kfree(mem);
|
|
-}
|
|
-EXPORT_SYMBOL(kzfree);
|
|
-
|
|
/*
|
|
* strndup_user - duplicate an existing string from user space
|
|
* @s: The string to duplicate
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/vmalloc.c linux-2.6.29-rc3.owrt/mm/vmalloc.c
|
|
--- linux-2.6.29.owrt/mm/vmalloc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/vmalloc.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -323,7 +323,6 @@
|
|
unsigned long addr;
|
|
int purged = 0;
|
|
|
|
- BUG_ON(!size);
|
|
BUG_ON(size & ~PAGE_MASK);
|
|
|
|
va = kmalloc_node(sizeof(struct vmap_area),
|
|
@@ -335,9 +334,6 @@
|
|
addr = ALIGN(vstart, align);
|
|
|
|
spin_lock(&vmap_area_lock);
|
|
- if (addr + size - 1 < addr)
|
|
- goto overflow;
|
|
-
|
|
/* XXX: could have a last_hole cache */
|
|
n = vmap_area_root.rb_node;
|
|
if (n) {
|
|
@@ -369,8 +365,6 @@
|
|
|
|
while (addr + size > first->va_start && addr + size <= vend) {
|
|
addr = ALIGN(first->va_end + PAGE_SIZE, align);
|
|
- if (addr + size - 1 < addr)
|
|
- goto overflow;
|
|
|
|
n = rb_next(&first->rb_node);
|
|
if (n)
|
|
@@ -381,7 +375,6 @@
|
|
}
|
|
found:
|
|
if (addr + size > vend) {
|
|
-overflow:
|
|
spin_unlock(&vmap_area_lock);
|
|
if (!purged) {
|
|
purge_vmap_area_lazy();
|
|
@@ -505,7 +498,6 @@
|
|
static DEFINE_SPINLOCK(purge_lock);
|
|
LIST_HEAD(valist);
|
|
struct vmap_area *va;
|
|
- struct vmap_area *n_va;
|
|
int nr = 0;
|
|
|
|
/*
|
|
@@ -545,7 +537,7 @@
|
|
|
|
if (nr) {
|
|
spin_lock(&vmap_area_lock);
|
|
- list_for_each_entry_safe(va, n_va, &valist, purge_list)
|
|
+ list_for_each_entry(va, &valist, purge_list)
|
|
__free_vmap_area(va);
|
|
spin_unlock(&vmap_area_lock);
|
|
}
|
|
@@ -1020,8 +1012,6 @@
|
|
void unmap_kernel_range(unsigned long addr, unsigned long size)
|
|
{
|
|
unsigned long end = addr + size;
|
|
-
|
|
- flush_cache_vunmap(addr, end);
|
|
vunmap_page_range(addr, end);
|
|
flush_tlb_kernel_range(addr, end);
|
|
}
|
|
@@ -1117,14 +1107,6 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(__get_vm_area);
|
|
|
|
-struct vm_struct *__get_vm_area_caller(unsigned long size, unsigned long flags,
|
|
- unsigned long start, unsigned long end,
|
|
- void *caller)
|
|
-{
|
|
- return __get_vm_area_node(size, flags, start, end, -1, GFP_KERNEL,
|
|
- caller);
|
|
-}
|
|
-
|
|
/**
|
|
* get_vm_area - reserve a contiguous kernel virtual area
|
|
* @size: size of the area
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/mm/vmscan.c linux-2.6.29-rc3.owrt/mm/vmscan.c
|
|
--- linux-2.6.29.owrt/mm/vmscan.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/mm/vmscan.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1262,6 +1262,7 @@
|
|
* Move the pages to the [file or anon] inactive list.
|
|
*/
|
|
pagevec_init(&pvec, 1);
|
|
+ pgmoved = 0;
|
|
lru = LRU_BASE + file * LRU_FILE;
|
|
|
|
spin_lock_irq(&zone->lru_lock);
|
|
@@ -1273,7 +1274,6 @@
|
|
*/
|
|
reclaim_stat->recent_rotated[!!file] += pgmoved;
|
|
|
|
- pgmoved = 0;
|
|
while (!list_empty(&l_inactive)) {
|
|
page = lru_to_page(&l_inactive);
|
|
prefetchw_prev_lru_page(page, &l_inactive, flags);
|
|
@@ -1469,7 +1469,7 @@
|
|
int file = is_file_lru(l);
|
|
int scan;
|
|
|
|
- scan = zone_nr_pages(zone, sc, l);
|
|
+ scan = zone_page_state(zone, NR_LRU_BASE + l);
|
|
if (priority) {
|
|
scan >>= priority;
|
|
scan = (scan * percent[file]) / 100;
|
|
@@ -2057,31 +2057,31 @@
|
|
int pass, struct scan_control *sc)
|
|
{
|
|
struct zone *zone;
|
|
- unsigned long ret = 0;
|
|
+ unsigned long nr_to_scan, ret = 0;
|
|
+ enum lru_list l;
|
|
|
|
for_each_zone(zone) {
|
|
- enum lru_list l;
|
|
|
|
if (!populated_zone(zone))
|
|
continue;
|
|
+
|
|
if (zone_is_all_unreclaimable(zone) && prio != DEF_PRIORITY)
|
|
continue;
|
|
|
|
for_each_evictable_lru(l) {
|
|
- enum zone_stat_item ls = NR_LRU_BASE + l;
|
|
- unsigned long lru_pages = zone_page_state(zone, ls);
|
|
-
|
|
/* For pass = 0, we don't shrink the active list */
|
|
- if (pass == 0 && (l == LRU_ACTIVE_ANON ||
|
|
- l == LRU_ACTIVE_FILE))
|
|
+ if (pass == 0 &&
|
|
+ (l == LRU_ACTIVE || l == LRU_ACTIVE_FILE))
|
|
continue;
|
|
|
|
- zone->lru[l].nr_scan += (lru_pages >> prio) + 1;
|
|
+ zone->lru[l].nr_scan +=
|
|
+ (zone_page_state(zone, NR_LRU_BASE + l)
|
|
+ >> prio) + 1;
|
|
if (zone->lru[l].nr_scan >= nr_pages || pass > 3) {
|
|
- unsigned long nr_to_scan;
|
|
-
|
|
zone->lru[l].nr_scan = 0;
|
|
- nr_to_scan = min(nr_pages, lru_pages);
|
|
+ nr_to_scan = min(nr_pages,
|
|
+ zone_page_state(zone,
|
|
+ NR_LRU_BASE + l));
|
|
ret += shrink_list(l, nr_to_scan, zone,
|
|
sc, prio);
|
|
if (ret >= nr_pages)
|
|
@@ -2089,6 +2089,7 @@
|
|
}
|
|
}
|
|
}
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
@@ -2111,6 +2112,7 @@
|
|
.may_swap = 0,
|
|
.swap_cluster_max = nr_pages,
|
|
.may_writepage = 1,
|
|
+ .swappiness = vm_swappiness,
|
|
.isolate_pages = isolate_pages_global,
|
|
};
|
|
|
|
@@ -2144,8 +2146,10 @@
|
|
int prio;
|
|
|
|
/* Force reclaiming mapped pages in the passes #3 and #4 */
|
|
- if (pass > 2)
|
|
+ if (pass > 2) {
|
|
sc.may_swap = 1;
|
|
+ sc.swappiness = 100;
|
|
+ }
|
|
|
|
for (prio = DEF_PRIORITY; prio >= 0; prio--) {
|
|
unsigned long nr_to_scan = nr_pages - ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/802/tr.c linux-2.6.29-rc3.owrt/net/802/tr.c
|
|
--- linux-2.6.29.owrt/net/802/tr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/802/tr.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -668,5 +668,3 @@
|
|
|
|
EXPORT_SYMBOL(tr_type_trans);
|
|
EXPORT_SYMBOL(alloc_trdev);
|
|
-
|
|
-MODULE_LICENSE("GPL");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/8021q/vlan_core.c linux-2.6.29-rc3.owrt/net/8021q/vlan_core.c
|
|
--- linux-2.6.29.owrt/net/8021q/vlan_core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/8021q/vlan_core.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1,16 +1,12 @@
|
|
#include <linux/skbuff.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/if_vlan.h>
|
|
-#include <linux/netpoll.h>
|
|
#include "vlan.h"
|
|
|
|
/* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */
|
|
int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
|
|
u16 vlan_tci, int polling)
|
|
{
|
|
- if (netpoll_rx(skb))
|
|
- return NET_RX_DROP;
|
|
-
|
|
if (skb_bond_should_drop(skb))
|
|
goto drop;
|
|
|
|
@@ -104,9 +100,6 @@
|
|
{
|
|
int err = NET_RX_SUCCESS;
|
|
|
|
- if (netpoll_receive_skb(skb))
|
|
- return NET_RX_DROP;
|
|
-
|
|
switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
|
|
case -1:
|
|
return netif_receive_skb(skb);
|
|
@@ -133,9 +126,6 @@
|
|
if (!skb)
|
|
goto out;
|
|
|
|
- if (netpoll_receive_skb(skb))
|
|
- goto out;
|
|
-
|
|
err = NET_RX_SUCCESS;
|
|
|
|
switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/8021q/vlan_dev.c linux-2.6.29-rc3.owrt/net/8021q/vlan_dev.c
|
|
--- linux-2.6.29.owrt/net/8021q/vlan_dev.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/8021q/vlan_dev.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -553,7 +553,7 @@
|
|
int err = 0;
|
|
|
|
if (netif_device_present(real_dev) && ops->ndo_neigh_setup)
|
|
- err = ops->ndo_neigh_setup(real_dev, pa);
|
|
+ err = ops->ndo_neigh_setup(dev, pa);
|
|
|
|
return err;
|
|
}
|
|
@@ -639,7 +639,6 @@
|
|
dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;
|
|
dev->netdev_ops = &vlan_netdev_ops;
|
|
}
|
|
- netdev_resync_ops(dev);
|
|
|
|
if (is_vlan_dev(real_dev))
|
|
subclass = 1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/9p/protocol.c linux-2.6.29-rc3.owrt/net/9p/protocol.c
|
|
--- linux-2.6.29.owrt/net/9p/protocol.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/9p/protocol.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -29,7 +29,6 @@
|
|
#include <linux/errno.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/sched.h>
|
|
-#include <linux/types.h>
|
|
#include <net/9p/9p.h>
|
|
#include <net/9p/client.h>
|
|
#include "protocol.h"
|
|
@@ -161,32 +160,29 @@
|
|
break;
|
|
case 'w':{
|
|
int16_t *val = va_arg(ap, int16_t *);
|
|
- __le16 le_val;
|
|
- if (pdu_read(pdu, &le_val, sizeof(le_val))) {
|
|
+ if (pdu_read(pdu, val, sizeof(*val))) {
|
|
errcode = -EFAULT;
|
|
break;
|
|
}
|
|
- *val = le16_to_cpu(le_val);
|
|
+ *val = cpu_to_le16(*val);
|
|
}
|
|
break;
|
|
case 'd':{
|
|
int32_t *val = va_arg(ap, int32_t *);
|
|
- __le32 le_val;
|
|
- if (pdu_read(pdu, &le_val, sizeof(le_val))) {
|
|
+ if (pdu_read(pdu, val, sizeof(*val))) {
|
|
errcode = -EFAULT;
|
|
break;
|
|
}
|
|
- *val = le32_to_cpu(le_val);
|
|
+ *val = cpu_to_le32(*val);
|
|
}
|
|
break;
|
|
case 'q':{
|
|
int64_t *val = va_arg(ap, int64_t *);
|
|
- __le64 le_val;
|
|
- if (pdu_read(pdu, &le_val, sizeof(le_val))) {
|
|
+ if (pdu_read(pdu, val, sizeof(*val))) {
|
|
errcode = -EFAULT;
|
|
break;
|
|
}
|
|
- *val = le64_to_cpu(le_val);
|
|
+ *val = cpu_to_le64(*val);
|
|
}
|
|
break;
|
|
case 's':{
|
|
@@ -366,19 +362,19 @@
|
|
}
|
|
break;
|
|
case 'w':{
|
|
- __le16 val = cpu_to_le16(va_arg(ap, int));
|
|
+ int16_t val = va_arg(ap, int);
|
|
if (pdu_write(pdu, &val, sizeof(val)))
|
|
errcode = -EFAULT;
|
|
}
|
|
break;
|
|
case 'd':{
|
|
- __le32 val = cpu_to_le32(va_arg(ap, int32_t));
|
|
+ int32_t val = va_arg(ap, int32_t);
|
|
if (pdu_write(pdu, &val, sizeof(val)))
|
|
errcode = -EFAULT;
|
|
}
|
|
break;
|
|
case 'q':{
|
|
- __le64 val = cpu_to_le64(va_arg(ap, int64_t));
|
|
+ int64_t val = va_arg(ap, int64_t);
|
|
if (pdu_write(pdu, &val, sizeof(val)))
|
|
errcode = -EFAULT;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/bridge/br_forward.c linux-2.6.29-rc3.owrt/net/bridge/br_forward.c
|
|
--- linux-2.6.29.owrt/net/bridge/br_forward.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/bridge/br_forward.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -67,11 +67,6 @@
|
|
{
|
|
struct net_device *indev;
|
|
|
|
- if (skb_warn_if_lro(skb)) {
|
|
- kfree_skb(skb);
|
|
- return;
|
|
- }
|
|
-
|
|
indev = skb->dev;
|
|
skb->dev = to->dev;
|
|
skb_forward_csum(skb);
|
|
@@ -94,7 +89,7 @@
|
|
/* called with rcu_read_lock */
|
|
void br_forward(const struct net_bridge_port *to, struct sk_buff *skb)
|
|
{
|
|
- if (should_deliver(to, skb)) {
|
|
+ if (!skb_warn_if_lro(skb) && should_deliver(to, skb)) {
|
|
__br_forward(to, skb);
|
|
return;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/core/dev.c linux-2.6.29-rc3.owrt/net/core/dev.c
|
|
--- linux-2.6.29.owrt/net/core/dev.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/core/dev.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1093,7 +1093,7 @@
|
|
/*
|
|
* Enable NET_DMA
|
|
*/
|
|
- net_dmaengine_get();
|
|
+ dmaengine_get();
|
|
|
|
/*
|
|
* Initialize multicasting status
|
|
@@ -1175,7 +1175,7 @@
|
|
/*
|
|
* Shutdown NET_DMA
|
|
*/
|
|
- net_dmaengine_put();
|
|
+ dmaengine_put();
|
|
|
|
return 0;
|
|
}
|
|
@@ -2274,6 +2274,12 @@
|
|
|
|
rcu_read_lock();
|
|
|
|
+ /* Don't receive packets in an exiting network namespace */
|
|
+ if (!net_alive(dev_net(skb->dev))) {
|
|
+ kfree_skb(skb);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
#ifdef CONFIG_NET_CLS_ACT
|
|
if (skb->tc_verd & TC_NCLS) {
|
|
skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
|
|
@@ -2489,9 +2495,6 @@
|
|
|
|
int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
|
|
{
|
|
- if (netpoll_receive_skb(skb))
|
|
- return NET_RX_DROP;
|
|
-
|
|
switch (__napi_gro_receive(napi, skb)) {
|
|
case -1:
|
|
return netif_receive_skb(skb);
|
|
@@ -2562,9 +2565,6 @@
|
|
if (!skb)
|
|
goto out;
|
|
|
|
- if (netpoll_receive_skb(skb))
|
|
- goto out;
|
|
-
|
|
err = NET_RX_SUCCESS;
|
|
|
|
switch (__napi_gro_receive(napi, skb)) {
|
|
@@ -2595,9 +2595,9 @@
|
|
local_irq_disable();
|
|
skb = __skb_dequeue(&queue->input_pkt_queue);
|
|
if (!skb) {
|
|
+ __napi_complete(napi);
|
|
local_irq_enable();
|
|
- napi_complete(napi);
|
|
- goto out;
|
|
+ break;
|
|
}
|
|
local_irq_enable();
|
|
|
|
@@ -2606,7 +2606,6 @@
|
|
|
|
napi_gro_flush(napi);
|
|
|
|
-out:
|
|
return work;
|
|
}
|
|
|
|
@@ -2679,7 +2678,7 @@
|
|
struct sk_buff *skb, *next;
|
|
|
|
list_del_init(&napi->dev_list);
|
|
- kfree_skb(napi->skb);
|
|
+ kfree(napi->skb);
|
|
|
|
for (skb = napi->gro_list; skb; skb = next) {
|
|
next = skb->next;
|
|
@@ -4290,39 +4289,6 @@
|
|
}
|
|
EXPORT_SYMBOL(netdev_fix_features);
|
|
|
|
-/* Some devices need to (re-)set their netdev_ops inside
|
|
- * ->init() or similar. If that happens, we have to setup
|
|
- * the compat pointers again.
|
|
- */
|
|
-void netdev_resync_ops(struct net_device *dev)
|
|
-{
|
|
-#ifdef CONFIG_COMPAT_NET_DEV_OPS
|
|
- const struct net_device_ops *ops = dev->netdev_ops;
|
|
-
|
|
- dev->init = ops->ndo_init;
|
|
- dev->uninit = ops->ndo_uninit;
|
|
- dev->open = ops->ndo_open;
|
|
- dev->change_rx_flags = ops->ndo_change_rx_flags;
|
|
- dev->set_rx_mode = ops->ndo_set_rx_mode;
|
|
- dev->set_multicast_list = ops->ndo_set_multicast_list;
|
|
- dev->set_mac_address = ops->ndo_set_mac_address;
|
|
- dev->validate_addr = ops->ndo_validate_addr;
|
|
- dev->do_ioctl = ops->ndo_do_ioctl;
|
|
- dev->set_config = ops->ndo_set_config;
|
|
- dev->change_mtu = ops->ndo_change_mtu;
|
|
- dev->neigh_setup = ops->ndo_neigh_setup;
|
|
- dev->tx_timeout = ops->ndo_tx_timeout;
|
|
- dev->get_stats = ops->ndo_get_stats;
|
|
- dev->vlan_rx_register = ops->ndo_vlan_rx_register;
|
|
- dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid;
|
|
- dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid;
|
|
-#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
- dev->poll_controller = ops->ndo_poll_controller;
|
|
-#endif
|
|
-#endif
|
|
-}
|
|
-EXPORT_SYMBOL(netdev_resync_ops);
|
|
-
|
|
/**
|
|
* register_netdevice - register a network device
|
|
* @dev: device to register
|
|
@@ -4367,7 +4333,27 @@
|
|
* This is temporary until all network devices are converted.
|
|
*/
|
|
if (dev->netdev_ops) {
|
|
- netdev_resync_ops(dev);
|
|
+ const struct net_device_ops *ops = dev->netdev_ops;
|
|
+
|
|
+ dev->init = ops->ndo_init;
|
|
+ dev->uninit = ops->ndo_uninit;
|
|
+ dev->open = ops->ndo_open;
|
|
+ dev->change_rx_flags = ops->ndo_change_rx_flags;
|
|
+ dev->set_rx_mode = ops->ndo_set_rx_mode;
|
|
+ dev->set_multicast_list = ops->ndo_set_multicast_list;
|
|
+ dev->set_mac_address = ops->ndo_set_mac_address;
|
|
+ dev->validate_addr = ops->ndo_validate_addr;
|
|
+ dev->do_ioctl = ops->ndo_do_ioctl;
|
|
+ dev->set_config = ops->ndo_set_config;
|
|
+ dev->change_mtu = ops->ndo_change_mtu;
|
|
+ dev->tx_timeout = ops->ndo_tx_timeout;
|
|
+ dev->get_stats = ops->ndo_get_stats;
|
|
+ dev->vlan_rx_register = ops->ndo_vlan_rx_register;
|
|
+ dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid;
|
|
+ dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid;
|
|
+#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
+ dev->poll_controller = ops->ndo_poll_controller;
|
|
+#endif
|
|
} else {
|
|
char drivername[64];
|
|
pr_info("%s (%s): not using net_device_ops yet\n",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/core/neighbour.c linux-2.6.29-rc3.owrt/net/core/neighbour.c
|
|
--- linux-2.6.29.owrt/net/core/neighbour.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/core/neighbour.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1994,8 +1994,8 @@
|
|
if (!net_eq(neigh_parms_net(p), net))
|
|
continue;
|
|
|
|
- if (nidx < neigh_skip)
|
|
- goto next;
|
|
+ if (nidx++ < neigh_skip)
|
|
+ continue;
|
|
|
|
if (neightbl_fill_param_info(skb, tbl, p,
|
|
NETLINK_CB(cb->skb).pid,
|
|
@@ -2003,8 +2003,6 @@
|
|
RTM_NEWNEIGHTBL,
|
|
NLM_F_MULTI) <= 0)
|
|
goto out;
|
|
- next:
|
|
- nidx++;
|
|
}
|
|
|
|
neigh_skip = 0;
|
|
@@ -2084,10 +2082,12 @@
|
|
if (h > s_h)
|
|
s_idx = 0;
|
|
for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) {
|
|
+ int lidx;
|
|
if (dev_net(n->dev) != net)
|
|
continue;
|
|
- if (idx < s_idx)
|
|
- goto next;
|
|
+ lidx = idx++;
|
|
+ if (lidx < s_idx)
|
|
+ continue;
|
|
if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid,
|
|
cb->nlh->nlmsg_seq,
|
|
RTM_NEWNEIGH,
|
|
@@ -2096,8 +2096,6 @@
|
|
rc = -1;
|
|
goto out;
|
|
}
|
|
- next:
|
|
- idx++;
|
|
}
|
|
}
|
|
read_unlock_bh(&tbl->lock);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/core/net_namespace.c linux-2.6.29-rc3.owrt/net/core/net_namespace.c
|
|
--- linux-2.6.29.owrt/net/core/net_namespace.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/core/net_namespace.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -32,14 +32,24 @@
|
|
{
|
|
/* Must be called with net_mutex held */
|
|
struct pernet_operations *ops;
|
|
- int error = 0;
|
|
+ int error;
|
|
+ struct net_generic *ng;
|
|
|
|
atomic_set(&net->count, 1);
|
|
-
|
|
#ifdef NETNS_REFCNT_DEBUG
|
|
atomic_set(&net->use_count, 0);
|
|
#endif
|
|
|
|
+ error = -ENOMEM;
|
|
+ ng = kzalloc(sizeof(struct net_generic) +
|
|
+ INITIAL_NET_GEN_PTRS * sizeof(void *), GFP_KERNEL);
|
|
+ if (ng == NULL)
|
|
+ goto out;
|
|
+
|
|
+ ng->len = INITIAL_NET_GEN_PTRS;
|
|
+ rcu_assign_pointer(net->gen, ng);
|
|
+
|
|
+ error = 0;
|
|
list_for_each_entry(ops, &pernet_list, list) {
|
|
if (ops->init) {
|
|
error = ops->init(net);
|
|
@@ -60,50 +70,24 @@
|
|
}
|
|
|
|
rcu_barrier();
|
|
+ kfree(ng);
|
|
goto out;
|
|
}
|
|
|
|
-static struct net_generic *net_alloc_generic(void)
|
|
-{
|
|
- struct net_generic *ng;
|
|
- size_t generic_size = sizeof(struct net_generic) +
|
|
- INITIAL_NET_GEN_PTRS * sizeof(void *);
|
|
-
|
|
- ng = kzalloc(generic_size, GFP_KERNEL);
|
|
- if (ng)
|
|
- ng->len = INITIAL_NET_GEN_PTRS;
|
|
-
|
|
- return ng;
|
|
-}
|
|
-
|
|
#ifdef CONFIG_NET_NS
|
|
static struct kmem_cache *net_cachep;
|
|
static struct workqueue_struct *netns_wq;
|
|
|
|
static struct net *net_alloc(void)
|
|
{
|
|
- struct net *net = NULL;
|
|
- struct net_generic *ng;
|
|
-
|
|
- ng = net_alloc_generic();
|
|
- if (!ng)
|
|
- goto out;
|
|
-
|
|
- net = kmem_cache_zalloc(net_cachep, GFP_KERNEL);
|
|
- if (!net)
|
|
- goto out_free;
|
|
-
|
|
- rcu_assign_pointer(net->gen, ng);
|
|
-out:
|
|
- return net;
|
|
-
|
|
-out_free:
|
|
- kfree(ng);
|
|
- goto out;
|
|
+ return kmem_cache_zalloc(net_cachep, GFP_KERNEL);
|
|
}
|
|
|
|
static void net_free(struct net *net)
|
|
{
|
|
+ if (!net)
|
|
+ return;
|
|
+
|
|
#ifdef NETNS_REFCNT_DEBUG
|
|
if (unlikely(atomic_read(&net->use_count) != 0)) {
|
|
printk(KERN_EMERG "network namespace not free! Usage: %d\n",
|
|
@@ -128,28 +112,27 @@
|
|
err = -ENOMEM;
|
|
new_net = net_alloc();
|
|
if (!new_net)
|
|
- goto out_err;
|
|
+ goto out;
|
|
|
|
mutex_lock(&net_mutex);
|
|
err = setup_net(new_net);
|
|
- if (!err) {
|
|
- rtnl_lock();
|
|
- list_add_tail(&new_net->list, &net_namespace_list);
|
|
- rtnl_unlock();
|
|
- }
|
|
- mutex_unlock(&net_mutex);
|
|
-
|
|
if (err)
|
|
- goto out_free;
|
|
+ goto out_unlock;
|
|
+
|
|
+ rtnl_lock();
|
|
+ list_add_tail(&new_net->list, &net_namespace_list);
|
|
+ rtnl_unlock();
|
|
+
|
|
+
|
|
+out_unlock:
|
|
+ mutex_unlock(&net_mutex);
|
|
out:
|
|
put_net(old_net);
|
|
+ if (err) {
|
|
+ net_free(new_net);
|
|
+ new_net = ERR_PTR(err);
|
|
+ }
|
|
return new_net;
|
|
-
|
|
-out_free:
|
|
- net_free(new_net);
|
|
-out_err:
|
|
- new_net = ERR_PTR(err);
|
|
- goto out;
|
|
}
|
|
|
|
static void cleanup_net(struct work_struct *work)
|
|
@@ -157,6 +140,9 @@
|
|
struct pernet_operations *ops;
|
|
struct net *net;
|
|
|
|
+ /* Be very certain incoming network packets will not find us */
|
|
+ rcu_barrier();
|
|
+
|
|
net = container_of(work, struct net, work);
|
|
|
|
mutex_lock(&net_mutex);
|
|
@@ -202,7 +188,6 @@
|
|
|
|
static int __init net_ns_init(void)
|
|
{
|
|
- struct net_generic *ng;
|
|
int err;
|
|
|
|
printk(KERN_INFO "net_namespace: %zd bytes\n", sizeof(struct net));
|
|
@@ -217,12 +202,6 @@
|
|
panic("Could not create netns workq");
|
|
#endif
|
|
|
|
- ng = net_alloc_generic();
|
|
- if (!ng)
|
|
- panic("Could not allocate generic netns");
|
|
-
|
|
- rcu_assign_pointer(init_net.gen, ng);
|
|
-
|
|
mutex_lock(&net_mutex);
|
|
err = setup_net(&init_net);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/core/net-sysfs.c linux-2.6.29-rc3.owrt/net/core/net-sysfs.c
|
|
--- linux-2.6.29.owrt/net/core/net-sysfs.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/core/net-sysfs.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -77,9 +77,7 @@
|
|
if (endp == buf)
|
|
goto err;
|
|
|
|
- if (!rtnl_trylock())
|
|
- return -ERESTARTSYS;
|
|
-
|
|
+ rtnl_lock();
|
|
if (dev_isalive(net)) {
|
|
if ((ret = (*set)(net, new)) == 0)
|
|
ret = len;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/core/skbuff.c linux-2.6.29-rc3.owrt/net/core/skbuff.c
|
|
--- linux-2.6.29.owrt/net/core/skbuff.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/core/skbuff.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -220,6 +220,14 @@
|
|
BUG();
|
|
}
|
|
|
|
+void skb_truesize_bug(struct sk_buff *skb)
|
|
+{
|
|
+ WARN(net_ratelimit(), KERN_ERR "SKB BUG: Invalid truesize (%u) "
|
|
+ "len=%u, sizeof(sk_buff)=%Zd\n",
|
|
+ skb->truesize, skb->len, sizeof(struct sk_buff));
|
|
+}
|
|
+EXPORT_SYMBOL(skb_truesize_bug);
|
|
+
|
|
/* Allocate a new skbuff. We do this ourselves so we can fill in a few
|
|
* 'private' fields and also do memory statistics to find all the
|
|
* [BEEP] leaks.
|
|
@@ -2293,10 +2301,10 @@
|
|
return 0;
|
|
|
|
next_skb:
|
|
- block_limit = skb_headlen(st->cur_skb) + st->stepped_offset;
|
|
+ block_limit = skb_headlen(st->cur_skb);
|
|
|
|
if (abs_offset < block_limit) {
|
|
- *data = st->cur_skb->data + (abs_offset - st->stepped_offset);
|
|
+ *data = st->cur_skb->data + abs_offset;
|
|
return block_limit - abs_offset;
|
|
}
|
|
|
|
@@ -2331,15 +2339,14 @@
|
|
st->frag_data = NULL;
|
|
}
|
|
|
|
- if (st->root_skb == st->cur_skb &&
|
|
- skb_shinfo(st->root_skb)->frag_list) {
|
|
- st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
|
|
- st->frag_idx = 0;
|
|
- goto next_skb;
|
|
- } else if (st->cur_skb->next) {
|
|
+ if (st->cur_skb->next) {
|
|
st->cur_skb = st->cur_skb->next;
|
|
st->frag_idx = 0;
|
|
goto next_skb;
|
|
+ } else if (st->root_skb == st->cur_skb &&
|
|
+ skb_shinfo(st->root_skb)->frag_list) {
|
|
+ st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
|
|
+ goto next_skb;
|
|
}
|
|
|
|
return 0;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/core/sock.c linux-2.6.29-rc3.owrt/net/core/sock.c
|
|
--- linux-2.6.29.owrt/net/core/sock.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/core/sock.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -696,8 +696,6 @@
|
|
if (len < 0)
|
|
return -EINVAL;
|
|
|
|
- memset(&v, 0, sizeof(v));
|
|
-
|
|
switch(optname) {
|
|
case SO_DEBUG:
|
|
v.val = sock_flag(sk, SOCK_DBG);
|
|
@@ -1137,6 +1135,7 @@
|
|
{
|
|
struct sock *sk = skb->sk;
|
|
|
|
+ skb_truesize_check(skb);
|
|
atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
|
|
sk_mem_uncharge(skb->sk, skb->truesize);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/cipso_ipv4.c linux-2.6.29-rc3.owrt/net/ipv4/cipso_ipv4.c
|
|
--- linux-2.6.29.owrt/net/ipv4/cipso_ipv4.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/cipso_ipv4.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -3,16 +3,11 @@
|
|
*
|
|
* This is an implementation of the CIPSO 2.2 protocol as specified in
|
|
* draft-ietf-cipso-ipsecurity-01.txt with additional tag types as found in
|
|
- * FIPS-188. While CIPSO never became a full IETF RFC standard many vendors
|
|
+ * FIPS-188, copies of both documents can be found in the Documentation
|
|
+ * directory. While CIPSO never became a full IETF RFC standard many vendors
|
|
* have chosen to adopt the protocol and over the years it has become a
|
|
* de-facto standard for labeled networking.
|
|
*
|
|
- * The CIPSO draft specification can be found in the kernel's Documentation
|
|
- * directory as well as the following URL:
|
|
- * http://netlabel.sourceforge.net/files/draft-ietf-cipso-ipsecurity-01.txt
|
|
- * The FIPS-188 specification can be found at the following URL:
|
|
- * http://www.itl.nist.gov/fipspubs/fip188.htm
|
|
- *
|
|
* Author: Paul Moore <paul.moore@hp.com>
|
|
*
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/icmp.c linux-2.6.29-rc3.owrt/net/ipv4/icmp.c
|
|
--- linux-2.6.29.owrt/net/ipv4/icmp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/icmp.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1205,7 +1205,7 @@
|
|
|
|
int __init icmp_init(void)
|
|
{
|
|
- return register_pernet_subsys(&icmp_sk_ops);
|
|
+ return register_pernet_device(&icmp_sk_ops);
|
|
}
|
|
|
|
EXPORT_SYMBOL(icmp_err_convert);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/ipconfig.c linux-2.6.29-rc3.owrt/net/ipv4/ipconfig.c
|
|
--- linux-2.6.29.owrt/net/ipv4/ipconfig.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/ipconfig.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -1268,9 +1268,6 @@
|
|
static int __init ip_auto_config(void)
|
|
{
|
|
__be32 addr;
|
|
-#ifdef IPCONFIG_DYNAMIC
|
|
- int retries = CONF_OPEN_RETRIES;
|
|
-#endif
|
|
|
|
#ifdef CONFIG_PROC_FS
|
|
proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops);
|
|
@@ -1307,6 +1304,9 @@
|
|
#endif
|
|
ic_first_dev->next) {
|
|
#ifdef IPCONFIG_DYNAMIC
|
|
+
|
|
+ int retries = CONF_OPEN_RETRIES;
|
|
+
|
|
if (ic_dynamic() < 0) {
|
|
ic_close_devs();
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/ip_fragment.c linux-2.6.29-rc3.owrt/net/ipv4/ip_fragment.c
|
|
--- linux-2.6.29.owrt/net/ipv4/ip_fragment.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/ip_fragment.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -463,7 +463,6 @@
|
|
static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
|
|
struct net_device *dev)
|
|
{
|
|
- struct net *net = container_of(qp->q.net, struct net, ipv4.frags);
|
|
struct iphdr *iph;
|
|
struct sk_buff *fp, *head = qp->q.fragments;
|
|
int len;
|
|
@@ -549,7 +548,7 @@
|
|
iph = ip_hdr(head);
|
|
iph->frag_off = 0;
|
|
iph->tot_len = htons(len);
|
|
- IP_INC_STATS_BH(net, IPSTATS_MIB_REASMOKS);
|
|
+ IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_REASMOKS);
|
|
qp->q.fragments = NULL;
|
|
return 0;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/tcp.c linux-2.6.29-rc3.owrt/net/ipv4/tcp.c
|
|
--- linux-2.6.29.owrt/net/ipv4/tcp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/tcp.c 2009-05-10 23:48:33.000000000 +0200
|
|
@@ -524,8 +524,7 @@
|
|
struct tcp_splice_state *tss = rd_desc->arg.data;
|
|
int ret;
|
|
|
|
- ret = skb_splice_bits(skb, offset, tss->pipe, min(rd_desc->count, len),
|
|
- tss->flags);
|
|
+ ret = skb_splice_bits(skb, offset, tss->pipe, rd_desc->count, tss->flags);
|
|
if (ret > 0)
|
|
rd_desc->count -= ret;
|
|
return ret;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/tcp_input.c linux-2.6.29-rc3.owrt/net/ipv4/tcp_input.c
|
|
--- linux-2.6.29.owrt/net/ipv4/tcp_input.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/tcp_input.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1374,8 +1374,7 @@
|
|
|
|
static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
|
|
struct tcp_sacktag_state *state,
|
|
- unsigned int pcount, int shifted, int mss,
|
|
- int dup_sack)
|
|
+ unsigned int pcount, int shifted, int mss)
|
|
{
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
struct sk_buff *prev = tcp_write_queue_prev(sk, skb);
|
|
@@ -1411,7 +1410,7 @@
|
|
}
|
|
|
|
/* We discard results */
|
|
- tcp_sacktag_one(skb, sk, state, dup_sack, pcount);
|
|
+ tcp_sacktag_one(skb, sk, state, 0, pcount);
|
|
|
|
/* Difference in this won't matter, both ACKed by the same cumul. ACK */
|
|
TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS);
|
|
@@ -1562,7 +1561,7 @@
|
|
|
|
if (!skb_shift(prev, skb, len))
|
|
goto fallback;
|
|
- if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss, dup_sack))
|
|
+ if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss))
|
|
goto out;
|
|
|
|
/* Hole filled allows collapsing with the next as well, this is very
|
|
@@ -1581,7 +1580,7 @@
|
|
len = skb->len;
|
|
if (skb_shift(prev, skb, len)) {
|
|
pcount += tcp_skb_pcount(skb);
|
|
- tcp_shifted_skb(sk, skb, state, tcp_skb_pcount(skb), len, mss, 0);
|
|
+ tcp_shifted_skb(sk, skb, state, tcp_skb_pcount(skb), len, mss);
|
|
}
|
|
|
|
out:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/tcp_ipv4.c linux-2.6.29-rc3.owrt/net/ipv4/tcp_ipv4.c
|
|
--- linux-2.6.29.owrt/net/ipv4/tcp_ipv4.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/tcp_ipv4.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -2443,7 +2443,7 @@
|
|
void __init tcp_v4_init(void)
|
|
{
|
|
inet_hashinfo_init(&tcp_hashinfo);
|
|
- if (register_pernet_subsys(&tcp_sk_ops))
|
|
+ if (register_pernet_device(&tcp_sk_ops))
|
|
panic("Failed to create the TCP control socket.\n");
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/tcp_output.c linux-2.6.29-rc3.owrt/net/ipv4/tcp_output.c
|
|
--- linux-2.6.29.owrt/net/ipv4/tcp_output.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/tcp_output.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -663,10 +663,14 @@
|
|
th->urg_ptr = 0;
|
|
|
|
/* The urg_mode check is necessary during a below snd_una win probe */
|
|
- if (unlikely(tcp_urg_mode(tp) &&
|
|
- between(tp->snd_up, tcb->seq + 1, tcb->seq + 0xFFFF))) {
|
|
- th->urg_ptr = htons(tp->snd_up - tcb->seq);
|
|
- th->urg = 1;
|
|
+ if (unlikely(tcp_urg_mode(tp))) {
|
|
+ if (between(tp->snd_up, tcb->seq + 1, tcb->seq + 0xFFFF)) {
|
|
+ th->urg_ptr = htons(tp->snd_up - tcb->seq);
|
|
+ th->urg = 1;
|
|
+ } else if (after(tcb->seq + 0xFFFF, tp->snd_nxt)) {
|
|
+ th->urg_ptr = 0xFFFF;
|
|
+ th->urg = 1;
|
|
+ }
|
|
}
|
|
|
|
tcp_options_write((__be32 *)(th + 1), tp, &opts, &md5_hash_location);
|
|
@@ -2023,6 +2027,7 @@
|
|
last_lost = tp->snd_una;
|
|
}
|
|
|
|
+ /* First pass: retransmit lost packets. */
|
|
tcp_for_write_queue_from(skb, sk) {
|
|
__u8 sacked = TCP_SKB_CB(skb)->sacked;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/tcp_scalable.c linux-2.6.29-rc3.owrt/net/ipv4/tcp_scalable.c
|
|
--- linux-2.6.29.owrt/net/ipv4/tcp_scalable.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/tcp_scalable.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1,6 +1,6 @@
|
|
/* Tom Kelly's Scalable TCP
|
|
*
|
|
- * See http://www.deneholme.net/tom/scalable/
|
|
+ * See htt://www-lce.eng.cam.ac.uk/~ctk21/scalable/
|
|
*
|
|
* John Heffner <jheffner@sc.edu>
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv4/udp.c linux-2.6.29-rc3.owrt/net/ipv4/udp.c
|
|
--- linux-2.6.29.owrt/net/ipv4/udp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv4/udp.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -120,11 +120,8 @@
|
|
atomic_t udp_memory_allocated;
|
|
EXPORT_SYMBOL(udp_memory_allocated);
|
|
|
|
-#define PORTS_PER_CHAIN (65536 / UDP_HTABLE_SIZE)
|
|
-
|
|
static int udp_lib_lport_inuse(struct net *net, __u16 num,
|
|
const struct udp_hslot *hslot,
|
|
- unsigned long *bitmap,
|
|
struct sock *sk,
|
|
int (*saddr_comp)(const struct sock *sk1,
|
|
const struct sock *sk2))
|
|
@@ -135,17 +132,12 @@
|
|
sk_nulls_for_each(sk2, node, &hslot->head)
|
|
if (net_eq(sock_net(sk2), net) &&
|
|
sk2 != sk &&
|
|
- (bitmap || sk2->sk_hash == num) &&
|
|
+ sk2->sk_hash == num &&
|
|
(!sk2->sk_reuse || !sk->sk_reuse) &&
|
|
(!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if
|
|
|| sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
|
|
- (*saddr_comp)(sk, sk2)) {
|
|
- if (bitmap)
|
|
- __set_bit(sk2->sk_hash / UDP_HTABLE_SIZE,
|
|
- bitmap);
|
|
- else
|
|
- return 1;
|
|
- }
|
|
+ (*saddr_comp)(sk, sk2))
|
|
+ return 1;
|
|
return 0;
|
|
}
|
|
|
|
@@ -168,47 +160,32 @@
|
|
if (!snum) {
|
|
int low, high, remaining;
|
|
unsigned rand;
|
|
- unsigned short first, last;
|
|
- DECLARE_BITMAP(bitmap, PORTS_PER_CHAIN);
|
|
+ unsigned short first;
|
|
|
|
inet_get_local_port_range(&low, &high);
|
|
remaining = (high - low) + 1;
|
|
|
|
rand = net_random();
|
|
- first = (((u64)rand * remaining) >> 32) + low;
|
|
- /*
|
|
- * force rand to be an odd multiple of UDP_HTABLE_SIZE
|
|
- */
|
|
- rand = (rand | 1) * UDP_HTABLE_SIZE;
|
|
- for (last = first + UDP_HTABLE_SIZE; first != last; first++) {
|
|
- hslot = &udptable->hash[udp_hashfn(net, first)];
|
|
- bitmap_zero(bitmap, PORTS_PER_CHAIN);
|
|
+ snum = first = rand % remaining + low;
|
|
+ rand |= 1;
|
|
+ for (;;) {
|
|
+ hslot = &udptable->hash[udp_hashfn(net, snum)];
|
|
spin_lock_bh(&hslot->lock);
|
|
- udp_lib_lport_inuse(net, snum, hslot, bitmap, sk,
|
|
- saddr_comp);
|
|
-
|
|
- snum = first;
|
|
- /*
|
|
- * Iterate on all possible values of snum for this hash.
|
|
- * Using steps of an odd multiple of UDP_HTABLE_SIZE
|
|
- * give us randomization and full range coverage.
|
|
- */
|
|
- do {
|
|
- if (low <= snum && snum <= high &&
|
|
- !test_bit(snum / UDP_HTABLE_SIZE, bitmap))
|
|
- goto found;
|
|
- snum += rand;
|
|
- } while (snum != first);
|
|
+ if (!udp_lib_lport_inuse(net, snum, hslot, sk, saddr_comp))
|
|
+ break;
|
|
spin_unlock_bh(&hslot->lock);
|
|
+ do {
|
|
+ snum = snum + rand;
|
|
+ } while (snum < low || snum > high);
|
|
+ if (snum == first)
|
|
+ goto fail;
|
|
}
|
|
- goto fail;
|
|
} else {
|
|
hslot = &udptable->hash[udp_hashfn(net, snum)];
|
|
spin_lock_bh(&hslot->lock);
|
|
- if (udp_lib_lport_inuse(net, snum, hslot, NULL, sk, saddr_comp))
|
|
+ if (udp_lib_lport_inuse(net, snum, hslot, sk, saddr_comp))
|
|
goto fail_unlock;
|
|
}
|
|
-found:
|
|
inet_sk(sk)->num = snum;
|
|
sk->sk_hash = snum;
|
|
if (sk_unhashed(sk)) {
|
|
@@ -1015,11 +992,9 @@
|
|
|
|
if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) {
|
|
/* Note that an ENOMEM error is charged twice */
|
|
- if (rc == -ENOMEM) {
|
|
+ if (rc == -ENOMEM)
|
|
UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS,
|
|
is_udplite);
|
|
- atomic_inc(&sk->sk_drops);
|
|
- }
|
|
goto drop;
|
|
}
|
|
|
|
@@ -1231,10 +1206,11 @@
|
|
int proto)
|
|
{
|
|
struct sock *sk;
|
|
- struct udphdr *uh;
|
|
+ struct udphdr *uh = udp_hdr(skb);
|
|
unsigned short ulen;
|
|
struct rtable *rt = (struct rtable*)skb->dst;
|
|
- __be32 saddr, daddr;
|
|
+ __be32 saddr = ip_hdr(skb)->saddr;
|
|
+ __be32 daddr = ip_hdr(skb)->daddr;
|
|
struct net *net = dev_net(skb->dev);
|
|
|
|
/*
|
|
@@ -1243,7 +1219,6 @@
|
|
if (!pskb_may_pull(skb, sizeof(struct udphdr)))
|
|
goto drop; /* No space for header. */
|
|
|
|
- uh = udp_hdr(skb);
|
|
ulen = ntohs(uh->len);
|
|
if (ulen > skb->len)
|
|
goto short_packet;
|
|
@@ -1258,9 +1233,6 @@
|
|
if (udp4_csum_init(skb, uh, proto))
|
|
goto csum_error;
|
|
|
|
- saddr = ip_hdr(skb)->saddr;
|
|
- daddr = ip_hdr(skb)->daddr;
|
|
-
|
|
if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
|
|
return __udp4_lib_mcast_deliver(net, skb, uh,
|
|
saddr, daddr, udptable);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/addrconf.c linux-2.6.29-rc3.owrt/net/ipv6/addrconf.c
|
|
--- linux-2.6.29.owrt/net/ipv6/addrconf.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/addrconf.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -493,17 +493,15 @@
|
|
read_unlock(&dev_base_lock);
|
|
}
|
|
|
|
-static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old)
|
|
+static void addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old)
|
|
{
|
|
struct net *net;
|
|
|
|
net = (struct net *)table->extra2;
|
|
if (p == &net->ipv6.devconf_dflt->forwarding)
|
|
- return 0;
|
|
-
|
|
- if (!rtnl_trylock())
|
|
- return -ERESTARTSYS;
|
|
+ return;
|
|
|
|
+ rtnl_lock();
|
|
if (p == &net->ipv6.devconf_all->forwarding) {
|
|
__s32 newf = net->ipv6.devconf_all->forwarding;
|
|
net->ipv6.devconf_dflt->forwarding = newf;
|
|
@@ -514,7 +512,6 @@
|
|
|
|
if (*p)
|
|
rt6_purge_dflt_routers(net);
|
|
- return 1;
|
|
}
|
|
#endif
|
|
|
|
@@ -2611,6 +2608,9 @@
|
|
|
|
ASSERT_RTNL();
|
|
|
|
+ if ((dev->flags & IFF_LOOPBACK) && how == 1)
|
|
+ how = 0;
|
|
+
|
|
rt6_ifdown(net, dev);
|
|
neigh_ifdown(&nd_tbl, dev);
|
|
|
|
@@ -3983,7 +3983,7 @@
|
|
ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
|
|
|
|
if (write)
|
|
- ret = addrconf_fixup_forwarding(ctl, valp, val);
|
|
+ addrconf_fixup_forwarding(ctl, valp, val);
|
|
return ret;
|
|
}
|
|
|
|
@@ -4019,7 +4019,8 @@
|
|
}
|
|
|
|
*valp = new;
|
|
- return addrconf_fixup_forwarding(table, valp, val);
|
|
+ addrconf_fixup_forwarding(table, valp, val);
|
|
+ return 1;
|
|
}
|
|
|
|
static struct addrconf_sysctl_table
|
|
@@ -4249,7 +4250,7 @@
|
|
.procname = "mc_forwarding",
|
|
.data = &ipv6_devconf.mc_forwarding,
|
|
.maxlen = sizeof(int),
|
|
- .mode = 0444,
|
|
+ .mode = 0644,
|
|
.proc_handler = proc_dointvec,
|
|
},
|
|
#endif
|
|
@@ -4445,6 +4446,25 @@
|
|
|
|
EXPORT_SYMBOL(unregister_inet6addr_notifier);
|
|
|
|
+static void addrconf_net_exit(struct net *net)
|
|
+{
|
|
+ struct net_device *dev;
|
|
+
|
|
+ rtnl_lock();
|
|
+ /* clean dev list */
|
|
+ for_each_netdev(net, dev) {
|
|
+ if (__in6_dev_get(dev) == NULL)
|
|
+ continue;
|
|
+ addrconf_ifdown(dev, 1);
|
|
+ }
|
|
+ addrconf_ifdown(net->loopback_dev, 2);
|
|
+ rtnl_unlock();
|
|
+}
|
|
+
|
|
+static struct pernet_operations addrconf_net_ops = {
|
|
+ .exit = addrconf_net_exit,
|
|
+};
|
|
+
|
|
/*
|
|
* Init / cleanup code
|
|
*/
|
|
@@ -4486,6 +4506,10 @@
|
|
if (err)
|
|
goto errlo;
|
|
|
|
+ err = register_pernet_device(&addrconf_net_ops);
|
|
+ if (err)
|
|
+ return err;
|
|
+
|
|
register_netdevice_notifier(&ipv6_dev_notf);
|
|
|
|
addrconf_verify(0);
|
|
@@ -4515,22 +4539,15 @@
|
|
void addrconf_cleanup(void)
|
|
{
|
|
struct inet6_ifaddr *ifa;
|
|
- struct net_device *dev;
|
|
int i;
|
|
|
|
unregister_netdevice_notifier(&ipv6_dev_notf);
|
|
+ unregister_pernet_device(&addrconf_net_ops);
|
|
+
|
|
unregister_pernet_subsys(&addrconf_ops);
|
|
|
|
rtnl_lock();
|
|
|
|
- /* clean dev list */
|
|
- for_each_netdev(&init_net, dev) {
|
|
- if (__in6_dev_get(dev) == NULL)
|
|
- continue;
|
|
- addrconf_ifdown(dev, 1);
|
|
- }
|
|
- addrconf_ifdown(init_net.loopback_dev, 2);
|
|
-
|
|
/*
|
|
* Check hash table.
|
|
*/
|
|
@@ -4551,4 +4568,6 @@
|
|
|
|
del_timer(&addr_chk_timer);
|
|
rtnl_unlock();
|
|
+
|
|
+ unregister_pernet_subsys(&addrconf_net_ops);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/af_inet6.c linux-2.6.29-rc3.owrt/net/ipv6/af_inet6.c
|
|
--- linux-2.6.29.owrt/net/ipv6/af_inet6.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/af_inet6.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -72,10 +72,6 @@
|
|
static struct list_head inetsw6[SOCK_MAX];
|
|
static DEFINE_SPINLOCK(inetsw6_lock);
|
|
|
|
-static int disable_ipv6 = 0;
|
|
-module_param_named(disable, disable_ipv6, int, 0);
|
|
-MODULE_PARM_DESC(disable, "Disable IPv6 such that it is non-functional");
|
|
-
|
|
static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)
|
|
{
|
|
const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo);
|
|
@@ -995,21 +991,10 @@
|
|
{
|
|
struct sk_buff *dummy_skb;
|
|
struct list_head *r;
|
|
- int err = 0;
|
|
+ int err;
|
|
|
|
BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb));
|
|
|
|
- /* Register the socket-side information for inet6_create. */
|
|
- for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
|
|
- INIT_LIST_HEAD(r);
|
|
-
|
|
- if (disable_ipv6) {
|
|
- printk(KERN_INFO
|
|
- "IPv6: Loaded, but administratively disabled, "
|
|
- "reboot required to enable\n");
|
|
- goto out;
|
|
- }
|
|
-
|
|
err = proto_register(&tcpv6_prot, 1);
|
|
if (err)
|
|
goto out;
|
|
@@ -1027,6 +1012,10 @@
|
|
goto out_unregister_udplite_proto;
|
|
|
|
|
|
+ /* Register the socket-side information for inet6_create. */
|
|
+ for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
|
|
+ INIT_LIST_HEAD(r);
|
|
+
|
|
/* We MUST register RAW sockets before we create the ICMP6,
|
|
* IGMP6, or NDISC control sockets.
|
|
*/
|
|
@@ -1192,9 +1181,6 @@
|
|
|
|
static void __exit inet6_exit(void)
|
|
{
|
|
- if (disable_ipv6)
|
|
- return;
|
|
-
|
|
/* First of all disallow new sockets creation. */
|
|
sock_unregister(PF_INET6);
|
|
/* Disallow any further netlink messages */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/icmp.c linux-2.6.29-rc3.owrt/net/ipv6/icmp.c
|
|
--- linux-2.6.29.owrt/net/ipv6/icmp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/icmp.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -443,10 +443,10 @@
|
|
if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6))
|
|
goto relookup_failed;
|
|
|
|
- if (ip6_dst_lookup(sk, &dst2, &fl2))
|
|
+ if (ip6_dst_lookup(sk, &dst2, &fl))
|
|
goto relookup_failed;
|
|
|
|
- err = xfrm_lookup(net, &dst2, &fl2, sk, XFRM_LOOKUP_ICMP);
|
|
+ err = xfrm_lookup(net, &dst2, &fl, sk, XFRM_LOOKUP_ICMP);
|
|
switch (err) {
|
|
case 0:
|
|
dst_release(dst);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/inet6_hashtables.c linux-2.6.29-rc3.owrt/net/ipv6/inet6_hashtables.c
|
|
--- linux-2.6.29.owrt/net/ipv6/inet6_hashtables.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/inet6_hashtables.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -258,11 +258,11 @@
|
|
|
|
if (twp != NULL) {
|
|
*twp = tw;
|
|
- NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED);
|
|
+ NET_INC_STATS_BH(twsk_net(tw), LINUX_MIB_TIMEWAITRECYCLED);
|
|
} else if (tw != NULL) {
|
|
/* Silly. Should hash-dance instead... */
|
|
inet_twsk_deschedule(tw, death_row);
|
|
- NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED);
|
|
+ NET_INC_STATS_BH(twsk_net(tw), LINUX_MIB_TIMEWAITRECYCLED);
|
|
|
|
inet_twsk_put(tw);
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/ip6_flowlabel.c linux-2.6.29-rc3.owrt/net/ipv6/ip6_flowlabel.c
|
|
--- linux-2.6.29.owrt/net/ipv6/ip6_flowlabel.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/ip6_flowlabel.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -323,21 +323,17 @@
|
|
fl_create(struct net *net, struct in6_flowlabel_req *freq, char __user *optval,
|
|
int optlen, int *err_p)
|
|
{
|
|
- struct ip6_flowlabel *fl = NULL;
|
|
+ struct ip6_flowlabel *fl;
|
|
int olen;
|
|
int addr_type;
|
|
int err;
|
|
|
|
- olen = optlen - CMSG_ALIGN(sizeof(*freq));
|
|
- err = -EINVAL;
|
|
- if (olen > 64 * 1024)
|
|
- goto done;
|
|
-
|
|
err = -ENOMEM;
|
|
fl = kzalloc(sizeof(*fl), GFP_KERNEL);
|
|
if (fl == NULL)
|
|
goto done;
|
|
|
|
+ olen = optlen - CMSG_ALIGN(sizeof(*freq));
|
|
if (olen > 0) {
|
|
struct msghdr msg;
|
|
struct flowi flowi;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/ip6_input.c linux-2.6.29-rc3.owrt/net/ipv6/ip6_input.c
|
|
--- linux-2.6.29.owrt/net/ipv6/ip6_input.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/ip6_input.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -255,7 +255,6 @@
|
|
* IPv6 multicast router mode is now supported ;)
|
|
*/
|
|
if (dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding &&
|
|
- !(ipv6_addr_type(&hdr->daddr) & IPV6_ADDR_LINKLOCAL) &&
|
|
likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) {
|
|
/*
|
|
* Okay, we try to forward - split and duplicate
|
|
@@ -317,6 +316,7 @@
|
|
}
|
|
|
|
if (skb2) {
|
|
+ skb2->dev = skb2->dst->dev;
|
|
ip6_mr_input(skb2);
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/ip6mr.c linux-2.6.29-rc3.owrt/net/ipv6/ip6mr.c
|
|
--- linux-2.6.29.owrt/net/ipv6/ip6mr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/ip6mr.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -48,7 +48,6 @@
|
|
#include <linux/pim.h>
|
|
#include <net/addrconf.h>
|
|
#include <linux/netfilter_ipv6.h>
|
|
-#include <net/ip6_checksum.h>
|
|
|
|
/* Big lock, protecting vif table, mrt cache and mroute socket state.
|
|
Note that the changes are semaphored via rtnl_lock.
|
|
@@ -366,9 +365,7 @@
|
|
pim = (struct pimreghdr *)skb_transport_header(skb);
|
|
if (pim->type != ((PIM_VERSION << 4) | PIM_REGISTER) ||
|
|
(pim->flags & PIM_NULL_REGISTER) ||
|
|
- (csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
|
|
- sizeof(*pim), IPPROTO_PIM,
|
|
- csum_partial((void *)pim, sizeof(*pim), 0)) &&
|
|
+ (ip_compute_csum((void *)pim, sizeof(*pim)) != 0 &&
|
|
csum_fold(skb_checksum(skb, 0, skb->len, 0))))
|
|
goto drop;
|
|
|
|
@@ -395,7 +392,7 @@
|
|
skb_pull(skb, (u8 *)encap - skb->data);
|
|
skb_reset_network_header(skb);
|
|
skb->dev = reg_dev;
|
|
- skb->protocol = htons(ETH_P_IPV6);
|
|
+ skb->protocol = htons(ETH_P_IP);
|
|
skb->ip_summed = 0;
|
|
skb->pkt_type = PACKET_HOST;
|
|
dst_release(skb->dst);
|
|
@@ -484,7 +481,6 @@
|
|
{
|
|
struct mif_device *v;
|
|
struct net_device *dev;
|
|
- struct inet6_dev *in6_dev;
|
|
if (vifi < 0 || vifi >= net->ipv6.maxvif)
|
|
return -EADDRNOTAVAIL;
|
|
|
|
@@ -517,10 +513,6 @@
|
|
|
|
dev_set_allmulti(dev, -1);
|
|
|
|
- in6_dev = __in6_dev_get(dev);
|
|
- if (in6_dev)
|
|
- in6_dev->cnf.mc_forwarding--;
|
|
-
|
|
if (v->flags & MIFF_REGISTER)
|
|
unregister_netdevice(dev);
|
|
|
|
@@ -630,7 +622,6 @@
|
|
int vifi = vifc->mif6c_mifi;
|
|
struct mif_device *v = &net->ipv6.vif6_table[vifi];
|
|
struct net_device *dev;
|
|
- struct inet6_dev *in6_dev;
|
|
int err;
|
|
|
|
/* Is vif busy ? */
|
|
@@ -671,10 +662,6 @@
|
|
return -EINVAL;
|
|
}
|
|
|
|
- in6_dev = __in6_dev_get(dev);
|
|
- if (in6_dev)
|
|
- in6_dev->cnf.mc_forwarding++;
|
|
-
|
|
/*
|
|
* Fill in the VIF structures
|
|
*/
|
|
@@ -851,6 +838,8 @@
|
|
|
|
skb->dst = dst_clone(pkt->dst);
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
+
|
|
+ skb_pull(skb, sizeof(struct ipv6hdr));
|
|
}
|
|
|
|
if (net->ipv6.mroute6_sk == NULL) {
|
|
@@ -1233,10 +1222,8 @@
|
|
|
|
rtnl_lock();
|
|
write_lock_bh(&mrt_lock);
|
|
- if (likely(net->ipv6.mroute6_sk == NULL)) {
|
|
+ if (likely(net->ipv6.mroute6_sk == NULL))
|
|
net->ipv6.mroute6_sk = sk;
|
|
- net->ipv6.devconf_all->mc_forwarding++;
|
|
- }
|
|
else
|
|
err = -EADDRINUSE;
|
|
write_unlock_bh(&mrt_lock);
|
|
@@ -1255,7 +1242,6 @@
|
|
if (sk == net->ipv6.mroute6_sk) {
|
|
write_lock_bh(&mrt_lock);
|
|
net->ipv6.mroute6_sk = NULL;
|
|
- net->ipv6.devconf_all->mc_forwarding--;
|
|
write_unlock_bh(&mrt_lock);
|
|
|
|
mroute_clean_tables(net);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/ip6_output.c linux-2.6.29-rc3.owrt/net/ipv6/ip6_output.c
|
|
--- linux-2.6.29.owrt/net/ipv6/ip6_output.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/ip6_output.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1105,18 +1105,6 @@
|
|
return err;
|
|
}
|
|
|
|
-static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
|
|
- gfp_t gfp)
|
|
-{
|
|
- return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
|
|
-}
|
|
-
|
|
-static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
|
|
- gfp_t gfp)
|
|
-{
|
|
- return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
|
|
-}
|
|
-
|
|
int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|
int offset, int len, int odd, struct sk_buff *skb),
|
|
void *from, int length, int transhdrlen,
|
|
@@ -1142,37 +1130,17 @@
|
|
* setup for corking
|
|
*/
|
|
if (opt) {
|
|
- if (WARN_ON(np->cork.opt))
|
|
+ if (np->cork.opt == NULL) {
|
|
+ np->cork.opt = kmalloc(opt->tot_len,
|
|
+ sk->sk_allocation);
|
|
+ if (unlikely(np->cork.opt == NULL))
|
|
+ return -ENOBUFS;
|
|
+ } else if (np->cork.opt->tot_len < opt->tot_len) {
|
|
+ printk(KERN_DEBUG "ip6_append_data: invalid option length\n");
|
|
return -EINVAL;
|
|
-
|
|
- np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation);
|
|
- if (unlikely(np->cork.opt == NULL))
|
|
- return -ENOBUFS;
|
|
-
|
|
- np->cork.opt->tot_len = opt->tot_len;
|
|
- np->cork.opt->opt_flen = opt->opt_flen;
|
|
- np->cork.opt->opt_nflen = opt->opt_nflen;
|
|
-
|
|
- np->cork.opt->dst0opt = ip6_opt_dup(opt->dst0opt,
|
|
- sk->sk_allocation);
|
|
- if (opt->dst0opt && !np->cork.opt->dst0opt)
|
|
- return -ENOBUFS;
|
|
-
|
|
- np->cork.opt->dst1opt = ip6_opt_dup(opt->dst1opt,
|
|
- sk->sk_allocation);
|
|
- if (opt->dst1opt && !np->cork.opt->dst1opt)
|
|
- return -ENOBUFS;
|
|
-
|
|
- np->cork.opt->hopopt = ip6_opt_dup(opt->hopopt,
|
|
- sk->sk_allocation);
|
|
- if (opt->hopopt && !np->cork.opt->hopopt)
|
|
- return -ENOBUFS;
|
|
-
|
|
- np->cork.opt->srcrt = ip6_rthdr_dup(opt->srcrt,
|
|
- sk->sk_allocation);
|
|
- if (opt->srcrt && !np->cork.opt->srcrt)
|
|
- return -ENOBUFS;
|
|
-
|
|
+ }
|
|
+ memcpy(np->cork.opt, opt, opt->tot_len);
|
|
+ inet->cork.flags |= IPCORK_OPT;
|
|
/* need source address above miyazawa*/
|
|
}
|
|
dst_hold(&rt->u.dst);
|
|
@@ -1199,7 +1167,8 @@
|
|
} else {
|
|
rt = (struct rt6_info *)inet->cork.dst;
|
|
fl = &inet->cork.fl;
|
|
- opt = np->cork.opt;
|
|
+ if (inet->cork.flags & IPCORK_OPT)
|
|
+ opt = np->cork.opt;
|
|
transhdrlen = 0;
|
|
exthdrlen = 0;
|
|
mtu = inet->cork.fragsize;
|
|
@@ -1438,15 +1407,9 @@
|
|
|
|
static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np)
|
|
{
|
|
- if (np->cork.opt) {
|
|
- kfree(np->cork.opt->dst0opt);
|
|
- kfree(np->cork.opt->dst1opt);
|
|
- kfree(np->cork.opt->hopopt);
|
|
- kfree(np->cork.opt->srcrt);
|
|
- kfree(np->cork.opt);
|
|
- np->cork.opt = NULL;
|
|
- }
|
|
-
|
|
+ inet->cork.flags &= ~IPCORK_OPT;
|
|
+ kfree(np->cork.opt);
|
|
+ np->cork.opt = NULL;
|
|
if (inet->cork.dst) {
|
|
dst_release(inet->cork.dst);
|
|
inet->cork.dst = NULL;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/ip6_tunnel.c linux-2.6.29-rc3.owrt/net/ipv6/ip6_tunnel.c
|
|
--- linux-2.6.29.owrt/net/ipv6/ip6_tunnel.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/ip6_tunnel.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -249,8 +249,8 @@
|
|
}
|
|
|
|
t = netdev_priv(dev);
|
|
- t->parms = *p;
|
|
ip6_tnl_dev_init(dev);
|
|
+ t->parms = *p;
|
|
|
|
if ((err = register_netdevice(dev)) < 0)
|
|
goto failed_free;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c linux-2.6.29-rc3.owrt/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
|
|
--- linux-2.6.29.owrt/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -49,19 +49,8 @@
|
|
static const u_int8_t invmap[] = {
|
|
[ICMPV6_ECHO_REQUEST - 128] = ICMPV6_ECHO_REPLY + 1,
|
|
[ICMPV6_ECHO_REPLY - 128] = ICMPV6_ECHO_REQUEST + 1,
|
|
- [ICMPV6_NI_QUERY - 128] = ICMPV6_NI_REPLY + 1,
|
|
- [ICMPV6_NI_REPLY - 128] = ICMPV6_NI_QUERY +1
|
|
-};
|
|
-
|
|
-static const u_int8_t noct_valid_new[] = {
|
|
- [ICMPV6_MGM_QUERY - 130] = 1,
|
|
- [ICMPV6_MGM_REPORT -130] = 1,
|
|
- [ICMPV6_MGM_REDUCTION - 130] = 1,
|
|
- [NDISC_ROUTER_SOLICITATION - 130] = 1,
|
|
- [NDISC_ROUTER_ADVERTISEMENT - 130] = 1,
|
|
- [NDISC_NEIGHBOUR_SOLICITATION - 130] = 1,
|
|
- [NDISC_NEIGHBOUR_ADVERTISEMENT - 130] = 1,
|
|
- [ICMPV6_MLD2_REPORT - 130] = 1
|
|
+ [ICMPV6_NI_QUERY - 128] = ICMPV6_NI_QUERY + 1,
|
|
+ [ICMPV6_NI_REPLY - 128] = ICMPV6_NI_REPLY +1
|
|
};
|
|
|
|
static bool icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple,
|
|
@@ -189,7 +178,6 @@
|
|
{
|
|
const struct icmp6hdr *icmp6h;
|
|
struct icmp6hdr _ih;
|
|
- int type;
|
|
|
|
icmp6h = skb_header_pointer(skb, dataoff, sizeof(_ih), &_ih);
|
|
if (icmp6h == NULL) {
|
|
@@ -201,21 +189,11 @@
|
|
|
|
if (net->ct.sysctl_checksum && hooknum == NF_INET_PRE_ROUTING &&
|
|
nf_ip6_checksum(skb, hooknum, dataoff, IPPROTO_ICMPV6)) {
|
|
- if (LOG_INVALID(net, IPPROTO_ICMPV6))
|
|
- nf_log_packet(PF_INET6, 0, skb, NULL, NULL, NULL,
|
|
- "nf_ct_icmpv6: ICMPv6 checksum failed ");
|
|
+ nf_log_packet(PF_INET6, 0, skb, NULL, NULL, NULL,
|
|
+ "nf_ct_icmpv6: ICMPv6 checksum failed\n");
|
|
return -NF_ACCEPT;
|
|
}
|
|
|
|
- type = icmp6h->icmp6_type - 130;
|
|
- if (type >= 0 && type < sizeof(noct_valid_new) &&
|
|
- noct_valid_new[type]) {
|
|
- skb->nfct = &nf_conntrack_untracked.ct_general;
|
|
- skb->nfctinfo = IP_CT_NEW;
|
|
- nf_conntrack_get(skb->nfct);
|
|
- return NF_ACCEPT;
|
|
- }
|
|
-
|
|
/* is not error message ? */
|
|
if (icmp6h->icmp6_type >= 128)
|
|
return NF_ACCEPT;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/netfilter/nf_conntrack_reasm.c linux-2.6.29-rc3.owrt/net/ipv6/netfilter/nf_conntrack_reasm.c
|
|
--- linux-2.6.29.owrt/net/ipv6/netfilter/nf_conntrack_reasm.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/netfilter/nf_conntrack_reasm.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -528,14 +528,14 @@
|
|
if (!ipv6_ext_hdr(nexthdr)) {
|
|
return -1;
|
|
}
|
|
- if (nexthdr == NEXTHDR_NONE) {
|
|
- pr_debug("next header is none\n");
|
|
- return -1;
|
|
- }
|
|
if (len < (int)sizeof(struct ipv6_opt_hdr)) {
|
|
pr_debug("too short\n");
|
|
return -1;
|
|
}
|
|
+ if (nexthdr == NEXTHDR_NONE) {
|
|
+ pr_debug("next header is none\n");
|
|
+ return -1;
|
|
+ }
|
|
if (skb_copy_bits(skb, start, &hdr, sizeof(hdr)))
|
|
BUG();
|
|
if (nexthdr == NEXTHDR_AUTH)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/reassembly.c linux-2.6.29-rc3.owrt/net/ipv6/reassembly.c
|
|
--- linux-2.6.29.owrt/net/ipv6/reassembly.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/reassembly.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -452,7 +452,6 @@
|
|
static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
|
|
struct net_device *dev)
|
|
{
|
|
- struct net *net = container_of(fq->q.net, struct net, ipv6.frags);
|
|
struct sk_buff *fp, *head = fq->q.fragments;
|
|
int payload_len;
|
|
unsigned int nhoff;
|
|
@@ -552,7 +551,8 @@
|
|
head->csum);
|
|
|
|
rcu_read_lock();
|
|
- IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMOKS);
|
|
+ IP6_INC_STATS_BH(dev_net(dev),
|
|
+ __in6_dev_get(dev), IPSTATS_MIB_REASMOKS);
|
|
rcu_read_unlock();
|
|
fq->q.fragments = NULL;
|
|
return 1;
|
|
@@ -566,7 +566,8 @@
|
|
printk(KERN_DEBUG "ip6_frag_reasm: no memory for reassembly\n");
|
|
out_fail:
|
|
rcu_read_lock();
|
|
- IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);
|
|
+ IP6_INC_STATS_BH(dev_net(dev),
|
|
+ __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);
|
|
rcu_read_unlock();
|
|
return -1;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/route.c linux-2.6.29-rc3.owrt/net/ipv6/route.c
|
|
--- linux-2.6.29.owrt/net/ipv6/route.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/route.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -794,7 +794,7 @@
|
|
.proto = iph->nexthdr,
|
|
};
|
|
|
|
- if (rt6_need_strict(&iph->daddr) && skb->dev->type != ARPHRD_PIMREG)
|
|
+ if (rt6_need_strict(&iph->daddr))
|
|
flags |= RT6_LOOKUP_F_IFACE;
|
|
|
|
skb->dst = fib6_rule_lookup(net, &fl, flags, ip6_pol_route_input);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/ipv6/sit.c linux-2.6.29-rc3.owrt/net/ipv6/sit.c
|
|
--- linux-2.6.29.owrt/net/ipv6/sit.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/ipv6/sit.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -188,9 +188,9 @@
|
|
}
|
|
|
|
nt = netdev_priv(dev);
|
|
+ ipip6_tunnel_init(dev);
|
|
|
|
nt->parms = *parms;
|
|
- ipip6_tunnel_init(dev);
|
|
|
|
if (parms->i_flags & SIT_ISATAP)
|
|
dev->priv_flags |= IFF_ISATAP;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/mac80211/tx.c linux-2.6.29-rc3.owrt/net/mac80211/tx.c
|
|
--- linux-2.6.29.owrt/net/mac80211/tx.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/mac80211/tx.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -752,8 +752,6 @@
|
|
skb_copy_queue_mapping(frag, first);
|
|
|
|
frag->do_not_encrypt = first->do_not_encrypt;
|
|
- frag->dev = first->dev;
|
|
- frag->iif = first->iif;
|
|
|
|
pos += copylen;
|
|
left -= copylen;
|
|
@@ -1345,8 +1343,6 @@
|
|
list) {
|
|
if (!netif_running(sdata->dev))
|
|
continue;
|
|
- if (sdata->vif.type != NL80211_IFTYPE_AP)
|
|
- continue;
|
|
if (compare_ether_addr(sdata->dev->dev_addr,
|
|
hdr->addr2)) {
|
|
dev_hold(sdata->dev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/netfilter/nf_conntrack_core.c linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_core.c
|
|
--- linux-2.6.29.owrt/net/netfilter/nf_conntrack_core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_core.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -734,7 +734,7 @@
|
|
NF_CT_ASSERT(skb->nfct);
|
|
|
|
ret = l4proto->packet(ct, skb, dataoff, ctinfo, pf, hooknum);
|
|
- if (ret <= 0) {
|
|
+ if (ret < 0) {
|
|
/* Invalid: inverse of the return code tells
|
|
* the netfilter core what to do */
|
|
pr_debug("nf_conntrack_in: Can't track with proto module\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/netfilter/nf_conntrack_netlink.c linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_netlink.c
|
|
--- linux-2.6.29.owrt/net/netfilter/nf_conntrack_netlink.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_netlink.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -434,7 +434,7 @@
|
|
} else
|
|
return NOTIFY_DONE;
|
|
|
|
- if (!item->report && !nfnetlink_has_listeners(group))
|
|
+ if (!nfnetlink_has_listeners(group))
|
|
return NOTIFY_DONE;
|
|
|
|
skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
|
|
@@ -1215,16 +1215,6 @@
|
|
}
|
|
}
|
|
|
|
-#ifdef CONFIG_NF_NAT_NEEDED
|
|
- if (cda[CTA_NAT_SEQ_ADJ_ORIG] || cda[CTA_NAT_SEQ_ADJ_REPLY]) {
|
|
- err = ctnetlink_change_nat_seq_adj(ct, cda);
|
|
- if (err < 0) {
|
|
- rcu_read_unlock();
|
|
- goto err;
|
|
- }
|
|
- }
|
|
-#endif
|
|
-
|
|
if (cda[CTA_PROTOINFO]) {
|
|
err = ctnetlink_change_protoinfo(ct, cda);
|
|
if (err < 0) {
|
|
@@ -1502,8 +1492,7 @@
|
|
} else
|
|
return NOTIFY_DONE;
|
|
|
|
- if (!item->report &&
|
|
- !nfnetlink_has_listeners(NFNLGRP_CONNTRACK_EXP_NEW))
|
|
+ if (!nfnetlink_has_listeners(NFNLGRP_CONNTRACK_EXP_NEW))
|
|
return NOTIFY_DONE;
|
|
|
|
skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
|
|
@@ -1780,7 +1769,6 @@
|
|
goto out;
|
|
}
|
|
|
|
- exp->class = 0;
|
|
exp->expectfn = NULL;
|
|
exp->flags = 0;
|
|
exp->master = ct;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/netfilter/nf_conntrack_proto_tcp.c linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_proto_tcp.c
|
|
--- linux-2.6.29.owrt/net/netfilter/nf_conntrack_proto_tcp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_proto_tcp.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -859,7 +859,7 @@
|
|
*/
|
|
if (nf_ct_kill(ct))
|
|
return -NF_REPEAT;
|
|
- return NF_DROP;
|
|
+ return -NF_DROP;
|
|
}
|
|
/* Fall through */
|
|
case TCP_CONNTRACK_IGNORE:
|
|
@@ -892,7 +892,7 @@
|
|
nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
|
|
"nf_ct_tcp: killing out of sync session ");
|
|
nf_ct_kill(ct);
|
|
- return NF_DROP;
|
|
+ return -NF_DROP;
|
|
}
|
|
ct->proto.tcp.last_index = index;
|
|
ct->proto.tcp.last_dir = dir;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/netfilter/nfnetlink_log.c linux-2.6.29-rc3.owrt/net/netfilter/nfnetlink_log.c
|
|
--- linux-2.6.29.owrt/net/netfilter/nfnetlink_log.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/netfilter/nfnetlink_log.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -39,7 +39,7 @@
|
|
#endif
|
|
|
|
#define NFULNL_NLBUFSIZ_DEFAULT NLMSG_GOODSIZE
|
|
-#define NFULNL_TIMEOUT_DEFAULT 100 /* every second */
|
|
+#define NFULNL_TIMEOUT_DEFAULT HZ /* every second */
|
|
#define NFULNL_QTHRESH_DEFAULT 100 /* 100 packets */
|
|
#define NFULNL_COPY_RANGE_MAX 0xFFFF /* max packet size is limited by 16-bit struct nfattr nfa_len field */
|
|
|
|
@@ -590,10 +590,8 @@
|
|
|
|
qthreshold = inst->qthreshold;
|
|
/* per-rule qthreshold overrides per-instance */
|
|
- if (li->u.ulog.qthreshold)
|
|
- if (qthreshold > li->u.ulog.qthreshold)
|
|
- qthreshold = li->u.ulog.qthreshold;
|
|
-
|
|
+ if (qthreshold > li->u.ulog.qthreshold)
|
|
+ qthreshold = li->u.ulog.qthreshold;
|
|
|
|
switch (inst->copy_mode) {
|
|
case NFULNL_COPY_META:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/netfilter/x_tables.c linux-2.6.29-rc3.owrt/net/netfilter/x_tables.c
|
|
--- linux-2.6.29.owrt/net/netfilter/x_tables.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/netfilter/x_tables.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -827,143 +827,59 @@
|
|
.release = seq_release_net,
|
|
};
|
|
|
|
-/*
|
|
- * Traverse state for ip{,6}_{tables,matches} for helping crossing
|
|
- * the multi-AF mutexes.
|
|
- */
|
|
-struct nf_mttg_trav {
|
|
- struct list_head *head, *curr;
|
|
- uint8_t class, nfproto;
|
|
-};
|
|
-
|
|
-enum {
|
|
- MTTG_TRAV_INIT,
|
|
- MTTG_TRAV_NFP_UNSPEC,
|
|
- MTTG_TRAV_NFP_SPEC,
|
|
- MTTG_TRAV_DONE,
|
|
-};
|
|
-
|
|
-static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos,
|
|
- bool is_target)
|
|
-{
|
|
- static const uint8_t next_class[] = {
|
|
- [MTTG_TRAV_NFP_UNSPEC] = MTTG_TRAV_NFP_SPEC,
|
|
- [MTTG_TRAV_NFP_SPEC] = MTTG_TRAV_DONE,
|
|
- };
|
|
- struct nf_mttg_trav *trav = seq->private;
|
|
-
|
|
- switch (trav->class) {
|
|
- case MTTG_TRAV_INIT:
|
|
- trav->class = MTTG_TRAV_NFP_UNSPEC;
|
|
- mutex_lock(&xt[NFPROTO_UNSPEC].mutex);
|
|
- trav->head = trav->curr = is_target ?
|
|
- &xt[NFPROTO_UNSPEC].target : &xt[NFPROTO_UNSPEC].match;
|
|
- break;
|
|
- case MTTG_TRAV_NFP_UNSPEC:
|
|
- trav->curr = trav->curr->next;
|
|
- if (trav->curr != trav->head)
|
|
- break;
|
|
- mutex_unlock(&xt[NFPROTO_UNSPEC].mutex);
|
|
- mutex_lock(&xt[trav->nfproto].mutex);
|
|
- trav->head = trav->curr = is_target ?
|
|
- &xt[trav->nfproto].target : &xt[trav->nfproto].match;
|
|
- trav->class = next_class[trav->class];
|
|
- break;
|
|
- case MTTG_TRAV_NFP_SPEC:
|
|
- trav->curr = trav->curr->next;
|
|
- if (trav->curr != trav->head)
|
|
- break;
|
|
- /* fallthru, _stop will unlock */
|
|
- default:
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- if (ppos != NULL)
|
|
- ++*ppos;
|
|
- return trav;
|
|
-}
|
|
-
|
|
-static void *xt_mttg_seq_start(struct seq_file *seq, loff_t *pos,
|
|
- bool is_target)
|
|
+static void *xt_match_seq_start(struct seq_file *seq, loff_t *pos)
|
|
{
|
|
- struct nf_mttg_trav *trav = seq->private;
|
|
- unsigned int j;
|
|
+ struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
|
|
+ u_int16_t af = (unsigned long)pde->data;
|
|
|
|
- trav->class = MTTG_TRAV_INIT;
|
|
- for (j = 0; j < *pos; ++j)
|
|
- if (xt_mttg_seq_next(seq, NULL, NULL, is_target) == NULL)
|
|
- return NULL;
|
|
- return trav;
|
|
+ mutex_lock(&xt[af].mutex);
|
|
+ return seq_list_start(&xt[af].match, *pos);
|
|
}
|
|
|
|
-static void xt_mttg_seq_stop(struct seq_file *seq, void *v)
|
|
+static void *xt_match_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
{
|
|
- struct nf_mttg_trav *trav = seq->private;
|
|
+ struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
|
|
+ u_int16_t af = (unsigned long)pde->data;
|
|
|
|
- switch (trav->class) {
|
|
- case MTTG_TRAV_NFP_UNSPEC:
|
|
- mutex_unlock(&xt[NFPROTO_UNSPEC].mutex);
|
|
- break;
|
|
- case MTTG_TRAV_NFP_SPEC:
|
|
- mutex_unlock(&xt[trav->nfproto].mutex);
|
|
- break;
|
|
- }
|
|
+ return seq_list_next(v, &xt[af].match, pos);
|
|
}
|
|
|
|
-static void *xt_match_seq_start(struct seq_file *seq, loff_t *pos)
|
|
+static void xt_match_seq_stop(struct seq_file *seq, void *v)
|
|
{
|
|
- return xt_mttg_seq_start(seq, pos, false);
|
|
-}
|
|
+ struct proc_dir_entry *pde = seq->private;
|
|
+ u_int16_t af = (unsigned long)pde->data;
|
|
|
|
-static void *xt_match_seq_next(struct seq_file *seq, void *v, loff_t *ppos)
|
|
-{
|
|
- return xt_mttg_seq_next(seq, v, ppos, false);
|
|
+ mutex_unlock(&xt[af].mutex);
|
|
}
|
|
|
|
static int xt_match_seq_show(struct seq_file *seq, void *v)
|
|
{
|
|
- const struct nf_mttg_trav *trav = seq->private;
|
|
- const struct xt_match *match;
|
|
+ struct xt_match *match = list_entry(v, struct xt_match, list);
|
|
|
|
- switch (trav->class) {
|
|
- case MTTG_TRAV_NFP_UNSPEC:
|
|
- case MTTG_TRAV_NFP_SPEC:
|
|
- if (trav->curr == trav->head)
|
|
- return 0;
|
|
- match = list_entry(trav->curr, struct xt_match, list);
|
|
- return (*match->name == '\0') ? 0 :
|
|
- seq_printf(seq, "%s\n", match->name);
|
|
- }
|
|
- return 0;
|
|
+ if (strlen(match->name))
|
|
+ return seq_printf(seq, "%s\n", match->name);
|
|
+ else
|
|
+ return 0;
|
|
}
|
|
|
|
static const struct seq_operations xt_match_seq_ops = {
|
|
.start = xt_match_seq_start,
|
|
.next = xt_match_seq_next,
|
|
- .stop = xt_mttg_seq_stop,
|
|
+ .stop = xt_match_seq_stop,
|
|
.show = xt_match_seq_show,
|
|
};
|
|
|
|
static int xt_match_open(struct inode *inode, struct file *file)
|
|
{
|
|
- struct seq_file *seq;
|
|
- struct nf_mttg_trav *trav;
|
|
int ret;
|
|
|
|
- trav = kmalloc(sizeof(*trav), GFP_KERNEL);
|
|
- if (trav == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
ret = seq_open(file, &xt_match_seq_ops);
|
|
- if (ret < 0) {
|
|
- kfree(trav);
|
|
- return ret;
|
|
- }
|
|
+ if (!ret) {
|
|
+ struct seq_file *seq = file->private_data;
|
|
|
|
- seq = file->private_data;
|
|
- seq->private = trav;
|
|
- trav->nfproto = (unsigned long)PDE(inode)->data;
|
|
- return 0;
|
|
+ seq->private = PDE(inode);
|
|
+ }
|
|
+ return ret;
|
|
}
|
|
|
|
static const struct file_operations xt_match_ops = {
|
|
@@ -971,63 +887,62 @@
|
|
.open = xt_match_open,
|
|
.read = seq_read,
|
|
.llseek = seq_lseek,
|
|
- .release = seq_release_private,
|
|
+ .release = seq_release,
|
|
};
|
|
|
|
static void *xt_target_seq_start(struct seq_file *seq, loff_t *pos)
|
|
{
|
|
- return xt_mttg_seq_start(seq, pos, true);
|
|
+ struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
|
|
+ u_int16_t af = (unsigned long)pde->data;
|
|
+
|
|
+ mutex_lock(&xt[af].mutex);
|
|
+ return seq_list_start(&xt[af].target, *pos);
|
|
}
|
|
|
|
-static void *xt_target_seq_next(struct seq_file *seq, void *v, loff_t *ppos)
|
|
+static void *xt_target_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
{
|
|
- return xt_mttg_seq_next(seq, v, ppos, true);
|
|
+ struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
|
|
+ u_int16_t af = (unsigned long)pde->data;
|
|
+
|
|
+ return seq_list_next(v, &xt[af].target, pos);
|
|
+}
|
|
+
|
|
+static void xt_target_seq_stop(struct seq_file *seq, void *v)
|
|
+{
|
|
+ struct proc_dir_entry *pde = seq->private;
|
|
+ u_int16_t af = (unsigned long)pde->data;
|
|
+
|
|
+ mutex_unlock(&xt[af].mutex);
|
|
}
|
|
|
|
static int xt_target_seq_show(struct seq_file *seq, void *v)
|
|
{
|
|
- const struct nf_mttg_trav *trav = seq->private;
|
|
- const struct xt_target *target;
|
|
+ struct xt_target *target = list_entry(v, struct xt_target, list);
|
|
|
|
- switch (trav->class) {
|
|
- case MTTG_TRAV_NFP_UNSPEC:
|
|
- case MTTG_TRAV_NFP_SPEC:
|
|
- if (trav->curr == trav->head)
|
|
- return 0;
|
|
- target = list_entry(trav->curr, struct xt_target, list);
|
|
- return (*target->name == '\0') ? 0 :
|
|
- seq_printf(seq, "%s\n", target->name);
|
|
- }
|
|
- return 0;
|
|
+ if (strlen(target->name))
|
|
+ return seq_printf(seq, "%s\n", target->name);
|
|
+ else
|
|
+ return 0;
|
|
}
|
|
|
|
static const struct seq_operations xt_target_seq_ops = {
|
|
.start = xt_target_seq_start,
|
|
.next = xt_target_seq_next,
|
|
- .stop = xt_mttg_seq_stop,
|
|
+ .stop = xt_target_seq_stop,
|
|
.show = xt_target_seq_show,
|
|
};
|
|
|
|
static int xt_target_open(struct inode *inode, struct file *file)
|
|
{
|
|
- struct seq_file *seq;
|
|
- struct nf_mttg_trav *trav;
|
|
int ret;
|
|
|
|
- trav = kmalloc(sizeof(*trav), GFP_KERNEL);
|
|
- if (trav == NULL)
|
|
- return -ENOMEM;
|
|
-
|
|
ret = seq_open(file, &xt_target_seq_ops);
|
|
- if (ret < 0) {
|
|
- kfree(trav);
|
|
- return ret;
|
|
- }
|
|
+ if (!ret) {
|
|
+ struct seq_file *seq = file->private_data;
|
|
|
|
- seq = file->private_data;
|
|
- seq->private = trav;
|
|
- trav->nfproto = (unsigned long)PDE(inode)->data;
|
|
- return 0;
|
|
+ seq->private = PDE(inode);
|
|
+ }
|
|
+ return ret;
|
|
}
|
|
|
|
static const struct file_operations xt_target_ops = {
|
|
@@ -1035,7 +950,7 @@
|
|
.open = xt_target_open,
|
|
.read = seq_read,
|
|
.llseek = seq_lseek,
|
|
- .release = seq_release_private,
|
|
+ .release = seq_release,
|
|
};
|
|
|
|
#define FORMAT_TABLES "_tables_names"
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/netfilter/xt_recent.c linux-2.6.29-rc3.owrt/net/netfilter/xt_recent.c
|
|
--- linux-2.6.29.owrt/net/netfilter/xt_recent.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/netfilter/xt_recent.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -542,7 +542,7 @@
|
|
struct recent_entry *e;
|
|
char buf[sizeof("+b335:1d35:1e55:dead:c0de:1715:5afe:c0de")];
|
|
const char *c = buf;
|
|
- union nf_inet_addr addr = {};
|
|
+ union nf_inet_addr addr;
|
|
u_int16_t family;
|
|
bool add, succ;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/netfilter/xt_sctp.c linux-2.6.29-rc3.owrt/net/netfilter/xt_sctp.c
|
|
--- linux-2.6.29.owrt/net/netfilter/xt_sctp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/netfilter/xt_sctp.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -105,7 +105,7 @@
|
|
|
|
switch (chunk_match_type) {
|
|
case SCTP_CHUNK_MATCH_ALL:
|
|
- return SCTP_CHUNKMAP_IS_CLEAR(chunkmapcopy);
|
|
+ return SCTP_CHUNKMAP_IS_CLEAR(info->chunkmap);
|
|
case SCTP_CHUNK_MATCH_ANY:
|
|
return false;
|
|
case SCTP_CHUNK_MATCH_ONLY:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/netlink/af_netlink.c linux-2.6.29-rc3.owrt/net/netlink/af_netlink.c
|
|
--- linux-2.6.29.owrt/net/netlink/af_netlink.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/netlink/af_netlink.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1084,13 +1084,6 @@
|
|
return 0;
|
|
}
|
|
|
|
-/**
|
|
- * netlink_set_err - report error to broadcast listeners
|
|
- * @ssk: the kernel netlink socket, as returned by netlink_kernel_create()
|
|
- * @pid: the PID of a process that we want to skip (if any)
|
|
- * @groups: the broadcast group that will notice the error
|
|
- * @code: error code, must be negative (as usual in kernelspace)
|
|
- */
|
|
void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code)
|
|
{
|
|
struct netlink_set_err_data info;
|
|
@@ -1100,8 +1093,7 @@
|
|
info.exclude_sk = ssk;
|
|
info.pid = pid;
|
|
info.group = group;
|
|
- /* sk->sk_err wants a positive error value */
|
|
- info.code = -code;
|
|
+ info.code = code;
|
|
|
|
read_lock(&nl_table_lock);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/packet/af_packet.c linux-2.6.29-rc3.owrt/net/packet/af_packet.c
|
|
--- linux-2.6.29.owrt/net/packet/af_packet.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/packet/af_packet.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -77,7 +77,6 @@
|
|
#include <linux/poll.h>
|
|
#include <linux/module.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/mutex.h>
|
|
|
|
#ifdef CONFIG_INET
|
|
#include <net/inet_common.h>
|
|
@@ -176,7 +175,6 @@
|
|
#endif
|
|
struct packet_type prot_hook;
|
|
spinlock_t bind_lock;
|
|
- struct mutex pg_vec_lock;
|
|
unsigned int running:1, /* prot_hook is attached*/
|
|
auxdata:1,
|
|
origdev:1;
|
|
@@ -223,13 +221,13 @@
|
|
h.raw = po->pg_vec[pg_vec_pos] + (frame_offset * po->frame_size);
|
|
switch (po->tp_version) {
|
|
case TPACKET_V1:
|
|
- if (status != (h.h1->tp_status ? TP_STATUS_USER :
|
|
- TP_STATUS_KERNEL))
|
|
+ if (status != h.h1->tp_status ? TP_STATUS_USER :
|
|
+ TP_STATUS_KERNEL)
|
|
return NULL;
|
|
break;
|
|
case TPACKET_V2:
|
|
- if (status != (h.h2->tp_status ? TP_STATUS_USER :
|
|
- TP_STATUS_KERNEL))
|
|
+ if (status != h.h2->tp_status ? TP_STATUS_USER :
|
|
+ TP_STATUS_KERNEL)
|
|
return NULL;
|
|
break;
|
|
}
|
|
@@ -1074,7 +1072,6 @@
|
|
*/
|
|
|
|
spin_lock_init(&po->bind_lock);
|
|
- mutex_init(&po->pg_vec_lock);
|
|
po->prot_hook.func = packet_rcv;
|
|
po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK);
|
|
|
|
@@ -1889,7 +1886,6 @@
|
|
synchronize_net();
|
|
|
|
err = -EBUSY;
|
|
- mutex_lock(&po->pg_vec_lock);
|
|
if (closing || atomic_read(&po->mapped) == 0) {
|
|
err = 0;
|
|
#define XC(a, b) ({ __typeof__ ((a)) __t; __t = (a); (a) = (b); __t; })
|
|
@@ -1911,7 +1907,6 @@
|
|
if (atomic_read(&po->mapped))
|
|
printk(KERN_DEBUG "packet_mmap: vma is busy: %d\n", atomic_read(&po->mapped));
|
|
}
|
|
- mutex_unlock(&po->pg_vec_lock);
|
|
|
|
spin_lock(&po->bind_lock);
|
|
if (was_running && !po->running) {
|
|
@@ -1944,7 +1939,7 @@
|
|
|
|
size = vma->vm_end - vma->vm_start;
|
|
|
|
- mutex_lock(&po->pg_vec_lock);
|
|
+ lock_sock(sk);
|
|
if (po->pg_vec == NULL)
|
|
goto out;
|
|
if (size != po->pg_vec_len*po->pg_vec_pages*PAGE_SIZE)
|
|
@@ -1967,7 +1962,7 @@
|
|
err = 0;
|
|
|
|
out:
|
|
- mutex_unlock(&po->pg_vec_lock);
|
|
+ release_sock(sk);
|
|
return err;
|
|
}
|
|
#endif
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/phonet/pep.c linux-2.6.29-rc3.owrt/net/phonet/pep.c
|
|
--- linux-2.6.29.owrt/net/phonet/pep.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/phonet/pep.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -553,7 +553,7 @@
|
|
{
|
|
struct pep_sock *pn = pep_sk(sk);
|
|
struct sock *sknode;
|
|
- struct pnpipehdr *hdr;
|
|
+ struct pnpipehdr *hdr = pnp_hdr(skb);
|
|
struct sockaddr_pn dst;
|
|
int err = NET_RX_SUCCESS;
|
|
u8 pipe_handle;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/phonet/pep-gprs.c linux-2.6.29-rc3.owrt/net/phonet/pep-gprs.c
|
|
--- linux-2.6.29.owrt/net/phonet/pep-gprs.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/phonet/pep-gprs.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -207,6 +207,7 @@
|
|
dev->name, err);
|
|
dev->stats.tx_aborted_errors++;
|
|
dev->stats.tx_errors++;
|
|
+ dev_kfree_skb(skb);
|
|
} else {
|
|
dev->stats.tx_packets++;
|
|
dev->stats.tx_bytes += len;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/rxrpc/af_rxrpc.c linux-2.6.29-rc3.owrt/net/rxrpc/af_rxrpc.c
|
|
--- linux-2.6.29.owrt/net/rxrpc/af_rxrpc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/rxrpc/af_rxrpc.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -284,13 +284,13 @@
|
|
if (IS_ERR(trans)) {
|
|
call = ERR_CAST(trans);
|
|
trans = NULL;
|
|
- goto out_notrans;
|
|
+ goto out;
|
|
}
|
|
} else {
|
|
trans = rx->trans;
|
|
if (!trans) {
|
|
call = ERR_PTR(-ENOTCONN);
|
|
- goto out_notrans;
|
|
+ goto out;
|
|
}
|
|
atomic_inc(&trans->usage);
|
|
}
|
|
@@ -315,7 +315,6 @@
|
|
rxrpc_put_bundle(trans, bundle);
|
|
out:
|
|
rxrpc_put_transport(trans);
|
|
-out_notrans:
|
|
release_sock(&rx->sk);
|
|
_leave(" = %p", call);
|
|
return call;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sched/act_police.c linux-2.6.29-rc3.owrt/net/sched/act_police.c
|
|
--- linux-2.6.29.owrt/net/sched/act_police.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sched/act_police.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -183,6 +183,13 @@
|
|
if (R_tab == NULL)
|
|
goto failure;
|
|
|
|
+ if (!est && (ret == ACT_P_CREATED ||
|
|
+ !gen_estimator_active(&police->tcf_bstats,
|
|
+ &police->tcf_rate_est))) {
|
|
+ err = -EINVAL;
|
|
+ goto failure;
|
|
+ }
|
|
+
|
|
if (parm->peakrate.rate) {
|
|
P_tab = qdisc_get_rtab(&parm->peakrate,
|
|
tb[TCA_POLICE_PEAKRATE]);
|
|
@@ -198,12 +205,6 @@
|
|
&police->tcf_lock, est);
|
|
if (err)
|
|
goto failure_unlock;
|
|
- } else if (tb[TCA_POLICE_AVRATE] &&
|
|
- (ret == ACT_P_CREATED ||
|
|
- !gen_estimator_active(&police->tcf_bstats,
|
|
- &police->tcf_rate_est))) {
|
|
- err = -EINVAL;
|
|
- goto failure_unlock;
|
|
}
|
|
|
|
/* No failure allowed after this point */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sched/sch_drr.c linux-2.6.29-rc3.owrt/net/sched/sch_drr.c
|
|
--- linux-2.6.29.owrt/net/sched/sch_drr.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sched/sch_drr.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -66,15 +66,11 @@
|
|
{
|
|
struct drr_sched *q = qdisc_priv(sch);
|
|
struct drr_class *cl = (struct drr_class *)*arg;
|
|
- struct nlattr *opt = tca[TCA_OPTIONS];
|
|
struct nlattr *tb[TCA_DRR_MAX + 1];
|
|
u32 quantum;
|
|
int err;
|
|
|
|
- if (!opt)
|
|
- return -EINVAL;
|
|
-
|
|
- err = nla_parse_nested(tb, TCA_DRR_MAX, opt, drr_policy);
|
|
+ err = nla_parse_nested(tb, TCA_DRR_MAX, tca[TCA_OPTIONS], drr_policy);
|
|
if (err < 0)
|
|
return err;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sctp/endpointola.c linux-2.6.29-rc3.owrt/net/sctp/endpointola.c
|
|
--- linux-2.6.29.owrt/net/sctp/endpointola.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sctp/endpointola.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -111,8 +111,7 @@
|
|
if (sctp_addip_enable) {
|
|
auth_chunks->chunks[0] = SCTP_CID_ASCONF;
|
|
auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK;
|
|
- auth_chunks->param_hdr.length =
|
|
- htons(sizeof(sctp_paramhdr_t) + 2);
|
|
+ auth_chunks->param_hdr.length += htons(2);
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sctp/protocol.c linux-2.6.29-rc3.owrt/net/sctp/protocol.c
|
|
--- linux-2.6.29.owrt/net/sctp/protocol.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sctp/protocol.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -717,20 +717,15 @@
|
|
static int sctp_ctl_sock_init(void)
|
|
{
|
|
int err;
|
|
- sa_family_t family = PF_INET;
|
|
+ sa_family_t family;
|
|
|
|
if (sctp_get_pf_specific(PF_INET6))
|
|
family = PF_INET6;
|
|
+ else
|
|
+ family = PF_INET;
|
|
|
|
err = inet_ctl_sock_create(&sctp_ctl_sock, family,
|
|
SOCK_SEQPACKET, IPPROTO_SCTP, &init_net);
|
|
-
|
|
- /* If IPv6 socket could not be created, try the IPv4 socket */
|
|
- if (err < 0 && family == PF_INET6)
|
|
- err = inet_ctl_sock_create(&sctp_ctl_sock, AF_INET,
|
|
- SOCK_SEQPACKET, IPPROTO_SCTP,
|
|
- &init_net);
|
|
-
|
|
if (err < 0) {
|
|
printk(KERN_ERR
|
|
"SCTP: Failed to create the SCTP control socket.\n");
|
|
@@ -1327,8 +1322,9 @@
|
|
out:
|
|
return status;
|
|
err_v6_add_protocol:
|
|
- sctp_v4_del_protocol();
|
|
+ sctp_v6_del_protocol();
|
|
err_add_protocol:
|
|
+ sctp_v4_del_protocol();
|
|
inet_ctl_sock_destroy(sctp_ctl_sock);
|
|
err_ctl_sock_init:
|
|
sctp_v6_protosw_exit();
|
|
@@ -1339,6 +1335,7 @@
|
|
sctp_v4_pf_exit();
|
|
sctp_v6_pf_exit();
|
|
sctp_sysctl_unregister();
|
|
+ list_del(&sctp_af_inet.list);
|
|
free_pages((unsigned long)sctp_port_hashtable,
|
|
get_order(sctp_port_hashsize *
|
|
sizeof(struct sctp_bind_hashbucket)));
|
|
@@ -1386,6 +1383,7 @@
|
|
sctp_v4_pf_exit();
|
|
|
|
sctp_sysctl_unregister();
|
|
+ list_del(&sctp_af_inet.list);
|
|
|
|
free_pages((unsigned long)sctp_assoc_hashtable,
|
|
get_order(sctp_assoc_hashsize *
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sctp/sm_sideeffect.c linux-2.6.29-rc3.owrt/net/sctp/sm_sideeffect.c
|
|
--- linux-2.6.29.owrt/net/sctp/sm_sideeffect.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sctp/sm_sideeffect.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -787,48 +787,36 @@
|
|
struct sctp_association *asoc,
|
|
struct sctp_chunk *chunk)
|
|
{
|
|
+ struct sctp_operr_chunk *operr_chunk;
|
|
struct sctp_errhdr *err_hdr;
|
|
- struct sctp_ulpevent *ev;
|
|
-
|
|
- while (chunk->chunk_end > chunk->skb->data) {
|
|
- err_hdr = (struct sctp_errhdr *)(chunk->skb->data);
|
|
|
|
- ev = sctp_ulpevent_make_remote_error(asoc, chunk, 0,
|
|
- GFP_ATOMIC);
|
|
- if (!ev)
|
|
- return;
|
|
-
|
|
- sctp_ulpq_tail_event(&asoc->ulpq, ev);
|
|
+ operr_chunk = (struct sctp_operr_chunk *)chunk->chunk_hdr;
|
|
+ err_hdr = &operr_chunk->err_hdr;
|
|
|
|
- switch (err_hdr->cause) {
|
|
- case SCTP_ERROR_UNKNOWN_CHUNK:
|
|
- {
|
|
- sctp_chunkhdr_t *unk_chunk_hdr;
|
|
-
|
|
- unk_chunk_hdr = (sctp_chunkhdr_t *)err_hdr->variable;
|
|
- switch (unk_chunk_hdr->type) {
|
|
- /* ADDIP 4.1 A9) If the peer responds to an ASCONF with
|
|
- * an ERROR chunk reporting that it did not recognized
|
|
- * the ASCONF chunk type, the sender of the ASCONF MUST
|
|
- * NOT send any further ASCONF chunks and MUST stop its
|
|
- * T-4 timer.
|
|
- */
|
|
- case SCTP_CID_ASCONF:
|
|
- if (asoc->peer.asconf_capable == 0)
|
|
- break;
|
|
-
|
|
- asoc->peer.asconf_capable = 0;
|
|
- sctp_add_cmd_sf(cmds, SCTP_CMD_TIMER_STOP,
|
|
+ switch (err_hdr->cause) {
|
|
+ case SCTP_ERROR_UNKNOWN_CHUNK:
|
|
+ {
|
|
+ struct sctp_chunkhdr *unk_chunk_hdr;
|
|
+
|
|
+ unk_chunk_hdr = (struct sctp_chunkhdr *)err_hdr->variable;
|
|
+ switch (unk_chunk_hdr->type) {
|
|
+ /* ADDIP 4.1 A9) If the peer responds to an ASCONF with an
|
|
+ * ERROR chunk reporting that it did not recognized the ASCONF
|
|
+ * chunk type, the sender of the ASCONF MUST NOT send any
|
|
+ * further ASCONF chunks and MUST stop its T-4 timer.
|
|
+ */
|
|
+ case SCTP_CID_ASCONF:
|
|
+ asoc->peer.asconf_capable = 0;
|
|
+ sctp_add_cmd_sf(cmds, SCTP_CMD_TIMER_STOP,
|
|
SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
break;
|
|
- }
|
|
default:
|
|
break;
|
|
}
|
|
+ break;
|
|
+ }
|
|
+ default:
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sctp/sm_statefuns.c linux-2.6.29-rc3.owrt/net/sctp/sm_statefuns.c
|
|
--- linux-2.6.29.owrt/net/sctp/sm_statefuns.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sctp/sm_statefuns.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -3163,6 +3163,7 @@
|
|
sctp_cmd_seq_t *commands)
|
|
{
|
|
struct sctp_chunk *chunk = arg;
|
|
+ struct sctp_ulpevent *ev;
|
|
|
|
if (!sctp_vtag_verify(chunk, asoc))
|
|
return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
|
|
@@ -3172,10 +3173,21 @@
|
|
return sctp_sf_violation_chunklen(ep, asoc, type, arg,
|
|
commands);
|
|
|
|
- sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
|
|
- SCTP_CHUNK(chunk));
|
|
+ while (chunk->chunk_end > chunk->skb->data) {
|
|
+ ev = sctp_ulpevent_make_remote_error(asoc, chunk, 0,
|
|
+ GFP_ATOMIC);
|
|
+ if (!ev)
|
|
+ goto nomem;
|
|
|
|
+ sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
|
|
+ SCTP_ULPEVENT(ev));
|
|
+ sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
|
|
+ SCTP_CHUNK(chunk));
|
|
+ }
|
|
return SCTP_DISPOSITION_CONSUME;
|
|
+
|
|
+nomem:
|
|
+ return SCTP_DISPOSITION_NOMEM;
|
|
}
|
|
|
|
/*
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sunrpc/Kconfig linux-2.6.29-rc3.owrt/net/sunrpc/Kconfig
|
|
--- linux-2.6.29.owrt/net/sunrpc/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sunrpc/Kconfig 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -6,7 +6,7 @@
|
|
|
|
config SUNRPC_XPRT_RDMA
|
|
tristate
|
|
- depends on SUNRPC && INFINIBAND && INFINIBAND_ADDR_TRANS && EXPERIMENTAL
|
|
+ depends on SUNRPC && INFINIBAND && EXPERIMENTAL
|
|
default SUNRPC && INFINIBAND
|
|
help
|
|
This option allows the NFS client and server to support
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sunrpc/sched.c linux-2.6.29-rc3.owrt/net/sunrpc/sched.c
|
|
--- linux-2.6.29.owrt/net/sunrpc/sched.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sunrpc/sched.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -293,6 +293,11 @@
|
|
rpc_clear_queued(task);
|
|
if (rpc_test_and_set_running(task))
|
|
return;
|
|
+ /* We might have raced */
|
|
+ if (RPC_IS_QUEUED(task)) {
|
|
+ rpc_clear_running(task);
|
|
+ return;
|
|
+ }
|
|
if (RPC_IS_ASYNC(task)) {
|
|
int status;
|
|
|
|
@@ -602,9 +607,7 @@
|
|
*/
|
|
static void __rpc_execute(struct rpc_task *task)
|
|
{
|
|
- struct rpc_wait_queue *queue;
|
|
- int task_is_async = RPC_IS_ASYNC(task);
|
|
- int status = 0;
|
|
+ int status = 0;
|
|
|
|
dprintk("RPC: %5u __rpc_execute flags=0x%x\n",
|
|
task->tk_pid, task->tk_flags);
|
|
@@ -644,25 +647,15 @@
|
|
*/
|
|
if (!RPC_IS_QUEUED(task))
|
|
continue;
|
|
- /*
|
|
- * The queue->lock protects against races with
|
|
- * rpc_make_runnable().
|
|
- *
|
|
- * Note that once we clear RPC_TASK_RUNNING on an asynchronous
|
|
- * rpc_task, rpc_make_runnable() can assign it to a
|
|
- * different workqueue. We therefore cannot assume that the
|
|
- * rpc_task pointer may still be dereferenced.
|
|
- */
|
|
- queue = task->tk_waitqueue;
|
|
- spin_lock_bh(&queue->lock);
|
|
- if (!RPC_IS_QUEUED(task)) {
|
|
- spin_unlock_bh(&queue->lock);
|
|
+ rpc_clear_running(task);
|
|
+ if (RPC_IS_ASYNC(task)) {
|
|
+ /* Careful! we may have raced... */
|
|
+ if (RPC_IS_QUEUED(task))
|
|
+ return;
|
|
+ if (rpc_test_and_set_running(task))
|
|
+ return;
|
|
continue;
|
|
}
|
|
- rpc_clear_running(task);
|
|
- spin_unlock_bh(&queue->lock);
|
|
- if (task_is_async)
|
|
- return;
|
|
|
|
/* sync task: sleep here */
|
|
dprintk("RPC: %5u sync task going to sleep\n", task->tk_pid);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sunrpc/xprt.c linux-2.6.29-rc3.owrt/net/sunrpc/xprt.c
|
|
--- linux-2.6.29.owrt/net/sunrpc/xprt.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sunrpc/xprt.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -663,7 +663,7 @@
|
|
xprt, (xprt_connected(xprt) ? "is" : "is not"));
|
|
|
|
if (!xprt_bound(xprt)) {
|
|
- task->tk_status = -EAGAIN;
|
|
+ task->tk_status = -EIO;
|
|
return;
|
|
}
|
|
if (!xprt_lock_write(xprt, task))
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/sunrpc/xprtsock.c linux-2.6.29-rc3.owrt/net/sunrpc/xprtsock.c
|
|
--- linux-2.6.29.owrt/net/sunrpc/xprtsock.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/sunrpc/xprtsock.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -467,7 +467,7 @@
|
|
int err, sent = 0;
|
|
|
|
if (unlikely(!sock))
|
|
- return -ENOTSOCK;
|
|
+ return -ENOTCONN;
|
|
|
|
clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
|
|
if (base != 0) {
|
|
@@ -577,8 +577,6 @@
|
|
req->rq_svec->iov_base,
|
|
req->rq_svec->iov_len);
|
|
|
|
- if (!xprt_bound(xprt))
|
|
- return -ENOTCONN;
|
|
status = xs_sendpages(transport->sock,
|
|
xs_addr(xprt),
|
|
xprt->addrlen, xdr,
|
|
@@ -596,10 +594,6 @@
|
|
}
|
|
|
|
switch (status) {
|
|
- case -ENOTSOCK:
|
|
- status = -ENOTCONN;
|
|
- /* Should we call xs_close() here? */
|
|
- break;
|
|
case -EAGAIN:
|
|
xs_nospace(task);
|
|
break;
|
|
@@ -699,10 +693,6 @@
|
|
}
|
|
|
|
switch (status) {
|
|
- case -ENOTSOCK:
|
|
- status = -ENOTCONN;
|
|
- /* Should we call xs_close() here? */
|
|
- break;
|
|
case -EAGAIN:
|
|
xs_nospace(task);
|
|
break;
|
|
@@ -1533,7 +1523,7 @@
|
|
struct socket *sock = transport->sock;
|
|
int err, status = -EIO;
|
|
|
|
- if (xprt->shutdown)
|
|
+ if (xprt->shutdown || !xprt_bound(xprt))
|
|
goto out;
|
|
|
|
/* Start by resetting any existing state */
|
|
@@ -1574,7 +1564,7 @@
|
|
struct socket *sock = transport->sock;
|
|
int err, status = -EIO;
|
|
|
|
- if (xprt->shutdown)
|
|
+ if (xprt->shutdown || !xprt_bound(xprt))
|
|
goto out;
|
|
|
|
/* Start by resetting any existing state */
|
|
@@ -1658,9 +1648,6 @@
|
|
write_unlock_bh(&sk->sk_callback_lock);
|
|
}
|
|
|
|
- if (!xprt_bound(xprt))
|
|
- return -ENOTCONN;
|
|
-
|
|
/* Tell the socket layer to start connecting... */
|
|
xprt->stat.connect_count++;
|
|
xprt->stat.connect_start = jiffies;
|
|
@@ -1681,7 +1668,7 @@
|
|
struct socket *sock = transport->sock;
|
|
int err, status = -EIO;
|
|
|
|
- if (xprt->shutdown)
|
|
+ if (xprt->shutdown || !xprt_bound(xprt))
|
|
goto out;
|
|
|
|
if (!sock) {
|
|
@@ -1741,7 +1728,7 @@
|
|
struct socket *sock = transport->sock;
|
|
int err, status = -EIO;
|
|
|
|
- if (xprt->shutdown)
|
|
+ if (xprt->shutdown || !xprt_bound(xprt))
|
|
goto out;
|
|
|
|
if (!sock) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/wimax/debugfs.c linux-2.6.29-rc3.owrt/net/wimax/debugfs.c
|
|
--- linux-2.6.29.owrt/net/wimax/debugfs.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/wimax/debugfs.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -28,6 +28,17 @@
|
|
#include "debug-levels.h"
|
|
|
|
|
|
+/* Debug framework control of debug levels */
|
|
+struct d_level D_LEVEL[] = {
|
|
+ D_SUBMODULE_DEFINE(debugfs),
|
|
+ D_SUBMODULE_DEFINE(id_table),
|
|
+ D_SUBMODULE_DEFINE(op_msg),
|
|
+ D_SUBMODULE_DEFINE(op_reset),
|
|
+ D_SUBMODULE_DEFINE(op_rfkill),
|
|
+ D_SUBMODULE_DEFINE(stack),
|
|
+};
|
|
+size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
|
|
+
|
|
#define __debugfs_register(prefix, name, parent) \
|
|
do { \
|
|
result = d_level_register_debugfs(prefix, name, parent); \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/wimax/id-table.c linux-2.6.29-rc3.owrt/net/wimax/id-table.c
|
|
--- linux-2.6.29.owrt/net/wimax/id-table.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/wimax/id-table.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -94,13 +94,12 @@
|
|
list_for_each_entry(wimax_dev, &wimax_id_table, id_table_node) {
|
|
if (wimax_dev->net_dev->ifindex == ifindex) {
|
|
dev_hold(wimax_dev->net_dev);
|
|
- goto found;
|
|
+ break;
|
|
}
|
|
}
|
|
- wimax_dev = NULL;
|
|
- d_printf(1, NULL, "wimax: no devices found with ifindex %d\n",
|
|
- ifindex);
|
|
-found:
|
|
+ if (wimax_dev == NULL)
|
|
+ d_printf(1, NULL, "wimax: no devices found with ifindex %d\n",
|
|
+ ifindex);
|
|
spin_unlock(&wimax_id_table_lock);
|
|
d_fnend(3, NULL, "(info %p ifindex %d) = %p\n",
|
|
info, ifindex, wimax_dev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/wimax/stack.c linux-2.6.29-rc3.owrt/net/wimax/stack.c
|
|
--- linux-2.6.29.owrt/net/wimax/stack.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/wimax/stack.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -516,19 +516,6 @@
|
|
}
|
|
EXPORT_SYMBOL_GPL(wimax_dev_rm);
|
|
|
|
-
|
|
-/* Debug framework control of debug levels */
|
|
-struct d_level D_LEVEL[] = {
|
|
- D_SUBMODULE_DEFINE(debugfs),
|
|
- D_SUBMODULE_DEFINE(id_table),
|
|
- D_SUBMODULE_DEFINE(op_msg),
|
|
- D_SUBMODULE_DEFINE(op_reset),
|
|
- D_SUBMODULE_DEFINE(op_rfkill),
|
|
- D_SUBMODULE_DEFINE(stack),
|
|
-};
|
|
-size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
|
|
-
|
|
-
|
|
struct genl_family wimax_gnl_family = {
|
|
.id = GENL_ID_GENERATE,
|
|
.name = "WiMAX",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/wireless/Kconfig linux-2.6.29-rc3.owrt/net/wireless/Kconfig
|
|
--- linux-2.6.29.owrt/net/wireless/Kconfig 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/wireless/Kconfig 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -102,13 +102,3 @@
|
|
|
|
config LIB80211_CRYPT_TKIP
|
|
tristate
|
|
-
|
|
-config LIB80211_DEBUG
|
|
- bool "lib80211 debugging messages"
|
|
- depends on LIB80211
|
|
- default n
|
|
- ---help---
|
|
- You can enable this if you want verbose debugging messages
|
|
- from lib80211.
|
|
-
|
|
- If unsure, say N.
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/wireless/lib80211_crypt_ccmp.c linux-2.6.29-rc3.owrt/net/wireless/lib80211_crypt_ccmp.c
|
|
--- linux-2.6.29.owrt/net/wireless/lib80211_crypt_ccmp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/wireless/lib80211_crypt_ccmp.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -337,7 +337,6 @@
|
|
pos += 8;
|
|
|
|
if (ccmp_replay_check(pn, key->rx_pn)) {
|
|
-#ifdef CONFIG_LIB80211_DEBUG
|
|
if (net_ratelimit()) {
|
|
printk(KERN_DEBUG "CCMP: replay detected: STA=%pM "
|
|
"previous PN %02x%02x%02x%02x%02x%02x "
|
|
@@ -347,7 +346,6 @@
|
|
key->rx_pn[3], key->rx_pn[4], key->rx_pn[5],
|
|
pn[0], pn[1], pn[2], pn[3], pn[4], pn[5]);
|
|
}
|
|
-#endif
|
|
key->dot11RSNAStatsCCMPReplays++;
|
|
return -4;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/wireless/lib80211_crypt_tkip.c linux-2.6.29-rc3.owrt/net/wireless/lib80211_crypt_tkip.c
|
|
--- linux-2.6.29.owrt/net/wireless/lib80211_crypt_tkip.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/wireless/lib80211_crypt_tkip.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -465,14 +465,12 @@
|
|
pos += 8;
|
|
|
|
if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) {
|
|
-#ifdef CONFIG_LIB80211_DEBUG
|
|
if (net_ratelimit()) {
|
|
printk(KERN_DEBUG "TKIP: replay detected: STA=%pM"
|
|
" previous TSC %08x%04x received TSC "
|
|
"%08x%04x\n", hdr->addr2,
|
|
tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);
|
|
}
|
|
-#endif
|
|
tkey->dot11RSNAStatsTKIPReplays++;
|
|
return -4;
|
|
}
|
|
@@ -507,12 +505,10 @@
|
|
* it needs to be recalculated for the next packet. */
|
|
tkey->rx_phase1_done = 0;
|
|
}
|
|
-#ifdef CONFIG_LIB80211_DEBUG
|
|
if (net_ratelimit()) {
|
|
printk(KERN_DEBUG "TKIP: ICV error detected: STA="
|
|
"%pM\n", hdr->addr2);
|
|
}
|
|
-#endif
|
|
tkey->dot11RSNAStatsTKIPICVErrors++;
|
|
return -5;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/wireless/nl80211.c linux-2.6.29-rc3.owrt/net/wireless/nl80211.c
|
|
--- linux-2.6.29.owrt/net/wireless/nl80211.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/wireless/nl80211.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1908,11 +1908,6 @@
|
|
if (err)
|
|
return err;
|
|
|
|
- if (!drv->ops->get_mesh_params) {
|
|
- err = -EOPNOTSUPP;
|
|
- goto out;
|
|
- }
|
|
-
|
|
/* Get the mesh params */
|
|
rtnl_lock();
|
|
err = drv->ops->get_mesh_params(&drv->wiphy, dev, &cur_params);
|
|
@@ -2022,11 +2017,6 @@
|
|
if (err)
|
|
return err;
|
|
|
|
- if (!drv->ops->set_mesh_params) {
|
|
- err = -EOPNOTSUPP;
|
|
- goto out;
|
|
- }
|
|
-
|
|
/* This makes sure that there aren't more than 32 mesh config
|
|
* parameters (otherwise our bitfield scheme would not work.) */
|
|
BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
|
|
@@ -2071,7 +2061,6 @@
|
|
err = drv->ops->set_mesh_params(&drv->wiphy, dev, &cfg, mask);
|
|
rtnl_unlock();
|
|
|
|
- out:
|
|
/* cleanup */
|
|
cfg80211_put_dev(drv);
|
|
dev_put(dev);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/wireless/reg.c linux-2.6.29-rc3.owrt/net/wireless/reg.c
|
|
--- linux-2.6.29.owrt/net/wireless/reg.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/wireless/reg.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -380,8 +380,7 @@
|
|
|
|
freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
|
|
|
|
- if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
|
|
- freq_range->max_bandwidth_khz > freq_diff)
|
|
+ if (freq_diff <= 0 || freq_range->max_bandwidth_khz > freq_diff)
|
|
return false;
|
|
|
|
return true;
|
|
@@ -499,7 +498,6 @@
|
|
* calculate the number of reg rules we will need. We will need one
|
|
* for each channel subband */
|
|
while (country_ie_len >= 3) {
|
|
- int end_channel = 0;
|
|
struct ieee80211_country_ie_triplet *triplet =
|
|
(struct ieee80211_country_ie_triplet *) country_ie;
|
|
int cur_sub_max_channel = 0, cur_channel = 0;
|
|
@@ -511,25 +509,9 @@
|
|
continue;
|
|
}
|
|
|
|
- /* 2 GHz */
|
|
- if (triplet->chans.first_channel <= 14)
|
|
- end_channel = triplet->chans.first_channel +
|
|
- triplet->chans.num_channels;
|
|
- else
|
|
- /*
|
|
- * 5 GHz -- For example in country IEs if the first
|
|
- * channel given is 36 and the number of channels is 4
|
|
- * then the individual channel numbers defined for the
|
|
- * 5 GHz PHY by these parameters are: 36, 40, 44, and 48
|
|
- * and not 36, 37, 38, 39.
|
|
- *
|
|
- * See: http://tinyurl.com/11d-clarification
|
|
- */
|
|
- end_channel = triplet->chans.first_channel +
|
|
- (4 * (triplet->chans.num_channels - 1));
|
|
-
|
|
cur_channel = triplet->chans.first_channel;
|
|
- cur_sub_max_channel = end_channel;
|
|
+ cur_sub_max_channel = ieee80211_channel_to_frequency(
|
|
+ cur_channel + triplet->chans.num_channels);
|
|
|
|
/* Basic sanity check */
|
|
if (cur_sub_max_channel < cur_channel)
|
|
@@ -608,6 +590,15 @@
|
|
end_channel = triplet->chans.first_channel +
|
|
triplet->chans.num_channels;
|
|
else
|
|
+ /*
|
|
+ * 5 GHz -- For example in country IEs if the first
|
|
+ * channel given is 36 and the number of channels is 4
|
|
+ * then the individual channel numbers defined for the
|
|
+ * 5 GHz PHY by these parameters are: 36, 40, 44, and 48
|
|
+ * and not 36, 37, 38, 39.
|
|
+ *
|
|
+ * See: http://tinyurl.com/11d-clarification
|
|
+ */
|
|
end_channel = triplet->chans.first_channel +
|
|
(4 * (triplet->chans.num_channels - 1));
|
|
|
|
@@ -1285,7 +1276,7 @@
|
|
if (intersected_rd) {
|
|
printk(KERN_DEBUG "cfg80211: We intersect both of these "
|
|
"and get:\n");
|
|
- print_regdomain_info(intersected_rd);
|
|
+ print_regdomain_info(rd);
|
|
return;
|
|
}
|
|
printk(KERN_DEBUG "cfg80211: Intersection between both failed\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/net/xfrm/xfrm_state.c linux-2.6.29-rc3.owrt/net/xfrm/xfrm_state.c
|
|
--- linux-2.6.29.owrt/net/xfrm/xfrm_state.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/net/xfrm/xfrm_state.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -748,51 +748,12 @@
|
|
schedule_work(&net->xfrm.state_hash_work);
|
|
}
|
|
|
|
-static void xfrm_state_look_at(struct xfrm_policy *pol, struct xfrm_state *x,
|
|
- struct flowi *fl, unsigned short family,
|
|
- xfrm_address_t *daddr, xfrm_address_t *saddr,
|
|
- struct xfrm_state **best, int *acq_in_progress,
|
|
- int *error)
|
|
-{
|
|
- /* Resolution logic:
|
|
- * 1. There is a valid state with matching selector. Done.
|
|
- * 2. Valid state with inappropriate selector. Skip.
|
|
- *
|
|
- * Entering area of "sysdeps".
|
|
- *
|
|
- * 3. If state is not valid, selector is temporary, it selects
|
|
- * only session which triggered previous resolution. Key
|
|
- * manager will do something to install a state with proper
|
|
- * selector.
|
|
- */
|
|
- if (x->km.state == XFRM_STATE_VALID) {
|
|
- if ((x->sel.family &&
|
|
- !xfrm_selector_match(&x->sel, fl, x->sel.family)) ||
|
|
- !security_xfrm_state_pol_flow_match(x, pol, fl))
|
|
- return;
|
|
-
|
|
- if (!*best ||
|
|
- (*best)->km.dying > x->km.dying ||
|
|
- ((*best)->km.dying == x->km.dying &&
|
|
- (*best)->curlft.add_time < x->curlft.add_time))
|
|
- *best = x;
|
|
- } else if (x->km.state == XFRM_STATE_ACQ) {
|
|
- *acq_in_progress = 1;
|
|
- } else if (x->km.state == XFRM_STATE_ERROR ||
|
|
- x->km.state == XFRM_STATE_EXPIRED) {
|
|
- if (xfrm_selector_match(&x->sel, fl, x->sel.family) &&
|
|
- security_xfrm_state_pol_flow_match(x, pol, fl))
|
|
- *error = -ESRCH;
|
|
- }
|
|
-}
|
|
-
|
|
struct xfrm_state *
|
|
xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
|
|
struct flowi *fl, struct xfrm_tmpl *tmpl,
|
|
struct xfrm_policy *pol, int *err,
|
|
unsigned short family)
|
|
{
|
|
- static xfrm_address_t saddr_wildcard = { };
|
|
struct net *net = xp_net(pol);
|
|
unsigned int h;
|
|
struct hlist_node *entry;
|
|
@@ -812,27 +773,40 @@
|
|
xfrm_state_addr_check(x, daddr, saddr, family) &&
|
|
tmpl->mode == x->props.mode &&
|
|
tmpl->id.proto == x->id.proto &&
|
|
- (tmpl->id.spi == x->id.spi || !tmpl->id.spi))
|
|
- xfrm_state_look_at(pol, x, fl, family, daddr, saddr,
|
|
- &best, &acquire_in_progress, &error);
|
|
- }
|
|
- if (best)
|
|
- goto found;
|
|
-
|
|
- h = xfrm_dst_hash(net, daddr, &saddr_wildcard, tmpl->reqid, family);
|
|
- hlist_for_each_entry(x, entry, net->xfrm.state_bydst+h, bydst) {
|
|
- if (x->props.family == family &&
|
|
- x->props.reqid == tmpl->reqid &&
|
|
- !(x->props.flags & XFRM_STATE_WILDRECV) &&
|
|
- xfrm_state_addr_check(x, daddr, saddr, family) &&
|
|
- tmpl->mode == x->props.mode &&
|
|
- tmpl->id.proto == x->id.proto &&
|
|
- (tmpl->id.spi == x->id.spi || !tmpl->id.spi))
|
|
- xfrm_state_look_at(pol, x, fl, family, daddr, saddr,
|
|
- &best, &acquire_in_progress, &error);
|
|
+ (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) {
|
|
+ /* Resolution logic:
|
|
+ 1. There is a valid state with matching selector.
|
|
+ Done.
|
|
+ 2. Valid state with inappropriate selector. Skip.
|
|
+
|
|
+ Entering area of "sysdeps".
|
|
+
|
|
+ 3. If state is not valid, selector is temporary,
|
|
+ it selects only session which triggered
|
|
+ previous resolution. Key manager will do
|
|
+ something to install a state with proper
|
|
+ selector.
|
|
+ */
|
|
+ if (x->km.state == XFRM_STATE_VALID) {
|
|
+ if ((x->sel.family && !xfrm_selector_match(&x->sel, fl, x->sel.family)) ||
|
|
+ !security_xfrm_state_pol_flow_match(x, pol, fl))
|
|
+ continue;
|
|
+ if (!best ||
|
|
+ best->km.dying > x->km.dying ||
|
|
+ (best->km.dying == x->km.dying &&
|
|
+ best->curlft.add_time < x->curlft.add_time))
|
|
+ best = x;
|
|
+ } else if (x->km.state == XFRM_STATE_ACQ) {
|
|
+ acquire_in_progress = 1;
|
|
+ } else if (x->km.state == XFRM_STATE_ERROR ||
|
|
+ x->km.state == XFRM_STATE_EXPIRED) {
|
|
+ if (xfrm_selector_match(&x->sel, fl, x->sel.family) &&
|
|
+ security_xfrm_state_pol_flow_match(x, pol, fl))
|
|
+ error = -ESRCH;
|
|
+ }
|
|
+ }
|
|
}
|
|
|
|
-found:
|
|
x = best;
|
|
if (!x && !error && !acquire_in_progress) {
|
|
if (tmpl->id.spi &&
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/README linux-2.6.29-rc3.owrt/README
|
|
--- linux-2.6.29.owrt/README 2009-05-10 22:04:37.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/README 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -188,7 +188,7 @@
|
|
values to random values.
|
|
|
|
You can find more information on using the Linux kernel config tools
|
|
- in Documentation/kbuild/kconfig.txt.
|
|
+ in Documentation/kbuild/make-configs.txt.
|
|
|
|
NOTES on "make config":
|
|
- having unnecessary drivers will make the kernel bigger, and can
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/bootgraph.pl linux-2.6.29-rc3.owrt/scripts/bootgraph.pl
|
|
--- linux-2.6.29.owrt/scripts/bootgraph.pl 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/bootgraph.pl 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -51,7 +51,7 @@
|
|
|
|
while (<>) {
|
|
my $line = $_;
|
|
- if ($line =~ /([0-9\.]+)\] calling ([a-zA-Z0-9\_\.]+)\+/) {
|
|
+ if ($line =~ /([0-9\.]+)\] calling ([a-zA-Z0-9\_]+)\+/) {
|
|
my $func = $2;
|
|
if ($done == 0) {
|
|
$start{$func} = $1;
|
|
@@ -87,7 +87,7 @@
|
|
$count = $count + 1;
|
|
}
|
|
|
|
- if ($line =~ /([0-9\.]+)\] initcall ([a-zA-Z0-9\_\.]+)\+.*returned/) {
|
|
+ if ($line =~ /([0-9\.]+)\] initcall ([a-zA-Z0-9\_]+)\+.*returned/) {
|
|
if ($done == 0) {
|
|
$end{$2} = $1;
|
|
$maxtime = $1;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/checkpatch.pl linux-2.6.29-rc3.owrt/scripts/checkpatch.pl
|
|
--- linux-2.6.29.owrt/scripts/checkpatch.pl 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/checkpatch.pl 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -10,7 +10,7 @@
|
|
my $P = $0;
|
|
$P =~ s@.*/@@g;
|
|
|
|
-my $V = '0.28';
|
|
+my $V = '0.27';
|
|
|
|
use Getopt::Long qw(:config no_auto_abbrev);
|
|
|
|
@@ -110,8 +110,7 @@
|
|
__iomem|
|
|
__must_check|
|
|
__init_refok|
|
|
- __kprobes|
|
|
- __ref
|
|
+ __kprobes
|
|
}x;
|
|
our $Attribute = qr{
|
|
const|
|
|
@@ -1241,8 +1240,7 @@
|
|
$realfile =~ s@^([^/]*)/@@;
|
|
|
|
$p1_prefix = $1;
|
|
- if (!$file && $tree && $p1_prefix ne '' &&
|
|
- -e "$root/$p1_prefix") {
|
|
+ if ($tree && $p1_prefix ne '' && -e "$root/$p1_prefix") {
|
|
WARN("patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
|
|
}
|
|
|
|
@@ -1585,9 +1583,9 @@
|
|
}
|
|
# TEST: allow direct testing of the attribute matcher.
|
|
if ($dbg_attr) {
|
|
- if ($line =~ /^.\s*$Modifier\s*$/) {
|
|
+ if ($line =~ /^.\s*$Attribute\s*$/) {
|
|
ERROR("TEST: is attr\n" . $herecurr);
|
|
- } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
|
|
+ } elsif ($dbg_attr > 1 && $line =~ /^.+($Attribute)/) {
|
|
ERROR("TEST: is not attr ($1 is)\n". $herecurr);
|
|
}
|
|
next;
|
|
@@ -1659,7 +1657,7 @@
|
|
|
|
# * goes on variable not on type
|
|
# (char*[ const])
|
|
- if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) {
|
|
+ if ($line =~ m{\($NonptrType(\s*\*[\s\*]*(?:$Modifier\s*)*)\)}) {
|
|
my ($from, $to) = ($1, $1);
|
|
|
|
# Should start with a space.
|
|
@@ -1674,7 +1672,7 @@
|
|
if ($from ne $to) {
|
|
ERROR("\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr);
|
|
}
|
|
- } elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) {
|
|
+ } elsif ($line =~ m{\b$NonptrType(\s*\*[\s\*]*(?:$Modifier\s*)?)($Ident)}) {
|
|
my ($from, $to, $ident) = ($1, $1, $2);
|
|
|
|
# Should start with a space.
|
|
@@ -1687,8 +1685,8 @@
|
|
# Modifiers should have spaces.
|
|
$to =~ s/(\b$Modifier$)/$1 /;
|
|
|
|
- #print "from<$from> to<$to> ident<$ident>\n";
|
|
- if ($from ne $to && $ident !~ /^$Modifier$/) {
|
|
+ #print "from<$from> to<$to>\n";
|
|
+ if ($from ne $to) {
|
|
ERROR("\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr);
|
|
}
|
|
}
|
|
@@ -1887,11 +1885,11 @@
|
|
if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
|
|
ERROR("space required before that '$op' $at\n" . $hereptr);
|
|
}
|
|
- if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
|
|
+ if ($op eq '*' && $cc =~/\s*const\b/) {
|
|
# A unary '*' may be const
|
|
|
|
} elsif ($ctx =~ /.xW/) {
|
|
- ERROR("Aspace prohibited after that '$op' $at\n" . $hereptr);
|
|
+ ERROR("space prohibited after that '$op' $at\n" . $hereptr);
|
|
}
|
|
|
|
# unary ++ and unary -- are allowed no space on one side.
|
|
@@ -2562,7 +2560,7 @@
|
|
if ($line =~ /\bin_atomic\s*\(/) {
|
|
if ($realfile =~ m@^drivers/@) {
|
|
ERROR("do not use in_atomic in drivers\n" . $herecurr);
|
|
- } elsif ($realfile !~ m@^kernel/@) {
|
|
+ } else {
|
|
WARN("use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/kconfig/conf.c linux-2.6.29-rc3.owrt/scripts/kconfig/conf.c
|
|
--- linux-2.6.29.owrt/scripts/kconfig/conf.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/kconfig/conf.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -11,7 +11,6 @@
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
#include <sys/stat.h>
|
|
-#include <sys/time.h>
|
|
|
|
#define LKC_DIRECT_LINK
|
|
#include "lkc.h"
|
|
@@ -465,22 +464,9 @@
|
|
input_mode = set_yes;
|
|
break;
|
|
case 'r':
|
|
- {
|
|
- struct timeval now;
|
|
- unsigned int seed;
|
|
-
|
|
- /*
|
|
- * Use microseconds derived seed,
|
|
- * compensate for systems where it may be zero
|
|
- */
|
|
- gettimeofday(&now, NULL);
|
|
-
|
|
- seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
|
|
- srand(seed);
|
|
-
|
|
input_mode = set_random;
|
|
+ srand(time(NULL));
|
|
break;
|
|
- }
|
|
case 'h':
|
|
printf(_("See README for usage info\n"));
|
|
exit(0);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/kconfig/confdata.c linux-2.6.29-rc3.owrt/scripts/kconfig/confdata.c
|
|
--- linux-2.6.29.owrt/scripts/kconfig/confdata.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/kconfig/confdata.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -843,7 +843,7 @@
|
|
default:
|
|
continue;
|
|
}
|
|
- if (!(sym_is_choice(sym) && mode == def_random))
|
|
+ if (!sym_is_choice(sym) || mode != def_random)
|
|
sym->flags |= SYMBOL_DEF_USER;
|
|
break;
|
|
default:
|
|
@@ -856,49 +856,28 @@
|
|
|
|
if (mode != def_random)
|
|
return;
|
|
- /*
|
|
- * We have different type of choice blocks.
|
|
- * If curr.tri equal to mod then we can select several
|
|
- * choice symbols in one block.
|
|
- * In this case we do nothing.
|
|
- * If curr.tri equal yes then only one symbol can be
|
|
- * selected in a choice block and we set it to yes,
|
|
- * and the rest to no.
|
|
- */
|
|
+
|
|
for_all_symbols(i, csym) {
|
|
if (sym_has_value(csym) || !sym_is_choice(csym))
|
|
continue;
|
|
|
|
sym_calc_value(csym);
|
|
-
|
|
- if (csym->curr.tri != yes)
|
|
- continue;
|
|
-
|
|
prop = sym_get_choice_prop(csym);
|
|
-
|
|
- /* count entries in choice block */
|
|
- cnt = 0;
|
|
- expr_list_for_each_sym(prop->expr, e, sym)
|
|
- cnt++;
|
|
-
|
|
- /*
|
|
- * find a random value and set it to yes,
|
|
- * set the rest to no so we have only one set
|
|
- */
|
|
- def = (rand() % cnt);
|
|
-
|
|
- cnt = 0;
|
|
- expr_list_for_each_sym(prop->expr, e, sym) {
|
|
- if (def == cnt++) {
|
|
- sym->def[S_DEF_USER].tri = yes;
|
|
- csym->def[S_DEF_USER].val = sym;
|
|
- }
|
|
- else {
|
|
- sym->def[S_DEF_USER].tri = no;
|
|
+ def = -1;
|
|
+ while (1) {
|
|
+ cnt = 0;
|
|
+ expr_list_for_each_sym(prop->expr, e, sym) {
|
|
+ if (sym->visible == no)
|
|
+ continue;
|
|
+ if (def == cnt++) {
|
|
+ csym->def[S_DEF_USER].val = sym;
|
|
+ break;
|
|
+ }
|
|
}
|
|
+ if (def >= 0 || cnt < 2)
|
|
+ break;
|
|
+ def = (rand() % cnt) + 1;
|
|
}
|
|
csym->flags |= SYMBOL_DEF_USER;
|
|
- /* clear VALID to get value calculated */
|
|
- csym->flags &= ~(SYMBOL_VALID);
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/kernel-doc linux-2.6.29-rc3.owrt/scripts/kernel-doc
|
|
--- linux-2.6.29.owrt/scripts/kernel-doc 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/kernel-doc 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1827,40 +1827,6 @@
|
|
$state = 0;
|
|
}
|
|
|
|
-sub syscall_munge() {
|
|
- my $void = 0;
|
|
-
|
|
- $prototype =~ s@[\r\n\t]+@ @gos; # strip newlines/CR's/tabs
|
|
-## if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) {
|
|
- if ($prototype =~ m/SYSCALL_DEFINE0/) {
|
|
- $void = 1;
|
|
-## $prototype = "long sys_$1(void)";
|
|
- }
|
|
-
|
|
- $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name
|
|
- if ($prototype =~ m/long (sys_.*?),/) {
|
|
- $prototype =~ s/,/\(/;
|
|
- } elsif ($void) {
|
|
- $prototype =~ s/\)/\(void\)/;
|
|
- }
|
|
-
|
|
- # now delete all of the odd-number commas in $prototype
|
|
- # so that arg types & arg names don't have a comma between them
|
|
- my $count = 0;
|
|
- my $len = length($prototype);
|
|
- if ($void) {
|
|
- $len = 0; # skip the for-loop
|
|
- }
|
|
- for (my $ix = 0; $ix < $len; $ix++) {
|
|
- if (substr($prototype, $ix, 1) eq ',') {
|
|
- $count++;
|
|
- if ($count % 2 == 1) {
|
|
- substr($prototype, $ix, 1) = ' ';
|
|
- }
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
sub process_state3_function($$) {
|
|
my $x = shift;
|
|
my $file = shift;
|
|
@@ -1873,15 +1839,11 @@
|
|
elsif ($x =~ /([^\{]*)/) {
|
|
$prototype .= $1;
|
|
}
|
|
-
|
|
if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) {
|
|
$prototype =~ s@/\*.*?\*/@@gos; # strip comments.
|
|
$prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
|
|
$prototype =~ s@^\s+@@gos; # strip leading spaces
|
|
- if ($prototype =~ /SYSCALL_DEFINE/) {
|
|
- syscall_munge();
|
|
- }
|
|
- dump_function($prototype, $file);
|
|
+ dump_function($prototype,$file);
|
|
reset_state();
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/markup_oops.pl linux-2.6.29-rc3.owrt/scripts/markup_oops.pl
|
|
--- linux-2.6.29.owrt/scripts/markup_oops.pl 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/markup_oops.pl 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1,4 +1,4 @@
|
|
-#!/usr/bin/perl
|
|
+#!/usr/bin/perl -w
|
|
|
|
use File::Basename;
|
|
|
|
@@ -29,151 +29,27 @@
|
|
my $target = "0";
|
|
my $function;
|
|
my $module = "";
|
|
-my $func_offset = 0;
|
|
+my $func_offset;
|
|
my $vmaoffset = 0;
|
|
|
|
-my %regs;
|
|
-
|
|
-
|
|
-sub parse_x86_regs
|
|
-{
|
|
- my ($line) = @_;
|
|
- if ($line =~ /EAX: ([0-9a-f]+) EBX: ([0-9a-f]+) ECX: ([0-9a-f]+) EDX: ([0-9a-f]+)/) {
|
|
- $regs{"%eax"} = $1;
|
|
- $regs{"%ebx"} = $2;
|
|
- $regs{"%ecx"} = $3;
|
|
- $regs{"%edx"} = $4;
|
|
- }
|
|
- if ($line =~ /ESI: ([0-9a-f]+) EDI: ([0-9a-f]+) EBP: ([0-9a-f]+) ESP: ([0-9a-f]+)/) {
|
|
- $regs{"%esi"} = $1;
|
|
- $regs{"%edi"} = $2;
|
|
- $regs{"%esp"} = $4;
|
|
- }
|
|
- if ($line =~ /RAX: ([0-9a-f]+) RBX: ([0-9a-f]+) RCX: ([0-9a-f]+)/) {
|
|
- $regs{"%eax"} = $1;
|
|
- $regs{"%ebx"} = $2;
|
|
- $regs{"%ecx"} = $3;
|
|
- }
|
|
- if ($line =~ /RDX: ([0-9a-f]+) RSI: ([0-9a-f]+) RDI: ([0-9a-f]+)/) {
|
|
- $regs{"%edx"} = $1;
|
|
- $regs{"%esi"} = $2;
|
|
- $regs{"%edi"} = $3;
|
|
- }
|
|
- if ($line =~ /RBP: ([0-9a-f]+) R08: ([0-9a-f]+) R09: ([0-9a-f]+)/) {
|
|
- $regs{"%r08"} = $2;
|
|
- $regs{"%r09"} = $3;
|
|
- }
|
|
- if ($line =~ /R10: ([0-9a-f]+) R11: ([0-9a-f]+) R12: ([0-9a-f]+)/) {
|
|
- $regs{"%r10"} = $1;
|
|
- $regs{"%r11"} = $2;
|
|
- $regs{"%r12"} = $3;
|
|
- }
|
|
- if ($line =~ /R13: ([0-9a-f]+) R14: ([0-9a-f]+) R15: ([0-9a-f]+)/) {
|
|
- $regs{"%r13"} = $1;
|
|
- $regs{"%r14"} = $2;
|
|
- $regs{"%r15"} = $3;
|
|
- }
|
|
-}
|
|
-
|
|
-sub reg_name
|
|
-{
|
|
- my ($reg) = @_;
|
|
- $reg =~ s/r(.)x/e\1x/;
|
|
- $reg =~ s/r(.)i/e\1i/;
|
|
- $reg =~ s/r(.)p/e\1p/;
|
|
- return $reg;
|
|
-}
|
|
-
|
|
-sub process_x86_regs
|
|
-{
|
|
- my ($line, $cntr) = @_;
|
|
- my $str = "";
|
|
- if (length($line) < 40) {
|
|
- return ""; # not an asm istruction
|
|
- }
|
|
-
|
|
- # find the arguments to the instruction
|
|
- if ($line =~ /([0-9a-zA-Z\,\%\(\)\-\+]+)$/) {
|
|
- $lastword = $1;
|
|
- } else {
|
|
- return "";
|
|
- }
|
|
-
|
|
- # we need to find the registers that get clobbered,
|
|
- # since their value is no longer relevant for previous
|
|
- # instructions in the stream.
|
|
-
|
|
- $clobber = $lastword;
|
|
- # first, remove all memory operands, they're read only
|
|
- $clobber =~ s/\([a-z0-9\%\,]+\)//g;
|
|
- # then, remove everything before the comma, thats the read part
|
|
- $clobber =~ s/.*\,//g;
|
|
-
|
|
- # if this is the instruction that faulted, we haven't actually done
|
|
- # the write yet... nothing is clobbered.
|
|
- if ($cntr == 0) {
|
|
- $clobber = "";
|
|
- }
|
|
-
|
|
- foreach $reg (keys(%regs)) {
|
|
- my $clobberprime = reg_name($clobber);
|
|
- my $lastwordprime = reg_name($lastword);
|
|
- my $val = $regs{$reg};
|
|
- if ($val =~ /^[0]+$/) {
|
|
- $val = "0";
|
|
- } else {
|
|
- $val =~ s/^0*//;
|
|
- }
|
|
-
|
|
- # first check if we're clobbering this register; if we do
|
|
- # we print it with a =>, and then delete its value
|
|
- if ($clobber =~ /$reg/ || $clobberprime =~ /$reg/) {
|
|
- if (length($val) > 0) {
|
|
- $str = $str . " $reg => $val ";
|
|
- }
|
|
- $regs{$reg} = "";
|
|
- $val = "";
|
|
- }
|
|
- # now check if we're reading this register
|
|
- if ($lastword =~ /$reg/ || $lastwordprime =~ /$reg/) {
|
|
- if (length($val) > 0) {
|
|
- $str = $str . " $reg = $val ";
|
|
- }
|
|
- }
|
|
- }
|
|
- return $str;
|
|
-}
|
|
-
|
|
-# parse the oops
|
|
while (<STDIN>) {
|
|
my $line = $_;
|
|
if ($line =~ /EIP: 0060:\[\<([a-z0-9]+)\>\]/) {
|
|
$target = $1;
|
|
}
|
|
- if ($line =~ /RIP: 0010:\[\<([a-z0-9]+)\>\]/) {
|
|
- $target = $1;
|
|
- }
|
|
if ($line =~ /EIP is at ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]/) {
|
|
$function = $1;
|
|
$func_offset = $2;
|
|
}
|
|
- if ($line =~ /RIP: 0010:\[\<[0-9a-f]+\>\] \[\<[0-9a-f]+\>\] ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]/) {
|
|
- $function = $1;
|
|
- $func_offset = $2;
|
|
- }
|
|
|
|
# check if it's a module
|
|
if ($line =~ /EIP is at ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]+\W\[([a-zA-Z0-9\_\-]+)\]/) {
|
|
$module = $3;
|
|
}
|
|
- if ($line =~ /RIP: 0010:\[\<[0-9a-f]+\>\] \[\<[0-9a-f]+\>\] ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]+\W\[([a-zA-Z0-9\_\-]+)\]/) {
|
|
- $module = $3;
|
|
- }
|
|
- parse_x86_regs($line);
|
|
}
|
|
|
|
my $decodestart = hex($target) - hex($func_offset);
|
|
-my $decodestop = hex($target) + 8192;
|
|
+my $decodestop = $decodestart + 8192;
|
|
if ($target eq "0") {
|
|
print "No oops found!\n";
|
|
print "Usage: \n";
|
|
@@ -208,7 +84,6 @@
|
|
my $state = 0;
|
|
my $center = 0;
|
|
my @lines;
|
|
-my @reglines;
|
|
|
|
sub InRange {
|
|
my ($address, $target) = @_;
|
|
@@ -313,36 +188,16 @@
|
|
|
|
my $i;
|
|
|
|
-
|
|
-# start annotating the registers in the asm.
|
|
-# this goes from the oopsing point back, so that the annotator
|
|
-# can track (opportunistically) which registers got written and
|
|
-# whos value no longer is relevant.
|
|
-
|
|
-$i = $center;
|
|
-while ($i >= $start) {
|
|
- $reglines[$i] = process_x86_regs($lines[$i], $center - $i);
|
|
- $i = $i - 1;
|
|
-}
|
|
-
|
|
+my $fulltext = "";
|
|
$i = $start;
|
|
while ($i < $finish) {
|
|
- my $line;
|
|
if ($i == $center) {
|
|
- $line = "*$lines[$i] ";
|
|
+ $fulltext = $fulltext . "*$lines[$i] <----- faulting instruction\n";
|
|
} else {
|
|
- $line = " $lines[$i] ";
|
|
- }
|
|
- print $line;
|
|
- if (defined($reglines[$i]) && length($reglines[$i]) > 0) {
|
|
- my $c = 60 - length($line);
|
|
- while ($c > 0) { print " "; $c = $c - 1; };
|
|
- print "| $reglines[$i]";
|
|
+ $fulltext = $fulltext . " $lines[$i]\n";
|
|
}
|
|
- if ($i == $center) {
|
|
- print "<--- faulting instruction";
|
|
- }
|
|
- print "\n";
|
|
$i = $i +1;
|
|
}
|
|
|
|
+print $fulltext;
|
|
+
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/mod/file2alias.c linux-2.6.29-rc3.owrt/scripts/mod/file2alias.c
|
|
--- linux-2.6.29.owrt/scripts/mod/file2alias.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/mod/file2alias.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -210,7 +210,6 @@
|
|
static int do_hid_entry(const char *filename,
|
|
struct hid_device_id *id, char *alias)
|
|
{
|
|
- id->bus = TO_NATIVE(id->bus);
|
|
id->vendor = TO_NATIVE(id->vendor);
|
|
id->product = TO_NATIVE(id->product);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/package/Makefile linux-2.6.29-rc3.owrt/scripts/package/Makefile
|
|
--- linux-2.6.29.owrt/scripts/package/Makefile 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/package/Makefile 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -35,10 +35,9 @@
|
|
rpm-pkg rpm: $(objtree)/kernel.spec FORCE
|
|
$(MAKE) clean
|
|
$(PREV) ln -sf $(srctree) $(KERNELPATH)
|
|
- $(CONFIG_SHELL) $(srctree)/scripts/setlocalversion > $(objtree)/.scmversion
|
|
$(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/.
|
|
$(PREV) rm $(KERNELPATH)
|
|
- rm -f $(objtree)/.scmversion
|
|
+
|
|
set -e; \
|
|
$(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version
|
|
set -e; \
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/package/mkspec linux-2.6.29-rc3.owrt/scripts/package/mkspec
|
|
--- linux-2.6.29.owrt/scripts/package/mkspec 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/package/mkspec 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -86,17 +86,9 @@
|
|
echo 'cp System.map $RPM_BUILD_ROOT'"/boot/System.map-$KERNELRELEASE"
|
|
|
|
echo 'cp .config $RPM_BUILD_ROOT'"/boot/config-$KERNELRELEASE"
|
|
-
|
|
-echo "%ifnarch ppc64"
|
|
-echo 'cp vmlinux vmlinux.orig'
|
|
-echo 'bzip2 -9 vmlinux'
|
|
-echo 'mv vmlinux.bz2 $RPM_BUILD_ROOT'"/boot/vmlinux-$KERNELRELEASE.bz2"
|
|
-echo 'mv vmlinux.orig vmlinux'
|
|
-echo "%endif"
|
|
-
|
|
echo ""
|
|
echo "%clean"
|
|
-echo 'rm -rf $RPM_BUILD_ROOT'
|
|
+echo '#echo -rf $RPM_BUILD_ROOT'
|
|
echo ""
|
|
echo "%files"
|
|
echo '%defattr (-, root, root)'
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/setlocalversion linux-2.6.29-rc3.owrt/scripts/setlocalversion
|
|
--- linux-2.6.29.owrt/scripts/setlocalversion 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/setlocalversion 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -58,7 +58,14 @@
|
|
# Check for svn and a svn repo.
|
|
if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then
|
|
rev=`echo $rev | awk '{print $NF}'`
|
|
- printf -- '-svn%s' "$rev"
|
|
+ changes=`svn status 2>/dev/null | grep '^[AMD]' | wc -l`
|
|
+
|
|
+ # Are there uncommitted changes?
|
|
+ if [ $changes != 0 ]; then
|
|
+ printf -- '-svn%s%s' "$rev" -dirty
|
|
+ else
|
|
+ printf -- '-svn%s' "$rev"
|
|
+ fi
|
|
|
|
# All done with svn
|
|
exit
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/tags.sh linux-2.6.29-rc3.owrt/scripts/tags.sh
|
|
--- linux-2.6.29.owrt/scripts/tags.sh 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/tags.sh 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -76,10 +76,7 @@
|
|
|
|
all_kconfigs()
|
|
{
|
|
- for arch in $ALLSOURCE_ARCHS; do
|
|
- find_sources $arch 'Kconfig*'
|
|
- done
|
|
- find_other_sources 'Kconfig*'
|
|
+ find_sources $ALLSOURCE_ARCHS 'Kconfig*'
|
|
}
|
|
|
|
all_defconfigs()
|
|
@@ -102,8 +99,7 @@
|
|
-I ____cacheline_internodealigned_in_smp \
|
|
-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
|
|
--extra=+f --c-kinds=+px \
|
|
- --regex-asm='/^ENTRY\(([^)]*)\).*/\1/' \
|
|
- --regex-c='/^SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/sys_\1/'
|
|
+ --regex-asm='/^ENTRY\(([^)]*)\).*/\1/'
|
|
|
|
all_kconfigs | xargs $1 -a \
|
|
--langdef=kconfig --language-force=kconfig \
|
|
@@ -121,9 +117,7 @@
|
|
|
|
emacs()
|
|
{
|
|
- all_sources | xargs $1 -a \
|
|
- --regex='/^ENTRY(\([^)]*\)).*/\1/' \
|
|
- --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/'
|
|
+ all_sources | xargs $1 -a
|
|
|
|
all_kconfigs | xargs $1 -a \
|
|
--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/scripts/unifdef.c linux-2.6.29-rc3.owrt/scripts/unifdef.c
|
|
--- linux-2.6.29.owrt/scripts/unifdef.c 2009-05-10 22:04:38.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/scripts/unifdef.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -206,7 +206,7 @@
|
|
static void error(const char *);
|
|
static int findsym(const char *);
|
|
static void flushline(bool);
|
|
-static Linetype get_line(void);
|
|
+static Linetype getline(void);
|
|
static Linetype ifeval(const char **);
|
|
static void ignoreoff(void);
|
|
static void ignoreon(void);
|
|
@@ -512,7 +512,7 @@
|
|
|
|
for (;;) {
|
|
linenum++;
|
|
- lineval = get_line();
|
|
+ lineval = getline();
|
|
trans_table[ifstate[depth]][lineval]();
|
|
debug("process %s -> %s depth %d",
|
|
linetype_name[lineval],
|
|
@@ -526,7 +526,7 @@
|
|
* help from skipcomment().
|
|
*/
|
|
static Linetype
|
|
-get_line(void)
|
|
+getline(void)
|
|
{
|
|
const char *cp;
|
|
int cursym;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/security/selinux/netlabel.c linux-2.6.29-rc3.owrt/security/selinux/netlabel.c
|
|
--- linux-2.6.29.owrt/security/selinux/netlabel.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/security/selinux/netlabel.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -386,12 +386,11 @@
|
|
if (!S_ISSOCK(inode->i_mode) ||
|
|
((mask & (MAY_WRITE | MAY_APPEND)) == 0))
|
|
return 0;
|
|
+
|
|
sock = SOCKET_I(inode);
|
|
sk = sock->sk;
|
|
- if (sk == NULL)
|
|
- return 0;
|
|
sksec = sk->sk_security;
|
|
- if (sksec == NULL || sksec->nlbl_state != NLBL_REQUIRE)
|
|
+ if (sksec->nlbl_state != NLBL_REQUIRE)
|
|
return 0;
|
|
|
|
local_bh_disable();
|
|
@@ -491,10 +490,8 @@
|
|
lock_sock(sk);
|
|
rc = netlbl_sock_getattr(sk, &secattr);
|
|
release_sock(sk);
|
|
- if (rc == 0)
|
|
+ if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE)
|
|
rc = -EACCES;
|
|
- else if (rc == -ENOMSG)
|
|
- rc = 0;
|
|
netlbl_secattr_destroy(&secattr);
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/security/smack/smackfs.c linux-2.6.29-rc3.owrt/security/smack/smackfs.c
|
|
--- linux-2.6.29.owrt/security/smack/smackfs.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/security/smack/smackfs.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -650,6 +650,10 @@
|
|
|
|
return skp;
|
|
}
|
|
+/*
|
|
+#define BEMASK 0x80000000
|
|
+*/
|
|
+#define BEMASK 0x00000001
|
|
#define BEBITS (sizeof(__be32) * 8)
|
|
|
|
/*
|
|
@@ -659,10 +663,12 @@
|
|
{
|
|
struct smk_netlbladdr *skp = (struct smk_netlbladdr *) v;
|
|
unsigned char *hp = (char *) &skp->smk_host.sin_addr.s_addr;
|
|
- int maskn;
|
|
- u32 temp_mask = be32_to_cpu(skp->smk_mask.s_addr);
|
|
+ __be32 bebits;
|
|
+ int maskn = 0;
|
|
|
|
- for (maskn = 0; temp_mask; temp_mask <<= 1, maskn++);
|
|
+ for (bebits = BEMASK; bebits != 0; maskn++, bebits <<= 1)
|
|
+ if ((skp->smk_mask.s_addr & bebits) == 0)
|
|
+ break;
|
|
|
|
seq_printf(s, "%u.%u.%u.%u/%d %s\n",
|
|
hp[0], hp[1], hp[2], hp[3], maskn, skp->smk_label);
|
|
@@ -696,42 +702,6 @@
|
|
}
|
|
|
|
/**
|
|
- * smk_netlbladdr_insert
|
|
- * @new : netlabel to insert
|
|
- *
|
|
- * This helper insert netlabel in the smack_netlbladdrs list
|
|
- * sorted by netmask length (longest to smallest)
|
|
- */
|
|
-static void smk_netlbladdr_insert(struct smk_netlbladdr *new)
|
|
-{
|
|
- struct smk_netlbladdr *m;
|
|
-
|
|
- if (smack_netlbladdrs == NULL) {
|
|
- smack_netlbladdrs = new;
|
|
- return;
|
|
- }
|
|
-
|
|
- /* the comparison '>' is a bit hacky, but works */
|
|
- if (new->smk_mask.s_addr > smack_netlbladdrs->smk_mask.s_addr) {
|
|
- new->smk_next = smack_netlbladdrs;
|
|
- smack_netlbladdrs = new;
|
|
- return;
|
|
- }
|
|
- for (m = smack_netlbladdrs; m != NULL; m = m->smk_next) {
|
|
- if (m->smk_next == NULL) {
|
|
- m->smk_next = new;
|
|
- return;
|
|
- }
|
|
- if (new->smk_mask.s_addr > m->smk_next->smk_mask.s_addr) {
|
|
- new->smk_next = m->smk_next;
|
|
- m->smk_next = new;
|
|
- return;
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-
|
|
-/**
|
|
* smk_write_netlbladdr - write() for /smack/netlabel
|
|
* @filp: file pointer, not actually used
|
|
* @buf: where to get the data from
|
|
@@ -754,9 +724,8 @@
|
|
struct netlbl_audit audit_info;
|
|
struct in_addr mask;
|
|
unsigned int m;
|
|
- u32 mask_bits = (1<<31);
|
|
+ __be32 bebits = BEMASK;
|
|
__be32 nsa;
|
|
- u32 temp_mask;
|
|
|
|
/*
|
|
* Must have privilege.
|
|
@@ -792,13 +761,10 @@
|
|
if (sp == NULL)
|
|
return -EINVAL;
|
|
|
|
- for (temp_mask = 0; m > 0; m--) {
|
|
- temp_mask |= mask_bits;
|
|
- mask_bits >>= 1;
|
|
+ for (mask.s_addr = 0; m > 0; m--) {
|
|
+ mask.s_addr |= bebits;
|
|
+ bebits <<= 1;
|
|
}
|
|
- mask.s_addr = cpu_to_be32(temp_mask);
|
|
-
|
|
- newname.sin_addr.s_addr &= mask.s_addr;
|
|
/*
|
|
* Only allow one writer at a time. Writes should be
|
|
* quite rare and small in any case.
|
|
@@ -806,7 +772,6 @@
|
|
mutex_lock(&smk_netlbladdr_lock);
|
|
|
|
nsa = newname.sin_addr.s_addr;
|
|
- /* try to find if the prefix is already in the list */
|
|
for (skp = smack_netlbladdrs; skp != NULL; skp = skp->smk_next)
|
|
if (skp->smk_host.sin_addr.s_addr == nsa &&
|
|
skp->smk_mask.s_addr == mask.s_addr)
|
|
@@ -822,8 +787,9 @@
|
|
rc = 0;
|
|
skp->smk_host.sin_addr.s_addr = newname.sin_addr.s_addr;
|
|
skp->smk_mask.s_addr = mask.s_addr;
|
|
+ skp->smk_next = smack_netlbladdrs;
|
|
skp->smk_label = sp;
|
|
- smk_netlbladdr_insert(skp);
|
|
+ smack_netlbladdrs = skp;
|
|
}
|
|
} else {
|
|
rc = netlbl_cfg_unlbl_static_del(&init_net, NULL,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/security/smack/smack_lsm.c linux-2.6.29-rc3.owrt/security/smack/smack_lsm.c
|
|
--- linux-2.6.29.owrt/security/smack/smack_lsm.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/security/smack/smack_lsm.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1498,31 +1498,58 @@
|
|
* looks for host based access restrictions
|
|
*
|
|
* This version will only be appropriate for really small
|
|
- * sets of single label hosts.
|
|
+ * sets of single label hosts. Because of the masking
|
|
+ * it cannot shortcut out on the first match. There are
|
|
+ * numerious ways to address the problem, but none of them
|
|
+ * have been applied here.
|
|
*
|
|
* Returns the label of the far end or NULL if it's not special.
|
|
*/
|
|
static char *smack_host_label(struct sockaddr_in *sip)
|
|
{
|
|
struct smk_netlbladdr *snp;
|
|
+ char *bestlabel = NULL;
|
|
struct in_addr *siap = &sip->sin_addr;
|
|
+ struct in_addr *liap;
|
|
+ struct in_addr *miap;
|
|
+ struct in_addr bestmask;
|
|
|
|
if (siap->s_addr == 0)
|
|
return NULL;
|
|
|
|
+ bestmask.s_addr = 0;
|
|
+
|
|
for (snp = smack_netlbladdrs; snp != NULL; snp = snp->smk_next) {
|
|
+ liap = &snp->smk_host.sin_addr;
|
|
+ miap = &snp->smk_mask;
|
|
+ /*
|
|
+ * If the addresses match after applying the list entry mask
|
|
+ * the entry matches the address. If it doesn't move along to
|
|
+ * the next entry.
|
|
+ */
|
|
+ if ((liap->s_addr & miap->s_addr) !=
|
|
+ (siap->s_addr & miap->s_addr))
|
|
+ continue;
|
|
/*
|
|
- * we break after finding the first match because
|
|
- * the list is sorted from longest to shortest mask
|
|
- * so we have found the most specific match
|
|
+ * If the list entry mask identifies a single address
|
|
+ * it can't get any more specific.
|
|
*/
|
|
- if ((&snp->smk_host.sin_addr)->s_addr ==
|
|
- (siap->s_addr & (&snp->smk_mask)->s_addr)) {
|
|
+ if (miap->s_addr == 0xffffffff)
|
|
return snp->smk_label;
|
|
- }
|
|
+ /*
|
|
+ * If the list entry mask is less specific than the best
|
|
+ * already found this entry is uninteresting.
|
|
+ */
|
|
+ if ((miap->s_addr | bestmask.s_addr) == bestmask.s_addr)
|
|
+ continue;
|
|
+ /*
|
|
+ * This is better than any entry found so far.
|
|
+ */
|
|
+ bestmask.s_addr = miap->s_addr;
|
|
+ bestlabel = snp->smk_label;
|
|
}
|
|
|
|
- return NULL;
|
|
+ return bestlabel;
|
|
}
|
|
|
|
/**
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/arm/aaci.c linux-2.6.29-rc3.owrt/sound/arm/aaci.c
|
|
--- linux-2.6.29.owrt/sound/arm/aaci.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/arm/aaci.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -90,7 +90,7 @@
|
|
*/
|
|
do {
|
|
v = readl(aaci->base + AACI_SLFR);
|
|
- } while ((v & (SLFR_1TXB|SLFR_2TXB)) && --timeout);
|
|
+ } while ((v & (SLFR_1TXB|SLFR_2TXB)) && timeout--);
|
|
|
|
if (!timeout)
|
|
dev_err(&aaci->dev->dev,
|
|
@@ -126,7 +126,7 @@
|
|
*/
|
|
do {
|
|
v = readl(aaci->base + AACI_SLFR);
|
|
- } while ((v & SLFR_1TXB) && --timeout);
|
|
+ } while ((v & SLFR_1TXB) && timeout--);
|
|
|
|
if (!timeout) {
|
|
dev_err(&aaci->dev->dev, "timeout on slot 1 TX busy\n");
|
|
@@ -147,7 +147,7 @@
|
|
do {
|
|
cond_resched();
|
|
v = readl(aaci->base + AACI_SLFR) & (SLFR_1RXV|SLFR_2RXV);
|
|
- } while ((v != (SLFR_1RXV|SLFR_2RXV)) && --timeout);
|
|
+ } while ((v != (SLFR_1RXV|SLFR_2RXV)) && timeout--);
|
|
|
|
if (!timeout) {
|
|
dev_err(&aaci->dev->dev, "timeout on RX valid\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/core/jack.c linux-2.6.29-rc3.owrt/sound/core/jack.c
|
|
--- linux-2.6.29.owrt/sound/core/jack.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/core/jack.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -47,7 +47,7 @@
|
|
int err;
|
|
|
|
snprintf(jack->name, sizeof(jack->name), "%s %s",
|
|
- card->shortname, jack->id);
|
|
+ card->longname, jack->id);
|
|
jack->input_dev->name = jack->name;
|
|
|
|
/* Default to the sound card device. */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/core/oss/mixer_oss.c linux-2.6.29-rc3.owrt/sound/core/oss/mixer_oss.c
|
|
--- linux-2.6.29.owrt/sound/core/oss/mixer_oss.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/core/oss/mixer_oss.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -692,9 +692,6 @@
|
|
snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_PVOLUME], left, right);
|
|
if (slot->present & SNDRV_MIXER_OSS_PRESENT_CVOLUME)
|
|
snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_CVOLUME], left, right);
|
|
- } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_CVOLUME) {
|
|
- snd_mixer_oss_put_volume1_vol(fmixer, pslot,
|
|
- slot->numid[SNDRV_MIXER_OSS_ITEM_CVOLUME], left, right);
|
|
} else if (slot->present & SNDRV_MIXER_OSS_PRESENT_GVOLUME) {
|
|
snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_GVOLUME], left, right);
|
|
} else if (slot->present & SNDRV_MIXER_OSS_PRESENT_GLOBAL) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/core/oss/pcm_oss.c linux-2.6.29-rc3.owrt/sound/core/oss/pcm_oss.c
|
|
--- linux-2.6.29.owrt/sound/core/oss/pcm_oss.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/core/oss/pcm_oss.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1767,7 +1767,7 @@
|
|
AFMT_S8 | AFMT_U16_LE |
|
|
AFMT_U16_BE |
|
|
AFMT_S32_LE | AFMT_S32_BE |
|
|
- AFMT_S24_LE | AFMT_S24_BE |
|
|
+ AFMT_S24_LE | AFMT_S24_LE |
|
|
AFMT_S24_PACKED;
|
|
params = kmalloc(sizeof(*params), GFP_KERNEL);
|
|
if (!params)
|
|
@@ -2872,7 +2872,7 @@
|
|
setup = kmalloc(sizeof(*setup), GFP_KERNEL);
|
|
if (! setup) {
|
|
buffer->error = -ENOMEM;
|
|
- mutex_unlock(&pstr->oss.setup_mutex);
|
|
+ mutex_lock(&pstr->oss.setup_mutex);
|
|
return;
|
|
}
|
|
if (pstr->oss.setup_list == NULL)
|
|
@@ -2886,7 +2886,7 @@
|
|
if (! template.task_name) {
|
|
kfree(setup);
|
|
buffer->error = -ENOMEM;
|
|
- mutex_unlock(&pstr->oss.setup_mutex);
|
|
+ mutex_lock(&pstr->oss.setup_mutex);
|
|
return;
|
|
}
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/core/oss/rate.c linux-2.6.29-rc3.owrt/sound/core/oss/rate.c
|
|
--- linux-2.6.29.owrt/sound/core/oss/rate.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/core/oss/rate.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -157,7 +157,7 @@
|
|
while (dst_frames1 > 0) {
|
|
S1 = S2;
|
|
if (src_frames1-- > 0) {
|
|
- S2 = *src;
|
|
+ S1 = *src;
|
|
src += src_step;
|
|
}
|
|
if (pos & ~R_MASK) {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/core/sgbuf.c linux-2.6.29-rc3.owrt/sound/core/sgbuf.c
|
|
--- linux-2.6.29.owrt/sound/core/sgbuf.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/core/sgbuf.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -38,10 +38,6 @@
|
|
if (! sgbuf)
|
|
return -EINVAL;
|
|
|
|
- if (dmab->area)
|
|
- vunmap(dmab->area);
|
|
- dmab->area = NULL;
|
|
-
|
|
tmpb.dev.type = SNDRV_DMA_TYPE_DEV;
|
|
tmpb.dev.dev = sgbuf->dev;
|
|
for (i = 0; i < sgbuf->pages; i++) {
|
|
@@ -52,6 +48,9 @@
|
|
tmpb.bytes = (sgbuf->table[i].addr & ~PAGE_MASK) << PAGE_SHIFT;
|
|
snd_dma_free_pages(&tmpb);
|
|
}
|
|
+ if (dmab->area)
|
|
+ vunmap(dmab->area);
|
|
+ dmab->area = NULL;
|
|
|
|
kfree(sgbuf->table);
|
|
kfree(sgbuf->page_table);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/drivers/mtpav.c linux-2.6.29-rc3.owrt/sound/drivers/mtpav.c
|
|
--- linux-2.6.29.owrt/sound/drivers/mtpav.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/drivers/mtpav.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -706,6 +706,7 @@
|
|
mtp_card->card = card;
|
|
mtp_card->irq = -1;
|
|
mtp_card->share_irq = 0;
|
|
+ mtp_card->inmidiport = 0xffffffff;
|
|
mtp_card->inmidistate = 0;
|
|
mtp_card->outmidihwport = 0xffffffff;
|
|
init_timer(&mtp_card->timer);
|
|
@@ -718,8 +719,6 @@
|
|
if (err < 0)
|
|
goto __error;
|
|
|
|
- mtp_card->inmidiport = mtp_card->num_ports + MTPAV_PIDX_BROADCAST;
|
|
-
|
|
err = snd_mtpav_get_ISA(mtp_card);
|
|
if (err < 0)
|
|
goto __error;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/isa/opl3sa2.c linux-2.6.29-rc3.owrt/sound/isa/opl3sa2.c
|
|
--- linux-2.6.29.owrt/sound/isa/opl3sa2.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/isa/opl3sa2.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -550,27 +550,21 @@
|
|
#ifdef CONFIG_PM
|
|
static int snd_opl3sa2_suspend(struct snd_card *card, pm_message_t state)
|
|
{
|
|
- if (card) {
|
|
- struct snd_opl3sa2 *chip = card->private_data;
|
|
+ struct snd_opl3sa2 *chip = card->private_data;
|
|
|
|
- snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
|
- chip->wss->suspend(chip->wss);
|
|
- /* power down */
|
|
- snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
|
|
- }
|
|
+ snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
|
+ chip->wss->suspend(chip->wss);
|
|
+ /* power down */
|
|
+ snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int snd_opl3sa2_resume(struct snd_card *card)
|
|
{
|
|
- struct snd_opl3sa2 *chip;
|
|
+ struct snd_opl3sa2 *chip = card->private_data;
|
|
int i;
|
|
|
|
- if (!card)
|
|
- return 0;
|
|
-
|
|
- chip = card->private_data;
|
|
/* power up */
|
|
snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/oss/dmasound/dmasound_atari.c linux-2.6.29-rc3.owrt/sound/oss/dmasound/dmasound_atari.c
|
|
--- linux-2.6.29.owrt/sound/oss/dmasound/dmasound_atari.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/oss/dmasound/dmasound_atari.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -847,23 +847,23 @@
|
|
of events. So all we need to keep the music playing is
|
|
to provide the sound hardware with new data upon
|
|
an interrupt from timer A. */
|
|
- st_mfp.tim_ct_a = 0; /* ++roman: Stop timer before programming! */
|
|
- st_mfp.tim_dt_a = 1; /* Cause interrupt after first event. */
|
|
- st_mfp.tim_ct_a = 8; /* Turn on event counting. */
|
|
+ mfp.tim_ct_a = 0; /* ++roman: Stop timer before programming! */
|
|
+ mfp.tim_dt_a = 1; /* Cause interrupt after first event. */
|
|
+ mfp.tim_ct_a = 8; /* Turn on event counting. */
|
|
/* Register interrupt handler. */
|
|
if (request_irq(IRQ_MFP_TIMA, AtaInterrupt, IRQ_TYPE_SLOW, "DMA sound",
|
|
AtaInterrupt))
|
|
return 0;
|
|
- st_mfp.int_en_a |= 0x20; /* Turn interrupt on. */
|
|
- st_mfp.int_mk_a |= 0x20;
|
|
+ mfp.int_en_a |= 0x20; /* Turn interrupt on. */
|
|
+ mfp.int_mk_a |= 0x20;
|
|
return 1;
|
|
}
|
|
|
|
#ifdef MODULE
|
|
static void AtaIrqCleanUp(void)
|
|
{
|
|
- st_mfp.tim_ct_a = 0; /* stop timer */
|
|
- st_mfp.int_en_a &= ~0x20; /* turn interrupt off */
|
|
+ mfp.tim_ct_a = 0; /* stop timer */
|
|
+ mfp.int_en_a &= ~0x20; /* turn interrupt off */
|
|
free_irq(IRQ_MFP_TIMA, AtaInterrupt);
|
|
}
|
|
#endif /* MODULE */
|
|
@@ -1599,7 +1599,7 @@
|
|
is_falcon = 0;
|
|
} else
|
|
return -ENODEV;
|
|
- if ((st_mfp.int_en_a & st_mfp.int_mk_a & 0x20) == 0)
|
|
+ if ((mfp.int_en_a & mfp.int_mk_a & 0x20) == 0)
|
|
return dmasound_init();
|
|
else {
|
|
printk("DMA sound driver: Timer A interrupt already in use\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/aw2/aw2-alsa.c linux-2.6.29-rc3.owrt/sound/pci/aw2/aw2-alsa.c
|
|
--- linux-2.6.29.owrt/sound/pci/aw2/aw2-alsa.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/aw2/aw2-alsa.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -165,7 +165,7 @@
|
|
MODULE_PARM_DESC(enable, "Enable Audiowerk2 soundcard.");
|
|
|
|
static struct pci_device_id snd_aw2_ids[] = {
|
|
- {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, 0, 0,
|
|
+ {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, PCI_ANY_ID, PCI_ANY_ID,
|
|
0, 0, 0},
|
|
{0}
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/emu10k1/emu10k1_main.c linux-2.6.29-rc3.owrt/sound/pci/emu10k1/emu10k1_main.c
|
|
--- linux-2.6.29.owrt/sound/pci/emu10k1/emu10k1_main.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/emu10k1/emu10k1_main.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1528,7 +1528,6 @@
|
|
.ca0151_chip = 1,
|
|
.spk71 = 1,
|
|
.spdif_bug = 1,
|
|
- .invert_shared_spdif = 1, /* digital/analog switch swapped */
|
|
.ac97_chip = 1} ,
|
|
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102,
|
|
.driver = "Audigy2", .name = "SB Audigy 2 Platinum [SB0240P]",
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/hda_codec.c linux-2.6.29-rc3.owrt/sound/pci/hda/hda_codec.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/hda_codec.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_codec.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -487,6 +487,7 @@
|
|
{
|
|
struct hda_bus *bus;
|
|
int err;
|
|
+ char qname[8];
|
|
static struct snd_device_ops dev_ops = {
|
|
.dev_register = snd_hda_bus_dev_register,
|
|
.dev_free = snd_hda_bus_dev_free,
|
|
@@ -516,12 +517,10 @@
|
|
mutex_init(&bus->cmd_mutex);
|
|
INIT_LIST_HEAD(&bus->codec_list);
|
|
|
|
- snprintf(bus->workq_name, sizeof(bus->workq_name),
|
|
- "hd-audio%d", card->number);
|
|
- bus->workq = create_singlethread_workqueue(bus->workq_name);
|
|
+ snprintf(qname, sizeof(qname), "hda%d", card->number);
|
|
+ bus->workq = create_workqueue(qname);
|
|
if (!bus->workq) {
|
|
- snd_printk(KERN_ERR "cannot create workqueue %s\n",
|
|
- bus->workq_name);
|
|
+ snd_printk(KERN_ERR "cannot create workqueue %s\n", qname);
|
|
kfree(bus);
|
|
return -ENOMEM;
|
|
}
|
|
@@ -3088,16 +3087,6 @@
|
|
}
|
|
EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_prepare);
|
|
|
|
-int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec,
|
|
- struct hda_multi_out *mout)
|
|
-{
|
|
- mutex_lock(&codec->spdif_mutex);
|
|
- cleanup_dig_out_stream(codec, mout->dig_out_nid);
|
|
- mutex_unlock(&codec->spdif_mutex);
|
|
- return 0;
|
|
-}
|
|
-EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_cleanup);
|
|
-
|
|
/*
|
|
* release the digital out
|
|
*/
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/hda_codec.h linux-2.6.29-rc3.owrt/sound/pci/hda/hda_codec.h
|
|
--- linux-2.6.29.owrt/sound/pci/hda/hda_codec.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_codec.h 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -614,7 +614,6 @@
|
|
|
|
/* unsolicited event queue */
|
|
struct hda_bus_unsolicited *unsol;
|
|
- char workq_name[16];
|
|
struct workqueue_struct *workq; /* common workqueue for codecs */
|
|
|
|
/* assigned PCMs */
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/hda_hwdep.c linux-2.6.29-rc3.owrt/sound/pci/hda/hda_hwdep.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/hda_hwdep.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_hwdep.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -175,7 +175,7 @@
|
|
err = snd_hda_codec_build_controls(codec);
|
|
if (err < 0)
|
|
return err;
|
|
- return snd_card_register(codec->bus->card);
|
|
+ return 0;
|
|
}
|
|
|
|
/*
|
|
@@ -277,19 +277,18 @@
|
|
{
|
|
struct snd_hwdep *hwdep = dev_get_drvdata(dev);
|
|
struct hda_codec *codec = hwdep->private_data;
|
|
- struct hda_verb *v;
|
|
- int nid, verb, param;
|
|
+ char *p;
|
|
+ struct hda_verb verb, *v;
|
|
|
|
- if (sscanf(buf, "%i %i %i", &nid, &verb, ¶m) != 3)
|
|
- return -EINVAL;
|
|
- if (!nid || !verb)
|
|
+ verb.nid = simple_strtoul(buf, &p, 0);
|
|
+ verb.verb = simple_strtoul(p, &p, 0);
|
|
+ verb.param = simple_strtoul(p, &p, 0);
|
|
+ if (!verb.nid || !verb.verb || !verb.param)
|
|
return -EINVAL;
|
|
v = snd_array_new(&codec->init_verbs);
|
|
if (!v)
|
|
return -ENOMEM;
|
|
- v->nid = nid;
|
|
- v->verb = verb;
|
|
- v->param = param;
|
|
+ *v = verb;
|
|
return count;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/hda_intel.c linux-2.6.29-rc3.owrt/sound/pci/hda/hda_intel.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/hda_intel.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_intel.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1947,13 +1947,16 @@
|
|
return 0;
|
|
}
|
|
|
|
+static int azx_resume_early(struct pci_dev *pci)
|
|
+{
|
|
+ return pci_restore_state(pci);
|
|
+}
|
|
+
|
|
static int azx_resume(struct pci_dev *pci)
|
|
{
|
|
struct snd_card *card = pci_get_drvdata(pci);
|
|
struct azx *chip = card->private_data;
|
|
|
|
- pci_set_power_state(pci, PCI_D0);
|
|
- pci_restore_state(pci);
|
|
if (pci_enable_device(pci) < 0) {
|
|
printk(KERN_ERR "hda-intel: pci_enable_device failed, "
|
|
"disabling device\n");
|
|
@@ -2059,31 +2062,26 @@
|
|
{
|
|
const struct snd_pci_quirk *q;
|
|
|
|
- switch (fix) {
|
|
- case POS_FIX_LPIB:
|
|
- case POS_FIX_POSBUF:
|
|
- return fix;
|
|
- }
|
|
-
|
|
- /* Check VIA/ATI HD Audio Controller exist */
|
|
- switch (chip->driver_type) {
|
|
- case AZX_DRIVER_VIA:
|
|
- case AZX_DRIVER_ATI:
|
|
+ /* Check VIA HD Audio Controller exist */
|
|
+ if (chip->pci->vendor == PCI_VENDOR_ID_VIA &&
|
|
+ chip->pci->device == VIA_HDAC_DEVICE_ID) {
|
|
chip->via_dmapos_patch = 1;
|
|
/* Use link position directly, avoid any transfer problem. */
|
|
return POS_FIX_LPIB;
|
|
}
|
|
chip->via_dmapos_patch = 0;
|
|
|
|
- q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
|
|
- if (q) {
|
|
- printk(KERN_INFO
|
|
- "hda_intel: position_fix set to %d "
|
|
- "for device %04x:%04x\n",
|
|
- q->value, q->subvendor, q->subdevice);
|
|
- return q->value;
|
|
+ if (fix == POS_FIX_AUTO) {
|
|
+ q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
|
|
+ if (q) {
|
|
+ printk(KERN_INFO
|
|
+ "hda_intel: position_fix set to %d "
|
|
+ "for device %04x:%04x\n",
|
|
+ q->value, q->subvendor, q->subdevice);
|
|
+ return q->value;
|
|
+ }
|
|
}
|
|
- return POS_FIX_AUTO;
|
|
+ return fix;
|
|
}
|
|
|
|
/*
|
|
@@ -2100,8 +2098,6 @@
|
|
SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
|
|
/* including bogus ALC268 in slot#2 that conflicts with ALC888 */
|
|
SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
|
|
- /* conflict of ALC268 in slot#3 (digital I/O); a temporary fix */
|
|
- SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba laptop", 0x03),
|
|
{}
|
|
};
|
|
|
|
@@ -2215,17 +2211,9 @@
|
|
gcap = azx_readw(chip, GCAP);
|
|
snd_printdd("chipset global capabilities = 0x%x\n", gcap);
|
|
|
|
- /* ATI chips seems buggy about 64bit DMA addresses */
|
|
- if (chip->driver_type == AZX_DRIVER_ATI)
|
|
- gcap &= ~0x01;
|
|
-
|
|
/* allow 64bit DMA address if supported by H/W */
|
|
if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK))
|
|
pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK);
|
|
- else {
|
|
- pci_set_dma_mask(pci, DMA_32BIT_MASK);
|
|
- pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK);
|
|
- }
|
|
|
|
/* read number of streams from GCAP register instead of using
|
|
* hardcoded value
|
|
@@ -2480,6 +2468,7 @@
|
|
.remove = __devexit_p(azx_remove),
|
|
#ifdef CONFIG_PM
|
|
.suspend = azx_suspend,
|
|
+ .resume_early = azx_resume_early,
|
|
.resume = azx_resume,
|
|
#endif
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/hda_local.h linux-2.6.29-rc3.owrt/sound/pci/hda/hda_local.h
|
|
--- linux-2.6.29.owrt/sound/pci/hda/hda_local.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_local.h 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -251,8 +251,6 @@
|
|
unsigned int stream_tag,
|
|
unsigned int format,
|
|
struct snd_pcm_substream *substream);
|
|
-int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec,
|
|
- struct hda_multi_out *mout);
|
|
int snd_hda_multi_out_analog_open(struct hda_codec *codec,
|
|
struct hda_multi_out *mout,
|
|
struct snd_pcm_substream *substream,
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/hda_proc.c linux-2.6.29-rc3.owrt/sound/pci/hda/hda_proc.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/hda_proc.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_proc.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -399,8 +399,7 @@
|
|
{
|
|
int c, curr = -1;
|
|
|
|
- if (conn_len > 1 && wid_type != AC_WID_AUD_MIX &&
|
|
- wid_type != AC_WID_VOL_KNB)
|
|
+ if (conn_len > 1 && wid_type != AC_WID_AUD_MIX)
|
|
curr = snd_hda_codec_read(codec, nid, 0,
|
|
AC_VERB_GET_CONNECT_SEL, 0);
|
|
snd_iprintf(buffer, " Connection: %d\n", conn_len);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/patch_analog.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_analog.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/patch_analog.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_analog.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -275,14 +275,6 @@
|
|
format, substream);
|
|
}
|
|
|
|
-static int ad198x_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
|
- struct hda_codec *codec,
|
|
- struct snd_pcm_substream *substream)
|
|
-{
|
|
- struct ad198x_spec *spec = codec->spec;
|
|
- return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
|
|
-}
|
|
-
|
|
/*
|
|
* Analog capture
|
|
*/
|
|
@@ -341,8 +333,7 @@
|
|
.ops = {
|
|
.open = ad198x_dig_playback_pcm_open,
|
|
.close = ad198x_dig_playback_pcm_close,
|
|
- .prepare = ad198x_dig_playback_pcm_prepare,
|
|
- .cleanup = ad198x_dig_playback_pcm_cleanup
|
|
+ .prepare = ad198x_dig_playback_pcm_prepare
|
|
},
|
|
};
|
|
|
|
@@ -1894,8 +1885,8 @@
|
|
#define AD1988_SPDIF_OUT_HDMI 0x0b
|
|
#define AD1988_SPDIF_IN 0x07
|
|
|
|
-static hda_nid_t ad1989b_slave_dig_outs[] = {
|
|
- AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI, 0
|
|
+static hda_nid_t ad1989b_slave_dig_outs[2] = {
|
|
+ AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI
|
|
};
|
|
|
|
static struct hda_input_mux ad1988_6stack_capture_source = {
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/patch_conexant.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_conexant.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/patch_conexant.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_conexant.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -347,7 +347,6 @@
|
|
&spec->cur_mux[adc_idx]);
|
|
}
|
|
|
|
-#ifdef CONFIG_SND_JACK
|
|
static int conexant_add_jack(struct hda_codec *codec,
|
|
hda_nid_t nid, int type)
|
|
{
|
|
@@ -395,6 +394,7 @@
|
|
|
|
static int conexant_init_jacks(struct hda_codec *codec)
|
|
{
|
|
+#ifdef CONFIG_SND_JACK
|
|
struct conexant_spec *spec = codec->spec;
|
|
int i;
|
|
|
|
@@ -422,19 +422,10 @@
|
|
++hv;
|
|
}
|
|
}
|
|
+#endif
|
|
return 0;
|
|
|
|
}
|
|
-#else
|
|
-static inline void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid)
|
|
-{
|
|
-}
|
|
-
|
|
-static inline int conexant_init_jacks(struct hda_codec *codec)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-#endif
|
|
|
|
static int conexant_init(struct hda_codec *codec)
|
|
{
|
|
@@ -1575,7 +1566,6 @@
|
|
SND_PCI_QUIRK(0x103c, 0x30a5, "HP DV5200T/DV8000T", CXT5047_LAPTOP_HP),
|
|
SND_PCI_QUIRK(0x103c, 0x30b2, "HP DV2000T/DV3000T", CXT5047_LAPTOP),
|
|
SND_PCI_QUIRK(0x103c, 0x30b5, "HP DV2000Z", CXT5047_LAPTOP),
|
|
- SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6700", CXT5047_LAPTOP),
|
|
SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P100", CXT5047_LAPTOP_EAPD),
|
|
{}
|
|
};
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/patch_intelhdmi.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_intelhdmi.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/patch_intelhdmi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_intelhdmi.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -49,6 +49,11 @@
|
|
{} /* terminator */
|
|
};
|
|
|
|
+static struct hda_verb pinout_disable_verb[] = {
|
|
+ {PIN_NID, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00},
|
|
+ {}
|
|
+};
|
|
+
|
|
static struct hda_verb unsolicited_response_verb[] = {
|
|
{PIN_NID, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN |
|
|
INTEL_HDMI_EVENT_TAG},
|
|
@@ -243,6 +248,10 @@
|
|
|
|
static void hdmi_enable_output(struct hda_codec *codec)
|
|
{
|
|
+ /* Enable Audio InfoFrame Transmission */
|
|
+ hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0);
|
|
+ snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT,
|
|
+ AC_DIPXMIT_BEST);
|
|
/* Unmute */
|
|
if (get_wcaps(codec, PIN_NID) & AC_WCAP_OUT_AMP)
|
|
snd_hda_codec_write(codec, PIN_NID, 0,
|
|
@@ -251,24 +260,17 @@
|
|
snd_hda_sequence_write(codec, pinout_enable_verb);
|
|
}
|
|
|
|
-/*
|
|
- * Enable Audio InfoFrame Transmission
|
|
- */
|
|
-static void hdmi_start_infoframe_trans(struct hda_codec *codec)
|
|
+static void hdmi_disable_output(struct hda_codec *codec)
|
|
{
|
|
- hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0);
|
|
- snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT,
|
|
- AC_DIPXMIT_BEST);
|
|
-}
|
|
+ snd_hda_sequence_write(codec, pinout_disable_verb);
|
|
+ if (get_wcaps(codec, PIN_NID) & AC_WCAP_OUT_AMP)
|
|
+ snd_hda_codec_write(codec, PIN_NID, 0,
|
|
+ AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
|
|
|
|
-/*
|
|
- * Disable Audio InfoFrame Transmission
|
|
- */
|
|
-static void hdmi_stop_infoframe_trans(struct hda_codec *codec)
|
|
-{
|
|
- hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0);
|
|
- snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT,
|
|
- AC_DIPXMIT_DISABLE);
|
|
+ /*
|
|
+ * FIXME: noises may arise when playing music after reloading the
|
|
+ * kernel module, until the next X restart or monitor repower.
|
|
+ */
|
|
}
|
|
|
|
static int hdmi_get_channel_count(struct hda_codec *codec)
|
|
@@ -366,16 +368,11 @@
|
|
struct hdmi_audio_infoframe *ai)
|
|
{
|
|
u8 *params = (u8 *)ai;
|
|
- u8 sum = 0;
|
|
int i;
|
|
|
|
hdmi_debug_dip_size(codec);
|
|
hdmi_clear_dip_buffers(codec); /* be paranoid */
|
|
|
|
- for (i = 0; i < sizeof(ai); i++)
|
|
- sum += params[i];
|
|
- ai->checksum = - sum;
|
|
-
|
|
hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0);
|
|
for (i = 0; i < sizeof(ai); i++)
|
|
hdmi_write_dip_byte(codec, PIN_NID, params[i]);
|
|
@@ -422,16 +419,12 @@
|
|
/*
|
|
* CA defaults to 0 for basic stereo audio
|
|
*/
|
|
- if (channels <= 2)
|
|
+ if (!eld->eld_ver)
|
|
return 0;
|
|
-
|
|
- /*
|
|
- * HDMI sink's ELD info cannot always be retrieved for now, e.g.
|
|
- * in console or for audio devices. Assume the highest speakers
|
|
- * configuration, to _not_ prohibit multi-channel audio playback.
|
|
- */
|
|
if (!eld->spk_alloc)
|
|
- eld->spk_alloc = 0xffff;
|
|
+ return 0;
|
|
+ if (channels <= 2)
|
|
+ return 0;
|
|
|
|
/*
|
|
* expand ELD's speaker allocation mask
|
|
@@ -492,7 +485,6 @@
|
|
hdmi_setup_channel_mapping(codec, &ai);
|
|
|
|
hdmi_fill_audio_infoframe(codec, &ai);
|
|
- hdmi_start_infoframe_trans(codec);
|
|
}
|
|
|
|
|
|
@@ -570,7 +562,7 @@
|
|
{
|
|
struct intel_hdmi_spec *spec = codec->spec;
|
|
|
|
- hdmi_stop_infoframe_trans(codec);
|
|
+ hdmi_disable_output(codec);
|
|
|
|
return snd_hda_multi_out_dig_close(codec, &spec->multiout);
|
|
}
|
|
@@ -590,6 +582,8 @@
|
|
|
|
hdmi_setup_audio_infoframe(codec, substream);
|
|
|
|
+ hdmi_enable_output(codec);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -634,7 +628,8 @@
|
|
|
|
static int intel_hdmi_init(struct hda_codec *codec)
|
|
{
|
|
- hdmi_enable_output(codec);
|
|
+ /* disable audio output as early as possible */
|
|
+ hdmi_disable_output(codec);
|
|
|
|
snd_hda_sequence_write(codec, unsolicited_response_verb);
|
|
|
|
@@ -684,7 +679,6 @@
|
|
{ .id = 0x80862801, .name = "G45 DEVBLC", .patch = patch_intel_hdmi },
|
|
{ .id = 0x80862802, .name = "G45 DEVCTG", .patch = patch_intel_hdmi },
|
|
{ .id = 0x80862803, .name = "G45 DEVELK", .patch = patch_intel_hdmi },
|
|
- { .id = 0x80862804, .name = "G45 DEVIBX", .patch = patch_intel_hdmi },
|
|
{ .id = 0x10951392, .name = "SiI1392 HDMI", .patch = patch_intel_hdmi },
|
|
{} /* terminator */
|
|
};
|
|
@@ -693,7 +687,6 @@
|
|
MODULE_ALIAS("snd-hda-codec-id:80862801");
|
|
MODULE_ALIAS("snd-hda-codec-id:80862802");
|
|
MODULE_ALIAS("snd-hda-codec-id:80862803");
|
|
-MODULE_ALIAS("snd-hda-codec-id:80862804");
|
|
MODULE_ALIAS("snd-hda-codec-id:10951392");
|
|
|
|
MODULE_LICENSE("GPL");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/patch_realtek.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_realtek.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/patch_realtek.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_realtek.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1037,7 +1037,6 @@
|
|
case 0x10ec0267:
|
|
case 0x10ec0268:
|
|
case 0x10ec0269:
|
|
- case 0x10ec0272:
|
|
case 0x10ec0660:
|
|
case 0x10ec0662:
|
|
case 0x10ec0663:
|
|
@@ -1066,7 +1065,6 @@
|
|
case 0x10ec0882:
|
|
case 0x10ec0883:
|
|
case 0x10ec0885:
|
|
- case 0x10ec0887:
|
|
case 0x10ec0889:
|
|
snd_hda_codec_write(codec, 0x20, 0,
|
|
AC_VERB_SET_COEF_INDEX, 7);
|
|
@@ -7014,15 +7012,12 @@
|
|
break;
|
|
case 0x106b1000: /* iMac 24 */
|
|
case 0x106b2800: /* AppleTV */
|
|
- case 0x106b3e00: /* iMac 24 Aluminium */
|
|
board_config = ALC885_IMAC24;
|
|
break;
|
|
- case 0x106b00a0: /* MacBookPro3,1 - Another revision */
|
|
case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */
|
|
case 0x106b00a4: /* MacbookPro4,1 */
|
|
case 0x106b2c00: /* Macbook Pro rev3 */
|
|
case 0x106b3600: /* Macbook 3.1 */
|
|
- case 0x106b3800: /* MacbookPro4,1 - latter revision */
|
|
board_config = ALC885_MBP3;
|
|
break;
|
|
default:
|
|
@@ -8470,8 +8465,6 @@
|
|
ALC888_ACER_ASPIRE_4930G),
|
|
SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
|
|
ALC888_ACER_ASPIRE_4930G),
|
|
- SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
|
|
- ALC888_ACER_ASPIRE_4930G),
|
|
SND_PCI_QUIRK(0x1025, 0, "Acer laptop", ALC883_ACER), /* default Acer */
|
|
SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
|
|
SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
|
|
@@ -8481,7 +8474,6 @@
|
|
SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
|
|
SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
|
|
SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
|
|
- SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
|
|
SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
|
|
SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
|
|
SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
|
|
@@ -8521,8 +8513,6 @@
|
|
SND_PCI_QUIRK(0x1558, 0, "Clevo laptop", ALC883_LAPTOP_EAPD),
|
|
SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
|
|
SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
|
|
- SND_PCI_QUIRK(0x1734, 0x1107, "FSC AMILO Xi2550",
|
|
- ALC883_FUJITSU_PI2515),
|
|
SND_PCI_QUIRK(0x1734, 0x1108, "Fujitsu AMILO Pi2515", ALC883_FUJITSU_PI2515),
|
|
SND_PCI_QUIRK(0x1734, 0x113d, "Fujitsu AMILO Xa3530",
|
|
ALC888_FUJITSU_XA3530),
|
|
@@ -10557,7 +10547,6 @@
|
|
SND_PCI_QUIRK(0x103c, 0x1309, "HP xw4*00", ALC262_HP_BPC),
|
|
SND_PCI_QUIRK(0x103c, 0x130a, "HP xw6*00", ALC262_HP_BPC),
|
|
SND_PCI_QUIRK(0x103c, 0x130b, "HP xw8*00", ALC262_HP_BPC),
|
|
- SND_PCI_QUIRK(0x103c, 0x170b, "HP xw*", ALC262_HP_BPC),
|
|
SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
|
|
SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
|
|
SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/hda/patch_sigmatel.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_sigmatel.c
|
|
--- linux-2.6.29.owrt/sound/pci/hda/patch_sigmatel.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_sigmatel.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1207,7 +1207,7 @@
|
|
"LFE Playback Volume",
|
|
"Side Playback Volume",
|
|
"Headphone Playback Volume",
|
|
- "Headphone2 Playback Volume",
|
|
+ "Headphone Playback Volume",
|
|
"Speaker Playback Volume",
|
|
"External Speaker Playback Volume",
|
|
"Speaker2 Playback Volume",
|
|
@@ -1221,7 +1221,7 @@
|
|
"LFE Playback Switch",
|
|
"Side Playback Switch",
|
|
"Headphone Playback Switch",
|
|
- "Headphone2 Playback Switch",
|
|
+ "Headphone Playback Switch",
|
|
"Speaker Playback Switch",
|
|
"External Speaker Playback Switch",
|
|
"Speaker2 Playback Switch",
|
|
@@ -1799,13 +1799,11 @@
|
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2,
|
|
"HP dv5", STAC_HP_M4),
|
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4,
|
|
- "HP dv7", STAC_HP_DV5),
|
|
+ "HP dv7", STAC_HP_M4),
|
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f7,
|
|
"HP dv4", STAC_HP_DV5),
|
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fc,
|
|
"HP dv7", STAC_HP_M4),
|
|
- SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3600,
|
|
- "HP dv5", STAC_HP_DV5),
|
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3603,
|
|
"HP dv5", STAC_HP_DV5),
|
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
|
|
@@ -2442,14 +2440,6 @@
|
|
stream_tag, format, substream);
|
|
}
|
|
|
|
-static int stac92xx_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
|
- struct hda_codec *codec,
|
|
- struct snd_pcm_substream *substream)
|
|
-{
|
|
- struct sigmatel_spec *spec = codec->spec;
|
|
- return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
|
|
-}
|
|
-
|
|
|
|
/*
|
|
* Analog capture callbacks
|
|
@@ -2494,8 +2484,7 @@
|
|
.ops = {
|
|
.open = stac92xx_dig_playback_pcm_open,
|
|
.close = stac92xx_dig_playback_pcm_close,
|
|
- .prepare = stac92xx_dig_playback_pcm_prepare,
|
|
- .cleanup = stac92xx_dig_playback_pcm_cleanup
|
|
+ .prepare = stac92xx_dig_playback_pcm_prepare
|
|
},
|
|
};
|
|
|
|
@@ -2550,8 +2539,6 @@
|
|
|
|
info->name = "STAC92xx Analog";
|
|
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
|
|
- info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
|
|
- spec->multiout.dac_nids[0];
|
|
info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
|
|
info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
|
|
info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
|
|
@@ -3516,7 +3503,6 @@
|
|
if (! spec->autocfg.line_outs)
|
|
return 0; /* can't find valid pin config */
|
|
|
|
-#if 0 /* FIXME: temporarily disabled */
|
|
/* If we have no real line-out pin and multiple hp-outs, HPs should
|
|
* be set up as multi-channel outputs.
|
|
*/
|
|
@@ -3536,7 +3522,6 @@
|
|
spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
|
|
spec->autocfg.hp_outs = 0;
|
|
}
|
|
-#endif /* FIXME: temporarily disabled */
|
|
if (spec->autocfg.mono_out_pin) {
|
|
int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) &
|
|
(AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP);
|
|
@@ -4991,7 +4976,7 @@
|
|
case STAC_DELL_M4_3:
|
|
spec->num_dmics = 1;
|
|
spec->num_smuxes = 0;
|
|
- spec->num_dmuxes = 1;
|
|
+ spec->num_dmuxes = 0;
|
|
break;
|
|
default:
|
|
spec->num_dmics = STAC92HD71BXX_NUM_DMICS;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/intel8x0.c linux-2.6.29-rc3.owrt/sound/pci/intel8x0.c
|
|
--- linux-2.6.29.owrt/sound/pci/intel8x0.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/intel8x0.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -617,7 +617,7 @@
|
|
int time = 100;
|
|
if (chip->buggy_semaphore)
|
|
return 0; /* just ignore ... */
|
|
- while (--time && (igetdword(chip, ICHREG(ALI_CAS)) & ALI_CAS_SEM_BUSY))
|
|
+ while (time-- && (igetdword(chip, ICHREG(ALI_CAS)) & ALI_CAS_SEM_BUSY))
|
|
udelay(1);
|
|
if (! time && ! chip->in_ac97_init)
|
|
snd_printk(KERN_WARNING "ali_codec_semaphore timeout\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/mixart/mixart.c linux-2.6.29-rc3.owrt/sound/pci/mixart/mixart.c
|
|
--- linux-2.6.29.owrt/sound/pci/mixart/mixart.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/mixart/mixart.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -607,7 +607,6 @@
|
|
/* set the format to the board */
|
|
err = mixart_set_format(stream, format);
|
|
if(err < 0) {
|
|
- mutex_unlock(&mgr->setup_mutex);
|
|
return err;
|
|
}
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/oxygen/virtuoso.c linux-2.6.29-rc3.owrt/sound/pci/oxygen/virtuoso.c
|
|
--- linux-2.6.29.owrt/sound/pci/oxygen/virtuoso.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/oxygen/virtuoso.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -26,7 +26,7 @@
|
|
* SPI 0 -> 1st PCM1796 (front)
|
|
* SPI 1 -> 2nd PCM1796 (surround)
|
|
* SPI 2 -> 3rd PCM1796 (center/LFE)
|
|
- * SPI 4 -> 4th PCM1796 (back)
|
|
+ * SPI 4 -> 4th PCM1796 (back) and EEPROM self-destruct (do not use!)
|
|
*
|
|
* GPIO 2 -> M0 of CS5381
|
|
* GPIO 3 -> M1 of CS5381
|
|
@@ -207,6 +207,12 @@
|
|
static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec,
|
|
u8 reg, u8 value)
|
|
{
|
|
+ /*
|
|
+ * We don't want to do writes on SPI 4 because the EEPROM, which shares
|
|
+ * the same pin, might get confused and broken. We'd better take care
|
|
+ * that the driver works with the default register values ...
|
|
+ */
|
|
+#if 0
|
|
/* maps ALSA channel pair number to SPI output */
|
|
static const u8 codec_map[4] = {
|
|
0, 1, 2, 4
|
|
@@ -217,6 +223,7 @@
|
|
(codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) |
|
|
OXYGEN_SPI_CEN_LATCH_CLOCK_HI,
|
|
(reg << 8) | value);
|
|
+#endif
|
|
}
|
|
|
|
static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec,
|
|
@@ -750,6 +757,9 @@
|
|
|
|
static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
|
|
{
|
|
+ if (!strncmp(template->name, "Master Playback ", 16))
|
|
+ /* disable volume/mute because they would require SPI writes */
|
|
+ return 1;
|
|
if (!strncmp(template->name, "CD Capture ", 11))
|
|
/* CD in is actually connected to the video in pin */
|
|
template->private_value ^= AC97_CD ^ AC97_VIDEO;
|
|
@@ -840,9 +850,8 @@
|
|
.dac_volume_min = 0x0f,
|
|
.dac_volume_max = 0xff,
|
|
.misc_flags = OXYGEN_MISC_MIDI,
|
|
- .function_flags = OXYGEN_FUNCTION_SPI |
|
|
- OXYGEN_FUNCTION_ENABLE_SPI_4_5,
|
|
- .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
|
|
+ .function_flags = OXYGEN_FUNCTION_SPI,
|
|
+ .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
|
|
.adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/pci/pcxhr/pcxhr.h linux-2.6.29-rc3.owrt/sound/pci/pcxhr/pcxhr.h
|
|
--- linux-2.6.29.owrt/sound/pci/pcxhr/pcxhr.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/pci/pcxhr/pcxhr.h 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -97,12 +97,12 @@
|
|
int capture_chips;
|
|
int fw_file_set;
|
|
int firmware_num;
|
|
- unsigned int is_hr_stereo:1;
|
|
- unsigned int board_has_aes1:1; /* if 1 board has AES1 plug and SRC */
|
|
- unsigned int board_has_analog:1; /* if 0 the board is digital only */
|
|
- unsigned int board_has_mic:1; /* if 1 the board has microphone input */
|
|
- unsigned int board_aes_in_192k:1;/* if 1 the aes input plugs do support 192kHz */
|
|
- unsigned int mono_capture:1; /* if 1 the board does mono capture */
|
|
+ int is_hr_stereo:1;
|
|
+ int board_has_aes1:1; /* if 1 board has AES1 plug and SRC */
|
|
+ int board_has_analog:1; /* if 0 the board is digital only */
|
|
+ int board_has_mic:1; /* if 1 the board has microphone input */
|
|
+ int board_aes_in_192k:1;/* if 1 the aes input plugs do support 192kHz */
|
|
+ int mono_capture:1; /* if 1 the board does mono capture */
|
|
|
|
struct snd_dma_buffer hostport;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/atmel/atmel_ssc_dai.c linux-2.6.29-rc3.owrt/sound/soc/atmel/atmel_ssc_dai.c
|
|
--- linux-2.6.29.owrt/sound/soc/atmel/atmel_ssc_dai.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/atmel/atmel_ssc_dai.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -10,7 +10,7 @@
|
|
* Based on at91-ssc.c by
|
|
* Frank Mandarino <fmandarino@endrelia.com>
|
|
* Based on pxa2xx Platform drivers by
|
|
- * Liam Girdwood <lrg@slimlogic.co.uk>
|
|
+ * Liam Girdwood <liam.girdwood@wolfsonmicro.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
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/atmel/atmel_ssc_dai.h linux-2.6.29-rc3.owrt/sound/soc/atmel/atmel_ssc_dai.h
|
|
--- linux-2.6.29.owrt/sound/soc/atmel/atmel_ssc_dai.h 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/atmel/atmel_ssc_dai.h 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -10,7 +10,7 @@
|
|
* Based on at91-ssc.c by
|
|
* Frank Mandarino <fmandarino@endrelia.com>
|
|
* Based on pxa2xx Platform drivers by
|
|
- * Liam Girdwood <lrg@slimlogic.co.uk>
|
|
+ * Liam Girdwood <liam.girdwood@wolfsonmicro.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
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/codecs/tlv320aic3x.c linux-2.6.29-rc3.owrt/sound/soc/codecs/tlv320aic3x.c
|
|
--- linux-2.6.29.owrt/sound/soc/codecs/tlv320aic3x.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/codecs/tlv320aic3x.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -165,13 +165,10 @@
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
{
|
|
struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
|
|
- struct soc_mixer_control *mc =
|
|
- (struct soc_mixer_control *)kcontrol->private_value;
|
|
- unsigned int reg = mc->reg;
|
|
- unsigned int shift = mc->shift;
|
|
- int max = mc->max;
|
|
- unsigned int mask = (1 << fls(max)) - 1;
|
|
- unsigned int invert = mc->invert;
|
|
+ int reg = kcontrol->private_value & 0xff;
|
|
+ int shift = (kcontrol->private_value >> 8) & 0x0f;
|
|
+ int mask = (kcontrol->private_value >> 16) & 0xff;
|
|
+ int invert = (kcontrol->private_value >> 24) & 0x01;
|
|
unsigned short val, val_mask;
|
|
int ret;
|
|
struct snd_soc_dapm_path *path;
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/codecs/wm8350.c linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8350.c
|
|
--- linux-2.6.29.owrt/sound/soc/codecs/wm8350.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8350.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -3,7 +3,7 @@
|
|
*
|
|
* Copyright (C) 2007, 2008 Wolfson Microelectronics PLC.
|
|
*
|
|
- * Author: Liam Girdwood <lrg@slimlogic.co.uk>
|
|
+ * Author: Liam Girdwood <lg@opensource.wolfsonmicro.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/codecs/wm8753.c linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8753.c
|
|
--- linux-2.6.29.owrt/sound/soc/codecs/wm8753.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8753.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1451,14 +1451,7 @@
|
|
},
|
|
};
|
|
|
|
-struct snd_soc_dai wm8753_dai[] = {
|
|
- {
|
|
- .name = "WM8753 DAI 0",
|
|
- },
|
|
- {
|
|
- .name = "WM8753 DAI 1",
|
|
- },
|
|
-};
|
|
+struct snd_soc_dai wm8753_dai[2];
|
|
EXPORT_SYMBOL_GPL(wm8753_dai);
|
|
|
|
static void wm8753_set_dai_mode(struct snd_soc_codec *codec, unsigned int mode)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/codecs/wm8990.c linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8990.c
|
|
--- linux-2.6.29.owrt/sound/soc/codecs/wm8990.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8990.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -2,7 +2,8 @@
|
|
* wm8990.c -- WM8990 ALSA Soc Audio driver
|
|
*
|
|
* Copyright 2008 Wolfson Microelectronics PLC.
|
|
- * Author: Liam Girdwood <lrg@slimlogic.co.uk>
|
|
+ * Author: Liam Girdwood
|
|
+ * lg@opensource.wolfsonmicro.com or linux@wolfsonmicro.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
|
|
@@ -176,9 +177,7 @@
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
{
|
|
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
- struct soc_mixer_control *mc =
|
|
- (struct soc_mixer_control *)kcontrol->private_value;
|
|
- int reg = mc->reg;
|
|
+ int reg = kcontrol->private_value & 0xff;
|
|
int ret;
|
|
u16 val;
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/omap/omap-mcbsp.c linux-2.6.29-rc3.owrt/sound/soc/omap/omap-mcbsp.c
|
|
--- linux-2.6.29.owrt/sound/soc/omap/omap-mcbsp.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/omap/omap-mcbsp.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -302,10 +302,6 @@
|
|
regs->spcr1 |= RINTM(3);
|
|
regs->rcr2 |= RFIG;
|
|
regs->xcr2 |= XFIG;
|
|
- if (cpu_is_omap2430() || cpu_is_omap34xx()) {
|
|
- regs->xccr = DXENDLY(1) | XDMAEN;
|
|
- regs->rccr = RFULL_CYCLE | RDMAEN;
|
|
- }
|
|
|
|
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
|
case SND_SOC_DAIFMT_I2S:
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/omap/omap-pcm.c linux-2.6.29-rc3.owrt/sound/soc/omap/omap-pcm.c
|
|
--- linux-2.6.29.owrt/sound/soc/omap/omap-pcm.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/omap/omap-pcm.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -175,10 +175,9 @@
|
|
{
|
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
|
struct omap_runtime_data *prtd = runtime->private_data;
|
|
- unsigned long flags;
|
|
int ret = 0;
|
|
|
|
- spin_lock_irqsave(&prtd->lock, flags);
|
|
+ spin_lock_irq(&prtd->lock);
|
|
switch (cmd) {
|
|
case SNDRV_PCM_TRIGGER_START:
|
|
case SNDRV_PCM_TRIGGER_RESUME:
|
|
@@ -196,7 +195,7 @@
|
|
default:
|
|
ret = -EINVAL;
|
|
}
|
|
- spin_unlock_irqrestore(&prtd->lock, flags);
|
|
+ spin_unlock_irq(&prtd->lock);
|
|
|
|
return ret;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/omap/sdp3430.c linux-2.6.29-rc3.owrt/sound/soc/omap/sdp3430.c
|
|
--- linux-2.6.29.owrt/sound/soc/omap/sdp3430.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/omap/sdp3430.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -91,7 +91,7 @@
|
|
};
|
|
|
|
/* Audio machine driver */
|
|
-static struct snd_soc_card snd_soc_sdp3430 = {
|
|
+static struct snd_soc_machine snd_soc_machine_sdp3430 = {
|
|
.name = "SDP3430",
|
|
.platform = &omap_soc_platform,
|
|
.dai_link = &sdp3430_dai,
|
|
@@ -100,7 +100,7 @@
|
|
|
|
/* Audio subsystem */
|
|
static struct snd_soc_device sdp3430_snd_devdata = {
|
|
- .card = &snd_soc_sdp3430,
|
|
+ .machine = &snd_soc_machine_sdp3430,
|
|
.codec_dev = &soc_codec_dev_twl4030,
|
|
};
|
|
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/soc/soc-core.c linux-2.6.29-rc3.owrt/sound/soc/soc-core.c
|
|
--- linux-2.6.29.owrt/sound/soc/soc-core.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/soc/soc-core.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1385,10 +1385,7 @@
|
|
|
|
mutex_lock(&codec->mutex);
|
|
#ifdef CONFIG_SND_SOC_AC97_BUS
|
|
- /* Only instantiate AC97 if not already done by the adaptor
|
|
- * for the generic AC97 subsystem.
|
|
- */
|
|
- if (ac97 && strcmp(codec->name, "AC97") != 0) {
|
|
+ if (ac97) {
|
|
ret = soc_ac97_dev_register(codec);
|
|
if (ret < 0) {
|
|
printk(KERN_ERR "asoc: AC97 device register failed\n");
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/usb/usbaudio.c linux-2.6.29-rc3.owrt/sound/usb/usbaudio.c
|
|
--- linux-2.6.29.owrt/sound/usb/usbaudio.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/usb/usbaudio.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -2524,6 +2524,7 @@
|
|
* build the rate table and bitmap flags
|
|
*/
|
|
int r, idx;
|
|
+ unsigned int nonzero_rates = 0;
|
|
|
|
fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL);
|
|
if (fp->rate_table == NULL) {
|
|
@@ -2531,27 +2532,24 @@
|
|
return -1;
|
|
}
|
|
|
|
- fp->nr_rates = 0;
|
|
- fp->rate_min = fp->rate_max = 0;
|
|
+ fp->nr_rates = nr_rates;
|
|
+ fp->rate_min = fp->rate_max = combine_triple(&fmt[8]);
|
|
for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) {
|
|
unsigned int rate = combine_triple(&fmt[idx]);
|
|
- if (!rate)
|
|
- continue;
|
|
/* C-Media CM6501 mislabels its 96 kHz altsetting */
|
|
if (rate == 48000 && nr_rates == 1 &&
|
|
- (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
|
|
- chip->usb_id == USB_ID(0x0d8c, 0x0102)) &&
|
|
+ chip->usb_id == USB_ID(0x0d8c, 0x0201) &&
|
|
fp->altsetting == 5 && fp->maxpacksize == 392)
|
|
rate = 96000;
|
|
- fp->rate_table[fp->nr_rates] = rate;
|
|
- if (!fp->rate_min || rate < fp->rate_min)
|
|
+ fp->rate_table[r] = rate;
|
|
+ nonzero_rates |= rate;
|
|
+ if (rate < fp->rate_min)
|
|
fp->rate_min = rate;
|
|
- if (!fp->rate_max || rate > fp->rate_max)
|
|
+ else if (rate > fp->rate_max)
|
|
fp->rate_max = rate;
|
|
fp->rates |= snd_pcm_rate_to_rate_bit(rate);
|
|
- fp->nr_rates++;
|
|
}
|
|
- if (!fp->nr_rates) {
|
|
+ if (!nonzero_rates) {
|
|
hwc_debug("All rates were zero. Skipping format!\n");
|
|
return -1;
|
|
}
|
|
@@ -2968,7 +2966,6 @@
|
|
return -EINVAL;
|
|
}
|
|
alts = &iface->altsetting[fp->altset_idx];
|
|
- fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
|
|
usb_set_interface(chip->dev, fp->iface, 0);
|
|
init_usb_pitch(chip->dev, fp->iface, alts, fp);
|
|
init_usb_sample_rate(chip->dev, fp->iface, alts, fp, fp->rate_max);
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/sound/usb/usbmidi.c linux-2.6.29-rc3.owrt/sound/usb/usbmidi.c
|
|
--- linux-2.6.29.owrt/sound/usb/usbmidi.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/sound/usb/usbmidi.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -1625,7 +1625,6 @@
|
|
}
|
|
|
|
ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
|
|
- ep_info.out_interval = 0;
|
|
ep_info.out_cables = endpoint->out_cables & 0x5555;
|
|
err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]);
|
|
if (err < 0)
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/virt/kvm/iommu.c linux-2.6.29-rc3.owrt/virt/kvm/iommu.c
|
|
--- linux-2.6.29.owrt/virt/kvm/iommu.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/virt/kvm/iommu.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -73,13 +73,14 @@
|
|
{
|
|
int i, r = 0;
|
|
|
|
+ down_read(&kvm->slots_lock);
|
|
for (i = 0; i < kvm->nmemslots; i++) {
|
|
r = kvm_iommu_map_pages(kvm, kvm->memslots[i].base_gfn,
|
|
kvm->memslots[i].npages);
|
|
if (r)
|
|
break;
|
|
}
|
|
-
|
|
+ up_read(&kvm->slots_lock);
|
|
return r;
|
|
}
|
|
|
|
@@ -189,11 +190,12 @@
|
|
static int kvm_iommu_unmap_memslots(struct kvm *kvm)
|
|
{
|
|
int i;
|
|
-
|
|
+ down_read(&kvm->slots_lock);
|
|
for (i = 0; i < kvm->nmemslots; i++) {
|
|
kvm_iommu_put_pages(kvm, kvm->memslots[i].base_gfn,
|
|
kvm->memslots[i].npages);
|
|
}
|
|
+ up_read(&kvm->slots_lock);
|
|
|
|
return 0;
|
|
}
|
|
diff -ruN --exclude='*.rej' --exclude='*.orig' --exclude=Documentation --exclude='*_defconfig' --exclude='*.ppm' --exclude='*bnx2_fw*' linux-2.6.29.owrt/virt/kvm/kvm_main.c linux-2.6.29-rc3.owrt/virt/kvm/kvm_main.c
|
|
--- linux-2.6.29.owrt/virt/kvm/kvm_main.c 2009-05-10 22:04:39.000000000 +0200
|
|
+++ linux-2.6.29-rc3.owrt/virt/kvm/kvm_main.c 2009-05-10 23:48:34.000000000 +0200
|
|
@@ -173,6 +173,7 @@
|
|
assigned_dev->host_irq_disabled = false;
|
|
}
|
|
mutex_unlock(&assigned_dev->kvm->lock);
|
|
+ kvm_put_kvm(assigned_dev->kvm);
|
|
}
|
|
|
|
static irqreturn_t kvm_assigned_dev_intr(int irq, void *dev_id)
|
|
@@ -180,6 +181,8 @@
|
|
struct kvm_assigned_dev_kernel *assigned_dev =
|
|
(struct kvm_assigned_dev_kernel *) dev_id;
|
|
|
|
+ kvm_get_kvm(assigned_dev->kvm);
|
|
+
|
|
schedule_work(&assigned_dev->interrupt_work);
|
|
|
|
disable_irq_nosync(irq);
|
|
@@ -210,7 +213,6 @@
|
|
}
|
|
}
|
|
|
|
-/* The function implicit hold kvm->lock mutex due to cancel_work_sync() */
|
|
static void kvm_free_assigned_irq(struct kvm *kvm,
|
|
struct kvm_assigned_dev_kernel *assigned_dev)
|
|
{
|
|
@@ -226,24 +228,11 @@
|
|
if (!assigned_dev->irq_requested_type)
|
|
return;
|
|
|
|
- /*
|
|
- * In kvm_free_device_irq, cancel_work_sync return true if:
|
|
- * 1. work is scheduled, and then cancelled.
|
|
- * 2. work callback is executed.
|
|
- *
|
|
- * The first one ensured that the irq is disabled and no more events
|
|
- * would happen. But for the second one, the irq may be enabled (e.g.
|
|
- * for MSI). So we disable irq here to prevent further events.
|
|
- *
|
|
- * Notice this maybe result in nested disable if the interrupt type is
|
|
- * INTx, but it's OK for we are going to free it.
|
|
- *
|
|
- * If this function is a part of VM destroy, please ensure that till
|
|
- * now, the kvm state is still legal for probably we also have to wait
|
|
- * interrupt_work done.
|
|
- */
|
|
- disable_irq_nosync(assigned_dev->host_irq);
|
|
- cancel_work_sync(&assigned_dev->interrupt_work);
|
|
+ if (cancel_work_sync(&assigned_dev->interrupt_work))
|
|
+ /* We had pending work. That means we will have to take
|
|
+ * care of kvm_put_kvm.
|
|
+ */
|
|
+ kvm_put_kvm(kvm);
|
|
|
|
free_irq(assigned_dev->host_irq, (void *)assigned_dev);
|
|
|
|
@@ -296,8 +285,8 @@
|
|
|
|
if (irqchip_in_kernel(kvm)) {
|
|
if (!msi2intx &&
|
|
- (adev->irq_requested_type & KVM_ASSIGNED_DEV_HOST_MSI)) {
|
|
- free_irq(adev->host_irq, (void *)adev);
|
|
+ adev->irq_requested_type & KVM_ASSIGNED_DEV_HOST_MSI) {
|
|
+ free_irq(adev->host_irq, (void *)kvm);
|
|
pci_disable_msi(adev->dev);
|
|
}
|
|
|
|
@@ -466,7 +455,6 @@
|
|
struct kvm_assigned_dev_kernel *match;
|
|
struct pci_dev *dev;
|
|
|
|
- down_read(&kvm->slots_lock);
|
|
mutex_lock(&kvm->lock);
|
|
|
|
match = kvm_find_assigned_dev(&kvm->arch.assigned_dev_head,
|
|
@@ -528,7 +516,6 @@
|
|
|
|
out:
|
|
mutex_unlock(&kvm->lock);
|
|
- up_read(&kvm->slots_lock);
|
|
return r;
|
|
out_list_del:
|
|
list_del(&match->list);
|
|
@@ -540,7 +527,6 @@
|
|
out_free:
|
|
kfree(match);
|
|
mutex_unlock(&kvm->lock);
|
|
- up_read(&kvm->slots_lock);
|
|
return r;
|
|
}
|
|
#endif
|
|
@@ -803,19 +789,11 @@
|
|
return young;
|
|
}
|
|
|
|
-static void kvm_mmu_notifier_release(struct mmu_notifier *mn,
|
|
- struct mm_struct *mm)
|
|
-{
|
|
- struct kvm *kvm = mmu_notifier_to_kvm(mn);
|
|
- kvm_arch_flush_shadow(kvm);
|
|
-}
|
|
-
|
|
static const struct mmu_notifier_ops kvm_mmu_notifier_ops = {
|
|
.invalidate_page = kvm_mmu_notifier_invalidate_page,
|
|
.invalidate_range_start = kvm_mmu_notifier_invalidate_range_start,
|
|
.invalidate_range_end = kvm_mmu_notifier_invalidate_range_end,
|
|
.clear_flush_young = kvm_mmu_notifier_clear_flush_young,
|
|
- .release = kvm_mmu_notifier_release,
|
|
};
|
|
#endif /* CONFIG_MMU_NOTIFIER && KVM_ARCH_WANT_MMU_NOTIFIER */
|
|
|
|
@@ -905,7 +883,6 @@
|
|
{
|
|
struct mm_struct *mm = kvm->mm;
|
|
|
|
- kvm_arch_sync_events(kvm);
|
|
spin_lock(&kvm_lock);
|
|
list_del(&kvm->vm_list);
|
|
spin_unlock(&kvm_lock);
|