diff options
author | Len Brown <len.brown@intel.com> | 2011-03-23 02:34:54 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2011-03-23 02:34:54 -0400 |
commit | 02e2407858fd62053bf60349c0e72cd1c7a4a60e (patch) | |
tree | 0ebdbddc97d3abbc675916010e7771065b70c137 /include | |
parent | 96e1c408ea8a556c5b51e0e7d56bd2afbfbf5fe9 (diff) | |
parent | 6447f55da90b77faec1697d499ed7986bb4f6de6 (diff) |
Merge branch 'linus' into release
Conflicts:
arch/x86/kernel/acpi/sleep.c
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'include')
382 files changed, 9552 insertions, 2716 deletions
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index f50ebb9bc53b..3a10ef5914eb 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
@@ -380,7 +380,7 @@ struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle); | |||
380 | int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state); | 380 | int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state); |
381 | int acpi_disable_wakeup_device_power(struct acpi_device *dev); | 381 | int acpi_disable_wakeup_device_power(struct acpi_device *dev); |
382 | 382 | ||
383 | #ifdef CONFIG_PM_OPS | 383 | #ifdef CONFIG_PM |
384 | int acpi_pm_device_sleep_state(struct device *, int *); | 384 | int acpi_pm_device_sleep_state(struct device *, int *); |
385 | #else | 385 | #else |
386 | static inline int acpi_pm_device_sleep_state(struct device *d, int *p) | 386 | static inline int acpi_pm_device_sleep_state(struct device *d, int *p) |
diff --git a/include/asm-generic/cputime.h b/include/asm-generic/cputime.h index 2bcc5c7c22a6..61e03dd7939e 100644 --- a/include/asm-generic/cputime.h +++ b/include/asm-generic/cputime.h | |||
@@ -30,6 +30,9 @@ typedef u64 cputime64_t; | |||
30 | #define cputime64_to_jiffies64(__ct) (__ct) | 30 | #define cputime64_to_jiffies64(__ct) (__ct) |
31 | #define jiffies64_to_cputime64(__jif) (__jif) | 31 | #define jiffies64_to_cputime64(__jif) (__jif) |
32 | #define cputime_to_cputime64(__ct) ((u64) __ct) | 32 | #define cputime_to_cputime64(__ct) ((u64) __ct) |
33 | #define cputime64_gt(__a, __b) ((__a) > (__b)) | ||
34 | |||
35 | #define nsecs_to_cputime64(__ct) nsecs_to_jiffies64(__ct) | ||
33 | 36 | ||
34 | 37 | ||
35 | /* | 38 | /* |
diff --git a/include/asm-generic/errno.h b/include/asm-generic/errno.h index 28cc03bf19e6..a1331ce50445 100644 --- a/include/asm-generic/errno.h +++ b/include/asm-generic/errno.h | |||
@@ -108,4 +108,6 @@ | |||
108 | 108 | ||
109 | #define ERFKILL 132 /* Operation not possible due to RF-kill */ | 109 | #define ERFKILL 132 /* Operation not possible due to RF-kill */ |
110 | 110 | ||
111 | #define EHWPOISON 133 /* Memory page has hardware error */ | ||
112 | |||
111 | #endif | 113 | #endif |
diff --git a/include/asm-generic/fcntl.h b/include/asm-generic/fcntl.h index 0fc16e3f0bfc..84793c7025e2 100644 --- a/include/asm-generic/fcntl.h +++ b/include/asm-generic/fcntl.h | |||
@@ -80,6 +80,10 @@ | |||
80 | #define O_SYNC (__O_SYNC|O_DSYNC) | 80 | #define O_SYNC (__O_SYNC|O_DSYNC) |
81 | #endif | 81 | #endif |
82 | 82 | ||
83 | #ifndef O_PATH | ||
84 | #define O_PATH 010000000 | ||
85 | #endif | ||
86 | |||
83 | #ifndef O_NDELAY | 87 | #ifndef O_NDELAY |
84 | #define O_NDELAY O_NONBLOCK | 88 | #define O_NDELAY O_NONBLOCK |
85 | #endif | 89 | #endif |
diff --git a/include/asm-generic/ftrace.h b/include/asm-generic/ftrace.h new file mode 100644 index 000000000000..51abba9ea7ad --- /dev/null +++ b/include/asm-generic/ftrace.h | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | * linux/include/asm-generic/ftrace.h | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | #ifndef __ASM_GENERIC_FTRACE_H__ | ||
9 | #define __ASM_GENERIC_FTRACE_H__ | ||
10 | |||
11 | /* | ||
12 | * Not all architectures need their own ftrace.h, the most | ||
13 | * common definitions are already in linux/ftrace.h. | ||
14 | */ | ||
15 | |||
16 | #endif /* __ASM_GENERIC_FTRACE_H__ */ | ||
diff --git a/include/asm-generic/futex.h b/include/asm-generic/futex.h index 3c2344f48136..01f227e14254 100644 --- a/include/asm-generic/futex.h +++ b/include/asm-generic/futex.h | |||
@@ -6,7 +6,7 @@ | |||
6 | #include <asm/errno.h> | 6 | #include <asm/errno.h> |
7 | 7 | ||
8 | static inline int | 8 | static inline int |
9 | futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | 9 | futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) |
10 | { | 10 | { |
11 | int op = (encoded_op >> 28) & 7; | 11 | int op = (encoded_op >> 28) & 7; |
12 | int cmp = (encoded_op >> 24) & 15; | 12 | int cmp = (encoded_op >> 24) & 15; |
@@ -16,7 +16,7 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
16 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) | 16 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) |
17 | oparg = 1 << oparg; | 17 | oparg = 1 << oparg; |
18 | 18 | ||
19 | if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) | 19 | if (! access_ok (VERIFY_WRITE, uaddr, sizeof(u32))) |
20 | return -EFAULT; | 20 | return -EFAULT; |
21 | 21 | ||
22 | pagefault_disable(); | 22 | pagefault_disable(); |
@@ -48,7 +48,8 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
48 | } | 48 | } |
49 | 49 | ||
50 | static inline int | 50 | static inline int |
51 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | 51 | futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, |
52 | u32 oldval, u32 newval) | ||
52 | { | 53 | { |
53 | return -ENOSYS; | 54 | return -ENOSYS; |
54 | } | 55 | } |
diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index 4644c9a7f724..e0ffa3ddb02a 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h | |||
@@ -94,6 +94,10 @@ static inline void __raw_writeq(u64 b, volatile void __iomem *addr) | |||
94 | #define writeq(b,addr) __raw_writeq(__cpu_to_le64(b),addr) | 94 | #define writeq(b,addr) __raw_writeq(__cpu_to_le64(b),addr) |
95 | #endif | 95 | #endif |
96 | 96 | ||
97 | #ifndef PCI_IOBASE | ||
98 | #define PCI_IOBASE ((void __iomem *) 0) | ||
99 | #endif | ||
100 | |||
97 | /*****************************************************************************/ | 101 | /*****************************************************************************/ |
98 | /* | 102 | /* |
99 | * traditional input/output functions | 103 | * traditional input/output functions |
@@ -101,32 +105,32 @@ static inline void __raw_writeq(u64 b, volatile void __iomem *addr) | |||
101 | 105 | ||
102 | static inline u8 inb(unsigned long addr) | 106 | static inline u8 inb(unsigned long addr) |
103 | { | 107 | { |
104 | return readb((volatile void __iomem *) addr); | 108 | return readb(addr + PCI_IOBASE); |
105 | } | 109 | } |
106 | 110 | ||
107 | static inline u16 inw(unsigned long addr) | 111 | static inline u16 inw(unsigned long addr) |
108 | { | 112 | { |
109 | return readw((volatile void __iomem *) addr); | 113 | return readw(addr + PCI_IOBASE); |
110 | } | 114 | } |
111 | 115 | ||
112 | static inline u32 inl(unsigned long addr) | 116 | static inline u32 inl(unsigned long addr) |
113 | { | 117 | { |
114 | return readl((volatile void __iomem *) addr); | 118 | return readl(addr + PCI_IOBASE); |
115 | } | 119 | } |
116 | 120 | ||
117 | static inline void outb(u8 b, unsigned long addr) | 121 | static inline void outb(u8 b, unsigned long addr) |
118 | { | 122 | { |
119 | writeb(b, (volatile void __iomem *) addr); | 123 | writeb(b, addr + PCI_IOBASE); |
120 | } | 124 | } |
121 | 125 | ||
122 | static inline void outw(u16 b, unsigned long addr) | 126 | static inline void outw(u16 b, unsigned long addr) |
123 | { | 127 | { |
124 | writew(b, (volatile void __iomem *) addr); | 128 | writew(b, addr + PCI_IOBASE); |
125 | } | 129 | } |
126 | 130 | ||
127 | static inline void outl(u32 b, unsigned long addr) | 131 | static inline void outl(u32 b, unsigned long addr) |
128 | { | 132 | { |
129 | writel(b, (volatile void __iomem *) addr); | 133 | writel(b, addr + PCI_IOBASE); |
130 | } | 134 | } |
131 | 135 | ||
132 | #define inb_p(addr) inb(addr) | 136 | #define inb_p(addr) inb(addr) |
@@ -213,32 +217,32 @@ static inline void outsl(unsigned long addr, const void *buffer, int count) | |||
213 | 217 | ||
214 | static inline void readsl(const void __iomem *addr, void *buf, int len) | 218 | static inline void readsl(const void __iomem *addr, void *buf, int len) |
215 | { | 219 | { |
216 | insl((unsigned long)addr, buf, len); | 220 | insl(addr - PCI_IOBASE, buf, len); |
217 | } | 221 | } |
218 | 222 | ||
219 | static inline void readsw(const void __iomem *addr, void *buf, int len) | 223 | static inline void readsw(const void __iomem *addr, void *buf, int len) |
220 | { | 224 | { |
221 | insw((unsigned long)addr, buf, len); | 225 | insw(addr - PCI_IOBASE, buf, len); |
222 | } | 226 | } |
223 | 227 | ||
224 | static inline void readsb(const void __iomem *addr, void *buf, int len) | 228 | static inline void readsb(const void __iomem *addr, void *buf, int len) |
225 | { | 229 | { |
226 | insb((unsigned long)addr, buf, len); | 230 | insb(addr - PCI_IOBASE, buf, len); |
227 | } | 231 | } |
228 | 232 | ||
229 | static inline void writesl(const void __iomem *addr, const void *buf, int len) | 233 | static inline void writesl(const void __iomem *addr, const void *buf, int len) |
230 | { | 234 | { |
231 | outsl((unsigned long)addr, buf, len); | 235 | outsl(addr - PCI_IOBASE, buf, len); |
232 | } | 236 | } |
233 | 237 | ||
234 | static inline void writesw(const void __iomem *addr, const void *buf, int len) | 238 | static inline void writesw(const void __iomem *addr, const void *buf, int len) |
235 | { | 239 | { |
236 | outsw((unsigned long)addr, buf, len); | 240 | outsw(addr - PCI_IOBASE, buf, len); |
237 | } | 241 | } |
238 | 242 | ||
239 | static inline void writesb(const void __iomem *addr, const void *buf, int len) | 243 | static inline void writesb(const void __iomem *addr, const void *buf, int len) |
240 | { | 244 | { |
241 | outsb((unsigned long)addr, buf, len); | 245 | outsb(addr - PCI_IOBASE, buf, len); |
242 | } | 246 | } |
243 | 247 | ||
244 | #ifndef CONFIG_GENERIC_IOMAP | 248 | #ifndef CONFIG_GENERIC_IOMAP |
@@ -269,8 +273,9 @@ static inline void writesb(const void __iomem *addr, const void *buf, int len) | |||
269 | outsl((unsigned long) (p), (src), (count)) | 273 | outsl((unsigned long) (p), (src), (count)) |
270 | #endif /* CONFIG_GENERIC_IOMAP */ | 274 | #endif /* CONFIG_GENERIC_IOMAP */ |
271 | 275 | ||
272 | 276 | #ifndef IO_SPACE_LIMIT | |
273 | #define IO_SPACE_LIMIT 0xffffffff | 277 | #define IO_SPACE_LIMIT 0xffff |
278 | #endif | ||
274 | 279 | ||
275 | #ifdef __KERNEL__ | 280 | #ifdef __KERNEL__ |
276 | 281 | ||
diff --git a/include/asm-generic/ioctls.h b/include/asm-generic/ioctls.h index 3f3f2d189fb8..199975fac395 100644 --- a/include/asm-generic/ioctls.h +++ b/include/asm-generic/ioctls.h | |||
@@ -73,6 +73,7 @@ | |||
73 | #define TCSETXF 0x5434 | 73 | #define TCSETXF 0x5434 |
74 | #define TCSETXW 0x5435 | 74 | #define TCSETXW 0x5435 |
75 | #define TIOCSIG _IOW('T', 0x36, int) /* pty: generate signal */ | 75 | #define TIOCSIG _IOW('T', 0x36, int) /* pty: generate signal */ |
76 | #define TIOCVHANGUP 0x5437 | ||
76 | 77 | ||
77 | #define FIONCLEX 0x5450 | 78 | #define FIONCLEX 0x5450 |
78 | #define FIOCLEX 0x5451 | 79 | #define FIOCLEX 0x5451 |
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h index b3bfabc258f3..c1a1216e29ce 100644 --- a/include/asm-generic/sections.h +++ b/include/asm-generic/sections.h | |||
@@ -11,6 +11,7 @@ extern char _sinittext[], _einittext[]; | |||
11 | extern char _end[]; | 11 | extern char _end[]; |
12 | extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[]; | 12 | extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[]; |
13 | extern char __kprobes_text_start[], __kprobes_text_end[]; | 13 | extern char __kprobes_text_start[], __kprobes_text_end[]; |
14 | extern char __entry_text_start[], __entry_text_end[]; | ||
14 | extern char __initdata_begin[], __initdata_end[]; | 15 | extern char __initdata_begin[], __initdata_end[]; |
15 | extern char __start_rodata[], __end_rodata[]; | 16 | extern char __start_rodata[], __end_rodata[]; |
16 | 17 | ||
diff --git a/include/asm-generic/sizes.h b/include/asm-generic/sizes.h new file mode 100644 index 000000000000..ea5d4ef81061 --- /dev/null +++ b/include/asm-generic/sizes.h | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * linux/include/asm-generic/sizes.h | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | #ifndef __ASM_GENERIC_SIZES_H__ | ||
9 | #define __ASM_GENERIC_SIZES_H__ | ||
10 | |||
11 | #define SZ_1 0x00000001 | ||
12 | #define SZ_2 0x00000002 | ||
13 | #define SZ_4 0x00000004 | ||
14 | #define SZ_8 0x00000008 | ||
15 | #define SZ_16 0x00000010 | ||
16 | #define SZ_32 0x00000020 | ||
17 | #define SZ_64 0x00000040 | ||
18 | #define SZ_128 0x00000080 | ||
19 | #define SZ_256 0x00000100 | ||
20 | #define SZ_512 0x00000200 | ||
21 | |||
22 | #define SZ_1K 0x00000400 | ||
23 | #define SZ_2K 0x00000800 | ||
24 | #define SZ_4K 0x00001000 | ||
25 | #define SZ_8K 0x00002000 | ||
26 | #define SZ_16K 0x00004000 | ||
27 | #define SZ_32K 0x00008000 | ||
28 | #define SZ_64K 0x00010000 | ||
29 | #define SZ_128K 0x00020000 | ||
30 | #define SZ_256K 0x00040000 | ||
31 | #define SZ_512K 0x00080000 | ||
32 | |||
33 | #define SZ_1M 0x00100000 | ||
34 | #define SZ_2M 0x00200000 | ||
35 | #define SZ_4M 0x00400000 | ||
36 | #define SZ_8M 0x00800000 | ||
37 | #define SZ_16M 0x01000000 | ||
38 | #define SZ_32M 0x02000000 | ||
39 | #define SZ_64M 0x04000000 | ||
40 | #define SZ_128M 0x08000000 | ||
41 | #define SZ_256M 0x10000000 | ||
42 | #define SZ_512M 0x20000000 | ||
43 | |||
44 | #define SZ_1G 0x40000000 | ||
45 | #define SZ_2G 0x80000000 | ||
46 | |||
47 | #endif /* __ASM_GENERIC_SIZES_H__ */ | ||
diff --git a/include/asm-generic/types.h b/include/asm-generic/types.h index fba7d33ca3f2..7a0f69e6c618 100644 --- a/include/asm-generic/types.h +++ b/include/asm-generic/types.h | |||
@@ -12,31 +12,4 @@ typedef unsigned short umode_t; | |||
12 | 12 | ||
13 | #endif /* __ASSEMBLY__ */ | 13 | #endif /* __ASSEMBLY__ */ |
14 | 14 | ||
15 | /* | ||
16 | * These aren't exported outside the kernel to avoid name space clashes | ||
17 | */ | ||
18 | #ifdef __KERNEL__ | ||
19 | #ifndef __ASSEMBLY__ | ||
20 | /* | ||
21 | * DMA addresses may be very different from physical addresses | ||
22 | * and pointers. i386 and powerpc may have 64 bit DMA on 32 bit | ||
23 | * systems, while sparc64 uses 32 bit DMA addresses for 64 bit | ||
24 | * physical addresses. | ||
25 | * This default defines dma_addr_t to have the same size as | ||
26 | * phys_addr_t, which is the most common way. | ||
27 | * Do not define the dma64_addr_t type, which never really | ||
28 | * worked. | ||
29 | */ | ||
30 | #ifndef dma_addr_t | ||
31 | #ifdef CONFIG_PHYS_ADDR_T_64BIT | ||
32 | typedef u64 dma_addr_t; | ||
33 | #else | ||
34 | typedef u32 dma_addr_t; | ||
35 | #endif /* CONFIG_PHYS_ADDR_T_64BIT */ | ||
36 | #endif /* dma_addr_t */ | ||
37 | |||
38 | #endif /* __ASSEMBLY__ */ | ||
39 | |||
40 | #endif /* __KERNEL__ */ | ||
41 | |||
42 | #endif /* _ASM_GENERIC_TYPES_H */ | 15 | #endif /* _ASM_GENERIC_TYPES_H */ |
diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h index b218b8513d04..ac68c999b6c2 100644 --- a/include/asm-generic/uaccess.h +++ b/include/asm-generic/uaccess.h | |||
@@ -288,14 +288,16 @@ strncpy_from_user(char *dst, const char __user *src, long count) | |||
288 | * | 288 | * |
289 | * Return 0 on exception, a value greater than N if too long | 289 | * Return 0 on exception, a value greater than N if too long |
290 | */ | 290 | */ |
291 | #ifndef strnlen_user | 291 | #ifndef __strnlen_user |
292 | #define __strnlen_user strnlen | ||
293 | #endif | ||
294 | |||
292 | static inline long strnlen_user(const char __user *src, long n) | 295 | static inline long strnlen_user(const char __user *src, long n) |
293 | { | 296 | { |
294 | if (!access_ok(VERIFY_READ, src, 1)) | 297 | if (!access_ok(VERIFY_READ, src, 1)) |
295 | return 0; | 298 | return 0; |
296 | return strlen((void * __force)src) + 1; | 299 | return __strnlen_user(src, n); |
297 | } | 300 | } |
298 | #endif | ||
299 | 301 | ||
300 | static inline long strlen_user(const char __user *src) | 302 | static inline long strlen_user(const char __user *src) |
301 | { | 303 | { |
diff --git a/include/asm-generic/unistd.h b/include/asm-generic/unistd.h index b969770196c2..07c40d5149de 100644 --- a/include/asm-generic/unistd.h +++ b/include/asm-generic/unistd.h | |||
@@ -646,9 +646,17 @@ __SYSCALL(__NR_prlimit64, sys_prlimit64) | |||
646 | __SYSCALL(__NR_fanotify_init, sys_fanotify_init) | 646 | __SYSCALL(__NR_fanotify_init, sys_fanotify_init) |
647 | #define __NR_fanotify_mark 263 | 647 | #define __NR_fanotify_mark 263 |
648 | __SYSCALL(__NR_fanotify_mark, sys_fanotify_mark) | 648 | __SYSCALL(__NR_fanotify_mark, sys_fanotify_mark) |
649 | #define __NR_name_to_handle_at 264 | ||
650 | __SYSCALL(__NR_name_to_handle_at, sys_name_to_handle_at) | ||
651 | #define __NR_open_by_handle_at 265 | ||
652 | __SYSCALL(__NR_open_by_handle_at, sys_open_by_handle_at) | ||
653 | #define __NR_clock_adjtime 266 | ||
654 | __SYSCALL(__NR_clock_adjtime, sys_clock_adjtime) | ||
655 | #define __NR_syncfs 267 | ||
656 | __SYSCALL(__NR_syncfs, sys_syncfs) | ||
649 | 657 | ||
650 | #undef __NR_syscalls | 658 | #undef __NR_syscalls |
651 | #define __NR_syscalls 264 | 659 | #define __NR_syscalls 268 |
652 | 660 | ||
653 | /* | 661 | /* |
654 | * All syscalls below here should go away really, | 662 | * All syscalls below here should go away really, |
diff --git a/include/asm-generic/user.h b/include/asm-generic/user.h index 8b9c3c960aeb..35638c34700f 100644 --- a/include/asm-generic/user.h +++ b/include/asm-generic/user.h | |||
@@ -1,8 +1,8 @@ | |||
1 | #ifndef __ASM_GENERIC_USER_H | 1 | #ifndef __ASM_GENERIC_USER_H |
2 | #define __ASM_GENERIC_USER_H | 2 | #define __ASM_GENERIC_USER_H |
3 | /* | 3 | /* |
4 | * This file may define a 'struct user' structure. However, it it only | 4 | * This file may define a 'struct user' structure. However, it is only |
5 | * used for a.out file, which are not supported on new architectures. | 5 | * used for a.out files, which are not supported on new architectures. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #endif /* __ASM_GENERIC_USER_H */ | 8 | #endif /* __ASM_GENERIC_USER_H */ |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index fe77e3395b40..32c45e5fe0ab 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -15,7 +15,7 @@ | |||
15 | * HEAD_TEXT_SECTION | 15 | * HEAD_TEXT_SECTION |
16 | * INIT_TEXT_SECTION(PAGE_SIZE) | 16 | * INIT_TEXT_SECTION(PAGE_SIZE) |
17 | * INIT_DATA_SECTION(...) | 17 | * INIT_DATA_SECTION(...) |
18 | * PERCPU(PAGE_SIZE) | 18 | * PERCPU(CACHELINE_SIZE, PAGE_SIZE) |
19 | * __init_end = .; | 19 | * __init_end = .; |
20 | * | 20 | * |
21 | * _stext = .; | 21 | * _stext = .; |
@@ -424,6 +424,12 @@ | |||
424 | *(.kprobes.text) \ | 424 | *(.kprobes.text) \ |
425 | VMLINUX_SYMBOL(__kprobes_text_end) = .; | 425 | VMLINUX_SYMBOL(__kprobes_text_end) = .; |
426 | 426 | ||
427 | #define ENTRY_TEXT \ | ||
428 | ALIGN_FUNCTION(); \ | ||
429 | VMLINUX_SYMBOL(__entry_text_start) = .; \ | ||
430 | *(.entry.text) \ | ||
431 | VMLINUX_SYMBOL(__entry_text_end) = .; | ||
432 | |||
427 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 433 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
428 | #define IRQENTRY_TEXT \ | 434 | #define IRQENTRY_TEXT \ |
429 | ALIGN_FUNCTION(); \ | 435 | ALIGN_FUNCTION(); \ |
@@ -683,13 +689,18 @@ | |||
683 | 689 | ||
684 | /** | 690 | /** |
685 | * PERCPU_VADDR - define output section for percpu area | 691 | * PERCPU_VADDR - define output section for percpu area |
692 | * @cacheline: cacheline size | ||
686 | * @vaddr: explicit base address (optional) | 693 | * @vaddr: explicit base address (optional) |
687 | * @phdr: destination PHDR (optional) | 694 | * @phdr: destination PHDR (optional) |
688 | * | 695 | * |
689 | * Macro which expands to output section for percpu area. If @vaddr | 696 | * Macro which expands to output section for percpu area. |
690 | * is not blank, it specifies explicit base address and all percpu | 697 | * |
691 | * symbols will be offset from the given address. If blank, @vaddr | 698 | * @cacheline is used to align subsections to avoid false cacheline |
692 | * always equals @laddr + LOAD_OFFSET. | 699 | * sharing between subsections for different purposes. |
700 | * | ||
701 | * If @vaddr is not blank, it specifies explicit base address and all | ||
702 | * percpu symbols will be offset from the given address. If blank, | ||
703 | * @vaddr always equals @laddr + LOAD_OFFSET. | ||
693 | * | 704 | * |
694 | * @phdr defines the output PHDR to use if not blank. Be warned that | 705 | * @phdr defines the output PHDR to use if not blank. Be warned that |
695 | * output PHDR is sticky. If @phdr is specified, the next output | 706 | * output PHDR is sticky. If @phdr is specified, the next output |
@@ -700,7 +711,7 @@ | |||
700 | * If there is no need to put the percpu section at a predetermined | 711 | * If there is no need to put the percpu section at a predetermined |
701 | * address, use PERCPU(). | 712 | * address, use PERCPU(). |
702 | */ | 713 | */ |
703 | #define PERCPU_VADDR(vaddr, phdr) \ | 714 | #define PERCPU_VADDR(cacheline, vaddr, phdr) \ |
704 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ | 715 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ |
705 | .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ | 716 | .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ |
706 | - LOAD_OFFSET) { \ | 717 | - LOAD_OFFSET) { \ |
@@ -708,7 +719,9 @@ | |||
708 | *(.data..percpu..first) \ | 719 | *(.data..percpu..first) \ |
709 | . = ALIGN(PAGE_SIZE); \ | 720 | . = ALIGN(PAGE_SIZE); \ |
710 | *(.data..percpu..page_aligned) \ | 721 | *(.data..percpu..page_aligned) \ |
722 | . = ALIGN(cacheline); \ | ||
711 | *(.data..percpu..readmostly) \ | 723 | *(.data..percpu..readmostly) \ |
724 | . = ALIGN(cacheline); \ | ||
712 | *(.data..percpu) \ | 725 | *(.data..percpu) \ |
713 | *(.data..percpu..shared_aligned) \ | 726 | *(.data..percpu..shared_aligned) \ |
714 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ | 727 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ |
@@ -717,18 +730,18 @@ | |||
717 | 730 | ||
718 | /** | 731 | /** |
719 | * PERCPU - define output section for percpu area, simple version | 732 | * PERCPU - define output section for percpu area, simple version |
733 | * @cacheline: cacheline size | ||
720 | * @align: required alignment | 734 | * @align: required alignment |
721 | * | 735 | * |
722 | * Align to @align and outputs output section for percpu area. This | 736 | * Align to @align and outputs output section for percpu area. This macro |
723 | * macro doesn't maniuplate @vaddr or @phdr and __per_cpu_load and | 737 | * doesn't manipulate @vaddr or @phdr and __per_cpu_load and |
724 | * __per_cpu_start will be identical. | 738 | * __per_cpu_start will be identical. |
725 | * | 739 | * |
726 | * This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except | 740 | * This macro is equivalent to ALIGN(@align); PERCPU_VADDR(@cacheline,,) |
727 | * that __per_cpu_load is defined as a relative symbol against | 741 | * except that __per_cpu_load is defined as a relative symbol against |
728 | * .data..percpu which is required for relocatable x86_32 | 742 | * .data..percpu which is required for relocatable x86_32 configuration. |
729 | * configuration. | ||
730 | */ | 743 | */ |
731 | #define PERCPU(align) \ | 744 | #define PERCPU(cacheline, align) \ |
732 | . = ALIGN(align); \ | 745 | . = ALIGN(align); \ |
733 | .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ | 746 | .data..percpu : AT(ADDR(.data..percpu) - LOAD_OFFSET) { \ |
734 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ | 747 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ |
@@ -736,7 +749,9 @@ | |||
736 | *(.data..percpu..first) \ | 749 | *(.data..percpu..first) \ |
737 | . = ALIGN(PAGE_SIZE); \ | 750 | . = ALIGN(PAGE_SIZE); \ |
738 | *(.data..percpu..page_aligned) \ | 751 | *(.data..percpu..page_aligned) \ |
752 | . = ALIGN(cacheline); \ | ||
739 | *(.data..percpu..readmostly) \ | 753 | *(.data..percpu..readmostly) \ |
754 | . = ALIGN(cacheline); \ | ||
740 | *(.data..percpu) \ | 755 | *(.data..percpu) \ |
741 | *(.data..percpu..shared_aligned) \ | 756 | *(.data..percpu..shared_aligned) \ |
742 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ | 757 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ |
diff --git a/include/drm/Kbuild b/include/drm/Kbuild index ffec177f3481..3a60ac889520 100644 --- a/include/drm/Kbuild +++ b/include/drm/Kbuild | |||
@@ -2,7 +2,6 @@ header-y += drm.h | |||
2 | header-y += drm_mode.h | 2 | header-y += drm_mode.h |
3 | header-y += drm_sarea.h | 3 | header-y += drm_sarea.h |
4 | header-y += i810_drm.h | 4 | header-y += i810_drm.h |
5 | header-y += i830_drm.h | ||
6 | header-y += i915_drm.h | 5 | header-y += i915_drm.h |
7 | header-y += mga_drm.h | 6 | header-y += mga_drm.h |
8 | header-y += nouveau_drm.h | 7 | header-y += nouveau_drm.h |
diff --git a/include/drm/drm.h b/include/drm/drm.h index e5f70617dec5..9ac431396176 100644 --- a/include/drm/drm.h +++ b/include/drm/drm.h | |||
@@ -608,6 +608,12 @@ struct drm_gem_open { | |||
608 | __u64 size; | 608 | __u64 size; |
609 | }; | 609 | }; |
610 | 610 | ||
611 | /** DRM_IOCTL_GET_CAP ioctl argument type */ | ||
612 | struct drm_get_cap { | ||
613 | __u64 capability; | ||
614 | __u64 value; | ||
615 | }; | ||
616 | |||
611 | #include "drm_mode.h" | 617 | #include "drm_mode.h" |
612 | 618 | ||
613 | #define DRM_IOCTL_BASE 'd' | 619 | #define DRM_IOCTL_BASE 'd' |
@@ -628,6 +634,7 @@ struct drm_gem_open { | |||
628 | #define DRM_IOCTL_GEM_CLOSE DRM_IOW (0x09, struct drm_gem_close) | 634 | #define DRM_IOCTL_GEM_CLOSE DRM_IOW (0x09, struct drm_gem_close) |
629 | #define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink) | 635 | #define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink) |
630 | #define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open) | 636 | #define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open) |
637 | #define DRM_IOCTL_GET_CAP DRM_IOWR(0x0c, struct drm_get_cap) | ||
631 | 638 | ||
632 | #define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique) | 639 | #define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique) |
633 | #define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth) | 640 | #define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth) |
@@ -701,6 +708,10 @@ struct drm_gem_open { | |||
701 | #define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip) | 708 | #define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip) |
702 | #define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd) | 709 | #define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd) |
703 | 710 | ||
711 | #define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb) | ||
712 | #define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb) | ||
713 | #define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb) | ||
714 | |||
704 | /** | 715 | /** |
705 | * Device specific ioctls should only be in their respective headers | 716 | * Device specific ioctls should only be in their respective headers |
706 | * The device specific ioctl range is from 0x40 to 0x99. | 717 | * The device specific ioctl range is from 0x40 to 0x99. |
@@ -741,6 +752,8 @@ struct drm_event_vblank { | |||
741 | __u32 reserved; | 752 | __u32 reserved; |
742 | }; | 753 | }; |
743 | 754 | ||
755 | #define DRM_CAP_DUMB_BUFFER 0x1 | ||
756 | |||
744 | /* typedef area */ | 757 | /* typedef area */ |
745 | #ifndef __KERNEL__ | 758 | #ifndef __KERNEL__ |
746 | typedef struct drm_clip_rect drm_clip_rect_t; | 759 | typedef struct drm_clip_rect drm_clip_rect_t; |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 348843b80150..ad5770f2315c 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -145,7 +145,10 @@ extern void drm_ut_debug_printk(unsigned int request_level, | |||
145 | #define DRIVER_IRQ_VBL2 0x800 | 145 | #define DRIVER_IRQ_VBL2 0x800 |
146 | #define DRIVER_GEM 0x1000 | 146 | #define DRIVER_GEM 0x1000 |
147 | #define DRIVER_MODESET 0x2000 | 147 | #define DRIVER_MODESET 0x2000 |
148 | #define DRIVER_USE_PLATFORM_DEVICE 0x4000 | 148 | |
149 | #define DRIVER_BUS_PCI 0x1 | ||
150 | #define DRIVER_BUS_PLATFORM 0x2 | ||
151 | #define DRIVER_BUS_USB 0x3 | ||
149 | 152 | ||
150 | /***********************************************************************/ | 153 | /***********************************************************************/ |
151 | /** \name Begin the DRM... */ | 154 | /** \name Begin the DRM... */ |
@@ -698,6 +701,19 @@ struct drm_master { | |||
698 | #define DRM_SCANOUTPOS_INVBL (1 << 1) | 701 | #define DRM_SCANOUTPOS_INVBL (1 << 1) |
699 | #define DRM_SCANOUTPOS_ACCURATE (1 << 2) | 702 | #define DRM_SCANOUTPOS_ACCURATE (1 << 2) |
700 | 703 | ||
704 | struct drm_bus { | ||
705 | int bus_type; | ||
706 | int (*get_irq)(struct drm_device *dev); | ||
707 | const char *(*get_name)(struct drm_device *dev); | ||
708 | int (*set_busid)(struct drm_device *dev, struct drm_master *master); | ||
709 | int (*set_unique)(struct drm_device *dev, struct drm_master *master, | ||
710 | struct drm_unique *unique); | ||
711 | int (*irq_by_busid)(struct drm_device *dev, struct drm_irq_busid *p); | ||
712 | /* hooks that are for PCI */ | ||
713 | int (*agp_init)(struct drm_device *dev); | ||
714 | |||
715 | }; | ||
716 | |||
701 | /** | 717 | /** |
702 | * DRM driver structure. This structure represent the common code for | 718 | * DRM driver structure. This structure represent the common code for |
703 | * a family of cards. There will one drm_device for each card present | 719 | * a family of cards. There will one drm_device for each card present |
@@ -880,6 +896,17 @@ struct drm_driver { | |||
880 | /* vga arb irq handler */ | 896 | /* vga arb irq handler */ |
881 | void (*vgaarb_irq)(struct drm_device *dev, bool state); | 897 | void (*vgaarb_irq)(struct drm_device *dev, bool state); |
882 | 898 | ||
899 | /* dumb alloc support */ | ||
900 | int (*dumb_create)(struct drm_file *file_priv, | ||
901 | struct drm_device *dev, | ||
902 | struct drm_mode_create_dumb *args); | ||
903 | int (*dumb_map_offset)(struct drm_file *file_priv, | ||
904 | struct drm_device *dev, uint32_t handle, | ||
905 | uint64_t *offset); | ||
906 | int (*dumb_destroy)(struct drm_file *file_priv, | ||
907 | struct drm_device *dev, | ||
908 | uint32_t handle); | ||
909 | |||
883 | /* Driver private ops for this object */ | 910 | /* Driver private ops for this object */ |
884 | struct vm_operations_struct *gem_vm_ops; | 911 | struct vm_operations_struct *gem_vm_ops; |
885 | 912 | ||
@@ -895,8 +922,13 @@ struct drm_driver { | |||
895 | struct drm_ioctl_desc *ioctls; | 922 | struct drm_ioctl_desc *ioctls; |
896 | int num_ioctls; | 923 | int num_ioctls; |
897 | struct file_operations fops; | 924 | struct file_operations fops; |
898 | struct pci_driver pci_driver; | 925 | union { |
899 | struct platform_device *platform_device; | 926 | struct pci_driver *pci; |
927 | struct platform_device *platform_device; | ||
928 | struct usb_driver *usb; | ||
929 | } kdriver; | ||
930 | struct drm_bus *bus; | ||
931 | |||
900 | /* List of devices hanging off this driver */ | 932 | /* List of devices hanging off this driver */ |
901 | struct list_head device_list; | 933 | struct list_head device_list; |
902 | }; | 934 | }; |
@@ -1099,6 +1131,7 @@ struct drm_device { | |||
1099 | #endif | 1131 | #endif |
1100 | 1132 | ||
1101 | struct platform_device *platformdev; /**< Platform device struture */ | 1133 | struct platform_device *platformdev; /**< Platform device struture */ |
1134 | struct usb_device *usbdev; | ||
1102 | 1135 | ||
1103 | struct drm_sg_mem *sg; /**< Scatter gather memory */ | 1136 | struct drm_sg_mem *sg; /**< Scatter gather memory */ |
1104 | unsigned int num_crtcs; /**< Number of CRTCs on this device */ | 1137 | unsigned int num_crtcs; /**< Number of CRTCs on this device */ |
@@ -1136,28 +1169,9 @@ static __inline__ int drm_core_check_feature(struct drm_device *dev, | |||
1136 | 1169 | ||
1137 | static inline int drm_dev_to_irq(struct drm_device *dev) | 1170 | static inline int drm_dev_to_irq(struct drm_device *dev) |
1138 | { | 1171 | { |
1139 | if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) | 1172 | return dev->driver->bus->get_irq(dev); |
1140 | return platform_get_irq(dev->platformdev, 0); | ||
1141 | else | ||
1142 | return dev->pdev->irq; | ||
1143 | } | 1173 | } |
1144 | 1174 | ||
1145 | static inline int drm_get_pci_domain(struct drm_device *dev) | ||
1146 | { | ||
1147 | if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) | ||
1148 | return 0; | ||
1149 | |||
1150 | #ifndef __alpha__ | ||
1151 | /* For historical reasons, drm_get_pci_domain() is busticated | ||
1152 | * on most archs and has to remain so for userspace interface | ||
1153 | * < 1.4, except on alpha which was right from the beginning | ||
1154 | */ | ||
1155 | if (dev->if_version < 0x10004) | ||
1156 | return 0; | ||
1157 | #endif /* __alpha__ */ | ||
1158 | |||
1159 | return pci_domain_nr(dev->pdev->bus); | ||
1160 | } | ||
1161 | 1175 | ||
1162 | #if __OS_HAS_AGP | 1176 | #if __OS_HAS_AGP |
1163 | static inline int drm_core_has_AGP(struct drm_device *dev) | 1177 | static inline int drm_core_has_AGP(struct drm_device *dev) |
@@ -1211,8 +1225,6 @@ static inline int drm_mtrr_del(int handle, unsigned long offset, | |||
1211 | /*@{*/ | 1225 | /*@{*/ |
1212 | 1226 | ||
1213 | /* Driver support (drm_drv.h) */ | 1227 | /* Driver support (drm_drv.h) */ |
1214 | extern int drm_init(struct drm_driver *driver); | ||
1215 | extern void drm_exit(struct drm_driver *driver); | ||
1216 | extern long drm_ioctl(struct file *filp, | 1228 | extern long drm_ioctl(struct file *filp, |
1217 | unsigned int cmd, unsigned long arg); | 1229 | unsigned int cmd, unsigned long arg); |
1218 | extern long drm_compat_ioctl(struct file *filp, | 1230 | extern long drm_compat_ioctl(struct file *filp, |
@@ -1264,6 +1276,8 @@ extern int drm_getclient(struct drm_device *dev, void *data, | |||
1264 | struct drm_file *file_priv); | 1276 | struct drm_file *file_priv); |
1265 | extern int drm_getstats(struct drm_device *dev, void *data, | 1277 | extern int drm_getstats(struct drm_device *dev, void *data, |
1266 | struct drm_file *file_priv); | 1278 | struct drm_file *file_priv); |
1279 | extern int drm_getcap(struct drm_device *dev, void *data, | ||
1280 | struct drm_file *file_priv); | ||
1267 | extern int drm_setversion(struct drm_device *dev, void *data, | 1281 | extern int drm_setversion(struct drm_device *dev, void *data, |
1268 | struct drm_file *file_priv); | 1282 | struct drm_file *file_priv); |
1269 | extern int drm_noop(struct drm_device *dev, void *data, | 1283 | extern int drm_noop(struct drm_device *dev, void *data, |
@@ -1422,11 +1436,7 @@ extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data, | |||
1422 | struct drm_master *drm_master_create(struct drm_minor *minor); | 1436 | struct drm_master *drm_master_create(struct drm_minor *minor); |
1423 | extern struct drm_master *drm_master_get(struct drm_master *master); | 1437 | extern struct drm_master *drm_master_get(struct drm_master *master); |
1424 | extern void drm_master_put(struct drm_master **master); | 1438 | extern void drm_master_put(struct drm_master **master); |
1425 | extern int drm_get_pci_dev(struct pci_dev *pdev, | 1439 | |
1426 | const struct pci_device_id *ent, | ||
1427 | struct drm_driver *driver); | ||
1428 | extern int drm_get_platform_dev(struct platform_device *pdev, | ||
1429 | struct drm_driver *driver); | ||
1430 | extern void drm_put_dev(struct drm_device *dev); | 1440 | extern void drm_put_dev(struct drm_device *dev); |
1431 | extern int drm_put_minor(struct drm_minor **minor); | 1441 | extern int drm_put_minor(struct drm_minor **minor); |
1432 | extern unsigned int drm_debug; | 1442 | extern unsigned int drm_debug; |
@@ -1544,6 +1554,7 @@ drm_gem_object_unreference_unlocked(struct drm_gem_object *obj) | |||
1544 | int drm_gem_handle_create(struct drm_file *file_priv, | 1554 | int drm_gem_handle_create(struct drm_file *file_priv, |
1545 | struct drm_gem_object *obj, | 1555 | struct drm_gem_object *obj, |
1546 | u32 *handlep); | 1556 | u32 *handlep); |
1557 | int drm_gem_handle_delete(struct drm_file *filp, u32 handle); | ||
1547 | 1558 | ||
1548 | static inline void | 1559 | static inline void |
1549 | drm_gem_object_handle_reference(struct drm_gem_object *obj) | 1560 | drm_gem_object_handle_reference(struct drm_gem_object *obj) |
@@ -1616,11 +1627,21 @@ static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev, | |||
1616 | return NULL; | 1627 | return NULL; |
1617 | } | 1628 | } |
1618 | 1629 | ||
1619 | static __inline__ int drm_device_is_agp(struct drm_device *dev) | 1630 | static __inline__ void drm_core_dropmap(struct drm_local_map *map) |
1620 | { | 1631 | { |
1621 | if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) | 1632 | } |
1622 | return 0; | ||
1623 | 1633 | ||
1634 | #include "drm_mem_util.h" | ||
1635 | |||
1636 | extern int drm_fill_in_dev(struct drm_device *dev, | ||
1637 | const struct pci_device_id *ent, | ||
1638 | struct drm_driver *driver); | ||
1639 | int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type); | ||
1640 | /*@}*/ | ||
1641 | |||
1642 | /* PCI section */ | ||
1643 | static __inline__ int drm_pci_device_is_agp(struct drm_device *dev) | ||
1644 | { | ||
1624 | if (dev->driver->device_is_agp != NULL) { | 1645 | if (dev->driver->device_is_agp != NULL) { |
1625 | int err = (*dev->driver->device_is_agp) (dev); | 1646 | int err = (*dev->driver->device_is_agp) (dev); |
1626 | 1647 | ||
@@ -1632,35 +1653,26 @@ static __inline__ int drm_device_is_agp(struct drm_device *dev) | |||
1632 | return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP); | 1653 | return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP); |
1633 | } | 1654 | } |
1634 | 1655 | ||
1635 | static __inline__ int drm_device_is_pcie(struct drm_device *dev) | ||
1636 | { | ||
1637 | if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) | ||
1638 | return 0; | ||
1639 | else | ||
1640 | return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP); | ||
1641 | } | ||
1642 | 1656 | ||
1643 | static __inline__ void drm_core_dropmap(struct drm_local_map *map) | 1657 | static __inline__ int drm_pci_device_is_pcie(struct drm_device *dev) |
1644 | { | 1658 | { |
1659 | return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP); | ||
1645 | } | 1660 | } |
1646 | 1661 | ||
1647 | #include "drm_mem_util.h" | ||
1648 | |||
1649 | static inline void *drm_get_device(struct drm_device *dev) | ||
1650 | { | ||
1651 | if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) | ||
1652 | return dev->platformdev; | ||
1653 | else | ||
1654 | return dev->pdev; | ||
1655 | } | ||
1656 | 1662 | ||
1657 | extern int drm_platform_init(struct drm_driver *driver); | 1663 | extern int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver); |
1658 | extern int drm_pci_init(struct drm_driver *driver); | 1664 | extern void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver); |
1659 | extern int drm_fill_in_dev(struct drm_device *dev, | 1665 | extern int drm_get_pci_dev(struct pci_dev *pdev, |
1660 | const struct pci_device_id *ent, | 1666 | const struct pci_device_id *ent, |
1661 | struct drm_driver *driver); | 1667 | struct drm_driver *driver); |
1662 | int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type); | 1668 | |
1663 | /*@}*/ | 1669 | |
1670 | /* platform section */ | ||
1671 | extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device); | ||
1672 | extern void drm_platform_exit(struct drm_driver *driver, struct platform_device *platform_device); | ||
1673 | |||
1674 | extern int drm_get_platform_dev(struct platform_device *pdev, | ||
1675 | struct drm_driver *driver); | ||
1664 | 1676 | ||
1665 | #endif /* __KERNEL__ */ | 1677 | #endif /* __KERNEL__ */ |
1666 | #endif | 1678 | #endif |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 801be59f4f15..60edf9be31e5 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
@@ -659,7 +659,7 @@ extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid | |||
659 | extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); | 659 | extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); |
660 | extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode); | 660 | extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode); |
661 | extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, | 661 | extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, |
662 | struct drm_display_mode *mode); | 662 | const struct drm_display_mode *mode); |
663 | extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode); | 663 | extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode); |
664 | extern void drm_mode_config_init(struct drm_device *dev); | 664 | extern void drm_mode_config_init(struct drm_device *dev); |
665 | extern void drm_mode_config_reset(struct drm_device *dev); | 665 | extern void drm_mode_config_reset(struct drm_device *dev); |
@@ -685,8 +685,8 @@ extern void drm_mode_validate_size(struct drm_device *dev, | |||
685 | extern void drm_mode_prune_invalid(struct drm_device *dev, | 685 | extern void drm_mode_prune_invalid(struct drm_device *dev, |
686 | struct list_head *mode_list, bool verbose); | 686 | struct list_head *mode_list, bool verbose); |
687 | extern void drm_mode_sort(struct list_head *mode_list); | 687 | extern void drm_mode_sort(struct list_head *mode_list); |
688 | extern int drm_mode_hsync(struct drm_display_mode *mode); | 688 | extern int drm_mode_hsync(const struct drm_display_mode *mode); |
689 | extern int drm_mode_vrefresh(struct drm_display_mode *mode); | 689 | extern int drm_mode_vrefresh(const struct drm_display_mode *mode); |
690 | extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, | 690 | extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, |
691 | int adjust_flags); | 691 | int adjust_flags); |
692 | extern void drm_mode_connector_list_update(struct drm_connector *connector); | 692 | extern void drm_mode_connector_list_update(struct drm_connector *connector); |
@@ -798,4 +798,11 @@ extern int drm_add_modes_noedid(struct drm_connector *connector, | |||
798 | extern bool drm_edid_is_valid(struct edid *edid); | 798 | extern bool drm_edid_is_valid(struct edid *edid); |
799 | struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, | 799 | struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, |
800 | int hsize, int vsize, int fresh); | 800 | int hsize, int vsize, int fresh); |
801 | |||
802 | extern int drm_mode_create_dumb_ioctl(struct drm_device *dev, | ||
803 | void *data, struct drm_file *file_priv); | ||
804 | extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, | ||
805 | void *data, struct drm_file *file_priv); | ||
806 | extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, | ||
807 | void *data, struct drm_file *file_priv); | ||
801 | #endif /* __DRM_CRTC_H__ */ | 808 | #endif /* __DRM_CRTC_H__ */ |
diff --git a/include/drm/drm_hashtab.h b/include/drm/drm_hashtab.h index 0af087a4d3b3..3650d5d011ee 100644 --- a/include/drm/drm_hashtab.h +++ b/include/drm/drm_hashtab.h | |||
@@ -45,14 +45,10 @@ struct drm_hash_item { | |||
45 | }; | 45 | }; |
46 | 46 | ||
47 | struct drm_open_hash { | 47 | struct drm_open_hash { |
48 | unsigned int size; | ||
49 | unsigned int order; | ||
50 | unsigned int fill; | ||
51 | struct hlist_head *table; | 48 | struct hlist_head *table; |
52 | int use_vmalloc; | 49 | u8 order; |
53 | }; | 50 | }; |
54 | 51 | ||
55 | |||
56 | extern int drm_ht_create(struct drm_open_hash *ht, unsigned int order); | 52 | extern int drm_ht_create(struct drm_open_hash *ht, unsigned int order); |
57 | extern int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item); | 53 | extern int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item); |
58 | extern int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item, | 54 | extern int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item, |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index e39177778601..b1e7809e5e15 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
@@ -42,23 +42,25 @@ | |||
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | struct drm_mm_node { | 44 | struct drm_mm_node { |
45 | struct list_head free_stack; | ||
46 | struct list_head node_list; | 45 | struct list_head node_list; |
47 | unsigned free : 1; | 46 | struct list_head hole_stack; |
47 | unsigned hole_follows : 1; | ||
48 | unsigned scanned_block : 1; | 48 | unsigned scanned_block : 1; |
49 | unsigned scanned_prev_free : 1; | 49 | unsigned scanned_prev_free : 1; |
50 | unsigned scanned_next_free : 1; | 50 | unsigned scanned_next_free : 1; |
51 | unsigned scanned_preceeds_hole : 1; | ||
52 | unsigned allocated : 1; | ||
51 | unsigned long start; | 53 | unsigned long start; |
52 | unsigned long size; | 54 | unsigned long size; |
53 | struct drm_mm *mm; | 55 | struct drm_mm *mm; |
54 | }; | 56 | }; |
55 | 57 | ||
56 | struct drm_mm { | 58 | struct drm_mm { |
57 | /* List of free memory blocks, most recently freed ordered. */ | 59 | /* List of all memory nodes that immediatly preceed a free hole. */ |
58 | struct list_head free_stack; | 60 | struct list_head hole_stack; |
59 | /* List of all memory nodes, ordered according to the (increasing) start | 61 | /* head_node.node_list is the list of all memory nodes, ordered |
60 | * address of the memory node. */ | 62 | * according to the (increasing) start address of the memory node. */ |
61 | struct list_head node_list; | 63 | struct drm_mm_node head_node; |
62 | struct list_head unused_nodes; | 64 | struct list_head unused_nodes; |
63 | int num_unused; | 65 | int num_unused; |
64 | spinlock_t unused_lock; | 66 | spinlock_t unused_lock; |
@@ -70,8 +72,28 @@ struct drm_mm { | |||
70 | unsigned scanned_blocks; | 72 | unsigned scanned_blocks; |
71 | unsigned long scan_start; | 73 | unsigned long scan_start; |
72 | unsigned long scan_end; | 74 | unsigned long scan_end; |
75 | struct drm_mm_node *prev_scanned_node; | ||
73 | }; | 76 | }; |
74 | 77 | ||
78 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) | ||
79 | { | ||
80 | return node->allocated; | ||
81 | } | ||
82 | |||
83 | static inline bool drm_mm_initialized(struct drm_mm *mm) | ||
84 | { | ||
85 | return mm->hole_stack.next; | ||
86 | } | ||
87 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ | ||
88 | &(mm)->head_node.node_list, \ | ||
89 | node_list); | ||
90 | #define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ | ||
91 | for (entry = (mm)->prev_scanned_node, \ | ||
92 | next = entry ? list_entry(entry->node_list.next, \ | ||
93 | struct drm_mm_node, node_list) : NULL; \ | ||
94 | entry != NULL; entry = next, \ | ||
95 | next = entry ? list_entry(entry->node_list.next, \ | ||
96 | struct drm_mm_node, node_list) : NULL) \ | ||
75 | /* | 97 | /* |
76 | * Basic range manager support (drm_mm.c) | 98 | * Basic range manager support (drm_mm.c) |
77 | */ | 99 | */ |
@@ -118,7 +140,15 @@ static inline struct drm_mm_node *drm_mm_get_block_atomic_range( | |||
118 | return drm_mm_get_block_range_generic(parent, size, alignment, | 140 | return drm_mm_get_block_range_generic(parent, size, alignment, |
119 | start, end, 1); | 141 | start, end, 1); |
120 | } | 142 | } |
143 | extern int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node, | ||
144 | unsigned long size, unsigned alignment); | ||
145 | extern int drm_mm_insert_node_in_range(struct drm_mm *mm, | ||
146 | struct drm_mm_node *node, | ||
147 | unsigned long size, unsigned alignment, | ||
148 | unsigned long start, unsigned long end); | ||
121 | extern void drm_mm_put_block(struct drm_mm_node *cur); | 149 | extern void drm_mm_put_block(struct drm_mm_node *cur); |
150 | extern void drm_mm_remove_node(struct drm_mm_node *node); | ||
151 | extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); | ||
122 | extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, | 152 | extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, |
123 | unsigned long size, | 153 | unsigned long size, |
124 | unsigned alignment, | 154 | unsigned alignment, |
@@ -134,11 +164,6 @@ extern int drm_mm_init(struct drm_mm *mm, unsigned long start, | |||
134 | unsigned long size); | 164 | unsigned long size); |
135 | extern void drm_mm_takedown(struct drm_mm *mm); | 165 | extern void drm_mm_takedown(struct drm_mm *mm); |
136 | extern int drm_mm_clean(struct drm_mm *mm); | 166 | extern int drm_mm_clean(struct drm_mm *mm); |
137 | extern unsigned long drm_mm_tail_space(struct drm_mm *mm); | ||
138 | extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, | ||
139 | unsigned long size); | ||
140 | extern int drm_mm_add_space_to_tail(struct drm_mm *mm, | ||
141 | unsigned long size, int atomic); | ||
142 | extern int drm_mm_pre_get(struct drm_mm *mm); | 167 | extern int drm_mm_pre_get(struct drm_mm *mm); |
143 | 168 | ||
144 | static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) | 169 | static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) |
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h index 0fc7397c8f1f..ae6b7a3dbec7 100644 --- a/include/drm/drm_mode.h +++ b/include/drm/drm_mode.h | |||
@@ -344,4 +344,33 @@ struct drm_mode_crtc_page_flip { | |||
344 | __u64 user_data; | 344 | __u64 user_data; |
345 | }; | 345 | }; |
346 | 346 | ||
347 | /* create a dumb scanout buffer */ | ||
348 | struct drm_mode_create_dumb { | ||
349 | uint32_t height; | ||
350 | uint32_t width; | ||
351 | uint32_t bpp; | ||
352 | uint32_t flags; | ||
353 | /* handle, pitch, size will be returned */ | ||
354 | uint32_t handle; | ||
355 | uint32_t pitch; | ||
356 | uint64_t size; | ||
357 | }; | ||
358 | |||
359 | /* set up for mmap of a dumb scanout buffer */ | ||
360 | struct drm_mode_map_dumb { | ||
361 | /** Handle for the object being mapped. */ | ||
362 | __u32 handle; | ||
363 | __u32 pad; | ||
364 | /** | ||
365 | * Fake offset to use for subsequent mmap call | ||
366 | * | ||
367 | * This is a fixed-size type for 32/64 compatibility. | ||
368 | */ | ||
369 | __u64 offset; | ||
370 | }; | ||
371 | |||
372 | struct drm_mode_destroy_dumb { | ||
373 | uint32_t handle; | ||
374 | }; | ||
375 | |||
347 | #endif | 376 | #endif |
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 5ff1194dc2ea..820ee9029482 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
@@ -141,6 +141,20 @@ | |||
141 | {0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ | 141 | {0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ |
142 | {0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ | 142 | {0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ |
143 | {0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ | 143 | {0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ |
144 | {0x1002, 0x6700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
145 | {0x1002, 0x6701, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
146 | {0x1002, 0x6702, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
147 | {0x1002, 0x6703, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
148 | {0x1002, 0x6704, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
149 | {0x1002, 0x6705, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
150 | {0x1002, 0x6706, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
151 | {0x1002, 0x6707, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
152 | {0x1002, 0x6708, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
153 | {0x1002, 0x6709, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
154 | {0x1002, 0x6718, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
155 | {0x1002, 0x6719, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
156 | {0x1002, 0x671c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
157 | {0x1002, 0x671d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAYMAN|RADEON_NEW_MEMMAP}, \ | ||
144 | {0x1002, 0x6720, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 158 | {0x1002, 0x6720, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
145 | {0x1002, 0x6721, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 159 | {0x1002, 0x6721, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
146 | {0x1002, 0x6722, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ | 160 | {0x1002, 0x6722, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_BARTS|RADEON_NEW_MEMMAP}, \ |
diff --git a/include/drm/drm_usb.h b/include/drm/drm_usb.h new file mode 100644 index 000000000000..33506c11da8b --- /dev/null +++ b/include/drm/drm_usb.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef DRM_USB_H | ||
2 | #define DRM_USB_H | ||
3 | |||
4 | #include <drmP.h> | ||
5 | |||
6 | #include <linux/usb.h> | ||
7 | |||
8 | extern int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver); | ||
9 | extern void drm_usb_exit(struct drm_driver *driver, struct usb_driver *udriver); | ||
10 | |||
11 | int drm_get_usb_dev(struct usb_interface *interface, | ||
12 | const struct usb_device_id *id, | ||
13 | struct drm_driver *driver); | ||
14 | |||
15 | #endif | ||
diff --git a/include/drm/i830_drm.h b/include/drm/i830_drm.h deleted file mode 100644 index 61315c29b8f3..000000000000 --- a/include/drm/i830_drm.h +++ /dev/null | |||
@@ -1,342 +0,0 @@ | |||
1 | #ifndef _I830_DRM_H_ | ||
2 | #define _I830_DRM_H_ | ||
3 | |||
4 | /* WARNING: These defines must be the same as what the Xserver uses. | ||
5 | * if you change them, you must change the defines in the Xserver. | ||
6 | * | ||
7 | * KW: Actually, you can't ever change them because doing so would | ||
8 | * break backwards compatibility. | ||
9 | */ | ||
10 | |||
11 | #ifndef _I830_DEFINES_ | ||
12 | #define _I830_DEFINES_ | ||
13 | |||
14 | #define I830_DMA_BUF_ORDER 12 | ||
15 | #define I830_DMA_BUF_SZ (1<<I830_DMA_BUF_ORDER) | ||
16 | #define I830_DMA_BUF_NR 256 | ||
17 | #define I830_NR_SAREA_CLIPRECTS 8 | ||
18 | |||
19 | /* Each region is a minimum of 64k, and there are at most 64 of them. | ||
20 | */ | ||
21 | #define I830_NR_TEX_REGIONS 64 | ||
22 | #define I830_LOG_MIN_TEX_REGION_SIZE 16 | ||
23 | |||
24 | /* KW: These aren't correct but someone set them to two and then | ||
25 | * released the module. Now we can't change them as doing so would | ||
26 | * break backwards compatibility. | ||
27 | */ | ||
28 | #define I830_TEXTURE_COUNT 2 | ||
29 | #define I830_TEXBLEND_COUNT I830_TEXTURE_COUNT | ||
30 | |||
31 | #define I830_TEXBLEND_SIZE 12 /* (4 args + op) * 2 + COLOR_FACTOR */ | ||
32 | |||
33 | #define I830_UPLOAD_CTX 0x1 | ||
34 | #define I830_UPLOAD_BUFFERS 0x2 | ||
35 | #define I830_UPLOAD_CLIPRECTS 0x4 | ||
36 | #define I830_UPLOAD_TEX0_IMAGE 0x100 /* handled clientside */ | ||
37 | #define I830_UPLOAD_TEX0_CUBE 0x200 /* handled clientside */ | ||
38 | #define I830_UPLOAD_TEX1_IMAGE 0x400 /* handled clientside */ | ||
39 | #define I830_UPLOAD_TEX1_CUBE 0x800 /* handled clientside */ | ||
40 | #define I830_UPLOAD_TEX2_IMAGE 0x1000 /* handled clientside */ | ||
41 | #define I830_UPLOAD_TEX2_CUBE 0x2000 /* handled clientside */ | ||
42 | #define I830_UPLOAD_TEX3_IMAGE 0x4000 /* handled clientside */ | ||
43 | #define I830_UPLOAD_TEX3_CUBE 0x8000 /* handled clientside */ | ||
44 | #define I830_UPLOAD_TEX_N_IMAGE(n) (0x100 << (n * 2)) | ||
45 | #define I830_UPLOAD_TEX_N_CUBE(n) (0x200 << (n * 2)) | ||
46 | #define I830_UPLOAD_TEXIMAGE_MASK 0xff00 | ||
47 | #define I830_UPLOAD_TEX0 0x10000 | ||
48 | #define I830_UPLOAD_TEX1 0x20000 | ||
49 | #define I830_UPLOAD_TEX2 0x40000 | ||
50 | #define I830_UPLOAD_TEX3 0x80000 | ||
51 | #define I830_UPLOAD_TEX_N(n) (0x10000 << (n)) | ||
52 | #define I830_UPLOAD_TEX_MASK 0xf0000 | ||
53 | #define I830_UPLOAD_TEXBLEND0 0x100000 | ||
54 | #define I830_UPLOAD_TEXBLEND1 0x200000 | ||
55 | #define I830_UPLOAD_TEXBLEND2 0x400000 | ||
56 | #define I830_UPLOAD_TEXBLEND3 0x800000 | ||
57 | #define I830_UPLOAD_TEXBLEND_N(n) (0x100000 << (n)) | ||
58 | #define I830_UPLOAD_TEXBLEND_MASK 0xf00000 | ||
59 | #define I830_UPLOAD_TEX_PALETTE_N(n) (0x1000000 << (n)) | ||
60 | #define I830_UPLOAD_TEX_PALETTE_SHARED 0x4000000 | ||
61 | #define I830_UPLOAD_STIPPLE 0x8000000 | ||
62 | |||
63 | /* Indices into buf.Setup where various bits of state are mirrored per | ||
64 | * context and per buffer. These can be fired at the card as a unit, | ||
65 | * or in a piecewise fashion as required. | ||
66 | */ | ||
67 | |||
68 | /* Destbuffer state | ||
69 | * - backbuffer linear offset and pitch -- invarient in the current dri | ||
70 | * - zbuffer linear offset and pitch -- also invarient | ||
71 | * - drawing origin in back and depth buffers. | ||
72 | * | ||
73 | * Keep the depth/back buffer state here to accommodate private buffers | ||
74 | * in the future. | ||
75 | */ | ||
76 | |||
77 | #define I830_DESTREG_CBUFADDR 0 | ||
78 | #define I830_DESTREG_DBUFADDR 1 | ||
79 | #define I830_DESTREG_DV0 2 | ||
80 | #define I830_DESTREG_DV1 3 | ||
81 | #define I830_DESTREG_SENABLE 4 | ||
82 | #define I830_DESTREG_SR0 5 | ||
83 | #define I830_DESTREG_SR1 6 | ||
84 | #define I830_DESTREG_SR2 7 | ||
85 | #define I830_DESTREG_DR0 8 | ||
86 | #define I830_DESTREG_DR1 9 | ||
87 | #define I830_DESTREG_DR2 10 | ||
88 | #define I830_DESTREG_DR3 11 | ||
89 | #define I830_DESTREG_DR4 12 | ||
90 | #define I830_DEST_SETUP_SIZE 13 | ||
91 | |||
92 | /* Context state | ||
93 | */ | ||
94 | #define I830_CTXREG_STATE1 0 | ||
95 | #define I830_CTXREG_STATE2 1 | ||
96 | #define I830_CTXREG_STATE3 2 | ||
97 | #define I830_CTXREG_STATE4 3 | ||
98 | #define I830_CTXREG_STATE5 4 | ||
99 | #define I830_CTXREG_IALPHAB 5 | ||
100 | #define I830_CTXREG_STENCILTST 6 | ||
101 | #define I830_CTXREG_ENABLES_1 7 | ||
102 | #define I830_CTXREG_ENABLES_2 8 | ||
103 | #define I830_CTXREG_AA 9 | ||
104 | #define I830_CTXREG_FOGCOLOR 10 | ||
105 | #define I830_CTXREG_BLENDCOLR0 11 | ||
106 | #define I830_CTXREG_BLENDCOLR 12 /* Dword 1 of 2 dword command */ | ||
107 | #define I830_CTXREG_VF 13 | ||
108 | #define I830_CTXREG_VF2 14 | ||
109 | #define I830_CTXREG_MCSB0 15 | ||
110 | #define I830_CTXREG_MCSB1 16 | ||
111 | #define I830_CTX_SETUP_SIZE 17 | ||
112 | |||
113 | /* 1.3: Stipple state | ||
114 | */ | ||
115 | #define I830_STPREG_ST0 0 | ||
116 | #define I830_STPREG_ST1 1 | ||
117 | #define I830_STP_SETUP_SIZE 2 | ||
118 | |||
119 | /* Texture state (per tex unit) | ||
120 | */ | ||
121 | |||
122 | #define I830_TEXREG_MI0 0 /* GFX_OP_MAP_INFO (6 dwords) */ | ||
123 | #define I830_TEXREG_MI1 1 | ||
124 | #define I830_TEXREG_MI2 2 | ||
125 | #define I830_TEXREG_MI3 3 | ||
126 | #define I830_TEXREG_MI4 4 | ||
127 | #define I830_TEXREG_MI5 5 | ||
128 | #define I830_TEXREG_MF 6 /* GFX_OP_MAP_FILTER */ | ||
129 | #define I830_TEXREG_MLC 7 /* GFX_OP_MAP_LOD_CTL */ | ||
130 | #define I830_TEXREG_MLL 8 /* GFX_OP_MAP_LOD_LIMITS */ | ||
131 | #define I830_TEXREG_MCS 9 /* GFX_OP_MAP_COORD_SETS */ | ||
132 | #define I830_TEX_SETUP_SIZE 10 | ||
133 | |||
134 | #define I830_TEXREG_TM0LI 0 /* load immediate 2 texture map n */ | ||
135 | #define I830_TEXREG_TM0S0 1 | ||
136 | #define I830_TEXREG_TM0S1 2 | ||
137 | #define I830_TEXREG_TM0S2 3 | ||
138 | #define I830_TEXREG_TM0S3 4 | ||
139 | #define I830_TEXREG_TM0S4 5 | ||
140 | #define I830_TEXREG_NOP0 6 /* noop */ | ||
141 | #define I830_TEXREG_NOP1 7 /* noop */ | ||
142 | #define I830_TEXREG_NOP2 8 /* noop */ | ||
143 | #define __I830_TEXREG_MCS 9 /* GFX_OP_MAP_COORD_SETS -- shared */ | ||
144 | #define __I830_TEX_SETUP_SIZE 10 | ||
145 | |||
146 | #define I830_FRONT 0x1 | ||
147 | #define I830_BACK 0x2 | ||
148 | #define I830_DEPTH 0x4 | ||
149 | |||
150 | #endif /* _I830_DEFINES_ */ | ||
151 | |||
152 | typedef struct _drm_i830_init { | ||
153 | enum { | ||
154 | I830_INIT_DMA = 0x01, | ||
155 | I830_CLEANUP_DMA = 0x02 | ||
156 | } func; | ||
157 | unsigned int mmio_offset; | ||
158 | unsigned int buffers_offset; | ||
159 | int sarea_priv_offset; | ||
160 | unsigned int ring_start; | ||
161 | unsigned int ring_end; | ||
162 | unsigned int ring_size; | ||
163 | unsigned int front_offset; | ||
164 | unsigned int back_offset; | ||
165 | unsigned int depth_offset; | ||
166 | unsigned int w; | ||
167 | unsigned int h; | ||
168 | unsigned int pitch; | ||
169 | unsigned int pitch_bits; | ||
170 | unsigned int back_pitch; | ||
171 | unsigned int depth_pitch; | ||
172 | unsigned int cpp; | ||
173 | } drm_i830_init_t; | ||
174 | |||
175 | /* Warning: If you change the SAREA structure you must change the Xserver | ||
176 | * structure as well */ | ||
177 | |||
178 | typedef struct _drm_i830_tex_region { | ||
179 | unsigned char next, prev; /* indices to form a circular LRU */ | ||
180 | unsigned char in_use; /* owned by a client, or free? */ | ||
181 | int age; /* tracked by clients to update local LRU's */ | ||
182 | } drm_i830_tex_region_t; | ||
183 | |||
184 | typedef struct _drm_i830_sarea { | ||
185 | unsigned int ContextState[I830_CTX_SETUP_SIZE]; | ||
186 | unsigned int BufferState[I830_DEST_SETUP_SIZE]; | ||
187 | unsigned int TexState[I830_TEXTURE_COUNT][I830_TEX_SETUP_SIZE]; | ||
188 | unsigned int TexBlendState[I830_TEXBLEND_COUNT][I830_TEXBLEND_SIZE]; | ||
189 | unsigned int TexBlendStateWordsUsed[I830_TEXBLEND_COUNT]; | ||
190 | unsigned int Palette[2][256]; | ||
191 | unsigned int dirty; | ||
192 | |||
193 | unsigned int nbox; | ||
194 | struct drm_clip_rect boxes[I830_NR_SAREA_CLIPRECTS]; | ||
195 | |||
196 | /* Maintain an LRU of contiguous regions of texture space. If | ||
197 | * you think you own a region of texture memory, and it has an | ||
198 | * age different to the one you set, then you are mistaken and | ||
199 | * it has been stolen by another client. If global texAge | ||
200 | * hasn't changed, there is no need to walk the list. | ||
201 | * | ||
202 | * These regions can be used as a proxy for the fine-grained | ||
203 | * texture information of other clients - by maintaining them | ||
204 | * in the same lru which is used to age their own textures, | ||
205 | * clients have an approximate lru for the whole of global | ||
206 | * texture space, and can make informed decisions as to which | ||
207 | * areas to kick out. There is no need to choose whether to | ||
208 | * kick out your own texture or someone else's - simply eject | ||
209 | * them all in LRU order. | ||
210 | */ | ||
211 | |||
212 | drm_i830_tex_region_t texList[I830_NR_TEX_REGIONS + 1]; | ||
213 | /* Last elt is sentinal */ | ||
214 | int texAge; /* last time texture was uploaded */ | ||
215 | int last_enqueue; /* last time a buffer was enqueued */ | ||
216 | int last_dispatch; /* age of the most recently dispatched buffer */ | ||
217 | int last_quiescent; /* */ | ||
218 | int ctxOwner; /* last context to upload state */ | ||
219 | |||
220 | int vertex_prim; | ||
221 | |||
222 | int pf_enabled; /* is pageflipping allowed? */ | ||
223 | int pf_active; | ||
224 | int pf_current_page; /* which buffer is being displayed? */ | ||
225 | |||
226 | int perf_boxes; /* performance boxes to be displayed */ | ||
227 | |||
228 | /* Here's the state for texunits 2,3: | ||
229 | */ | ||
230 | unsigned int TexState2[I830_TEX_SETUP_SIZE]; | ||
231 | unsigned int TexBlendState2[I830_TEXBLEND_SIZE]; | ||
232 | unsigned int TexBlendStateWordsUsed2; | ||
233 | |||
234 | unsigned int TexState3[I830_TEX_SETUP_SIZE]; | ||
235 | unsigned int TexBlendState3[I830_TEXBLEND_SIZE]; | ||
236 | unsigned int TexBlendStateWordsUsed3; | ||
237 | |||
238 | unsigned int StippleState[I830_STP_SETUP_SIZE]; | ||
239 | } drm_i830_sarea_t; | ||
240 | |||
241 | /* Flags for perf_boxes | ||
242 | */ | ||
243 | #define I830_BOX_RING_EMPTY 0x1 /* populated by kernel */ | ||
244 | #define I830_BOX_FLIP 0x2 /* populated by kernel */ | ||
245 | #define I830_BOX_WAIT 0x4 /* populated by kernel & client */ | ||
246 | #define I830_BOX_TEXTURE_LOAD 0x8 /* populated by kernel */ | ||
247 | #define I830_BOX_LOST_CONTEXT 0x10 /* populated by client */ | ||
248 | |||
249 | /* I830 specific ioctls | ||
250 | * The device specific ioctl range is 0x40 to 0x79. | ||
251 | */ | ||
252 | #define DRM_I830_INIT 0x00 | ||
253 | #define DRM_I830_VERTEX 0x01 | ||
254 | #define DRM_I830_CLEAR 0x02 | ||
255 | #define DRM_I830_FLUSH 0x03 | ||
256 | #define DRM_I830_GETAGE 0x04 | ||
257 | #define DRM_I830_GETBUF 0x05 | ||
258 | #define DRM_I830_SWAP 0x06 | ||
259 | #define DRM_I830_COPY 0x07 | ||
260 | #define DRM_I830_DOCOPY 0x08 | ||
261 | #define DRM_I830_FLIP 0x09 | ||
262 | #define DRM_I830_IRQ_EMIT 0x0a | ||
263 | #define DRM_I830_IRQ_WAIT 0x0b | ||
264 | #define DRM_I830_GETPARAM 0x0c | ||
265 | #define DRM_I830_SETPARAM 0x0d | ||
266 | |||
267 | #define DRM_IOCTL_I830_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I830_INIT, drm_i830_init_t) | ||
268 | #define DRM_IOCTL_I830_VERTEX DRM_IOW( DRM_COMMAND_BASE + DRM_I830_VERTEX, drm_i830_vertex_t) | ||
269 | #define DRM_IOCTL_I830_CLEAR DRM_IOW( DRM_COMMAND_BASE + DRM_I830_CLEAR, drm_i830_clear_t) | ||
270 | #define DRM_IOCTL_I830_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I830_FLUSH) | ||
271 | #define DRM_IOCTL_I830_GETAGE DRM_IO ( DRM_COMMAND_BASE + DRM_I830_GETAGE) | ||
272 | #define DRM_IOCTL_I830_GETBUF DRM_IOWR(DRM_COMMAND_BASE + DRM_I830_GETBUF, drm_i830_dma_t) | ||
273 | #define DRM_IOCTL_I830_SWAP DRM_IO ( DRM_COMMAND_BASE + DRM_I830_SWAP) | ||
274 | #define DRM_IOCTL_I830_COPY DRM_IOW( DRM_COMMAND_BASE + DRM_I830_COPY, drm_i830_copy_t) | ||
275 | #define DRM_IOCTL_I830_DOCOPY DRM_IO ( DRM_COMMAND_BASE + DRM_I830_DOCOPY) | ||
276 | #define DRM_IOCTL_I830_FLIP DRM_IO ( DRM_COMMAND_BASE + DRM_I830_FLIP) | ||
277 | #define DRM_IOCTL_I830_IRQ_EMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_I830_IRQ_EMIT, drm_i830_irq_emit_t) | ||
278 | #define DRM_IOCTL_I830_IRQ_WAIT DRM_IOW( DRM_COMMAND_BASE + DRM_I830_IRQ_WAIT, drm_i830_irq_wait_t) | ||
279 | #define DRM_IOCTL_I830_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I830_GETPARAM, drm_i830_getparam_t) | ||
280 | #define DRM_IOCTL_I830_SETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I830_SETPARAM, drm_i830_setparam_t) | ||
281 | |||
282 | typedef struct _drm_i830_clear { | ||
283 | int clear_color; | ||
284 | int clear_depth; | ||
285 | int flags; | ||
286 | unsigned int clear_colormask; | ||
287 | unsigned int clear_depthmask; | ||
288 | } drm_i830_clear_t; | ||
289 | |||
290 | /* These may be placeholders if we have more cliprects than | ||
291 | * I830_NR_SAREA_CLIPRECTS. In that case, the client sets discard to | ||
292 | * false, indicating that the buffer will be dispatched again with a | ||
293 | * new set of cliprects. | ||
294 | */ | ||
295 | typedef struct _drm_i830_vertex { | ||
296 | int idx; /* buffer index */ | ||
297 | int used; /* nr bytes in use */ | ||
298 | int discard; /* client is finished with the buffer? */ | ||
299 | } drm_i830_vertex_t; | ||
300 | |||
301 | typedef struct _drm_i830_copy_t { | ||
302 | int idx; /* buffer index */ | ||
303 | int used; /* nr bytes in use */ | ||
304 | void __user *address; /* Address to copy from */ | ||
305 | } drm_i830_copy_t; | ||
306 | |||
307 | typedef struct drm_i830_dma { | ||
308 | void __user *virtual; | ||
309 | int request_idx; | ||
310 | int request_size; | ||
311 | int granted; | ||
312 | } drm_i830_dma_t; | ||
313 | |||
314 | /* 1.3: Userspace can request & wait on irq's: | ||
315 | */ | ||
316 | typedef struct drm_i830_irq_emit { | ||
317 | int __user *irq_seq; | ||
318 | } drm_i830_irq_emit_t; | ||
319 | |||
320 | typedef struct drm_i830_irq_wait { | ||
321 | int irq_seq; | ||
322 | } drm_i830_irq_wait_t; | ||
323 | |||
324 | /* 1.3: New ioctl to query kernel params: | ||
325 | */ | ||
326 | #define I830_PARAM_IRQ_ACTIVE 1 | ||
327 | |||
328 | typedef struct drm_i830_getparam { | ||
329 | int param; | ||
330 | int __user *value; | ||
331 | } drm_i830_getparam_t; | ||
332 | |||
333 | /* 1.3: New ioctl to set kernel params: | ||
334 | */ | ||
335 | #define I830_SETPARAM_USE_MI_BATCHBUFFER_START 1 | ||
336 | |||
337 | typedef struct drm_i830_setparam { | ||
338 | int param; | ||
339 | int value; | ||
340 | } drm_i830_setparam_t; | ||
341 | |||
342 | #endif /* _I830_DRM_H_ */ | ||
diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index 0039f1f97ad8..c4d6dbfa3ff4 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h | |||
@@ -290,6 +290,7 @@ typedef struct drm_i915_irq_wait { | |||
290 | #define I915_PARAM_HAS_RELAXED_FENCING 12 | 290 | #define I915_PARAM_HAS_RELAXED_FENCING 12 |
291 | #define I915_PARAM_HAS_COHERENT_RINGS 13 | 291 | #define I915_PARAM_HAS_COHERENT_RINGS 13 |
292 | #define I915_PARAM_HAS_EXEC_CONSTANTS 14 | 292 | #define I915_PARAM_HAS_EXEC_CONSTANTS 14 |
293 | #define I915_PARAM_HAS_RELAXED_DELTA 15 | ||
293 | 294 | ||
294 | typedef struct drm_i915_getparam { | 295 | typedef struct drm_i915_getparam { |
295 | int param; | 296 | int param; |
diff --git a/include/drm/nouveau_drm.h b/include/drm/nouveau_drm.h index e2cfe80f6fca..5edd3a76fffa 100644 --- a/include/drm/nouveau_drm.h +++ b/include/drm/nouveau_drm.h | |||
@@ -94,6 +94,7 @@ struct drm_nouveau_setparam { | |||
94 | #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) | 94 | #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) |
95 | #define NOUVEAU_GEM_DOMAIN_MAPPABLE (1 << 3) | 95 | #define NOUVEAU_GEM_DOMAIN_MAPPABLE (1 << 3) |
96 | 96 | ||
97 | #define NOUVEAU_GEM_TILE_COMP 0x00030000 /* nv50-only */ | ||
97 | #define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00 | 98 | #define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00 |
98 | #define NOUVEAU_GEM_TILE_16BPP 0x00000001 | 99 | #define NOUVEAU_GEM_TILE_16BPP 0x00000001 |
99 | #define NOUVEAU_GEM_TILE_32BPP 0x00000002 | 100 | #define NOUVEAU_GEM_TILE_32BPP 0x00000002 |
diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h index e5c607a02d57..3dec41cf8342 100644 --- a/include/drm/radeon_drm.h +++ b/include/drm/radeon_drm.h | |||
@@ -908,6 +908,7 @@ struct drm_radeon_cs { | |||
908 | #define RADEON_INFO_WANT_HYPERZ 0x07 | 908 | #define RADEON_INFO_WANT_HYPERZ 0x07 |
909 | #define RADEON_INFO_WANT_CMASK 0x08 /* get access to CMASK on r300 */ | 909 | #define RADEON_INFO_WANT_CMASK 0x08 /* get access to CMASK on r300 */ |
910 | #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */ | 910 | #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */ |
911 | #define RADEON_INFO_NUM_BACKENDS 0x0a /* DB/backends for r600+ - need for OQ */ | ||
911 | 912 | ||
912 | struct drm_radeon_info { | 913 | struct drm_radeon_info { |
913 | uint32_t request; | 914 | uint32_t request; |
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index 1da8af6ac884..efed0820d9fa 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h | |||
@@ -50,13 +50,15 @@ struct ttm_backend_func { | |||
50 | * @pages: Array of pointers to ttm pages. | 50 | * @pages: Array of pointers to ttm pages. |
51 | * @dummy_read_page: Page to be used instead of NULL pages in the | 51 | * @dummy_read_page: Page to be used instead of NULL pages in the |
52 | * array @pages. | 52 | * array @pages. |
53 | * @dma_addrs: Array of DMA (bus) address of the ttm pages. | ||
53 | * | 54 | * |
54 | * Populate the backend with ttm pages. Depending on the backend, | 55 | * Populate the backend with ttm pages. Depending on the backend, |
55 | * it may or may not copy the @pages array. | 56 | * it may or may not copy the @pages array. |
56 | */ | 57 | */ |
57 | int (*populate) (struct ttm_backend *backend, | 58 | int (*populate) (struct ttm_backend *backend, |
58 | unsigned long num_pages, struct page **pages, | 59 | unsigned long num_pages, struct page **pages, |
59 | struct page *dummy_read_page); | 60 | struct page *dummy_read_page, |
61 | dma_addr_t *dma_addrs); | ||
60 | /** | 62 | /** |
61 | * struct ttm_backend_func member clear | 63 | * struct ttm_backend_func member clear |
62 | * | 64 | * |
@@ -149,6 +151,7 @@ enum ttm_caching_state { | |||
149 | * @swap_storage: Pointer to shmem struct file for swap storage. | 151 | * @swap_storage: Pointer to shmem struct file for swap storage. |
150 | * @caching_state: The current caching state of the pages. | 152 | * @caching_state: The current caching state of the pages. |
151 | * @state: The current binding state of the pages. | 153 | * @state: The current binding state of the pages. |
154 | * @dma_address: The DMA (bus) addresses of the pages (if TTM_PAGE_FLAG_DMA32) | ||
152 | * | 155 | * |
153 | * This is a structure holding the pages, caching- and aperture binding | 156 | * This is a structure holding the pages, caching- and aperture binding |
154 | * status for a buffer object that isn't backed by fixed (VRAM / AGP) | 157 | * status for a buffer object that isn't backed by fixed (VRAM / AGP) |
@@ -173,6 +176,7 @@ struct ttm_tt { | |||
173 | tt_unbound, | 176 | tt_unbound, |
174 | tt_unpopulated, | 177 | tt_unpopulated, |
175 | } state; | 178 | } state; |
179 | dma_addr_t *dma_address; | ||
176 | }; | 180 | }; |
177 | 181 | ||
178 | #define TTM_MEMTYPE_FLAG_FIXED (1 << 0) /* Fixed (on-card) PCI memory */ | 182 | #define TTM_MEMTYPE_FLAG_FIXED (1 << 0) /* Fixed (on-card) PCI memory */ |
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h index 116821448c38..8062890f725e 100644 --- a/include/drm/ttm/ttm_page_alloc.h +++ b/include/drm/ttm/ttm_page_alloc.h | |||
@@ -36,11 +36,13 @@ | |||
36 | * @flags: ttm flags for page allocation. | 36 | * @flags: ttm flags for page allocation. |
37 | * @cstate: ttm caching state for the page. | 37 | * @cstate: ttm caching state for the page. |
38 | * @count: number of pages to allocate. | 38 | * @count: number of pages to allocate. |
39 | * @dma_address: The DMA (bus) address of pages (if TTM_PAGE_FLAG_DMA32 set). | ||
39 | */ | 40 | */ |
40 | int ttm_get_pages(struct list_head *pages, | 41 | int ttm_get_pages(struct list_head *pages, |
41 | int flags, | 42 | int flags, |
42 | enum ttm_caching_state cstate, | 43 | enum ttm_caching_state cstate, |
43 | unsigned count); | 44 | unsigned count, |
45 | dma_addr_t *dma_address); | ||
44 | /** | 46 | /** |
45 | * Put linked list of pages to pool. | 47 | * Put linked list of pages to pool. |
46 | * | 48 | * |
@@ -49,11 +51,13 @@ int ttm_get_pages(struct list_head *pages, | |||
49 | * count. | 51 | * count. |
50 | * @flags: ttm flags for page allocation. | 52 | * @flags: ttm flags for page allocation. |
51 | * @cstate: ttm caching state. | 53 | * @cstate: ttm caching state. |
54 | * @dma_address: The DMA (bus) address of pages (if TTM_PAGE_FLAG_DMA32 set). | ||
52 | */ | 55 | */ |
53 | void ttm_put_pages(struct list_head *pages, | 56 | void ttm_put_pages(struct list_head *pages, |
54 | unsigned page_count, | 57 | unsigned page_count, |
55 | int flags, | 58 | int flags, |
56 | enum ttm_caching_state cstate); | 59 | enum ttm_caching_state cstate, |
60 | dma_addr_t *dma_address); | ||
57 | /** | 61 | /** |
58 | * Initialize pool allocator. | 62 | * Initialize pool allocator. |
59 | */ | 63 | */ |
diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index 9e7f259346e1..fcbbe71a3cc1 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h | |||
@@ -43,12 +43,12 @@ struct amba_id { | |||
43 | 43 | ||
44 | struct amba_driver { | 44 | struct amba_driver { |
45 | struct device_driver drv; | 45 | struct device_driver drv; |
46 | int (*probe)(struct amba_device *, struct amba_id *); | 46 | int (*probe)(struct amba_device *, const struct amba_id *); |
47 | int (*remove)(struct amba_device *); | 47 | int (*remove)(struct amba_device *); |
48 | void (*shutdown)(struct amba_device *); | 48 | void (*shutdown)(struct amba_device *); |
49 | int (*suspend)(struct amba_device *, pm_message_t); | 49 | int (*suspend)(struct amba_device *, pm_message_t); |
50 | int (*resume)(struct amba_device *); | 50 | int (*resume)(struct amba_device *); |
51 | struct amba_id *id_table; | 51 | const struct amba_id *id_table; |
52 | }; | 52 | }; |
53 | 53 | ||
54 | enum amba_vendor { | 54 | enum amba_vendor { |
@@ -56,6 +56,10 @@ enum amba_vendor { | |||
56 | AMBA_VENDOR_ST = 0x80, | 56 | AMBA_VENDOR_ST = 0x80, |
57 | }; | 57 | }; |
58 | 58 | ||
59 | extern struct bus_type amba_bustype; | ||
60 | |||
61 | #define to_amba_device(d) container_of(d, struct amba_device, dev) | ||
62 | |||
59 | #define amba_get_drvdata(d) dev_get_drvdata(&d->dev) | 63 | #define amba_get_drvdata(d) dev_get_drvdata(&d->dev) |
60 | #define amba_set_drvdata(d,p) dev_set_drvdata(&d->dev, p) | 64 | #define amba_set_drvdata(d,p) dev_set_drvdata(&d->dev, p) |
61 | 65 | ||
diff --git a/include/linux/amba/mmci.h b/include/linux/amba/mmci.h index f4ee9acc9721..f60227088b7b 100644 --- a/include/linux/amba/mmci.h +++ b/include/linux/amba/mmci.h | |||
@@ -6,6 +6,9 @@ | |||
6 | 6 | ||
7 | #include <linux/mmc/host.h> | 7 | #include <linux/mmc/host.h> |
8 | 8 | ||
9 | /* Just some dummy forwarding */ | ||
10 | struct dma_chan; | ||
11 | |||
9 | /** | 12 | /** |
10 | * struct mmci_platform_data - platform configuration for the MMCI | 13 | * struct mmci_platform_data - platform configuration for the MMCI |
11 | * (also known as PL180) block. | 14 | * (also known as PL180) block. |
@@ -27,6 +30,17 @@ | |||
27 | * @cd_invert: true if the gpio_cd pin value is active low | 30 | * @cd_invert: true if the gpio_cd pin value is active low |
28 | * @capabilities: the capabilities of the block as implemented in | 31 | * @capabilities: the capabilities of the block as implemented in |
29 | * this platform, signify anything MMC_CAP_* from mmc/host.h | 32 | * this platform, signify anything MMC_CAP_* from mmc/host.h |
33 | * @dma_filter: function used to select an apropriate RX and TX | ||
34 | * DMA channel to be used for DMA, if and only if you're deploying the | ||
35 | * generic DMA engine | ||
36 | * @dma_rx_param: parameter passed to the DMA allocation | ||
37 | * filter in order to select an apropriate RX channel. If | ||
38 | * there is a bidirectional RX+TX channel, then just specify | ||
39 | * this and leave dma_tx_param set to NULL | ||
40 | * @dma_tx_param: parameter passed to the DMA allocation | ||
41 | * filter in order to select an apropriate TX channel. If this | ||
42 | * is NULL the driver will attempt to use the RX channel as a | ||
43 | * bidirectional channel | ||
30 | */ | 44 | */ |
31 | struct mmci_platform_data { | 45 | struct mmci_platform_data { |
32 | unsigned int f_max; | 46 | unsigned int f_max; |
@@ -38,6 +52,9 @@ struct mmci_platform_data { | |||
38 | int gpio_cd; | 52 | int gpio_cd; |
39 | bool cd_invert; | 53 | bool cd_invert; |
40 | unsigned long capabilities; | 54 | unsigned long capabilities; |
55 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); | ||
56 | void *dma_rx_param; | ||
57 | void *dma_tx_param; | ||
41 | }; | 58 | }; |
42 | 59 | ||
43 | #endif | 60 | #endif |
diff --git a/include/linux/ata.h b/include/linux/ata.h index 0c4929fa34d3..32df2b6ef0e0 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -89,6 +89,7 @@ enum { | |||
89 | ATA_ID_SPG = 98, | 89 | ATA_ID_SPG = 98, |
90 | ATA_ID_LBA_CAPACITY_2 = 100, | 90 | ATA_ID_LBA_CAPACITY_2 = 100, |
91 | ATA_ID_SECTOR_SIZE = 106, | 91 | ATA_ID_SECTOR_SIZE = 106, |
92 | ATA_ID_WWN = 108, | ||
92 | ATA_ID_LOGICAL_SECTOR_SIZE = 117, /* and 118 */ | 93 | ATA_ID_LOGICAL_SECTOR_SIZE = 117, /* and 118 */ |
93 | ATA_ID_LAST_LUN = 126, | 94 | ATA_ID_LAST_LUN = 126, |
94 | ATA_ID_DLF = 128, | 95 | ATA_ID_DLF = 128, |
@@ -103,6 +104,7 @@ enum { | |||
103 | ATA_ID_SERNO_LEN = 20, | 104 | ATA_ID_SERNO_LEN = 20, |
104 | ATA_ID_FW_REV_LEN = 8, | 105 | ATA_ID_FW_REV_LEN = 8, |
105 | ATA_ID_PROD_LEN = 40, | 106 | ATA_ID_PROD_LEN = 40, |
107 | ATA_ID_WWN_LEN = 8, | ||
106 | 108 | ||
107 | ATA_PCI_CTL_OFS = 2, | 109 | ATA_PCI_CTL_OFS = 2, |
108 | 110 | ||
@@ -598,42 +600,42 @@ static inline bool ata_id_has_dipm(const u16 *id) | |||
598 | } | 600 | } |
599 | 601 | ||
600 | 602 | ||
601 | static inline int ata_id_has_fua(const u16 *id) | 603 | static inline bool ata_id_has_fua(const u16 *id) |
602 | { | 604 | { |
603 | if ((id[ATA_ID_CFSSE] & 0xC000) != 0x4000) | 605 | if ((id[ATA_ID_CFSSE] & 0xC000) != 0x4000) |
604 | return 0; | 606 | return false; |
605 | return id[ATA_ID_CFSSE] & (1 << 6); | 607 | return id[ATA_ID_CFSSE] & (1 << 6); |
606 | } | 608 | } |
607 | 609 | ||
608 | static inline int ata_id_has_flush(const u16 *id) | 610 | static inline bool ata_id_has_flush(const u16 *id) |
609 | { | 611 | { |
610 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) | 612 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
611 | return 0; | 613 | return false; |
612 | return id[ATA_ID_COMMAND_SET_2] & (1 << 12); | 614 | return id[ATA_ID_COMMAND_SET_2] & (1 << 12); |
613 | } | 615 | } |
614 | 616 | ||
615 | static inline int ata_id_flush_enabled(const u16 *id) | 617 | static inline bool ata_id_flush_enabled(const u16 *id) |
616 | { | 618 | { |
617 | if (ata_id_has_flush(id) == 0) | 619 | if (ata_id_has_flush(id) == 0) |
618 | return 0; | 620 | return false; |
619 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) | 621 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
620 | return 0; | 622 | return false; |
621 | return id[ATA_ID_CFS_ENABLE_2] & (1 << 12); | 623 | return id[ATA_ID_CFS_ENABLE_2] & (1 << 12); |
622 | } | 624 | } |
623 | 625 | ||
624 | static inline int ata_id_has_flush_ext(const u16 *id) | 626 | static inline bool ata_id_has_flush_ext(const u16 *id) |
625 | { | 627 | { |
626 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) | 628 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
627 | return 0; | 629 | return false; |
628 | return id[ATA_ID_COMMAND_SET_2] & (1 << 13); | 630 | return id[ATA_ID_COMMAND_SET_2] & (1 << 13); |
629 | } | 631 | } |
630 | 632 | ||
631 | static inline int ata_id_flush_ext_enabled(const u16 *id) | 633 | static inline bool ata_id_flush_ext_enabled(const u16 *id) |
632 | { | 634 | { |
633 | if (ata_id_has_flush_ext(id) == 0) | 635 | if (ata_id_has_flush_ext(id) == 0) |
634 | return 0; | 636 | return false; |
635 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) | 637 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
636 | return 0; | 638 | return false; |
637 | /* | 639 | /* |
638 | * some Maxtor disks have bit 13 defined incorrectly | 640 | * some Maxtor disks have bit 13 defined incorrectly |
639 | * so check bit 10 too | 641 | * so check bit 10 too |
@@ -686,64 +688,64 @@ static inline u16 ata_id_logical_sector_offset(const u16 *id, | |||
686 | return 0; | 688 | return 0; |
687 | } | 689 | } |
688 | 690 | ||
689 | static inline int ata_id_has_lba48(const u16 *id) | 691 | static inline bool ata_id_has_lba48(const u16 *id) |
690 | { | 692 | { |
691 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) | 693 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
692 | return 0; | 694 | return false; |
693 | if (!ata_id_u64(id, ATA_ID_LBA_CAPACITY_2)) | 695 | if (!ata_id_u64(id, ATA_ID_LBA_CAPACITY_2)) |
694 | return 0; | 696 | return false; |
695 | return id[ATA_ID_COMMAND_SET_2] & (1 << 10); | 697 | return id[ATA_ID_COMMAND_SET_2] & (1 << 10); |
696 | } | 698 | } |
697 | 699 | ||
698 | static inline int ata_id_lba48_enabled(const u16 *id) | 700 | static inline bool ata_id_lba48_enabled(const u16 *id) |
699 | { | 701 | { |
700 | if (ata_id_has_lba48(id) == 0) | 702 | if (ata_id_has_lba48(id) == 0) |
701 | return 0; | 703 | return false; |
702 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) | 704 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
703 | return 0; | 705 | return false; |
704 | return id[ATA_ID_CFS_ENABLE_2] & (1 << 10); | 706 | return id[ATA_ID_CFS_ENABLE_2] & (1 << 10); |
705 | } | 707 | } |
706 | 708 | ||
707 | static inline int ata_id_hpa_enabled(const u16 *id) | 709 | static inline bool ata_id_hpa_enabled(const u16 *id) |
708 | { | 710 | { |
709 | /* Yes children, word 83 valid bits cover word 82 data */ | 711 | /* Yes children, word 83 valid bits cover word 82 data */ |
710 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) | 712 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
711 | return 0; | 713 | return false; |
712 | /* And 87 covers 85-87 */ | 714 | /* And 87 covers 85-87 */ |
713 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) | 715 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
714 | return 0; | 716 | return false; |
715 | /* Check command sets enabled as well as supported */ | 717 | /* Check command sets enabled as well as supported */ |
716 | if ((id[ATA_ID_CFS_ENABLE_1] & (1 << 10)) == 0) | 718 | if ((id[ATA_ID_CFS_ENABLE_1] & (1 << 10)) == 0) |
717 | return 0; | 719 | return false; |
718 | return id[ATA_ID_COMMAND_SET_1] & (1 << 10); | 720 | return id[ATA_ID_COMMAND_SET_1] & (1 << 10); |
719 | } | 721 | } |
720 | 722 | ||
721 | static inline int ata_id_has_wcache(const u16 *id) | 723 | static inline bool ata_id_has_wcache(const u16 *id) |
722 | { | 724 | { |
723 | /* Yes children, word 83 valid bits cover word 82 data */ | 725 | /* Yes children, word 83 valid bits cover word 82 data */ |
724 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) | 726 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
725 | return 0; | 727 | return false; |
726 | return id[ATA_ID_COMMAND_SET_1] & (1 << 5); | 728 | return id[ATA_ID_COMMAND_SET_1] & (1 << 5); |
727 | } | 729 | } |
728 | 730 | ||
729 | static inline int ata_id_has_pm(const u16 *id) | 731 | static inline bool ata_id_has_pm(const u16 *id) |
730 | { | 732 | { |
731 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) | 733 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
732 | return 0; | 734 | return false; |
733 | return id[ATA_ID_COMMAND_SET_1] & (1 << 3); | 735 | return id[ATA_ID_COMMAND_SET_1] & (1 << 3); |
734 | } | 736 | } |
735 | 737 | ||
736 | static inline int ata_id_rahead_enabled(const u16 *id) | 738 | static inline bool ata_id_rahead_enabled(const u16 *id) |
737 | { | 739 | { |
738 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) | 740 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
739 | return 0; | 741 | return false; |
740 | return id[ATA_ID_CFS_ENABLE_1] & (1 << 6); | 742 | return id[ATA_ID_CFS_ENABLE_1] & (1 << 6); |
741 | } | 743 | } |
742 | 744 | ||
743 | static inline int ata_id_wcache_enabled(const u16 *id) | 745 | static inline bool ata_id_wcache_enabled(const u16 *id) |
744 | { | 746 | { |
745 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) | 747 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
746 | return 0; | 748 | return false; |
747 | return id[ATA_ID_CFS_ENABLE_1] & (1 << 5); | 749 | return id[ATA_ID_CFS_ENABLE_1] & (1 << 5); |
748 | } | 750 | } |
749 | 751 | ||
@@ -773,7 +775,7 @@ static inline unsigned int ata_id_major_version(const u16 *id) | |||
773 | return mver; | 775 | return mver; |
774 | } | 776 | } |
775 | 777 | ||
776 | static inline int ata_id_is_sata(const u16 *id) | 778 | static inline bool ata_id_is_sata(const u16 *id) |
777 | { | 779 | { |
778 | /* | 780 | /* |
779 | * See if word 93 is 0 AND drive is at least ATA-5 compatible | 781 | * See if word 93 is 0 AND drive is at least ATA-5 compatible |
@@ -782,37 +784,40 @@ static inline int ata_id_is_sata(const u16 *id) | |||
782 | * 0x0000 and 0xffff along with the earlier ATA revisions... | 784 | * 0x0000 and 0xffff along with the earlier ATA revisions... |
783 | */ | 785 | */ |
784 | if (id[ATA_ID_HW_CONFIG] == 0 && (short)id[ATA_ID_MAJOR_VER] >= 0x0020) | 786 | if (id[ATA_ID_HW_CONFIG] == 0 && (short)id[ATA_ID_MAJOR_VER] >= 0x0020) |
785 | return 1; | 787 | return true; |
786 | return 0; | 788 | return false; |
787 | } | 789 | } |
788 | 790 | ||
789 | static inline int ata_id_has_tpm(const u16 *id) | 791 | static inline bool ata_id_has_tpm(const u16 *id) |
790 | { | 792 | { |
791 | /* The TPM bits are only valid on ATA8 */ | 793 | /* The TPM bits are only valid on ATA8 */ |
792 | if (ata_id_major_version(id) < 8) | 794 | if (ata_id_major_version(id) < 8) |
793 | return 0; | 795 | return false; |
794 | if ((id[48] & 0xC000) != 0x4000) | 796 | if ((id[48] & 0xC000) != 0x4000) |
795 | return 0; | 797 | return false; |
796 | return id[48] & (1 << 0); | 798 | return id[48] & (1 << 0); |
797 | } | 799 | } |
798 | 800 | ||
799 | static inline int ata_id_has_dword_io(const u16 *id) | 801 | static inline bool ata_id_has_dword_io(const u16 *id) |
800 | { | 802 | { |
801 | /* ATA 8 reuses this flag for "trusted" computing */ | 803 | /* ATA 8 reuses this flag for "trusted" computing */ |
802 | if (ata_id_major_version(id) > 7) | 804 | if (ata_id_major_version(id) > 7) |
803 | return 0; | 805 | return false; |
804 | if (id[ATA_ID_DWORD_IO] & (1 << 0)) | 806 | return id[ATA_ID_DWORD_IO] & (1 << 0); |
805 | return 1; | ||
806 | return 0; | ||
807 | } | 807 | } |
808 | 808 | ||
809 | static inline int ata_id_has_unload(const u16 *id) | 809 | static inline bool ata_id_has_unload(const u16 *id) |
810 | { | 810 | { |
811 | if (ata_id_major_version(id) >= 7 && | 811 | if (ata_id_major_version(id) >= 7 && |
812 | (id[ATA_ID_CFSSE] & 0xC000) == 0x4000 && | 812 | (id[ATA_ID_CFSSE] & 0xC000) == 0x4000 && |
813 | id[ATA_ID_CFSSE] & (1 << 13)) | 813 | id[ATA_ID_CFSSE] & (1 << 13)) |
814 | return 1; | 814 | return true; |
815 | return 0; | 815 | return false; |
816 | } | ||
817 | |||
818 | static inline bool ata_id_has_wwn(const u16 *id) | ||
819 | { | ||
820 | return (id[ATA_ID_CSF_DEFAULT] & 0xC100) == 0x4100; | ||
816 | } | 821 | } |
817 | 822 | ||
818 | static inline int ata_id_form_factor(const u16 *id) | 823 | static inline int ata_id_form_factor(const u16 *id) |
@@ -843,25 +848,25 @@ static inline int ata_id_rotation_rate(const u16 *id) | |||
843 | return val; | 848 | return val; |
844 | } | 849 | } |
845 | 850 | ||
846 | static inline int ata_id_has_trim(const u16 *id) | 851 | static inline bool ata_id_has_trim(const u16 *id) |
847 | { | 852 | { |
848 | if (ata_id_major_version(id) >= 7 && | 853 | if (ata_id_major_version(id) >= 7 && |
849 | (id[ATA_ID_DATA_SET_MGMT] & 1)) | 854 | (id[ATA_ID_DATA_SET_MGMT] & 1)) |
850 | return 1; | 855 | return true; |
851 | return 0; | 856 | return false; |
852 | } | 857 | } |
853 | 858 | ||
854 | static inline int ata_id_has_zero_after_trim(const u16 *id) | 859 | static inline bool ata_id_has_zero_after_trim(const u16 *id) |
855 | { | 860 | { |
856 | /* DSM supported, deterministic read, and read zero after trim set */ | 861 | /* DSM supported, deterministic read, and read zero after trim set */ |
857 | if (ata_id_has_trim(id) && | 862 | if (ata_id_has_trim(id) && |
858 | (id[ATA_ID_ADDITIONAL_SUPP] & 0x4020) == 0x4020) | 863 | (id[ATA_ID_ADDITIONAL_SUPP] & 0x4020) == 0x4020) |
859 | return 1; | 864 | return true; |
860 | 865 | ||
861 | return 0; | 866 | return false; |
862 | } | 867 | } |
863 | 868 | ||
864 | static inline int ata_id_current_chs_valid(const u16 *id) | 869 | static inline bool ata_id_current_chs_valid(const u16 *id) |
865 | { | 870 | { |
866 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command | 871 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command |
867 | has not been issued to the device then the values of | 872 | has not been issued to the device then the values of |
@@ -873,11 +878,11 @@ static inline int ata_id_current_chs_valid(const u16 *id) | |||
873 | id[ATA_ID_CUR_SECTORS]; /* sectors in current translation */ | 878 | id[ATA_ID_CUR_SECTORS]; /* sectors in current translation */ |
874 | } | 879 | } |
875 | 880 | ||
876 | static inline int ata_id_is_cfa(const u16 *id) | 881 | static inline bool ata_id_is_cfa(const u16 *id) |
877 | { | 882 | { |
878 | if ((id[ATA_ID_CONFIG] == 0x848A) || /* Traditional CF */ | 883 | if ((id[ATA_ID_CONFIG] == 0x848A) || /* Traditional CF */ |
879 | (id[ATA_ID_CONFIG] == 0x844A)) /* Delkin Devices CF */ | 884 | (id[ATA_ID_CONFIG] == 0x844A)) /* Delkin Devices CF */ |
880 | return 1; | 885 | return true; |
881 | /* | 886 | /* |
882 | * CF specs don't require specific value in the word 0 anymore and yet | 887 | * CF specs don't require specific value in the word 0 anymore and yet |
883 | * they forbid to report the ATA version in the word 80 and require the | 888 | * they forbid to report the ATA version in the word 80 and require the |
@@ -886,44 +891,40 @@ static inline int ata_id_is_cfa(const u16 *id) | |||
886 | * and while those that don't indicate CFA feature support need some | 891 | * and while those that don't indicate CFA feature support need some |
887 | * sort of quirk list, it seems impractical for the ones that do... | 892 | * sort of quirk list, it seems impractical for the ones that do... |
888 | */ | 893 | */ |
889 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004) | 894 | return (id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004; |
890 | return 1; | ||
891 | return 0; | ||
892 | } | 895 | } |
893 | 896 | ||
894 | static inline int ata_id_is_ssd(const u16 *id) | 897 | static inline bool ata_id_is_ssd(const u16 *id) |
895 | { | 898 | { |
896 | return id[ATA_ID_ROT_SPEED] == 0x01; | 899 | return id[ATA_ID_ROT_SPEED] == 0x01; |
897 | } | 900 | } |
898 | 901 | ||
899 | static inline int ata_id_pio_need_iordy(const u16 *id, const u8 pio) | 902 | static inline bool ata_id_pio_need_iordy(const u16 *id, const u8 pio) |
900 | { | 903 | { |
901 | /* CF spec. r4.1 Table 22 says no IORDY on PIO5 and PIO6. */ | 904 | /* CF spec. r4.1 Table 22 says no IORDY on PIO5 and PIO6. */ |
902 | if (pio > 4 && ata_id_is_cfa(id)) | 905 | if (pio > 4 && ata_id_is_cfa(id)) |
903 | return 0; | 906 | return false; |
904 | /* For PIO3 and higher it is mandatory. */ | 907 | /* For PIO3 and higher it is mandatory. */ |
905 | if (pio > 2) | 908 | if (pio > 2) |
906 | return 1; | 909 | return true; |
907 | /* Turn it on when possible. */ | 910 | /* Turn it on when possible. */ |
908 | if (ata_id_has_iordy(id)) | 911 | return ata_id_has_iordy(id); |
909 | return 1; | ||
910 | return 0; | ||
911 | } | 912 | } |
912 | 913 | ||
913 | static inline int ata_drive_40wire(const u16 *dev_id) | 914 | static inline bool ata_drive_40wire(const u16 *dev_id) |
914 | { | 915 | { |
915 | if (ata_id_is_sata(dev_id)) | 916 | if (ata_id_is_sata(dev_id)) |
916 | return 0; /* SATA */ | 917 | return false; /* SATA */ |
917 | if ((dev_id[ATA_ID_HW_CONFIG] & 0xE000) == 0x6000) | 918 | if ((dev_id[ATA_ID_HW_CONFIG] & 0xE000) == 0x6000) |
918 | return 0; /* 80 wire */ | 919 | return false; /* 80 wire */ |
919 | return 1; | 920 | return true; |
920 | } | 921 | } |
921 | 922 | ||
922 | static inline int ata_drive_40wire_relaxed(const u16 *dev_id) | 923 | static inline bool ata_drive_40wire_relaxed(const u16 *dev_id) |
923 | { | 924 | { |
924 | if ((dev_id[ATA_ID_HW_CONFIG] & 0x2000) == 0x2000) | 925 | if ((dev_id[ATA_ID_HW_CONFIG] & 0x2000) == 0x2000) |
925 | return 0; /* 80 wire */ | 926 | return false; /* 80 wire */ |
926 | return 1; | 927 | return true; |
927 | } | 928 | } |
928 | 929 | ||
929 | static inline int atapi_cdb_len(const u16 *dev_id) | 930 | static inline int atapi_cdb_len(const u16 *dev_id) |
@@ -936,12 +937,12 @@ static inline int atapi_cdb_len(const u16 *dev_id) | |||
936 | } | 937 | } |
937 | } | 938 | } |
938 | 939 | ||
939 | static inline int atapi_command_packet_set(const u16 *dev_id) | 940 | static inline bool atapi_command_packet_set(const u16 *dev_id) |
940 | { | 941 | { |
941 | return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f; | 942 | return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f; |
942 | } | 943 | } |
943 | 944 | ||
944 | static inline int atapi_id_dmadir(const u16 *dev_id) | 945 | static inline bool atapi_id_dmadir(const u16 *dev_id) |
945 | { | 946 | { |
946 | return ata_id_major_version(dev_id) >= 7 && (dev_id[62] & 0x8000); | 947 | return ata_id_major_version(dev_id) >= 7 && (dev_id[62] & 0x8000); |
947 | } | 948 | } |
@@ -954,13 +955,13 @@ static inline int atapi_id_dmadir(const u16 *dev_id) | |||
954 | * | 955 | * |
955 | * It is called only once for each device. | 956 | * It is called only once for each device. |
956 | */ | 957 | */ |
957 | static inline int ata_id_is_lba_capacity_ok(u16 *id) | 958 | static inline bool ata_id_is_lba_capacity_ok(u16 *id) |
958 | { | 959 | { |
959 | unsigned long lba_sects, chs_sects, head, tail; | 960 | unsigned long lba_sects, chs_sects, head, tail; |
960 | 961 | ||
961 | /* No non-LBA info .. so valid! */ | 962 | /* No non-LBA info .. so valid! */ |
962 | if (id[ATA_ID_CYLS] == 0) | 963 | if (id[ATA_ID_CYLS] == 0) |
963 | return 1; | 964 | return true; |
964 | 965 | ||
965 | lba_sects = ata_id_u32(id, ATA_ID_LBA_CAPACITY); | 966 | lba_sects = ata_id_u32(id, ATA_ID_LBA_CAPACITY); |
966 | 967 | ||
@@ -975,13 +976,13 @@ static inline int ata_id_is_lba_capacity_ok(u16 *id) | |||
975 | id[ATA_ID_SECTORS] == 63 && | 976 | id[ATA_ID_SECTORS] == 63 && |
976 | (id[ATA_ID_HEADS] == 15 || id[ATA_ID_HEADS] == 16) && | 977 | (id[ATA_ID_HEADS] == 15 || id[ATA_ID_HEADS] == 16) && |
977 | (lba_sects >= 16383 * 63 * id[ATA_ID_HEADS])) | 978 | (lba_sects >= 16383 * 63 * id[ATA_ID_HEADS])) |
978 | return 1; | 979 | return true; |
979 | 980 | ||
980 | chs_sects = id[ATA_ID_CYLS] * id[ATA_ID_HEADS] * id[ATA_ID_SECTORS]; | 981 | chs_sects = id[ATA_ID_CYLS] * id[ATA_ID_HEADS] * id[ATA_ID_SECTORS]; |
981 | 982 | ||
982 | /* perform a rough sanity check on lba_sects: within 10% is OK */ | 983 | /* perform a rough sanity check on lba_sects: within 10% is OK */ |
983 | if (lba_sects - chs_sects < chs_sects/10) | 984 | if (lba_sects - chs_sects < chs_sects/10) |
984 | return 1; | 985 | return true; |
985 | 986 | ||
986 | /* some drives have the word order reversed */ | 987 | /* some drives have the word order reversed */ |
987 | head = (lba_sects >> 16) & 0xffff; | 988 | head = (lba_sects >> 16) & 0xffff; |
@@ -990,10 +991,10 @@ static inline int ata_id_is_lba_capacity_ok(u16 *id) | |||
990 | 991 | ||
991 | if (lba_sects - chs_sects < chs_sects/10) { | 992 | if (lba_sects - chs_sects < chs_sects/10) { |
992 | *(__le32 *)&id[ATA_ID_LBA_CAPACITY] = __cpu_to_le32(lba_sects); | 993 | *(__le32 *)&id[ATA_ID_LBA_CAPACITY] = __cpu_to_le32(lba_sects); |
993 | return 1; /* LBA capacity is (now) good */ | 994 | return true; /* LBA capacity is (now) good */ |
994 | } | 995 | } |
995 | 996 | ||
996 | return 0; /* LBA capacity value may be bad */ | 997 | return false; /* LBA capacity value may be bad */ |
997 | } | 998 | } |
998 | 999 | ||
999 | static inline void ata_id_to_hd_driveid(u16 *id) | 1000 | static inline void ata_id_to_hd_driveid(u16 *id) |
@@ -1051,19 +1052,19 @@ static inline int is_multi_taskfile(struct ata_taskfile *tf) | |||
1051 | (tf->command == ATA_CMD_WRITE_MULTI_FUA_EXT); | 1052 | (tf->command == ATA_CMD_WRITE_MULTI_FUA_EXT); |
1052 | } | 1053 | } |
1053 | 1054 | ||
1054 | static inline int ata_ok(u8 status) | 1055 | static inline bool ata_ok(u8 status) |
1055 | { | 1056 | { |
1056 | return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR)) | 1057 | return ((status & (ATA_BUSY | ATA_DRDY | ATA_DF | ATA_DRQ | ATA_ERR)) |
1057 | == ATA_DRDY); | 1058 | == ATA_DRDY); |
1058 | } | 1059 | } |
1059 | 1060 | ||
1060 | static inline int lba_28_ok(u64 block, u32 n_block) | 1061 | static inline bool lba_28_ok(u64 block, u32 n_block) |
1061 | { | 1062 | { |
1062 | /* check the ending block number: must be LESS THAN 0x0fffffff */ | 1063 | /* check the ending block number: must be LESS THAN 0x0fffffff */ |
1063 | return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= 256); | 1064 | return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= 256); |
1064 | } | 1065 | } |
1065 | 1066 | ||
1066 | static inline int lba_48_ok(u64 block, u32 n_block) | 1067 | static inline bool lba_48_ok(u64 block, u32 n_block) |
1067 | { | 1068 | { |
1068 | /* check the ending block number */ | 1069 | /* check the ending block number */ |
1069 | return ((block + n_block - 1) < ((u64)1 << 48)) && (n_block <= 65536); | 1070 | return ((block + n_block - 1) < ((u64)1 << 48)) && (n_block <= 65536); |
diff --git a/include/linux/audit.h b/include/linux/audit.h index 359df0487690..9d339eb27881 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -103,6 +103,8 @@ | |||
103 | #define AUDIT_BPRM_FCAPS 1321 /* Information about fcaps increasing perms */ | 103 | #define AUDIT_BPRM_FCAPS 1321 /* Information about fcaps increasing perms */ |
104 | #define AUDIT_CAPSET 1322 /* Record showing argument to sys_capset */ | 104 | #define AUDIT_CAPSET 1322 /* Record showing argument to sys_capset */ |
105 | #define AUDIT_MMAP 1323 /* Record showing descriptor and flags in mmap */ | 105 | #define AUDIT_MMAP 1323 /* Record showing descriptor and flags in mmap */ |
106 | #define AUDIT_NETFILTER_PKT 1324 /* Packets traversing netfilter chains */ | ||
107 | #define AUDIT_NETFILTER_CFG 1325 /* Netfilter chain modifications */ | ||
106 | 108 | ||
107 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ | 109 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ |
108 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ | 110 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ |
diff --git a/include/linux/backlight.h b/include/linux/backlight.h index 4a3d52e545e1..5ffc6dda4675 100644 --- a/include/linux/backlight.h +++ b/include/linux/backlight.h | |||
@@ -32,6 +32,13 @@ enum backlight_update_reason { | |||
32 | BACKLIGHT_UPDATE_SYSFS, | 32 | BACKLIGHT_UPDATE_SYSFS, |
33 | }; | 33 | }; |
34 | 34 | ||
35 | enum backlight_type { | ||
36 | BACKLIGHT_RAW = 1, | ||
37 | BACKLIGHT_PLATFORM, | ||
38 | BACKLIGHT_FIRMWARE, | ||
39 | BACKLIGHT_TYPE_MAX, | ||
40 | }; | ||
41 | |||
35 | struct backlight_device; | 42 | struct backlight_device; |
36 | struct fb_info; | 43 | struct fb_info; |
37 | 44 | ||
@@ -62,6 +69,8 @@ struct backlight_properties { | |||
62 | /* FB Blanking active? (values as for power) */ | 69 | /* FB Blanking active? (values as for power) */ |
63 | /* Due to be removed, please use (state & BL_CORE_FBBLANK) */ | 70 | /* Due to be removed, please use (state & BL_CORE_FBBLANK) */ |
64 | int fb_blank; | 71 | int fb_blank; |
72 | /* Backlight type */ | ||
73 | enum backlight_type type; | ||
65 | /* Flags used to signal drivers of state changes */ | 74 | /* Flags used to signal drivers of state changes */ |
66 | /* Upper 4 bits are reserved for driver internal use */ | 75 | /* Upper 4 bits are reserved for driver internal use */ |
67 | unsigned int state; | 76 | unsigned int state; |
diff --git a/include/linux/ceph/ceph_fs.h b/include/linux/ceph/ceph_fs.h index 09dcc0c2ffd5..b8e995fbd867 100644 --- a/include/linux/ceph/ceph_fs.h +++ b/include/linux/ceph/ceph_fs.h | |||
@@ -136,9 +136,18 @@ struct ceph_dir_layout { | |||
136 | 136 | ||
137 | 137 | ||
138 | /* osd */ | 138 | /* osd */ |
139 | #define CEPH_MSG_OSD_MAP 41 | 139 | #define CEPH_MSG_OSD_MAP 41 |
140 | #define CEPH_MSG_OSD_OP 42 | 140 | #define CEPH_MSG_OSD_OP 42 |
141 | #define CEPH_MSG_OSD_OPREPLY 43 | 141 | #define CEPH_MSG_OSD_OPREPLY 43 |
142 | #define CEPH_MSG_WATCH_NOTIFY 44 | ||
143 | |||
144 | |||
145 | /* watch-notify operations */ | ||
146 | enum { | ||
147 | WATCH_NOTIFY = 1, /* notifying watcher */ | ||
148 | WATCH_NOTIFY_COMPLETE = 2, /* notifier notified when done */ | ||
149 | }; | ||
150 | |||
142 | 151 | ||
143 | /* pool operations */ | 152 | /* pool operations */ |
144 | enum { | 153 | enum { |
@@ -213,8 +222,10 @@ struct ceph_client_mount { | |||
213 | struct ceph_mon_request_header monhdr; | 222 | struct ceph_mon_request_header monhdr; |
214 | } __attribute__ ((packed)); | 223 | } __attribute__ ((packed)); |
215 | 224 | ||
225 | #define CEPH_SUBSCRIBE_ONETIME 1 /* i want only 1 update after have */ | ||
226 | |||
216 | struct ceph_mon_subscribe_item { | 227 | struct ceph_mon_subscribe_item { |
217 | __le64 have_version; __le64 have; | 228 | __le64 have_version; __le64 have; |
218 | __u8 onetime; | 229 | __u8 onetime; |
219 | } __attribute__ ((packed)); | 230 | } __attribute__ ((packed)); |
220 | 231 | ||
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h index 72c72bfccb88..0d2e0fffb470 100644 --- a/include/linux/ceph/libceph.h +++ b/include/linux/ceph/libceph.h | |||
@@ -71,7 +71,6 @@ struct ceph_options { | |||
71 | #define CEPH_OSD_TIMEOUT_DEFAULT 60 /* seconds */ | 71 | #define CEPH_OSD_TIMEOUT_DEFAULT 60 /* seconds */ |
72 | #define CEPH_OSD_KEEPALIVE_DEFAULT 5 | 72 | #define CEPH_OSD_KEEPALIVE_DEFAULT 5 |
73 | #define CEPH_OSD_IDLE_TTL_DEFAULT 60 | 73 | #define CEPH_OSD_IDLE_TTL_DEFAULT 60 |
74 | #define CEPH_MOUNT_RSIZE_DEFAULT (512*1024) /* readahead */ | ||
75 | 74 | ||
76 | #define CEPH_MSG_MAX_FRONT_LEN (16*1024*1024) | 75 | #define CEPH_MSG_MAX_FRONT_LEN (16*1024*1024) |
77 | #define CEPH_MSG_MAX_DATA_LEN (16*1024*1024) | 76 | #define CEPH_MSG_MAX_DATA_LEN (16*1024*1024) |
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h index a1af29648fb5..f88eacb111d4 100644 --- a/include/linux/ceph/osd_client.h +++ b/include/linux/ceph/osd_client.h | |||
@@ -32,6 +32,7 @@ struct ceph_osd { | |||
32 | struct rb_node o_node; | 32 | struct rb_node o_node; |
33 | struct ceph_connection o_con; | 33 | struct ceph_connection o_con; |
34 | struct list_head o_requests; | 34 | struct list_head o_requests; |
35 | struct list_head o_linger_requests; | ||
35 | struct list_head o_osd_lru; | 36 | struct list_head o_osd_lru; |
36 | struct ceph_authorizer *o_authorizer; | 37 | struct ceph_authorizer *o_authorizer; |
37 | void *o_authorizer_buf, *o_authorizer_reply_buf; | 38 | void *o_authorizer_buf, *o_authorizer_reply_buf; |
@@ -47,6 +48,8 @@ struct ceph_osd_request { | |||
47 | struct rb_node r_node; | 48 | struct rb_node r_node; |
48 | struct list_head r_req_lru_item; | 49 | struct list_head r_req_lru_item; |
49 | struct list_head r_osd_item; | 50 | struct list_head r_osd_item; |
51 | struct list_head r_linger_item; | ||
52 | struct list_head r_linger_osd; | ||
50 | struct ceph_osd *r_osd; | 53 | struct ceph_osd *r_osd; |
51 | struct ceph_pg r_pgid; | 54 | struct ceph_pg r_pgid; |
52 | int r_pg_osds[CEPH_PG_MAX_SIZE]; | 55 | int r_pg_osds[CEPH_PG_MAX_SIZE]; |
@@ -59,6 +62,7 @@ struct ceph_osd_request { | |||
59 | int r_flags; /* any additional flags for the osd */ | 62 | int r_flags; /* any additional flags for the osd */ |
60 | u32 r_sent; /* >0 if r_request is sending/sent */ | 63 | u32 r_sent; /* >0 if r_request is sending/sent */ |
61 | int r_got_reply; | 64 | int r_got_reply; |
65 | int r_linger; | ||
62 | 66 | ||
63 | struct ceph_osd_client *r_osdc; | 67 | struct ceph_osd_client *r_osdc; |
64 | struct kref r_kref; | 68 | struct kref r_kref; |
@@ -74,7 +78,6 @@ struct ceph_osd_request { | |||
74 | char r_oid[40]; /* object name */ | 78 | char r_oid[40]; /* object name */ |
75 | int r_oid_len; | 79 | int r_oid_len; |
76 | unsigned long r_stamp; /* send OR check time */ | 80 | unsigned long r_stamp; /* send OR check time */ |
77 | bool r_resend; /* msg send failed, needs retry */ | ||
78 | 81 | ||
79 | struct ceph_file_layout r_file_layout; | 82 | struct ceph_file_layout r_file_layout; |
80 | struct ceph_snap_context *r_snapc; /* snap context for writes */ | 83 | struct ceph_snap_context *r_snapc; /* snap context for writes */ |
@@ -90,6 +93,26 @@ struct ceph_osd_request { | |||
90 | struct ceph_pagelist *r_trail; /* trailing part of the data */ | 93 | struct ceph_pagelist *r_trail; /* trailing part of the data */ |
91 | }; | 94 | }; |
92 | 95 | ||
96 | struct ceph_osd_event { | ||
97 | u64 cookie; | ||
98 | int one_shot; | ||
99 | struct ceph_osd_client *osdc; | ||
100 | void (*cb)(u64, u64, u8, void *); | ||
101 | void *data; | ||
102 | struct rb_node node; | ||
103 | struct list_head osd_node; | ||
104 | struct kref kref; | ||
105 | struct completion completion; | ||
106 | }; | ||
107 | |||
108 | struct ceph_osd_event_work { | ||
109 | struct work_struct work; | ||
110 | struct ceph_osd_event *event; | ||
111 | u64 ver; | ||
112 | u64 notify_id; | ||
113 | u8 opcode; | ||
114 | }; | ||
115 | |||
93 | struct ceph_osd_client { | 116 | struct ceph_osd_client { |
94 | struct ceph_client *client; | 117 | struct ceph_client *client; |
95 | 118 | ||
@@ -104,7 +127,10 @@ struct ceph_osd_client { | |||
104 | u64 timeout_tid; /* tid of timeout triggering rq */ | 127 | u64 timeout_tid; /* tid of timeout triggering rq */ |
105 | u64 last_tid; /* tid of last request */ | 128 | u64 last_tid; /* tid of last request */ |
106 | struct rb_root requests; /* pending requests */ | 129 | struct rb_root requests; /* pending requests */ |
107 | struct list_head req_lru; /* pending requests lru */ | 130 | struct list_head req_lru; /* in-flight lru */ |
131 | struct list_head req_unsent; /* unsent/need-resend queue */ | ||
132 | struct list_head req_notarget; /* map to no osd */ | ||
133 | struct list_head req_linger; /* lingering requests */ | ||
108 | int num_requests; | 134 | int num_requests; |
109 | struct delayed_work timeout_work; | 135 | struct delayed_work timeout_work; |
110 | struct delayed_work osds_timeout_work; | 136 | struct delayed_work osds_timeout_work; |
@@ -116,6 +142,12 @@ struct ceph_osd_client { | |||
116 | 142 | ||
117 | struct ceph_msgpool msgpool_op; | 143 | struct ceph_msgpool msgpool_op; |
118 | struct ceph_msgpool msgpool_op_reply; | 144 | struct ceph_msgpool msgpool_op_reply; |
145 | |||
146 | spinlock_t event_lock; | ||
147 | struct rb_root event_tree; | ||
148 | u64 event_count; | ||
149 | |||
150 | struct workqueue_struct *notify_wq; | ||
119 | }; | 151 | }; |
120 | 152 | ||
121 | struct ceph_osd_req_op { | 153 | struct ceph_osd_req_op { |
@@ -150,6 +182,13 @@ struct ceph_osd_req_op { | |||
150 | struct { | 182 | struct { |
151 | u64 snapid; | 183 | u64 snapid; |
152 | } snap; | 184 | } snap; |
185 | struct { | ||
186 | u64 cookie; | ||
187 | u64 ver; | ||
188 | __u8 flag; | ||
189 | u32 prot_ver; | ||
190 | u32 timeout; | ||
191 | } watch; | ||
153 | }; | 192 | }; |
154 | u32 payload_len; | 193 | u32 payload_len; |
155 | }; | 194 | }; |
@@ -198,6 +237,11 @@ extern struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *, | |||
198 | bool use_mempool, int num_reply, | 237 | bool use_mempool, int num_reply, |
199 | int page_align); | 238 | int page_align); |
200 | 239 | ||
240 | extern void ceph_osdc_set_request_linger(struct ceph_osd_client *osdc, | ||
241 | struct ceph_osd_request *req); | ||
242 | extern void ceph_osdc_unregister_linger_request(struct ceph_osd_client *osdc, | ||
243 | struct ceph_osd_request *req); | ||
244 | |||
201 | static inline void ceph_osdc_get_request(struct ceph_osd_request *req) | 245 | static inline void ceph_osdc_get_request(struct ceph_osd_request *req) |
202 | { | 246 | { |
203 | kref_get(&req->r_kref); | 247 | kref_get(&req->r_kref); |
@@ -233,5 +277,14 @@ extern int ceph_osdc_writepages(struct ceph_osd_client *osdc, | |||
233 | struct page **pages, int nr_pages, | 277 | struct page **pages, int nr_pages, |
234 | int flags, int do_sync, bool nofail); | 278 | int flags, int do_sync, bool nofail); |
235 | 279 | ||
280 | /* watch/notify events */ | ||
281 | extern int ceph_osdc_create_event(struct ceph_osd_client *osdc, | ||
282 | void (*event_cb)(u64, u64, u8, void *), | ||
283 | int one_shot, void *data, | ||
284 | struct ceph_osd_event **pevent); | ||
285 | extern void ceph_osdc_cancel_event(struct ceph_osd_event *event); | ||
286 | extern int ceph_osdc_wait_event(struct ceph_osd_event *event, | ||
287 | unsigned long timeout); | ||
288 | extern void ceph_osdc_put_event(struct ceph_osd_event *event); | ||
236 | #endif | 289 | #endif |
237 | 290 | ||
diff --git a/include/linux/ceph/rados.h b/include/linux/ceph/rados.h index 6d5247f2e81b..0a99099801a4 100644 --- a/include/linux/ceph/rados.h +++ b/include/linux/ceph/rados.h | |||
@@ -12,9 +12,9 @@ | |||
12 | * osdmap encoding versions | 12 | * osdmap encoding versions |
13 | */ | 13 | */ |
14 | #define CEPH_OSDMAP_INC_VERSION 5 | 14 | #define CEPH_OSDMAP_INC_VERSION 5 |
15 | #define CEPH_OSDMAP_INC_VERSION_EXT 5 | 15 | #define CEPH_OSDMAP_INC_VERSION_EXT 6 |
16 | #define CEPH_OSDMAP_VERSION 5 | 16 | #define CEPH_OSDMAP_VERSION 5 |
17 | #define CEPH_OSDMAP_VERSION_EXT 5 | 17 | #define CEPH_OSDMAP_VERSION_EXT 6 |
18 | 18 | ||
19 | /* | 19 | /* |
20 | * fs id | 20 | * fs id |
@@ -181,9 +181,17 @@ enum { | |||
181 | /* read */ | 181 | /* read */ |
182 | CEPH_OSD_OP_READ = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 1, | 182 | CEPH_OSD_OP_READ = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 1, |
183 | CEPH_OSD_OP_STAT = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 2, | 183 | CEPH_OSD_OP_STAT = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 2, |
184 | CEPH_OSD_OP_MAPEXT = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 3, | ||
184 | 185 | ||
185 | /* fancy read */ | 186 | /* fancy read */ |
186 | CEPH_OSD_OP_MASKTRUNC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 4, | 187 | CEPH_OSD_OP_MASKTRUNC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 4, |
188 | CEPH_OSD_OP_SPARSE_READ = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 5, | ||
189 | |||
190 | CEPH_OSD_OP_NOTIFY = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 6, | ||
191 | CEPH_OSD_OP_NOTIFY_ACK = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 7, | ||
192 | |||
193 | /* versioning */ | ||
194 | CEPH_OSD_OP_ASSERT_VER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 8, | ||
187 | 195 | ||
188 | /* write */ | 196 | /* write */ |
189 | CEPH_OSD_OP_WRITE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 1, | 197 | CEPH_OSD_OP_WRITE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 1, |
@@ -205,6 +213,8 @@ enum { | |||
205 | CEPH_OSD_OP_CREATE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 13, | 213 | CEPH_OSD_OP_CREATE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 13, |
206 | CEPH_OSD_OP_ROLLBACK= CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 14, | 214 | CEPH_OSD_OP_ROLLBACK= CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 14, |
207 | 215 | ||
216 | CEPH_OSD_OP_WATCH = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 15, | ||
217 | |||
208 | /** attrs **/ | 218 | /** attrs **/ |
209 | /* read */ | 219 | /* read */ |
210 | CEPH_OSD_OP_GETXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 1, | 220 | CEPH_OSD_OP_GETXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 1, |
@@ -218,11 +228,14 @@ enum { | |||
218 | CEPH_OSD_OP_RMXATTR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 4, | 228 | CEPH_OSD_OP_RMXATTR = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 4, |
219 | 229 | ||
220 | /** subop **/ | 230 | /** subop **/ |
221 | CEPH_OSD_OP_PULL = CEPH_OSD_OP_MODE_SUB | 1, | 231 | CEPH_OSD_OP_PULL = CEPH_OSD_OP_MODE_SUB | 1, |
222 | CEPH_OSD_OP_PUSH = CEPH_OSD_OP_MODE_SUB | 2, | 232 | CEPH_OSD_OP_PUSH = CEPH_OSD_OP_MODE_SUB | 2, |
223 | CEPH_OSD_OP_BALANCEREADS = CEPH_OSD_OP_MODE_SUB | 3, | 233 | CEPH_OSD_OP_BALANCEREADS = CEPH_OSD_OP_MODE_SUB | 3, |
224 | CEPH_OSD_OP_UNBALANCEREADS = CEPH_OSD_OP_MODE_SUB | 4, | 234 | CEPH_OSD_OP_UNBALANCEREADS = CEPH_OSD_OP_MODE_SUB | 4, |
225 | CEPH_OSD_OP_SCRUB = CEPH_OSD_OP_MODE_SUB | 5, | 235 | CEPH_OSD_OP_SCRUB = CEPH_OSD_OP_MODE_SUB | 5, |
236 | CEPH_OSD_OP_SCRUB_RESERVE = CEPH_OSD_OP_MODE_SUB | 6, | ||
237 | CEPH_OSD_OP_SCRUB_UNRESERVE = CEPH_OSD_OP_MODE_SUB | 7, | ||
238 | CEPH_OSD_OP_SCRUB_STOP = CEPH_OSD_OP_MODE_SUB | 8, | ||
226 | 239 | ||
227 | /** lock **/ | 240 | /** lock **/ |
228 | CEPH_OSD_OP_WRLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 1, | 241 | CEPH_OSD_OP_WRLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 1, |
@@ -328,6 +341,8 @@ enum { | |||
328 | CEPH_OSD_CMPXATTR_MODE_U64 = 2 | 341 | CEPH_OSD_CMPXATTR_MODE_U64 = 2 |
329 | }; | 342 | }; |
330 | 343 | ||
344 | #define RADOS_NOTIFY_VER 1 | ||
345 | |||
331 | /* | 346 | /* |
332 | * an individual object operation. each may be accompanied by some data | 347 | * an individual object operation. each may be accompanied by some data |
333 | * payload | 348 | * payload |
@@ -359,7 +374,12 @@ struct ceph_osd_op { | |||
359 | struct { | 374 | struct { |
360 | __le64 snapid; | 375 | __le64 snapid; |
361 | } __attribute__ ((packed)) snap; | 376 | } __attribute__ ((packed)) snap; |
362 | }; | 377 | struct { |
378 | __le64 cookie; | ||
379 | __le64 ver; | ||
380 | __u8 flag; /* 0 = unwatch, 1 = watch */ | ||
381 | } __attribute__ ((packed)) watch; | ||
382 | }; | ||
363 | __le32 payload_len; | 383 | __le32 payload_len; |
364 | } __attribute__ ((packed)); | 384 | } __attribute__ ((packed)); |
365 | 385 | ||
@@ -402,4 +422,5 @@ struct ceph_osd_reply_head { | |||
402 | } __attribute__ ((packed)); | 422 | } __attribute__ ((packed)); |
403 | 423 | ||
404 | 424 | ||
425 | |||
405 | #endif | 426 | #endif |
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index ce104e33cd22..e654fa239916 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
@@ -474,7 +474,8 @@ struct cgroup_subsys { | |||
474 | struct cgroup *old_cgrp, struct task_struct *tsk, | 474 | struct cgroup *old_cgrp, struct task_struct *tsk, |
475 | bool threadgroup); | 475 | bool threadgroup); |
476 | void (*fork)(struct cgroup_subsys *ss, struct task_struct *task); | 476 | void (*fork)(struct cgroup_subsys *ss, struct task_struct *task); |
477 | void (*exit)(struct cgroup_subsys *ss, struct task_struct *task); | 477 | void (*exit)(struct cgroup_subsys *ss, struct cgroup *cgrp, |
478 | struct cgroup *old_cgrp, struct task_struct *task); | ||
478 | int (*populate)(struct cgroup_subsys *ss, | 479 | int (*populate)(struct cgroup_subsys *ss, |
479 | struct cgroup *cgrp); | 480 | struct cgroup *cgrp); |
480 | void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp); | 481 | void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp); |
@@ -626,6 +627,7 @@ bool css_is_ancestor(struct cgroup_subsys_state *cg, | |||
626 | /* Get id and depth of css */ | 627 | /* Get id and depth of css */ |
627 | unsigned short css_id(struct cgroup_subsys_state *css); | 628 | unsigned short css_id(struct cgroup_subsys_state *css); |
628 | unsigned short css_depth(struct cgroup_subsys_state *css); | 629 | unsigned short css_depth(struct cgroup_subsys_state *css); |
630 | struct cgroup_subsys_state *cgroup_css_from_dir(struct file *f, int id); | ||
629 | 631 | ||
630 | #else /* !CONFIG_CGROUPS */ | 632 | #else /* !CONFIG_CGROUPS */ |
631 | 633 | ||
diff --git a/include/linux/cgroup_subsys.h b/include/linux/cgroup_subsys.h index ccefff02b6cb..cdbfcb8780ec 100644 --- a/include/linux/cgroup_subsys.h +++ b/include/linux/cgroup_subsys.h | |||
@@ -65,4 +65,8 @@ SUBSYS(net_cls) | |||
65 | SUBSYS(blkio) | 65 | SUBSYS(blkio) |
66 | #endif | 66 | #endif |
67 | 67 | ||
68 | #ifdef CONFIG_CGROUP_PERF | ||
69 | SUBSYS(perf) | ||
70 | #endif | ||
71 | |||
68 | /* */ | 72 | /* */ |
diff --git a/include/linux/compaction.h b/include/linux/compaction.h index dfa2ed4c0d26..cc9f7a428649 100644 --- a/include/linux/compaction.h +++ b/include/linux/compaction.h | |||
@@ -11,9 +11,6 @@ | |||
11 | /* The full zone was compacted */ | 11 | /* The full zone was compacted */ |
12 | #define COMPACT_COMPLETE 3 | 12 | #define COMPACT_COMPLETE 3 |
13 | 13 | ||
14 | #define COMPACT_MODE_DIRECT_RECLAIM 0 | ||
15 | #define COMPACT_MODE_KSWAPD 1 | ||
16 | |||
17 | #ifdef CONFIG_COMPACTION | 14 | #ifdef CONFIG_COMPACTION |
18 | extern int sysctl_compact_memory; | 15 | extern int sysctl_compact_memory; |
19 | extern int sysctl_compaction_handler(struct ctl_table *table, int write, | 16 | extern int sysctl_compaction_handler(struct ctl_table *table, int write, |
@@ -28,8 +25,7 @@ extern unsigned long try_to_compact_pages(struct zonelist *zonelist, | |||
28 | bool sync); | 25 | bool sync); |
29 | extern unsigned long compaction_suitable(struct zone *zone, int order); | 26 | extern unsigned long compaction_suitable(struct zone *zone, int order); |
30 | extern unsigned long compact_zone_order(struct zone *zone, int order, | 27 | extern unsigned long compact_zone_order(struct zone *zone, int order, |
31 | gfp_t gfp_mask, bool sync, | 28 | gfp_t gfp_mask, bool sync); |
32 | int compact_mode); | ||
33 | 29 | ||
34 | /* Do not skip compaction more than 64 times */ | 30 | /* Do not skip compaction more than 64 times */ |
35 | #define COMPACT_MAX_DEFER_SHIFT 6 | 31 | #define COMPACT_MAX_DEFER_SHIFT 6 |
@@ -74,8 +70,7 @@ static inline unsigned long compaction_suitable(struct zone *zone, int order) | |||
74 | } | 70 | } |
75 | 71 | ||
76 | static inline unsigned long compact_zone_order(struct zone *zone, int order, | 72 | static inline unsigned long compact_zone_order(struct zone *zone, int order, |
77 | gfp_t gfp_mask, bool sync, | 73 | gfp_t gfp_mask, bool sync) |
78 | int compact_mode) | ||
79 | { | 74 | { |
80 | return COMPACT_CONTINUE; | 75 | return COMPACT_CONTINUE; |
81 | } | 76 | } |
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 16508bcddacc..cb4c1eb7778e 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h | |||
@@ -92,3 +92,11 @@ | |||
92 | #if !defined(__noclone) | 92 | #if !defined(__noclone) |
93 | #define __noclone /* not needed */ | 93 | #define __noclone /* not needed */ |
94 | #endif | 94 | #endif |
95 | |||
96 | /* | ||
97 | * A trick to suppress uninitialized variable warning without generating any | ||
98 | * code | ||
99 | */ | ||
100 | #define uninitialized_var(x) x = x | ||
101 | |||
102 | #define __always_inline inline __attribute__((always_inline)) | ||
diff --git a/include/linux/compiler-gcc3.h b/include/linux/compiler-gcc3.h index b721129e0469..37d412436d0f 100644 --- a/include/linux/compiler-gcc3.h +++ b/include/linux/compiler-gcc3.h | |||
@@ -21,11 +21,3 @@ | |||
21 | # error "GCOV profiling support for gcc versions below 3.4 not included" | 21 | # error "GCOV profiling support for gcc versions below 3.4 not included" |
22 | # endif /* __GNUC_MINOR__ */ | 22 | # endif /* __GNUC_MINOR__ */ |
23 | #endif /* CONFIG_GCOV_KERNEL */ | 23 | #endif /* CONFIG_GCOV_KERNEL */ |
24 | |||
25 | /* | ||
26 | * A trick to suppress uninitialized variable warning without generating any | ||
27 | * code | ||
28 | */ | ||
29 | #define uninitialized_var(x) x = x | ||
30 | |||
31 | #define __always_inline inline __attribute__((always_inline)) | ||
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index fcfa5b9a4317..64b7c003fd7a 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h | |||
@@ -12,13 +12,6 @@ | |||
12 | #define __used __attribute__((__used__)) | 12 | #define __used __attribute__((__used__)) |
13 | #define __must_check __attribute__((warn_unused_result)) | 13 | #define __must_check __attribute__((warn_unused_result)) |
14 | #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) | 14 | #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) |
15 | #define __always_inline inline __attribute__((always_inline)) | ||
16 | |||
17 | /* | ||
18 | * A trick to suppress uninitialized variable warning without generating any | ||
19 | * code | ||
20 | */ | ||
21 | #define uninitialized_var(x) x = x | ||
22 | 15 | ||
23 | #if __GNUC_MINOR__ >= 3 | 16 | #if __GNUC_MINOR__ >= 3 |
24 | /* Mark functions as cold. gcc will assume any path leading to a call | 17 | /* Mark functions as cold. gcc will assume any path leading to a call |
@@ -53,7 +46,6 @@ | |||
53 | #define __noclone __attribute__((__noclone__)) | 46 | #define __noclone __attribute__((__noclone__)) |
54 | 47 | ||
55 | #endif | 48 | #endif |
56 | |||
57 | #endif | 49 | #endif |
58 | 50 | ||
59 | #if __GNUC_MINOR__ > 0 | 51 | #if __GNUC_MINOR__ > 0 |
diff --git a/include/linux/connector.h b/include/linux/connector.h index 7e8ca75d2dad..bcafc942e5e4 100644 --- a/include/linux/connector.h +++ b/include/linux/connector.h | |||
@@ -42,8 +42,9 @@ | |||
42 | #define CN_VAL_DM_USERSPACE_LOG 0x1 | 42 | #define CN_VAL_DM_USERSPACE_LOG 0x1 |
43 | #define CN_IDX_DRBD 0x8 | 43 | #define CN_IDX_DRBD 0x8 |
44 | #define CN_VAL_DRBD 0x1 | 44 | #define CN_VAL_DRBD 0x1 |
45 | #define CN_KVP_IDX 0x9 /* HyperV KVP */ | ||
45 | 46 | ||
46 | #define CN_NETLINK_USERS 8 | 47 | #define CN_NETLINK_USERS 9 |
47 | 48 | ||
48 | /* | 49 | /* |
49 | * Maximum connector's message size. | 50 | * Maximum connector's message size. |
@@ -128,14 +129,17 @@ struct cn_dev { | |||
128 | struct cn_queue_dev *cbdev; | 129 | struct cn_queue_dev *cbdev; |
129 | }; | 130 | }; |
130 | 131 | ||
131 | int cn_add_callback(struct cb_id *, char *, void (*callback) (struct cn_msg *, struct netlink_skb_parms *)); | 132 | int cn_add_callback(struct cb_id *id, const char *name, |
133 | void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); | ||
132 | void cn_del_callback(struct cb_id *); | 134 | void cn_del_callback(struct cb_id *); |
133 | int cn_netlink_send(struct cn_msg *, u32, gfp_t); | 135 | int cn_netlink_send(struct cn_msg *, u32, gfp_t); |
134 | 136 | ||
135 | int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); | 137 | int cn_queue_add_callback(struct cn_queue_dev *dev, const char *name, |
138 | struct cb_id *id, | ||
139 | void (*callback)(struct cn_msg *, struct netlink_skb_parms *)); | ||
136 | void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); | 140 | void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id); |
137 | 141 | ||
138 | struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *); | 142 | struct cn_queue_dev *cn_queue_alloc_dev(const char *name, struct sock *); |
139 | void cn_queue_free_dev(struct cn_queue_dev *dev); | 143 | void cn_queue_free_dev(struct cn_queue_dev *dev); |
140 | 144 | ||
141 | int cn_cb_equal(struct cb_id *, struct cb_id *); | 145 | int cn_cb_equal(struct cb_id *, struct cb_id *); |
diff --git a/include/linux/cpu_rmap.h b/include/linux/cpu_rmap.h new file mode 100644 index 000000000000..473771a528c0 --- /dev/null +++ b/include/linux/cpu_rmap.h | |||
@@ -0,0 +1,73 @@ | |||
1 | /* | ||
2 | * cpu_rmap.c: CPU affinity reverse-map support | ||
3 | * Copyright 2011 Solarflare Communications Inc. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License version 2 as published | ||
7 | * by the Free Software Foundation, incorporated herein by reference. | ||
8 | */ | ||
9 | |||
10 | #include <linux/cpumask.h> | ||
11 | #include <linux/gfp.h> | ||
12 | #include <linux/slab.h> | ||
13 | |||
14 | /** | ||
15 | * struct cpu_rmap - CPU affinity reverse-map | ||
16 | * @size: Number of objects to be reverse-mapped | ||
17 | * @used: Number of objects added | ||
18 | * @obj: Pointer to array of object pointers | ||
19 | * @near: For each CPU, the index and distance to the nearest object, | ||
20 | * based on affinity masks | ||
21 | */ | ||
22 | struct cpu_rmap { | ||
23 | u16 size, used; | ||
24 | void **obj; | ||
25 | struct { | ||
26 | u16 index; | ||
27 | u16 dist; | ||
28 | } near[0]; | ||
29 | }; | ||
30 | #define CPU_RMAP_DIST_INF 0xffff | ||
31 | |||
32 | extern struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags); | ||
33 | |||
34 | /** | ||
35 | * free_cpu_rmap - free CPU affinity reverse-map | ||
36 | * @rmap: Reverse-map allocated with alloc_cpu_rmap(), or %NULL | ||
37 | */ | ||
38 | static inline void free_cpu_rmap(struct cpu_rmap *rmap) | ||
39 | { | ||
40 | kfree(rmap); | ||
41 | } | ||
42 | |||
43 | extern int cpu_rmap_add(struct cpu_rmap *rmap, void *obj); | ||
44 | extern int cpu_rmap_update(struct cpu_rmap *rmap, u16 index, | ||
45 | const struct cpumask *affinity); | ||
46 | |||
47 | static inline u16 cpu_rmap_lookup_index(struct cpu_rmap *rmap, unsigned int cpu) | ||
48 | { | ||
49 | return rmap->near[cpu].index; | ||
50 | } | ||
51 | |||
52 | static inline void *cpu_rmap_lookup_obj(struct cpu_rmap *rmap, unsigned int cpu) | ||
53 | { | ||
54 | return rmap->obj[rmap->near[cpu].index]; | ||
55 | } | ||
56 | |||
57 | #ifdef CONFIG_GENERIC_HARDIRQS | ||
58 | |||
59 | /** | ||
60 | * alloc_irq_cpu_rmap - allocate CPU affinity reverse-map for IRQs | ||
61 | * @size: Number of objects to be mapped | ||
62 | * | ||
63 | * Must be called in process context. | ||
64 | */ | ||
65 | static inline struct cpu_rmap *alloc_irq_cpu_rmap(unsigned int size) | ||
66 | { | ||
67 | return alloc_cpu_rmap(size, GFP_KERNEL); | ||
68 | } | ||
69 | extern void free_irq_cpu_rmap(struct cpu_rmap *rmap); | ||
70 | |||
71 | extern int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq); | ||
72 | |||
73 | #endif | ||
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index c3e9de8321c6..9343dd3de858 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
@@ -230,7 +230,7 @@ struct cpufreq_driver { | |||
230 | int (*bios_limit) (int cpu, unsigned int *limit); | 230 | int (*bios_limit) (int cpu, unsigned int *limit); |
231 | 231 | ||
232 | int (*exit) (struct cpufreq_policy *policy); | 232 | int (*exit) (struct cpufreq_policy *policy); |
233 | int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg); | 233 | int (*suspend) (struct cpufreq_policy *policy); |
234 | int (*resume) (struct cpufreq_policy *policy); | 234 | int (*resume) (struct cpufreq_policy *policy); |
235 | struct freq_attr **attr; | 235 | struct freq_attr **attr; |
236 | }; | 236 | }; |
@@ -281,19 +281,10 @@ __ATTR(_name, 0444, show_##_name, NULL) | |||
281 | static struct freq_attr _name = \ | 281 | static struct freq_attr _name = \ |
282 | __ATTR(_name, _perm, show_##_name, NULL) | 282 | __ATTR(_name, _perm, show_##_name, NULL) |
283 | 283 | ||
284 | #define cpufreq_freq_attr_ro_old(_name) \ | ||
285 | static struct freq_attr _name##_old = \ | ||
286 | __ATTR(_name, 0444, show_##_name##_old, NULL) | ||
287 | |||
288 | #define cpufreq_freq_attr_rw(_name) \ | 284 | #define cpufreq_freq_attr_rw(_name) \ |
289 | static struct freq_attr _name = \ | 285 | static struct freq_attr _name = \ |
290 | __ATTR(_name, 0644, show_##_name, store_##_name) | 286 | __ATTR(_name, 0644, show_##_name, store_##_name) |
291 | 287 | ||
292 | #define cpufreq_freq_attr_rw_old(_name) \ | ||
293 | static struct freq_attr _name##_old = \ | ||
294 | __ATTR(_name, 0644, show_##_name##_old, store_##_name##_old) | ||
295 | |||
296 | |||
297 | struct global_attr { | 288 | struct global_attr { |
298 | struct attribute attr; | 289 | struct attribute attr; |
299 | ssize_t (*show)(struct kobject *kobj, | 290 | ssize_t (*show)(struct kobject *kobj, |
diff --git a/include/linux/crc32.h b/include/linux/crc32.h index e20dd1f9b40a..391a259b2cc9 100644 --- a/include/linux/crc32.h +++ b/include/linux/crc32.h | |||
@@ -11,7 +11,7 @@ | |||
11 | extern u32 crc32_le(u32 crc, unsigned char const *p, size_t len); | 11 | extern u32 crc32_le(u32 crc, unsigned char const *p, size_t len); |
12 | extern u32 crc32_be(u32 crc, unsigned char const *p, size_t len); | 12 | extern u32 crc32_be(u32 crc, unsigned char const *p, size_t len); |
13 | 13 | ||
14 | #define crc32(seed, data, length) crc32_le(seed, (unsigned char const *)data, length) | 14 | #define crc32(seed, data, length) crc32_le(seed, (unsigned char const *)(data), length) |
15 | 15 | ||
16 | /* | 16 | /* |
17 | * Helpers for hash table generation of ethernet nics: | 17 | * Helpers for hash table generation of ethernet nics: |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index f958c19e3ca5..f2afed4fa945 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -168,7 +168,7 @@ struct dentry_operations { | |||
168 | void (*d_iput)(struct dentry *, struct inode *); | 168 | void (*d_iput)(struct dentry *, struct inode *); |
169 | char *(*d_dname)(struct dentry *, char *, int); | 169 | char *(*d_dname)(struct dentry *, char *, int); |
170 | struct vfsmount *(*d_automount)(struct path *); | 170 | struct vfsmount *(*d_automount)(struct path *); |
171 | int (*d_manage)(struct dentry *, bool, bool); | 171 | int (*d_manage)(struct dentry *, bool); |
172 | } ____cacheline_aligned; | 172 | } ____cacheline_aligned; |
173 | 173 | ||
174 | /* | 174 | /* |
@@ -416,7 +416,6 @@ static inline bool d_mountpoint(struct dentry *dentry) | |||
416 | return dentry->d_flags & DCACHE_MOUNTED; | 416 | return dentry->d_flags & DCACHE_MOUNTED; |
417 | } | 417 | } |
418 | 418 | ||
419 | extern struct vfsmount *lookup_mnt(struct path *); | ||
420 | extern struct dentry *lookup_create(struct nameidata *nd, int is_dir); | 419 | extern struct dentry *lookup_create(struct nameidata *nd, int is_dir); |
421 | 420 | ||
422 | extern int sysctl_vfs_cache_pressure; | 421 | extern int sysctl_vfs_cache_pressure; |
diff --git a/include/linux/dcbnl.h b/include/linux/dcbnl.h index 66900e3c6eb1..c52280047e2c 100644 --- a/include/linux/dcbnl.h +++ b/include/linux/dcbnl.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2008, Intel Corporation. | 2 | * Copyright (c) 2008-2011, Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -25,9 +25,14 @@ | |||
25 | /* IEEE 802.1Qaz std supported values */ | 25 | /* IEEE 802.1Qaz std supported values */ |
26 | #define IEEE_8021QAZ_MAX_TCS 8 | 26 | #define IEEE_8021QAZ_MAX_TCS 8 |
27 | 27 | ||
28 | #define IEEE_8021QAZ_TSA_STRICT 0 | ||
29 | #define IEEE_8021QAZ_TSA_CB_SHAPER 1 | ||
30 | #define IEEE_8021QAZ_TSA_ETS 2 | ||
31 | #define IEEE_8021QAZ_TSA_VENDOR 255 | ||
32 | |||
28 | /* This structure contains the IEEE 802.1Qaz ETS managed object | 33 | /* This structure contains the IEEE 802.1Qaz ETS managed object |
29 | * | 34 | * |
30 | * @willing: willing bit in ETS configuratin TLV | 35 | * @willing: willing bit in ETS configuration TLV |
31 | * @ets_cap: indicates supported capacity of ets feature | 36 | * @ets_cap: indicates supported capacity of ets feature |
32 | * @cbs: credit based shaper ets algorithm supported | 37 | * @cbs: credit based shaper ets algorithm supported |
33 | * @tc_tx_bw: tc tx bandwidth indexed by traffic class | 38 | * @tc_tx_bw: tc tx bandwidth indexed by traffic class |
@@ -82,6 +87,50 @@ struct ieee_pfc { | |||
82 | __u64 indications[IEEE_8021QAZ_MAX_TCS]; | 87 | __u64 indications[IEEE_8021QAZ_MAX_TCS]; |
83 | }; | 88 | }; |
84 | 89 | ||
90 | /* CEE DCBX std supported values */ | ||
91 | #define CEE_DCBX_MAX_PGS 8 | ||
92 | #define CEE_DCBX_MAX_PRIO 8 | ||
93 | |||
94 | /** | ||
95 | * struct cee_pg - CEE Priority-Group managed object | ||
96 | * | ||
97 | * @willing: willing bit in the PG tlv | ||
98 | * @error: error bit in the PG tlv | ||
99 | * @pg_en: enable bit of the PG feature | ||
100 | * @tcs_supported: number of traffic classes supported | ||
101 | * @pg_bw: bandwidth percentage for each priority group | ||
102 | * @prio_pg: priority to PG mapping indexed by priority | ||
103 | */ | ||
104 | struct cee_pg { | ||
105 | __u8 willing; | ||
106 | __u8 error; | ||
107 | __u8 pg_en; | ||
108 | __u8 tcs_supported; | ||
109 | __u8 pg_bw[CEE_DCBX_MAX_PGS]; | ||
110 | __u8 prio_pg[CEE_DCBX_MAX_PGS]; | ||
111 | }; | ||
112 | |||
113 | /** | ||
114 | * struct cee_pfc - CEE PFC managed object | ||
115 | * | ||
116 | * @willing: willing bit in the PFC tlv | ||
117 | * @error: error bit in the PFC tlv | ||
118 | * @pfc_en: bitmap indicating pfc enabled traffic classes | ||
119 | * @tcs_supported: number of traffic classes supported | ||
120 | */ | ||
121 | struct cee_pfc { | ||
122 | __u8 willing; | ||
123 | __u8 error; | ||
124 | __u8 pfc_en; | ||
125 | __u8 tcs_supported; | ||
126 | }; | ||
127 | |||
128 | /* IEEE 802.1Qaz std supported values */ | ||
129 | #define IEEE_8021QAZ_APP_SEL_ETHERTYPE 1 | ||
130 | #define IEEE_8021QAZ_APP_SEL_STREAM 2 | ||
131 | #define IEEE_8021QAZ_APP_SEL_DGRAM 3 | ||
132 | #define IEEE_8021QAZ_APP_SEL_ANY 4 | ||
133 | |||
85 | /* This structure contains the IEEE 802.1Qaz APP managed object. This | 134 | /* This structure contains the IEEE 802.1Qaz APP managed object. This |
86 | * object is also used for the CEE std as well. There is no difference | 135 | * object is also used for the CEE std as well. There is no difference |
87 | * between the objects. | 136 | * between the objects. |
@@ -105,6 +154,20 @@ struct dcb_app { | |||
105 | __u16 protocol; | 154 | __u16 protocol; |
106 | }; | 155 | }; |
107 | 156 | ||
157 | /** | ||
158 | * struct dcb_peer_app_info - APP feature information sent by the peer | ||
159 | * | ||
160 | * @willing: willing bit in the peer APP tlv | ||
161 | * @error: error bit in the peer APP tlv | ||
162 | * | ||
163 | * In addition to this information the full peer APP tlv also contains | ||
164 | * a table of 'app_count' APP objects defined above. | ||
165 | */ | ||
166 | struct dcb_peer_app_info { | ||
167 | __u8 willing; | ||
168 | __u8 error; | ||
169 | }; | ||
170 | |||
108 | struct dcbmsg { | 171 | struct dcbmsg { |
109 | __u8 dcb_family; | 172 | __u8 dcb_family; |
110 | __u8 cmd; | 173 | __u8 cmd; |
@@ -139,6 +202,7 @@ struct dcbmsg { | |||
139 | * @DCB_CMD_SDCBX: set DCBX engine configuration | 202 | * @DCB_CMD_SDCBX: set DCBX engine configuration |
140 | * @DCB_CMD_GFEATCFG: get DCBX features flags | 203 | * @DCB_CMD_GFEATCFG: get DCBX features flags |
141 | * @DCB_CMD_SFEATCFG: set DCBX features negotiation flags | 204 | * @DCB_CMD_SFEATCFG: set DCBX features negotiation flags |
205 | * @DCB_CMD_CEE_GET: get CEE aggregated configuration | ||
142 | */ | 206 | */ |
143 | enum dcbnl_commands { | 207 | enum dcbnl_commands { |
144 | DCB_CMD_UNDEFINED, | 208 | DCB_CMD_UNDEFINED, |
@@ -181,6 +245,8 @@ enum dcbnl_commands { | |||
181 | DCB_CMD_GFEATCFG, | 245 | DCB_CMD_GFEATCFG, |
182 | DCB_CMD_SFEATCFG, | 246 | DCB_CMD_SFEATCFG, |
183 | 247 | ||
248 | DCB_CMD_CEE_GET, | ||
249 | |||
184 | __DCB_CMD_ENUM_MAX, | 250 | __DCB_CMD_ENUM_MAX, |
185 | DCB_CMD_MAX = __DCB_CMD_ENUM_MAX - 1, | 251 | DCB_CMD_MAX = __DCB_CMD_ENUM_MAX - 1, |
186 | }; | 252 | }; |
@@ -203,6 +269,7 @@ enum dcbnl_commands { | |||
203 | * @DCB_ATTR_IEEE: IEEE 802.1Qaz supported attributes (NLA_NESTED) | 269 | * @DCB_ATTR_IEEE: IEEE 802.1Qaz supported attributes (NLA_NESTED) |
204 | * @DCB_ATTR_DCBX: DCBX engine configuration in the device (NLA_U8) | 270 | * @DCB_ATTR_DCBX: DCBX engine configuration in the device (NLA_U8) |
205 | * @DCB_ATTR_FEATCFG: DCBX features flags (NLA_NESTED) | 271 | * @DCB_ATTR_FEATCFG: DCBX features flags (NLA_NESTED) |
272 | * @DCB_ATTR_CEE: CEE std supported attributes (NLA_NESTED) | ||
206 | */ | 273 | */ |
207 | enum dcbnl_attrs { | 274 | enum dcbnl_attrs { |
208 | DCB_ATTR_UNDEFINED, | 275 | DCB_ATTR_UNDEFINED, |
@@ -226,15 +293,32 @@ enum dcbnl_attrs { | |||
226 | DCB_ATTR_DCBX, | 293 | DCB_ATTR_DCBX, |
227 | DCB_ATTR_FEATCFG, | 294 | DCB_ATTR_FEATCFG, |
228 | 295 | ||
296 | /* CEE nested attributes */ | ||
297 | DCB_ATTR_CEE, | ||
298 | |||
229 | __DCB_ATTR_ENUM_MAX, | 299 | __DCB_ATTR_ENUM_MAX, |
230 | DCB_ATTR_MAX = __DCB_ATTR_ENUM_MAX - 1, | 300 | DCB_ATTR_MAX = __DCB_ATTR_ENUM_MAX - 1, |
231 | }; | 301 | }; |
232 | 302 | ||
303 | /** | ||
304 | * enum ieee_attrs - IEEE 802.1Qaz get/set attributes | ||
305 | * | ||
306 | * @DCB_ATTR_IEEE_UNSPEC: unspecified | ||
307 | * @DCB_ATTR_IEEE_ETS: negotiated ETS configuration | ||
308 | * @DCB_ATTR_IEEE_PFC: negotiated PFC configuration | ||
309 | * @DCB_ATTR_IEEE_APP_TABLE: negotiated APP configuration | ||
310 | * @DCB_ATTR_IEEE_PEER_ETS: peer ETS configuration - get only | ||
311 | * @DCB_ATTR_IEEE_PEER_PFC: peer PFC configuration - get only | ||
312 | * @DCB_ATTR_IEEE_PEER_APP: peer APP tlv - get only | ||
313 | */ | ||
233 | enum ieee_attrs { | 314 | enum ieee_attrs { |
234 | DCB_ATTR_IEEE_UNSPEC, | 315 | DCB_ATTR_IEEE_UNSPEC, |
235 | DCB_ATTR_IEEE_ETS, | 316 | DCB_ATTR_IEEE_ETS, |
236 | DCB_ATTR_IEEE_PFC, | 317 | DCB_ATTR_IEEE_PFC, |
237 | DCB_ATTR_IEEE_APP_TABLE, | 318 | DCB_ATTR_IEEE_APP_TABLE, |
319 | DCB_ATTR_IEEE_PEER_ETS, | ||
320 | DCB_ATTR_IEEE_PEER_PFC, | ||
321 | DCB_ATTR_IEEE_PEER_APP, | ||
238 | __DCB_ATTR_IEEE_MAX | 322 | __DCB_ATTR_IEEE_MAX |
239 | }; | 323 | }; |
240 | #define DCB_ATTR_IEEE_MAX (__DCB_ATTR_IEEE_MAX - 1) | 324 | #define DCB_ATTR_IEEE_MAX (__DCB_ATTR_IEEE_MAX - 1) |
@@ -247,6 +331,31 @@ enum ieee_attrs_app { | |||
247 | #define DCB_ATTR_IEEE_APP_MAX (__DCB_ATTR_IEEE_APP_MAX - 1) | 331 | #define DCB_ATTR_IEEE_APP_MAX (__DCB_ATTR_IEEE_APP_MAX - 1) |
248 | 332 | ||
249 | /** | 333 | /** |
334 | * enum cee_attrs - CEE DCBX get attributes | ||
335 | * | ||
336 | * @DCB_ATTR_CEE_UNSPEC: unspecified | ||
337 | * @DCB_ATTR_CEE_PEER_PG: peer PG configuration - get only | ||
338 | * @DCB_ATTR_CEE_PEER_PFC: peer PFC configuration - get only | ||
339 | * @DCB_ATTR_CEE_PEER_APP: peer APP tlv - get only | ||
340 | */ | ||
341 | enum cee_attrs { | ||
342 | DCB_ATTR_CEE_UNSPEC, | ||
343 | DCB_ATTR_CEE_PEER_PG, | ||
344 | DCB_ATTR_CEE_PEER_PFC, | ||
345 | DCB_ATTR_CEE_PEER_APP_TABLE, | ||
346 | __DCB_ATTR_CEE_MAX | ||
347 | }; | ||
348 | #define DCB_ATTR_CEE_MAX (__DCB_ATTR_CEE_MAX - 1) | ||
349 | |||
350 | enum peer_app_attr { | ||
351 | DCB_ATTR_CEE_PEER_APP_UNSPEC, | ||
352 | DCB_ATTR_CEE_PEER_APP_INFO, | ||
353 | DCB_ATTR_CEE_PEER_APP, | ||
354 | __DCB_ATTR_CEE_PEER_APP_MAX | ||
355 | }; | ||
356 | #define DCB_ATTR_CEE_PEER_APP_MAX (__DCB_ATTR_CEE_PEER_APP_MAX - 1) | ||
357 | |||
358 | /** | ||
250 | * enum dcbnl_pfc_attrs - DCB Priority Flow Control user priority nested attrs | 359 | * enum dcbnl_pfc_attrs - DCB Priority Flow Control user priority nested attrs |
251 | * | 360 | * |
252 | * @DCB_PFC_UP_ATTR_UNDEFINED: unspecified attribute to catch errors | 361 | * @DCB_PFC_UP_ATTR_UNDEFINED: unspecified attribute to catch errors |
diff --git a/include/linux/dccp.h b/include/linux/dccp.h index 010e2d87ed75..d638e85dc501 100644 --- a/include/linux/dccp.h +++ b/include/linux/dccp.h | |||
@@ -279,8 +279,6 @@ enum dccp_state { | |||
279 | DCCP_MAX_STATES | 279 | DCCP_MAX_STATES |
280 | }; | 280 | }; |
281 | 281 | ||
282 | #define DCCP_STATE_MASK 0x1f | ||
283 | |||
284 | enum { | 282 | enum { |
285 | DCCPF_OPEN = TCPF_ESTABLISHED, | 283 | DCCPF_OPEN = TCPF_ESTABLISHED, |
286 | DCCPF_REQUESTING = TCPF_SYN_SENT, | 284 | DCCPF_REQUESTING = TCPF_SYN_SENT, |
diff --git a/include/linux/debugobjects.h b/include/linux/debugobjects.h index 597692f1fc8d..65970b811e22 100644 --- a/include/linux/debugobjects.h +++ b/include/linux/debugobjects.h | |||
@@ -34,7 +34,10 @@ struct debug_obj { | |||
34 | 34 | ||
35 | /** | 35 | /** |
36 | * struct debug_obj_descr - object type specific debug description structure | 36 | * struct debug_obj_descr - object type specific debug description structure |
37 | * | ||
37 | * @name: name of the object typee | 38 | * @name: name of the object typee |
39 | * @debug_hint: function returning address, which have associated | ||
40 | * kernel symbol, to allow identify the object | ||
38 | * @fixup_init: fixup function, which is called when the init check | 41 | * @fixup_init: fixup function, which is called when the init check |
39 | * fails | 42 | * fails |
40 | * @fixup_activate: fixup function, which is called when the activate check | 43 | * @fixup_activate: fixup function, which is called when the activate check |
@@ -46,7 +49,7 @@ struct debug_obj { | |||
46 | */ | 49 | */ |
47 | struct debug_obj_descr { | 50 | struct debug_obj_descr { |
48 | const char *name; | 51 | const char *name; |
49 | 52 | void *(*debug_hint) (void *addr); | |
50 | int (*fixup_init) (void *addr, enum debug_obj_state state); | 53 | int (*fixup_init) (void *addr, enum debug_obj_state state); |
51 | int (*fixup_activate) (void *addr, enum debug_obj_state state); | 54 | int (*fixup_activate) (void *addr, enum debug_obj_state state); |
52 | int (*fixup_destroy) (void *addr, enum debug_obj_state state); | 55 | int (*fixup_destroy) (void *addr, enum debug_obj_state state); |
diff --git a/include/linux/device.h b/include/linux/device.h index 1bf5cf0b4513..144ec135875f 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -128,9 +128,7 @@ struct device_driver { | |||
128 | 128 | ||
129 | bool suppress_bind_attrs; /* disables bind/unbind via sysfs */ | 129 | bool suppress_bind_attrs; /* disables bind/unbind via sysfs */ |
130 | 130 | ||
131 | #if defined(CONFIG_OF) | ||
132 | const struct of_device_id *of_match_table; | 131 | const struct of_device_id *of_match_table; |
133 | #endif | ||
134 | 132 | ||
135 | int (*probe) (struct device *dev); | 133 | int (*probe) (struct device *dev); |
136 | int (*remove) (struct device *dev); | 134 | int (*remove) (struct device *dev); |
@@ -422,6 +420,7 @@ struct device { | |||
422 | void *platform_data; /* Platform specific data, device | 420 | void *platform_data; /* Platform specific data, device |
423 | core doesn't touch it */ | 421 | core doesn't touch it */ |
424 | struct dev_pm_info power; | 422 | struct dev_pm_info power; |
423 | struct dev_power_domain *pwr_domain; | ||
425 | 424 | ||
426 | #ifdef CONFIG_NUMA | 425 | #ifdef CONFIG_NUMA |
427 | int numa_node; /* NUMA node this device is close to */ | 426 | int numa_node; /* NUMA node this device is close to */ |
@@ -441,9 +440,9 @@ struct device { | |||
441 | override */ | 440 | override */ |
442 | /* arch specific additions */ | 441 | /* arch specific additions */ |
443 | struct dev_archdata archdata; | 442 | struct dev_archdata archdata; |
444 | #ifdef CONFIG_OF | 443 | |
445 | struct device_node *of_node; | 444 | struct device_node *of_node; /* associated device tree node */ |
446 | #endif | 445 | const struct of_device_id *of_match; /* matching of_device_id from driver */ |
447 | 446 | ||
448 | dev_t devt; /* dev_t, creates the sysfs "dev" */ | 447 | dev_t devt; /* dev_t, creates the sysfs "dev" */ |
449 | 448 | ||
diff --git a/include/linux/dmi.h b/include/linux/dmi.h index 90e087f8d951..f156cca25ad0 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h | |||
@@ -23,6 +23,53 @@ enum dmi_device_type { | |||
23 | DMI_DEV_TYPE_DEV_ONBOARD = -3, | 23 | DMI_DEV_TYPE_DEV_ONBOARD = -3, |
24 | }; | 24 | }; |
25 | 25 | ||
26 | enum dmi_entry_type { | ||
27 | DMI_ENTRY_BIOS = 0, | ||
28 | DMI_ENTRY_SYSTEM, | ||
29 | DMI_ENTRY_BASEBOARD, | ||
30 | DMI_ENTRY_CHASSIS, | ||
31 | DMI_ENTRY_PROCESSOR, | ||
32 | DMI_ENTRY_MEM_CONTROLLER, | ||
33 | DMI_ENTRY_MEM_MODULE, | ||
34 | DMI_ENTRY_CACHE, | ||
35 | DMI_ENTRY_PORT_CONNECTOR, | ||
36 | DMI_ENTRY_SYSTEM_SLOT, | ||
37 | DMI_ENTRY_ONBOARD_DEVICE, | ||
38 | DMI_ENTRY_OEMSTRINGS, | ||
39 | DMI_ENTRY_SYSCONF, | ||
40 | DMI_ENTRY_BIOS_LANG, | ||
41 | DMI_ENTRY_GROUP_ASSOC, | ||
42 | DMI_ENTRY_SYSTEM_EVENT_LOG, | ||
43 | DMI_ENTRY_PHYS_MEM_ARRAY, | ||
44 | DMI_ENTRY_MEM_DEVICE, | ||
45 | DMI_ENTRY_32_MEM_ERROR, | ||
46 | DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR, | ||
47 | DMI_ENTRY_MEM_DEV_MAPPED_ADDR, | ||
48 | DMI_ENTRY_BUILTIN_POINTING_DEV, | ||
49 | DMI_ENTRY_PORTABLE_BATTERY, | ||
50 | DMI_ENTRY_SYSTEM_RESET, | ||
51 | DMI_ENTRY_HW_SECURITY, | ||
52 | DMI_ENTRY_SYSTEM_POWER_CONTROLS, | ||
53 | DMI_ENTRY_VOLTAGE_PROBE, | ||
54 | DMI_ENTRY_COOLING_DEV, | ||
55 | DMI_ENTRY_TEMP_PROBE, | ||
56 | DMI_ENTRY_ELECTRICAL_CURRENT_PROBE, | ||
57 | DMI_ENTRY_OOB_REMOTE_ACCESS, | ||
58 | DMI_ENTRY_BIS_ENTRY, | ||
59 | DMI_ENTRY_SYSTEM_BOOT, | ||
60 | DMI_ENTRY_MGMT_DEV, | ||
61 | DMI_ENTRY_MGMT_DEV_COMPONENT, | ||
62 | DMI_ENTRY_MGMT_DEV_THRES, | ||
63 | DMI_ENTRY_MEM_CHANNEL, | ||
64 | DMI_ENTRY_IPMI_DEV, | ||
65 | DMI_ENTRY_SYS_POWER_SUPPLY, | ||
66 | DMI_ENTRY_ADDITIONAL, | ||
67 | DMI_ENTRY_ONBOARD_DEV_EXT, | ||
68 | DMI_ENTRY_MGMT_CONTROLLER_HOST, | ||
69 | DMI_ENTRY_INACTIVE = 126, | ||
70 | DMI_ENTRY_END_OF_TABLE = 127, | ||
71 | }; | ||
72 | |||
26 | struct dmi_header { | 73 | struct dmi_header { |
27 | u8 type; | 74 | u8 type; |
28 | u8 length; | 75 | u8 length; |
diff --git a/include/linux/dw_dmac.h b/include/linux/dw_dmac.h index c8aad713a046..6998d9376ef9 100644 --- a/include/linux/dw_dmac.h +++ b/include/linux/dw_dmac.h | |||
@@ -16,9 +16,18 @@ | |||
16 | /** | 16 | /** |
17 | * struct dw_dma_platform_data - Controller configuration parameters | 17 | * struct dw_dma_platform_data - Controller configuration parameters |
18 | * @nr_channels: Number of channels supported by hardware (max 8) | 18 | * @nr_channels: Number of channels supported by hardware (max 8) |
19 | * @is_private: The device channels should be marked as private and not for | ||
20 | * by the general purpose DMA channel allocator. | ||
19 | */ | 21 | */ |
20 | struct dw_dma_platform_data { | 22 | struct dw_dma_platform_data { |
21 | unsigned int nr_channels; | 23 | unsigned int nr_channels; |
24 | bool is_private; | ||
25 | #define CHAN_ALLOCATION_ASCENDING 0 /* zero to seven */ | ||
26 | #define CHAN_ALLOCATION_DESCENDING 1 /* seven to zero */ | ||
27 | unsigned char chan_allocation_order; | ||
28 | #define CHAN_PRIORITY_ASCENDING 0 /* chan0 highest */ | ||
29 | #define CHAN_PRIORITY_DESCENDING 1 /* chan7 highest */ | ||
30 | unsigned char chan_priority; | ||
22 | }; | 31 | }; |
23 | 32 | ||
24 | /** | 33 | /** |
@@ -33,6 +42,30 @@ enum dw_dma_slave_width { | |||
33 | DW_DMA_SLAVE_WIDTH_32BIT, | 42 | DW_DMA_SLAVE_WIDTH_32BIT, |
34 | }; | 43 | }; |
35 | 44 | ||
45 | /* bursts size */ | ||
46 | enum dw_dma_msize { | ||
47 | DW_DMA_MSIZE_1, | ||
48 | DW_DMA_MSIZE_4, | ||
49 | DW_DMA_MSIZE_8, | ||
50 | DW_DMA_MSIZE_16, | ||
51 | DW_DMA_MSIZE_32, | ||
52 | DW_DMA_MSIZE_64, | ||
53 | DW_DMA_MSIZE_128, | ||
54 | DW_DMA_MSIZE_256, | ||
55 | }; | ||
56 | |||
57 | /* flow controller */ | ||
58 | enum dw_dma_fc { | ||
59 | DW_DMA_FC_D_M2M, | ||
60 | DW_DMA_FC_D_M2P, | ||
61 | DW_DMA_FC_D_P2M, | ||
62 | DW_DMA_FC_D_P2P, | ||
63 | DW_DMA_FC_P_P2M, | ||
64 | DW_DMA_FC_SP_P2P, | ||
65 | DW_DMA_FC_P_M2P, | ||
66 | DW_DMA_FC_DP_P2P, | ||
67 | }; | ||
68 | |||
36 | /** | 69 | /** |
37 | * struct dw_dma_slave - Controller-specific information about a slave | 70 | * struct dw_dma_slave - Controller-specific information about a slave |
38 | * | 71 | * |
@@ -44,6 +77,11 @@ enum dw_dma_slave_width { | |||
44 | * @reg_width: peripheral register width | 77 | * @reg_width: peripheral register width |
45 | * @cfg_hi: Platform-specific initializer for the CFG_HI register | 78 | * @cfg_hi: Platform-specific initializer for the CFG_HI register |
46 | * @cfg_lo: Platform-specific initializer for the CFG_LO register | 79 | * @cfg_lo: Platform-specific initializer for the CFG_LO register |
80 | * @src_master: src master for transfers on allocated channel. | ||
81 | * @dst_master: dest master for transfers on allocated channel. | ||
82 | * @src_msize: src burst size. | ||
83 | * @dst_msize: dest burst size. | ||
84 | * @fc: flow controller for DMA transfer | ||
47 | */ | 85 | */ |
48 | struct dw_dma_slave { | 86 | struct dw_dma_slave { |
49 | struct device *dma_dev; | 87 | struct device *dma_dev; |
@@ -52,6 +90,11 @@ struct dw_dma_slave { | |||
52 | enum dw_dma_slave_width reg_width; | 90 | enum dw_dma_slave_width reg_width; |
53 | u32 cfg_hi; | 91 | u32 cfg_hi; |
54 | u32 cfg_lo; | 92 | u32 cfg_lo; |
93 | u8 src_master; | ||
94 | u8 dst_master; | ||
95 | u8 src_msize; | ||
96 | u8 dst_msize; | ||
97 | u8 fc; | ||
55 | }; | 98 | }; |
56 | 99 | ||
57 | /* Platform-configurable bits in CFG_HI */ | 100 | /* Platform-configurable bits in CFG_HI */ |
@@ -62,7 +105,6 @@ struct dw_dma_slave { | |||
62 | #define DWC_CFGH_DST_PER(x) ((x) << 11) | 105 | #define DWC_CFGH_DST_PER(x) ((x) << 11) |
63 | 106 | ||
64 | /* Platform-configurable bits in CFG_LO */ | 107 | /* Platform-configurable bits in CFG_LO */ |
65 | #define DWC_CFGL_PRIO(x) ((x) << 5) /* priority */ | ||
66 | #define DWC_CFGL_LOCK_CH_XFER (0 << 12) /* scope of LOCK_CH */ | 108 | #define DWC_CFGL_LOCK_CH_XFER (0 << 12) /* scope of LOCK_CH */ |
67 | #define DWC_CFGL_LOCK_CH_BLOCK (1 << 12) | 109 | #define DWC_CFGL_LOCK_CH_BLOCK (1 << 12) |
68 | #define DWC_CFGL_LOCK_CH_XACT (2 << 12) | 110 | #define DWC_CFGL_LOCK_CH_XACT (2 << 12) |
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h index 1c70028f81f9..0c9653f11c18 100644 --- a/include/linux/dynamic_debug.h +++ b/include/linux/dynamic_debug.h | |||
@@ -31,6 +31,10 @@ struct _ddebug { | |||
31 | * writes commands to <debugfs>/dynamic_debug/control | 31 | * writes commands to <debugfs>/dynamic_debug/control |
32 | */ | 32 | */ |
33 | #define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */ | 33 | #define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */ |
34 | #define _DPRINTK_FLAGS_INCL_MODNAME (1<<1) | ||
35 | #define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2) | ||
36 | #define _DPRINTK_FLAGS_INCL_LINENO (1<<3) | ||
37 | #define _DPRINTK_FLAGS_INCL_TID (1<<4) | ||
34 | #define _DPRINTK_FLAGS_DEFAULT 0 | 38 | #define _DPRINTK_FLAGS_DEFAULT 0 |
35 | unsigned int flags:8; | 39 | unsigned int flags:8; |
36 | char enabled; | 40 | char enabled; |
@@ -42,6 +46,8 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n, | |||
42 | 46 | ||
43 | #if defined(CONFIG_DYNAMIC_DEBUG) | 47 | #if defined(CONFIG_DYNAMIC_DEBUG) |
44 | extern int ddebug_remove_module(const char *mod_name); | 48 | extern int ddebug_remove_module(const char *mod_name); |
49 | extern int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...) | ||
50 | __attribute__ ((format (printf, 2, 3))); | ||
45 | 51 | ||
46 | #define dynamic_pr_debug(fmt, ...) do { \ | 52 | #define dynamic_pr_debug(fmt, ...) do { \ |
47 | static struct _ddebug descriptor \ | 53 | static struct _ddebug descriptor \ |
@@ -50,7 +56,7 @@ extern int ddebug_remove_module(const char *mod_name); | |||
50 | { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ | 56 | { KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \ |
51 | _DPRINTK_FLAGS_DEFAULT }; \ | 57 | _DPRINTK_FLAGS_DEFAULT }; \ |
52 | if (unlikely(descriptor.enabled)) \ | 58 | if (unlikely(descriptor.enabled)) \ |
53 | printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \ | 59 | __dynamic_pr_debug(&descriptor, pr_fmt(fmt), ##__VA_ARGS__); \ |
54 | } while (0) | 60 | } while (0) |
55 | 61 | ||
56 | 62 | ||
diff --git a/include/linux/efi.h b/include/linux/efi.h index fb737bc19a8c..33fa1203024e 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h | |||
@@ -397,4 +397,41 @@ static inline void memrange_efi_to_native(u64 *addr, u64 *npages) | |||
397 | *addr &= PAGE_MASK; | 397 | *addr &= PAGE_MASK; |
398 | } | 398 | } |
399 | 399 | ||
400 | #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE) | ||
401 | /* | ||
402 | * EFI Variable support. | ||
403 | * | ||
404 | * Different firmware drivers can expose their EFI-like variables using | ||
405 | * the following. | ||
406 | */ | ||
407 | |||
408 | struct efivar_operations { | ||
409 | efi_get_variable_t *get_variable; | ||
410 | efi_get_next_variable_t *get_next_variable; | ||
411 | efi_set_variable_t *set_variable; | ||
412 | }; | ||
413 | |||
414 | struct efivars { | ||
415 | /* | ||
416 | * ->lock protects two things: | ||
417 | * 1) ->list - adds, removals, reads, writes | ||
418 | * 2) ops.[gs]et_variable() calls. | ||
419 | * It must not be held when creating sysfs entries or calling kmalloc. | ||
420 | * ops.get_next_variable() is only called from register_efivars(), | ||
421 | * which is protected by the BKL, so that path is safe. | ||
422 | */ | ||
423 | spinlock_t lock; | ||
424 | struct list_head list; | ||
425 | struct kset *kset; | ||
426 | struct bin_attribute *new_var, *del_var; | ||
427 | const struct efivar_operations *ops; | ||
428 | }; | ||
429 | |||
430 | int register_efivars(struct efivars *efivars, | ||
431 | const struct efivar_operations *ops, | ||
432 | struct kobject *parent_kobj); | ||
433 | void unregister_efivars(struct efivars *efivars); | ||
434 | |||
435 | #endif /* CONFIG_EFI_VARS */ | ||
436 | |||
400 | #endif /* _LINUX_EFI_H */ | 437 | #endif /* _LINUX_EFI_H */ |
diff --git a/include/linux/err.h b/include/linux/err.h index 448afc12c78a..f2edce25a76b 100644 --- a/include/linux/err.h +++ b/include/linux/err.h | |||
@@ -52,6 +52,14 @@ static inline void * __must_check ERR_CAST(const void *ptr) | |||
52 | return (void *) ptr; | 52 | return (void *) ptr; |
53 | } | 53 | } |
54 | 54 | ||
55 | static inline int __must_check PTR_RET(const void *ptr) | ||
56 | { | ||
57 | if (IS_ERR(ptr)) | ||
58 | return PTR_ERR(ptr); | ||
59 | else | ||
60 | return 0; | ||
61 | } | ||
62 | |||
55 | #endif | 63 | #endif |
56 | 64 | ||
57 | #endif /* _LINUX_ERR_H */ | 65 | #endif /* _LINUX_ERR_H */ |
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index 1908929204a9..b297f288f6eb 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
@@ -13,6 +13,9 @@ | |||
13 | #ifndef _LINUX_ETHTOOL_H | 13 | #ifndef _LINUX_ETHTOOL_H |
14 | #define _LINUX_ETHTOOL_H | 14 | #define _LINUX_ETHTOOL_H |
15 | 15 | ||
16 | #ifdef __KERNEL__ | ||
17 | #include <linux/compat.h> | ||
18 | #endif | ||
16 | #include <linux/types.h> | 19 | #include <linux/types.h> |
17 | #include <linux/if_ether.h> | 20 | #include <linux/if_ether.h> |
18 | 21 | ||
@@ -251,6 +254,7 @@ enum ethtool_stringset { | |||
251 | ETH_SS_STATS, | 254 | ETH_SS_STATS, |
252 | ETH_SS_PRIV_FLAGS, | 255 | ETH_SS_PRIV_FLAGS, |
253 | ETH_SS_NTUPLE_FILTERS, | 256 | ETH_SS_NTUPLE_FILTERS, |
257 | ETH_SS_FEATURES, | ||
254 | }; | 258 | }; |
255 | 259 | ||
256 | /* for passing string sets for data tagging */ | 260 | /* for passing string sets for data tagging */ |
@@ -449,6 +453,37 @@ struct ethtool_rxnfc { | |||
449 | __u32 rule_locs[0]; | 453 | __u32 rule_locs[0]; |
450 | }; | 454 | }; |
451 | 455 | ||
456 | #ifdef __KERNEL__ | ||
457 | #ifdef CONFIG_COMPAT | ||
458 | |||
459 | struct compat_ethtool_rx_flow_spec { | ||
460 | u32 flow_type; | ||
461 | union { | ||
462 | struct ethtool_tcpip4_spec tcp_ip4_spec; | ||
463 | struct ethtool_tcpip4_spec udp_ip4_spec; | ||
464 | struct ethtool_tcpip4_spec sctp_ip4_spec; | ||
465 | struct ethtool_ah_espip4_spec ah_ip4_spec; | ||
466 | struct ethtool_ah_espip4_spec esp_ip4_spec; | ||
467 | struct ethtool_usrip4_spec usr_ip4_spec; | ||
468 | struct ethhdr ether_spec; | ||
469 | u8 hdata[72]; | ||
470 | } h_u, m_u; | ||
471 | compat_u64 ring_cookie; | ||
472 | u32 location; | ||
473 | }; | ||
474 | |||
475 | struct compat_ethtool_rxnfc { | ||
476 | u32 cmd; | ||
477 | u32 flow_type; | ||
478 | compat_u64 data; | ||
479 | struct compat_ethtool_rx_flow_spec fs; | ||
480 | u32 rule_cnt; | ||
481 | u32 rule_locs[0]; | ||
482 | }; | ||
483 | |||
484 | #endif /* CONFIG_COMPAT */ | ||
485 | #endif /* __KERNEL__ */ | ||
486 | |||
452 | /** | 487 | /** |
453 | * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection | 488 | * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection |
454 | * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR | 489 | * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR |
@@ -523,6 +558,92 @@ struct ethtool_flash { | |||
523 | char data[ETHTOOL_FLASH_MAX_FILENAME]; | 558 | char data[ETHTOOL_FLASH_MAX_FILENAME]; |
524 | }; | 559 | }; |
525 | 560 | ||
561 | /* for returning and changing feature sets */ | ||
562 | |||
563 | /** | ||
564 | * struct ethtool_get_features_block - block with state of 32 features | ||
565 | * @available: mask of changeable features | ||
566 | * @requested: mask of features requested to be enabled if possible | ||
567 | * @active: mask of currently enabled features | ||
568 | * @never_changed: mask of features not changeable for any device | ||
569 | */ | ||
570 | struct ethtool_get_features_block { | ||
571 | __u32 available; | ||
572 | __u32 requested; | ||
573 | __u32 active; | ||
574 | __u32 never_changed; | ||
575 | }; | ||
576 | |||
577 | /** | ||
578 | * struct ethtool_gfeatures - command to get state of device's features | ||
579 | * @cmd: command number = %ETHTOOL_GFEATURES | ||
580 | * @size: in: number of elements in the features[] array; | ||
581 | * out: number of elements in features[] needed to hold all features | ||
582 | * @features: state of features | ||
583 | */ | ||
584 | struct ethtool_gfeatures { | ||
585 | __u32 cmd; | ||
586 | __u32 size; | ||
587 | struct ethtool_get_features_block features[0]; | ||
588 | }; | ||
589 | |||
590 | /** | ||
591 | * struct ethtool_set_features_block - block with request for 32 features | ||
592 | * @valid: mask of features to be changed | ||
593 | * @requested: values of features to be changed | ||
594 | */ | ||
595 | struct ethtool_set_features_block { | ||
596 | __u32 valid; | ||
597 | __u32 requested; | ||
598 | }; | ||
599 | |||
600 | /** | ||
601 | * struct ethtool_sfeatures - command to request change in device's features | ||
602 | * @cmd: command number = %ETHTOOL_SFEATURES | ||
603 | * @size: array size of the features[] array | ||
604 | * @features: feature change masks | ||
605 | */ | ||
606 | struct ethtool_sfeatures { | ||
607 | __u32 cmd; | ||
608 | __u32 size; | ||
609 | struct ethtool_set_features_block features[0]; | ||
610 | }; | ||
611 | |||
612 | /* | ||
613 | * %ETHTOOL_SFEATURES changes features present in features[].valid to the | ||
614 | * values of corresponding bits in features[].requested. Bits in .requested | ||
615 | * not set in .valid or not changeable are ignored. | ||
616 | * | ||
617 | * Returns %EINVAL when .valid contains undefined or never-changable bits | ||
618 | * or size is not equal to required number of features words (32-bit blocks). | ||
619 | * Returns >= 0 if request was completed; bits set in the value mean: | ||
620 | * %ETHTOOL_F_UNSUPPORTED - there were bits set in .valid that are not | ||
621 | * changeable (not present in %ETHTOOL_GFEATURES' features[].available) | ||
622 | * those bits were ignored. | ||
623 | * %ETHTOOL_F_WISH - some or all changes requested were recorded but the | ||
624 | * resulting state of bits masked by .valid is not equal to .requested. | ||
625 | * Probably there are other device-specific constraints on some features | ||
626 | * in the set. When %ETHTOOL_F_UNSUPPORTED is set, .valid is considered | ||
627 | * here as though ignored bits were cleared. | ||
628 | * %ETHTOOL_F_COMPAT - some or all changes requested were made by calling | ||
629 | * compatibility functions. Requested offload state cannot be properly | ||
630 | * managed by kernel. | ||
631 | * | ||
632 | * Meaning of bits in the masks are obtained by %ETHTOOL_GSSET_INFO (number of | ||
633 | * bits in the arrays - always multiple of 32) and %ETHTOOL_GSTRINGS commands | ||
634 | * for ETH_SS_FEATURES string set. First entry in the table corresponds to least | ||
635 | * significant bit in features[0] fields. Empty strings mark undefined features. | ||
636 | */ | ||
637 | enum ethtool_sfeatures_retval_bits { | ||
638 | ETHTOOL_F_UNSUPPORTED__BIT, | ||
639 | ETHTOOL_F_WISH__BIT, | ||
640 | ETHTOOL_F_COMPAT__BIT, | ||
641 | }; | ||
642 | |||
643 | #define ETHTOOL_F_UNSUPPORTED (1 << ETHTOOL_F_UNSUPPORTED__BIT) | ||
644 | #define ETHTOOL_F_WISH (1 << ETHTOOL_F_WISH__BIT) | ||
645 | #define ETHTOOL_F_COMPAT (1 << ETHTOOL_F_COMPAT__BIT) | ||
646 | |||
526 | #ifdef __KERNEL__ | 647 | #ifdef __KERNEL__ |
527 | 648 | ||
528 | #include <linux/rculist.h> | 649 | #include <linux/rculist.h> |
@@ -543,7 +664,6 @@ struct net_device; | |||
543 | 664 | ||
544 | /* Some generic methods drivers may use in their ethtool_ops */ | 665 | /* Some generic methods drivers may use in their ethtool_ops */ |
545 | u32 ethtool_op_get_link(struct net_device *dev); | 666 | u32 ethtool_op_get_link(struct net_device *dev); |
546 | u32 ethtool_op_get_rx_csum(struct net_device *dev); | ||
547 | u32 ethtool_op_get_tx_csum(struct net_device *dev); | 667 | u32 ethtool_op_get_tx_csum(struct net_device *dev); |
548 | int ethtool_op_set_tx_csum(struct net_device *dev, u32 data); | 668 | int ethtool_op_set_tx_csum(struct net_device *dev, u32 data); |
549 | int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data); | 669 | int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data); |
@@ -744,6 +864,9 @@ struct ethtool_ops { | |||
744 | #define ETHTOOL_GRXFHINDIR 0x00000038 /* Get RX flow hash indir'n table */ | 864 | #define ETHTOOL_GRXFHINDIR 0x00000038 /* Get RX flow hash indir'n table */ |
745 | #define ETHTOOL_SRXFHINDIR 0x00000039 /* Set RX flow hash indir'n table */ | 865 | #define ETHTOOL_SRXFHINDIR 0x00000039 /* Set RX flow hash indir'n table */ |
746 | 866 | ||
867 | #define ETHTOOL_GFEATURES 0x0000003a /* Get device offload settings */ | ||
868 | #define ETHTOOL_SFEATURES 0x0000003b /* Change device offload settings */ | ||
869 | |||
747 | /* compatibility with older code */ | 870 | /* compatibility with older code */ |
748 | #define SPARC_ETH_GSET ETHTOOL_GSET | 871 | #define SPARC_ETH_GSET ETHTOOL_GSET |
749 | #define SPARC_ETH_SSET ETHTOOL_SSET | 872 | #define SPARC_ETH_SSET ETHTOOL_SSET |
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index 28028988c862..33a42f24b275 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h | |||
@@ -8,6 +8,9 @@ struct inode; | |||
8 | struct super_block; | 8 | struct super_block; |
9 | struct vfsmount; | 9 | struct vfsmount; |
10 | 10 | ||
11 | /* limit the handle size to NFSv4 handle size now */ | ||
12 | #define MAX_HANDLE_SZ 128 | ||
13 | |||
11 | /* | 14 | /* |
12 | * The fileid_type identifies how the file within the filesystem is encoded. | 15 | * The fileid_type identifies how the file within the filesystem is encoded. |
13 | * In theory this is freely set and parsed by the filesystem, but we try to | 16 | * In theory this is freely set and parsed by the filesystem, but we try to |
@@ -121,8 +124,10 @@ struct fid { | |||
121 | * set, the encode_fh() should store sufficient information so that a good | 124 | * set, the encode_fh() should store sufficient information so that a good |
122 | * attempt can be made to find not only the file but also it's place in the | 125 | * attempt can be made to find not only the file but also it's place in the |
123 | * filesystem. This typically means storing a reference to de->d_parent in | 126 | * filesystem. This typically means storing a reference to de->d_parent in |
124 | * the filehandle fragment. encode_fh() should return the number of bytes | 127 | * the filehandle fragment. encode_fh() should return the fileid_type on |
125 | * stored or a negative error code such as %-ENOSPC | 128 | * success and on error returns 255 (if the space needed to encode fh is |
129 | * greater than @max_len*4 bytes). On error @max_len contains the minimum | ||
130 | * size(in 4 byte unit) needed to encode the file handle. | ||
126 | * | 131 | * |
127 | * fh_to_dentry: | 132 | * fh_to_dentry: |
128 | * @fh_to_dentry is given a &struct super_block (@sb) and a file handle | 133 | * @fh_to_dentry is given a &struct super_block (@sb) and a file handle |
diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index 65990ef612f5..6043c64c207a 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h | |||
@@ -884,7 +884,8 @@ extern int ext3fs_dirhash(const char *name, int len, struct | |||
884 | dx_hash_info *hinfo); | 884 | dx_hash_info *hinfo); |
885 | 885 | ||
886 | /* ialloc.c */ | 886 | /* ialloc.c */ |
887 | extern struct inode * ext3_new_inode (handle_t *, struct inode *, int); | 887 | extern struct inode * ext3_new_inode (handle_t *, struct inode *, |
888 | const struct qstr *, int); | ||
888 | extern void ext3_free_inode (handle_t *, struct inode *); | 889 | extern void ext3_free_inode (handle_t *, struct inode *); |
889 | extern struct inode * ext3_orphan_get (struct super_block *, unsigned long); | 890 | extern struct inode * ext3_orphan_get (struct super_block *, unsigned long); |
890 | extern unsigned long ext3_count_free_inodes (struct super_block *); | 891 | extern unsigned long ext3_count_free_inodes (struct super_block *); |
diff --git a/include/linux/fb.h b/include/linux/fb.h index 68ba85a00c06..b2a36391d2a1 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
@@ -152,6 +152,8 @@ | |||
152 | #define FB_ACCEL_PROSAVAGE_DDR 0x8d /* S3 ProSavage DDR */ | 152 | #define FB_ACCEL_PROSAVAGE_DDR 0x8d /* S3 ProSavage DDR */ |
153 | #define FB_ACCEL_PROSAVAGE_DDRK 0x8e /* S3 ProSavage DDR-K */ | 153 | #define FB_ACCEL_PROSAVAGE_DDRK 0x8e /* S3 ProSavage DDR-K */ |
154 | 154 | ||
155 | #define FB_ACCEL_PUV3_UNIGFX 0xa0 /* PKUnity-v3 Unigfx */ | ||
156 | |||
155 | struct fb_fix_screeninfo { | 157 | struct fb_fix_screeninfo { |
156 | char id[16]; /* identification string eg "TT Builtin" */ | 158 | char id[16]; /* identification string eg "TT Builtin" */ |
157 | unsigned long smem_start; /* Start of frame buffer mem */ | 159 | unsigned long smem_start; /* Start of frame buffer mem */ |
diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h index a562fa5fb4e3..f550f894ba15 100644 --- a/include/linux/fcntl.h +++ b/include/linux/fcntl.h | |||
@@ -46,6 +46,7 @@ | |||
46 | unlinking file. */ | 46 | unlinking file. */ |
47 | #define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ | 47 | #define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ |
48 | #define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount traversal */ | 48 | #define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount traversal */ |
49 | #define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname */ | ||
49 | 50 | ||
50 | #ifdef __KERNEL__ | 51 | #ifdef __KERNEL__ |
51 | 52 | ||
diff --git a/include/linux/file.h b/include/linux/file.h index e85baebf6279..21a79958541c 100644 --- a/include/linux/file.h +++ b/include/linux/file.h | |||
@@ -29,6 +29,8 @@ static inline void fput_light(struct file *file, int fput_needed) | |||
29 | 29 | ||
30 | extern struct file *fget(unsigned int fd); | 30 | extern struct file *fget(unsigned int fd); |
31 | extern struct file *fget_light(unsigned int fd, int *fput_needed); | 31 | extern struct file *fget_light(unsigned int fd, int *fput_needed); |
32 | extern struct file *fget_raw(unsigned int fd); | ||
33 | extern struct file *fget_raw_light(unsigned int fd, int *fput_needed); | ||
32 | extern void set_close_on_exec(unsigned int fd, int flag); | 34 | extern void set_close_on_exec(unsigned int fd, int flag); |
33 | extern void put_filp(struct file *); | 35 | extern void put_filp(struct file *); |
34 | extern int alloc_fd(unsigned start, unsigned flags); | 36 | extern int alloc_fd(unsigned start, unsigned flags); |
diff --git a/include/linux/firewire.h b/include/linux/firewire.h index 9a3f5f9383f6..c64f3680d4f1 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h | |||
@@ -42,6 +42,10 @@ | |||
42 | #define CSR_BROADCAST_CHANNEL 0x234 | 42 | #define CSR_BROADCAST_CHANNEL 0x234 |
43 | #define CSR_CONFIG_ROM 0x400 | 43 | #define CSR_CONFIG_ROM 0x400 |
44 | #define CSR_CONFIG_ROM_END 0x800 | 44 | #define CSR_CONFIG_ROM_END 0x800 |
45 | #define CSR_OMPR 0x900 | ||
46 | #define CSR_OPCR(i) (0x904 + (i) * 4) | ||
47 | #define CSR_IMPR 0x980 | ||
48 | #define CSR_IPCR(i) (0x984 + (i) * 4) | ||
45 | #define CSR_FCP_COMMAND 0xB00 | 49 | #define CSR_FCP_COMMAND 0xB00 |
46 | #define CSR_FCP_RESPONSE 0xD00 | 50 | #define CSR_FCP_RESPONSE 0xD00 |
47 | #define CSR_FCP_END 0xF00 | 51 | #define CSR_FCP_END 0xF00 |
@@ -89,7 +93,7 @@ struct fw_card { | |||
89 | int current_tlabel; | 93 | int current_tlabel; |
90 | u64 tlabel_mask; | 94 | u64 tlabel_mask; |
91 | struct list_head transaction_list; | 95 | struct list_head transaction_list; |
92 | unsigned long reset_jiffies; | 96 | u64 reset_jiffies; |
93 | 97 | ||
94 | u32 split_timeout_hi; | 98 | u32 split_timeout_hi; |
95 | u32 split_timeout_lo; | 99 | u32 split_timeout_lo; |
@@ -441,5 +445,8 @@ int fw_iso_context_start(struct fw_iso_context *ctx, | |||
441 | int cycle, int sync, int tags); | 445 | int cycle, int sync, int tags); |
442 | int fw_iso_context_stop(struct fw_iso_context *ctx); | 446 | int fw_iso_context_stop(struct fw_iso_context *ctx); |
443 | void fw_iso_context_destroy(struct fw_iso_context *ctx); | 447 | void fw_iso_context_destroy(struct fw_iso_context *ctx); |
448 | void fw_iso_resource_manage(struct fw_card *card, int generation, | ||
449 | u64 channels_mask, int *channel, int *bandwidth, | ||
450 | bool allocate, __be32 buffer[2]); | ||
444 | 451 | ||
445 | #endif /* _LINUX_FIREWIRE_H */ | 452 | #endif /* _LINUX_FIREWIRE_H */ |
diff --git a/include/linux/firmware.h b/include/linux/firmware.h index 53d1e6c4f848..21b3e7588abd 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h | |||
@@ -39,7 +39,7 @@ struct builtin_fw { | |||
39 | int request_firmware(const struct firmware **fw, const char *name, | 39 | int request_firmware(const struct firmware **fw, const char *name, |
40 | struct device *device); | 40 | struct device *device); |
41 | int request_firmware_nowait( | 41 | int request_firmware_nowait( |
42 | struct module *module, int uevent, | 42 | struct module *module, bool uevent, |
43 | const char *name, struct device *device, gfp_t gfp, void *context, | 43 | const char *name, struct device *device, gfp_t gfp, void *context, |
44 | void (*cont)(const struct firmware *fw, void *context)); | 44 | void (*cont)(const struct firmware *fw, void *context)); |
45 | 45 | ||
@@ -52,7 +52,7 @@ static inline int request_firmware(const struct firmware **fw, | |||
52 | return -EINVAL; | 52 | return -EINVAL; |
53 | } | 53 | } |
54 | static inline int request_firmware_nowait( | 54 | static inline int request_firmware_nowait( |
55 | struct module *module, int uevent, | 55 | struct module *module, bool uevent, |
56 | const char *name, struct device *device, gfp_t gfp, void *context, | 56 | const char *name, struct device *device, gfp_t gfp, void *context, |
57 | void (*cont)(const struct firmware *fw, void *context)) | 57 | void (*cont)(const struct firmware *fw, void *context)) |
58 | { | 58 | { |
diff --git a/include/linux/fs.h b/include/linux/fs.h index e38b50a4b9d2..12529e966350 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -102,6 +102,9 @@ struct inodes_stat_t { | |||
102 | /* File is huge (eg. /dev/kmem): treat loff_t as unsigned */ | 102 | /* File is huge (eg. /dev/kmem): treat loff_t as unsigned */ |
103 | #define FMODE_UNSIGNED_OFFSET ((__force fmode_t)0x2000) | 103 | #define FMODE_UNSIGNED_OFFSET ((__force fmode_t)0x2000) |
104 | 104 | ||
105 | /* File is opened with O_PATH; almost nothing can be done with it */ | ||
106 | #define FMODE_PATH ((__force fmode_t)0x4000) | ||
107 | |||
105 | /* File was opened by fanotify and shouldn't generate fanotify events */ | 108 | /* File was opened by fanotify and shouldn't generate fanotify events */ |
106 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) | 109 | #define FMODE_NONOTIFY ((__force fmode_t)0x1000000) |
107 | 110 | ||
@@ -659,9 +662,9 @@ struct address_space { | |||
659 | 662 | ||
660 | struct block_device { | 663 | struct block_device { |
661 | dev_t bd_dev; /* not a kdev_t - it's a search key */ | 664 | dev_t bd_dev; /* not a kdev_t - it's a search key */ |
665 | int bd_openers; | ||
662 | struct inode * bd_inode; /* will die */ | 666 | struct inode * bd_inode; /* will die */ |
663 | struct super_block * bd_super; | 667 | struct super_block * bd_super; |
664 | int bd_openers; | ||
665 | struct mutex bd_mutex; /* open/close mutex */ | 668 | struct mutex bd_mutex; /* open/close mutex */ |
666 | struct list_head bd_inodes; | 669 | struct list_head bd_inodes; |
667 | void * bd_claiming; | 670 | void * bd_claiming; |
@@ -798,8 +801,7 @@ struct inode { | |||
798 | #endif | 801 | #endif |
799 | 802 | ||
800 | #ifdef CONFIG_IMA | 803 | #ifdef CONFIG_IMA |
801 | /* protected by i_lock */ | 804 | atomic_t i_readcount; /* struct files open RO */ |
802 | unsigned int i_readcount; /* struct files open RO */ | ||
803 | #endif | 805 | #endif |
804 | atomic_t i_writecount; | 806 | atomic_t i_writecount; |
805 | #ifdef CONFIG_SECURITY | 807 | #ifdef CONFIG_SECURITY |
@@ -978,6 +980,13 @@ struct file { | |||
978 | #endif | 980 | #endif |
979 | }; | 981 | }; |
980 | 982 | ||
983 | struct file_handle { | ||
984 | __u32 handle_bytes; | ||
985 | int handle_type; | ||
986 | /* file identifier */ | ||
987 | unsigned char f_handle[0]; | ||
988 | }; | ||
989 | |||
981 | #define get_file(x) atomic_long_inc(&(x)->f_count) | 990 | #define get_file(x) atomic_long_inc(&(x)->f_count) |
982 | #define fput_atomic(x) atomic_long_add_unless(&(x)->f_count, -1, 1) | 991 | #define fput_atomic(x) atomic_long_add_unless(&(x)->f_count, -1, 1) |
983 | #define file_count(x) atomic_long_read(&(x)->f_count) | 992 | #define file_count(x) atomic_long_read(&(x)->f_count) |
@@ -1401,6 +1410,7 @@ struct super_block { | |||
1401 | wait_queue_head_t s_wait_unfrozen; | 1410 | wait_queue_head_t s_wait_unfrozen; |
1402 | 1411 | ||
1403 | char s_id[32]; /* Informational name */ | 1412 | char s_id[32]; /* Informational name */ |
1413 | u8 s_uuid[16]; /* UUID */ | ||
1404 | 1414 | ||
1405 | void *s_fs_info; /* Filesystem private info */ | 1415 | void *s_fs_info; /* Filesystem private info */ |
1406 | fmode_t s_mode; | 1416 | fmode_t s_mode; |
@@ -1621,6 +1631,8 @@ struct super_operations { | |||
1621 | void (*umount_begin) (struct super_block *); | 1631 | void (*umount_begin) (struct super_block *); |
1622 | 1632 | ||
1623 | int (*show_options)(struct seq_file *, struct vfsmount *); | 1633 | int (*show_options)(struct seq_file *, struct vfsmount *); |
1634 | int (*show_devname)(struct seq_file *, struct vfsmount *); | ||
1635 | int (*show_path)(struct seq_file *, struct vfsmount *); | ||
1624 | int (*show_stats)(struct seq_file *, struct vfsmount *); | 1636 | int (*show_stats)(struct seq_file *, struct vfsmount *); |
1625 | #ifdef CONFIG_QUOTA | 1637 | #ifdef CONFIG_QUOTA |
1626 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); | 1638 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); |
@@ -1784,8 +1796,6 @@ int sync_inode_metadata(struct inode *inode, int wait); | |||
1784 | struct file_system_type { | 1796 | struct file_system_type { |
1785 | const char *name; | 1797 | const char *name; |
1786 | int fs_flags; | 1798 | int fs_flags; |
1787 | int (*get_sb) (struct file_system_type *, int, | ||
1788 | const char *, void *, struct vfsmount *); | ||
1789 | struct dentry *(*mount) (struct file_system_type *, int, | 1799 | struct dentry *(*mount) (struct file_system_type *, int, |
1790 | const char *, void *); | 1800 | const char *, void *); |
1791 | void (*kill_sb) (struct super_block *); | 1801 | void (*kill_sb) (struct super_block *); |
@@ -1808,24 +1818,12 @@ extern struct dentry *mount_ns(struct file_system_type *fs_type, int flags, | |||
1808 | extern struct dentry *mount_bdev(struct file_system_type *fs_type, | 1818 | extern struct dentry *mount_bdev(struct file_system_type *fs_type, |
1809 | int flags, const char *dev_name, void *data, | 1819 | int flags, const char *dev_name, void *data, |
1810 | int (*fill_super)(struct super_block *, void *, int)); | 1820 | int (*fill_super)(struct super_block *, void *, int)); |
1811 | extern int get_sb_bdev(struct file_system_type *fs_type, | ||
1812 | int flags, const char *dev_name, void *data, | ||
1813 | int (*fill_super)(struct super_block *, void *, int), | ||
1814 | struct vfsmount *mnt); | ||
1815 | extern struct dentry *mount_single(struct file_system_type *fs_type, | 1821 | extern struct dentry *mount_single(struct file_system_type *fs_type, |
1816 | int flags, void *data, | 1822 | int flags, void *data, |
1817 | int (*fill_super)(struct super_block *, void *, int)); | 1823 | int (*fill_super)(struct super_block *, void *, int)); |
1818 | extern int get_sb_single(struct file_system_type *fs_type, | ||
1819 | int flags, void *data, | ||
1820 | int (*fill_super)(struct super_block *, void *, int), | ||
1821 | struct vfsmount *mnt); | ||
1822 | extern struct dentry *mount_nodev(struct file_system_type *fs_type, | 1824 | extern struct dentry *mount_nodev(struct file_system_type *fs_type, |
1823 | int flags, void *data, | 1825 | int flags, void *data, |
1824 | int (*fill_super)(struct super_block *, void *, int)); | 1826 | int (*fill_super)(struct super_block *, void *, int)); |
1825 | extern int get_sb_nodev(struct file_system_type *fs_type, | ||
1826 | int flags, void *data, | ||
1827 | int (*fill_super)(struct super_block *, void *, int), | ||
1828 | struct vfsmount *mnt); | ||
1829 | void generic_shutdown_super(struct super_block *sb); | 1827 | void generic_shutdown_super(struct super_block *sb); |
1830 | void kill_block_super(struct super_block *sb); | 1828 | void kill_block_super(struct super_block *sb); |
1831 | void kill_anon_super(struct super_block *sb); | 1829 | void kill_anon_super(struct super_block *sb); |
@@ -1841,7 +1839,6 @@ extern struct dentry *mount_pseudo(struct file_system_type *, char *, | |||
1841 | const struct super_operations *ops, | 1839 | const struct super_operations *ops, |
1842 | const struct dentry_operations *dops, | 1840 | const struct dentry_operations *dops, |
1843 | unsigned long); | 1841 | unsigned long); |
1844 | extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); | ||
1845 | 1842 | ||
1846 | static inline void sb_mark_dirty(struct super_block *sb) | 1843 | static inline void sb_mark_dirty(struct super_block *sb) |
1847 | { | 1844 | { |
@@ -1874,6 +1871,8 @@ extern void drop_collected_mounts(struct vfsmount *); | |||
1874 | extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *, | 1871 | extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *, |
1875 | struct vfsmount *); | 1872 | struct vfsmount *); |
1876 | extern int vfs_statfs(struct path *, struct kstatfs *); | 1873 | extern int vfs_statfs(struct path *, struct kstatfs *); |
1874 | extern int user_statfs(const char __user *, struct kstatfs *); | ||
1875 | extern int fd_statfs(int, struct kstatfs *); | ||
1877 | extern int statfs_by_dentry(struct dentry *, struct kstatfs *); | 1876 | extern int statfs_by_dentry(struct dentry *, struct kstatfs *); |
1878 | extern int freeze_super(struct super_block *super); | 1877 | extern int freeze_super(struct super_block *super); |
1879 | extern int thaw_super(struct super_block *super); | 1878 | extern int thaw_super(struct super_block *super); |
@@ -1990,6 +1989,8 @@ extern int do_fallocate(struct file *file, int mode, loff_t offset, | |||
1990 | extern long do_sys_open(int dfd, const char __user *filename, int flags, | 1989 | extern long do_sys_open(int dfd, const char __user *filename, int flags, |
1991 | int mode); | 1990 | int mode); |
1992 | extern struct file *filp_open(const char *, int, int); | 1991 | extern struct file *filp_open(const char *, int, int); |
1992 | extern struct file *file_open_root(struct dentry *, struct vfsmount *, | ||
1993 | const char *, int); | ||
1993 | extern struct file * dentry_open(struct dentry *, struct vfsmount *, int, | 1994 | extern struct file * dentry_open(struct dentry *, struct vfsmount *, int, |
1994 | const struct cred *); | 1995 | const struct cred *); |
1995 | extern int filp_close(struct file *, fl_owner_t id); | 1996 | extern int filp_close(struct file *, fl_owner_t id); |
@@ -2200,15 +2201,31 @@ static inline void allow_write_access(struct file *file) | |||
2200 | if (file) | 2201 | if (file) |
2201 | atomic_inc(&file->f_path.dentry->d_inode->i_writecount); | 2202 | atomic_inc(&file->f_path.dentry->d_inode->i_writecount); |
2202 | } | 2203 | } |
2204 | #ifdef CONFIG_IMA | ||
2205 | static inline void i_readcount_dec(struct inode *inode) | ||
2206 | { | ||
2207 | BUG_ON(!atomic_read(&inode->i_readcount)); | ||
2208 | atomic_dec(&inode->i_readcount); | ||
2209 | } | ||
2210 | static inline void i_readcount_inc(struct inode *inode) | ||
2211 | { | ||
2212 | atomic_inc(&inode->i_readcount); | ||
2213 | } | ||
2214 | #else | ||
2215 | static inline void i_readcount_dec(struct inode *inode) | ||
2216 | { | ||
2217 | return; | ||
2218 | } | ||
2219 | static inline void i_readcount_inc(struct inode *inode) | ||
2220 | { | ||
2221 | return; | ||
2222 | } | ||
2223 | #endif | ||
2203 | extern int do_pipe_flags(int *, int); | 2224 | extern int do_pipe_flags(int *, int); |
2204 | extern struct file *create_read_pipe(struct file *f, int flags); | 2225 | extern struct file *create_read_pipe(struct file *f, int flags); |
2205 | extern struct file *create_write_pipe(int flags); | 2226 | extern struct file *create_write_pipe(int flags); |
2206 | extern void free_write_pipe(struct file *); | 2227 | extern void free_write_pipe(struct file *); |
2207 | 2228 | ||
2208 | extern struct file *do_filp_open(int dfd, const char *pathname, | ||
2209 | int open_flag, int mode, int acc_mode); | ||
2210 | extern int may_open(struct path *, int, int); | ||
2211 | |||
2212 | extern int kernel_read(struct file *, loff_t, char *, unsigned long); | 2229 | extern int kernel_read(struct file *, loff_t, char *, unsigned long); |
2213 | extern struct file * open_exec(const char *); | 2230 | extern struct file * open_exec(const char *); |
2214 | 2231 | ||
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index dcd6a7c3a435..ca29e03c1fac 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -428,6 +428,7 @@ extern void unregister_ftrace_graph(void); | |||
428 | 428 | ||
429 | extern void ftrace_graph_init_task(struct task_struct *t); | 429 | extern void ftrace_graph_init_task(struct task_struct *t); |
430 | extern void ftrace_graph_exit_task(struct task_struct *t); | 430 | extern void ftrace_graph_exit_task(struct task_struct *t); |
431 | extern void ftrace_graph_init_idle_task(struct task_struct *t, int cpu); | ||
431 | 432 | ||
432 | static inline int task_curr_ret_stack(struct task_struct *t) | 433 | static inline int task_curr_ret_stack(struct task_struct *t) |
433 | { | 434 | { |
@@ -451,6 +452,7 @@ static inline void unpause_graph_tracing(void) | |||
451 | 452 | ||
452 | static inline void ftrace_graph_init_task(struct task_struct *t) { } | 453 | static inline void ftrace_graph_init_task(struct task_struct *t) { } |
453 | static inline void ftrace_graph_exit_task(struct task_struct *t) { } | 454 | static inline void ftrace_graph_exit_task(struct task_struct *t) { } |
455 | static inline void ftrace_graph_init_idle_task(struct task_struct *t, int cpu) { } | ||
454 | 456 | ||
455 | static inline int register_ftrace_graph(trace_func_graph_ret_t retfunc, | 457 | static inline int register_ftrace_graph(trace_func_graph_ret_t retfunc, |
456 | trace_func_graph_ent_t entryfunc) | 458 | trace_func_graph_ent_t entryfunc) |
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 47e3997f7b5c..22b32af1b5ec 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
@@ -37,7 +37,6 @@ struct trace_entry { | |||
37 | unsigned char flags; | 37 | unsigned char flags; |
38 | unsigned char preempt_count; | 38 | unsigned char preempt_count; |
39 | int pid; | 39 | int pid; |
40 | int lock_depth; | ||
41 | }; | 40 | }; |
42 | 41 | ||
43 | #define FTRACE_MAX_EVENT \ | 42 | #define FTRACE_MAX_EVENT \ |
@@ -208,7 +207,6 @@ struct ftrace_event_call { | |||
208 | 207 | ||
209 | #define PERF_MAX_TRACE_SIZE 2048 | 208 | #define PERF_MAX_TRACE_SIZE 2048 |
210 | 209 | ||
211 | #define MAX_FILTER_PRED 32 | ||
212 | #define MAX_FILTER_STR_VAL 256 /* Should handle KSYM_SYMBOL_LEN */ | 210 | #define MAX_FILTER_STR_VAL 256 /* Should handle KSYM_SYMBOL_LEN */ |
213 | 211 | ||
214 | extern void destroy_preds(struct ftrace_event_call *call); | 212 | extern void destroy_preds(struct ftrace_event_call *call); |
diff --git a/include/linux/gfp.h b/include/linux/gfp.h index dca31761b311..bfb8f934521e 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h | |||
@@ -35,6 +35,7 @@ struct vm_area_struct; | |||
35 | #define ___GFP_NOTRACK 0 | 35 | #define ___GFP_NOTRACK 0 |
36 | #endif | 36 | #endif |
37 | #define ___GFP_NO_KSWAPD 0x400000u | 37 | #define ___GFP_NO_KSWAPD 0x400000u |
38 | #define ___GFP_OTHER_NODE 0x800000u | ||
38 | 39 | ||
39 | /* | 40 | /* |
40 | * GFP bitmasks.. | 41 | * GFP bitmasks.. |
@@ -83,6 +84,7 @@ struct vm_area_struct; | |||
83 | #define __GFP_NOTRACK ((__force gfp_t)___GFP_NOTRACK) /* Don't track with kmemcheck */ | 84 | #define __GFP_NOTRACK ((__force gfp_t)___GFP_NOTRACK) /* Don't track with kmemcheck */ |
84 | 85 | ||
85 | #define __GFP_NO_KSWAPD ((__force gfp_t)___GFP_NO_KSWAPD) | 86 | #define __GFP_NO_KSWAPD ((__force gfp_t)___GFP_NO_KSWAPD) |
87 | #define __GFP_OTHER_NODE ((__force gfp_t)___GFP_OTHER_NODE) /* On behalf of other node */ | ||
86 | 88 | ||
87 | /* | 89 | /* |
88 | * This may seem redundant, but it's a way of annotating false positives vs. | 90 | * This may seem redundant, but it's a way of annotating false positives vs. |
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index 32f9fd6619b4..ba362171e8ae 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h | |||
@@ -93,13 +93,6 @@ | |||
93 | */ | 93 | */ |
94 | #define in_nmi() (preempt_count() & NMI_MASK) | 94 | #define in_nmi() (preempt_count() & NMI_MASK) |
95 | 95 | ||
96 | #if defined(CONFIG_PREEMPT) && defined(CONFIG_BKL) | ||
97 | # include <linux/sched.h> | ||
98 | # define PREEMPT_INATOMIC_BASE (current->lock_depth >= 0) | ||
99 | #else | ||
100 | # define PREEMPT_INATOMIC_BASE 0 | ||
101 | #endif | ||
102 | |||
103 | #if defined(CONFIG_PREEMPT) | 96 | #if defined(CONFIG_PREEMPT) |
104 | # define PREEMPT_CHECK_OFFSET 1 | 97 | # define PREEMPT_CHECK_OFFSET 1 |
105 | #else | 98 | #else |
@@ -113,7 +106,7 @@ | |||
113 | * used in the general case to determine whether sleeping is possible. | 106 | * used in the general case to determine whether sleeping is possible. |
114 | * Do not use in_atomic() in driver code. | 107 | * Do not use in_atomic() in driver code. |
115 | */ | 108 | */ |
116 | #define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != PREEMPT_INATOMIC_BASE) | 109 | #define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0) |
117 | 110 | ||
118 | /* | 111 | /* |
119 | * Check whether we were atomic before we did preempt_disable(): | 112 | * Check whether we were atomic before we did preempt_disable(): |
diff --git a/include/linux/hid-roccat.h b/include/linux/hid-roccat.h new file mode 100644 index 000000000000..24e1ca01f9a0 --- /dev/null +++ b/include/linux/hid-roccat.h | |||
@@ -0,0 +1,29 @@ | |||
1 | #ifndef __HID_ROCCAT_H | ||
2 | #define __HID_ROCCAT_H | ||
3 | |||
4 | /* | ||
5 | * Copyright (c) 2010 Stefan Achatz <erazor_de@users.sourceforge.net> | ||
6 | */ | ||
7 | |||
8 | /* | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the Free | ||
11 | * Software Foundation; either version 2 of the License, or (at your option) | ||
12 | * any later version. | ||
13 | */ | ||
14 | |||
15 | #include <linux/hid.h> | ||
16 | #include <linux/types.h> | ||
17 | |||
18 | #define ROCCATIOCGREPSIZE _IOR('H', 0xf1, int) | ||
19 | |||
20 | #ifdef __KERNEL__ | ||
21 | |||
22 | int roccat_connect(struct class *klass, struct hid_device *hid, | ||
23 | int report_size); | ||
24 | void roccat_disconnect(int minor); | ||
25 | int roccat_report_event(int minor, u8 const *data); | ||
26 | |||
27 | #endif | ||
28 | |||
29 | #endif | ||
diff --git a/include/linux/hid.h b/include/linux/hid.h index d91c25e253c8..bb29bb1dbd2f 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -504,6 +504,9 @@ struct hid_device { /* device report descriptor */ | |||
504 | struct hid_usage *, __s32); | 504 | struct hid_usage *, __s32); |
505 | void (*hiddev_report_event) (struct hid_device *, struct hid_report *); | 505 | void (*hiddev_report_event) (struct hid_device *, struct hid_report *); |
506 | 506 | ||
507 | /* handler for raw input (Get_Report) data, used by hidraw */ | ||
508 | int (*hid_get_raw_report) (struct hid_device *, unsigned char, __u8 *, size_t, unsigned char); | ||
509 | |||
507 | /* handler for raw output data, used by hidraw */ | 510 | /* handler for raw output data, used by hidraw */ |
508 | int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t, unsigned char); | 511 | int (*hid_output_raw_report) (struct hid_device *, __u8 *, size_t, unsigned char); |
509 | 512 | ||
@@ -638,7 +641,7 @@ struct hid_driver { | |||
638 | struct hid_input *hidinput, struct hid_field *field, | 641 | struct hid_input *hidinput, struct hid_field *field, |
639 | struct hid_usage *usage, unsigned long **bit, int *max); | 642 | struct hid_usage *usage, unsigned long **bit, int *max); |
640 | void (*feature_mapping)(struct hid_device *hdev, | 643 | void (*feature_mapping)(struct hid_device *hdev, |
641 | struct hid_input *hidinput, struct hid_field *field, | 644 | struct hid_field *field, |
642 | struct hid_usage *usage); | 645 | struct hid_usage *usage); |
643 | #ifdef CONFIG_PM | 646 | #ifdef CONFIG_PM |
644 | int (*suspend)(struct hid_device *hdev, pm_message_t message); | 647 | int (*suspend)(struct hid_device *hdev, pm_message_t message); |
diff --git a/include/linux/hidraw.h b/include/linux/hidraw.h index dd8d69269176..4b88e697c4e9 100644 --- a/include/linux/hidraw.h +++ b/include/linux/hidraw.h | |||
@@ -35,6 +35,9 @@ struct hidraw_devinfo { | |||
35 | #define HIDIOCGRAWINFO _IOR('H', 0x03, struct hidraw_devinfo) | 35 | #define HIDIOCGRAWINFO _IOR('H', 0x03, struct hidraw_devinfo) |
36 | #define HIDIOCGRAWNAME(len) _IOC(_IOC_READ, 'H', 0x04, len) | 36 | #define HIDIOCGRAWNAME(len) _IOC(_IOC_READ, 'H', 0x04, len) |
37 | #define HIDIOCGRAWPHYS(len) _IOC(_IOC_READ, 'H', 0x05, len) | 37 | #define HIDIOCGRAWPHYS(len) _IOC(_IOC_READ, 'H', 0x05, len) |
38 | /* The first byte of SFEATURE and GFEATURE is the report number */ | ||
39 | #define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) | ||
40 | #define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) | ||
38 | 41 | ||
39 | #define HIDRAW_FIRST_MINOR 0 | 42 | #define HIDRAW_FIRST_MINOR 0 |
40 | #define HIDRAW_MAX_DEVICES 64 | 43 | #define HIDRAW_MAX_DEVICES 64 |
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index f376ddc64c4d..62f500c724f9 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
@@ -54,11 +54,13 @@ enum hrtimer_restart { | |||
54 | * 0x00 inactive | 54 | * 0x00 inactive |
55 | * 0x01 enqueued into rbtree | 55 | * 0x01 enqueued into rbtree |
56 | * 0x02 callback function running | 56 | * 0x02 callback function running |
57 | * 0x04 timer is migrated to another cpu | ||
57 | * | 58 | * |
58 | * Special cases: | 59 | * Special cases: |
59 | * 0x03 callback function running and enqueued | 60 | * 0x03 callback function running and enqueued |
60 | * (was requeued on another CPU) | 61 | * (was requeued on another CPU) |
61 | * 0x09 timer was migrated on CPU hotunplug | 62 | * 0x05 timer was migrated on CPU hotunplug |
63 | * | ||
62 | * The "callback function running and enqueued" status is only possible on | 64 | * The "callback function running and enqueued" status is only possible on |
63 | * SMP. It happens for example when a posix timer expired and the callback | 65 | * SMP. It happens for example when a posix timer expired and the callback |
64 | * queued a signal. Between dropping the lock which protects the posix timer | 66 | * queued a signal. Between dropping the lock which protects the posix timer |
@@ -67,8 +69,11 @@ enum hrtimer_restart { | |||
67 | * as otherwise the timer could be removed before the softirq code finishes the | 69 | * as otherwise the timer could be removed before the softirq code finishes the |
68 | * the handling of the timer. | 70 | * the handling of the timer. |
69 | * | 71 | * |
70 | * The HRTIMER_STATE_ENQUEUED bit is always or'ed to the current state to | 72 | * The HRTIMER_STATE_ENQUEUED bit is always or'ed to the current state |
71 | * preserve the HRTIMER_STATE_CALLBACK bit in the above scenario. | 73 | * to preserve the HRTIMER_STATE_CALLBACK in the above scenario. This |
74 | * also affects HRTIMER_STATE_MIGRATE where the preservation is not | ||
75 | * necessary. HRTIMER_STATE_MIGRATE is cleared after the timer is | ||
76 | * enqueued on the new cpu. | ||
72 | * | 77 | * |
73 | * All state transitions are protected by cpu_base->lock. | 78 | * All state transitions are protected by cpu_base->lock. |
74 | */ | 79 | */ |
@@ -148,7 +153,12 @@ struct hrtimer_clock_base { | |||
148 | #endif | 153 | #endif |
149 | }; | 154 | }; |
150 | 155 | ||
151 | #define HRTIMER_MAX_CLOCK_BASES 2 | 156 | enum hrtimer_base_type { |
157 | HRTIMER_BASE_REALTIME, | ||
158 | HRTIMER_BASE_MONOTONIC, | ||
159 | HRTIMER_BASE_BOOTTIME, | ||
160 | HRTIMER_MAX_CLOCK_BASES, | ||
161 | }; | ||
152 | 162 | ||
153 | /* | 163 | /* |
154 | * struct hrtimer_cpu_base - the per cpu clock bases | 164 | * struct hrtimer_cpu_base - the per cpu clock bases |
@@ -308,6 +318,7 @@ static inline int hrtimer_is_hres_active(struct hrtimer *timer) | |||
308 | 318 | ||
309 | extern ktime_t ktime_get(void); | 319 | extern ktime_t ktime_get(void); |
310 | extern ktime_t ktime_get_real(void); | 320 | extern ktime_t ktime_get_real(void); |
321 | extern ktime_t ktime_get_boottime(void); | ||
311 | 322 | ||
312 | 323 | ||
313 | DECLARE_PER_CPU(struct tick_device, tick_cpu_device); | 324 | DECLARE_PER_CPU(struct tick_device, tick_cpu_device); |
@@ -370,8 +381,9 @@ extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp); | |||
370 | extern ktime_t hrtimer_get_next_event(void); | 381 | extern ktime_t hrtimer_get_next_event(void); |
371 | 382 | ||
372 | /* | 383 | /* |
373 | * A timer is active, when it is enqueued into the rbtree or the callback | 384 | * A timer is active, when it is enqueued into the rbtree or the |
374 | * function is running. | 385 | * callback function is running or it's in the state of being migrated |
386 | * to another cpu. | ||
375 | */ | 387 | */ |
376 | static inline int hrtimer_active(const struct hrtimer *timer) | 388 | static inline int hrtimer_active(const struct hrtimer *timer) |
377 | { | 389 | { |
diff --git a/include/linux/hwspinlock.h b/include/linux/hwspinlock.h new file mode 100644 index 000000000000..8390efc457eb --- /dev/null +++ b/include/linux/hwspinlock.h | |||
@@ -0,0 +1,292 @@ | |||
1 | /* | ||
2 | * Hardware spinlock public header | ||
3 | * | ||
4 | * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com | ||
5 | * | ||
6 | * Contact: Ohad Ben-Cohen <ohad@wizery.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License version 2 as published | ||
10 | * by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __LINUX_HWSPINLOCK_H | ||
19 | #define __LINUX_HWSPINLOCK_H | ||
20 | |||
21 | #include <linux/err.h> | ||
22 | #include <linux/sched.h> | ||
23 | |||
24 | /* hwspinlock mode argument */ | ||
25 | #define HWLOCK_IRQSTATE 0x01 /* Disable interrupts, save state */ | ||
26 | #define HWLOCK_IRQ 0x02 /* Disable interrupts, don't save state */ | ||
27 | |||
28 | struct hwspinlock; | ||
29 | |||
30 | #if defined(CONFIG_HWSPINLOCK) || defined(CONFIG_HWSPINLOCK_MODULE) | ||
31 | |||
32 | int hwspin_lock_register(struct hwspinlock *lock); | ||
33 | struct hwspinlock *hwspin_lock_unregister(unsigned int id); | ||
34 | struct hwspinlock *hwspin_lock_request(void); | ||
35 | struct hwspinlock *hwspin_lock_request_specific(unsigned int id); | ||
36 | int hwspin_lock_free(struct hwspinlock *hwlock); | ||
37 | int hwspin_lock_get_id(struct hwspinlock *hwlock); | ||
38 | int __hwspin_lock_timeout(struct hwspinlock *, unsigned int, int, | ||
39 | unsigned long *); | ||
40 | int __hwspin_trylock(struct hwspinlock *, int, unsigned long *); | ||
41 | void __hwspin_unlock(struct hwspinlock *, int, unsigned long *); | ||
42 | |||
43 | #else /* !CONFIG_HWSPINLOCK */ | ||
44 | |||
45 | /* | ||
46 | * We don't want these functions to fail if CONFIG_HWSPINLOCK is not | ||
47 | * enabled. We prefer to silently succeed in this case, and let the | ||
48 | * code path get compiled away. This way, if CONFIG_HWSPINLOCK is not | ||
49 | * required on a given setup, users will still work. | ||
50 | * | ||
51 | * The only exception is hwspin_lock_register/hwspin_lock_unregister, with which | ||
52 | * we _do_ want users to fail (no point in registering hwspinlock instances if | ||
53 | * the framework is not available). | ||
54 | * | ||
55 | * Note: ERR_PTR(-ENODEV) will still be considered a success for NULL-checking | ||
56 | * users. Others, which care, can still check this with IS_ERR. | ||
57 | */ | ||
58 | static inline struct hwspinlock *hwspin_lock_request(void) | ||
59 | { | ||
60 | return ERR_PTR(-ENODEV); | ||
61 | } | ||
62 | |||
63 | static inline struct hwspinlock *hwspin_lock_request_specific(unsigned int id) | ||
64 | { | ||
65 | return ERR_PTR(-ENODEV); | ||
66 | } | ||
67 | |||
68 | static inline int hwspin_lock_free(struct hwspinlock *hwlock) | ||
69 | { | ||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | static inline | ||
74 | int __hwspin_lock_timeout(struct hwspinlock *hwlock, unsigned int to, | ||
75 | int mode, unsigned long *flags) | ||
76 | { | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | static inline | ||
81 | int __hwspin_trylock(struct hwspinlock *hwlock, int mode, unsigned long *flags) | ||
82 | { | ||
83 | return 0; | ||
84 | } | ||
85 | |||
86 | static inline | ||
87 | void __hwspin_unlock(struct hwspinlock *hwlock, int mode, unsigned long *flags) | ||
88 | { | ||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | static inline int hwspin_lock_get_id(struct hwspinlock *hwlock) | ||
93 | { | ||
94 | return 0; | ||
95 | } | ||
96 | |||
97 | static inline int hwspin_lock_register(struct hwspinlock *hwlock) | ||
98 | { | ||
99 | return -ENODEV; | ||
100 | } | ||
101 | |||
102 | static inline struct hwspinlock *hwspin_lock_unregister(unsigned int id) | ||
103 | { | ||
104 | return NULL; | ||
105 | } | ||
106 | |||
107 | #endif /* !CONFIG_HWSPINLOCK */ | ||
108 | |||
109 | /** | ||
110 | * hwspin_trylock_irqsave() - try to lock an hwspinlock, disable interrupts | ||
111 | * @hwlock: an hwspinlock which we want to trylock | ||
112 | * @flags: a pointer to where the caller's interrupt state will be saved at | ||
113 | * | ||
114 | * This function attempts to lock the underlying hwspinlock, and will | ||
115 | * immediately fail if the hwspinlock is already locked. | ||
116 | * | ||
117 | * Upon a successful return from this function, preemption and local | ||
118 | * interrupts are disabled (previous interrupts state is saved at @flags), | ||
119 | * so the caller must not sleep, and is advised to release the hwspinlock | ||
120 | * as soon as possible. | ||
121 | * | ||
122 | * Returns 0 if we successfully locked the hwspinlock, -EBUSY if | ||
123 | * the hwspinlock was already taken, and -EINVAL if @hwlock is invalid. | ||
124 | */ | ||
125 | static inline | ||
126 | int hwspin_trylock_irqsave(struct hwspinlock *hwlock, unsigned long *flags) | ||
127 | { | ||
128 | return __hwspin_trylock(hwlock, HWLOCK_IRQSTATE, flags); | ||
129 | } | ||
130 | |||
131 | /** | ||
132 | * hwspin_trylock_irq() - try to lock an hwspinlock, disable interrupts | ||
133 | * @hwlock: an hwspinlock which we want to trylock | ||
134 | * | ||
135 | * This function attempts to lock the underlying hwspinlock, and will | ||
136 | * immediately fail if the hwspinlock is already locked. | ||
137 | * | ||
138 | * Upon a successful return from this function, preemption and local | ||
139 | * interrupts are disabled, so the caller must not sleep, and is advised | ||
140 | * to release the hwspinlock as soon as possible. | ||
141 | * | ||
142 | * Returns 0 if we successfully locked the hwspinlock, -EBUSY if | ||
143 | * the hwspinlock was already taken, and -EINVAL if @hwlock is invalid. | ||
144 | */ | ||
145 | static inline int hwspin_trylock_irq(struct hwspinlock *hwlock) | ||
146 | { | ||
147 | return __hwspin_trylock(hwlock, HWLOCK_IRQ, NULL); | ||
148 | } | ||
149 | |||
150 | /** | ||
151 | * hwspin_trylock() - attempt to lock a specific hwspinlock | ||
152 | * @hwlock: an hwspinlock which we want to trylock | ||
153 | * | ||
154 | * This function attempts to lock an hwspinlock, and will immediately fail | ||
155 | * if the hwspinlock is already taken. | ||
156 | * | ||
157 | * Upon a successful return from this function, preemption is disabled, | ||
158 | * so the caller must not sleep, and is advised to release the hwspinlock | ||
159 | * as soon as possible. This is required in order to minimize remote cores | ||
160 | * polling on the hardware interconnect. | ||
161 | * | ||
162 | * Returns 0 if we successfully locked the hwspinlock, -EBUSY if | ||
163 | * the hwspinlock was already taken, and -EINVAL if @hwlock is invalid. | ||
164 | */ | ||
165 | static inline int hwspin_trylock(struct hwspinlock *hwlock) | ||
166 | { | ||
167 | return __hwspin_trylock(hwlock, 0, NULL); | ||
168 | } | ||
169 | |||
170 | /** | ||
171 | * hwspin_lock_timeout_irqsave() - lock hwspinlock, with timeout, disable irqs | ||
172 | * @hwlock: the hwspinlock to be locked | ||
173 | * @to: timeout value in msecs | ||
174 | * @flags: a pointer to where the caller's interrupt state will be saved at | ||
175 | * | ||
176 | * This function locks the underlying @hwlock. If the @hwlock | ||
177 | * is already taken, the function will busy loop waiting for it to | ||
178 | * be released, but give up when @timeout msecs have elapsed. | ||
179 | * | ||
180 | * Upon a successful return from this function, preemption and local interrupts | ||
181 | * are disabled (plus previous interrupt state is saved), so the caller must | ||
182 | * not sleep, and is advised to release the hwspinlock as soon as possible. | ||
183 | * | ||
184 | * Returns 0 when the @hwlock was successfully taken, and an appropriate | ||
185 | * error code otherwise (most notably an -ETIMEDOUT if the @hwlock is still | ||
186 | * busy after @timeout msecs). The function will never sleep. | ||
187 | */ | ||
188 | static inline int hwspin_lock_timeout_irqsave(struct hwspinlock *hwlock, | ||
189 | unsigned int to, unsigned long *flags) | ||
190 | { | ||
191 | return __hwspin_lock_timeout(hwlock, to, HWLOCK_IRQSTATE, flags); | ||
192 | } | ||
193 | |||
194 | /** | ||
195 | * hwspin_lock_timeout_irq() - lock hwspinlock, with timeout, disable irqs | ||
196 | * @hwlock: the hwspinlock to be locked | ||
197 | * @to: timeout value in msecs | ||
198 | * | ||
199 | * This function locks the underlying @hwlock. If the @hwlock | ||
200 | * is already taken, the function will busy loop waiting for it to | ||
201 | * be released, but give up when @timeout msecs have elapsed. | ||
202 | * | ||
203 | * Upon a successful return from this function, preemption and local interrupts | ||
204 | * are disabled so the caller must not sleep, and is advised to release the | ||
205 | * hwspinlock as soon as possible. | ||
206 | * | ||
207 | * Returns 0 when the @hwlock was successfully taken, and an appropriate | ||
208 | * error code otherwise (most notably an -ETIMEDOUT if the @hwlock is still | ||
209 | * busy after @timeout msecs). The function will never sleep. | ||
210 | */ | ||
211 | static inline | ||
212 | int hwspin_lock_timeout_irq(struct hwspinlock *hwlock, unsigned int to) | ||
213 | { | ||
214 | return __hwspin_lock_timeout(hwlock, to, HWLOCK_IRQ, NULL); | ||
215 | } | ||
216 | |||
217 | /** | ||
218 | * hwspin_lock_timeout() - lock an hwspinlock with timeout limit | ||
219 | * @hwlock: the hwspinlock to be locked | ||
220 | * @to: timeout value in msecs | ||
221 | * | ||
222 | * This function locks the underlying @hwlock. If the @hwlock | ||
223 | * is already taken, the function will busy loop waiting for it to | ||
224 | * be released, but give up when @timeout msecs have elapsed. | ||
225 | * | ||
226 | * Upon a successful return from this function, preemption is disabled | ||
227 | * so the caller must not sleep, and is advised to release the hwspinlock | ||
228 | * as soon as possible. | ||
229 | * This is required in order to minimize remote cores polling on the | ||
230 | * hardware interconnect. | ||
231 | * | ||
232 | * Returns 0 when the @hwlock was successfully taken, and an appropriate | ||
233 | * error code otherwise (most notably an -ETIMEDOUT if the @hwlock is still | ||
234 | * busy after @timeout msecs). The function will never sleep. | ||
235 | */ | ||
236 | static inline | ||
237 | int hwspin_lock_timeout(struct hwspinlock *hwlock, unsigned int to) | ||
238 | { | ||
239 | return __hwspin_lock_timeout(hwlock, to, 0, NULL); | ||
240 | } | ||
241 | |||
242 | /** | ||
243 | * hwspin_unlock_irqrestore() - unlock hwspinlock, restore irq state | ||
244 | * @hwlock: a previously-acquired hwspinlock which we want to unlock | ||
245 | * @flags: previous caller's interrupt state to restore | ||
246 | * | ||
247 | * This function will unlock a specific hwspinlock, enable preemption and | ||
248 | * restore the previous state of the local interrupts. It should be used | ||
249 | * to undo, e.g., hwspin_trylock_irqsave(). | ||
250 | * | ||
251 | * @hwlock must be already locked before calling this function: it is a bug | ||
252 | * to call unlock on a @hwlock that is already unlocked. | ||
253 | */ | ||
254 | static inline void hwspin_unlock_irqrestore(struct hwspinlock *hwlock, | ||
255 | unsigned long *flags) | ||
256 | { | ||
257 | __hwspin_unlock(hwlock, HWLOCK_IRQSTATE, flags); | ||
258 | } | ||
259 | |||
260 | /** | ||
261 | * hwspin_unlock_irq() - unlock hwspinlock, enable interrupts | ||
262 | * @hwlock: a previously-acquired hwspinlock which we want to unlock | ||
263 | * | ||
264 | * This function will unlock a specific hwspinlock, enable preemption and | ||
265 | * enable local interrupts. Should be used to undo hwspin_lock_irq(). | ||
266 | * | ||
267 | * @hwlock must be already locked (e.g. by hwspin_trylock_irq()) before | ||
268 | * calling this function: it is a bug to call unlock on a @hwlock that is | ||
269 | * already unlocked. | ||
270 | */ | ||
271 | static inline void hwspin_unlock_irq(struct hwspinlock *hwlock) | ||
272 | { | ||
273 | __hwspin_unlock(hwlock, HWLOCK_IRQ, NULL); | ||
274 | } | ||
275 | |||
276 | /** | ||
277 | * hwspin_unlock() - unlock hwspinlock | ||
278 | * @hwlock: a previously-acquired hwspinlock which we want to unlock | ||
279 | * | ||
280 | * This function will unlock a specific hwspinlock and enable preemption | ||
281 | * back. | ||
282 | * | ||
283 | * @hwlock must be already locked (e.g. by hwspin_trylock()) before calling | ||
284 | * this function: it is a bug to call unlock on a @hwlock that is already | ||
285 | * unlocked. | ||
286 | */ | ||
287 | static inline void hwspin_unlock(struct hwspinlock *hwlock) | ||
288 | { | ||
289 | __hwspin_unlock(hwlock, 0, NULL); | ||
290 | } | ||
291 | |||
292 | #endif /* __LINUX_HWSPINLOCK_H */ | ||
diff --git a/include/linux/i2c-id.h b/include/linux/i2c-id.h deleted file mode 100644 index 4bef5c557160..000000000000 --- a/include/linux/i2c-id.h +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* ------------------------------------------------------------------------- */ | ||
2 | /* */ | ||
3 | /* i2c-id.h - identifier values for i2c drivers and adapters */ | ||
4 | /* */ | ||
5 | /* ------------------------------------------------------------------------- */ | ||
6 | /* Copyright (C) 1995-1999 Simon G. Vogl | ||
7 | |||
8 | This program is free software; you can redistribute it and/or modify | ||
9 | it under the terms of the GNU General Public License as published by | ||
10 | the Free Software Foundation; either version 2 of the License, or | ||
11 | (at your option) any later version. | ||
12 | |||
13 | This program is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | GNU General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU General Public License | ||
19 | along with this program; if not, write to the Free Software | ||
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | ||
21 | /* ------------------------------------------------------------------------- */ | ||
22 | |||
23 | #ifndef LINUX_I2C_ID_H | ||
24 | #define LINUX_I2C_ID_H | ||
25 | |||
26 | /* Please note that I2C driver IDs are optional. They are only needed if a | ||
27 | legacy chip driver needs to identify a bus or a bus driver needs to | ||
28 | identify a legacy client. If you don't need them, just don't set them. */ | ||
29 | |||
30 | /* | ||
31 | * ---- Adapter types ---------------------------------------------------- | ||
32 | */ | ||
33 | |||
34 | /* --- Bit algorithm adapters */ | ||
35 | #define I2C_HW_B_CX2388x 0x01001b /* connexant 2388x based tv cards */ | ||
36 | |||
37 | #endif /* LINUX_I2C_ID_H */ | ||
diff --git a/include/linux/i2c-tegra.h b/include/linux/i2c-tegra.h new file mode 100644 index 000000000000..9c85da49857a --- /dev/null +++ b/include/linux/i2c-tegra.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * drivers/i2c/busses/i2c-tegra.c | ||
3 | * | ||
4 | * Copyright (C) 2010 Google, Inc. | ||
5 | * Author: Colin Cross <ccross@android.com> | ||
6 | * | ||
7 | * This software is licensed under the terms of the GNU General Public | ||
8 | * License version 2, as published by the Free Software Foundation, and | ||
9 | * may be copied, distributed, and modified under those terms. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #ifndef _LINUX_I2C_TEGRA_H | ||
19 | #define _LINUX_I2C_TEGRA_H | ||
20 | |||
21 | struct tegra_i2c_platform_data { | ||
22 | unsigned long bus_clk_rate; | ||
23 | }; | ||
24 | |||
25 | #endif /* _LINUX_I2C_TEGRA_H */ | ||
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 903576df88dc..f1e3ff5880a9 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/types.h> | 29 | #include <linux/types.h> |
30 | #ifdef __KERNEL__ | 30 | #ifdef __KERNEL__ |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/i2c-id.h> | ||
33 | #include <linux/mod_devicetable.h> | 32 | #include <linux/mod_devicetable.h> |
34 | #include <linux/device.h> /* for struct device */ | 33 | #include <linux/device.h> /* for struct device */ |
35 | #include <linux/sched.h> /* for completion */ | 34 | #include <linux/sched.h> /* for completion */ |
@@ -105,8 +104,8 @@ extern s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client, | |||
105 | /** | 104 | /** |
106 | * struct i2c_driver - represent an I2C device driver | 105 | * struct i2c_driver - represent an I2C device driver |
107 | * @class: What kind of i2c device we instantiate (for detect) | 106 | * @class: What kind of i2c device we instantiate (for detect) |
108 | * @attach_adapter: Callback for bus addition (for legacy drivers) | 107 | * @attach_adapter: Callback for bus addition (deprecated) |
109 | * @detach_adapter: Callback for bus removal (for legacy drivers) | 108 | * @detach_adapter: Callback for bus removal (deprecated) |
110 | * @probe: Callback for device binding | 109 | * @probe: Callback for device binding |
111 | * @remove: Callback for device unbinding | 110 | * @remove: Callback for device unbinding |
112 | * @shutdown: Callback for device shutdown | 111 | * @shutdown: Callback for device shutdown |
@@ -144,11 +143,11 @@ struct i2c_driver { | |||
144 | unsigned int class; | 143 | unsigned int class; |
145 | 144 | ||
146 | /* Notifies the driver that a new bus has appeared or is about to be | 145 | /* Notifies the driver that a new bus has appeared or is about to be |
147 | * removed. You should avoid using this if you can, it will probably | 146 | * removed. You should avoid using this, it will be removed in a |
148 | * be removed in a near future. | 147 | * near future. |
149 | */ | 148 | */ |
150 | int (*attach_adapter)(struct i2c_adapter *); | 149 | int (*attach_adapter)(struct i2c_adapter *) __deprecated; |
151 | int (*detach_adapter)(struct i2c_adapter *); | 150 | int (*detach_adapter)(struct i2c_adapter *) __deprecated; |
152 | 151 | ||
153 | /* Standard driver model interfaces */ | 152 | /* Standard driver model interfaces */ |
154 | int (*probe)(struct i2c_client *, const struct i2c_device_id *); | 153 | int (*probe)(struct i2c_client *, const struct i2c_device_id *); |
@@ -258,9 +257,7 @@ struct i2c_board_info { | |||
258 | unsigned short addr; | 257 | unsigned short addr; |
259 | void *platform_data; | 258 | void *platform_data; |
260 | struct dev_archdata *archdata; | 259 | struct dev_archdata *archdata; |
261 | #ifdef CONFIG_OF | ||
262 | struct device_node *of_node; | 260 | struct device_node *of_node; |
263 | #endif | ||
264 | int irq; | 261 | int irq; |
265 | }; | 262 | }; |
266 | 263 | ||
@@ -356,7 +353,6 @@ struct i2c_algorithm { | |||
356 | */ | 353 | */ |
357 | struct i2c_adapter { | 354 | struct i2c_adapter { |
358 | struct module *owner; | 355 | struct module *owner; |
359 | unsigned int id __deprecated; | ||
360 | unsigned int class; /* classes to allow probing for */ | 356 | unsigned int class; /* classes to allow probing for */ |
361 | const struct i2c_algorithm *algo; /* the algorithm to access the bus */ | 357 | const struct i2c_algorithm *algo; /* the algorithm to access the bus */ |
362 | void *algo_data; | 358 | void *algo_data; |
@@ -398,6 +394,8 @@ i2c_parent_is_i2c_adapter(const struct i2c_adapter *adapter) | |||
398 | return NULL; | 394 | return NULL; |
399 | } | 395 | } |
400 | 396 | ||
397 | int i2c_for_each_dev(void *data, int (*fn)(struct device *, void *)); | ||
398 | |||
401 | /* Adapter locking functions, exported for shared pin cases */ | 399 | /* Adapter locking functions, exported for shared pin cases */ |
402 | void i2c_lock_adapter(struct i2c_adapter *); | 400 | void i2c_lock_adapter(struct i2c_adapter *); |
403 | void i2c_unlock_adapter(struct i2c_adapter *); | 401 | void i2c_unlock_adapter(struct i2c_adapter *); |
@@ -449,7 +447,7 @@ extern void i2c_release_client(struct i2c_client *client); | |||
449 | extern void i2c_clients_command(struct i2c_adapter *adap, | 447 | extern void i2c_clients_command(struct i2c_adapter *adap, |
450 | unsigned int cmd, void *arg); | 448 | unsigned int cmd, void *arg); |
451 | 449 | ||
452 | extern struct i2c_adapter *i2c_get_adapter(int id); | 450 | extern struct i2c_adapter *i2c_get_adapter(int nr); |
453 | extern void i2c_put_adapter(struct i2c_adapter *adap); | 451 | extern void i2c_put_adapter(struct i2c_adapter *adap); |
454 | 452 | ||
455 | 453 | ||
diff --git a/include/linux/i2c/ads1015.h b/include/linux/i2c/ads1015.h new file mode 100644 index 000000000000..d5aa2a045669 --- /dev/null +++ b/include/linux/i2c/ads1015.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* | ||
2 | * Platform Data for ADS1015 12-bit 4-input ADC | ||
3 | * (C) Copyright 2010 | ||
4 | * Dirk Eibach, Guntermann & Drunck GmbH <eibach@gdsys.de> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef LINUX_ADS1015_H | ||
22 | #define LINUX_ADS1015_H | ||
23 | |||
24 | #define ADS1015_CHANNELS 8 | ||
25 | |||
26 | struct ads1015_channel_data { | ||
27 | bool enabled; | ||
28 | unsigned int pga; | ||
29 | unsigned int data_rate; | ||
30 | }; | ||
31 | |||
32 | struct ads1015_platform_data { | ||
33 | struct ads1015_channel_data channel_data[ADS1015_CHANNELS]; | ||
34 | }; | ||
35 | |||
36 | #endif /* LINUX_ADS1015_H */ | ||
diff --git a/include/linux/i2c/qt602240_ts.h b/include/linux/i2c/atmel_mxt_ts.h index c5033e101094..f027f7a63511 100644 --- a/include/linux/i2c/qt602240_ts.h +++ b/include/linux/i2c/atmel_mxt_ts.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * AT42QT602240/ATMXT224 Touchscreen driver | 2 | * Atmel maXTouch Touchscreen driver |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Samsung Electronics Co.Ltd | 4 | * Copyright (C) 2010 Samsung Electronics Co.Ltd |
5 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | 5 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> |
@@ -10,21 +10,26 @@ | |||
10 | * option) any later version. | 10 | * option) any later version. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #ifndef __LINUX_QT602240_TS_H | 13 | #ifndef __LINUX_ATMEL_MXT_TS_H |
14 | #define __LINUX_QT602240_TS_H | 14 | #define __LINUX_ATMEL_MXT_TS_H |
15 | |||
16 | #include <linux/types.h> | ||
15 | 17 | ||
16 | /* Orient */ | 18 | /* Orient */ |
17 | #define QT602240_NORMAL 0x0 | 19 | #define MXT_NORMAL 0x0 |
18 | #define QT602240_DIAGONAL 0x1 | 20 | #define MXT_DIAGONAL 0x1 |
19 | #define QT602240_HORIZONTAL_FLIP 0x2 | 21 | #define MXT_HORIZONTAL_FLIP 0x2 |
20 | #define QT602240_ROTATED_90_COUNTER 0x3 | 22 | #define MXT_ROTATED_90_COUNTER 0x3 |
21 | #define QT602240_VERTICAL_FLIP 0x4 | 23 | #define MXT_VERTICAL_FLIP 0x4 |
22 | #define QT602240_ROTATED_90 0x5 | 24 | #define MXT_ROTATED_90 0x5 |
23 | #define QT602240_ROTATED_180 0x6 | 25 | #define MXT_ROTATED_180 0x6 |
24 | #define QT602240_DIAGONAL_COUNTER 0x7 | 26 | #define MXT_DIAGONAL_COUNTER 0x7 |
27 | |||
28 | /* The platform data for the Atmel maXTouch touchscreen driver */ | ||
29 | struct mxt_platform_data { | ||
30 | const u8 *config; | ||
31 | size_t config_length; | ||
25 | 32 | ||
26 | /* The platform data for the AT42QT602240/ATMXT224 touchscreen driver */ | ||
27 | struct qt602240_platform_data { | ||
28 | unsigned int x_line; | 33 | unsigned int x_line; |
29 | unsigned int y_line; | 34 | unsigned int y_line; |
30 | unsigned int x_size; | 35 | unsigned int x_size; |
@@ -33,6 +38,7 @@ struct qt602240_platform_data { | |||
33 | unsigned int threshold; | 38 | unsigned int threshold; |
34 | unsigned int voltage; | 39 | unsigned int voltage; |
35 | unsigned char orient; | 40 | unsigned char orient; |
41 | unsigned long irqflags; | ||
36 | }; | 42 | }; |
37 | 43 | ||
38 | #endif /* __LINUX_QT602240_TS_H */ | 44 | #endif /* __LINUX_ATMEL_MXT_TS_H */ |
diff --git a/include/linux/i2c/max6639.h b/include/linux/i2c/max6639.h new file mode 100644 index 000000000000..6011c42034da --- /dev/null +++ b/include/linux/i2c/max6639.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #ifndef _LINUX_MAX6639_H | ||
2 | #define _LINUX_MAX6639_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | /* platform data for the MAX6639 temperature sensor and fan control */ | ||
7 | |||
8 | struct max6639_platform_data { | ||
9 | bool pwm_polarity; /* Polarity low (0) or high (1, default) */ | ||
10 | int ppr; /* Pulses per rotation 1..4 (default == 2) */ | ||
11 | int rpm_range; /* 2000, 4000 (default), 8000 or 16000 */ | ||
12 | }; | ||
13 | |||
14 | #endif /* _LINUX_MAX6639_H */ | ||
diff --git a/include/linux/i2c/mcs.h b/include/linux/i2c/mcs.h index 725ae7c313ff..61bb18a4fd3c 100644 --- a/include/linux/i2c/mcs.h +++ b/include/linux/i2c/mcs.h | |||
@@ -18,6 +18,7 @@ | |||
18 | #define MCS_KEY_CODE(v) ((v) & 0xffff) | 18 | #define MCS_KEY_CODE(v) ((v) & 0xffff) |
19 | 19 | ||
20 | struct mcs_platform_data { | 20 | struct mcs_platform_data { |
21 | void (*poweron)(bool); | ||
21 | void (*cfg_pin)(void); | 22 | void (*cfg_pin)(void); |
22 | 23 | ||
23 | /* touchscreen */ | 24 | /* touchscreen */ |
diff --git a/include/linux/i2c/pmbus.h b/include/linux/i2c/pmbus.h new file mode 100644 index 000000000000..69280db02c41 --- /dev/null +++ b/include/linux/i2c/pmbus.h | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * Hardware monitoring driver for PMBus devices | ||
3 | * | ||
4 | * Copyright (c) 2010, 2011 Ericsson AB. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef _PMBUS_H_ | ||
22 | #define _PMBUS_H_ | ||
23 | |||
24 | /* flags */ | ||
25 | |||
26 | /* | ||
27 | * PMBUS_SKIP_STATUS_CHECK | ||
28 | * | ||
29 | * During register detection, skip checking the status register for | ||
30 | * communication or command errors. | ||
31 | * | ||
32 | * Some PMBus chips respond with valid data when trying to read an unsupported | ||
33 | * register. For such chips, checking the status register is mandatory when | ||
34 | * trying to determine if a chip register exists or not. | ||
35 | * Other PMBus chips don't support the STATUS_CML register, or report | ||
36 | * communication errors for no explicable reason. For such chips, checking | ||
37 | * the status register must be disabled. | ||
38 | */ | ||
39 | #define PMBUS_SKIP_STATUS_CHECK (1 << 0) | ||
40 | |||
41 | struct pmbus_platform_data { | ||
42 | u32 flags; /* Device specific flags */ | ||
43 | }; | ||
44 | |||
45 | #endif /* _PMBUS_H_ */ | ||
diff --git a/include/linux/i2c/pxa-i2c.h b/include/linux/i2c/pxa-i2c.h new file mode 100644 index 000000000000..1a9f65e6ec0f --- /dev/null +++ b/include/linux/i2c/pxa-i2c.h | |||
@@ -0,0 +1,82 @@ | |||
1 | /* | ||
2 | * i2c_pxa.h | ||
3 | * | ||
4 | * Copyright (C) 2002 Intrinsyc Software Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | #ifndef _I2C_PXA_H_ | ||
12 | #define _I2C_PXA_H_ | ||
13 | |||
14 | #if 0 | ||
15 | #define DEF_TIMEOUT 3 | ||
16 | #else | ||
17 | /* need a longer timeout if we're dealing with the fact we may well be | ||
18 | * looking at a multi-master environment | ||
19 | */ | ||
20 | #define DEF_TIMEOUT 32 | ||
21 | #endif | ||
22 | |||
23 | #define BUS_ERROR (-EREMOTEIO) | ||
24 | #define XFER_NAKED (-ECONNREFUSED) | ||
25 | #define I2C_RETRY (-2000) /* an error has occurred retry transmit */ | ||
26 | |||
27 | /* ICR initialize bit values | ||
28 | * | ||
29 | * 15. FM 0 (100 Khz operation) | ||
30 | * 14. UR 0 (No unit reset) | ||
31 | * 13. SADIE 0 (Disables the unit from interrupting on slave addresses | ||
32 | * matching its slave address) | ||
33 | * 12. ALDIE 0 (Disables the unit from interrupt when it loses arbitration | ||
34 | * in master mode) | ||
35 | * 11. SSDIE 0 (Disables interrupts from a slave stop detected, in slave mode) | ||
36 | * 10. BEIE 1 (Enable interrupts from detected bus errors, no ACK sent) | ||
37 | * 9. IRFIE 1 (Enable interrupts from full buffer received) | ||
38 | * 8. ITEIE 1 (Enables the I2C unit to interrupt when transmit buffer empty) | ||
39 | * 7. GCD 1 (Disables i2c unit response to general call messages as a slave) | ||
40 | * 6. IUE 0 (Disable unit until we change settings) | ||
41 | * 5. SCLE 1 (Enables the i2c clock output for master mode (drives SCL) | ||
42 | * 4. MA 0 (Only send stop with the ICR stop bit) | ||
43 | * 3. TB 0 (We are not transmitting a byte initially) | ||
44 | * 2. ACKNAK 0 (Send an ACK after the unit receives a byte) | ||
45 | * 1. STOP 0 (Do not send a STOP) | ||
46 | * 0. START 0 (Do not send a START) | ||
47 | * | ||
48 | */ | ||
49 | #define I2C_ICR_INIT (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE) | ||
50 | |||
51 | /* I2C status register init values | ||
52 | * | ||
53 | * 10. BED 1 (Clear bus error detected) | ||
54 | * 9. SAD 1 (Clear slave address detected) | ||
55 | * 7. IRF 1 (Clear IDBR Receive Full) | ||
56 | * 6. ITE 1 (Clear IDBR Transmit Empty) | ||
57 | * 5. ALD 1 (Clear Arbitration Loss Detected) | ||
58 | * 4. SSD 1 (Clear Slave Stop Detected) | ||
59 | */ | ||
60 | #define I2C_ISR_INIT 0x7FF /* status register init */ | ||
61 | |||
62 | struct i2c_slave_client; | ||
63 | |||
64 | struct i2c_pxa_platform_data { | ||
65 | unsigned int slave_addr; | ||
66 | struct i2c_slave_client *slave; | ||
67 | unsigned int class; | ||
68 | unsigned int use_pio :1; | ||
69 | unsigned int fast_mode :1; | ||
70 | }; | ||
71 | |||
72 | extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info); | ||
73 | |||
74 | #ifdef CONFIG_PXA27x | ||
75 | extern void pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info); | ||
76 | #endif | ||
77 | |||
78 | #ifdef CONFIG_PXA3xx | ||
79 | extern void pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info); | ||
80 | #endif | ||
81 | |||
82 | #endif | ||
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 61b9609e55f2..58afd9d2c438 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h | |||
@@ -600,6 +600,8 @@ struct twl4030_usb_data { | |||
600 | int (*phy_power)(struct device *dev, int iD, int on); | 600 | int (*phy_power)(struct device *dev, int iD, int on); |
601 | /* enable/disable phy clocks */ | 601 | /* enable/disable phy clocks */ |
602 | int (*phy_set_clock)(struct device *dev, int on); | 602 | int (*phy_set_clock)(struct device *dev, int on); |
603 | /* suspend/resume of phy */ | ||
604 | int (*phy_suspend)(struct device *dev, int suspend); | ||
603 | }; | 605 | }; |
604 | 606 | ||
605 | struct twl4030_ins { | 607 | struct twl4030_ins { |
@@ -637,7 +639,6 @@ extern void twl4030_power_init(struct twl4030_power_data *triton2_scripts); | |||
637 | extern int twl4030_remove_script(u8 flags); | 639 | extern int twl4030_remove_script(u8 flags); |
638 | 640 | ||
639 | struct twl4030_codec_audio_data { | 641 | struct twl4030_codec_audio_data { |
640 | unsigned int audio_mclk; /* not used, will be removed */ | ||
641 | unsigned int digimic_delay; /* in ms */ | 642 | unsigned int digimic_delay; /* in ms */ |
642 | unsigned int ramp_delay_value; | 643 | unsigned int ramp_delay_value; |
643 | unsigned int offset_cncl_path; | 644 | unsigned int offset_cncl_path; |
@@ -648,7 +649,6 @@ struct twl4030_codec_audio_data { | |||
648 | }; | 649 | }; |
649 | 650 | ||
650 | struct twl4030_codec_vibra_data { | 651 | struct twl4030_codec_vibra_data { |
651 | unsigned int audio_mclk; | ||
652 | unsigned int coexist; | 652 | unsigned int coexist; |
653 | }; | 653 | }; |
654 | 654 | ||
diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h index 4c4c74ec5987..ba45e6bc0764 100644 --- a/include/linux/icmpv6.h +++ b/include/linux/icmpv6.h | |||
@@ -183,10 +183,10 @@ extern void icmpv6_cleanup(void); | |||
183 | extern void icmpv6_param_prob(struct sk_buff *skb, | 183 | extern void icmpv6_param_prob(struct sk_buff *skb, |
184 | u8 code, int pos); | 184 | u8 code, int pos); |
185 | 185 | ||
186 | struct flowi; | 186 | struct flowi6; |
187 | struct in6_addr; | 187 | struct in6_addr; |
188 | extern void icmpv6_flow_init(struct sock *sk, | 188 | extern void icmpv6_flow_init(struct sock *sk, |
189 | struct flowi *fl, | 189 | struct flowi6 *fl6, |
190 | u8 type, | 190 | u8 type, |
191 | const struct in6_addr *saddr, | 191 | const struct in6_addr *saddr, |
192 | const struct in6_addr *daddr, | 192 | const struct in6_addr *daddr, |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 294169e31364..2d1c6117d92c 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -1325,6 +1325,9 @@ enum { | |||
1325 | /* Although the spec says 8 I'm seeing 6 in practice */ | 1325 | /* Although the spec says 8 I'm seeing 6 in practice */ |
1326 | #define IEEE80211_COUNTRY_IE_MIN_LEN 6 | 1326 | #define IEEE80211_COUNTRY_IE_MIN_LEN 6 |
1327 | 1327 | ||
1328 | /* The Country String field of the element shall be 3 octets in length */ | ||
1329 | #define IEEE80211_COUNTRY_STRING_LEN 3 | ||
1330 | |||
1328 | /* | 1331 | /* |
1329 | * For regulatory extension stuff see IEEE 802.11-2007 | 1332 | * For regulatory extension stuff see IEEE 802.11-2007 |
1330 | * Annex I (page 1141) and Annex J (page 1147). Also | 1333 | * Annex I (page 1141) and Annex J (page 1147). Also |
diff --git a/include/linux/if.h b/include/linux/if.h index 123959927745..3bc63e6a02f7 100644 --- a/include/linux/if.h +++ b/include/linux/if.h | |||
@@ -71,11 +71,10 @@ | |||
71 | * release skb->dst | 71 | * release skb->dst |
72 | */ | 72 | */ |
73 | #define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */ | 73 | #define IFF_DONT_BRIDGE 0x800 /* disallow bridging this ether dev */ |
74 | #define IFF_IN_NETPOLL 0x1000 /* whether we are processing netpoll */ | 74 | #define IFF_DISABLE_NETPOLL 0x1000 /* disable netpoll at run-time */ |
75 | #define IFF_DISABLE_NETPOLL 0x2000 /* disable netpoll at run-time */ | 75 | #define IFF_MACVLAN_PORT 0x2000 /* device used as macvlan port */ |
76 | #define IFF_MACVLAN_PORT 0x4000 /* device used as macvlan port */ | 76 | #define IFF_BRIDGE_PORT 0x4000 /* device used as bridge port */ |
77 | #define IFF_BRIDGE_PORT 0x8000 /* device used as bridge port */ | 77 | #define IFF_OVS_DATAPATH 0x8000 /* device used as Open vSwitch |
78 | #define IFF_OVS_DATAPATH 0x10000 /* device used as Open vSwitch | ||
79 | * datapath port */ | 78 | * datapath port */ |
80 | 79 | ||
81 | #define IF_GET_IFACE 0x0001 /* for querying only */ | 80 | #define IF_GET_IFACE 0x0001 /* for querying only */ |
diff --git a/include/linux/if_link.h b/include/linux/if_link.h index 6485d2a89bec..f4a2e6b1b864 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h | |||
@@ -135,6 +135,7 @@ enum { | |||
135 | IFLA_VF_PORTS, | 135 | IFLA_VF_PORTS, |
136 | IFLA_PORT_SELF, | 136 | IFLA_PORT_SELF, |
137 | IFLA_AF_SPEC, | 137 | IFLA_AF_SPEC, |
138 | IFLA_GROUP, /* Group the device belongs to */ | ||
138 | __IFLA_MAX | 139 | __IFLA_MAX |
139 | }; | 140 | }; |
140 | 141 | ||
diff --git a/include/linux/if_ppp.h b/include/linux/if_ppp.h index fcef103aa3f6..c9ad38322576 100644 --- a/include/linux/if_ppp.h +++ b/include/linux/if_ppp.h | |||
@@ -114,14 +114,14 @@ struct pppol2tp_ioc_stats { | |||
114 | __u16 tunnel_id; /* redundant */ | 114 | __u16 tunnel_id; /* redundant */ |
115 | __u16 session_id; /* if zero, get tunnel stats */ | 115 | __u16 session_id; /* if zero, get tunnel stats */ |
116 | __u32 using_ipsec:1; /* valid only for session_id == 0 */ | 116 | __u32 using_ipsec:1; /* valid only for session_id == 0 */ |
117 | aligned_u64 tx_packets; | 117 | __aligned_u64 tx_packets; |
118 | aligned_u64 tx_bytes; | 118 | __aligned_u64 tx_bytes; |
119 | aligned_u64 tx_errors; | 119 | __aligned_u64 tx_errors; |
120 | aligned_u64 rx_packets; | 120 | __aligned_u64 rx_packets; |
121 | aligned_u64 rx_bytes; | 121 | __aligned_u64 rx_bytes; |
122 | aligned_u64 rx_seq_discards; | 122 | __aligned_u64 rx_seq_discards; |
123 | aligned_u64 rx_oos_packets; | 123 | __aligned_u64 rx_oos_packets; |
124 | aligned_u64 rx_errors; | 124 | __aligned_u64 rx_errors; |
125 | }; | 125 | }; |
126 | 126 | ||
127 | #define ifr__name b.ifr_ifrn.ifrn_name | 127 | #define ifr__name b.ifr_ifrn.ifrn_name |
diff --git a/include/linux/igmp.h b/include/linux/igmp.h index 74cfcff0148b..82de336b8155 100644 --- a/include/linux/igmp.h +++ b/include/linux/igmp.h | |||
@@ -217,7 +217,7 @@ struct ip_mc_list { | |||
217 | #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value) | 217 | #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value) |
218 | #define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value) | 218 | #define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value) |
219 | 219 | ||
220 | extern int ip_check_mc(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto); | 220 | extern int ip_check_mc_rcu(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto); |
221 | extern int igmp_rcv(struct sk_buff *); | 221 | extern int igmp_rcv(struct sk_buff *); |
222 | extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr); | 222 | extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr); |
223 | extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr); | 223 | extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr); |
diff --git a/include/linux/ima.h b/include/linux/ima.h index 975837e7d6c0..09e6e62f9953 100644 --- a/include/linux/ima.h +++ b/include/linux/ima.h | |||
@@ -20,7 +20,6 @@ extern void ima_inode_free(struct inode *inode); | |||
20 | extern int ima_file_check(struct file *file, int mask); | 20 | extern int ima_file_check(struct file *file, int mask); |
21 | extern void ima_file_free(struct file *file); | 21 | extern void ima_file_free(struct file *file); |
22 | extern int ima_file_mmap(struct file *file, unsigned long prot); | 22 | extern int ima_file_mmap(struct file *file, unsigned long prot); |
23 | extern void ima_counts_get(struct file *file); | ||
24 | 23 | ||
25 | #else | 24 | #else |
26 | static inline int ima_bprm_check(struct linux_binprm *bprm) | 25 | static inline int ima_bprm_check(struct linux_binprm *bprm) |
@@ -53,10 +52,5 @@ static inline int ima_file_mmap(struct file *file, unsigned long prot) | |||
53 | return 0; | 52 | return 0; |
54 | } | 53 | } |
55 | 54 | ||
56 | static inline void ima_counts_get(struct file *file) | ||
57 | { | ||
58 | return; | ||
59 | } | ||
60 | |||
61 | #endif /* CONFIG_IMA_H */ | 55 | #endif /* CONFIG_IMA_H */ |
62 | #endif /* _LINUX_IMA_H */ | 56 | #endif /* _LINUX_IMA_H */ |
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h index ae8fdc54e0c0..5f8146695b7f 100644 --- a/include/linux/inetdevice.h +++ b/include/linux/inetdevice.h | |||
@@ -144,6 +144,7 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev) | |||
144 | #define IN_DEV_ARP_NOTIFY(in_dev) IN_DEV_MAXCONF((in_dev), ARP_NOTIFY) | 144 | #define IN_DEV_ARP_NOTIFY(in_dev) IN_DEV_MAXCONF((in_dev), ARP_NOTIFY) |
145 | 145 | ||
146 | struct in_ifaddr { | 146 | struct in_ifaddr { |
147 | struct hlist_node hash; | ||
147 | struct in_ifaddr *ifa_next; | 148 | struct in_ifaddr *ifa_next; |
148 | struct in_device *ifa_dev; | 149 | struct in_device *ifa_dev; |
149 | struct rcu_head rcu_head; | 150 | struct rcu_head rcu_head; |
diff --git a/include/linux/input-polldev.h b/include/linux/input-polldev.h index 5e3dddf8f562..ce0b72464eb8 100644 --- a/include/linux/input-polldev.h +++ b/include/linux/input-polldev.h | |||
@@ -22,12 +22,12 @@ | |||
22 | * @poll: driver-supplied method that polls the device and posts | 22 | * @poll: driver-supplied method that polls the device and posts |
23 | * input events (mandatory). | 23 | * input events (mandatory). |
24 | * @poll_interval: specifies how often the poll() method should be called. | 24 | * @poll_interval: specifies how often the poll() method should be called. |
25 | * Defaults to 500 msec unless overriden when registering the device. | 25 | * Defaults to 500 msec unless overridden when registering the device. |
26 | * @poll_interval_max: specifies upper bound for the poll interval. | 26 | * @poll_interval_max: specifies upper bound for the poll interval. |
27 | * Defaults to the initial value of @poll_interval. | 27 | * Defaults to the initial value of @poll_interval. |
28 | * @poll_interval_min: specifies lower bound for the poll interval. | 28 | * @poll_interval_min: specifies lower bound for the poll interval. |
29 | * Defaults to 0. | 29 | * Defaults to 0. |
30 | * @input: input device structire associated with the polled device. | 30 | * @input: input device structure associated with the polled device. |
31 | * Must be properly initialized by the driver (id, name, phys, bits). | 31 | * Must be properly initialized by the driver (id, name, phys, bits). |
32 | * | 32 | * |
33 | * Polled input device provides a skeleton for supporting simple input | 33 | * Polled input device provides a skeleton for supporting simple input |
diff --git a/include/linux/input.h b/include/linux/input.h index e428382ca28a..056ae8a5bd9b 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -1154,8 +1154,6 @@ struct ff_effect { | |||
1154 | * sparse keymaps. If not supplied default mechanism will be used. | 1154 | * sparse keymaps. If not supplied default mechanism will be used. |
1155 | * The method is being called while holding event_lock and thus must | 1155 | * The method is being called while holding event_lock and thus must |
1156 | * not sleep | 1156 | * not sleep |
1157 | * @getkeycode_new: transition method | ||
1158 | * @setkeycode_new: transition method | ||
1159 | * @ff: force feedback structure associated with the device if device | 1157 | * @ff: force feedback structure associated with the device if device |
1160 | * supports force feedback effects | 1158 | * supports force feedback effects |
1161 | * @repeat_key: stores key code of the last key pressed; used to implement | 1159 | * @repeat_key: stores key code of the last key pressed; used to implement |
@@ -1234,14 +1232,10 @@ struct input_dev { | |||
1234 | void *keycode; | 1232 | void *keycode; |
1235 | 1233 | ||
1236 | int (*setkeycode)(struct input_dev *dev, | 1234 | int (*setkeycode)(struct input_dev *dev, |
1237 | unsigned int scancode, unsigned int keycode); | 1235 | const struct input_keymap_entry *ke, |
1236 | unsigned int *old_keycode); | ||
1238 | int (*getkeycode)(struct input_dev *dev, | 1237 | int (*getkeycode)(struct input_dev *dev, |
1239 | unsigned int scancode, unsigned int *keycode); | 1238 | struct input_keymap_entry *ke); |
1240 | int (*setkeycode_new)(struct input_dev *dev, | ||
1241 | const struct input_keymap_entry *ke, | ||
1242 | unsigned int *old_keycode); | ||
1243 | int (*getkeycode_new)(struct input_dev *dev, | ||
1244 | struct input_keymap_entry *ke); | ||
1245 | 1239 | ||
1246 | struct ff_device *ff; | 1240 | struct ff_device *ff; |
1247 | 1241 | ||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 55e0d4253e49..59b72ca1c5d1 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -14,6 +14,8 @@ | |||
14 | #include <linux/smp.h> | 14 | #include <linux/smp.h> |
15 | #include <linux/percpu.h> | 15 | #include <linux/percpu.h> |
16 | #include <linux/hrtimer.h> | 16 | #include <linux/hrtimer.h> |
17 | #include <linux/kref.h> | ||
18 | #include <linux/workqueue.h> | ||
17 | 19 | ||
18 | #include <asm/atomic.h> | 20 | #include <asm/atomic.h> |
19 | #include <asm/ptrace.h> | 21 | #include <asm/ptrace.h> |
@@ -55,7 +57,8 @@ | |||
55 | * Used by threaded interrupts which need to keep the | 57 | * Used by threaded interrupts which need to keep the |
56 | * irq line disabled until the threaded handler has been run. | 58 | * irq line disabled until the threaded handler has been run. |
57 | * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend | 59 | * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend |
58 | * | 60 | * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set |
61 | * IRQF_NO_THREAD - Interrupt cannot be threaded | ||
59 | */ | 62 | */ |
60 | #define IRQF_DISABLED 0x00000020 | 63 | #define IRQF_DISABLED 0x00000020 |
61 | #define IRQF_SAMPLE_RANDOM 0x00000040 | 64 | #define IRQF_SAMPLE_RANDOM 0x00000040 |
@@ -67,22 +70,10 @@ | |||
67 | #define IRQF_IRQPOLL 0x00001000 | 70 | #define IRQF_IRQPOLL 0x00001000 |
68 | #define IRQF_ONESHOT 0x00002000 | 71 | #define IRQF_ONESHOT 0x00002000 |
69 | #define IRQF_NO_SUSPEND 0x00004000 | 72 | #define IRQF_NO_SUSPEND 0x00004000 |
73 | #define IRQF_FORCE_RESUME 0x00008000 | ||
74 | #define IRQF_NO_THREAD 0x00010000 | ||
70 | 75 | ||
71 | #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND) | 76 | #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) |
72 | |||
73 | /* | ||
74 | * Bits used by threaded handlers: | ||
75 | * IRQTF_RUNTHREAD - signals that the interrupt handler thread should run | ||
76 | * IRQTF_DIED - handler thread died | ||
77 | * IRQTF_WARNED - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed | ||
78 | * IRQTF_AFFINITY - irq thread is requested to adjust affinity | ||
79 | */ | ||
80 | enum { | ||
81 | IRQTF_RUNTHREAD, | ||
82 | IRQTF_DIED, | ||
83 | IRQTF_WARNED, | ||
84 | IRQTF_AFFINITY, | ||
85 | }; | ||
86 | 77 | ||
87 | /* | 78 | /* |
88 | * These values can be returned by request_any_context_irq() and | 79 | * These values can be returned by request_any_context_irq() and |
@@ -110,6 +101,7 @@ typedef irqreturn_t (*irq_handler_t)(int, void *); | |||
110 | * @thread_fn: interupt handler function for threaded interrupts | 101 | * @thread_fn: interupt handler function for threaded interrupts |
111 | * @thread: thread pointer for threaded interrupts | 102 | * @thread: thread pointer for threaded interrupts |
112 | * @thread_flags: flags related to @thread | 103 | * @thread_flags: flags related to @thread |
104 | * @thread_mask: bitmask for keeping track of @thread activity | ||
113 | */ | 105 | */ |
114 | struct irqaction { | 106 | struct irqaction { |
115 | irq_handler_t handler; | 107 | irq_handler_t handler; |
@@ -120,6 +112,7 @@ struct irqaction { | |||
120 | irq_handler_t thread_fn; | 112 | irq_handler_t thread_fn; |
121 | struct task_struct *thread; | 113 | struct task_struct *thread; |
122 | unsigned long thread_flags; | 114 | unsigned long thread_flags; |
115 | unsigned long thread_mask; | ||
123 | const char *name; | 116 | const char *name; |
124 | struct proc_dir_entry *dir; | 117 | struct proc_dir_entry *dir; |
125 | } ____cacheline_internodealigned_in_smp; | 118 | } ____cacheline_internodealigned_in_smp; |
@@ -240,6 +233,35 @@ extern int irq_can_set_affinity(unsigned int irq); | |||
240 | extern int irq_select_affinity(unsigned int irq); | 233 | extern int irq_select_affinity(unsigned int irq); |
241 | 234 | ||
242 | extern int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m); | 235 | extern int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m); |
236 | |||
237 | /** | ||
238 | * struct irq_affinity_notify - context for notification of IRQ affinity changes | ||
239 | * @irq: Interrupt to which notification applies | ||
240 | * @kref: Reference count, for internal use | ||
241 | * @work: Work item, for internal use | ||
242 | * @notify: Function to be called on change. This will be | ||
243 | * called in process context. | ||
244 | * @release: Function to be called on release. This will be | ||
245 | * called in process context. Once registered, the | ||
246 | * structure must only be freed when this function is | ||
247 | * called or later. | ||
248 | */ | ||
249 | struct irq_affinity_notify { | ||
250 | unsigned int irq; | ||
251 | struct kref kref; | ||
252 | struct work_struct work; | ||
253 | void (*notify)(struct irq_affinity_notify *, const cpumask_t *mask); | ||
254 | void (*release)(struct kref *ref); | ||
255 | }; | ||
256 | |||
257 | extern int | ||
258 | irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify); | ||
259 | |||
260 | static inline void irq_run_affinity_notifiers(void) | ||
261 | { | ||
262 | flush_scheduled_work(); | ||
263 | } | ||
264 | |||
243 | #else /* CONFIG_SMP */ | 265 | #else /* CONFIG_SMP */ |
244 | 266 | ||
245 | static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m) | 267 | static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m) |
@@ -255,7 +277,7 @@ static inline int irq_can_set_affinity(unsigned int irq) | |||
255 | static inline int irq_select_affinity(unsigned int irq) { return 0; } | 277 | static inline int irq_select_affinity(unsigned int irq) { return 0; } |
256 | 278 | ||
257 | static inline int irq_set_affinity_hint(unsigned int irq, | 279 | static inline int irq_set_affinity_hint(unsigned int irq, |
258 | const struct cpumask *m) | 280 | const struct cpumask *m) |
259 | { | 281 | { |
260 | return -EINVAL; | 282 | return -EINVAL; |
261 | } | 283 | } |
@@ -314,16 +336,24 @@ static inline void enable_irq_lockdep_irqrestore(unsigned int irq, unsigned long | |||
314 | } | 336 | } |
315 | 337 | ||
316 | /* IRQ wakeup (PM) control: */ | 338 | /* IRQ wakeup (PM) control: */ |
317 | extern int set_irq_wake(unsigned int irq, unsigned int on); | 339 | extern int irq_set_irq_wake(unsigned int irq, unsigned int on); |
340 | |||
341 | #ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT | ||
342 | /* Please do not use: Use the replacement functions instead */ | ||
343 | static inline int set_irq_wake(unsigned int irq, unsigned int on) | ||
344 | { | ||
345 | return irq_set_irq_wake(irq, on); | ||
346 | } | ||
347 | #endif | ||
318 | 348 | ||
319 | static inline int enable_irq_wake(unsigned int irq) | 349 | static inline int enable_irq_wake(unsigned int irq) |
320 | { | 350 | { |
321 | return set_irq_wake(irq, 1); | 351 | return irq_set_irq_wake(irq, 1); |
322 | } | 352 | } |
323 | 353 | ||
324 | static inline int disable_irq_wake(unsigned int irq) | 354 | static inline int disable_irq_wake(unsigned int irq) |
325 | { | 355 | { |
326 | return set_irq_wake(irq, 0); | 356 | return irq_set_irq_wake(irq, 0); |
327 | } | 357 | } |
328 | 358 | ||
329 | #else /* !CONFIG_GENERIC_HARDIRQS */ | 359 | #else /* !CONFIG_GENERIC_HARDIRQS */ |
@@ -353,6 +383,13 @@ static inline int disable_irq_wake(unsigned int irq) | |||
353 | } | 383 | } |
354 | #endif /* CONFIG_GENERIC_HARDIRQS */ | 384 | #endif /* CONFIG_GENERIC_HARDIRQS */ |
355 | 385 | ||
386 | |||
387 | #ifdef CONFIG_IRQ_FORCED_THREADING | ||
388 | extern bool force_irqthreads; | ||
389 | #else | ||
390 | #define force_irqthreads (0) | ||
391 | #endif | ||
392 | |||
356 | #ifndef __ARCH_SET_SOFTIRQ_PENDING | 393 | #ifndef __ARCH_SET_SOFTIRQ_PENDING |
357 | #define set_softirq_pending(x) (local_softirq_pending() = (x)) | 394 | #define set_softirq_pending(x) (local_softirq_pending() = (x)) |
358 | #define or_softirq_pending(x) (local_softirq_pending() |= (x)) | 395 | #define or_softirq_pending(x) (local_softirq_pending() |= (x)) |
@@ -426,6 +463,13 @@ extern void raise_softirq(unsigned int nr); | |||
426 | */ | 463 | */ |
427 | DECLARE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list); | 464 | DECLARE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list); |
428 | 465 | ||
466 | DECLARE_PER_CPU(struct task_struct *, ksoftirqd); | ||
467 | |||
468 | static inline struct task_struct *this_cpu_ksoftirqd(void) | ||
469 | { | ||
470 | return this_cpu_read(ksoftirqd); | ||
471 | } | ||
472 | |||
429 | /* Try to send a softirq to a remote cpu. If this cannot be done, the | 473 | /* Try to send a softirq to a remote cpu. If this cannot be done, the |
430 | * work will be queued to the local cpu. | 474 | * work will be queued to the local cpu. |
431 | */ | 475 | */ |
@@ -645,6 +689,7 @@ static inline void init_irq_proc(void) | |||
645 | 689 | ||
646 | struct seq_file; | 690 | struct seq_file; |
647 | int show_interrupts(struct seq_file *p, void *v); | 691 | int show_interrupts(struct seq_file *p, void *v); |
692 | int arch_show_interrupts(struct seq_file *p, int prec); | ||
648 | 693 | ||
649 | extern int early_irq_init(void); | 694 | extern int early_irq_init(void); |
650 | extern int arch_probe_nr_irqs(void); | 695 | extern int arch_probe_nr_irqs(void); |
diff --git a/include/linux/ip_vs.h b/include/linux/ip_vs.h index 5f43a3b2e3ad..4deb3834d62c 100644 --- a/include/linux/ip_vs.h +++ b/include/linux/ip_vs.h | |||
@@ -89,6 +89,14 @@ | |||
89 | #define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */ | 89 | #define IP_VS_CONN_F_TEMPLATE 0x1000 /* template, not connection */ |
90 | #define IP_VS_CONN_F_ONE_PACKET 0x2000 /* forward only one packet */ | 90 | #define IP_VS_CONN_F_ONE_PACKET 0x2000 /* forward only one packet */ |
91 | 91 | ||
92 | #define IP_VS_CONN_F_BACKUP_MASK (IP_VS_CONN_F_FWD_MASK | \ | ||
93 | IP_VS_CONN_F_NOOUTPUT | \ | ||
94 | IP_VS_CONN_F_INACTIVE | \ | ||
95 | IP_VS_CONN_F_SEQ_MASK | \ | ||
96 | IP_VS_CONN_F_NO_CPORT | \ | ||
97 | IP_VS_CONN_F_TEMPLATE \ | ||
98 | ) | ||
99 | |||
92 | /* Flags that are not sent to backup server start from bit 16 */ | 100 | /* Flags that are not sent to backup server start from bit 16 */ |
93 | #define IP_VS_CONN_F_NFCT (1 << 16) /* use netfilter conntrack */ | 101 | #define IP_VS_CONN_F_NFCT (1 << 16) /* use netfilter conntrack */ |
94 | 102 | ||
diff --git a/include/linux/irq.h b/include/linux/irq.h index 80fcb53057bc..1d3577f30d45 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -29,61 +29,104 @@ | |||
29 | #include <asm/irq_regs.h> | 29 | #include <asm/irq_regs.h> |
30 | 30 | ||
31 | struct irq_desc; | 31 | struct irq_desc; |
32 | struct irq_data; | ||
32 | typedef void (*irq_flow_handler_t)(unsigned int irq, | 33 | typedef void (*irq_flow_handler_t)(unsigned int irq, |
33 | struct irq_desc *desc); | 34 | struct irq_desc *desc); |
34 | 35 | typedef void (*irq_preflow_handler_t)(struct irq_data *data); | |
35 | 36 | ||
36 | /* | 37 | /* |
37 | * IRQ line status. | 38 | * IRQ line status. |
38 | * | 39 | * |
39 | * Bits 0-7 are reserved for the IRQF_* bits in linux/interrupt.h | 40 | * Bits 0-7 are the same as the IRQF_* bits in linux/interrupt.h |
41 | * | ||
42 | * IRQ_TYPE_NONE - default, unspecified type | ||
43 | * IRQ_TYPE_EDGE_RISING - rising edge triggered | ||
44 | * IRQ_TYPE_EDGE_FALLING - falling edge triggered | ||
45 | * IRQ_TYPE_EDGE_BOTH - rising and falling edge triggered | ||
46 | * IRQ_TYPE_LEVEL_HIGH - high level triggered | ||
47 | * IRQ_TYPE_LEVEL_LOW - low level triggered | ||
48 | * IRQ_TYPE_LEVEL_MASK - Mask to filter out the level bits | ||
49 | * IRQ_TYPE_SENSE_MASK - Mask for all the above bits | ||
50 | * IRQ_TYPE_PROBE - Special flag for probing in progress | ||
51 | * | ||
52 | * Bits which can be modified via irq_set/clear/modify_status_flags() | ||
53 | * IRQ_LEVEL - Interrupt is level type. Will be also | ||
54 | * updated in the code when the above trigger | ||
55 | * bits are modified via set_irq_type() | ||
56 | * IRQ_PER_CPU - Mark an interrupt PER_CPU. Will protect | ||
57 | * it from affinity setting | ||
58 | * IRQ_NOPROBE - Interrupt cannot be probed by autoprobing | ||
59 | * IRQ_NOREQUEST - Interrupt cannot be requested via | ||
60 | * request_irq() | ||
61 | * IRQ_NOAUTOEN - Interrupt is not automatically enabled in | ||
62 | * request/setup_irq() | ||
63 | * IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set) | ||
64 | * IRQ_MOVE_PCNTXT - Interrupt can be migrated from process context | ||
65 | * IRQ_NESTED_TRHEAD - Interrupt nests into another thread | ||
66 | * | ||
67 | * Deprecated bits. They are kept updated as long as | ||
68 | * CONFIG_GENERIC_HARDIRQS_NO_COMPAT is not set. Will go away soon. These bits | ||
69 | * are internal state of the core code and if you really need to acces | ||
70 | * them then talk to the genirq maintainer instead of hacking | ||
71 | * something weird. | ||
40 | * | 72 | * |
41 | * IRQ types | ||
42 | */ | 73 | */ |
43 | #define IRQ_TYPE_NONE 0x00000000 /* Default, unspecified type */ | 74 | enum { |
44 | #define IRQ_TYPE_EDGE_RISING 0x00000001 /* Edge rising type */ | 75 | IRQ_TYPE_NONE = 0x00000000, |
45 | #define IRQ_TYPE_EDGE_FALLING 0x00000002 /* Edge falling type */ | 76 | IRQ_TYPE_EDGE_RISING = 0x00000001, |
46 | #define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING) | 77 | IRQ_TYPE_EDGE_FALLING = 0x00000002, |
47 | #define IRQ_TYPE_LEVEL_HIGH 0x00000004 /* Level high type */ | 78 | IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING), |
48 | #define IRQ_TYPE_LEVEL_LOW 0x00000008 /* Level low type */ | 79 | IRQ_TYPE_LEVEL_HIGH = 0x00000004, |
49 | #define IRQ_TYPE_SENSE_MASK 0x0000000f /* Mask of the above */ | 80 | IRQ_TYPE_LEVEL_LOW = 0x00000008, |
50 | #define IRQ_TYPE_PROBE 0x00000010 /* Probing in progress */ | 81 | IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH), |
51 | 82 | IRQ_TYPE_SENSE_MASK = 0x0000000f, | |
52 | /* Internal flags */ | 83 | |
53 | #define IRQ_INPROGRESS 0x00000100 /* IRQ handler active - do not enter! */ | 84 | IRQ_TYPE_PROBE = 0x00000010, |
54 | #define IRQ_DISABLED 0x00000200 /* IRQ disabled - do not enter! */ | 85 | |
55 | #define IRQ_PENDING 0x00000400 /* IRQ pending - replay on enable */ | 86 | IRQ_LEVEL = (1 << 8), |
56 | #define IRQ_REPLAY 0x00000800 /* IRQ has been replayed but not acked yet */ | 87 | IRQ_PER_CPU = (1 << 9), |
57 | #define IRQ_AUTODETECT 0x00001000 /* IRQ is being autodetected */ | 88 | IRQ_NOPROBE = (1 << 10), |
58 | #define IRQ_WAITING 0x00002000 /* IRQ not yet seen - for autodetection */ | 89 | IRQ_NOREQUEST = (1 << 11), |
59 | #define IRQ_LEVEL 0x00004000 /* IRQ level triggered */ | 90 | IRQ_NOAUTOEN = (1 << 12), |
60 | #define IRQ_MASKED 0x00008000 /* IRQ masked - shouldn't be seen again */ | 91 | IRQ_NO_BALANCING = (1 << 13), |
61 | #define IRQ_PER_CPU 0x00010000 /* IRQ is per CPU */ | 92 | IRQ_MOVE_PCNTXT = (1 << 14), |
62 | #define IRQ_NOPROBE 0x00020000 /* IRQ is not valid for probing */ | 93 | IRQ_NESTED_THREAD = (1 << 15), |
63 | #define IRQ_NOREQUEST 0x00040000 /* IRQ cannot be requested */ | 94 | |
64 | #define IRQ_NOAUTOEN 0x00080000 /* IRQ will not be enabled on request irq */ | 95 | #ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT |
65 | #define IRQ_WAKEUP 0x00100000 /* IRQ triggers system wakeup */ | 96 | IRQ_INPROGRESS = (1 << 16), |
66 | #define IRQ_MOVE_PENDING 0x00200000 /* need to re-target IRQ destination */ | 97 | IRQ_REPLAY = (1 << 17), |
67 | #define IRQ_NO_BALANCING 0x00400000 /* IRQ is excluded from balancing */ | 98 | IRQ_WAITING = (1 << 18), |
68 | #define IRQ_SPURIOUS_DISABLED 0x00800000 /* IRQ was disabled by the spurious trap */ | 99 | IRQ_DISABLED = (1 << 19), |
69 | #define IRQ_MOVE_PCNTXT 0x01000000 /* IRQ migration from process context */ | 100 | IRQ_PENDING = (1 << 20), |
70 | #define IRQ_AFFINITY_SET 0x02000000 /* IRQ affinity was set from userspace*/ | 101 | IRQ_MASKED = (1 << 21), |
71 | #define IRQ_SUSPENDED 0x04000000 /* IRQ has gone through suspend sequence */ | 102 | IRQ_MOVE_PENDING = (1 << 22), |
72 | #define IRQ_ONESHOT 0x08000000 /* IRQ is not unmasked after hardirq */ | 103 | IRQ_AFFINITY_SET = (1 << 23), |
73 | #define IRQ_NESTED_THREAD 0x10000000 /* IRQ is nested into another, no own handler thread */ | 104 | IRQ_WAKEUP = (1 << 24), |
105 | #endif | ||
106 | }; | ||
74 | 107 | ||
75 | #define IRQF_MODIFY_MASK \ | 108 | #define IRQF_MODIFY_MASK \ |
76 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ | 109 | (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ |
77 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ | 110 | IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ |
78 | IRQ_PER_CPU) | 111 | IRQ_PER_CPU | IRQ_NESTED_THREAD) |
79 | 112 | ||
80 | #ifdef CONFIG_IRQ_PER_CPU | 113 | #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) |
81 | # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) | 114 | |
82 | # define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) | 115 | static inline __deprecated bool CHECK_IRQ_PER_CPU(unsigned int status) |
83 | #else | 116 | { |
84 | # define CHECK_IRQ_PER_CPU(var) 0 | 117 | return status & IRQ_PER_CPU; |
85 | # define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING | 118 | } |
86 | #endif | 119 | |
120 | /* | ||
121 | * Return value for chip->irq_set_affinity() | ||
122 | * | ||
123 | * IRQ_SET_MASK_OK - OK, core updates irq_data.affinity | ||
124 | * IRQ_SET_MASK_NOCPY - OK, chip did update irq_data.affinity | ||
125 | */ | ||
126 | enum { | ||
127 | IRQ_SET_MASK_OK = 0, | ||
128 | IRQ_SET_MASK_OK_NOCOPY, | ||
129 | }; | ||
87 | 130 | ||
88 | struct msi_desc; | 131 | struct msi_desc; |
89 | 132 | ||
@@ -91,6 +134,8 @@ struct msi_desc; | |||
91 | * struct irq_data - per irq and irq chip data passed down to chip functions | 134 | * struct irq_data - per irq and irq chip data passed down to chip functions |
92 | * @irq: interrupt number | 135 | * @irq: interrupt number |
93 | * @node: node index useful for balancing | 136 | * @node: node index useful for balancing |
137 | * @state_use_accessor: status information for irq chip functions. | ||
138 | * Use accessor functions to deal with it | ||
94 | * @chip: low level interrupt hardware access | 139 | * @chip: low level interrupt hardware access |
95 | * @handler_data: per-IRQ data for the irq_chip methods | 140 | * @handler_data: per-IRQ data for the irq_chip methods |
96 | * @chip_data: platform-specific per-chip private data for the chip | 141 | * @chip_data: platform-specific per-chip private data for the chip |
@@ -105,6 +150,7 @@ struct msi_desc; | |||
105 | struct irq_data { | 150 | struct irq_data { |
106 | unsigned int irq; | 151 | unsigned int irq; |
107 | unsigned int node; | 152 | unsigned int node; |
153 | unsigned int state_use_accessors; | ||
108 | struct irq_chip *chip; | 154 | struct irq_chip *chip; |
109 | void *handler_data; | 155 | void *handler_data; |
110 | void *chip_data; | 156 | void *chip_data; |
@@ -114,6 +160,80 @@ struct irq_data { | |||
114 | #endif | 160 | #endif |
115 | }; | 161 | }; |
116 | 162 | ||
163 | /* | ||
164 | * Bit masks for irq_data.state | ||
165 | * | ||
166 | * IRQD_TRIGGER_MASK - Mask for the trigger type bits | ||
167 | * IRQD_SETAFFINITY_PENDING - Affinity setting is pending | ||
168 | * IRQD_NO_BALANCING - Balancing disabled for this IRQ | ||
169 | * IRQD_PER_CPU - Interrupt is per cpu | ||
170 | * IRQD_AFFINITY_SET - Interrupt affinity was set | ||
171 | * IRQD_LEVEL - Interrupt is level triggered | ||
172 | * IRQD_WAKEUP_STATE - Interrupt is configured for wakeup | ||
173 | * from suspend | ||
174 | * IRDQ_MOVE_PCNTXT - Interrupt can be moved in process | ||
175 | * context | ||
176 | */ | ||
177 | enum { | ||
178 | IRQD_TRIGGER_MASK = 0xf, | ||
179 | IRQD_SETAFFINITY_PENDING = (1 << 8), | ||
180 | IRQD_NO_BALANCING = (1 << 10), | ||
181 | IRQD_PER_CPU = (1 << 11), | ||
182 | IRQD_AFFINITY_SET = (1 << 12), | ||
183 | IRQD_LEVEL = (1 << 13), | ||
184 | IRQD_WAKEUP_STATE = (1 << 14), | ||
185 | IRQD_MOVE_PCNTXT = (1 << 15), | ||
186 | }; | ||
187 | |||
188 | static inline bool irqd_is_setaffinity_pending(struct irq_data *d) | ||
189 | { | ||
190 | return d->state_use_accessors & IRQD_SETAFFINITY_PENDING; | ||
191 | } | ||
192 | |||
193 | static inline bool irqd_is_per_cpu(struct irq_data *d) | ||
194 | { | ||
195 | return d->state_use_accessors & IRQD_PER_CPU; | ||
196 | } | ||
197 | |||
198 | static inline bool irqd_can_balance(struct irq_data *d) | ||
199 | { | ||
200 | return !(d->state_use_accessors & (IRQD_PER_CPU | IRQD_NO_BALANCING)); | ||
201 | } | ||
202 | |||
203 | static inline bool irqd_affinity_was_set(struct irq_data *d) | ||
204 | { | ||
205 | return d->state_use_accessors & IRQD_AFFINITY_SET; | ||
206 | } | ||
207 | |||
208 | static inline u32 irqd_get_trigger_type(struct irq_data *d) | ||
209 | { | ||
210 | return d->state_use_accessors & IRQD_TRIGGER_MASK; | ||
211 | } | ||
212 | |||
213 | /* | ||
214 | * Must only be called inside irq_chip.irq_set_type() functions. | ||
215 | */ | ||
216 | static inline void irqd_set_trigger_type(struct irq_data *d, u32 type) | ||
217 | { | ||
218 | d->state_use_accessors &= ~IRQD_TRIGGER_MASK; | ||
219 | d->state_use_accessors |= type & IRQD_TRIGGER_MASK; | ||
220 | } | ||
221 | |||
222 | static inline bool irqd_is_level_type(struct irq_data *d) | ||
223 | { | ||
224 | return d->state_use_accessors & IRQD_LEVEL; | ||
225 | } | ||
226 | |||
227 | static inline bool irqd_is_wakeup_set(struct irq_data *d) | ||
228 | { | ||
229 | return d->state_use_accessors & IRQD_WAKEUP_STATE; | ||
230 | } | ||
231 | |||
232 | static inline bool irqd_can_move_in_process_context(struct irq_data *d) | ||
233 | { | ||
234 | return d->state_use_accessors & IRQD_MOVE_PCNTXT; | ||
235 | } | ||
236 | |||
117 | /** | 237 | /** |
118 | * struct irq_chip - hardware interrupt chip descriptor | 238 | * struct irq_chip - hardware interrupt chip descriptor |
119 | * | 239 | * |
@@ -150,6 +270,7 @@ struct irq_data { | |||
150 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ | 270 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ |
151 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips | 271 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips |
152 | * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips | 272 | * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips |
273 | * @flags: chip specific flags | ||
153 | * | 274 | * |
154 | * @release: release function solely used by UML | 275 | * @release: release function solely used by UML |
155 | */ | 276 | */ |
@@ -196,12 +317,27 @@ struct irq_chip { | |||
196 | void (*irq_bus_lock)(struct irq_data *data); | 317 | void (*irq_bus_lock)(struct irq_data *data); |
197 | void (*irq_bus_sync_unlock)(struct irq_data *data); | 318 | void (*irq_bus_sync_unlock)(struct irq_data *data); |
198 | 319 | ||
320 | unsigned long flags; | ||
321 | |||
199 | /* Currently used only by UML, might disappear one day.*/ | 322 | /* Currently used only by UML, might disappear one day.*/ |
200 | #ifdef CONFIG_IRQ_RELEASE_METHOD | 323 | #ifdef CONFIG_IRQ_RELEASE_METHOD |
201 | void (*release)(unsigned int irq, void *dev_id); | 324 | void (*release)(unsigned int irq, void *dev_id); |
202 | #endif | 325 | #endif |
203 | }; | 326 | }; |
204 | 327 | ||
328 | /* | ||
329 | * irq_chip specific flags | ||
330 | * | ||
331 | * IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type() | ||
332 | * IRQCHIP_EOI_IF_HANDLED: Only issue irq_eoi() when irq was handled | ||
333 | * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path | ||
334 | */ | ||
335 | enum { | ||
336 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), | ||
337 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), | ||
338 | IRQCHIP_MASK_ON_SUSPEND = (1 << 2), | ||
339 | }; | ||
340 | |||
205 | /* This include will go away once we isolated irq_desc usage to core code */ | 341 | /* This include will go away once we isolated irq_desc usage to core code */ |
206 | #include <linux/irqdesc.h> | 342 | #include <linux/irqdesc.h> |
207 | 343 | ||
@@ -218,7 +354,7 @@ struct irq_chip { | |||
218 | # define ARCH_IRQ_INIT_FLAGS 0 | 354 | # define ARCH_IRQ_INIT_FLAGS 0 |
219 | #endif | 355 | #endif |
220 | 356 | ||
221 | #define IRQ_DEFAULT_INIT_FLAGS (IRQ_DISABLED | ARCH_IRQ_INIT_FLAGS) | 357 | #define IRQ_DEFAULT_INIT_FLAGS ARCH_IRQ_INIT_FLAGS |
222 | 358 | ||
223 | struct irqaction; | 359 | struct irqaction; |
224 | extern int setup_irq(unsigned int irq, struct irqaction *new); | 360 | extern int setup_irq(unsigned int irq, struct irqaction *new); |
@@ -229,9 +365,13 @@ extern void remove_irq(unsigned int irq, struct irqaction *act); | |||
229 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) | 365 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
230 | void move_native_irq(int irq); | 366 | void move_native_irq(int irq); |
231 | void move_masked_irq(int irq); | 367 | void move_masked_irq(int irq); |
368 | void irq_move_irq(struct irq_data *data); | ||
369 | void irq_move_masked_irq(struct irq_data *data); | ||
232 | #else | 370 | #else |
233 | static inline void move_native_irq(int irq) { } | 371 | static inline void move_native_irq(int irq) { } |
234 | static inline void move_masked_irq(int irq) { } | 372 | static inline void move_masked_irq(int irq) { } |
373 | static inline void irq_move_irq(struct irq_data *data) { } | ||
374 | static inline void irq_move_masked_irq(struct irq_data *data) { } | ||
235 | #endif | 375 | #endif |
236 | 376 | ||
237 | extern int no_irq_affinity; | 377 | extern int no_irq_affinity; |
@@ -267,23 +407,23 @@ extern struct irq_chip no_irq_chip; | |||
267 | extern struct irq_chip dummy_irq_chip; | 407 | extern struct irq_chip dummy_irq_chip; |
268 | 408 | ||
269 | extern void | 409 | extern void |
270 | set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, | 410 | irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip, |
271 | irq_flow_handler_t handle); | ||
272 | extern void | ||
273 | set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip, | ||
274 | irq_flow_handler_t handle, const char *name); | 411 | irq_flow_handler_t handle, const char *name); |
275 | 412 | ||
413 | static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *chip, | ||
414 | irq_flow_handler_t handle) | ||
415 | { | ||
416 | irq_set_chip_and_handler_name(irq, chip, handle, NULL); | ||
417 | } | ||
418 | |||
276 | extern void | 419 | extern void |
277 | __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | 420 | __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, |
278 | const char *name); | 421 | const char *name); |
279 | 422 | ||
280 | /* | ||
281 | * Set a highlevel flow handler for a given IRQ: | ||
282 | */ | ||
283 | static inline void | 423 | static inline void |
284 | set_irq_handler(unsigned int irq, irq_flow_handler_t handle) | 424 | irq_set_handler(unsigned int irq, irq_flow_handler_t handle) |
285 | { | 425 | { |
286 | __set_irq_handler(irq, handle, 0, NULL); | 426 | __irq_set_handler(irq, handle, 0, NULL); |
287 | } | 427 | } |
288 | 428 | ||
289 | /* | 429 | /* |
@@ -292,14 +432,11 @@ set_irq_handler(unsigned int irq, irq_flow_handler_t handle) | |||
292 | * IRQ_NOREQUEST and IRQ_NOPROBE) | 432 | * IRQ_NOREQUEST and IRQ_NOPROBE) |
293 | */ | 433 | */ |
294 | static inline void | 434 | static inline void |
295 | set_irq_chained_handler(unsigned int irq, | 435 | irq_set_chained_handler(unsigned int irq, irq_flow_handler_t handle) |
296 | irq_flow_handler_t handle) | ||
297 | { | 436 | { |
298 | __set_irq_handler(irq, handle, 1, NULL); | 437 | __irq_set_handler(irq, handle, 1, NULL); |
299 | } | 438 | } |
300 | 439 | ||
301 | extern void set_irq_nested_thread(unsigned int irq, int nest); | ||
302 | |||
303 | void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set); | 440 | void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set); |
304 | 441 | ||
305 | static inline void irq_set_status_flags(unsigned int irq, unsigned long set) | 442 | static inline void irq_set_status_flags(unsigned int irq, unsigned long set) |
@@ -312,16 +449,24 @@ static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr) | |||
312 | irq_modify_status(irq, clr, 0); | 449 | irq_modify_status(irq, clr, 0); |
313 | } | 450 | } |
314 | 451 | ||
315 | static inline void set_irq_noprobe(unsigned int irq) | 452 | static inline void irq_set_noprobe(unsigned int irq) |
316 | { | 453 | { |
317 | irq_modify_status(irq, 0, IRQ_NOPROBE); | 454 | irq_modify_status(irq, 0, IRQ_NOPROBE); |
318 | } | 455 | } |
319 | 456 | ||
320 | static inline void set_irq_probe(unsigned int irq) | 457 | static inline void irq_set_probe(unsigned int irq) |
321 | { | 458 | { |
322 | irq_modify_status(irq, IRQ_NOPROBE, 0); | 459 | irq_modify_status(irq, IRQ_NOPROBE, 0); |
323 | } | 460 | } |
324 | 461 | ||
462 | static inline void irq_set_nested_thread(unsigned int irq, bool nest) | ||
463 | { | ||
464 | if (nest) | ||
465 | irq_set_status_flags(irq, IRQ_NESTED_THREAD); | ||
466 | else | ||
467 | irq_clear_status_flags(irq, IRQ_NESTED_THREAD); | ||
468 | } | ||
469 | |||
325 | /* Handle dynamic irq creation and destruction */ | 470 | /* Handle dynamic irq creation and destruction */ |
326 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); | 471 | extern unsigned int create_irq_nr(unsigned int irq_want, int node); |
327 | extern int create_irq(void); | 472 | extern int create_irq(void); |
@@ -338,14 +483,14 @@ static inline void dynamic_irq_init(unsigned int irq) | |||
338 | } | 483 | } |
339 | 484 | ||
340 | /* Set/get chip/data for an IRQ: */ | 485 | /* Set/get chip/data for an IRQ: */ |
341 | extern int set_irq_chip(unsigned int irq, struct irq_chip *chip); | 486 | extern int irq_set_chip(unsigned int irq, struct irq_chip *chip); |
342 | extern int set_irq_data(unsigned int irq, void *data); | 487 | extern int irq_set_handler_data(unsigned int irq, void *data); |
343 | extern int set_irq_chip_data(unsigned int irq, void *data); | 488 | extern int irq_set_chip_data(unsigned int irq, void *data); |
344 | extern int set_irq_type(unsigned int irq, unsigned int type); | 489 | extern int irq_set_irq_type(unsigned int irq, unsigned int type); |
345 | extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); | 490 | extern int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry); |
346 | extern struct irq_data *irq_get_irq_data(unsigned int irq); | 491 | extern struct irq_data *irq_get_irq_data(unsigned int irq); |
347 | 492 | ||
348 | static inline struct irq_chip *get_irq_chip(unsigned int irq) | 493 | static inline struct irq_chip *irq_get_chip(unsigned int irq) |
349 | { | 494 | { |
350 | struct irq_data *d = irq_get_irq_data(irq); | 495 | struct irq_data *d = irq_get_irq_data(irq); |
351 | return d ? d->chip : NULL; | 496 | return d ? d->chip : NULL; |
@@ -356,7 +501,7 @@ static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d) | |||
356 | return d->chip; | 501 | return d->chip; |
357 | } | 502 | } |
358 | 503 | ||
359 | static inline void *get_irq_chip_data(unsigned int irq) | 504 | static inline void *irq_get_chip_data(unsigned int irq) |
360 | { | 505 | { |
361 | struct irq_data *d = irq_get_irq_data(irq); | 506 | struct irq_data *d = irq_get_irq_data(irq); |
362 | return d ? d->chip_data : NULL; | 507 | return d ? d->chip_data : NULL; |
@@ -367,18 +512,18 @@ static inline void *irq_data_get_irq_chip_data(struct irq_data *d) | |||
367 | return d->chip_data; | 512 | return d->chip_data; |
368 | } | 513 | } |
369 | 514 | ||
370 | static inline void *get_irq_data(unsigned int irq) | 515 | static inline void *irq_get_handler_data(unsigned int irq) |
371 | { | 516 | { |
372 | struct irq_data *d = irq_get_irq_data(irq); | 517 | struct irq_data *d = irq_get_irq_data(irq); |
373 | return d ? d->handler_data : NULL; | 518 | return d ? d->handler_data : NULL; |
374 | } | 519 | } |
375 | 520 | ||
376 | static inline void *irq_data_get_irq_data(struct irq_data *d) | 521 | static inline void *irq_data_get_irq_handler_data(struct irq_data *d) |
377 | { | 522 | { |
378 | return d->handler_data; | 523 | return d->handler_data; |
379 | } | 524 | } |
380 | 525 | ||
381 | static inline struct msi_desc *get_irq_msi(unsigned int irq) | 526 | static inline struct msi_desc *irq_get_msi_desc(unsigned int irq) |
382 | { | 527 | { |
383 | struct irq_data *d = irq_get_irq_data(irq); | 528 | struct irq_data *d = irq_get_irq_data(irq); |
384 | return d ? d->msi_desc : NULL; | 529 | return d ? d->msi_desc : NULL; |
@@ -389,6 +534,89 @@ static inline struct msi_desc *irq_data_get_msi(struct irq_data *d) | |||
389 | return d->msi_desc; | 534 | return d->msi_desc; |
390 | } | 535 | } |
391 | 536 | ||
537 | #ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT | ||
538 | /* Please do not use: Use the replacement functions instead */ | ||
539 | static inline int set_irq_chip(unsigned int irq, struct irq_chip *chip) | ||
540 | { | ||
541 | return irq_set_chip(irq, chip); | ||
542 | } | ||
543 | static inline int set_irq_data(unsigned int irq, void *data) | ||
544 | { | ||
545 | return irq_set_handler_data(irq, data); | ||
546 | } | ||
547 | static inline int set_irq_chip_data(unsigned int irq, void *data) | ||
548 | { | ||
549 | return irq_set_chip_data(irq, data); | ||
550 | } | ||
551 | static inline int set_irq_type(unsigned int irq, unsigned int type) | ||
552 | { | ||
553 | return irq_set_irq_type(irq, type); | ||
554 | } | ||
555 | static inline int set_irq_msi(unsigned int irq, struct msi_desc *entry) | ||
556 | { | ||
557 | return irq_set_msi_desc(irq, entry); | ||
558 | } | ||
559 | static inline struct irq_chip *get_irq_chip(unsigned int irq) | ||
560 | { | ||
561 | return irq_get_chip(irq); | ||
562 | } | ||
563 | static inline void *get_irq_chip_data(unsigned int irq) | ||
564 | { | ||
565 | return irq_get_chip_data(irq); | ||
566 | } | ||
567 | static inline void *get_irq_data(unsigned int irq) | ||
568 | { | ||
569 | return irq_get_handler_data(irq); | ||
570 | } | ||
571 | static inline void *irq_data_get_irq_data(struct irq_data *d) | ||
572 | { | ||
573 | return irq_data_get_irq_handler_data(d); | ||
574 | } | ||
575 | static inline struct msi_desc *get_irq_msi(unsigned int irq) | ||
576 | { | ||
577 | return irq_get_msi_desc(irq); | ||
578 | } | ||
579 | static inline void set_irq_noprobe(unsigned int irq) | ||
580 | { | ||
581 | irq_set_noprobe(irq); | ||
582 | } | ||
583 | static inline void set_irq_probe(unsigned int irq) | ||
584 | { | ||
585 | irq_set_probe(irq); | ||
586 | } | ||
587 | static inline void set_irq_nested_thread(unsigned int irq, int nest) | ||
588 | { | ||
589 | irq_set_nested_thread(irq, nest); | ||
590 | } | ||
591 | static inline void | ||
592 | set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip, | ||
593 | irq_flow_handler_t handle, const char *name) | ||
594 | { | ||
595 | irq_set_chip_and_handler_name(irq, chip, handle, name); | ||
596 | } | ||
597 | static inline void | ||
598 | set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip, | ||
599 | irq_flow_handler_t handle) | ||
600 | { | ||
601 | irq_set_chip_and_handler(irq, chip, handle); | ||
602 | } | ||
603 | static inline void | ||
604 | __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | ||
605 | const char *name) | ||
606 | { | ||
607 | __irq_set_handler(irq, handle, is_chained, name); | ||
608 | } | ||
609 | static inline void set_irq_handler(unsigned int irq, irq_flow_handler_t handle) | ||
610 | { | ||
611 | irq_set_handler(irq, handle); | ||
612 | } | ||
613 | static inline void | ||
614 | set_irq_chained_handler(unsigned int irq, irq_flow_handler_t handle) | ||
615 | { | ||
616 | irq_set_chained_handler(irq, handle); | ||
617 | } | ||
618 | #endif | ||
619 | |||
392 | int irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node); | 620 | int irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node); |
393 | void irq_free_descs(unsigned int irq, unsigned int cnt); | 621 | void irq_free_descs(unsigned int irq, unsigned int cnt); |
394 | int irq_reserve_irqs(unsigned int from, unsigned int cnt); | 622 | int irq_reserve_irqs(unsigned int from, unsigned int cnt); |
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index c1a95b7b58de..00218371518b 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h | |||
@@ -8,6 +8,7 @@ | |||
8 | * For now it's included from <linux/irq.h> | 8 | * For now it's included from <linux/irq.h> |
9 | */ | 9 | */ |
10 | 10 | ||
11 | struct irq_affinity_notify; | ||
11 | struct proc_dir_entry; | 12 | struct proc_dir_entry; |
12 | struct timer_rand_state; | 13 | struct timer_rand_state; |
13 | /** | 14 | /** |
@@ -18,13 +19,16 @@ struct timer_rand_state; | |||
18 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] | 19 | * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] |
19 | * @action: the irq action chain | 20 | * @action: the irq action chain |
20 | * @status: status information | 21 | * @status: status information |
22 | * @core_internal_state__do_not_mess_with_it: core internal status information | ||
21 | * @depth: disable-depth, for nested irq_disable() calls | 23 | * @depth: disable-depth, for nested irq_disable() calls |
22 | * @wake_depth: enable depth, for multiple set_irq_wake() callers | 24 | * @wake_depth: enable depth, for multiple set_irq_wake() callers |
23 | * @irq_count: stats field to detect stalled irqs | 25 | * @irq_count: stats field to detect stalled irqs |
24 | * @last_unhandled: aging timer for unhandled count | 26 | * @last_unhandled: aging timer for unhandled count |
25 | * @irqs_unhandled: stats field for spurious unhandled interrupts | 27 | * @irqs_unhandled: stats field for spurious unhandled interrupts |
26 | * @lock: locking for SMP | 28 | * @lock: locking for SMP |
29 | * @affinity_notify: context for notification of affinity changes | ||
27 | * @pending_mask: pending rebalanced interrupts | 30 | * @pending_mask: pending rebalanced interrupts |
31 | * @threads_oneshot: bitfield to handle shared oneshot threads | ||
28 | * @threads_active: number of irqaction threads currently running | 32 | * @threads_active: number of irqaction threads currently running |
29 | * @wait_for_threads: wait queue for sync_irq to wait for threaded handlers | 33 | * @wait_for_threads: wait queue for sync_irq to wait for threaded handlers |
30 | * @dir: /proc/irq/ procfs entry | 34 | * @dir: /proc/irq/ procfs entry |
@@ -45,6 +49,7 @@ struct irq_desc { | |||
45 | struct { | 49 | struct { |
46 | unsigned int irq; | 50 | unsigned int irq; |
47 | unsigned int node; | 51 | unsigned int node; |
52 | unsigned int pad_do_not_even_think_about_it; | ||
48 | struct irq_chip *chip; | 53 | struct irq_chip *chip; |
49 | void *handler_data; | 54 | void *handler_data; |
50 | void *chip_data; | 55 | void *chip_data; |
@@ -59,9 +64,16 @@ struct irq_desc { | |||
59 | struct timer_rand_state *timer_rand_state; | 64 | struct timer_rand_state *timer_rand_state; |
60 | unsigned int __percpu *kstat_irqs; | 65 | unsigned int __percpu *kstat_irqs; |
61 | irq_flow_handler_t handle_irq; | 66 | irq_flow_handler_t handle_irq; |
67 | #ifdef CONFIG_IRQ_PREFLOW_FASTEOI | ||
68 | irq_preflow_handler_t preflow_handler; | ||
69 | #endif | ||
62 | struct irqaction *action; /* IRQ action list */ | 70 | struct irqaction *action; /* IRQ action list */ |
71 | #ifdef CONFIG_GENERIC_HARDIRQS_NO_COMPAT | ||
72 | unsigned int status_use_accessors; | ||
73 | #else | ||
63 | unsigned int status; /* IRQ status */ | 74 | unsigned int status; /* IRQ status */ |
64 | 75 | #endif | |
76 | unsigned int core_internal_state__do_not_mess_with_it; | ||
65 | unsigned int depth; /* nested irq disables */ | 77 | unsigned int depth; /* nested irq disables */ |
66 | unsigned int wake_depth; /* nested wake enables */ | 78 | unsigned int wake_depth; /* nested wake enables */ |
67 | unsigned int irq_count; /* For detecting broken IRQs */ | 79 | unsigned int irq_count; /* For detecting broken IRQs */ |
@@ -70,10 +82,12 @@ struct irq_desc { | |||
70 | raw_spinlock_t lock; | 82 | raw_spinlock_t lock; |
71 | #ifdef CONFIG_SMP | 83 | #ifdef CONFIG_SMP |
72 | const struct cpumask *affinity_hint; | 84 | const struct cpumask *affinity_hint; |
85 | struct irq_affinity_notify *affinity_notify; | ||
73 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 86 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
74 | cpumask_var_t pending_mask; | 87 | cpumask_var_t pending_mask; |
75 | #endif | 88 | #endif |
76 | #endif | 89 | #endif |
90 | unsigned long threads_oneshot; | ||
77 | atomic_t threads_active; | 91 | atomic_t threads_active; |
78 | wait_queue_head_t wait_for_threads; | 92 | wait_queue_head_t wait_for_threads; |
79 | #ifdef CONFIG_PROC_FS | 93 | #ifdef CONFIG_PROC_FS |
@@ -95,10 +109,51 @@ static inline struct irq_desc *move_irq_desc(struct irq_desc *desc, int node) | |||
95 | 109 | ||
96 | #ifdef CONFIG_GENERIC_HARDIRQS | 110 | #ifdef CONFIG_GENERIC_HARDIRQS |
97 | 111 | ||
98 | #define get_irq_desc_chip(desc) ((desc)->irq_data.chip) | 112 | static inline struct irq_data *irq_desc_get_irq_data(struct irq_desc *desc) |
99 | #define get_irq_desc_chip_data(desc) ((desc)->irq_data.chip_data) | 113 | { |
100 | #define get_irq_desc_data(desc) ((desc)->irq_data.handler_data) | 114 | return &desc->irq_data; |
101 | #define get_irq_desc_msi(desc) ((desc)->irq_data.msi_desc) | 115 | } |
116 | |||
117 | static inline struct irq_chip *irq_desc_get_chip(struct irq_desc *desc) | ||
118 | { | ||
119 | return desc->irq_data.chip; | ||
120 | } | ||
121 | |||
122 | static inline void *irq_desc_get_chip_data(struct irq_desc *desc) | ||
123 | { | ||
124 | return desc->irq_data.chip_data; | ||
125 | } | ||
126 | |||
127 | static inline void *irq_desc_get_handler_data(struct irq_desc *desc) | ||
128 | { | ||
129 | return desc->irq_data.handler_data; | ||
130 | } | ||
131 | |||
132 | static inline struct msi_desc *irq_desc_get_msi_desc(struct irq_desc *desc) | ||
133 | { | ||
134 | return desc->irq_data.msi_desc; | ||
135 | } | ||
136 | |||
137 | #ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT | ||
138 | static inline struct irq_chip *get_irq_desc_chip(struct irq_desc *desc) | ||
139 | { | ||
140 | return irq_desc_get_chip(desc); | ||
141 | } | ||
142 | static inline void *get_irq_desc_data(struct irq_desc *desc) | ||
143 | { | ||
144 | return irq_desc_get_handler_data(desc); | ||
145 | } | ||
146 | |||
147 | static inline void *get_irq_desc_chip_data(struct irq_desc *desc) | ||
148 | { | ||
149 | return irq_desc_get_chip_data(desc); | ||
150 | } | ||
151 | |||
152 | static inline struct msi_desc *get_irq_desc_msi(struct irq_desc *desc) | ||
153 | { | ||
154 | return irq_desc_get_msi_desc(desc); | ||
155 | } | ||
156 | #endif | ||
102 | 157 | ||
103 | /* | 158 | /* |
104 | * Architectures call this to let the generic IRQ layer | 159 | * Architectures call this to let the generic IRQ layer |
@@ -123,6 +178,7 @@ static inline int irq_has_action(unsigned int irq) | |||
123 | return desc->action != NULL; | 178 | return desc->action != NULL; |
124 | } | 179 | } |
125 | 180 | ||
181 | #ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT | ||
126 | static inline int irq_balancing_disabled(unsigned int irq) | 182 | static inline int irq_balancing_disabled(unsigned int irq) |
127 | { | 183 | { |
128 | struct irq_desc *desc; | 184 | struct irq_desc *desc; |
@@ -130,6 +186,7 @@ static inline int irq_balancing_disabled(unsigned int irq) | |||
130 | desc = irq_to_desc(irq); | 186 | desc = irq_to_desc(irq); |
131 | return desc->status & IRQ_NO_BALANCING_MASK; | 187 | return desc->status & IRQ_NO_BALANCING_MASK; |
132 | } | 188 | } |
189 | #endif | ||
133 | 190 | ||
134 | /* caller has locked the irq_desc and both params are valid */ | 191 | /* caller has locked the irq_desc and both params are valid */ |
135 | static inline void __set_irq_handler_unlocked(int irq, | 192 | static inline void __set_irq_handler_unlocked(int irq, |
@@ -140,6 +197,17 @@ static inline void __set_irq_handler_unlocked(int irq, | |||
140 | desc = irq_to_desc(irq); | 197 | desc = irq_to_desc(irq); |
141 | desc->handle_irq = handler; | 198 | desc->handle_irq = handler; |
142 | } | 199 | } |
200 | |||
201 | #ifdef CONFIG_IRQ_PREFLOW_FASTEOI | ||
202 | static inline void | ||
203 | __irq_set_preflow_handler(unsigned int irq, irq_preflow_handler_t handler) | ||
204 | { | ||
205 | struct irq_desc *desc; | ||
206 | |||
207 | desc = irq_to_desc(irq); | ||
208 | desc->preflow_handler = handler; | ||
209 | } | ||
210 | #endif | ||
143 | #endif | 211 | #endif |
144 | 212 | ||
145 | #endif | 213 | #endif |
diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index 6811f4bfc6e7..922aa313c9f9 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h | |||
@@ -307,6 +307,7 @@ extern clock_t jiffies_to_clock_t(long x); | |||
307 | extern unsigned long clock_t_to_jiffies(unsigned long x); | 307 | extern unsigned long clock_t_to_jiffies(unsigned long x); |
308 | extern u64 jiffies_64_to_clock_t(u64 x); | 308 | extern u64 jiffies_64_to_clock_t(u64 x); |
309 | extern u64 nsec_to_clock_t(u64 x); | 309 | extern u64 nsec_to_clock_t(u64 x); |
310 | extern u64 nsecs_to_jiffies64(u64 n); | ||
310 | extern unsigned long nsecs_to_jiffies(u64 n); | 311 | extern unsigned long nsecs_to_jiffies(u64 n); |
311 | 312 | ||
312 | #define TIMESTAMP_SIZE 30 | 313 | #define TIMESTAMP_SIZE 30 |
diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h index 506ad20c18f8..ec2d17bc1f1e 100644 --- a/include/linux/kbd_kern.h +++ b/include/linux/kbd_kern.h | |||
@@ -50,11 +50,12 @@ struct kbd_struct { | |||
50 | #define VC_CAPSLOCK 2 /* capslock mode */ | 50 | #define VC_CAPSLOCK 2 /* capslock mode */ |
51 | #define VC_KANALOCK 3 /* kanalock mode */ | 51 | #define VC_KANALOCK 3 /* kanalock mode */ |
52 | 52 | ||
53 | unsigned char kbdmode:2; /* one 2-bit value */ | 53 | unsigned char kbdmode:3; /* one 3-bit value */ |
54 | #define VC_XLATE 0 /* translate keycodes using keymap */ | 54 | #define VC_XLATE 0 /* translate keycodes using keymap */ |
55 | #define VC_MEDIUMRAW 1 /* medium raw (keycode) mode */ | 55 | #define VC_MEDIUMRAW 1 /* medium raw (keycode) mode */ |
56 | #define VC_RAW 2 /* raw (scancode) mode */ | 56 | #define VC_RAW 2 /* raw (scancode) mode */ |
57 | #define VC_UNICODE 3 /* Unicode mode */ | 57 | #define VC_UNICODE 3 /* Unicode mode */ |
58 | #define VC_OFF 4 /* disabled mode */ | ||
58 | 59 | ||
59 | unsigned char modeflags:5; | 60 | unsigned char modeflags:5; |
60 | #define VC_APPLIC 0 /* application key mode */ | 61 | #define VC_APPLIC 0 /* application key mode */ |
@@ -158,7 +159,7 @@ static inline void con_schedule_flip(struct tty_struct *t) | |||
158 | if (t->buf.tail != NULL) | 159 | if (t->buf.tail != NULL) |
159 | t->buf.tail->commit = t->buf.tail->used; | 160 | t->buf.tail->commit = t->buf.tail->used; |
160 | spin_unlock_irqrestore(&t->buf.lock, flags); | 161 | spin_unlock_irqrestore(&t->buf.lock, flags); |
161 | schedule_delayed_work(&t->buf.work, 0); | 162 | schedule_work(&t->buf.work); |
162 | } | 163 | } |
163 | 164 | ||
164 | #endif | 165 | #endif |
diff --git a/include/linux/kd.h b/include/linux/kd.h index 15f2853ea58f..c36d8476db55 100644 --- a/include/linux/kd.h +++ b/include/linux/kd.h | |||
@@ -81,6 +81,7 @@ struct unimapinit { | |||
81 | #define K_XLATE 0x01 | 81 | #define K_XLATE 0x01 |
82 | #define K_MEDIUMRAW 0x02 | 82 | #define K_MEDIUMRAW 0x02 |
83 | #define K_UNICODE 0x03 | 83 | #define K_UNICODE 0x03 |
84 | #define K_OFF 0x04 | ||
84 | #define KDGKBMODE 0x4B44 /* gets current keyboard mode */ | 85 | #define KDGKBMODE 0x4B44 /* gets current keyboard mode */ |
85 | #define KDSKBMODE 0x4B45 /* sets current keyboard mode */ | 86 | #define KDSKBMODE 0x4B45 /* sets current keyboard mode */ |
86 | 87 | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 2fe6e84894a4..00cec4dc0ae2 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -187,14 +187,76 @@ NORET_TYPE void do_exit(long error_code) | |||
187 | ATTRIB_NORET; | 187 | ATTRIB_NORET; |
188 | NORET_TYPE void complete_and_exit(struct completion *, long) | 188 | NORET_TYPE void complete_and_exit(struct completion *, long) |
189 | ATTRIB_NORET; | 189 | ATTRIB_NORET; |
190 | |||
191 | /* Internal, do not use. */ | ||
192 | int __must_check _kstrtoul(const char *s, unsigned int base, unsigned long *res); | ||
193 | int __must_check _kstrtol(const char *s, unsigned int base, long *res); | ||
194 | |||
195 | int __must_check kstrtoull(const char *s, unsigned int base, unsigned long long *res); | ||
196 | int __must_check kstrtoll(const char *s, unsigned int base, long long *res); | ||
197 | static inline int __must_check kstrtoul(const char *s, unsigned int base, unsigned long *res) | ||
198 | { | ||
199 | /* | ||
200 | * We want to shortcut function call, but | ||
201 | * __builtin_types_compatible_p(unsigned long, unsigned long long) = 0. | ||
202 | */ | ||
203 | if (sizeof(unsigned long) == sizeof(unsigned long long) && | ||
204 | __alignof__(unsigned long) == __alignof__(unsigned long long)) | ||
205 | return kstrtoull(s, base, (unsigned long long *)res); | ||
206 | else | ||
207 | return _kstrtoul(s, base, res); | ||
208 | } | ||
209 | |||
210 | static inline int __must_check kstrtol(const char *s, unsigned int base, long *res) | ||
211 | { | ||
212 | /* | ||
213 | * We want to shortcut function call, but | ||
214 | * __builtin_types_compatible_p(long, long long) = 0. | ||
215 | */ | ||
216 | if (sizeof(long) == sizeof(long long) && | ||
217 | __alignof__(long) == __alignof__(long long)) | ||
218 | return kstrtoll(s, base, (long long *)res); | ||
219 | else | ||
220 | return _kstrtol(s, base, res); | ||
221 | } | ||
222 | |||
223 | int __must_check kstrtouint(const char *s, unsigned int base, unsigned int *res); | ||
224 | int __must_check kstrtoint(const char *s, unsigned int base, int *res); | ||
225 | |||
226 | static inline int __must_check kstrtou64(const char *s, unsigned int base, u64 *res) | ||
227 | { | ||
228 | return kstrtoull(s, base, res); | ||
229 | } | ||
230 | |||
231 | static inline int __must_check kstrtos64(const char *s, unsigned int base, s64 *res) | ||
232 | { | ||
233 | return kstrtoll(s, base, res); | ||
234 | } | ||
235 | |||
236 | static inline int __must_check kstrtou32(const char *s, unsigned int base, u32 *res) | ||
237 | { | ||
238 | return kstrtouint(s, base, res); | ||
239 | } | ||
240 | |||
241 | static inline int __must_check kstrtos32(const char *s, unsigned int base, s32 *res) | ||
242 | { | ||
243 | return kstrtoint(s, base, res); | ||
244 | } | ||
245 | |||
246 | int __must_check kstrtou16(const char *s, unsigned int base, u16 *res); | ||
247 | int __must_check kstrtos16(const char *s, unsigned int base, s16 *res); | ||
248 | int __must_check kstrtou8(const char *s, unsigned int base, u8 *res); | ||
249 | int __must_check kstrtos8(const char *s, unsigned int base, s8 *res); | ||
250 | |||
190 | extern unsigned long simple_strtoul(const char *,char **,unsigned int); | 251 | extern unsigned long simple_strtoul(const char *,char **,unsigned int); |
191 | extern long simple_strtol(const char *,char **,unsigned int); | 252 | extern long simple_strtol(const char *,char **,unsigned int); |
192 | extern unsigned long long simple_strtoull(const char *,char **,unsigned int); | 253 | extern unsigned long long simple_strtoull(const char *,char **,unsigned int); |
193 | extern long long simple_strtoll(const char *,char **,unsigned int); | 254 | extern long long simple_strtoll(const char *,char **,unsigned int); |
194 | extern int __must_check strict_strtoul(const char *, unsigned int, unsigned long *); | 255 | #define strict_strtoul kstrtoul |
195 | extern int __must_check strict_strtol(const char *, unsigned int, long *); | 256 | #define strict_strtol kstrtol |
196 | extern int __must_check strict_strtoull(const char *, unsigned int, unsigned long long *); | 257 | #define strict_strtoull kstrtoull |
197 | extern int __must_check strict_strtoll(const char *, unsigned int, long long *); | 258 | #define strict_strtoll kstrtoll |
259 | |||
198 | extern int sprintf(char * buf, const char * fmt, ...) | 260 | extern int sprintf(char * buf, const char * fmt, ...) |
199 | __attribute__ ((format (printf, 2, 3))); | 261 | __attribute__ ((format (printf, 2, 3))); |
200 | extern int vsprintf(char *buf, const char *, va_list) | 262 | extern int vsprintf(char *buf, const char *, va_list) |
diff --git a/include/linux/key-type.h b/include/linux/key-type.h index 65833d4d5998..9efd081bb31e 100644 --- a/include/linux/key-type.h +++ b/include/linux/key-type.h | |||
@@ -41,6 +41,9 @@ struct key_type { | |||
41 | */ | 41 | */ |
42 | size_t def_datalen; | 42 | size_t def_datalen; |
43 | 43 | ||
44 | /* vet a description */ | ||
45 | int (*vet_description)(const char *description); | ||
46 | |||
44 | /* instantiate a key of this type | 47 | /* instantiate a key of this type |
45 | * - this method should call key_payload_reserve() to determine if the | 48 | * - this method should call key_payload_reserve() to determine if the |
46 | * user's quota will hold the payload | 49 | * user's quota will hold the payload |
@@ -102,11 +105,20 @@ extern int key_instantiate_and_link(struct key *key, | |||
102 | size_t datalen, | 105 | size_t datalen, |
103 | struct key *keyring, | 106 | struct key *keyring, |
104 | struct key *instkey); | 107 | struct key *instkey); |
105 | extern int key_negate_and_link(struct key *key, | 108 | extern int key_reject_and_link(struct key *key, |
106 | unsigned timeout, | 109 | unsigned timeout, |
110 | unsigned error, | ||
107 | struct key *keyring, | 111 | struct key *keyring, |
108 | struct key *instkey); | 112 | struct key *instkey); |
109 | extern void complete_request_key(struct key_construction *cons, int error); | 113 | extern void complete_request_key(struct key_construction *cons, int error); |
110 | 114 | ||
115 | static inline int key_negate_and_link(struct key *key, | ||
116 | unsigned timeout, | ||
117 | struct key *keyring, | ||
118 | struct key *instkey) | ||
119 | { | ||
120 | return key_reject_and_link(key, timeout, ENOKEY, keyring, instkey); | ||
121 | } | ||
122 | |||
111 | #endif /* CONFIG_KEYS */ | 123 | #endif /* CONFIG_KEYS */ |
112 | #endif /* _LINUX_KEY_TYPE_H */ | 124 | #endif /* _LINUX_KEY_TYPE_H */ |
diff --git a/include/linux/key.h b/include/linux/key.h index 3db0adce1fda..b2bb01719561 100644 --- a/include/linux/key.h +++ b/include/linux/key.h | |||
@@ -170,6 +170,7 @@ struct key { | |||
170 | struct list_head link; | 170 | struct list_head link; |
171 | unsigned long x[2]; | 171 | unsigned long x[2]; |
172 | void *p[2]; | 172 | void *p[2]; |
173 | int reject_error; | ||
173 | } type_data; | 174 | } type_data; |
174 | 175 | ||
175 | /* key data | 176 | /* key data |
@@ -275,6 +276,10 @@ static inline key_serial_t key_serial(struct key *key) | |||
275 | return key ? key->serial : 0; | 276 | return key ? key->serial : 0; |
276 | } | 277 | } |
277 | 278 | ||
279 | #define rcu_dereference_key(KEY) \ | ||
280 | (rcu_dereference_protected((KEY)->payload.rcudata, \ | ||
281 | rwsem_is_locked(&((struct key *)(KEY))->sem))) | ||
282 | |||
278 | #ifdef CONFIG_SYSCTL | 283 | #ifdef CONFIG_SYSCTL |
279 | extern ctl_table key_sysctls[]; | 284 | extern ctl_table key_sysctls[]; |
280 | #endif | 285 | #endif |
diff --git a/include/linux/keyctl.h b/include/linux/keyctl.h index bd383f1944fb..9b0b865ce622 100644 --- a/include/linux/keyctl.h +++ b/include/linux/keyctl.h | |||
@@ -53,5 +53,7 @@ | |||
53 | #define KEYCTL_ASSUME_AUTHORITY 16 /* assume request_key() authorisation */ | 53 | #define KEYCTL_ASSUME_AUTHORITY 16 /* assume request_key() authorisation */ |
54 | #define KEYCTL_GET_SECURITY 17 /* get key security label */ | 54 | #define KEYCTL_GET_SECURITY 17 /* get key security label */ |
55 | #define KEYCTL_SESSION_TO_PARENT 18 /* apply session keyring to parent process */ | 55 | #define KEYCTL_SESSION_TO_PARENT 18 /* apply session keyring to parent process */ |
56 | #define KEYCTL_REJECT 19 /* reject a partially constructed key */ | ||
57 | #define KEYCTL_INSTANTIATE_IOV 20 /* instantiate a partially constructed key */ | ||
56 | 58 | ||
57 | #endif /* _LINUX_KEYCTL_H */ | 59 | #endif /* _LINUX_KEYCTL_H */ |
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 8f6d12151048..9229b64ee3aa 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
@@ -85,11 +85,13 @@ static inline const char *kobject_name(const struct kobject *kobj) | |||
85 | extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype); | 85 | extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype); |
86 | extern int __must_check kobject_add(struct kobject *kobj, | 86 | extern int __must_check kobject_add(struct kobject *kobj, |
87 | struct kobject *parent, | 87 | struct kobject *parent, |
88 | const char *fmt, ...); | 88 | const char *fmt, ...) |
89 | __attribute__((format(printf, 3, 4))); | ||
89 | extern int __must_check kobject_init_and_add(struct kobject *kobj, | 90 | extern int __must_check kobject_init_and_add(struct kobject *kobj, |
90 | struct kobj_type *ktype, | 91 | struct kobj_type *ktype, |
91 | struct kobject *parent, | 92 | struct kobject *parent, |
92 | const char *fmt, ...); | 93 | const char *fmt, ...) |
94 | __attribute__((format(printf, 4, 5))); | ||
93 | 95 | ||
94 | extern void kobject_del(struct kobject *kobj); | 96 | extern void kobject_del(struct kobject *kobj); |
95 | 97 | ||
@@ -224,8 +226,8 @@ static inline int kobject_uevent_env(struct kobject *kobj, | |||
224 | char *envp[]) | 226 | char *envp[]) |
225 | { return 0; } | 227 | { return 0; } |
226 | 228 | ||
227 | static inline int add_uevent_var(struct kobj_uevent_env *env, | 229 | static inline __attribute__((format(printf, 2, 3))) |
228 | const char *format, ...) | 230 | int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) |
229 | { return 0; } | 231 | { return 0; } |
230 | 232 | ||
231 | static inline int kobject_action_type(const char *buf, size_t count, | 233 | static inline int kobject_action_type(const char *buf, size_t count, |
diff --git a/include/linux/kthread.h b/include/linux/kthread.h index ce0775aa64c3..1e923e5e88e8 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h | |||
@@ -4,10 +4,15 @@ | |||
4 | #include <linux/err.h> | 4 | #include <linux/err.h> |
5 | #include <linux/sched.h> | 5 | #include <linux/sched.h> |
6 | 6 | ||
7 | struct task_struct *kthread_create(int (*threadfn)(void *data), | 7 | struct task_struct *kthread_create_on_node(int (*threadfn)(void *data), |
8 | void *data, | 8 | void *data, |
9 | const char namefmt[], ...) | 9 | int node, |
10 | __attribute__((format(printf, 3, 4))); | 10 | const char namefmt[], ...) |
11 | __attribute__((format(printf, 4, 5))); | ||
12 | |||
13 | #define kthread_create(threadfn, data, namefmt, arg...) \ | ||
14 | kthread_create_on_node(threadfn, data, -1, namefmt, ##arg) | ||
15 | |||
11 | 16 | ||
12 | /** | 17 | /** |
13 | * kthread_run - create and wake a thread. | 18 | * kthread_run - create and wake a thread. |
@@ -34,6 +39,7 @@ void *kthread_data(struct task_struct *k); | |||
34 | 39 | ||
35 | int kthreadd(void *unused); | 40 | int kthreadd(void *unused); |
36 | extern struct task_struct *kthreadd_task; | 41 | extern struct task_struct *kthreadd_task; |
42 | extern int tsk_fork_get_node(struct task_struct *tsk); | ||
37 | 43 | ||
38 | /* | 44 | /* |
39 | * Simple work processor based on kthread. | 45 | * Simple work processor based on kthread. |
@@ -64,7 +70,7 @@ struct kthread_work { | |||
64 | }; | 70 | }; |
65 | 71 | ||
66 | #define KTHREAD_WORKER_INIT(worker) { \ | 72 | #define KTHREAD_WORKER_INIT(worker) { \ |
67 | .lock = SPIN_LOCK_UNLOCKED, \ | 73 | .lock = __SPIN_LOCK_UNLOCKED((worker).lock), \ |
68 | .work_list = LIST_HEAD_INIT((worker).work_list), \ | 74 | .work_list = LIST_HEAD_INIT((worker).work_list), \ |
69 | } | 75 | } |
70 | 76 | ||
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b5021db21858..ab428552af8e 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -43,6 +43,7 @@ | |||
43 | #define KVM_REQ_DEACTIVATE_FPU 10 | 43 | #define KVM_REQ_DEACTIVATE_FPU 10 |
44 | #define KVM_REQ_EVENT 11 | 44 | #define KVM_REQ_EVENT 11 |
45 | #define KVM_REQ_APF_HALT 12 | 45 | #define KVM_REQ_APF_HALT 12 |
46 | #define KVM_REQ_NMI 13 | ||
46 | 47 | ||
47 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 | 48 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 |
48 | 49 | ||
@@ -98,23 +99,31 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn, | |||
98 | int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); | 99 | int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); |
99 | #endif | 100 | #endif |
100 | 101 | ||
102 | enum { | ||
103 | OUTSIDE_GUEST_MODE, | ||
104 | IN_GUEST_MODE, | ||
105 | EXITING_GUEST_MODE | ||
106 | }; | ||
107 | |||
101 | struct kvm_vcpu { | 108 | struct kvm_vcpu { |
102 | struct kvm *kvm; | 109 | struct kvm *kvm; |
103 | #ifdef CONFIG_PREEMPT_NOTIFIERS | 110 | #ifdef CONFIG_PREEMPT_NOTIFIERS |
104 | struct preempt_notifier preempt_notifier; | 111 | struct preempt_notifier preempt_notifier; |
105 | #endif | 112 | #endif |
113 | int cpu; | ||
106 | int vcpu_id; | 114 | int vcpu_id; |
107 | struct mutex mutex; | 115 | int srcu_idx; |
108 | int cpu; | 116 | int mode; |
109 | atomic_t guest_mode; | ||
110 | struct kvm_run *run; | ||
111 | unsigned long requests; | 117 | unsigned long requests; |
112 | unsigned long guest_debug; | 118 | unsigned long guest_debug; |
113 | int srcu_idx; | 119 | |
120 | struct mutex mutex; | ||
121 | struct kvm_run *run; | ||
114 | 122 | ||
115 | int fpu_active; | 123 | int fpu_active; |
116 | int guest_fpu_loaded, guest_xcr0_loaded; | 124 | int guest_fpu_loaded, guest_xcr0_loaded; |
117 | wait_queue_head_t wq; | 125 | wait_queue_head_t wq; |
126 | struct pid *pid; | ||
118 | int sigset_active; | 127 | int sigset_active; |
119 | sigset_t sigset; | 128 | sigset_t sigset; |
120 | struct kvm_vcpu_stat stat; | 129 | struct kvm_vcpu_stat stat; |
@@ -140,6 +149,11 @@ struct kvm_vcpu { | |||
140 | struct kvm_vcpu_arch arch; | 149 | struct kvm_vcpu_arch arch; |
141 | }; | 150 | }; |
142 | 151 | ||
152 | static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu) | ||
153 | { | ||
154 | return cmpxchg(&vcpu->mode, IN_GUEST_MODE, EXITING_GUEST_MODE); | ||
155 | } | ||
156 | |||
143 | /* | 157 | /* |
144 | * Some of the bitops functions do not support too long bitmaps. | 158 | * Some of the bitops functions do not support too long bitmaps. |
145 | * This number must be determined not to exceed such limits. | 159 | * This number must be determined not to exceed such limits. |
@@ -212,7 +226,6 @@ struct kvm_memslots { | |||
212 | 226 | ||
213 | struct kvm { | 227 | struct kvm { |
214 | spinlock_t mmu_lock; | 228 | spinlock_t mmu_lock; |
215 | raw_spinlock_t requests_lock; | ||
216 | struct mutex slots_lock; | 229 | struct mutex slots_lock; |
217 | struct mm_struct *mm; /* userspace tied to this vm */ | 230 | struct mm_struct *mm; /* userspace tied to this vm */ |
218 | struct kvm_memslots *memslots; | 231 | struct kvm_memslots *memslots; |
@@ -223,6 +236,7 @@ struct kvm { | |||
223 | #endif | 236 | #endif |
224 | struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; | 237 | struct kvm_vcpu *vcpus[KVM_MAX_VCPUS]; |
225 | atomic_t online_vcpus; | 238 | atomic_t online_vcpus; |
239 | int last_boosted_vcpu; | ||
226 | struct list_head vm_list; | 240 | struct list_head vm_list; |
227 | struct mutex lock; | 241 | struct mutex lock; |
228 | struct kvm_io_bus *buses[KVM_NR_BUSES]; | 242 | struct kvm_io_bus *buses[KVM_NR_BUSES]; |
@@ -719,11 +733,6 @@ static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu) | |||
719 | set_bit(req, &vcpu->requests); | 733 | set_bit(req, &vcpu->requests); |
720 | } | 734 | } |
721 | 735 | ||
722 | static inline bool kvm_make_check_request(int req, struct kvm_vcpu *vcpu) | ||
723 | { | ||
724 | return test_and_set_bit(req, &vcpu->requests); | ||
725 | } | ||
726 | |||
727 | static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu) | 736 | static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu) |
728 | { | 737 | { |
729 | if (test_bit(req, &vcpu->requests)) { | 738 | if (test_bit(req, &vcpu->requests)) { |
diff --git a/include/linux/led-lm3530.h b/include/linux/led-lm3530.h new file mode 100644 index 000000000000..bb69d20da0dc --- /dev/null +++ b/include/linux/led-lm3530.h | |||
@@ -0,0 +1,107 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 ST-Ericsson SA. | ||
3 | * Copyright (C) 2009 Motorola, Inc. | ||
4 | * | ||
5 | * License Terms: GNU General Public License v2 | ||
6 | * | ||
7 | * Simple driver for National Semiconductor LM35330 Backlight driver chip | ||
8 | * | ||
9 | * Author: Shreshtha Kumar SAHU <shreshthakumar.sahu@stericsson.com> | ||
10 | * based on leds-lm3530.c by Dan Murphy <D.Murphy@motorola.com> | ||
11 | */ | ||
12 | |||
13 | #ifndef _LINUX_LED_LM3530_H__ | ||
14 | #define _LINUX_LED_LM3530_H__ | ||
15 | |||
16 | #define LM3530_FS_CURR_5mA (0) /* Full Scale Current */ | ||
17 | #define LM3530_FS_CURR_8mA (1) | ||
18 | #define LM3530_FS_CURR_12mA (2) | ||
19 | #define LM3530_FS_CURR_15mA (3) | ||
20 | #define LM3530_FS_CURR_19mA (4) | ||
21 | #define LM3530_FS_CURR_22mA (5) | ||
22 | #define LM3530_FS_CURR_26mA (6) | ||
23 | #define LM3530_FS_CURR_29mA (7) | ||
24 | |||
25 | #define LM3530_ALS_AVRG_TIME_32ms (0) /* ALS Averaging Time */ | ||
26 | #define LM3530_ALS_AVRG_TIME_64ms (1) | ||
27 | #define LM3530_ALS_AVRG_TIME_128ms (2) | ||
28 | #define LM3530_ALS_AVRG_TIME_256ms (3) | ||
29 | #define LM3530_ALS_AVRG_TIME_512ms (4) | ||
30 | #define LM3530_ALS_AVRG_TIME_1024ms (5) | ||
31 | #define LM3530_ALS_AVRG_TIME_2048ms (6) | ||
32 | #define LM3530_ALS_AVRG_TIME_4096ms (7) | ||
33 | |||
34 | #define LM3530_RAMP_TIME_1ms (0) /* Brigtness Ramp Time */ | ||
35 | #define LM3530_RAMP_TIME_130ms (1) /* Max to 0 and vice versa */ | ||
36 | #define LM3530_RAMP_TIME_260ms (2) | ||
37 | #define LM3530_RAMP_TIME_520ms (3) | ||
38 | #define LM3530_RAMP_TIME_1s (4) | ||
39 | #define LM3530_RAMP_TIME_2s (5) | ||
40 | #define LM3530_RAMP_TIME_4s (6) | ||
41 | #define LM3530_RAMP_TIME_8s (7) | ||
42 | |||
43 | /* ALS Resistor Select */ | ||
44 | #define LM3530_ALS_IMPD_Z (0x00) /* ALS Impedence */ | ||
45 | #define LM3530_ALS_IMPD_13_53kOhm (0x01) | ||
46 | #define LM3530_ALS_IMPD_9_01kOhm (0x02) | ||
47 | #define LM3530_ALS_IMPD_5_41kOhm (0x03) | ||
48 | #define LM3530_ALS_IMPD_2_27kOhm (0x04) | ||
49 | #define LM3530_ALS_IMPD_1_94kOhm (0x05) | ||
50 | #define LM3530_ALS_IMPD_1_81kOhm (0x06) | ||
51 | #define LM3530_ALS_IMPD_1_6kOhm (0x07) | ||
52 | #define LM3530_ALS_IMPD_1_138kOhm (0x08) | ||
53 | #define LM3530_ALS_IMPD_1_05kOhm (0x09) | ||
54 | #define LM3530_ALS_IMPD_1_011kOhm (0x0A) | ||
55 | #define LM3530_ALS_IMPD_941Ohm (0x0B) | ||
56 | #define LM3530_ALS_IMPD_759Ohm (0x0C) | ||
57 | #define LM3530_ALS_IMPD_719Ohm (0x0D) | ||
58 | #define LM3530_ALS_IMPD_700Ohm (0x0E) | ||
59 | #define LM3530_ALS_IMPD_667Ohm (0x0F) | ||
60 | |||
61 | enum lm3530_mode { | ||
62 | LM3530_BL_MODE_MANUAL = 0, /* "man" */ | ||
63 | LM3530_BL_MODE_ALS, /* "als" */ | ||
64 | LM3530_BL_MODE_PWM, /* "pwm" */ | ||
65 | }; | ||
66 | |||
67 | /* ALS input select */ | ||
68 | enum lm3530_als_mode { | ||
69 | LM3530_INPUT_AVRG = 0, /* ALS1 and ALS2 input average */ | ||
70 | LM3530_INPUT_ALS1, /* ALS1 Input */ | ||
71 | LM3530_INPUT_ALS2, /* ALS2 Input */ | ||
72 | LM3530_INPUT_CEIL, /* Max of ALS1 and ALS2 */ | ||
73 | }; | ||
74 | |||
75 | /** | ||
76 | * struct lm3530_platform_data | ||
77 | * @mode: mode of operation i.e. Manual, ALS or PWM | ||
78 | * @als_input_mode: select source of ALS input - ALS1/2 or average | ||
79 | * @max_current: full scale LED current | ||
80 | * @pwm_pol_hi: PWM input polarity - active high/active low | ||
81 | * @als_avrg_time: ALS input averaging time | ||
82 | * @brt_ramp_law: brightness mapping mode - exponential/linear | ||
83 | * @brt_ramp_fall: rate of fall of led current | ||
84 | * @brt_ramp_rise: rate of rise of led current | ||
85 | * @als1_resistor_sel: internal resistance from ALS1 input to ground | ||
86 | * @als2_resistor_sel: internal resistance from ALS2 input to ground | ||
87 | * @brt_val: brightness value (0-255) | ||
88 | */ | ||
89 | struct lm3530_platform_data { | ||
90 | enum lm3530_mode mode; | ||
91 | enum lm3530_als_mode als_input_mode; | ||
92 | |||
93 | u8 max_current; | ||
94 | bool pwm_pol_hi; | ||
95 | u8 als_avrg_time; | ||
96 | |||
97 | bool brt_ramp_law; | ||
98 | u8 brt_ramp_fall; | ||
99 | u8 brt_ramp_rise; | ||
100 | |||
101 | u8 als1_resistor_sel; | ||
102 | u8 als2_resistor_sel; | ||
103 | |||
104 | u8 brt_val; | ||
105 | }; | ||
106 | |||
107 | #endif /* _LINUX_LED_LM3530_H__ */ | ||
diff --git a/include/linux/leds.h b/include/linux/leds.h index 0f19df9e37b0..383811d9af83 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h | |||
@@ -194,11 +194,11 @@ struct gpio_led { | |||
194 | 194 | ||
195 | struct gpio_led_platform_data { | 195 | struct gpio_led_platform_data { |
196 | int num_leds; | 196 | int num_leds; |
197 | struct gpio_led *leds; | 197 | const struct gpio_led *leds; |
198 | 198 | ||
199 | #define GPIO_LED_NO_BLINK_LOW 0 /* No blink GPIO state low */ | 199 | #define GPIO_LED_NO_BLINK_LOW 0 /* No blink GPIO state low */ |
200 | #define GPIO_LED_NO_BLINK_HIGH 1 /* No blink GPIO state high */ | 200 | #define GPIO_LED_NO_BLINK_HIGH 1 /* No blink GPIO state high */ |
201 | #define GPIO_LED_BLINK 2 /* Plase, blink */ | 201 | #define GPIO_LED_BLINK 2 /* Please, blink */ |
202 | int (*gpio_blink_set)(unsigned gpio, int state, | 202 | int (*gpio_blink_set)(unsigned gpio, int state, |
203 | unsigned long *delay_on, | 203 | unsigned long *delay_on, |
204 | unsigned long *delay_off); | 204 | unsigned long *delay_off); |
diff --git a/include/linux/libata.h b/include/linux/libata.h index c9c5d7ad1a2b..c71f46960f39 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -179,10 +179,6 @@ enum { | |||
179 | ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ | 179 | ATA_FLAG_SLAVE_POSS = (1 << 0), /* host supports slave dev */ |
180 | /* (doesn't imply presence) */ | 180 | /* (doesn't imply presence) */ |
181 | ATA_FLAG_SATA = (1 << 1), | 181 | ATA_FLAG_SATA = (1 << 1), |
182 | ATA_FLAG_NO_LEGACY = (1 << 2), /* no legacy mode check */ | ||
183 | ATA_FLAG_MMIO = (1 << 3), /* use MMIO, not PIO */ | ||
184 | ATA_FLAG_SRST = (1 << 4), /* (obsolete) use ATA SRST, not E.D.D. */ | ||
185 | ATA_FLAG_SATA_RESET = (1 << 5), /* (obsolete) use COMRESET */ | ||
186 | ATA_FLAG_NO_ATAPI = (1 << 6), /* No ATAPI support */ | 182 | ATA_FLAG_NO_ATAPI = (1 << 6), /* No ATAPI support */ |
187 | ATA_FLAG_PIO_DMA = (1 << 7), /* PIO cmds via DMA */ | 183 | ATA_FLAG_PIO_DMA = (1 << 7), /* PIO cmds via DMA */ |
188 | ATA_FLAG_PIO_LBA48 = (1 << 8), /* Host DMA engine is LBA28 only */ | 184 | ATA_FLAG_PIO_LBA48 = (1 << 8), /* Host DMA engine is LBA28 only */ |
@@ -198,7 +194,6 @@ enum { | |||
198 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ | 194 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ |
199 | ATA_FLAG_AN = (1 << 18), /* controller supports AN */ | 195 | ATA_FLAG_AN = (1 << 18), /* controller supports AN */ |
200 | ATA_FLAG_PMP = (1 << 19), /* controller supports PMP */ | 196 | ATA_FLAG_PMP = (1 << 19), /* controller supports PMP */ |
201 | ATA_FLAG_LPM = (1 << 20), /* driver can handle LPM */ | ||
202 | ATA_FLAG_EM = (1 << 21), /* driver supports enclosure | 197 | ATA_FLAG_EM = (1 << 21), /* driver supports enclosure |
203 | * management */ | 198 | * management */ |
204 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity | 199 | ATA_FLAG_SW_ACTIVITY = (1 << 22), /* driver supports sw activity |
@@ -1050,6 +1045,8 @@ extern int ata_scsi_change_queue_depth(struct scsi_device *sdev, | |||
1050 | int queue_depth, int reason); | 1045 | int queue_depth, int reason); |
1051 | extern struct ata_device *ata_dev_pair(struct ata_device *adev); | 1046 | extern struct ata_device *ata_dev_pair(struct ata_device *adev); |
1052 | extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev); | 1047 | extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev); |
1048 | extern void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap); | ||
1049 | extern void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *ap, struct list_head *eh_q); | ||
1053 | 1050 | ||
1054 | extern int ata_cable_40wire(struct ata_port *ap); | 1051 | extern int ata_cable_40wire(struct ata_port *ap); |
1055 | extern int ata_cable_80wire(struct ata_port *ap); | 1052 | extern int ata_cable_80wire(struct ata_port *ap); |
@@ -1613,6 +1610,9 @@ extern void ata_sff_irq_on(struct ata_port *ap); | |||
1613 | extern void ata_sff_irq_clear(struct ata_port *ap); | 1610 | extern void ata_sff_irq_clear(struct ata_port *ap); |
1614 | extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, | 1611 | extern int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, |
1615 | u8 status, int in_wq); | 1612 | u8 status, int in_wq); |
1613 | extern void ata_sff_queue_work(struct work_struct *work); | ||
1614 | extern void ata_sff_queue_delayed_work(struct delayed_work *dwork, | ||
1615 | unsigned long delay); | ||
1616 | extern void ata_sff_queue_pio_task(struct ata_link *link, unsigned long delay); | 1616 | extern void ata_sff_queue_pio_task(struct ata_link *link, unsigned long delay); |
1617 | extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc); | 1617 | extern unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc); |
1618 | extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc); | 1618 | extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc); |
diff --git a/include/linux/magic.h b/include/linux/magic.h index 62730ea2b56e..1e5df2af8d84 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h | |||
@@ -23,10 +23,12 @@ | |||
23 | #define XENFS_SUPER_MAGIC 0xabba1974 | 23 | #define XENFS_SUPER_MAGIC 0xabba1974 |
24 | #define EXT4_SUPER_MAGIC 0xEF53 | 24 | #define EXT4_SUPER_MAGIC 0xEF53 |
25 | #define BTRFS_SUPER_MAGIC 0x9123683E | 25 | #define BTRFS_SUPER_MAGIC 0x9123683E |
26 | #define NILFS_SUPER_MAGIC 0x3434 | ||
26 | #define HPFS_SUPER_MAGIC 0xf995e849 | 27 | #define HPFS_SUPER_MAGIC 0xf995e849 |
27 | #define ISOFS_SUPER_MAGIC 0x9660 | 28 | #define ISOFS_SUPER_MAGIC 0x9660 |
28 | #define JFFS2_SUPER_MAGIC 0x72b6 | 29 | #define JFFS2_SUPER_MAGIC 0x72b6 |
29 | #define ANON_INODE_FS_MAGIC 0x09041934 | 30 | #define ANON_INODE_FS_MAGIC 0x09041934 |
31 | #define PSTOREFS_MAGIC 0x6165676C | ||
30 | 32 | ||
31 | #define MINIX_SUPER_MAGIC 0x137F /* original minix fs */ | 33 | #define MINIX_SUPER_MAGIC 0x137F /* original minix fs */ |
32 | #define MINIX_SUPER_MAGIC2 0x138F /* minix fs, 30 char names */ | 34 | #define MINIX_SUPER_MAGIC2 0x138F /* minix fs, 30 char names */ |
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index f512e189be5a..5bb7be2628ca 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
@@ -62,6 +62,7 @@ extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, | |||
62 | gfp_t gfp_mask); | 62 | gfp_t gfp_mask); |
63 | extern void mem_cgroup_add_lru_list(struct page *page, enum lru_list lru); | 63 | extern void mem_cgroup_add_lru_list(struct page *page, enum lru_list lru); |
64 | extern void mem_cgroup_del_lru_list(struct page *page, enum lru_list lru); | 64 | extern void mem_cgroup_del_lru_list(struct page *page, enum lru_list lru); |
65 | extern void mem_cgroup_rotate_reclaimable_page(struct page *page); | ||
65 | extern void mem_cgroup_rotate_lru_list(struct page *page, enum lru_list lru); | 66 | extern void mem_cgroup_rotate_lru_list(struct page *page, enum lru_list lru); |
66 | extern void mem_cgroup_del_lru(struct page *page); | 67 | extern void mem_cgroup_del_lru(struct page *page); |
67 | extern void mem_cgroup_move_lists(struct page *page, | 68 | extern void mem_cgroup_move_lists(struct page *page, |
@@ -96,7 +97,7 @@ extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem); | |||
96 | 97 | ||
97 | extern int | 98 | extern int |
98 | mem_cgroup_prepare_migration(struct page *page, | 99 | mem_cgroup_prepare_migration(struct page *page, |
99 | struct page *newpage, struct mem_cgroup **ptr); | 100 | struct page *newpage, struct mem_cgroup **ptr, gfp_t gfp_mask); |
100 | extern void mem_cgroup_end_migration(struct mem_cgroup *mem, | 101 | extern void mem_cgroup_end_migration(struct mem_cgroup *mem, |
101 | struct page *oldpage, struct page *newpage, bool migration_ok); | 102 | struct page *oldpage, struct page *newpage, bool migration_ok); |
102 | 103 | ||
@@ -211,6 +212,11 @@ static inline void mem_cgroup_del_lru_list(struct page *page, int lru) | |||
211 | return ; | 212 | return ; |
212 | } | 213 | } |
213 | 214 | ||
215 | static inline inline void mem_cgroup_rotate_reclaimable_page(struct page *page) | ||
216 | { | ||
217 | return ; | ||
218 | } | ||
219 | |||
214 | static inline void mem_cgroup_rotate_lru_list(struct page *page, int lru) | 220 | static inline void mem_cgroup_rotate_lru_list(struct page *page, int lru) |
215 | { | 221 | { |
216 | return ; | 222 | return ; |
@@ -249,7 +255,7 @@ static inline struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem) | |||
249 | 255 | ||
250 | static inline int | 256 | static inline int |
251 | mem_cgroup_prepare_migration(struct page *page, struct page *newpage, | 257 | mem_cgroup_prepare_migration(struct page *page, struct page *newpage, |
252 | struct mem_cgroup **ptr) | 258 | struct mem_cgroup **ptr, gfp_t gfp_mask) |
253 | { | 259 | { |
254 | return 0; | 260 | return 0; |
255 | } | 261 | } |
diff --git a/include/linux/memory.h b/include/linux/memory.h index 06c1fa0a5c7b..e1e3b2b84f85 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
@@ -21,7 +21,8 @@ | |||
21 | #include <linux/mutex.h> | 21 | #include <linux/mutex.h> |
22 | 22 | ||
23 | struct memory_block { | 23 | struct memory_block { |
24 | unsigned long phys_index; | 24 | unsigned long start_section_nr; |
25 | unsigned long end_section_nr; | ||
25 | unsigned long state; | 26 | unsigned long state; |
26 | int section_count; | 27 | int section_count; |
27 | 28 | ||
diff --git a/include/linux/mfd/ti_ssp.h b/include/linux/mfd/ti_ssp.h new file mode 100644 index 000000000000..dbb4b43bd20e --- /dev/null +++ b/include/linux/mfd/ti_ssp.h | |||
@@ -0,0 +1,93 @@ | |||
1 | /* | ||
2 | * Sequencer Serial Port (SSP) driver for Texas Instruments' SoCs | ||
3 | * | ||
4 | * Copyright (C) 2010 Texas Instruments Inc | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | */ | ||
20 | |||
21 | #ifndef __TI_SSP_H__ | ||
22 | #define __TI_SSP_H__ | ||
23 | |||
24 | struct ti_ssp_dev_data { | ||
25 | const char *dev_name; | ||
26 | void *pdata; | ||
27 | size_t pdata_size; | ||
28 | }; | ||
29 | |||
30 | struct ti_ssp_data { | ||
31 | unsigned long out_clock; | ||
32 | struct ti_ssp_dev_data dev_data[2]; | ||
33 | }; | ||
34 | |||
35 | struct ti_ssp_spi_data { | ||
36 | unsigned long iosel; | ||
37 | int num_cs; | ||
38 | void (*select)(int cs); | ||
39 | }; | ||
40 | |||
41 | /* | ||
42 | * Sequencer port IO pin configuration bits. These do not correlate 1-1 with | ||
43 | * the hardware. The iosel field in the port data combines iosel1 and iosel2, | ||
44 | * and is therefore not a direct map to register space. It is best to use the | ||
45 | * macros below to construct iosel values. | ||
46 | * | ||
47 | * least significant 16 bits --> iosel1 | ||
48 | * most significant 16 bits --> iosel2 | ||
49 | */ | ||
50 | |||
51 | #define SSP_IN 0x0000 | ||
52 | #define SSP_DATA 0x0001 | ||
53 | #define SSP_CLOCK 0x0002 | ||
54 | #define SSP_CHIPSEL 0x0003 | ||
55 | #define SSP_OUT 0x0004 | ||
56 | #define SSP_PIN_SEL(pin, v) ((v) << ((pin) * 3)) | ||
57 | #define SSP_PIN_MASK(pin) SSP_PIN_SEL(pin, 0x7) | ||
58 | #define SSP_INPUT_SEL(pin) ((pin) << 16) | ||
59 | |||
60 | /* Sequencer port config bits */ | ||
61 | #define SSP_EARLY_DIN BIT(8) | ||
62 | #define SSP_DELAY_DOUT BIT(9) | ||
63 | |||
64 | /* Sequence map definitions */ | ||
65 | #define SSP_CLK_HIGH BIT(0) | ||
66 | #define SSP_CLK_LOW 0 | ||
67 | #define SSP_DATA_HIGH BIT(1) | ||
68 | #define SSP_DATA_LOW 0 | ||
69 | #define SSP_CS_HIGH BIT(2) | ||
70 | #define SSP_CS_LOW 0 | ||
71 | #define SSP_OUT_MODE BIT(3) | ||
72 | #define SSP_IN_MODE 0 | ||
73 | #define SSP_DATA_REG BIT(4) | ||
74 | #define SSP_ADDR_REG 0 | ||
75 | |||
76 | #define SSP_OPCODE_DIRECT ((0x0) << 5) | ||
77 | #define SSP_OPCODE_TOGGLE ((0x1) << 5) | ||
78 | #define SSP_OPCODE_SHIFT ((0x2) << 5) | ||
79 | #define SSP_OPCODE_BRANCH0 ((0x4) << 5) | ||
80 | #define SSP_OPCODE_BRANCH1 ((0x5) << 5) | ||
81 | #define SSP_OPCODE_BRANCH ((0x6) << 5) | ||
82 | #define SSP_OPCODE_STOP ((0x7) << 5) | ||
83 | #define SSP_BRANCH(addr) ((addr) << 8) | ||
84 | #define SSP_COUNT(cycles) ((cycles) << 8) | ||
85 | |||
86 | int ti_ssp_raw_read(struct device *dev); | ||
87 | int ti_ssp_raw_write(struct device *dev, u32 val); | ||
88 | int ti_ssp_load(struct device *dev, int offs, u32* prog, int len); | ||
89 | int ti_ssp_run(struct device *dev, u32 pc, u32 input, u32 *output); | ||
90 | int ti_ssp_set_mode(struct device *dev, int mode); | ||
91 | int ti_ssp_set_iosel(struct device *dev, u32 iosel); | ||
92 | |||
93 | #endif /* __TI_SSP_H__ */ | ||
diff --git a/include/linux/mfd/wm831x/pdata.h b/include/linux/mfd/wm831x/pdata.h index fd322aca33ba..173086d42af4 100644 --- a/include/linux/mfd/wm831x/pdata.h +++ b/include/linux/mfd/wm831x/pdata.h | |||
@@ -80,7 +80,8 @@ struct wm831x_touch_pdata { | |||
80 | int isel; /** Current for pen down (uA) */ | 80 | int isel; /** Current for pen down (uA) */ |
81 | int rpu; /** Pen down sensitivity resistor divider */ | 81 | int rpu; /** Pen down sensitivity resistor divider */ |
82 | int pressure; /** Report pressure (boolean) */ | 82 | int pressure; /** Report pressure (boolean) */ |
83 | int data_irq; /** Touch data ready IRQ */ | 83 | unsigned int data_irq; /** Touch data ready IRQ */ |
84 | unsigned int pd_irq; /** Touch pendown detect IRQ */ | ||
84 | }; | 85 | }; |
85 | 86 | ||
86 | enum wm831x_watchdog_action { | 87 | enum wm831x_watchdog_action { |
diff --git a/include/linux/mfd/wm8994/pdata.h b/include/linux/mfd/wm8994/pdata.h index 9eab263658be..466b1c777aff 100644 --- a/include/linux/mfd/wm8994/pdata.h +++ b/include/linux/mfd/wm8994/pdata.h | |||
@@ -103,13 +103,21 @@ struct wm8994_pdata { | |||
103 | unsigned int lineout1fb:1; | 103 | unsigned int lineout1fb:1; |
104 | unsigned int lineout2fb:1; | 104 | unsigned int lineout2fb:1; |
105 | 105 | ||
106 | /* Microphone biases: 0=0.9*AVDD1 1=0.65*AVVD1 */ | 106 | /* IRQ for microphone detection if brought out directly as a |
107 | * signal. | ||
108 | */ | ||
109 | int micdet_irq; | ||
110 | |||
111 | /* WM8994 microphone biases: 0=0.9*AVDD1 1=0.65*AVVD1 */ | ||
107 | unsigned int micbias1_lvl:1; | 112 | unsigned int micbias1_lvl:1; |
108 | unsigned int micbias2_lvl:1; | 113 | unsigned int micbias2_lvl:1; |
109 | 114 | ||
110 | /* Jack detect threashold levels, see datasheet for values */ | 115 | /* WM8994 jack detect threashold levels, see datasheet for values */ |
111 | unsigned int jd_scthr:2; | 116 | unsigned int jd_scthr:2; |
112 | unsigned int jd_thr:2; | 117 | unsigned int jd_thr:2; |
118 | |||
119 | /* WM8958 microphone bias configuration */ | ||
120 | int micbias[2]; | ||
113 | }; | 121 | }; |
114 | 122 | ||
115 | #endif | 123 | #endif |
diff --git a/include/linux/mfd/wm8994/registers.h b/include/linux/mfd/wm8994/registers.h index be072faec6f0..f3ee84284670 100644 --- a/include/linux/mfd/wm8994/registers.h +++ b/include/linux/mfd/wm8994/registers.h | |||
@@ -63,6 +63,8 @@ | |||
63 | #define WM8994_MICBIAS 0x3A | 63 | #define WM8994_MICBIAS 0x3A |
64 | #define WM8994_LDO_1 0x3B | 64 | #define WM8994_LDO_1 0x3B |
65 | #define WM8994_LDO_2 0x3C | 65 | #define WM8994_LDO_2 0x3C |
66 | #define WM8958_MICBIAS1 0x3D | ||
67 | #define WM8958_MICBIAS2 0x3E | ||
66 | #define WM8994_CHARGE_PUMP_1 0x4C | 68 | #define WM8994_CHARGE_PUMP_1 0x4C |
67 | #define WM8958_CHARGE_PUMP_2 0x4D | 69 | #define WM8958_CHARGE_PUMP_2 0x4D |
68 | #define WM8994_CLASS_W_1 0x51 | 70 | #define WM8994_CLASS_W_1 0x51 |
diff --git a/include/linux/micrel_phy.h b/include/linux/micrel_phy.h new file mode 100644 index 000000000000..dd8da342a991 --- /dev/null +++ b/include/linux/micrel_phy.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef _MICREL_PHY_H | ||
2 | #define _MICREL_PHY_H | ||
3 | |||
4 | #define MICREL_PHY_ID_MASK 0x00fffff0 | ||
5 | |||
6 | #define PHY_ID_KSZ9021 0x00221611 | ||
7 | #define PHY_ID_KS8737 0x00221720 | ||
8 | #define PHY_ID_KS8041 0x00221510 | ||
9 | #define PHY_ID_KS8051 0x00221550 | ||
10 | /* both for ks8001 Rev. A/B, and for ks8721 Rev 3. */ | ||
11 | #define PHY_ID_KS8001 0x0022161A | ||
12 | |||
13 | /* struct phy_device dev_flags definitions */ | ||
14 | #define MICREL_PHY_50MHZ_CLK 0x00000001 | ||
15 | |||
16 | #endif /* _MICREL_PHY_H */ | ||
diff --git a/include/linux/mm.h b/include/linux/mm.h index f6385fc17ad4..294104e0891d 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -151,6 +151,7 @@ extern pgprot_t protection_map[16]; | |||
151 | #define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */ | 151 | #define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */ |
152 | #define FAULT_FLAG_MKWRITE 0x04 /* Fault was mkwrite of existing pte */ | 152 | #define FAULT_FLAG_MKWRITE 0x04 /* Fault was mkwrite of existing pte */ |
153 | #define FAULT_FLAG_ALLOW_RETRY 0x08 /* Retry fault if blocking */ | 153 | #define FAULT_FLAG_ALLOW_RETRY 0x08 /* Retry fault if blocking */ |
154 | #define FAULT_FLAG_RETRY_NOWAIT 0x10 /* Don't drop mmap_sem and wait when retrying */ | ||
154 | 155 | ||
155 | /* | 156 | /* |
156 | * This interface is used by x86 PAT code to identify a pfn mapping that is | 157 | * This interface is used by x86 PAT code to identify a pfn mapping that is |
@@ -402,16 +403,23 @@ static inline void init_page_count(struct page *page) | |||
402 | /* | 403 | /* |
403 | * PageBuddy() indicate that the page is free and in the buddy system | 404 | * PageBuddy() indicate that the page is free and in the buddy system |
404 | * (see mm/page_alloc.c). | 405 | * (see mm/page_alloc.c). |
406 | * | ||
407 | * PAGE_BUDDY_MAPCOUNT_VALUE must be <= -2 but better not too close to | ||
408 | * -2 so that an underflow of the page_mapcount() won't be mistaken | ||
409 | * for a genuine PAGE_BUDDY_MAPCOUNT_VALUE. -128 can be created very | ||
410 | * efficiently by most CPU architectures. | ||
405 | */ | 411 | */ |
412 | #define PAGE_BUDDY_MAPCOUNT_VALUE (-128) | ||
413 | |||
406 | static inline int PageBuddy(struct page *page) | 414 | static inline int PageBuddy(struct page *page) |
407 | { | 415 | { |
408 | return atomic_read(&page->_mapcount) == -2; | 416 | return atomic_read(&page->_mapcount) == PAGE_BUDDY_MAPCOUNT_VALUE; |
409 | } | 417 | } |
410 | 418 | ||
411 | static inline void __SetPageBuddy(struct page *page) | 419 | static inline void __SetPageBuddy(struct page *page) |
412 | { | 420 | { |
413 | VM_BUG_ON(atomic_read(&page->_mapcount) != -1); | 421 | VM_BUG_ON(atomic_read(&page->_mapcount) != -1); |
414 | atomic_set(&page->_mapcount, -2); | 422 | atomic_set(&page->_mapcount, PAGE_BUDDY_MAPCOUNT_VALUE); |
415 | } | 423 | } |
416 | 424 | ||
417 | static inline void __ClearPageBuddy(struct page *page) | 425 | static inline void __ClearPageBuddy(struct page *page) |
@@ -852,7 +860,14 @@ extern void pagefault_out_of_memory(void); | |||
852 | 860 | ||
853 | #define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) | 861 | #define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) |
854 | 862 | ||
863 | /* | ||
864 | * Flags passed to __show_mem() and __show_free_areas() to suppress output in | ||
865 | * various contexts. | ||
866 | */ | ||
867 | #define SHOW_MEM_FILTER_NODES (0x0001u) /* filter disallowed nodes */ | ||
868 | |||
855 | extern void show_free_areas(void); | 869 | extern void show_free_areas(void); |
870 | extern void __show_free_areas(unsigned int flags); | ||
856 | 871 | ||
857 | int shmem_lock(struct file *file, int lock, struct user_struct *user); | 872 | int shmem_lock(struct file *file, int lock, struct user_struct *user); |
858 | struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags); | 873 | struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags); |
@@ -899,6 +914,9 @@ unsigned long unmap_vmas(struct mmu_gather **tlb, | |||
899 | * @pgd_entry: if set, called for each non-empty PGD (top-level) entry | 914 | * @pgd_entry: if set, called for each non-empty PGD (top-level) entry |
900 | * @pud_entry: if set, called for each non-empty PUD (2nd-level) entry | 915 | * @pud_entry: if set, called for each non-empty PUD (2nd-level) entry |
901 | * @pmd_entry: if set, called for each non-empty PMD (3rd-level) entry | 916 | * @pmd_entry: if set, called for each non-empty PMD (3rd-level) entry |
917 | * this handler is required to be able to handle | ||
918 | * pmd_trans_huge() pmds. They may simply choose to | ||
919 | * split_huge_page() instead of handling it explicitly. | ||
902 | * @pte_entry: if set, called for each non-empty PTE (4th-level) entry | 920 | * @pte_entry: if set, called for each non-empty PTE (4th-level) entry |
903 | * @pte_hole: if set, called for each hole at all levels | 921 | * @pte_hole: if set, called for each hole at all levels |
904 | * @hugetlb_entry: if set, called for each hugetlb entry | 922 | * @hugetlb_entry: if set, called for each hugetlb entry |
@@ -965,6 +983,10 @@ static inline int handle_mm_fault(struct mm_struct *mm, | |||
965 | extern int make_pages_present(unsigned long addr, unsigned long end); | 983 | extern int make_pages_present(unsigned long addr, unsigned long end); |
966 | extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write); | 984 | extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write); |
967 | 985 | ||
986 | int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | ||
987 | unsigned long start, int len, unsigned int foll_flags, | ||
988 | struct page **pages, struct vm_area_struct **vmas, | ||
989 | int *nonblocking); | ||
968 | int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | 990 | int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, |
969 | unsigned long start, int nr_pages, int write, int force, | 991 | unsigned long start, int nr_pages, int write, int force, |
970 | struct page **pages, struct vm_area_struct **vmas); | 992 | struct page **pages, struct vm_area_struct **vmas); |
@@ -1309,8 +1331,6 @@ int add_from_early_node_map(struct range *range, int az, | |||
1309 | int nr_range, int nid); | 1331 | int nr_range, int nid); |
1310 | u64 __init find_memory_core_early(int nid, u64 size, u64 align, | 1332 | u64 __init find_memory_core_early(int nid, u64 size, u64 align, |
1311 | u64 goal, u64 limit); | 1333 | u64 goal, u64 limit); |
1312 | void *__alloc_memory_core_early(int nodeid, u64 size, u64 align, | ||
1313 | u64 goal, u64 limit); | ||
1314 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); | 1334 | typedef int (*work_fn_t)(unsigned long, unsigned long, void *); |
1315 | extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data); | 1335 | extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data); |
1316 | extern void sparse_memory_present_with_active_regions(int nid); | 1336 | extern void sparse_memory_present_with_active_regions(int nid); |
@@ -1339,6 +1359,7 @@ extern void calculate_zone_inactive_ratio(struct zone *zone); | |||
1339 | extern void mem_init(void); | 1359 | extern void mem_init(void); |
1340 | extern void __init mmap_init(void); | 1360 | extern void __init mmap_init(void); |
1341 | extern void show_mem(void); | 1361 | extern void show_mem(void); |
1362 | extern void __show_mem(unsigned int flags); | ||
1342 | extern void si_meminfo(struct sysinfo * val); | 1363 | extern void si_meminfo(struct sysinfo * val); |
1343 | extern void si_meminfo_node(struct sysinfo *val, int nid); | 1364 | extern void si_meminfo_node(struct sysinfo *val, int nid); |
1344 | extern int after_bootmem; | 1365 | extern int after_bootmem; |
@@ -1528,8 +1549,11 @@ struct page *follow_page(struct vm_area_struct *, unsigned long address, | |||
1528 | #define FOLL_GET 0x04 /* do get_page on page */ | 1549 | #define FOLL_GET 0x04 /* do get_page on page */ |
1529 | #define FOLL_DUMP 0x08 /* give error on hole if it would be zero */ | 1550 | #define FOLL_DUMP 0x08 /* give error on hole if it would be zero */ |
1530 | #define FOLL_FORCE 0x10 /* get_user_pages read/write w/o permission */ | 1551 | #define FOLL_FORCE 0x10 /* get_user_pages read/write w/o permission */ |
1552 | #define FOLL_NOWAIT 0x20 /* if a disk transfer is needed, start the IO | ||
1553 | * and return without waiting upon it */ | ||
1531 | #define FOLL_MLOCK 0x40 /* mark page as mlocked */ | 1554 | #define FOLL_MLOCK 0x40 /* mark page as mlocked */ |
1532 | #define FOLL_SPLIT 0x80 /* don't return transhuge pages, split them */ | 1555 | #define FOLL_SPLIT 0x80 /* don't return transhuge pages, split them */ |
1556 | #define FOLL_HWPOISON 0x100 /* check page is hwpoisoned */ | ||
1533 | 1557 | ||
1534 | typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr, | 1558 | typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr, |
1535 | void *data); | 1559 | void *data); |
@@ -1622,14 +1646,6 @@ extern int sysctl_memory_failure_recovery; | |||
1622 | extern void shake_page(struct page *p, int access); | 1646 | extern void shake_page(struct page *p, int access); |
1623 | extern atomic_long_t mce_bad_pages; | 1647 | extern atomic_long_t mce_bad_pages; |
1624 | extern int soft_offline_page(struct page *page, int flags); | 1648 | extern int soft_offline_page(struct page *page, int flags); |
1625 | #ifdef CONFIG_MEMORY_FAILURE | ||
1626 | int is_hwpoison_address(unsigned long addr); | ||
1627 | #else | ||
1628 | static inline int is_hwpoison_address(unsigned long addr) | ||
1629 | { | ||
1630 | return 0; | ||
1631 | } | ||
1632 | #endif | ||
1633 | 1649 | ||
1634 | extern void dump_page(struct page *page); | 1650 | extern void dump_page(struct page *page); |
1635 | 1651 | ||
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 26bc4e2cd275..02aa5619709b 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -237,8 +237,9 @@ struct mm_struct { | |||
237 | atomic_t mm_users; /* How many users with user space? */ | 237 | atomic_t mm_users; /* How many users with user space? */ |
238 | atomic_t mm_count; /* How many references to "struct mm_struct" (users count as 1) */ | 238 | atomic_t mm_count; /* How many references to "struct mm_struct" (users count as 1) */ |
239 | int map_count; /* number of VMAs */ | 239 | int map_count; /* number of VMAs */ |
240 | struct rw_semaphore mmap_sem; | 240 | |
241 | spinlock_t page_table_lock; /* Protects page tables and some counters */ | 241 | spinlock_t page_table_lock; /* Protects page tables and some counters */ |
242 | struct rw_semaphore mmap_sem; | ||
242 | 243 | ||
243 | struct list_head mmlist; /* List of maybe swapped mm's. These are globally strung | 244 | struct list_head mmlist; /* List of maybe swapped mm's. These are globally strung |
244 | * together off init_mm.mmlist, and are protected | 245 | * together off init_mm.mmlist, and are protected |
@@ -281,6 +282,9 @@ struct mm_struct { | |||
281 | unsigned int token_priority; | 282 | unsigned int token_priority; |
282 | unsigned int last_interval; | 283 | unsigned int last_interval; |
283 | 284 | ||
285 | /* How many tasks sharing this mm are OOM_DISABLE */ | ||
286 | atomic_t oom_disable_count; | ||
287 | |||
284 | unsigned long flags; /* Must use atomic bitops to access the bits */ | 288 | unsigned long flags; /* Must use atomic bitops to access the bits */ |
285 | 289 | ||
286 | struct core_state *core_state; /* coredumping support */ | 290 | struct core_state *core_state; /* coredumping support */ |
@@ -313,8 +317,6 @@ struct mm_struct { | |||
313 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 317 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
314 | pgtable_t pmd_huge_pte; /* protected by page_table_lock */ | 318 | pgtable_t pmd_huge_pte; /* protected by page_table_lock */ |
315 | #endif | 319 | #endif |
316 | /* How many tasks sharing this mm are OOM_DISABLE */ | ||
317 | atomic_t oom_disable_count; | ||
318 | }; | 320 | }; |
319 | 321 | ||
320 | /* Future-safe accessor for struct mm_struct's cpu_vm_mask. */ | 322 | /* Future-safe accessor for struct mm_struct's cpu_vm_mask. */ |
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 8ce082781ccb..adb4888248be 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
@@ -54,6 +54,9 @@ struct mmc_ext_csd { | |||
54 | unsigned int sec_trim_mult; /* Secure trim multiplier */ | 54 | unsigned int sec_trim_mult; /* Secure trim multiplier */ |
55 | unsigned int sec_erase_mult; /* Secure erase multiplier */ | 55 | unsigned int sec_erase_mult; /* Secure erase multiplier */ |
56 | unsigned int trim_timeout; /* In milliseconds */ | 56 | unsigned int trim_timeout; /* In milliseconds */ |
57 | bool enhanced_area_en; /* enable bit */ | ||
58 | unsigned long long enhanced_area_offset; /* Units: Byte */ | ||
59 | unsigned int enhanced_area_size; /* Units: KB */ | ||
57 | }; | 60 | }; |
58 | 61 | ||
59 | struct sd_scr { | 62 | struct sd_scr { |
@@ -121,6 +124,7 @@ struct mmc_card { | |||
121 | /* for byte mode */ | 124 | /* for byte mode */ |
122 | #define MMC_QUIRK_NONSTD_SDIO (1<<2) /* non-standard SDIO card attached */ | 125 | #define MMC_QUIRK_NONSTD_SDIO (1<<2) /* non-standard SDIO card attached */ |
123 | /* (missing CIA registers) */ | 126 | /* (missing CIA registers) */ |
127 | #define MMC_QUIRK_BROKEN_CLK_GATING (1<<3) /* clock gating the sdio bus will make card fail */ | ||
124 | 128 | ||
125 | unsigned int erase_size; /* erase size in sectors */ | 129 | unsigned int erase_size; /* erase size in sectors */ |
126 | unsigned int erase_shift; /* if erase unit is power 2 */ | 130 | unsigned int erase_shift; /* if erase unit is power 2 */ |
@@ -148,6 +152,8 @@ struct mmc_card { | |||
148 | struct dentry *debugfs_root; | 152 | struct dentry *debugfs_root; |
149 | }; | 153 | }; |
150 | 154 | ||
155 | void mmc_fixup_device(struct mmc_card *dev); | ||
156 | |||
151 | #define mmc_card_mmc(c) ((c)->type == MMC_TYPE_MMC) | 157 | #define mmc_card_mmc(c) ((c)->type == MMC_TYPE_MMC) |
152 | #define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD) | 158 | #define mmc_card_sd(c) ((c)->type == MMC_TYPE_SD) |
153 | #define mmc_card_sdio(c) ((c)->type == MMC_TYPE_SDIO) | 159 | #define mmc_card_sdio(c) ((c)->type == MMC_TYPE_SDIO) |
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 64e013f1cfb8..07f27af4dba5 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h | |||
@@ -160,6 +160,7 @@ extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int); | |||
160 | 160 | ||
161 | extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort); | 161 | extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort); |
162 | extern void mmc_release_host(struct mmc_host *host); | 162 | extern void mmc_release_host(struct mmc_host *host); |
163 | extern void mmc_do_release_host(struct mmc_host *host); | ||
163 | extern int mmc_try_claim_host(struct mmc_host *host); | 164 | extern int mmc_try_claim_host(struct mmc_host *host); |
164 | 165 | ||
165 | /** | 166 | /** |
diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 16b0261763ed..c0207a770476 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h | |||
@@ -140,6 +140,7 @@ struct dw_mci { | |||
140 | u32 bus_hz; | 140 | u32 bus_hz; |
141 | u32 current_speed; | 141 | u32 current_speed; |
142 | u32 num_slots; | 142 | u32 num_slots; |
143 | u32 fifoth_val; | ||
143 | struct platform_device *pdev; | 144 | struct platform_device *pdev; |
144 | struct dw_mci_board *pdata; | 145 | struct dw_mci_board *pdata; |
145 | struct dw_mci_slot *slot[MAX_MCI_SLOTS]; | 146 | struct dw_mci_slot *slot[MAX_MCI_SLOTS]; |
@@ -151,6 +152,8 @@ struct dw_mci { | |||
151 | 152 | ||
152 | /* Workaround flags */ | 153 | /* Workaround flags */ |
153 | u32 quirks; | 154 | u32 quirks; |
155 | |||
156 | struct regulator *vmmc; /* Power regulator */ | ||
154 | }; | 157 | }; |
155 | 158 | ||
156 | /* DMA ops for Internal/External DMAC interface */ | 159 | /* DMA ops for Internal/External DMAC interface */ |
@@ -165,14 +168,14 @@ struct dw_mci_dma_ops { | |||
165 | }; | 168 | }; |
166 | 169 | ||
167 | /* IP Quirks/flags. */ | 170 | /* IP Quirks/flags. */ |
168 | /* No special quirks or flags to cater for */ | ||
169 | #define DW_MCI_QUIRK_NONE 0 | ||
170 | /* DTO fix for command transmission with IDMAC configured */ | 171 | /* DTO fix for command transmission with IDMAC configured */ |
171 | #define DW_MCI_QUIRK_IDMAC_DTO 1 | 172 | #define DW_MCI_QUIRK_IDMAC_DTO BIT(0) |
172 | /* delay needed between retries on some 2.11a implementations */ | 173 | /* delay needed between retries on some 2.11a implementations */ |
173 | #define DW_MCI_QUIRK_RETRY_DELAY 2 | 174 | #define DW_MCI_QUIRK_RETRY_DELAY BIT(1) |
174 | /* High Speed Capable - Supports HS cards (upto 50MHz) */ | 175 | /* High Speed Capable - Supports HS cards (upto 50MHz) */ |
175 | #define DW_MCI_QUIRK_HIGHSPEED 4 | 176 | #define DW_MCI_QUIRK_HIGHSPEED BIT(2) |
177 | /* Unreliable card detection */ | ||
178 | #define DW_MCI_QUIRK_BROKEN_CARD_DETECTION BIT(3) | ||
176 | 179 | ||
177 | 180 | ||
178 | struct dma_pdata; | 181 | struct dma_pdata; |
@@ -192,6 +195,8 @@ struct dw_mci_board { | |||
192 | u32 quirks; /* Workaround / Quirk flags */ | 195 | u32 quirks; /* Workaround / Quirk flags */ |
193 | unsigned int bus_hz; /* Bus speed */ | 196 | unsigned int bus_hz; /* Bus speed */ |
194 | 197 | ||
198 | unsigned int caps; /* Capabilities */ | ||
199 | |||
195 | /* delay in mS before detecting cards after interrupt */ | 200 | /* delay in mS before detecting cards after interrupt */ |
196 | u32 detect_delay_ms; | 201 | u32 detect_delay_ms; |
197 | 202 | ||
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 612301f85d14..264ba5451e3b 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h | |||
@@ -253,6 +253,8 @@ struct _mmc_csd { | |||
253 | * EXT_CSD fields | 253 | * EXT_CSD fields |
254 | */ | 254 | */ |
255 | 255 | ||
256 | #define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */ | ||
257 | #define EXT_CSD_PARTITION_SUPPORT 160 /* RO */ | ||
256 | #define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */ | 258 | #define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */ |
257 | #define EXT_CSD_ERASED_MEM_CONT 181 /* RO */ | 259 | #define EXT_CSD_ERASED_MEM_CONT 181 /* RO */ |
258 | #define EXT_CSD_BUS_WIDTH 183 /* R/W */ | 260 | #define EXT_CSD_BUS_WIDTH 183 /* R/W */ |
@@ -262,6 +264,7 @@ struct _mmc_csd { | |||
262 | #define EXT_CSD_CARD_TYPE 196 /* RO */ | 264 | #define EXT_CSD_CARD_TYPE 196 /* RO */ |
263 | #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ | 265 | #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ |
264 | #define EXT_CSD_S_A_TIMEOUT 217 /* RO */ | 266 | #define EXT_CSD_S_A_TIMEOUT 217 /* RO */ |
267 | #define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */ | ||
265 | #define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */ | 268 | #define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */ |
266 | #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */ | 269 | #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */ |
267 | #define EXT_CSD_SEC_TRIM_MULT 229 /* RO */ | 270 | #define EXT_CSD_SEC_TRIM_MULT 229 /* RO */ |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 02ecb0189b1d..e56f835274c9 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -472,7 +472,7 @@ static inline int zone_is_oom_locked(const struct zone *zone) | |||
472 | #ifdef CONFIG_NUMA | 472 | #ifdef CONFIG_NUMA |
473 | 473 | ||
474 | /* | 474 | /* |
475 | * The NUMA zonelists are doubled becausse we need zonelists that restrict the | 475 | * The NUMA zonelists are doubled because we need zonelists that restrict the |
476 | * allocations to a single node for GFP_THISNODE. | 476 | * allocations to a single node for GFP_THISNODE. |
477 | * | 477 | * |
478 | * [0] : Zonelist with fallback | 478 | * [0] : Zonelist with fallback |
diff --git a/include/linux/msm_mdp.h b/include/linux/msm_mdp.h index d11fe0f2f956..fe722c1fb61d 100644 --- a/include/linux/msm_mdp.h +++ b/include/linux/msm_mdp.h | |||
@@ -32,6 +32,7 @@ enum { | |||
32 | MDP_Y_CBCR_H2V1, /* Y and CrCb, pseduo planar w/ Cr is in MSB */ | 32 | MDP_Y_CBCR_H2V1, /* Y and CrCb, pseduo planar w/ Cr is in MSB */ |
33 | MDP_RGBA_8888, /* ARGB 888 */ | 33 | MDP_RGBA_8888, /* ARGB 888 */ |
34 | MDP_BGRA_8888, /* ABGR 888 */ | 34 | MDP_BGRA_8888, /* ABGR 888 */ |
35 | MDP_RGBX_8888, /* RGBX 888 */ | ||
35 | MDP_IMGTYPE_LIMIT /* Non valid image type after this enum */ | 36 | MDP_IMGTYPE_LIMIT /* Non valid image type after this enum */ |
36 | }; | 37 | }; |
37 | 38 | ||
diff --git a/include/linux/mtd/onenand_regs.h b/include/linux/mtd/onenand_regs.h index cd6f3b431195..d60130f88eed 100644 --- a/include/linux/mtd/onenand_regs.h +++ b/include/linux/mtd/onenand_regs.h | |||
@@ -168,6 +168,7 @@ | |||
168 | #define ONENAND_SYS_CFG1_INT (1 << 6) | 168 | #define ONENAND_SYS_CFG1_INT (1 << 6) |
169 | #define ONENAND_SYS_CFG1_IOBE (1 << 5) | 169 | #define ONENAND_SYS_CFG1_IOBE (1 << 5) |
170 | #define ONENAND_SYS_CFG1_RDY_CONF (1 << 4) | 170 | #define ONENAND_SYS_CFG1_RDY_CONF (1 << 4) |
171 | #define ONENAND_SYS_CFG1_VHF (1 << 3) | ||
171 | #define ONENAND_SYS_CFG1_HF (1 << 2) | 172 | #define ONENAND_SYS_CFG1_HF (1 << 2) |
172 | #define ONENAND_SYS_CFG1_SYNC_WRITE (1 << 1) | 173 | #define ONENAND_SYS_CFG1_SYNC_WRITE (1 << 1) |
173 | 174 | ||
diff --git a/include/linux/mtd/ubi.h b/include/linux/mtd/ubi.h index b31bd9e9bca3..84854edf4436 100644 --- a/include/linux/mtd/ubi.h +++ b/include/linux/mtd/ubi.h | |||
@@ -116,18 +116,40 @@ struct ubi_volume_info { | |||
116 | * struct ubi_device_info - UBI device description data structure. | 116 | * struct ubi_device_info - UBI device description data structure. |
117 | * @ubi_num: ubi device number | 117 | * @ubi_num: ubi device number |
118 | * @leb_size: logical eraseblock size on this UBI device | 118 | * @leb_size: logical eraseblock size on this UBI device |
119 | * @leb_start: starting offset of logical eraseblocks within physical | ||
120 | * eraseblocks | ||
119 | * @min_io_size: minimal I/O unit size | 121 | * @min_io_size: minimal I/O unit size |
122 | * @max_write_size: maximum amount of bytes the underlying flash can write at a | ||
123 | * time (MTD write buffer size) | ||
120 | * @ro_mode: if this device is in read-only mode | 124 | * @ro_mode: if this device is in read-only mode |
121 | * @cdev: UBI character device major and minor numbers | 125 | * @cdev: UBI character device major and minor numbers |
122 | * | 126 | * |
123 | * Note, @leb_size is the logical eraseblock size offered by the UBI device. | 127 | * Note, @leb_size is the logical eraseblock size offered by the UBI device. |
124 | * Volumes of this UBI device may have smaller logical eraseblock size if their | 128 | * Volumes of this UBI device may have smaller logical eraseblock size if their |
125 | * alignment is not equivalent to %1. | 129 | * alignment is not equivalent to %1. |
130 | * | ||
131 | * The @max_write_size field describes flash write maximum write unit. For | ||
132 | * example, NOR flash allows for changing individual bytes, so @min_io_size is | ||
133 | * %1. However, it does not mean than NOR flash has to write data byte-by-byte. | ||
134 | * Instead, CFI NOR flashes have a write-buffer of, e.g., 64 bytes, and when | ||
135 | * writing large chunks of data, they write 64-bytes at a time. Obviously, this | ||
136 | * improves write throughput. | ||
137 | * | ||
138 | * Also, the MTD device may have N interleaved (striped) flash chips | ||
139 | * underneath, in which case @min_io_size can be physical min. I/O size of | ||
140 | * single flash chip, while @max_write_size can be N * @min_io_size. | ||
141 | * | ||
142 | * The @max_write_size field is always greater or equivalent to @min_io_size. | ||
143 | * E.g., some NOR flashes may have (@min_io_size = 1, @max_write_size = 64). In | ||
144 | * contrast, NAND flashes usually have @min_io_size = @max_write_size = NAND | ||
145 | * page size. | ||
126 | */ | 146 | */ |
127 | struct ubi_device_info { | 147 | struct ubi_device_info { |
128 | int ubi_num; | 148 | int ubi_num; |
129 | int leb_size; | 149 | int leb_size; |
150 | int leb_start; | ||
130 | int min_io_size; | 151 | int min_io_size; |
152 | int max_write_size; | ||
131 | int ro_mode; | 153 | int ro_mode; |
132 | dev_t cdev; | 154 | dev_t cdev; |
133 | }; | 155 | }; |
diff --git a/include/linux/namei.h b/include/linux/namei.h index f276d4fa01fc..eba45ea10298 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h | |||
@@ -19,7 +19,6 @@ struct nameidata { | |||
19 | struct path path; | 19 | struct path path; |
20 | struct qstr last; | 20 | struct qstr last; |
21 | struct path root; | 21 | struct path root; |
22 | struct file *file; | ||
23 | struct inode *inode; /* path.dentry.d_inode */ | 22 | struct inode *inode; /* path.dentry.d_inode */ |
24 | unsigned int flags; | 23 | unsigned int flags; |
25 | unsigned seq; | 24 | unsigned seq; |
@@ -63,6 +62,10 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND}; | |||
63 | #define LOOKUP_EXCL 0x0400 | 62 | #define LOOKUP_EXCL 0x0400 |
64 | #define LOOKUP_RENAME_TARGET 0x0800 | 63 | #define LOOKUP_RENAME_TARGET 0x0800 |
65 | 64 | ||
65 | #define LOOKUP_JUMPED 0x1000 | ||
66 | #define LOOKUP_ROOT 0x2000 | ||
67 | #define LOOKUP_EMPTY 0x4000 | ||
68 | |||
66 | extern int user_path_at(int, const char __user *, unsigned, struct path *); | 69 | extern int user_path_at(int, const char __user *, unsigned, struct path *); |
67 | 70 | ||
68 | #define user_path(name, path) user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW, path) | 71 | #define user_path(name, path) user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW, path) |
@@ -72,7 +75,7 @@ extern int user_path_at(int, const char __user *, unsigned, struct path *); | |||
72 | 75 | ||
73 | extern int kern_path(const char *, unsigned, struct path *); | 76 | extern int kern_path(const char *, unsigned, struct path *); |
74 | 77 | ||
75 | extern int path_lookup(const char *, unsigned, struct nameidata *); | 78 | extern int kern_path_parent(const char *, struct nameidata *); |
76 | extern int vfs_path_lookup(struct dentry *, struct vfsmount *, | 79 | extern int vfs_path_lookup(struct dentry *, struct vfsmount *, |
77 | const char *, unsigned int, struct nameidata *); | 80 | const char *, unsigned int, struct nameidata *); |
78 | 81 | ||
@@ -82,7 +85,7 @@ extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry | |||
82 | extern struct dentry *lookup_one_len(const char *, struct dentry *, int); | 85 | extern struct dentry *lookup_one_len(const char *, struct dentry *, int); |
83 | 86 | ||
84 | extern int follow_down_one(struct path *); | 87 | extern int follow_down_one(struct path *); |
85 | extern int follow_down(struct path *, bool); | 88 | extern int follow_down(struct path *); |
86 | extern int follow_up(struct path *); | 89 | extern int follow_up(struct path *); |
87 | 90 | ||
88 | extern struct dentry *lock_rename(struct dentry *, struct dentry *); | 91 | extern struct dentry *lock_rename(struct dentry *, struct dentry *); |
diff --git a/include/linux/net.h b/include/linux/net.h index 16faa130088c..94de83c0f877 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -118,6 +118,7 @@ enum sock_shutdown_cmd { | |||
118 | }; | 118 | }; |
119 | 119 | ||
120 | struct socket_wq { | 120 | struct socket_wq { |
121 | /* Note: wait MUST be first field of socket_wq */ | ||
121 | wait_queue_head_t wait; | 122 | wait_queue_head_t wait; |
122 | struct fasync_struct *fasync_list; | 123 | struct fasync_struct *fasync_list; |
123 | struct rcu_head rcu; | 124 | struct rcu_head rcu; |
@@ -142,7 +143,7 @@ struct socket { | |||
142 | 143 | ||
143 | unsigned long flags; | 144 | unsigned long flags; |
144 | 145 | ||
145 | struct socket_wq *wq; | 146 | struct socket_wq __rcu *wq; |
146 | 147 | ||
147 | struct file *file; | 148 | struct file *file; |
148 | struct sock *sk; | 149 | struct sock *sk; |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 71caf7a5e6c6..5eeb2cd3631c 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -138,6 +138,9 @@ static inline bool dev_xmit_complete(int rc) | |||
138 | 138 | ||
139 | #define MAX_ADDR_LEN 32 /* Largest hardware address length */ | 139 | #define MAX_ADDR_LEN 32 /* Largest hardware address length */ |
140 | 140 | ||
141 | /* Initial net device group. All devices belong to group 0 by default. */ | ||
142 | #define INIT_NETDEV_GROUP 0 | ||
143 | |||
141 | #ifdef __KERNEL__ | 144 | #ifdef __KERNEL__ |
142 | /* | 145 | /* |
143 | * Compute the worst case header length according to the protocols | 146 | * Compute the worst case header length according to the protocols |
@@ -387,7 +390,55 @@ enum gro_result { | |||
387 | }; | 390 | }; |
388 | typedef enum gro_result gro_result_t; | 391 | typedef enum gro_result gro_result_t; |
389 | 392 | ||
390 | typedef struct sk_buff *rx_handler_func_t(struct sk_buff *skb); | 393 | /* |
394 | * enum rx_handler_result - Possible return values for rx_handlers. | ||
395 | * @RX_HANDLER_CONSUMED: skb was consumed by rx_handler, do not process it | ||
396 | * further. | ||
397 | * @RX_HANDLER_ANOTHER: Do another round in receive path. This is indicated in | ||
398 | * case skb->dev was changed by rx_handler. | ||
399 | * @RX_HANDLER_EXACT: Force exact delivery, no wildcard. | ||
400 | * @RX_HANDLER_PASS: Do nothing, passe the skb as if no rx_handler was called. | ||
401 | * | ||
402 | * rx_handlers are functions called from inside __netif_receive_skb(), to do | ||
403 | * special processing of the skb, prior to delivery to protocol handlers. | ||
404 | * | ||
405 | * Currently, a net_device can only have a single rx_handler registered. Trying | ||
406 | * to register a second rx_handler will return -EBUSY. | ||
407 | * | ||
408 | * To register a rx_handler on a net_device, use netdev_rx_handler_register(). | ||
409 | * To unregister a rx_handler on a net_device, use | ||
410 | * netdev_rx_handler_unregister(). | ||
411 | * | ||
412 | * Upon return, rx_handler is expected to tell __netif_receive_skb() what to | ||
413 | * do with the skb. | ||
414 | * | ||
415 | * If the rx_handler consumed to skb in some way, it should return | ||
416 | * RX_HANDLER_CONSUMED. This is appropriate when the rx_handler arranged for | ||
417 | * the skb to be delivered in some other ways. | ||
418 | * | ||
419 | * If the rx_handler changed skb->dev, to divert the skb to another | ||
420 | * net_device, it should return RX_HANDLER_ANOTHER. The rx_handler for the | ||
421 | * new device will be called if it exists. | ||
422 | * | ||
423 | * If the rx_handler consider the skb should be ignored, it should return | ||
424 | * RX_HANDLER_EXACT. The skb will only be delivered to protocol handlers that | ||
425 | * are registred on exact device (ptype->dev == skb->dev). | ||
426 | * | ||
427 | * If the rx_handler didn't changed skb->dev, but want the skb to be normally | ||
428 | * delivered, it should return RX_HANDLER_PASS. | ||
429 | * | ||
430 | * A device without a registered rx_handler will behave as if rx_handler | ||
431 | * returned RX_HANDLER_PASS. | ||
432 | */ | ||
433 | |||
434 | enum rx_handler_result { | ||
435 | RX_HANDLER_CONSUMED, | ||
436 | RX_HANDLER_ANOTHER, | ||
437 | RX_HANDLER_EXACT, | ||
438 | RX_HANDLER_PASS, | ||
439 | }; | ||
440 | typedef enum rx_handler_result rx_handler_result_t; | ||
441 | typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb); | ||
391 | 442 | ||
392 | extern void __napi_schedule(struct napi_struct *n); | 443 | extern void __napi_schedule(struct napi_struct *n); |
393 | 444 | ||
@@ -551,14 +602,16 @@ struct rps_map { | |||
551 | #define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + (_num * sizeof(u16))) | 602 | #define RPS_MAP_SIZE(_num) (sizeof(struct rps_map) + (_num * sizeof(u16))) |
552 | 603 | ||
553 | /* | 604 | /* |
554 | * The rps_dev_flow structure contains the mapping of a flow to a CPU and the | 605 | * The rps_dev_flow structure contains the mapping of a flow to a CPU, the |
555 | * tail pointer for that CPU's input queue at the time of last enqueue. | 606 | * tail pointer for that CPU's input queue at the time of last enqueue, and |
607 | * a hardware filter index. | ||
556 | */ | 608 | */ |
557 | struct rps_dev_flow { | 609 | struct rps_dev_flow { |
558 | u16 cpu; | 610 | u16 cpu; |
559 | u16 fill; | 611 | u16 filter; |
560 | unsigned int last_qtail; | 612 | unsigned int last_qtail; |
561 | }; | 613 | }; |
614 | #define RPS_NO_FILTER 0xffff | ||
562 | 615 | ||
563 | /* | 616 | /* |
564 | * The rps_dev_flow_table structure contains a table of flow mappings. | 617 | * The rps_dev_flow_table structure contains a table of flow mappings. |
@@ -608,6 +661,11 @@ static inline void rps_reset_sock_flow(struct rps_sock_flow_table *table, | |||
608 | 661 | ||
609 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; | 662 | extern struct rps_sock_flow_table __rcu *rps_sock_flow_table; |
610 | 663 | ||
664 | #ifdef CONFIG_RFS_ACCEL | ||
665 | extern bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, | ||
666 | u32 flow_id, u16 filter_id); | ||
667 | #endif | ||
668 | |||
611 | /* This structure contains an instance of an RX queue. */ | 669 | /* This structure contains an instance of an RX queue. */ |
612 | struct netdev_rx_queue { | 670 | struct netdev_rx_queue { |
613 | struct rps_map __rcu *rps_map; | 671 | struct rps_map __rcu *rps_map; |
@@ -643,6 +701,14 @@ struct xps_dev_maps { | |||
643 | (nr_cpu_ids * sizeof(struct xps_map *))) | 701 | (nr_cpu_ids * sizeof(struct xps_map *))) |
644 | #endif /* CONFIG_XPS */ | 702 | #endif /* CONFIG_XPS */ |
645 | 703 | ||
704 | #define TC_MAX_QUEUE 16 | ||
705 | #define TC_BITMASK 15 | ||
706 | /* HW offloaded queuing disciplines txq count and offset maps */ | ||
707 | struct netdev_tc_txq { | ||
708 | u16 count; | ||
709 | u16 offset; | ||
710 | }; | ||
711 | |||
646 | /* | 712 | /* |
647 | * This structure defines the management hooks for network devices. | 713 | * This structure defines the management hooks for network devices. |
648 | * The following hooks can be defined; unless noted otherwise, they are | 714 | * The following hooks can be defined; unless noted otherwise, they are |
@@ -753,6 +819,74 @@ struct xps_dev_maps { | |||
753 | * int (*ndo_set_vf_port)(struct net_device *dev, int vf, | 819 | * int (*ndo_set_vf_port)(struct net_device *dev, int vf, |
754 | * struct nlattr *port[]); | 820 | * struct nlattr *port[]); |
755 | * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb); | 821 | * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb); |
822 | * int (*ndo_setup_tc)(struct net_device *dev, u8 tc) | ||
823 | * Called to setup 'tc' number of traffic classes in the net device. This | ||
824 | * is always called from the stack with the rtnl lock held and netif tx | ||
825 | * queues stopped. This allows the netdevice to perform queue management | ||
826 | * safely. | ||
827 | * | ||
828 | * Fiber Channel over Ethernet (FCoE) offload functions. | ||
829 | * int (*ndo_fcoe_enable)(struct net_device *dev); | ||
830 | * Called when the FCoE protocol stack wants to start using LLD for FCoE | ||
831 | * so the underlying device can perform whatever needed configuration or | ||
832 | * initialization to support acceleration of FCoE traffic. | ||
833 | * | ||
834 | * int (*ndo_fcoe_disable)(struct net_device *dev); | ||
835 | * Called when the FCoE protocol stack wants to stop using LLD for FCoE | ||
836 | * so the underlying device can perform whatever needed clean-ups to | ||
837 | * stop supporting acceleration of FCoE traffic. | ||
838 | * | ||
839 | * int (*ndo_fcoe_ddp_setup)(struct net_device *dev, u16 xid, | ||
840 | * struct scatterlist *sgl, unsigned int sgc); | ||
841 | * Called when the FCoE Initiator wants to initialize an I/O that | ||
842 | * is a possible candidate for Direct Data Placement (DDP). The LLD can | ||
843 | * perform necessary setup and returns 1 to indicate the device is set up | ||
844 | * successfully to perform DDP on this I/O, otherwise this returns 0. | ||
845 | * | ||
846 | * int (*ndo_fcoe_ddp_done)(struct net_device *dev, u16 xid); | ||
847 | * Called when the FCoE Initiator/Target is done with the DDPed I/O as | ||
848 | * indicated by the FC exchange id 'xid', so the underlying device can | ||
849 | * clean up and reuse resources for later DDP requests. | ||
850 | * | ||
851 | * int (*ndo_fcoe_ddp_target)(struct net_device *dev, u16 xid, | ||
852 | * struct scatterlist *sgl, unsigned int sgc); | ||
853 | * Called when the FCoE Target wants to initialize an I/O that | ||
854 | * is a possible candidate for Direct Data Placement (DDP). The LLD can | ||
855 | * perform necessary setup and returns 1 to indicate the device is set up | ||
856 | * successfully to perform DDP on this I/O, otherwise this returns 0. | ||
857 | * | ||
858 | * int (*ndo_fcoe_get_wwn)(struct net_device *dev, u64 *wwn, int type); | ||
859 | * Called when the underlying device wants to override default World Wide | ||
860 | * Name (WWN) generation mechanism in FCoE protocol stack to pass its own | ||
861 | * World Wide Port Name (WWPN) or World Wide Node Name (WWNN) to the FCoE | ||
862 | * protocol stack to use. | ||
863 | * | ||
864 | * RFS acceleration. | ||
865 | * int (*ndo_rx_flow_steer)(struct net_device *dev, const struct sk_buff *skb, | ||
866 | * u16 rxq_index, u32 flow_id); | ||
867 | * Set hardware filter for RFS. rxq_index is the target queue index; | ||
868 | * flow_id is a flow ID to be passed to rps_may_expire_flow() later. | ||
869 | * Return the filter ID on success, or a negative error code. | ||
870 | * | ||
871 | * Slave management functions (for bridge, bonding, etc). User should | ||
872 | * call netdev_set_master() to set dev->master properly. | ||
873 | * int (*ndo_add_slave)(struct net_device *dev, struct net_device *slave_dev); | ||
874 | * Called to make another netdev an underling. | ||
875 | * | ||
876 | * int (*ndo_del_slave)(struct net_device *dev, struct net_device *slave_dev); | ||
877 | * Called to release previously enslaved netdev. | ||
878 | * | ||
879 | * Feature/offload setting functions. | ||
880 | * u32 (*ndo_fix_features)(struct net_device *dev, u32 features); | ||
881 | * Adjusts the requested feature flags according to device-specific | ||
882 | * constraints, and returns the resulting flags. Must not modify | ||
883 | * the device state. | ||
884 | * | ||
885 | * int (*ndo_set_features)(struct net_device *dev, u32 features); | ||
886 | * Called to update device configuration to new features. Passed | ||
887 | * feature set might be less than what was returned by ndo_fix_features()). | ||
888 | * Must return >0 or -errno if it changed dev->features itself. | ||
889 | * | ||
756 | */ | 890 | */ |
757 | #define HAVE_NET_DEVICE_OPS | 891 | #define HAVE_NET_DEVICE_OPS |
758 | struct net_device_ops { | 892 | struct net_device_ops { |
@@ -811,6 +945,7 @@ struct net_device_ops { | |||
811 | struct nlattr *port[]); | 945 | struct nlattr *port[]); |
812 | int (*ndo_get_vf_port)(struct net_device *dev, | 946 | int (*ndo_get_vf_port)(struct net_device *dev, |
813 | int vf, struct sk_buff *skb); | 947 | int vf, struct sk_buff *skb); |
948 | int (*ndo_setup_tc)(struct net_device *dev, u8 tc); | ||
814 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 949 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
815 | int (*ndo_fcoe_enable)(struct net_device *dev); | 950 | int (*ndo_fcoe_enable)(struct net_device *dev); |
816 | int (*ndo_fcoe_disable)(struct net_device *dev); | 951 | int (*ndo_fcoe_disable)(struct net_device *dev); |
@@ -820,11 +955,29 @@ struct net_device_ops { | |||
820 | unsigned int sgc); | 955 | unsigned int sgc); |
821 | int (*ndo_fcoe_ddp_done)(struct net_device *dev, | 956 | int (*ndo_fcoe_ddp_done)(struct net_device *dev, |
822 | u16 xid); | 957 | u16 xid); |
958 | int (*ndo_fcoe_ddp_target)(struct net_device *dev, | ||
959 | u16 xid, | ||
960 | struct scatterlist *sgl, | ||
961 | unsigned int sgc); | ||
823 | #define NETDEV_FCOE_WWNN 0 | 962 | #define NETDEV_FCOE_WWNN 0 |
824 | #define NETDEV_FCOE_WWPN 1 | 963 | #define NETDEV_FCOE_WWPN 1 |
825 | int (*ndo_fcoe_get_wwn)(struct net_device *dev, | 964 | int (*ndo_fcoe_get_wwn)(struct net_device *dev, |
826 | u64 *wwn, int type); | 965 | u64 *wwn, int type); |
827 | #endif | 966 | #endif |
967 | #ifdef CONFIG_RFS_ACCEL | ||
968 | int (*ndo_rx_flow_steer)(struct net_device *dev, | ||
969 | const struct sk_buff *skb, | ||
970 | u16 rxq_index, | ||
971 | u32 flow_id); | ||
972 | #endif | ||
973 | int (*ndo_add_slave)(struct net_device *dev, | ||
974 | struct net_device *slave_dev); | ||
975 | int (*ndo_del_slave)(struct net_device *dev, | ||
976 | struct net_device *slave_dev); | ||
977 | u32 (*ndo_fix_features)(struct net_device *dev, | ||
978 | u32 features); | ||
979 | int (*ndo_set_features)(struct net_device *dev, | ||
980 | u32 features); | ||
828 | }; | 981 | }; |
829 | 982 | ||
830 | /* | 983 | /* |
@@ -876,8 +1029,18 @@ struct net_device { | |||
876 | struct list_head napi_list; | 1029 | struct list_head napi_list; |
877 | struct list_head unreg_list; | 1030 | struct list_head unreg_list; |
878 | 1031 | ||
879 | /* Net device features */ | 1032 | /* currently active device features */ |
880 | unsigned long features; | 1033 | u32 features; |
1034 | /* user-changeable features */ | ||
1035 | u32 hw_features; | ||
1036 | /* user-requested features */ | ||
1037 | u32 wanted_features; | ||
1038 | /* VLAN feature mask */ | ||
1039 | u32 vlan_features; | ||
1040 | |||
1041 | /* Net device feature bits; if you change something, | ||
1042 | * also update netdev_features_strings[] in ethtool.c */ | ||
1043 | |||
881 | #define NETIF_F_SG 1 /* Scatter/gather IO. */ | 1044 | #define NETIF_F_SG 1 /* Scatter/gather IO. */ |
882 | #define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */ | 1045 | #define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */ |
883 | #define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */ | 1046 | #define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */ |
@@ -902,6 +1065,7 @@ struct net_device { | |||
902 | #define NETIF_F_FCOE_MTU (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/ | 1065 | #define NETIF_F_FCOE_MTU (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/ |
903 | #define NETIF_F_NTUPLE (1 << 27) /* N-tuple filters supported */ | 1066 | #define NETIF_F_NTUPLE (1 << 27) /* N-tuple filters supported */ |
904 | #define NETIF_F_RXHASH (1 << 28) /* Receive hashing offload */ | 1067 | #define NETIF_F_RXHASH (1 << 28) /* Receive hashing offload */ |
1068 | #define NETIF_F_RXCSUM (1 << 29) /* Receive checksumming offload */ | ||
905 | 1069 | ||
906 | /* Segmentation offload features */ | 1070 | /* Segmentation offload features */ |
907 | #define NETIF_F_GSO_SHIFT 16 | 1071 | #define NETIF_F_GSO_SHIFT 16 |
@@ -913,6 +1077,12 @@ struct net_device { | |||
913 | #define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) | 1077 | #define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT) |
914 | #define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT) | 1078 | #define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT) |
915 | 1079 | ||
1080 | /* Features valid for ethtool to change */ | ||
1081 | /* = all defined minus driver/device-class-related */ | ||
1082 | #define NETIF_F_NEVER_CHANGE (NETIF_F_HIGHDMA | NETIF_F_VLAN_CHALLENGED | \ | ||
1083 | NETIF_F_LLTX | NETIF_F_NETNS_LOCAL) | ||
1084 | #define NETIF_F_ETHTOOL_BITS (0x3f3fffff & ~NETIF_F_NEVER_CHANGE) | ||
1085 | |||
916 | /* List of features with software fallbacks. */ | 1086 | /* List of features with software fallbacks. */ |
917 | #define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | \ | 1087 | #define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | \ |
918 | NETIF_F_TSO6 | NETIF_F_UFO) | 1088 | NETIF_F_TSO6 | NETIF_F_UFO) |
@@ -923,6 +1093,12 @@ struct net_device { | |||
923 | #define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) | 1093 | #define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM) |
924 | #define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM) | 1094 | #define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM) |
925 | 1095 | ||
1096 | #define NETIF_F_ALL_TSO (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN) | ||
1097 | |||
1098 | #define NETIF_F_ALL_TX_OFFLOADS (NETIF_F_ALL_CSUM | NETIF_F_SG | \ | ||
1099 | NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \ | ||
1100 | NETIF_F_SCTP_CSUM | NETIF_F_FCOE_CRC) | ||
1101 | |||
926 | /* | 1102 | /* |
927 | * If one device supports one of these features, then enable them | 1103 | * If one device supports one of these features, then enable them |
928 | * for all in netdev_increment_features. | 1104 | * for all in netdev_increment_features. |
@@ -931,6 +1107,9 @@ struct net_device { | |||
931 | NETIF_F_SG | NETIF_F_HIGHDMA | \ | 1107 | NETIF_F_SG | NETIF_F_HIGHDMA | \ |
932 | NETIF_F_FRAGLIST) | 1108 | NETIF_F_FRAGLIST) |
933 | 1109 | ||
1110 | /* changeable features with no special hardware requirements */ | ||
1111 | #define NETIF_F_SOFT_FEATURES (NETIF_F_GSO | NETIF_F_GRO) | ||
1112 | |||
934 | /* Interface index. Unique device identifier */ | 1113 | /* Interface index. Unique device identifier */ |
935 | int ifindex; | 1114 | int ifindex; |
936 | int iflink; | 1115 | int iflink; |
@@ -1039,6 +1218,13 @@ struct net_device { | |||
1039 | 1218 | ||
1040 | /* Number of RX queues currently active in device */ | 1219 | /* Number of RX queues currently active in device */ |
1041 | unsigned int real_num_rx_queues; | 1220 | unsigned int real_num_rx_queues; |
1221 | |||
1222 | #ifdef CONFIG_RFS_ACCEL | ||
1223 | /* CPU reverse-mapping for RX completion interrupts, indexed | ||
1224 | * by RX queue number. Assigned by driver. This must only be | ||
1225 | * set if the ndo_rx_flow_steer operation is defined. */ | ||
1226 | struct cpu_rmap *rx_cpu_rmap; | ||
1227 | #endif | ||
1042 | #endif | 1228 | #endif |
1043 | 1229 | ||
1044 | rx_handler_func_t __rcu *rx_handler; | 1230 | rx_handler_func_t __rcu *rx_handler; |
@@ -1132,9 +1318,6 @@ struct net_device { | |||
1132 | /* rtnetlink link ops */ | 1318 | /* rtnetlink link ops */ |
1133 | const struct rtnl_link_ops *rtnl_link_ops; | 1319 | const struct rtnl_link_ops *rtnl_link_ops; |
1134 | 1320 | ||
1135 | /* VLAN feature mask */ | ||
1136 | unsigned long vlan_features; | ||
1137 | |||
1138 | /* for setting kernel sock attribute on TCP connection setup */ | 1321 | /* for setting kernel sock attribute on TCP connection setup */ |
1139 | #define GSO_MAX_SIZE 65536 | 1322 | #define GSO_MAX_SIZE 65536 |
1140 | unsigned int gso_max_size; | 1323 | unsigned int gso_max_size; |
@@ -1143,6 +1326,9 @@ struct net_device { | |||
1143 | /* Data Center Bridging netlink ops */ | 1326 | /* Data Center Bridging netlink ops */ |
1144 | const struct dcbnl_rtnl_ops *dcbnl_ops; | 1327 | const struct dcbnl_rtnl_ops *dcbnl_ops; |
1145 | #endif | 1328 | #endif |
1329 | u8 num_tc; | ||
1330 | struct netdev_tc_txq tc_to_txq[TC_MAX_QUEUE]; | ||
1331 | u8 prio_tc_map[TC_BITMASK + 1]; | ||
1146 | 1332 | ||
1147 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 1333 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
1148 | /* max exchange id for FCoE LRO by ddp */ | 1334 | /* max exchange id for FCoE LRO by ddp */ |
@@ -1153,12 +1339,66 @@ struct net_device { | |||
1153 | 1339 | ||
1154 | /* phy device may attach itself for hardware timestamping */ | 1340 | /* phy device may attach itself for hardware timestamping */ |
1155 | struct phy_device *phydev; | 1341 | struct phy_device *phydev; |
1342 | |||
1343 | /* group the device belongs to */ | ||
1344 | int group; | ||
1156 | }; | 1345 | }; |
1157 | #define to_net_dev(d) container_of(d, struct net_device, dev) | 1346 | #define to_net_dev(d) container_of(d, struct net_device, dev) |
1158 | 1347 | ||
1159 | #define NETDEV_ALIGN 32 | 1348 | #define NETDEV_ALIGN 32 |
1160 | 1349 | ||
1161 | static inline | 1350 | static inline |
1351 | int netdev_get_prio_tc_map(const struct net_device *dev, u32 prio) | ||
1352 | { | ||
1353 | return dev->prio_tc_map[prio & TC_BITMASK]; | ||
1354 | } | ||
1355 | |||
1356 | static inline | ||
1357 | int netdev_set_prio_tc_map(struct net_device *dev, u8 prio, u8 tc) | ||
1358 | { | ||
1359 | if (tc >= dev->num_tc) | ||
1360 | return -EINVAL; | ||
1361 | |||
1362 | dev->prio_tc_map[prio & TC_BITMASK] = tc & TC_BITMASK; | ||
1363 | return 0; | ||
1364 | } | ||
1365 | |||
1366 | static inline | ||
1367 | void netdev_reset_tc(struct net_device *dev) | ||
1368 | { | ||
1369 | dev->num_tc = 0; | ||
1370 | memset(dev->tc_to_txq, 0, sizeof(dev->tc_to_txq)); | ||
1371 | memset(dev->prio_tc_map, 0, sizeof(dev->prio_tc_map)); | ||
1372 | } | ||
1373 | |||
1374 | static inline | ||
1375 | int netdev_set_tc_queue(struct net_device *dev, u8 tc, u16 count, u16 offset) | ||
1376 | { | ||
1377 | if (tc >= dev->num_tc) | ||
1378 | return -EINVAL; | ||
1379 | |||
1380 | dev->tc_to_txq[tc].count = count; | ||
1381 | dev->tc_to_txq[tc].offset = offset; | ||
1382 | return 0; | ||
1383 | } | ||
1384 | |||
1385 | static inline | ||
1386 | int netdev_set_num_tc(struct net_device *dev, u8 num_tc) | ||
1387 | { | ||
1388 | if (num_tc > TC_MAX_QUEUE) | ||
1389 | return -EINVAL; | ||
1390 | |||
1391 | dev->num_tc = num_tc; | ||
1392 | return 0; | ||
1393 | } | ||
1394 | |||
1395 | static inline | ||
1396 | int netdev_get_num_tc(struct net_device *dev) | ||
1397 | { | ||
1398 | return dev->num_tc; | ||
1399 | } | ||
1400 | |||
1401 | static inline | ||
1162 | struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev, | 1402 | struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev, |
1163 | unsigned int index) | 1403 | unsigned int index) |
1164 | { | 1404 | { |
@@ -1300,7 +1540,7 @@ struct packet_type { | |||
1300 | struct packet_type *, | 1540 | struct packet_type *, |
1301 | struct net_device *); | 1541 | struct net_device *); |
1302 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, | 1542 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, |
1303 | int features); | 1543 | u32 features); |
1304 | int (*gso_send_check)(struct sk_buff *skb); | 1544 | int (*gso_send_check)(struct sk_buff *skb); |
1305 | struct sk_buff **(*gro_receive)(struct sk_buff **head, | 1545 | struct sk_buff **(*gro_receive)(struct sk_buff **head, |
1306 | struct sk_buff *skb); | 1546 | struct sk_buff *skb); |
@@ -1345,7 +1585,7 @@ static inline struct net_device *next_net_device_rcu(struct net_device *dev) | |||
1345 | struct net *net; | 1585 | struct net *net; |
1346 | 1586 | ||
1347 | net = dev_net(dev); | 1587 | net = dev_net(dev); |
1348 | lh = rcu_dereference(dev->dev_list.next); | 1588 | lh = rcu_dereference(list_next_rcu(&dev->dev_list)); |
1349 | return lh == &net->dev_base_head ? NULL : net_device_entry(lh); | 1589 | return lh == &net->dev_base_head ? NULL : net_device_entry(lh); |
1350 | } | 1590 | } |
1351 | 1591 | ||
@@ -1355,6 +1595,13 @@ static inline struct net_device *first_net_device(struct net *net) | |||
1355 | net_device_entry(net->dev_base_head.next); | 1595 | net_device_entry(net->dev_base_head.next); |
1356 | } | 1596 | } |
1357 | 1597 | ||
1598 | static inline struct net_device *first_net_device_rcu(struct net *net) | ||
1599 | { | ||
1600 | struct list_head *lh = rcu_dereference(list_next_rcu(&net->dev_base_head)); | ||
1601 | |||
1602 | return lh == &net->dev_base_head ? NULL : net_device_entry(lh); | ||
1603 | } | ||
1604 | |||
1358 | extern int netdev_boot_setup_check(struct net_device *dev); | 1605 | extern int netdev_boot_setup_check(struct net_device *dev); |
1359 | extern unsigned long netdev_boot_base(const char *prefix, int unit); | 1606 | extern unsigned long netdev_boot_base(const char *prefix, int unit); |
1360 | extern struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type, | 1607 | extern struct net_device *dev_getbyhwaddr_rcu(struct net *net, unsigned short type, |
@@ -1606,8 +1853,7 @@ static inline void netif_tx_wake_all_queues(struct net_device *dev) | |||
1606 | static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) | 1853 | static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) |
1607 | { | 1854 | { |
1608 | if (WARN_ON(!dev_queue)) { | 1855 | if (WARN_ON(!dev_queue)) { |
1609 | printk(KERN_INFO "netif_stop_queue() cannot be called before " | 1856 | pr_info("netif_stop_queue() cannot be called before register_netdev()\n"); |
1610 | "register_netdev()"); | ||
1611 | return; | 1857 | return; |
1612 | } | 1858 | } |
1613 | set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); | 1859 | set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); |
@@ -1844,6 +2090,7 @@ extern int dev_set_alias(struct net_device *, const char *, size_t); | |||
1844 | extern int dev_change_net_namespace(struct net_device *, | 2090 | extern int dev_change_net_namespace(struct net_device *, |
1845 | struct net *, const char *); | 2091 | struct net *, const char *); |
1846 | extern int dev_set_mtu(struct net_device *, int); | 2092 | extern int dev_set_mtu(struct net_device *, int); |
2093 | extern void dev_set_group(struct net_device *, int); | ||
1847 | extern int dev_set_mac_address(struct net_device *, | 2094 | extern int dev_set_mac_address(struct net_device *, |
1848 | struct sockaddr *); | 2095 | struct sockaddr *); |
1849 | extern int dev_hard_start_xmit(struct sk_buff *skb, | 2096 | extern int dev_hard_start_xmit(struct sk_buff *skb, |
@@ -2267,8 +2514,10 @@ extern int netdev_max_backlog; | |||
2267 | extern int netdev_tstamp_prequeue; | 2514 | extern int netdev_tstamp_prequeue; |
2268 | extern int weight_p; | 2515 | extern int weight_p; |
2269 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); | 2516 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); |
2517 | extern int netdev_set_bond_master(struct net_device *dev, | ||
2518 | struct net_device *master); | ||
2270 | extern int skb_checksum_help(struct sk_buff *skb); | 2519 | extern int skb_checksum_help(struct sk_buff *skb); |
2271 | extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features); | 2520 | extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features); |
2272 | #ifdef CONFIG_BUG | 2521 | #ifdef CONFIG_BUG |
2273 | extern void netdev_rx_csum_fault(struct net_device *dev); | 2522 | extern void netdev_rx_csum_fault(struct net_device *dev); |
2274 | #else | 2523 | #else |
@@ -2295,22 +2544,26 @@ extern char *netdev_drivername(const struct net_device *dev, char *buffer, int l | |||
2295 | 2544 | ||
2296 | extern void linkwatch_run_queue(void); | 2545 | extern void linkwatch_run_queue(void); |
2297 | 2546 | ||
2298 | unsigned long netdev_increment_features(unsigned long all, unsigned long one, | 2547 | static inline u32 netdev_get_wanted_features(struct net_device *dev) |
2299 | unsigned long mask); | 2548 | { |
2300 | unsigned long netdev_fix_features(unsigned long features, const char *name); | 2549 | return (dev->features & ~dev->hw_features) | dev->wanted_features; |
2550 | } | ||
2551 | u32 netdev_increment_features(u32 all, u32 one, u32 mask); | ||
2552 | u32 netdev_fix_features(struct net_device *dev, u32 features); | ||
2553 | void netdev_update_features(struct net_device *dev); | ||
2301 | 2554 | ||
2302 | void netif_stacked_transfer_operstate(const struct net_device *rootdev, | 2555 | void netif_stacked_transfer_operstate(const struct net_device *rootdev, |
2303 | struct net_device *dev); | 2556 | struct net_device *dev); |
2304 | 2557 | ||
2305 | int netif_skb_features(struct sk_buff *skb); | 2558 | u32 netif_skb_features(struct sk_buff *skb); |
2306 | 2559 | ||
2307 | static inline int net_gso_ok(int features, int gso_type) | 2560 | static inline int net_gso_ok(u32 features, int gso_type) |
2308 | { | 2561 | { |
2309 | int feature = gso_type << NETIF_F_GSO_SHIFT; | 2562 | int feature = gso_type << NETIF_F_GSO_SHIFT; |
2310 | return (features & feature) == feature; | 2563 | return (features & feature) == feature; |
2311 | } | 2564 | } |
2312 | 2565 | ||
2313 | static inline int skb_gso_ok(struct sk_buff *skb, int features) | 2566 | static inline int skb_gso_ok(struct sk_buff *skb, u32 features) |
2314 | { | 2567 | { |
2315 | return net_gso_ok(features, skb_shinfo(skb)->gso_type) && | 2568 | return net_gso_ok(features, skb_shinfo(skb)->gso_type) && |
2316 | (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); | 2569 | (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); |
@@ -2328,15 +2581,9 @@ static inline void netif_set_gso_max_size(struct net_device *dev, | |||
2328 | dev->gso_max_size = size; | 2581 | dev->gso_max_size = size; |
2329 | } | 2582 | } |
2330 | 2583 | ||
2331 | extern int __skb_bond_should_drop(struct sk_buff *skb, | 2584 | static inline int netif_is_bond_slave(struct net_device *dev) |
2332 | struct net_device *master); | ||
2333 | |||
2334 | static inline int skb_bond_should_drop(struct sk_buff *skb, | ||
2335 | struct net_device *master) | ||
2336 | { | 2585 | { |
2337 | if (master) | 2586 | return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING; |
2338 | return __skb_bond_should_drop(skb, master); | ||
2339 | return 0; | ||
2340 | } | 2587 | } |
2341 | 2588 | ||
2342 | extern struct pernet_operations __net_initdata loopback_net_ops; | 2589 | extern struct pernet_operations __net_initdata loopback_net_ops; |
@@ -2351,6 +2598,8 @@ static inline int dev_ethtool_get_settings(struct net_device *dev, | |||
2351 | 2598 | ||
2352 | static inline u32 dev_ethtool_get_rx_csum(struct net_device *dev) | 2599 | static inline u32 dev_ethtool_get_rx_csum(struct net_device *dev) |
2353 | { | 2600 | { |
2601 | if (dev->hw_features & NETIF_F_RXCSUM) | ||
2602 | return !!(dev->features & NETIF_F_RXCSUM); | ||
2354 | if (!dev->ethtool_ops || !dev->ethtool_ops->get_rx_csum) | 2603 | if (!dev->ethtool_ops || !dev->ethtool_ops->get_rx_csum) |
2355 | return 0; | 2604 | return 0; |
2356 | return dev->ethtool_ops->get_rx_csum(dev); | 2605 | return dev->ethtool_ops->get_rx_csum(dev); |
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 1893837b3966..eeec00abb664 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h | |||
@@ -24,16 +24,20 @@ | |||
24 | #define NF_MAX_VERDICT NF_STOP | 24 | #define NF_MAX_VERDICT NF_STOP |
25 | 25 | ||
26 | /* we overload the higher bits for encoding auxiliary data such as the queue | 26 | /* we overload the higher bits for encoding auxiliary data such as the queue |
27 | * number. Not nice, but better than additional function arguments. */ | 27 | * number or errno values. Not nice, but better than additional function |
28 | #define NF_VERDICT_MASK 0x0000ffff | 28 | * arguments. */ |
29 | #define NF_VERDICT_BITS 16 | 29 | #define NF_VERDICT_MASK 0x000000ff |
30 | |||
31 | /* extra verdict flags have mask 0x0000ff00 */ | ||
32 | #define NF_VERDICT_FLAG_QUEUE_BYPASS 0x00008000 | ||
30 | 33 | ||
34 | /* queue number (NF_QUEUE) or errno (NF_DROP) */ | ||
31 | #define NF_VERDICT_QMASK 0xffff0000 | 35 | #define NF_VERDICT_QMASK 0xffff0000 |
32 | #define NF_VERDICT_QBITS 16 | 36 | #define NF_VERDICT_QBITS 16 |
33 | 37 | ||
34 | #define NF_QUEUE_NR(x) ((((x) << NF_VERDICT_BITS) & NF_VERDICT_QMASK) | NF_QUEUE) | 38 | #define NF_QUEUE_NR(x) ((((x) << 16) & NF_VERDICT_QMASK) | NF_QUEUE) |
35 | 39 | ||
36 | #define NF_DROP_ERR(x) (((-x) << NF_VERDICT_BITS) | NF_DROP) | 40 | #define NF_DROP_ERR(x) (((-x) << 16) | NF_DROP) |
37 | 41 | ||
38 | /* only for userspace compatibility */ | 42 | /* only for userspace compatibility */ |
39 | #ifndef __KERNEL__ | 43 | #ifndef __KERNEL__ |
@@ -41,6 +45,9 @@ | |||
41 | <= 0x2000 is used for protocol-flags. */ | 45 | <= 0x2000 is used for protocol-flags. */ |
42 | #define NFC_UNKNOWN 0x4000 | 46 | #define NFC_UNKNOWN 0x4000 |
43 | #define NFC_ALTERED 0x8000 | 47 | #define NFC_ALTERED 0x8000 |
48 | |||
49 | /* NF_VERDICT_BITS should be 8 now, but userspace might break if this changes */ | ||
50 | #define NF_VERDICT_BITS 16 | ||
44 | #endif | 51 | #endif |
45 | 52 | ||
46 | enum nf_inet_hooks { | 53 | enum nf_inet_hooks { |
@@ -72,6 +79,10 @@ union nf_inet_addr { | |||
72 | 79 | ||
73 | #ifdef __KERNEL__ | 80 | #ifdef __KERNEL__ |
74 | #ifdef CONFIG_NETFILTER | 81 | #ifdef CONFIG_NETFILTER |
82 | static inline int NF_DROP_GETERR(int verdict) | ||
83 | { | ||
84 | return -(verdict >> NF_VERDICT_QBITS); | ||
85 | } | ||
75 | 86 | ||
76 | static inline int nf_inet_addr_cmp(const union nf_inet_addr *a1, | 87 | static inline int nf_inet_addr_cmp(const union nf_inet_addr *a1, |
77 | const union nf_inet_addr *a2) | 88 | const union nf_inet_addr *a2) |
@@ -267,7 +278,7 @@ struct nf_afinfo { | |||
267 | int route_key_size; | 278 | int route_key_size; |
268 | }; | 279 | }; |
269 | 280 | ||
270 | extern const struct nf_afinfo *nf_afinfo[NFPROTO_NUMPROTO]; | 281 | extern const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO]; |
271 | static inline const struct nf_afinfo *nf_get_afinfo(unsigned short family) | 282 | static inline const struct nf_afinfo *nf_get_afinfo(unsigned short family) |
272 | { | 283 | { |
273 | return rcu_dereference(nf_afinfo[family]); | 284 | return rcu_dereference(nf_afinfo[family]); |
@@ -357,9 +368,9 @@ nf_nat_decode_session(struct sk_buff *skb, struct flowi *fl, u_int8_t family) | |||
357 | #endif /*CONFIG_NETFILTER*/ | 368 | #endif /*CONFIG_NETFILTER*/ |
358 | 369 | ||
359 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 370 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
360 | extern void (*ip_ct_attach)(struct sk_buff *, struct sk_buff *); | 371 | extern void (*ip_ct_attach)(struct sk_buff *, struct sk_buff *) __rcu; |
361 | extern void nf_ct_attach(struct sk_buff *, struct sk_buff *); | 372 | extern void nf_ct_attach(struct sk_buff *, struct sk_buff *); |
362 | extern void (*nf_ct_destroy)(struct nf_conntrack *); | 373 | extern void (*nf_ct_destroy)(struct nf_conntrack *) __rcu; |
363 | #else | 374 | #else |
364 | static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {} | 375 | static inline void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb) {} |
365 | #endif | 376 | #endif |
diff --git a/include/linux/netfilter/Kbuild b/include/linux/netfilter/Kbuild index 9d40effe7ca7..a1b410c76fc3 100644 --- a/include/linux/netfilter/Kbuild +++ b/include/linux/netfilter/Kbuild | |||
@@ -1,3 +1,5 @@ | |||
1 | header-y += ipset/ | ||
2 | |||
1 | header-y += nf_conntrack_common.h | 3 | header-y += nf_conntrack_common.h |
2 | header-y += nf_conntrack_ftp.h | 4 | header-y += nf_conntrack_ftp.h |
3 | header-y += nf_conntrack_sctp.h | 5 | header-y += nf_conntrack_sctp.h |
@@ -9,6 +11,7 @@ header-y += nfnetlink_conntrack.h | |||
9 | header-y += nfnetlink_log.h | 11 | header-y += nfnetlink_log.h |
10 | header-y += nfnetlink_queue.h | 12 | header-y += nfnetlink_queue.h |
11 | header-y += x_tables.h | 13 | header-y += x_tables.h |
14 | header-y += xt_AUDIT.h | ||
12 | header-y += xt_CHECKSUM.h | 15 | header-y += xt_CHECKSUM.h |
13 | header-y += xt_CLASSIFY.h | 16 | header-y += xt_CLASSIFY.h |
14 | header-y += xt_CONNMARK.h | 17 | header-y += xt_CONNMARK.h |
@@ -26,6 +29,7 @@ header-y += xt_TCPMSS.h | |||
26 | header-y += xt_TCPOPTSTRIP.h | 29 | header-y += xt_TCPOPTSTRIP.h |
27 | header-y += xt_TEE.h | 30 | header-y += xt_TEE.h |
28 | header-y += xt_TPROXY.h | 31 | header-y += xt_TPROXY.h |
32 | header-y += xt_addrtype.h | ||
29 | header-y += xt_cluster.h | 33 | header-y += xt_cluster.h |
30 | header-y += xt_comment.h | 34 | header-y += xt_comment.h |
31 | header-y += xt_connbytes.h | 35 | header-y += xt_connbytes.h |
@@ -34,6 +38,7 @@ header-y += xt_connmark.h | |||
34 | header-y += xt_conntrack.h | 38 | header-y += xt_conntrack.h |
35 | header-y += xt_cpu.h | 39 | header-y += xt_cpu.h |
36 | header-y += xt_dccp.h | 40 | header-y += xt_dccp.h |
41 | header-y += xt_devgroup.h | ||
37 | header-y += xt_dscp.h | 42 | header-y += xt_dscp.h |
38 | header-y += xt_esp.h | 43 | header-y += xt_esp.h |
39 | header-y += xt_hashlimit.h | 44 | header-y += xt_hashlimit.h |
@@ -54,7 +59,9 @@ header-y += xt_quota.h | |||
54 | header-y += xt_rateest.h | 59 | header-y += xt_rateest.h |
55 | header-y += xt_realm.h | 60 | header-y += xt_realm.h |
56 | header-y += xt_recent.h | 61 | header-y += xt_recent.h |
62 | header-y += xt_set.h | ||
57 | header-y += xt_sctp.h | 63 | header-y += xt_sctp.h |
64 | header-y += xt_socket.h | ||
58 | header-y += xt_state.h | 65 | header-y += xt_state.h |
59 | header-y += xt_statistic.h | 66 | header-y += xt_statistic.h |
60 | header-y += xt_string.h | 67 | header-y += xt_string.h |
diff --git a/include/linux/netfilter/ipset/Kbuild b/include/linux/netfilter/ipset/Kbuild new file mode 100644 index 000000000000..601fe71d34d5 --- /dev/null +++ b/include/linux/netfilter/ipset/Kbuild | |||
@@ -0,0 +1,4 @@ | |||
1 | header-y += ip_set.h | ||
2 | header-y += ip_set_bitmap.h | ||
3 | header-y += ip_set_hash.h | ||
4 | header-y += ip_set_list.h | ||
diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h new file mode 100644 index 000000000000..ec333d83f3b4 --- /dev/null +++ b/include/linux/netfilter/ipset/ip_set.h | |||
@@ -0,0 +1,452 @@ | |||
1 | #ifndef _IP_SET_H | ||
2 | #define _IP_SET_H | ||
3 | |||
4 | /* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> | ||
5 | * Patrick Schaaf <bof@bof.de> | ||
6 | * Martin Josefsson <gandalf@wlug.westbo.se> | ||
7 | * Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | /* The protocol version */ | ||
15 | #define IPSET_PROTOCOL 6 | ||
16 | |||
17 | /* The max length of strings including NUL: set and type identifiers */ | ||
18 | #define IPSET_MAXNAMELEN 32 | ||
19 | |||
20 | /* Message types and commands */ | ||
21 | enum ipset_cmd { | ||
22 | IPSET_CMD_NONE, | ||
23 | IPSET_CMD_PROTOCOL, /* 1: Return protocol version */ | ||
24 | IPSET_CMD_CREATE, /* 2: Create a new (empty) set */ | ||
25 | IPSET_CMD_DESTROY, /* 3: Destroy a (empty) set */ | ||
26 | IPSET_CMD_FLUSH, /* 4: Remove all elements from a set */ | ||
27 | IPSET_CMD_RENAME, /* 5: Rename a set */ | ||
28 | IPSET_CMD_SWAP, /* 6: Swap two sets */ | ||
29 | IPSET_CMD_LIST, /* 7: List sets */ | ||
30 | IPSET_CMD_SAVE, /* 8: Save sets */ | ||
31 | IPSET_CMD_ADD, /* 9: Add an element to a set */ | ||
32 | IPSET_CMD_DEL, /* 10: Delete an element from a set */ | ||
33 | IPSET_CMD_TEST, /* 11: Test an element in a set */ | ||
34 | IPSET_CMD_HEADER, /* 12: Get set header data only */ | ||
35 | IPSET_CMD_TYPE, /* 13: Get set type */ | ||
36 | IPSET_MSG_MAX, /* Netlink message commands */ | ||
37 | |||
38 | /* Commands in userspace: */ | ||
39 | IPSET_CMD_RESTORE = IPSET_MSG_MAX, /* 14: Enter restore mode */ | ||
40 | IPSET_CMD_HELP, /* 15: Get help */ | ||
41 | IPSET_CMD_VERSION, /* 16: Get program version */ | ||
42 | IPSET_CMD_QUIT, /* 17: Quit from interactive mode */ | ||
43 | |||
44 | IPSET_CMD_MAX, | ||
45 | |||
46 | IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 18: Commit buffered commands */ | ||
47 | }; | ||
48 | |||
49 | /* Attributes at command level */ | ||
50 | enum { | ||
51 | IPSET_ATTR_UNSPEC, | ||
52 | IPSET_ATTR_PROTOCOL, /* 1: Protocol version */ | ||
53 | IPSET_ATTR_SETNAME, /* 2: Name of the set */ | ||
54 | IPSET_ATTR_TYPENAME, /* 3: Typename */ | ||
55 | IPSET_ATTR_SETNAME2 = IPSET_ATTR_TYPENAME, /* Setname at rename/swap */ | ||
56 | IPSET_ATTR_REVISION, /* 4: Settype revision */ | ||
57 | IPSET_ATTR_FAMILY, /* 5: Settype family */ | ||
58 | IPSET_ATTR_FLAGS, /* 6: Flags at command level */ | ||
59 | IPSET_ATTR_DATA, /* 7: Nested attributes */ | ||
60 | IPSET_ATTR_ADT, /* 8: Multiple data containers */ | ||
61 | IPSET_ATTR_LINENO, /* 9: Restore lineno */ | ||
62 | IPSET_ATTR_PROTOCOL_MIN, /* 10: Minimal supported version number */ | ||
63 | IPSET_ATTR_REVISION_MIN = IPSET_ATTR_PROTOCOL_MIN, /* type rev min */ | ||
64 | __IPSET_ATTR_CMD_MAX, | ||
65 | }; | ||
66 | #define IPSET_ATTR_CMD_MAX (__IPSET_ATTR_CMD_MAX - 1) | ||
67 | |||
68 | /* CADT specific attributes */ | ||
69 | enum { | ||
70 | IPSET_ATTR_IP = IPSET_ATTR_UNSPEC + 1, | ||
71 | IPSET_ATTR_IP_FROM = IPSET_ATTR_IP, | ||
72 | IPSET_ATTR_IP_TO, /* 2 */ | ||
73 | IPSET_ATTR_CIDR, /* 3 */ | ||
74 | IPSET_ATTR_PORT, /* 4 */ | ||
75 | IPSET_ATTR_PORT_FROM = IPSET_ATTR_PORT, | ||
76 | IPSET_ATTR_PORT_TO, /* 5 */ | ||
77 | IPSET_ATTR_TIMEOUT, /* 6 */ | ||
78 | IPSET_ATTR_PROTO, /* 7 */ | ||
79 | IPSET_ATTR_CADT_FLAGS, /* 8 */ | ||
80 | IPSET_ATTR_CADT_LINENO = IPSET_ATTR_LINENO, /* 9 */ | ||
81 | /* Reserve empty slots */ | ||
82 | IPSET_ATTR_CADT_MAX = 16, | ||
83 | /* Create-only specific attributes */ | ||
84 | IPSET_ATTR_GC, | ||
85 | IPSET_ATTR_HASHSIZE, | ||
86 | IPSET_ATTR_MAXELEM, | ||
87 | IPSET_ATTR_NETMASK, | ||
88 | IPSET_ATTR_PROBES, | ||
89 | IPSET_ATTR_RESIZE, | ||
90 | IPSET_ATTR_SIZE, | ||
91 | /* Kernel-only */ | ||
92 | IPSET_ATTR_ELEMENTS, | ||
93 | IPSET_ATTR_REFERENCES, | ||
94 | IPSET_ATTR_MEMSIZE, | ||
95 | |||
96 | __IPSET_ATTR_CREATE_MAX, | ||
97 | }; | ||
98 | #define IPSET_ATTR_CREATE_MAX (__IPSET_ATTR_CREATE_MAX - 1) | ||
99 | |||
100 | /* ADT specific attributes */ | ||
101 | enum { | ||
102 | IPSET_ATTR_ETHER = IPSET_ATTR_CADT_MAX + 1, | ||
103 | IPSET_ATTR_NAME, | ||
104 | IPSET_ATTR_NAMEREF, | ||
105 | IPSET_ATTR_IP2, | ||
106 | IPSET_ATTR_CIDR2, | ||
107 | __IPSET_ATTR_ADT_MAX, | ||
108 | }; | ||
109 | #define IPSET_ATTR_ADT_MAX (__IPSET_ATTR_ADT_MAX - 1) | ||
110 | |||
111 | /* IP specific attributes */ | ||
112 | enum { | ||
113 | IPSET_ATTR_IPADDR_IPV4 = IPSET_ATTR_UNSPEC + 1, | ||
114 | IPSET_ATTR_IPADDR_IPV6, | ||
115 | __IPSET_ATTR_IPADDR_MAX, | ||
116 | }; | ||
117 | #define IPSET_ATTR_IPADDR_MAX (__IPSET_ATTR_IPADDR_MAX - 1) | ||
118 | |||
119 | /* Error codes */ | ||
120 | enum ipset_errno { | ||
121 | IPSET_ERR_PRIVATE = 4096, | ||
122 | IPSET_ERR_PROTOCOL, | ||
123 | IPSET_ERR_FIND_TYPE, | ||
124 | IPSET_ERR_MAX_SETS, | ||
125 | IPSET_ERR_BUSY, | ||
126 | IPSET_ERR_EXIST_SETNAME2, | ||
127 | IPSET_ERR_TYPE_MISMATCH, | ||
128 | IPSET_ERR_EXIST, | ||
129 | IPSET_ERR_INVALID_CIDR, | ||
130 | IPSET_ERR_INVALID_NETMASK, | ||
131 | IPSET_ERR_INVALID_FAMILY, | ||
132 | IPSET_ERR_TIMEOUT, | ||
133 | IPSET_ERR_REFERENCED, | ||
134 | IPSET_ERR_IPADDR_IPV4, | ||
135 | IPSET_ERR_IPADDR_IPV6, | ||
136 | |||
137 | /* Type specific error codes */ | ||
138 | IPSET_ERR_TYPE_SPECIFIC = 4352, | ||
139 | }; | ||
140 | |||
141 | /* Flags at command level */ | ||
142 | enum ipset_cmd_flags { | ||
143 | IPSET_FLAG_BIT_EXIST = 0, | ||
144 | IPSET_FLAG_EXIST = (1 << IPSET_FLAG_BIT_EXIST), | ||
145 | }; | ||
146 | |||
147 | /* Flags at CADT attribute level */ | ||
148 | enum ipset_cadt_flags { | ||
149 | IPSET_FLAG_BIT_BEFORE = 0, | ||
150 | IPSET_FLAG_BEFORE = (1 << IPSET_FLAG_BIT_BEFORE), | ||
151 | }; | ||
152 | |||
153 | /* Commands with settype-specific attributes */ | ||
154 | enum ipset_adt { | ||
155 | IPSET_ADD, | ||
156 | IPSET_DEL, | ||
157 | IPSET_TEST, | ||
158 | IPSET_ADT_MAX, | ||
159 | IPSET_CREATE = IPSET_ADT_MAX, | ||
160 | IPSET_CADT_MAX, | ||
161 | }; | ||
162 | |||
163 | #ifdef __KERNEL__ | ||
164 | #include <linux/ip.h> | ||
165 | #include <linux/ipv6.h> | ||
166 | #include <linux/netlink.h> | ||
167 | #include <linux/netfilter.h> | ||
168 | #include <linux/vmalloc.h> | ||
169 | #include <net/netlink.h> | ||
170 | |||
171 | /* Sets are identified by an index in kernel space. Tweak with ip_set_id_t | ||
172 | * and IPSET_INVALID_ID if you want to increase the max number of sets. | ||
173 | */ | ||
174 | typedef u16 ip_set_id_t; | ||
175 | |||
176 | #define IPSET_INVALID_ID 65535 | ||
177 | |||
178 | enum ip_set_dim { | ||
179 | IPSET_DIM_ZERO = 0, | ||
180 | IPSET_DIM_ONE, | ||
181 | IPSET_DIM_TWO, | ||
182 | IPSET_DIM_THREE, | ||
183 | /* Max dimension in elements. | ||
184 | * If changed, new revision of iptables match/target is required. | ||
185 | */ | ||
186 | IPSET_DIM_MAX = 6, | ||
187 | }; | ||
188 | |||
189 | /* Option flags for kernel operations */ | ||
190 | enum ip_set_kopt { | ||
191 | IPSET_INV_MATCH = (1 << IPSET_DIM_ZERO), | ||
192 | IPSET_DIM_ONE_SRC = (1 << IPSET_DIM_ONE), | ||
193 | IPSET_DIM_TWO_SRC = (1 << IPSET_DIM_TWO), | ||
194 | IPSET_DIM_THREE_SRC = (1 << IPSET_DIM_THREE), | ||
195 | }; | ||
196 | |||
197 | /* Set features */ | ||
198 | enum ip_set_feature { | ||
199 | IPSET_TYPE_IP_FLAG = 0, | ||
200 | IPSET_TYPE_IP = (1 << IPSET_TYPE_IP_FLAG), | ||
201 | IPSET_TYPE_PORT_FLAG = 1, | ||
202 | IPSET_TYPE_PORT = (1 << IPSET_TYPE_PORT_FLAG), | ||
203 | IPSET_TYPE_MAC_FLAG = 2, | ||
204 | IPSET_TYPE_MAC = (1 << IPSET_TYPE_MAC_FLAG), | ||
205 | IPSET_TYPE_IP2_FLAG = 3, | ||
206 | IPSET_TYPE_IP2 = (1 << IPSET_TYPE_IP2_FLAG), | ||
207 | IPSET_TYPE_NAME_FLAG = 4, | ||
208 | IPSET_TYPE_NAME = (1 << IPSET_TYPE_NAME_FLAG), | ||
209 | /* Strictly speaking not a feature, but a flag for dumping: | ||
210 | * this settype must be dumped last */ | ||
211 | IPSET_DUMP_LAST_FLAG = 7, | ||
212 | IPSET_DUMP_LAST = (1 << IPSET_DUMP_LAST_FLAG), | ||
213 | }; | ||
214 | |||
215 | struct ip_set; | ||
216 | |||
217 | typedef int (*ipset_adtfn)(struct ip_set *set, void *value, u32 timeout); | ||
218 | |||
219 | /* Set type, variant-specific part */ | ||
220 | struct ip_set_type_variant { | ||
221 | /* Kernelspace: test/add/del entries | ||
222 | * returns negative error code, | ||
223 | * zero for no match/success to add/delete | ||
224 | * positive for matching element */ | ||
225 | int (*kadt)(struct ip_set *set, const struct sk_buff * skb, | ||
226 | enum ipset_adt adt, u8 pf, u8 dim, u8 flags); | ||
227 | |||
228 | /* Userspace: test/add/del entries | ||
229 | * returns negative error code, | ||
230 | * zero for no match/success to add/delete | ||
231 | * positive for matching element */ | ||
232 | int (*uadt)(struct ip_set *set, struct nlattr *tb[], | ||
233 | enum ipset_adt adt, u32 *lineno, u32 flags); | ||
234 | |||
235 | /* Low level add/del/test functions */ | ||
236 | ipset_adtfn adt[IPSET_ADT_MAX]; | ||
237 | |||
238 | /* When adding entries and set is full, try to resize the set */ | ||
239 | int (*resize)(struct ip_set *set, bool retried); | ||
240 | /* Destroy the set */ | ||
241 | void (*destroy)(struct ip_set *set); | ||
242 | /* Flush the elements */ | ||
243 | void (*flush)(struct ip_set *set); | ||
244 | /* Expire entries before listing */ | ||
245 | void (*expire)(struct ip_set *set); | ||
246 | /* List set header data */ | ||
247 | int (*head)(struct ip_set *set, struct sk_buff *skb); | ||
248 | /* List elements */ | ||
249 | int (*list)(const struct ip_set *set, struct sk_buff *skb, | ||
250 | struct netlink_callback *cb); | ||
251 | |||
252 | /* Return true if "b" set is the same as "a" | ||
253 | * according to the create set parameters */ | ||
254 | bool (*same_set)(const struct ip_set *a, const struct ip_set *b); | ||
255 | }; | ||
256 | |||
257 | /* The core set type structure */ | ||
258 | struct ip_set_type { | ||
259 | struct list_head list; | ||
260 | |||
261 | /* Typename */ | ||
262 | char name[IPSET_MAXNAMELEN]; | ||
263 | /* Protocol version */ | ||
264 | u8 protocol; | ||
265 | /* Set features to control swapping */ | ||
266 | u8 features; | ||
267 | /* Set type dimension */ | ||
268 | u8 dimension; | ||
269 | /* Supported family: may be AF_UNSPEC for both AF_INET/AF_INET6 */ | ||
270 | u8 family; | ||
271 | /* Type revision */ | ||
272 | u8 revision; | ||
273 | |||
274 | /* Create set */ | ||
275 | int (*create)(struct ip_set *set, struct nlattr *tb[], u32 flags); | ||
276 | |||
277 | /* Attribute policies */ | ||
278 | const struct nla_policy create_policy[IPSET_ATTR_CREATE_MAX + 1]; | ||
279 | const struct nla_policy adt_policy[IPSET_ATTR_ADT_MAX + 1]; | ||
280 | |||
281 | /* Set this to THIS_MODULE if you are a module, otherwise NULL */ | ||
282 | struct module *me; | ||
283 | }; | ||
284 | |||
285 | /* register and unregister set type */ | ||
286 | extern int ip_set_type_register(struct ip_set_type *set_type); | ||
287 | extern void ip_set_type_unregister(struct ip_set_type *set_type); | ||
288 | |||
289 | /* A generic IP set */ | ||
290 | struct ip_set { | ||
291 | /* The name of the set */ | ||
292 | char name[IPSET_MAXNAMELEN]; | ||
293 | /* Lock protecting the set data */ | ||
294 | rwlock_t lock; | ||
295 | /* References to the set */ | ||
296 | atomic_t ref; | ||
297 | /* The core set type */ | ||
298 | struct ip_set_type *type; | ||
299 | /* The type variant doing the real job */ | ||
300 | const struct ip_set_type_variant *variant; | ||
301 | /* The actual INET family of the set */ | ||
302 | u8 family; | ||
303 | /* The type specific data */ | ||
304 | void *data; | ||
305 | }; | ||
306 | |||
307 | /* register and unregister set references */ | ||
308 | extern ip_set_id_t ip_set_get_byname(const char *name, struct ip_set **set); | ||
309 | extern void ip_set_put_byindex(ip_set_id_t index); | ||
310 | extern const char * ip_set_name_byindex(ip_set_id_t index); | ||
311 | extern ip_set_id_t ip_set_nfnl_get(const char *name); | ||
312 | extern ip_set_id_t ip_set_nfnl_get_byindex(ip_set_id_t index); | ||
313 | extern void ip_set_nfnl_put(ip_set_id_t index); | ||
314 | |||
315 | /* API for iptables set match, and SET target */ | ||
316 | extern int ip_set_add(ip_set_id_t id, const struct sk_buff *skb, | ||
317 | u8 family, u8 dim, u8 flags); | ||
318 | extern int ip_set_del(ip_set_id_t id, const struct sk_buff *skb, | ||
319 | u8 family, u8 dim, u8 flags); | ||
320 | extern int ip_set_test(ip_set_id_t id, const struct sk_buff *skb, | ||
321 | u8 family, u8 dim, u8 flags); | ||
322 | |||
323 | /* Utility functions */ | ||
324 | extern void * ip_set_alloc(size_t size); | ||
325 | extern void ip_set_free(void *members); | ||
326 | extern int ip_set_get_ipaddr4(struct nlattr *nla, __be32 *ipaddr); | ||
327 | extern int ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr); | ||
328 | |||
329 | static inline int | ||
330 | ip_set_get_hostipaddr4(struct nlattr *nla, u32 *ipaddr) | ||
331 | { | ||
332 | __be32 ip; | ||
333 | int ret = ip_set_get_ipaddr4(nla, &ip); | ||
334 | |||
335 | if (ret) | ||
336 | return ret; | ||
337 | *ipaddr = ntohl(ip); | ||
338 | return 0; | ||
339 | } | ||
340 | |||
341 | /* Ignore IPSET_ERR_EXIST errors if asked to do so? */ | ||
342 | static inline bool | ||
343 | ip_set_eexist(int ret, u32 flags) | ||
344 | { | ||
345 | return ret == -IPSET_ERR_EXIST && (flags & IPSET_FLAG_EXIST); | ||
346 | } | ||
347 | |||
348 | /* Check the NLA_F_NET_BYTEORDER flag */ | ||
349 | static inline bool | ||
350 | ip_set_attr_netorder(struct nlattr *tb[], int type) | ||
351 | { | ||
352 | return tb[type] && (tb[type]->nla_type & NLA_F_NET_BYTEORDER); | ||
353 | } | ||
354 | |||
355 | static inline bool | ||
356 | ip_set_optattr_netorder(struct nlattr *tb[], int type) | ||
357 | { | ||
358 | return !tb[type] || (tb[type]->nla_type & NLA_F_NET_BYTEORDER); | ||
359 | } | ||
360 | |||
361 | /* Useful converters */ | ||
362 | static inline u32 | ||
363 | ip_set_get_h32(const struct nlattr *attr) | ||
364 | { | ||
365 | return ntohl(nla_get_be32(attr)); | ||
366 | } | ||
367 | |||
368 | static inline u16 | ||
369 | ip_set_get_h16(const struct nlattr *attr) | ||
370 | { | ||
371 | return ntohs(nla_get_be16(attr)); | ||
372 | } | ||
373 | |||
374 | #define ipset_nest_start(skb, attr) nla_nest_start(skb, attr | NLA_F_NESTED) | ||
375 | #define ipset_nest_end(skb, start) nla_nest_end(skb, start) | ||
376 | |||
377 | #define NLA_PUT_IPADDR4(skb, type, ipaddr) \ | ||
378 | do { \ | ||
379 | struct nlattr *__nested = ipset_nest_start(skb, type); \ | ||
380 | \ | ||
381 | if (!__nested) \ | ||
382 | goto nla_put_failure; \ | ||
383 | NLA_PUT_NET32(skb, IPSET_ATTR_IPADDR_IPV4, ipaddr); \ | ||
384 | ipset_nest_end(skb, __nested); \ | ||
385 | } while (0) | ||
386 | |||
387 | #define NLA_PUT_IPADDR6(skb, type, ipaddrptr) \ | ||
388 | do { \ | ||
389 | struct nlattr *__nested = ipset_nest_start(skb, type); \ | ||
390 | \ | ||
391 | if (!__nested) \ | ||
392 | goto nla_put_failure; \ | ||
393 | NLA_PUT(skb, IPSET_ATTR_IPADDR_IPV6, \ | ||
394 | sizeof(struct in6_addr), ipaddrptr); \ | ||
395 | ipset_nest_end(skb, __nested); \ | ||
396 | } while (0) | ||
397 | |||
398 | /* Get address from skbuff */ | ||
399 | static inline __be32 | ||
400 | ip4addr(const struct sk_buff *skb, bool src) | ||
401 | { | ||
402 | return src ? ip_hdr(skb)->saddr : ip_hdr(skb)->daddr; | ||
403 | } | ||
404 | |||
405 | static inline void | ||
406 | ip4addrptr(const struct sk_buff *skb, bool src, __be32 *addr) | ||
407 | { | ||
408 | *addr = src ? ip_hdr(skb)->saddr : ip_hdr(skb)->daddr; | ||
409 | } | ||
410 | |||
411 | static inline void | ||
412 | ip6addrptr(const struct sk_buff *skb, bool src, struct in6_addr *addr) | ||
413 | { | ||
414 | memcpy(addr, src ? &ipv6_hdr(skb)->saddr : &ipv6_hdr(skb)->daddr, | ||
415 | sizeof(*addr)); | ||
416 | } | ||
417 | |||
418 | /* Calculate the bytes required to store the inclusive range of a-b */ | ||
419 | static inline int | ||
420 | bitmap_bytes(u32 a, u32 b) | ||
421 | { | ||
422 | return 4 * ((((b - a + 8) / 8) + 3) / 4); | ||
423 | } | ||
424 | |||
425 | /* Interface to iptables/ip6tables */ | ||
426 | |||
427 | #define SO_IP_SET 83 | ||
428 | |||
429 | union ip_set_name_index { | ||
430 | char name[IPSET_MAXNAMELEN]; | ||
431 | ip_set_id_t index; | ||
432 | }; | ||
433 | |||
434 | #define IP_SET_OP_GET_BYNAME 0x00000006 /* Get set index by name */ | ||
435 | struct ip_set_req_get_set { | ||
436 | unsigned op; | ||
437 | unsigned version; | ||
438 | union ip_set_name_index set; | ||
439 | }; | ||
440 | |||
441 | #define IP_SET_OP_GET_BYINDEX 0x00000007 /* Get set name by index */ | ||
442 | /* Uses ip_set_req_get_set */ | ||
443 | |||
444 | #define IP_SET_OP_VERSION 0x00000100 /* Ask kernel version */ | ||
445 | struct ip_set_req_version { | ||
446 | unsigned op; | ||
447 | unsigned version; | ||
448 | }; | ||
449 | |||
450 | #endif /* __KERNEL__ */ | ||
451 | |||
452 | #endif /*_IP_SET_H */ | ||
diff --git a/include/linux/netfilter/ipset/ip_set_ahash.h b/include/linux/netfilter/ipset/ip_set_ahash.h new file mode 100644 index 000000000000..ec9d9bea1e37 --- /dev/null +++ b/include/linux/netfilter/ipset/ip_set_ahash.h | |||
@@ -0,0 +1,1074 @@ | |||
1 | #ifndef _IP_SET_AHASH_H | ||
2 | #define _IP_SET_AHASH_H | ||
3 | |||
4 | #include <linux/rcupdate.h> | ||
5 | #include <linux/jhash.h> | ||
6 | #include <linux/netfilter/ipset/ip_set_timeout.h> | ||
7 | |||
8 | /* Hashing which uses arrays to resolve clashing. The hash table is resized | ||
9 | * (doubled) when searching becomes too long. | ||
10 | * Internally jhash is used with the assumption that the size of the | ||
11 | * stored data is a multiple of sizeof(u32). If storage supports timeout, | ||
12 | * the timeout field must be the last one in the data structure - that field | ||
13 | * is ignored when computing the hash key. | ||
14 | * | ||
15 | * Readers and resizing | ||
16 | * | ||
17 | * Resizing can be triggered by userspace command only, and those | ||
18 | * are serialized by the nfnl mutex. During resizing the set is | ||
19 | * read-locked, so the only possible concurrent operations are | ||
20 | * the kernel side readers. Those must be protected by proper RCU locking. | ||
21 | */ | ||
22 | |||
23 | /* Number of elements to store in an initial array block */ | ||
24 | #define AHASH_INIT_SIZE 4 | ||
25 | /* Max number of elements to store in an array block */ | ||
26 | #define AHASH_MAX_SIZE (3*4) | ||
27 | |||
28 | /* A hash bucket */ | ||
29 | struct hbucket { | ||
30 | void *value; /* the array of the values */ | ||
31 | u8 size; /* size of the array */ | ||
32 | u8 pos; /* position of the first free entry */ | ||
33 | }; | ||
34 | |||
35 | /* The hash table: the table size stored here in order to make resizing easy */ | ||
36 | struct htable { | ||
37 | u8 htable_bits; /* size of hash table == 2^htable_bits */ | ||
38 | struct hbucket bucket[0]; /* hashtable buckets */ | ||
39 | }; | ||
40 | |||
41 | #define hbucket(h, i) &((h)->bucket[i]) | ||
42 | |||
43 | /* Book-keeping of the prefixes added to the set */ | ||
44 | struct ip_set_hash_nets { | ||
45 | u8 cidr; /* the different cidr values in the set */ | ||
46 | u32 nets; /* number of elements per cidr */ | ||
47 | }; | ||
48 | |||
49 | /* The generic ip_set hash structure */ | ||
50 | struct ip_set_hash { | ||
51 | struct htable *table; /* the hash table */ | ||
52 | u32 maxelem; /* max elements in the hash */ | ||
53 | u32 elements; /* current element (vs timeout) */ | ||
54 | u32 initval; /* random jhash init value */ | ||
55 | u32 timeout; /* timeout value, if enabled */ | ||
56 | struct timer_list gc; /* garbage collection when timeout enabled */ | ||
57 | #ifdef IP_SET_HASH_WITH_NETMASK | ||
58 | u8 netmask; /* netmask value for subnets to store */ | ||
59 | #endif | ||
60 | #ifdef IP_SET_HASH_WITH_NETS | ||
61 | struct ip_set_hash_nets nets[0]; /* book-keeping of prefixes */ | ||
62 | #endif | ||
63 | }; | ||
64 | |||
65 | /* Compute htable_bits from the user input parameter hashsize */ | ||
66 | static u8 | ||
67 | htable_bits(u32 hashsize) | ||
68 | { | ||
69 | /* Assume that hashsize == 2^htable_bits */ | ||
70 | u8 bits = fls(hashsize - 1); | ||
71 | if (jhash_size(bits) != hashsize) | ||
72 | /* Round up to the first 2^n value */ | ||
73 | bits = fls(hashsize); | ||
74 | |||
75 | return bits; | ||
76 | } | ||
77 | |||
78 | #ifdef IP_SET_HASH_WITH_NETS | ||
79 | |||
80 | #define SET_HOST_MASK(family) (family == AF_INET ? 32 : 128) | ||
81 | |||
82 | /* Network cidr size book keeping when the hash stores different | ||
83 | * sized networks */ | ||
84 | static void | ||
85 | add_cidr(struct ip_set_hash *h, u8 cidr, u8 host_mask) | ||
86 | { | ||
87 | u8 i; | ||
88 | |||
89 | ++h->nets[cidr-1].nets; | ||
90 | |||
91 | pr_debug("add_cidr added %u: %u\n", cidr, h->nets[cidr-1].nets); | ||
92 | |||
93 | if (h->nets[cidr-1].nets > 1) | ||
94 | return; | ||
95 | |||
96 | /* New cidr size */ | ||
97 | for (i = 0; i < host_mask && h->nets[i].cidr; i++) { | ||
98 | /* Add in increasing prefix order, so larger cidr first */ | ||
99 | if (h->nets[i].cidr < cidr) | ||
100 | swap(h->nets[i].cidr, cidr); | ||
101 | } | ||
102 | if (i < host_mask) | ||
103 | h->nets[i].cidr = cidr; | ||
104 | } | ||
105 | |||
106 | static void | ||
107 | del_cidr(struct ip_set_hash *h, u8 cidr, u8 host_mask) | ||
108 | { | ||
109 | u8 i; | ||
110 | |||
111 | --h->nets[cidr-1].nets; | ||
112 | |||
113 | pr_debug("del_cidr deleted %u: %u\n", cidr, h->nets[cidr-1].nets); | ||
114 | |||
115 | if (h->nets[cidr-1].nets != 0) | ||
116 | return; | ||
117 | |||
118 | /* All entries with this cidr size deleted, so cleanup h->cidr[] */ | ||
119 | for (i = 0; i < host_mask - 1 && h->nets[i].cidr; i++) { | ||
120 | if (h->nets[i].cidr == cidr) | ||
121 | h->nets[i].cidr = cidr = h->nets[i+1].cidr; | ||
122 | } | ||
123 | h->nets[i - 1].cidr = 0; | ||
124 | } | ||
125 | #endif | ||
126 | |||
127 | /* Destroy the hashtable part of the set */ | ||
128 | static void | ||
129 | ahash_destroy(struct htable *t) | ||
130 | { | ||
131 | struct hbucket *n; | ||
132 | u32 i; | ||
133 | |||
134 | for (i = 0; i < jhash_size(t->htable_bits); i++) { | ||
135 | n = hbucket(t, i); | ||
136 | if (n->size) | ||
137 | /* FIXME: use slab cache */ | ||
138 | kfree(n->value); | ||
139 | } | ||
140 | |||
141 | ip_set_free(t); | ||
142 | } | ||
143 | |||
144 | /* Calculate the actual memory size of the set data */ | ||
145 | static size_t | ||
146 | ahash_memsize(const struct ip_set_hash *h, size_t dsize, u8 host_mask) | ||
147 | { | ||
148 | u32 i; | ||
149 | struct htable *t = h->table; | ||
150 | size_t memsize = sizeof(*h) | ||
151 | + sizeof(*t) | ||
152 | #ifdef IP_SET_HASH_WITH_NETS | ||
153 | + sizeof(struct ip_set_hash_nets) * host_mask | ||
154 | #endif | ||
155 | + jhash_size(t->htable_bits) * sizeof(struct hbucket); | ||
156 | |||
157 | for (i = 0; i < jhash_size(t->htable_bits); i++) | ||
158 | memsize += t->bucket[i].size * dsize; | ||
159 | |||
160 | return memsize; | ||
161 | } | ||
162 | |||
163 | /* Flush a hash type of set: destroy all elements */ | ||
164 | static void | ||
165 | ip_set_hash_flush(struct ip_set *set) | ||
166 | { | ||
167 | struct ip_set_hash *h = set->data; | ||
168 | struct htable *t = h->table; | ||
169 | struct hbucket *n; | ||
170 | u32 i; | ||
171 | |||
172 | for (i = 0; i < jhash_size(t->htable_bits); i++) { | ||
173 | n = hbucket(t, i); | ||
174 | if (n->size) { | ||
175 | n->size = n->pos = 0; | ||
176 | /* FIXME: use slab cache */ | ||
177 | kfree(n->value); | ||
178 | } | ||
179 | } | ||
180 | #ifdef IP_SET_HASH_WITH_NETS | ||
181 | memset(h->nets, 0, sizeof(struct ip_set_hash_nets) | ||
182 | * SET_HOST_MASK(set->family)); | ||
183 | #endif | ||
184 | h->elements = 0; | ||
185 | } | ||
186 | |||
187 | /* Destroy a hash type of set */ | ||
188 | static void | ||
189 | ip_set_hash_destroy(struct ip_set *set) | ||
190 | { | ||
191 | struct ip_set_hash *h = set->data; | ||
192 | |||
193 | if (with_timeout(h->timeout)) | ||
194 | del_timer_sync(&h->gc); | ||
195 | |||
196 | ahash_destroy(h->table); | ||
197 | kfree(h); | ||
198 | |||
199 | set->data = NULL; | ||
200 | } | ||
201 | |||
202 | #define HKEY(data, initval, htable_bits) \ | ||
203 | (jhash2((u32 *)(data), sizeof(struct type_pf_elem)/sizeof(u32), initval) \ | ||
204 | & jhash_mask(htable_bits)) | ||
205 | |||
206 | #endif /* _IP_SET_AHASH_H */ | ||
207 | |||
208 | #define CONCAT(a, b, c) a##b##c | ||
209 | #define TOKEN(a, b, c) CONCAT(a, b, c) | ||
210 | |||
211 | /* Type/family dependent function prototypes */ | ||
212 | |||
213 | #define type_pf_data_equal TOKEN(TYPE, PF, _data_equal) | ||
214 | #define type_pf_data_isnull TOKEN(TYPE, PF, _data_isnull) | ||
215 | #define type_pf_data_copy TOKEN(TYPE, PF, _data_copy) | ||
216 | #define type_pf_data_zero_out TOKEN(TYPE, PF, _data_zero_out) | ||
217 | #define type_pf_data_netmask TOKEN(TYPE, PF, _data_netmask) | ||
218 | #define type_pf_data_list TOKEN(TYPE, PF, _data_list) | ||
219 | #define type_pf_data_tlist TOKEN(TYPE, PF, _data_tlist) | ||
220 | |||
221 | #define type_pf_elem TOKEN(TYPE, PF, _elem) | ||
222 | #define type_pf_telem TOKEN(TYPE, PF, _telem) | ||
223 | #define type_pf_data_timeout TOKEN(TYPE, PF, _data_timeout) | ||
224 | #define type_pf_data_expired TOKEN(TYPE, PF, _data_expired) | ||
225 | #define type_pf_data_timeout_set TOKEN(TYPE, PF, _data_timeout_set) | ||
226 | |||
227 | #define type_pf_elem_add TOKEN(TYPE, PF, _elem_add) | ||
228 | #define type_pf_add TOKEN(TYPE, PF, _add) | ||
229 | #define type_pf_del TOKEN(TYPE, PF, _del) | ||
230 | #define type_pf_test_cidrs TOKEN(TYPE, PF, _test_cidrs) | ||
231 | #define type_pf_test TOKEN(TYPE, PF, _test) | ||
232 | |||
233 | #define type_pf_elem_tadd TOKEN(TYPE, PF, _elem_tadd) | ||
234 | #define type_pf_del_telem TOKEN(TYPE, PF, _ahash_del_telem) | ||
235 | #define type_pf_expire TOKEN(TYPE, PF, _expire) | ||
236 | #define type_pf_tadd TOKEN(TYPE, PF, _tadd) | ||
237 | #define type_pf_tdel TOKEN(TYPE, PF, _tdel) | ||
238 | #define type_pf_ttest_cidrs TOKEN(TYPE, PF, _ahash_ttest_cidrs) | ||
239 | #define type_pf_ttest TOKEN(TYPE, PF, _ahash_ttest) | ||
240 | |||
241 | #define type_pf_resize TOKEN(TYPE, PF, _resize) | ||
242 | #define type_pf_tresize TOKEN(TYPE, PF, _tresize) | ||
243 | #define type_pf_flush ip_set_hash_flush | ||
244 | #define type_pf_destroy ip_set_hash_destroy | ||
245 | #define type_pf_head TOKEN(TYPE, PF, _head) | ||
246 | #define type_pf_list TOKEN(TYPE, PF, _list) | ||
247 | #define type_pf_tlist TOKEN(TYPE, PF, _tlist) | ||
248 | #define type_pf_same_set TOKEN(TYPE, PF, _same_set) | ||
249 | #define type_pf_kadt TOKEN(TYPE, PF, _kadt) | ||
250 | #define type_pf_uadt TOKEN(TYPE, PF, _uadt) | ||
251 | #define type_pf_gc TOKEN(TYPE, PF, _gc) | ||
252 | #define type_pf_gc_init TOKEN(TYPE, PF, _gc_init) | ||
253 | #define type_pf_variant TOKEN(TYPE, PF, _variant) | ||
254 | #define type_pf_tvariant TOKEN(TYPE, PF, _tvariant) | ||
255 | |||
256 | /* Flavour without timeout */ | ||
257 | |||
258 | /* Get the ith element from the array block n */ | ||
259 | #define ahash_data(n, i) \ | ||
260 | ((struct type_pf_elem *)((n)->value) + (i)) | ||
261 | |||
262 | /* Add an element to the hash table when resizing the set: | ||
263 | * we spare the maintenance of the internal counters. */ | ||
264 | static int | ||
265 | type_pf_elem_add(struct hbucket *n, const struct type_pf_elem *value) | ||
266 | { | ||
267 | if (n->pos >= n->size) { | ||
268 | void *tmp; | ||
269 | |||
270 | if (n->size >= AHASH_MAX_SIZE) | ||
271 | /* Trigger rehashing */ | ||
272 | return -EAGAIN; | ||
273 | |||
274 | tmp = kzalloc((n->size + AHASH_INIT_SIZE) | ||
275 | * sizeof(struct type_pf_elem), | ||
276 | GFP_ATOMIC); | ||
277 | if (!tmp) | ||
278 | return -ENOMEM; | ||
279 | if (n->size) { | ||
280 | memcpy(tmp, n->value, | ||
281 | sizeof(struct type_pf_elem) * n->size); | ||
282 | kfree(n->value); | ||
283 | } | ||
284 | n->value = tmp; | ||
285 | n->size += AHASH_INIT_SIZE; | ||
286 | } | ||
287 | type_pf_data_copy(ahash_data(n, n->pos++), value); | ||
288 | return 0; | ||
289 | } | ||
290 | |||
291 | /* Resize a hash: create a new hash table with doubling the hashsize | ||
292 | * and inserting the elements to it. Repeat until we succeed or | ||
293 | * fail due to memory pressures. */ | ||
294 | static int | ||
295 | type_pf_resize(struct ip_set *set, bool retried) | ||
296 | { | ||
297 | struct ip_set_hash *h = set->data; | ||
298 | struct htable *t, *orig = h->table; | ||
299 | u8 htable_bits = orig->htable_bits; | ||
300 | const struct type_pf_elem *data; | ||
301 | struct hbucket *n, *m; | ||
302 | u32 i, j; | ||
303 | int ret; | ||
304 | |||
305 | retry: | ||
306 | ret = 0; | ||
307 | htable_bits++; | ||
308 | pr_debug("attempt to resize set %s from %u to %u, t %p\n", | ||
309 | set->name, orig->htable_bits, htable_bits, orig); | ||
310 | if (!htable_bits) | ||
311 | /* In case we have plenty of memory :-) */ | ||
312 | return -IPSET_ERR_HASH_FULL; | ||
313 | t = ip_set_alloc(sizeof(*t) | ||
314 | + jhash_size(htable_bits) * sizeof(struct hbucket)); | ||
315 | if (!t) | ||
316 | return -ENOMEM; | ||
317 | t->htable_bits = htable_bits; | ||
318 | |||
319 | read_lock_bh(&set->lock); | ||
320 | for (i = 0; i < jhash_size(orig->htable_bits); i++) { | ||
321 | n = hbucket(orig, i); | ||
322 | for (j = 0; j < n->pos; j++) { | ||
323 | data = ahash_data(n, j); | ||
324 | m = hbucket(t, HKEY(data, h->initval, htable_bits)); | ||
325 | ret = type_pf_elem_add(m, data); | ||
326 | if (ret < 0) { | ||
327 | read_unlock_bh(&set->lock); | ||
328 | ahash_destroy(t); | ||
329 | if (ret == -EAGAIN) | ||
330 | goto retry; | ||
331 | return ret; | ||
332 | } | ||
333 | } | ||
334 | } | ||
335 | |||
336 | rcu_assign_pointer(h->table, t); | ||
337 | read_unlock_bh(&set->lock); | ||
338 | |||
339 | /* Give time to other readers of the set */ | ||
340 | synchronize_rcu_bh(); | ||
341 | |||
342 | pr_debug("set %s resized from %u (%p) to %u (%p)\n", set->name, | ||
343 | orig->htable_bits, orig, t->htable_bits, t); | ||
344 | ahash_destroy(orig); | ||
345 | |||
346 | return 0; | ||
347 | } | ||
348 | |||
349 | /* Add an element to a hash and update the internal counters when succeeded, | ||
350 | * otherwise report the proper error code. */ | ||
351 | static int | ||
352 | type_pf_add(struct ip_set *set, void *value, u32 timeout) | ||
353 | { | ||
354 | struct ip_set_hash *h = set->data; | ||
355 | struct htable *t; | ||
356 | const struct type_pf_elem *d = value; | ||
357 | struct hbucket *n; | ||
358 | int i, ret = 0; | ||
359 | u32 key; | ||
360 | |||
361 | if (h->elements >= h->maxelem) | ||
362 | return -IPSET_ERR_HASH_FULL; | ||
363 | |||
364 | rcu_read_lock_bh(); | ||
365 | t = rcu_dereference_bh(h->table); | ||
366 | key = HKEY(value, h->initval, t->htable_bits); | ||
367 | n = hbucket(t, key); | ||
368 | for (i = 0; i < n->pos; i++) | ||
369 | if (type_pf_data_equal(ahash_data(n, i), d)) { | ||
370 | ret = -IPSET_ERR_EXIST; | ||
371 | goto out; | ||
372 | } | ||
373 | |||
374 | ret = type_pf_elem_add(n, value); | ||
375 | if (ret != 0) | ||
376 | goto out; | ||
377 | |||
378 | #ifdef IP_SET_HASH_WITH_NETS | ||
379 | add_cidr(h, d->cidr, HOST_MASK); | ||
380 | #endif | ||
381 | h->elements++; | ||
382 | out: | ||
383 | rcu_read_unlock_bh(); | ||
384 | return ret; | ||
385 | } | ||
386 | |||
387 | /* Delete an element from the hash: swap it with the last element | ||
388 | * and free up space if possible. | ||
389 | */ | ||
390 | static int | ||
391 | type_pf_del(struct ip_set *set, void *value, u32 timeout) | ||
392 | { | ||
393 | struct ip_set_hash *h = set->data; | ||
394 | struct htable *t = h->table; | ||
395 | const struct type_pf_elem *d = value; | ||
396 | struct hbucket *n; | ||
397 | int i; | ||
398 | struct type_pf_elem *data; | ||
399 | u32 key; | ||
400 | |||
401 | key = HKEY(value, h->initval, t->htable_bits); | ||
402 | n = hbucket(t, key); | ||
403 | for (i = 0; i < n->pos; i++) { | ||
404 | data = ahash_data(n, i); | ||
405 | if (!type_pf_data_equal(data, d)) | ||
406 | continue; | ||
407 | if (i != n->pos - 1) | ||
408 | /* Not last one */ | ||
409 | type_pf_data_copy(data, ahash_data(n, n->pos - 1)); | ||
410 | |||
411 | n->pos--; | ||
412 | h->elements--; | ||
413 | #ifdef IP_SET_HASH_WITH_NETS | ||
414 | del_cidr(h, d->cidr, HOST_MASK); | ||
415 | #endif | ||
416 | if (n->pos + AHASH_INIT_SIZE < n->size) { | ||
417 | void *tmp = kzalloc((n->size - AHASH_INIT_SIZE) | ||
418 | * sizeof(struct type_pf_elem), | ||
419 | GFP_ATOMIC); | ||
420 | if (!tmp) | ||
421 | return 0; | ||
422 | n->size -= AHASH_INIT_SIZE; | ||
423 | memcpy(tmp, n->value, | ||
424 | n->size * sizeof(struct type_pf_elem)); | ||
425 | kfree(n->value); | ||
426 | n->value = tmp; | ||
427 | } | ||
428 | return 0; | ||
429 | } | ||
430 | |||
431 | return -IPSET_ERR_EXIST; | ||
432 | } | ||
433 | |||
434 | #ifdef IP_SET_HASH_WITH_NETS | ||
435 | |||
436 | /* Special test function which takes into account the different network | ||
437 | * sizes added to the set */ | ||
438 | static int | ||
439 | type_pf_test_cidrs(struct ip_set *set, struct type_pf_elem *d, u32 timeout) | ||
440 | { | ||
441 | struct ip_set_hash *h = set->data; | ||
442 | struct htable *t = h->table; | ||
443 | struct hbucket *n; | ||
444 | const struct type_pf_elem *data; | ||
445 | int i, j = 0; | ||
446 | u32 key; | ||
447 | u8 host_mask = SET_HOST_MASK(set->family); | ||
448 | |||
449 | pr_debug("test by nets\n"); | ||
450 | for (; j < host_mask && h->nets[j].cidr; j++) { | ||
451 | type_pf_data_netmask(d, h->nets[j].cidr); | ||
452 | key = HKEY(d, h->initval, t->htable_bits); | ||
453 | n = hbucket(t, key); | ||
454 | for (i = 0; i < n->pos; i++) { | ||
455 | data = ahash_data(n, i); | ||
456 | if (type_pf_data_equal(data, d)) | ||
457 | return 1; | ||
458 | } | ||
459 | } | ||
460 | return 0; | ||
461 | } | ||
462 | #endif | ||
463 | |||
464 | /* Test whether the element is added to the set */ | ||
465 | static int | ||
466 | type_pf_test(struct ip_set *set, void *value, u32 timeout) | ||
467 | { | ||
468 | struct ip_set_hash *h = set->data; | ||
469 | struct htable *t = h->table; | ||
470 | struct type_pf_elem *d = value; | ||
471 | struct hbucket *n; | ||
472 | const struct type_pf_elem *data; | ||
473 | int i; | ||
474 | u32 key; | ||
475 | |||
476 | #ifdef IP_SET_HASH_WITH_NETS | ||
477 | /* If we test an IP address and not a network address, | ||
478 | * try all possible network sizes */ | ||
479 | if (d->cidr == SET_HOST_MASK(set->family)) | ||
480 | return type_pf_test_cidrs(set, d, timeout); | ||
481 | #endif | ||
482 | |||
483 | key = HKEY(d, h->initval, t->htable_bits); | ||
484 | n = hbucket(t, key); | ||
485 | for (i = 0; i < n->pos; i++) { | ||
486 | data = ahash_data(n, i); | ||
487 | if (type_pf_data_equal(data, d)) | ||
488 | return 1; | ||
489 | } | ||
490 | return 0; | ||
491 | } | ||
492 | |||
493 | /* Reply a HEADER request: fill out the header part of the set */ | ||
494 | static int | ||
495 | type_pf_head(struct ip_set *set, struct sk_buff *skb) | ||
496 | { | ||
497 | const struct ip_set_hash *h = set->data; | ||
498 | struct nlattr *nested; | ||
499 | size_t memsize; | ||
500 | |||
501 | read_lock_bh(&set->lock); | ||
502 | memsize = ahash_memsize(h, with_timeout(h->timeout) | ||
503 | ? sizeof(struct type_pf_telem) | ||
504 | : sizeof(struct type_pf_elem), | ||
505 | set->family == AF_INET ? 32 : 128); | ||
506 | read_unlock_bh(&set->lock); | ||
507 | |||
508 | nested = ipset_nest_start(skb, IPSET_ATTR_DATA); | ||
509 | if (!nested) | ||
510 | goto nla_put_failure; | ||
511 | NLA_PUT_NET32(skb, IPSET_ATTR_HASHSIZE, | ||
512 | htonl(jhash_size(h->table->htable_bits))); | ||
513 | NLA_PUT_NET32(skb, IPSET_ATTR_MAXELEM, htonl(h->maxelem)); | ||
514 | #ifdef IP_SET_HASH_WITH_NETMASK | ||
515 | if (h->netmask != HOST_MASK) | ||
516 | NLA_PUT_U8(skb, IPSET_ATTR_NETMASK, h->netmask); | ||
517 | #endif | ||
518 | NLA_PUT_NET32(skb, IPSET_ATTR_REFERENCES, | ||
519 | htonl(atomic_read(&set->ref) - 1)); | ||
520 | NLA_PUT_NET32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)); | ||
521 | if (with_timeout(h->timeout)) | ||
522 | NLA_PUT_NET32(skb, IPSET_ATTR_TIMEOUT, htonl(h->timeout)); | ||
523 | ipset_nest_end(skb, nested); | ||
524 | |||
525 | return 0; | ||
526 | nla_put_failure: | ||
527 | return -EMSGSIZE; | ||
528 | } | ||
529 | |||
530 | /* Reply a LIST/SAVE request: dump the elements of the specified set */ | ||
531 | static int | ||
532 | type_pf_list(const struct ip_set *set, | ||
533 | struct sk_buff *skb, struct netlink_callback *cb) | ||
534 | { | ||
535 | const struct ip_set_hash *h = set->data; | ||
536 | const struct htable *t = h->table; | ||
537 | struct nlattr *atd, *nested; | ||
538 | const struct hbucket *n; | ||
539 | const struct type_pf_elem *data; | ||
540 | u32 first = cb->args[2]; | ||
541 | /* We assume that one hash bucket fills into one page */ | ||
542 | void *incomplete; | ||
543 | int i; | ||
544 | |||
545 | atd = ipset_nest_start(skb, IPSET_ATTR_ADT); | ||
546 | if (!atd) | ||
547 | return -EMSGSIZE; | ||
548 | pr_debug("list hash set %s\n", set->name); | ||
549 | for (; cb->args[2] < jhash_size(t->htable_bits); cb->args[2]++) { | ||
550 | incomplete = skb_tail_pointer(skb); | ||
551 | n = hbucket(t, cb->args[2]); | ||
552 | pr_debug("cb->args[2]: %lu, t %p n %p\n", cb->args[2], t, n); | ||
553 | for (i = 0; i < n->pos; i++) { | ||
554 | data = ahash_data(n, i); | ||
555 | pr_debug("list hash %lu hbucket %p i %u, data %p\n", | ||
556 | cb->args[2], n, i, data); | ||
557 | nested = ipset_nest_start(skb, IPSET_ATTR_DATA); | ||
558 | if (!nested) { | ||
559 | if (cb->args[2] == first) { | ||
560 | nla_nest_cancel(skb, atd); | ||
561 | return -EMSGSIZE; | ||
562 | } else | ||
563 | goto nla_put_failure; | ||
564 | } | ||
565 | if (type_pf_data_list(skb, data)) | ||
566 | goto nla_put_failure; | ||
567 | ipset_nest_end(skb, nested); | ||
568 | } | ||
569 | } | ||
570 | ipset_nest_end(skb, atd); | ||
571 | /* Set listing finished */ | ||
572 | cb->args[2] = 0; | ||
573 | |||
574 | return 0; | ||
575 | |||
576 | nla_put_failure: | ||
577 | nlmsg_trim(skb, incomplete); | ||
578 | ipset_nest_end(skb, atd); | ||
579 | if (unlikely(first == cb->args[2])) { | ||
580 | pr_warning("Can't list set %s: one bucket does not fit into " | ||
581 | "a message. Please report it!\n", set->name); | ||
582 | cb->args[2] = 0; | ||
583 | return -EMSGSIZE; | ||
584 | } | ||
585 | return 0; | ||
586 | } | ||
587 | |||
588 | static int | ||
589 | type_pf_kadt(struct ip_set *set, const struct sk_buff * skb, | ||
590 | enum ipset_adt adt, u8 pf, u8 dim, u8 flags); | ||
591 | static int | ||
592 | type_pf_uadt(struct ip_set *set, struct nlattr *tb[], | ||
593 | enum ipset_adt adt, u32 *lineno, u32 flags); | ||
594 | |||
595 | static const struct ip_set_type_variant type_pf_variant = { | ||
596 | .kadt = type_pf_kadt, | ||
597 | .uadt = type_pf_uadt, | ||
598 | .adt = { | ||
599 | [IPSET_ADD] = type_pf_add, | ||
600 | [IPSET_DEL] = type_pf_del, | ||
601 | [IPSET_TEST] = type_pf_test, | ||
602 | }, | ||
603 | .destroy = type_pf_destroy, | ||
604 | .flush = type_pf_flush, | ||
605 | .head = type_pf_head, | ||
606 | .list = type_pf_list, | ||
607 | .resize = type_pf_resize, | ||
608 | .same_set = type_pf_same_set, | ||
609 | }; | ||
610 | |||
611 | /* Flavour with timeout support */ | ||
612 | |||
613 | #define ahash_tdata(n, i) \ | ||
614 | (struct type_pf_elem *)((struct type_pf_telem *)((n)->value) + (i)) | ||
615 | |||
616 | static inline u32 | ||
617 | type_pf_data_timeout(const struct type_pf_elem *data) | ||
618 | { | ||
619 | const struct type_pf_telem *tdata = | ||
620 | (const struct type_pf_telem *) data; | ||
621 | |||
622 | return tdata->timeout; | ||
623 | } | ||
624 | |||
625 | static inline bool | ||
626 | type_pf_data_expired(const struct type_pf_elem *data) | ||
627 | { | ||
628 | const struct type_pf_telem *tdata = | ||
629 | (const struct type_pf_telem *) data; | ||
630 | |||
631 | return ip_set_timeout_expired(tdata->timeout); | ||
632 | } | ||
633 | |||
634 | static inline void | ||
635 | type_pf_data_timeout_set(struct type_pf_elem *data, u32 timeout) | ||
636 | { | ||
637 | struct type_pf_telem *tdata = (struct type_pf_telem *) data; | ||
638 | |||
639 | tdata->timeout = ip_set_timeout_set(timeout); | ||
640 | } | ||
641 | |||
642 | static int | ||
643 | type_pf_elem_tadd(struct hbucket *n, const struct type_pf_elem *value, | ||
644 | u32 timeout) | ||
645 | { | ||
646 | struct type_pf_elem *data; | ||
647 | |||
648 | if (n->pos >= n->size) { | ||
649 | void *tmp; | ||
650 | |||
651 | if (n->size >= AHASH_MAX_SIZE) | ||
652 | /* Trigger rehashing */ | ||
653 | return -EAGAIN; | ||
654 | |||
655 | tmp = kzalloc((n->size + AHASH_INIT_SIZE) | ||
656 | * sizeof(struct type_pf_telem), | ||
657 | GFP_ATOMIC); | ||
658 | if (!tmp) | ||
659 | return -ENOMEM; | ||
660 | if (n->size) { | ||
661 | memcpy(tmp, n->value, | ||
662 | sizeof(struct type_pf_telem) * n->size); | ||
663 | kfree(n->value); | ||
664 | } | ||
665 | n->value = tmp; | ||
666 | n->size += AHASH_INIT_SIZE; | ||
667 | } | ||
668 | data = ahash_tdata(n, n->pos++); | ||
669 | type_pf_data_copy(data, value); | ||
670 | type_pf_data_timeout_set(data, timeout); | ||
671 | return 0; | ||
672 | } | ||
673 | |||
674 | /* Delete expired elements from the hashtable */ | ||
675 | static void | ||
676 | type_pf_expire(struct ip_set_hash *h) | ||
677 | { | ||
678 | struct htable *t = h->table; | ||
679 | struct hbucket *n; | ||
680 | struct type_pf_elem *data; | ||
681 | u32 i; | ||
682 | int j; | ||
683 | |||
684 | for (i = 0; i < jhash_size(t->htable_bits); i++) { | ||
685 | n = hbucket(t, i); | ||
686 | for (j = 0; j < n->pos; j++) { | ||
687 | data = ahash_tdata(n, j); | ||
688 | if (type_pf_data_expired(data)) { | ||
689 | pr_debug("expired %u/%u\n", i, j); | ||
690 | #ifdef IP_SET_HASH_WITH_NETS | ||
691 | del_cidr(h, data->cidr, HOST_MASK); | ||
692 | #endif | ||
693 | if (j != n->pos - 1) | ||
694 | /* Not last one */ | ||
695 | type_pf_data_copy(data, | ||
696 | ahash_tdata(n, n->pos - 1)); | ||
697 | n->pos--; | ||
698 | h->elements--; | ||
699 | } | ||
700 | } | ||
701 | if (n->pos + AHASH_INIT_SIZE < n->size) { | ||
702 | void *tmp = kzalloc((n->size - AHASH_INIT_SIZE) | ||
703 | * sizeof(struct type_pf_telem), | ||
704 | GFP_ATOMIC); | ||
705 | if (!tmp) | ||
706 | /* Still try to delete expired elements */ | ||
707 | continue; | ||
708 | n->size -= AHASH_INIT_SIZE; | ||
709 | memcpy(tmp, n->value, | ||
710 | n->size * sizeof(struct type_pf_telem)); | ||
711 | kfree(n->value); | ||
712 | n->value = tmp; | ||
713 | } | ||
714 | } | ||
715 | } | ||
716 | |||
717 | static int | ||
718 | type_pf_tresize(struct ip_set *set, bool retried) | ||
719 | { | ||
720 | struct ip_set_hash *h = set->data; | ||
721 | struct htable *t, *orig = h->table; | ||
722 | u8 htable_bits = orig->htable_bits; | ||
723 | const struct type_pf_elem *data; | ||
724 | struct hbucket *n, *m; | ||
725 | u32 i, j; | ||
726 | int ret; | ||
727 | |||
728 | /* Try to cleanup once */ | ||
729 | if (!retried) { | ||
730 | i = h->elements; | ||
731 | write_lock_bh(&set->lock); | ||
732 | type_pf_expire(set->data); | ||
733 | write_unlock_bh(&set->lock); | ||
734 | if (h->elements < i) | ||
735 | return 0; | ||
736 | } | ||
737 | |||
738 | retry: | ||
739 | ret = 0; | ||
740 | htable_bits++; | ||
741 | if (!htable_bits) | ||
742 | /* In case we have plenty of memory :-) */ | ||
743 | return -IPSET_ERR_HASH_FULL; | ||
744 | t = ip_set_alloc(sizeof(*t) | ||
745 | + jhash_size(htable_bits) * sizeof(struct hbucket)); | ||
746 | if (!t) | ||
747 | return -ENOMEM; | ||
748 | t->htable_bits = htable_bits; | ||
749 | |||
750 | read_lock_bh(&set->lock); | ||
751 | for (i = 0; i < jhash_size(orig->htable_bits); i++) { | ||
752 | n = hbucket(orig, i); | ||
753 | for (j = 0; j < n->pos; j++) { | ||
754 | data = ahash_tdata(n, j); | ||
755 | m = hbucket(t, HKEY(data, h->initval, htable_bits)); | ||
756 | ret = type_pf_elem_tadd(m, data, | ||
757 | type_pf_data_timeout(data)); | ||
758 | if (ret < 0) { | ||
759 | read_unlock_bh(&set->lock); | ||
760 | ahash_destroy(t); | ||
761 | if (ret == -EAGAIN) | ||
762 | goto retry; | ||
763 | return ret; | ||
764 | } | ||
765 | } | ||
766 | } | ||
767 | |||
768 | rcu_assign_pointer(h->table, t); | ||
769 | read_unlock_bh(&set->lock); | ||
770 | |||
771 | /* Give time to other readers of the set */ | ||
772 | synchronize_rcu_bh(); | ||
773 | |||
774 | ahash_destroy(orig); | ||
775 | |||
776 | return 0; | ||
777 | } | ||
778 | |||
779 | static int | ||
780 | type_pf_tadd(struct ip_set *set, void *value, u32 timeout) | ||
781 | { | ||
782 | struct ip_set_hash *h = set->data; | ||
783 | struct htable *t = h->table; | ||
784 | const struct type_pf_elem *d = value; | ||
785 | struct hbucket *n; | ||
786 | struct type_pf_elem *data; | ||
787 | int ret = 0, i, j = AHASH_MAX_SIZE + 1; | ||
788 | u32 key; | ||
789 | |||
790 | if (h->elements >= h->maxelem) | ||
791 | /* FIXME: when set is full, we slow down here */ | ||
792 | type_pf_expire(h); | ||
793 | if (h->elements >= h->maxelem) | ||
794 | return -IPSET_ERR_HASH_FULL; | ||
795 | |||
796 | rcu_read_lock_bh(); | ||
797 | t = rcu_dereference_bh(h->table); | ||
798 | key = HKEY(d, h->initval, t->htable_bits); | ||
799 | n = hbucket(t, key); | ||
800 | for (i = 0; i < n->pos; i++) { | ||
801 | data = ahash_tdata(n, i); | ||
802 | if (type_pf_data_equal(data, d)) { | ||
803 | if (type_pf_data_expired(data)) | ||
804 | j = i; | ||
805 | else { | ||
806 | ret = -IPSET_ERR_EXIST; | ||
807 | goto out; | ||
808 | } | ||
809 | } else if (j == AHASH_MAX_SIZE + 1 && | ||
810 | type_pf_data_expired(data)) | ||
811 | j = i; | ||
812 | } | ||
813 | if (j != AHASH_MAX_SIZE + 1) { | ||
814 | data = ahash_tdata(n, j); | ||
815 | #ifdef IP_SET_HASH_WITH_NETS | ||
816 | del_cidr(h, data->cidr, HOST_MASK); | ||
817 | add_cidr(h, d->cidr, HOST_MASK); | ||
818 | #endif | ||
819 | type_pf_data_copy(data, d); | ||
820 | type_pf_data_timeout_set(data, timeout); | ||
821 | goto out; | ||
822 | } | ||
823 | ret = type_pf_elem_tadd(n, d, timeout); | ||
824 | if (ret != 0) | ||
825 | goto out; | ||
826 | |||
827 | #ifdef IP_SET_HASH_WITH_NETS | ||
828 | add_cidr(h, d->cidr, HOST_MASK); | ||
829 | #endif | ||
830 | h->elements++; | ||
831 | out: | ||
832 | rcu_read_unlock_bh(); | ||
833 | return ret; | ||
834 | } | ||
835 | |||
836 | static int | ||
837 | type_pf_tdel(struct ip_set *set, void *value, u32 timeout) | ||
838 | { | ||
839 | struct ip_set_hash *h = set->data; | ||
840 | struct htable *t = h->table; | ||
841 | const struct type_pf_elem *d = value; | ||
842 | struct hbucket *n; | ||
843 | int i, ret = 0; | ||
844 | struct type_pf_elem *data; | ||
845 | u32 key; | ||
846 | |||
847 | key = HKEY(value, h->initval, t->htable_bits); | ||
848 | n = hbucket(t, key); | ||
849 | for (i = 0; i < n->pos; i++) { | ||
850 | data = ahash_tdata(n, i); | ||
851 | if (!type_pf_data_equal(data, d)) | ||
852 | continue; | ||
853 | if (type_pf_data_expired(data)) | ||
854 | ret = -IPSET_ERR_EXIST; | ||
855 | if (i != n->pos - 1) | ||
856 | /* Not last one */ | ||
857 | type_pf_data_copy(data, ahash_tdata(n, n->pos - 1)); | ||
858 | |||
859 | n->pos--; | ||
860 | h->elements--; | ||
861 | #ifdef IP_SET_HASH_WITH_NETS | ||
862 | del_cidr(h, d->cidr, HOST_MASK); | ||
863 | #endif | ||
864 | if (n->pos + AHASH_INIT_SIZE < n->size) { | ||
865 | void *tmp = kzalloc((n->size - AHASH_INIT_SIZE) | ||
866 | * sizeof(struct type_pf_telem), | ||
867 | GFP_ATOMIC); | ||
868 | if (!tmp) | ||
869 | return 0; | ||
870 | n->size -= AHASH_INIT_SIZE; | ||
871 | memcpy(tmp, n->value, | ||
872 | n->size * sizeof(struct type_pf_telem)); | ||
873 | kfree(n->value); | ||
874 | n->value = tmp; | ||
875 | } | ||
876 | return 0; | ||
877 | } | ||
878 | |||
879 | return -IPSET_ERR_EXIST; | ||
880 | } | ||
881 | |||
882 | #ifdef IP_SET_HASH_WITH_NETS | ||
883 | static int | ||
884 | type_pf_ttest_cidrs(struct ip_set *set, struct type_pf_elem *d, u32 timeout) | ||
885 | { | ||
886 | struct ip_set_hash *h = set->data; | ||
887 | struct htable *t = h->table; | ||
888 | struct type_pf_elem *data; | ||
889 | struct hbucket *n; | ||
890 | int i, j = 0; | ||
891 | u32 key; | ||
892 | u8 host_mask = SET_HOST_MASK(set->family); | ||
893 | |||
894 | for (; j < host_mask && h->nets[j].cidr; j++) { | ||
895 | type_pf_data_netmask(d, h->nets[j].cidr); | ||
896 | key = HKEY(d, h->initval, t->htable_bits); | ||
897 | n = hbucket(t, key); | ||
898 | for (i = 0; i < n->pos; i++) { | ||
899 | data = ahash_tdata(n, i); | ||
900 | if (type_pf_data_equal(data, d)) | ||
901 | return !type_pf_data_expired(data); | ||
902 | } | ||
903 | } | ||
904 | return 0; | ||
905 | } | ||
906 | #endif | ||
907 | |||
908 | static int | ||
909 | type_pf_ttest(struct ip_set *set, void *value, u32 timeout) | ||
910 | { | ||
911 | struct ip_set_hash *h = set->data; | ||
912 | struct htable *t = h->table; | ||
913 | struct type_pf_elem *data, *d = value; | ||
914 | struct hbucket *n; | ||
915 | int i; | ||
916 | u32 key; | ||
917 | |||
918 | #ifdef IP_SET_HASH_WITH_NETS | ||
919 | if (d->cidr == SET_HOST_MASK(set->family)) | ||
920 | return type_pf_ttest_cidrs(set, d, timeout); | ||
921 | #endif | ||
922 | key = HKEY(d, h->initval, t->htable_bits); | ||
923 | n = hbucket(t, key); | ||
924 | for (i = 0; i < n->pos; i++) { | ||
925 | data = ahash_tdata(n, i); | ||
926 | if (type_pf_data_equal(data, d)) | ||
927 | return !type_pf_data_expired(data); | ||
928 | } | ||
929 | return 0; | ||
930 | } | ||
931 | |||
932 | static int | ||
933 | type_pf_tlist(const struct ip_set *set, | ||
934 | struct sk_buff *skb, struct netlink_callback *cb) | ||
935 | { | ||
936 | const struct ip_set_hash *h = set->data; | ||
937 | const struct htable *t = h->table; | ||
938 | struct nlattr *atd, *nested; | ||
939 | const struct hbucket *n; | ||
940 | const struct type_pf_elem *data; | ||
941 | u32 first = cb->args[2]; | ||
942 | /* We assume that one hash bucket fills into one page */ | ||
943 | void *incomplete; | ||
944 | int i; | ||
945 | |||
946 | atd = ipset_nest_start(skb, IPSET_ATTR_ADT); | ||
947 | if (!atd) | ||
948 | return -EMSGSIZE; | ||
949 | for (; cb->args[2] < jhash_size(t->htable_bits); cb->args[2]++) { | ||
950 | incomplete = skb_tail_pointer(skb); | ||
951 | n = hbucket(t, cb->args[2]); | ||
952 | for (i = 0; i < n->pos; i++) { | ||
953 | data = ahash_tdata(n, i); | ||
954 | pr_debug("list %p %u\n", n, i); | ||
955 | if (type_pf_data_expired(data)) | ||
956 | continue; | ||
957 | pr_debug("do list %p %u\n", n, i); | ||
958 | nested = ipset_nest_start(skb, IPSET_ATTR_DATA); | ||
959 | if (!nested) { | ||
960 | if (cb->args[2] == first) { | ||
961 | nla_nest_cancel(skb, atd); | ||
962 | return -EMSGSIZE; | ||
963 | } else | ||
964 | goto nla_put_failure; | ||
965 | } | ||
966 | if (type_pf_data_tlist(skb, data)) | ||
967 | goto nla_put_failure; | ||
968 | ipset_nest_end(skb, nested); | ||
969 | } | ||
970 | } | ||
971 | ipset_nest_end(skb, atd); | ||
972 | /* Set listing finished */ | ||
973 | cb->args[2] = 0; | ||
974 | |||
975 | return 0; | ||
976 | |||
977 | nla_put_failure: | ||
978 | nlmsg_trim(skb, incomplete); | ||
979 | ipset_nest_end(skb, atd); | ||
980 | if (unlikely(first == cb->args[2])) { | ||
981 | pr_warning("Can't list set %s: one bucket does not fit into " | ||
982 | "a message. Please report it!\n", set->name); | ||
983 | cb->args[2] = 0; | ||
984 | return -EMSGSIZE; | ||
985 | } | ||
986 | return 0; | ||
987 | } | ||
988 | |||
989 | static const struct ip_set_type_variant type_pf_tvariant = { | ||
990 | .kadt = type_pf_kadt, | ||
991 | .uadt = type_pf_uadt, | ||
992 | .adt = { | ||
993 | [IPSET_ADD] = type_pf_tadd, | ||
994 | [IPSET_DEL] = type_pf_tdel, | ||
995 | [IPSET_TEST] = type_pf_ttest, | ||
996 | }, | ||
997 | .destroy = type_pf_destroy, | ||
998 | .flush = type_pf_flush, | ||
999 | .head = type_pf_head, | ||
1000 | .list = type_pf_tlist, | ||
1001 | .resize = type_pf_tresize, | ||
1002 | .same_set = type_pf_same_set, | ||
1003 | }; | ||
1004 | |||
1005 | static void | ||
1006 | type_pf_gc(unsigned long ul_set) | ||
1007 | { | ||
1008 | struct ip_set *set = (struct ip_set *) ul_set; | ||
1009 | struct ip_set_hash *h = set->data; | ||
1010 | |||
1011 | pr_debug("called\n"); | ||
1012 | write_lock_bh(&set->lock); | ||
1013 | type_pf_expire(h); | ||
1014 | write_unlock_bh(&set->lock); | ||
1015 | |||
1016 | h->gc.expires = jiffies + IPSET_GC_PERIOD(h->timeout) * HZ; | ||
1017 | add_timer(&h->gc); | ||
1018 | } | ||
1019 | |||
1020 | static void | ||
1021 | type_pf_gc_init(struct ip_set *set) | ||
1022 | { | ||
1023 | struct ip_set_hash *h = set->data; | ||
1024 | |||
1025 | init_timer(&h->gc); | ||
1026 | h->gc.data = (unsigned long) set; | ||
1027 | h->gc.function = type_pf_gc; | ||
1028 | h->gc.expires = jiffies + IPSET_GC_PERIOD(h->timeout) * HZ; | ||
1029 | add_timer(&h->gc); | ||
1030 | pr_debug("gc initialized, run in every %u\n", | ||
1031 | IPSET_GC_PERIOD(h->timeout)); | ||
1032 | } | ||
1033 | |||
1034 | #undef type_pf_data_equal | ||
1035 | #undef type_pf_data_isnull | ||
1036 | #undef type_pf_data_copy | ||
1037 | #undef type_pf_data_zero_out | ||
1038 | #undef type_pf_data_list | ||
1039 | #undef type_pf_data_tlist | ||
1040 | |||
1041 | #undef type_pf_elem | ||
1042 | #undef type_pf_telem | ||
1043 | #undef type_pf_data_timeout | ||
1044 | #undef type_pf_data_expired | ||
1045 | #undef type_pf_data_netmask | ||
1046 | #undef type_pf_data_timeout_set | ||
1047 | |||
1048 | #undef type_pf_elem_add | ||
1049 | #undef type_pf_add | ||
1050 | #undef type_pf_del | ||
1051 | #undef type_pf_test_cidrs | ||
1052 | #undef type_pf_test | ||
1053 | |||
1054 | #undef type_pf_elem_tadd | ||
1055 | #undef type_pf_expire | ||
1056 | #undef type_pf_tadd | ||
1057 | #undef type_pf_tdel | ||
1058 | #undef type_pf_ttest_cidrs | ||
1059 | #undef type_pf_ttest | ||
1060 | |||
1061 | #undef type_pf_resize | ||
1062 | #undef type_pf_tresize | ||
1063 | #undef type_pf_flush | ||
1064 | #undef type_pf_destroy | ||
1065 | #undef type_pf_head | ||
1066 | #undef type_pf_list | ||
1067 | #undef type_pf_tlist | ||
1068 | #undef type_pf_same_set | ||
1069 | #undef type_pf_kadt | ||
1070 | #undef type_pf_uadt | ||
1071 | #undef type_pf_gc | ||
1072 | #undef type_pf_gc_init | ||
1073 | #undef type_pf_variant | ||
1074 | #undef type_pf_tvariant | ||
diff --git a/include/linux/netfilter/ipset/ip_set_bitmap.h b/include/linux/netfilter/ipset/ip_set_bitmap.h new file mode 100644 index 000000000000..61a9e8746c83 --- /dev/null +++ b/include/linux/netfilter/ipset/ip_set_bitmap.h | |||
@@ -0,0 +1,31 @@ | |||
1 | #ifndef __IP_SET_BITMAP_H | ||
2 | #define __IP_SET_BITMAP_H | ||
3 | |||
4 | /* Bitmap type specific error codes */ | ||
5 | enum { | ||
6 | /* The element is out of the range of the set */ | ||
7 | IPSET_ERR_BITMAP_RANGE = IPSET_ERR_TYPE_SPECIFIC, | ||
8 | /* The range exceeds the size limit of the set type */ | ||
9 | IPSET_ERR_BITMAP_RANGE_SIZE, | ||
10 | }; | ||
11 | |||
12 | #ifdef __KERNEL__ | ||
13 | #define IPSET_BITMAP_MAX_RANGE 0x0000FFFF | ||
14 | |||
15 | /* Common functions */ | ||
16 | |||
17 | static inline u32 | ||
18 | range_to_mask(u32 from, u32 to, u8 *bits) | ||
19 | { | ||
20 | u32 mask = 0xFFFFFFFE; | ||
21 | |||
22 | *bits = 32; | ||
23 | while (--(*bits) > 0 && mask && (to & mask) != from) | ||
24 | mask <<= 1; | ||
25 | |||
26 | return mask; | ||
27 | } | ||
28 | |||
29 | #endif /* __KERNEL__ */ | ||
30 | |||
31 | #endif /* __IP_SET_BITMAP_H */ | ||
diff --git a/include/linux/netfilter/ipset/ip_set_getport.h b/include/linux/netfilter/ipset/ip_set_getport.h new file mode 100644 index 000000000000..5aebd170f899 --- /dev/null +++ b/include/linux/netfilter/ipset/ip_set_getport.h | |||
@@ -0,0 +1,31 @@ | |||
1 | #ifndef _IP_SET_GETPORT_H | ||
2 | #define _IP_SET_GETPORT_H | ||
3 | |||
4 | extern bool ip_set_get_ip4_port(const struct sk_buff *skb, bool src, | ||
5 | __be16 *port, u8 *proto); | ||
6 | |||
7 | #if defined(CONFIG_IP6_NF_IPTABLES) || defined(CONFIG_IP6_NF_IPTABLES_MODULE) | ||
8 | extern bool ip_set_get_ip6_port(const struct sk_buff *skb, bool src, | ||
9 | __be16 *port, u8 *proto); | ||
10 | #else | ||
11 | static inline bool ip_set_get_ip6_port(const struct sk_buff *skb, bool src, | ||
12 | __be16 *port, u8 *proto) | ||
13 | { | ||
14 | return false; | ||
15 | } | ||
16 | #endif | ||
17 | |||
18 | extern bool ip_set_get_ip_port(const struct sk_buff *skb, u8 pf, bool src, | ||
19 | __be16 *port); | ||
20 | |||
21 | static inline bool ip_set_proto_with_ports(u8 proto) | ||
22 | { | ||
23 | switch (proto) { | ||
24 | case IPPROTO_TCP: | ||
25 | case IPPROTO_UDP: | ||
26 | return true; | ||
27 | } | ||
28 | return false; | ||
29 | } | ||
30 | |||
31 | #endif /*_IP_SET_GETPORT_H*/ | ||
diff --git a/include/linux/netfilter/ipset/ip_set_hash.h b/include/linux/netfilter/ipset/ip_set_hash.h new file mode 100644 index 000000000000..b86f15c04524 --- /dev/null +++ b/include/linux/netfilter/ipset/ip_set_hash.h | |||
@@ -0,0 +1,26 @@ | |||
1 | #ifndef __IP_SET_HASH_H | ||
2 | #define __IP_SET_HASH_H | ||
3 | |||
4 | /* Hash type specific error codes */ | ||
5 | enum { | ||
6 | /* Hash is full */ | ||
7 | IPSET_ERR_HASH_FULL = IPSET_ERR_TYPE_SPECIFIC, | ||
8 | /* Null-valued element */ | ||
9 | IPSET_ERR_HASH_ELEM, | ||
10 | /* Invalid protocol */ | ||
11 | IPSET_ERR_INVALID_PROTO, | ||
12 | /* Protocol missing but must be specified */ | ||
13 | IPSET_ERR_MISSING_PROTO, | ||
14 | }; | ||
15 | |||
16 | #ifdef __KERNEL__ | ||
17 | |||
18 | #define IPSET_DEFAULT_HASHSIZE 1024 | ||
19 | #define IPSET_MIMINAL_HASHSIZE 64 | ||
20 | #define IPSET_DEFAULT_MAXELEM 65536 | ||
21 | #define IPSET_DEFAULT_PROBES 4 | ||
22 | #define IPSET_DEFAULT_RESIZE 100 | ||
23 | |||
24 | #endif /* __KERNEL__ */ | ||
25 | |||
26 | #endif /* __IP_SET_HASH_H */ | ||
diff --git a/include/linux/netfilter/ipset/ip_set_list.h b/include/linux/netfilter/ipset/ip_set_list.h new file mode 100644 index 000000000000..40a63f302613 --- /dev/null +++ b/include/linux/netfilter/ipset/ip_set_list.h | |||
@@ -0,0 +1,27 @@ | |||
1 | #ifndef __IP_SET_LIST_H | ||
2 | #define __IP_SET_LIST_H | ||
3 | |||
4 | /* List type specific error codes */ | ||
5 | enum { | ||
6 | /* Set name to be added/deleted/tested does not exist. */ | ||
7 | IPSET_ERR_NAME = IPSET_ERR_TYPE_SPECIFIC, | ||
8 | /* list:set type is not permitted to add */ | ||
9 | IPSET_ERR_LOOP, | ||
10 | /* Missing reference set */ | ||
11 | IPSET_ERR_BEFORE, | ||
12 | /* Reference set does not exist */ | ||
13 | IPSET_ERR_NAMEREF, | ||
14 | /* Set is full */ | ||
15 | IPSET_ERR_LIST_FULL, | ||
16 | /* Reference set is not added to the set */ | ||
17 | IPSET_ERR_REF_EXIST, | ||
18 | }; | ||
19 | |||
20 | #ifdef __KERNEL__ | ||
21 | |||
22 | #define IP_SET_LIST_DEFAULT_SIZE 8 | ||
23 | #define IP_SET_LIST_MIN_SIZE 4 | ||
24 | |||
25 | #endif /* __KERNEL__ */ | ||
26 | |||
27 | #endif /* __IP_SET_LIST_H */ | ||
diff --git a/include/linux/netfilter/ipset/ip_set_timeout.h b/include/linux/netfilter/ipset/ip_set_timeout.h new file mode 100644 index 000000000000..9f30c5f2ec1c --- /dev/null +++ b/include/linux/netfilter/ipset/ip_set_timeout.h | |||
@@ -0,0 +1,127 @@ | |||
1 | #ifndef _IP_SET_TIMEOUT_H | ||
2 | #define _IP_SET_TIMEOUT_H | ||
3 | |||
4 | /* Copyright (C) 2003-2011 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #ifdef __KERNEL__ | ||
12 | |||
13 | /* How often should the gc be run by default */ | ||
14 | #define IPSET_GC_TIME (3 * 60) | ||
15 | |||
16 | /* Timeout period depending on the timeout value of the given set */ | ||
17 | #define IPSET_GC_PERIOD(timeout) \ | ||
18 | ((timeout/3) ? min_t(u32, (timeout)/3, IPSET_GC_TIME) : 1) | ||
19 | |||
20 | /* Set is defined without timeout support: timeout value may be 0 */ | ||
21 | #define IPSET_NO_TIMEOUT UINT_MAX | ||
22 | |||
23 | #define with_timeout(timeout) ((timeout) != IPSET_NO_TIMEOUT) | ||
24 | |||
25 | static inline unsigned int | ||
26 | ip_set_timeout_uget(struct nlattr *tb) | ||
27 | { | ||
28 | unsigned int timeout = ip_set_get_h32(tb); | ||
29 | |||
30 | /* Userspace supplied TIMEOUT parameter: adjust crazy size */ | ||
31 | return timeout == IPSET_NO_TIMEOUT ? IPSET_NO_TIMEOUT - 1 : timeout; | ||
32 | } | ||
33 | |||
34 | #ifdef IP_SET_BITMAP_TIMEOUT | ||
35 | |||
36 | /* Bitmap specific timeout constants and macros for the entries */ | ||
37 | |||
38 | /* Bitmap entry is unset */ | ||
39 | #define IPSET_ELEM_UNSET 0 | ||
40 | /* Bitmap entry is set with no timeout value */ | ||
41 | #define IPSET_ELEM_PERMANENT (UINT_MAX/2) | ||
42 | |||
43 | static inline bool | ||
44 | ip_set_timeout_test(unsigned long timeout) | ||
45 | { | ||
46 | return timeout != IPSET_ELEM_UNSET && | ||
47 | (timeout == IPSET_ELEM_PERMANENT || | ||
48 | time_after(timeout, jiffies)); | ||
49 | } | ||
50 | |||
51 | static inline bool | ||
52 | ip_set_timeout_expired(unsigned long timeout) | ||
53 | { | ||
54 | return timeout != IPSET_ELEM_UNSET && | ||
55 | timeout != IPSET_ELEM_PERMANENT && | ||
56 | time_before(timeout, jiffies); | ||
57 | } | ||
58 | |||
59 | static inline unsigned long | ||
60 | ip_set_timeout_set(u32 timeout) | ||
61 | { | ||
62 | unsigned long t; | ||
63 | |||
64 | if (!timeout) | ||
65 | return IPSET_ELEM_PERMANENT; | ||
66 | |||
67 | t = timeout * HZ + jiffies; | ||
68 | if (t == IPSET_ELEM_UNSET || t == IPSET_ELEM_PERMANENT) | ||
69 | /* Bingo! */ | ||
70 | t++; | ||
71 | |||
72 | return t; | ||
73 | } | ||
74 | |||
75 | static inline u32 | ||
76 | ip_set_timeout_get(unsigned long timeout) | ||
77 | { | ||
78 | return timeout == IPSET_ELEM_PERMANENT ? 0 : (timeout - jiffies)/HZ; | ||
79 | } | ||
80 | |||
81 | #else | ||
82 | |||
83 | /* Hash specific timeout constants and macros for the entries */ | ||
84 | |||
85 | /* Hash entry is set with no timeout value */ | ||
86 | #define IPSET_ELEM_PERMANENT 0 | ||
87 | |||
88 | static inline bool | ||
89 | ip_set_timeout_test(unsigned long timeout) | ||
90 | { | ||
91 | return timeout == IPSET_ELEM_PERMANENT || | ||
92 | time_after(timeout, jiffies); | ||
93 | } | ||
94 | |||
95 | static inline bool | ||
96 | ip_set_timeout_expired(unsigned long timeout) | ||
97 | { | ||
98 | return timeout != IPSET_ELEM_PERMANENT && | ||
99 | time_before(timeout, jiffies); | ||
100 | } | ||
101 | |||
102 | static inline unsigned long | ||
103 | ip_set_timeout_set(u32 timeout) | ||
104 | { | ||
105 | unsigned long t; | ||
106 | |||
107 | if (!timeout) | ||
108 | return IPSET_ELEM_PERMANENT; | ||
109 | |||
110 | t = timeout * HZ + jiffies; | ||
111 | if (t == IPSET_ELEM_PERMANENT) | ||
112 | /* Bingo! :-) */ | ||
113 | t++; | ||
114 | |||
115 | return t; | ||
116 | } | ||
117 | |||
118 | static inline u32 | ||
119 | ip_set_timeout_get(unsigned long timeout) | ||
120 | { | ||
121 | return timeout == IPSET_ELEM_PERMANENT ? 0 : (timeout - jiffies)/HZ; | ||
122 | } | ||
123 | #endif /* ! IP_SET_BITMAP_TIMEOUT */ | ||
124 | |||
125 | #endif /* __KERNEL__ */ | ||
126 | |||
127 | #endif /* _IP_SET_TIMEOUT_H */ | ||
diff --git a/include/linux/netfilter/ipset/pfxlen.h b/include/linux/netfilter/ipset/pfxlen.h new file mode 100644 index 000000000000..0e1fb50da562 --- /dev/null +++ b/include/linux/netfilter/ipset/pfxlen.h | |||
@@ -0,0 +1,35 @@ | |||
1 | #ifndef _PFXLEN_H | ||
2 | #define _PFXLEN_H | ||
3 | |||
4 | #include <asm/byteorder.h> | ||
5 | #include <linux/netfilter.h> | ||
6 | |||
7 | /* Prefixlen maps, by Jan Engelhardt */ | ||
8 | extern const union nf_inet_addr ip_set_netmask_map[]; | ||
9 | extern const union nf_inet_addr ip_set_hostmask_map[]; | ||
10 | |||
11 | static inline __be32 | ||
12 | ip_set_netmask(u8 pfxlen) | ||
13 | { | ||
14 | return ip_set_netmask_map[pfxlen].ip; | ||
15 | } | ||
16 | |||
17 | static inline const __be32 * | ||
18 | ip_set_netmask6(u8 pfxlen) | ||
19 | { | ||
20 | return &ip_set_netmask_map[pfxlen].ip6[0]; | ||
21 | } | ||
22 | |||
23 | static inline u32 | ||
24 | ip_set_hostmask(u8 pfxlen) | ||
25 | { | ||
26 | return (__force u32) ip_set_hostmask_map[pfxlen].ip; | ||
27 | } | ||
28 | |||
29 | static inline const __be32 * | ||
30 | ip_set_hostmask6(u8 pfxlen) | ||
31 | { | ||
32 | return &ip_set_hostmask_map[pfxlen].ip6[0]; | ||
33 | } | ||
34 | |||
35 | #endif /*_PFXLEN_H */ | ||
diff --git a/include/linux/netfilter/nf_conntrack_snmp.h b/include/linux/netfilter/nf_conntrack_snmp.h new file mode 100644 index 000000000000..064bc63a5346 --- /dev/null +++ b/include/linux/netfilter/nf_conntrack_snmp.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef _NF_CONNTRACK_SNMP_H | ||
2 | #define _NF_CONNTRACK_SNMP_H | ||
3 | |||
4 | extern int (*nf_nat_snmp_hook)(struct sk_buff *skb, | ||
5 | unsigned int protoff, | ||
6 | struct nf_conn *ct, | ||
7 | enum ip_conntrack_info ctinfo); | ||
8 | |||
9 | #endif /* _NF_CONNTRACK_SNMP_H */ | ||
diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index 361d6b5630ee..2b11fc1a86be 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h | |||
@@ -47,7 +47,8 @@ struct nfgenmsg { | |||
47 | #define NFNL_SUBSYS_QUEUE 3 | 47 | #define NFNL_SUBSYS_QUEUE 3 |
48 | #define NFNL_SUBSYS_ULOG 4 | 48 | #define NFNL_SUBSYS_ULOG 4 |
49 | #define NFNL_SUBSYS_OSF 5 | 49 | #define NFNL_SUBSYS_OSF 5 |
50 | #define NFNL_SUBSYS_COUNT 6 | 50 | #define NFNL_SUBSYS_IPSET 6 |
51 | #define NFNL_SUBSYS_COUNT 7 | ||
51 | 52 | ||
52 | #ifdef __KERNEL__ | 53 | #ifdef __KERNEL__ |
53 | 54 | ||
diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index 19711e3ffd42..debf1aefd753 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h | |||
@@ -42,6 +42,7 @@ enum ctattr_type { | |||
42 | CTA_SECMARK, /* obsolete */ | 42 | CTA_SECMARK, /* obsolete */ |
43 | CTA_ZONE, | 43 | CTA_ZONE, |
44 | CTA_SECCTX, | 44 | CTA_SECCTX, |
45 | CTA_TIMESTAMP, | ||
45 | __CTA_MAX | 46 | __CTA_MAX |
46 | }; | 47 | }; |
47 | #define CTA_MAX (__CTA_MAX - 1) | 48 | #define CTA_MAX (__CTA_MAX - 1) |
@@ -127,6 +128,14 @@ enum ctattr_counters { | |||
127 | }; | 128 | }; |
128 | #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) | 129 | #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) |
129 | 130 | ||
131 | enum ctattr_tstamp { | ||
132 | CTA_TIMESTAMP_UNSPEC, | ||
133 | CTA_TIMESTAMP_START, | ||
134 | CTA_TIMESTAMP_STOP, | ||
135 | __CTA_TIMESTAMP_MAX | ||
136 | }; | ||
137 | #define CTA_TIMESTAMP_MAX (__CTA_TIMESTAMP_MAX - 1) | ||
138 | |||
130 | enum ctattr_nat { | 139 | enum ctattr_nat { |
131 | CTA_NAT_UNSPEC, | 140 | CTA_NAT_UNSPEC, |
132 | CTA_NAT_MINIP, | 141 | CTA_NAT_MINIP, |
diff --git a/include/linux/netfilter/nfnetlink_log.h b/include/linux/netfilter/nfnetlink_log.h index ea9b8d380527..90c2c9575bac 100644 --- a/include/linux/netfilter/nfnetlink_log.h +++ b/include/linux/netfilter/nfnetlink_log.h | |||
@@ -28,8 +28,8 @@ struct nfulnl_msg_packet_hw { | |||
28 | }; | 28 | }; |
29 | 29 | ||
30 | struct nfulnl_msg_packet_timestamp { | 30 | struct nfulnl_msg_packet_timestamp { |
31 | aligned_be64 sec; | 31 | __aligned_be64 sec; |
32 | aligned_be64 usec; | 32 | __aligned_be64 usec; |
33 | }; | 33 | }; |
34 | 34 | ||
35 | enum nfulnl_attr_type { | 35 | enum nfulnl_attr_type { |
diff --git a/include/linux/netfilter/nfnetlink_queue.h b/include/linux/netfilter/nfnetlink_queue.h index 2455fe5f4e01..af94e0014ebd 100644 --- a/include/linux/netfilter/nfnetlink_queue.h +++ b/include/linux/netfilter/nfnetlink_queue.h | |||
@@ -25,8 +25,8 @@ struct nfqnl_msg_packet_hw { | |||
25 | }; | 25 | }; |
26 | 26 | ||
27 | struct nfqnl_msg_packet_timestamp { | 27 | struct nfqnl_msg_packet_timestamp { |
28 | aligned_be64 sec; | 28 | __aligned_be64 sec; |
29 | aligned_be64 usec; | 29 | __aligned_be64 usec; |
30 | }; | 30 | }; |
31 | 31 | ||
32 | enum nfqnl_attr_type { | 32 | enum nfqnl_attr_type { |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 6712e713b299..37219525ff6f 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
@@ -611,8 +611,9 @@ struct _compat_xt_align { | |||
611 | extern void xt_compat_lock(u_int8_t af); | 611 | extern void xt_compat_lock(u_int8_t af); |
612 | extern void xt_compat_unlock(u_int8_t af); | 612 | extern void xt_compat_unlock(u_int8_t af); |
613 | 613 | ||
614 | extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, short delta); | 614 | extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, int delta); |
615 | extern void xt_compat_flush_offsets(u_int8_t af); | 615 | extern void xt_compat_flush_offsets(u_int8_t af); |
616 | extern void xt_compat_init_offsets(u_int8_t af, unsigned int number); | ||
616 | extern int xt_compat_calc_jump(u_int8_t af, unsigned int offset); | 617 | extern int xt_compat_calc_jump(u_int8_t af, unsigned int offset); |
617 | 618 | ||
618 | extern int xt_compat_match_offset(const struct xt_match *match); | 619 | extern int xt_compat_match_offset(const struct xt_match *match); |
diff --git a/include/linux/netfilter/xt_AUDIT.h b/include/linux/netfilter/xt_AUDIT.h new file mode 100644 index 000000000000..38751d2ea52b --- /dev/null +++ b/include/linux/netfilter/xt_AUDIT.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | * Header file for iptables xt_AUDIT target | ||
3 | * | ||
4 | * (C) 2010-2011 Thomas Graf <tgraf@redhat.com> | ||
5 | * (C) 2010-2011 Red Hat, Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef _XT_AUDIT_TARGET_H | ||
13 | #define _XT_AUDIT_TARGET_H | ||
14 | |||
15 | #include <linux/types.h> | ||
16 | |||
17 | enum { | ||
18 | XT_AUDIT_TYPE_ACCEPT = 0, | ||
19 | XT_AUDIT_TYPE_DROP, | ||
20 | XT_AUDIT_TYPE_REJECT, | ||
21 | __XT_AUDIT_TYPE_MAX, | ||
22 | }; | ||
23 | |||
24 | #define XT_AUDIT_TYPE_MAX (__XT_AUDIT_TYPE_MAX - 1) | ||
25 | |||
26 | struct xt_audit_info { | ||
27 | __u8 type; /* XT_AUDIT_TYPE_* */ | ||
28 | }; | ||
29 | |||
30 | #endif /* _XT_AUDIT_TARGET_H */ | ||
diff --git a/include/linux/netfilter/xt_CT.h b/include/linux/netfilter/xt_CT.h index 1b564106891d..b56e76811c04 100644 --- a/include/linux/netfilter/xt_CT.h +++ b/include/linux/netfilter/xt_CT.h | |||
@@ -1,14 +1,16 @@ | |||
1 | #ifndef _XT_CT_H | 1 | #ifndef _XT_CT_H |
2 | #define _XT_CT_H | 2 | #define _XT_CT_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define XT_CT_NOTRACK 0x1 | 6 | #define XT_CT_NOTRACK 0x1 |
5 | 7 | ||
6 | struct xt_ct_target_info { | 8 | struct xt_ct_target_info { |
7 | u_int16_t flags; | 9 | __u16 flags; |
8 | u_int16_t zone; | 10 | __u16 zone; |
9 | u_int32_t ct_events; | 11 | __u32 ct_events; |
10 | u_int32_t exp_events; | 12 | __u32 exp_events; |
11 | char helper[16]; | 13 | char helper[16]; |
12 | 14 | ||
13 | /* Used internally by the kernel */ | 15 | /* Used internally by the kernel */ |
14 | struct nf_conn *ct __attribute__((aligned(8))); | 16 | struct nf_conn *ct __attribute__((aligned(8))); |
diff --git a/include/linux/netfilter/xt_NFQUEUE.h b/include/linux/netfilter/xt_NFQUEUE.h index 2584f4a777de..9eafdbbb401c 100644 --- a/include/linux/netfilter/xt_NFQUEUE.h +++ b/include/linux/netfilter/xt_NFQUEUE.h | |||
@@ -20,4 +20,10 @@ struct xt_NFQ_info_v1 { | |||
20 | __u16 queues_total; | 20 | __u16 queues_total; |
21 | }; | 21 | }; |
22 | 22 | ||
23 | struct xt_NFQ_info_v2 { | ||
24 | __u16 queuenum; | ||
25 | __u16 queues_total; | ||
26 | __u16 bypass; | ||
27 | }; | ||
28 | |||
23 | #endif /* _XT_NFQ_TARGET_H */ | 29 | #endif /* _XT_NFQ_TARGET_H */ |
diff --git a/include/linux/netfilter/xt_TCPOPTSTRIP.h b/include/linux/netfilter/xt_TCPOPTSTRIP.h index 2db543214ff5..7157318499c2 100644 --- a/include/linux/netfilter/xt_TCPOPTSTRIP.h +++ b/include/linux/netfilter/xt_TCPOPTSTRIP.h | |||
@@ -1,13 +1,15 @@ | |||
1 | #ifndef _XT_TCPOPTSTRIP_H | 1 | #ifndef _XT_TCPOPTSTRIP_H |
2 | #define _XT_TCPOPTSTRIP_H | 2 | #define _XT_TCPOPTSTRIP_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define tcpoptstrip_set_bit(bmap, idx) \ | 6 | #define tcpoptstrip_set_bit(bmap, idx) \ |
5 | (bmap[(idx) >> 5] |= 1U << (idx & 31)) | 7 | (bmap[(idx) >> 5] |= 1U << (idx & 31)) |
6 | #define tcpoptstrip_test_bit(bmap, idx) \ | 8 | #define tcpoptstrip_test_bit(bmap, idx) \ |
7 | (((1U << (idx & 31)) & bmap[(idx) >> 5]) != 0) | 9 | (((1U << (idx & 31)) & bmap[(idx) >> 5]) != 0) |
8 | 10 | ||
9 | struct xt_tcpoptstrip_target_info { | 11 | struct xt_tcpoptstrip_target_info { |
10 | u_int32_t strip_bmap[8]; | 12 | __u32 strip_bmap[8]; |
11 | }; | 13 | }; |
12 | 14 | ||
13 | #endif /* _XT_TCPOPTSTRIP_H */ | 15 | #endif /* _XT_TCPOPTSTRIP_H */ |
diff --git a/include/linux/netfilter/xt_TPROXY.h b/include/linux/netfilter/xt_TPROXY.h index 3f3d69361289..902043c2073f 100644 --- a/include/linux/netfilter/xt_TPROXY.h +++ b/include/linux/netfilter/xt_TPROXY.h | |||
@@ -1,19 +1,21 @@ | |||
1 | #ifndef _XT_TPROXY_H | 1 | #ifndef _XT_TPROXY_H |
2 | #define _XT_TPROXY_H | 2 | #define _XT_TPROXY_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | /* TPROXY target is capable of marking the packet to perform | 6 | /* TPROXY target is capable of marking the packet to perform |
5 | * redirection. We can get rid of that whenever we get support for | 7 | * redirection. We can get rid of that whenever we get support for |
6 | * mutliple targets in the same rule. */ | 8 | * mutliple targets in the same rule. */ |
7 | struct xt_tproxy_target_info { | 9 | struct xt_tproxy_target_info { |
8 | u_int32_t mark_mask; | 10 | __u32 mark_mask; |
9 | u_int32_t mark_value; | 11 | __u32 mark_value; |
10 | __be32 laddr; | 12 | __be32 laddr; |
11 | __be16 lport; | 13 | __be16 lport; |
12 | }; | 14 | }; |
13 | 15 | ||
14 | struct xt_tproxy_target_info_v1 { | 16 | struct xt_tproxy_target_info_v1 { |
15 | u_int32_t mark_mask; | 17 | __u32 mark_mask; |
16 | u_int32_t mark_value; | 18 | __u32 mark_value; |
17 | union nf_inet_addr laddr; | 19 | union nf_inet_addr laddr; |
18 | __be16 lport; | 20 | __be16 lport; |
19 | }; | 21 | }; |
diff --git a/include/linux/netfilter/xt_addrtype.h b/include/linux/netfilter/xt_addrtype.h new file mode 100644 index 000000000000..b156baa9d55e --- /dev/null +++ b/include/linux/netfilter/xt_addrtype.h | |||
@@ -0,0 +1,44 @@ | |||
1 | #ifndef _XT_ADDRTYPE_H | ||
2 | #define _XT_ADDRTYPE_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | enum { | ||
7 | XT_ADDRTYPE_INVERT_SOURCE = 0x0001, | ||
8 | XT_ADDRTYPE_INVERT_DEST = 0x0002, | ||
9 | XT_ADDRTYPE_LIMIT_IFACE_IN = 0x0004, | ||
10 | XT_ADDRTYPE_LIMIT_IFACE_OUT = 0x0008, | ||
11 | }; | ||
12 | |||
13 | |||
14 | /* rtn_type enum values from rtnetlink.h, but shifted */ | ||
15 | enum { | ||
16 | XT_ADDRTYPE_UNSPEC = 1 << 0, | ||
17 | XT_ADDRTYPE_UNICAST = 1 << 1, /* 1 << RTN_UNICAST */ | ||
18 | XT_ADDRTYPE_LOCAL = 1 << 2, /* 1 << RTN_LOCAL, etc */ | ||
19 | XT_ADDRTYPE_BROADCAST = 1 << 3, | ||
20 | XT_ADDRTYPE_ANYCAST = 1 << 4, | ||
21 | XT_ADDRTYPE_MULTICAST = 1 << 5, | ||
22 | XT_ADDRTYPE_BLACKHOLE = 1 << 6, | ||
23 | XT_ADDRTYPE_UNREACHABLE = 1 << 7, | ||
24 | XT_ADDRTYPE_PROHIBIT = 1 << 8, | ||
25 | XT_ADDRTYPE_THROW = 1 << 9, | ||
26 | XT_ADDRTYPE_NAT = 1 << 10, | ||
27 | XT_ADDRTYPE_XRESOLVE = 1 << 11, | ||
28 | }; | ||
29 | |||
30 | struct xt_addrtype_info_v1 { | ||
31 | __u16 source; /* source-type mask */ | ||
32 | __u16 dest; /* dest-type mask */ | ||
33 | __u32 flags; | ||
34 | }; | ||
35 | |||
36 | /* revision 0 */ | ||
37 | struct xt_addrtype_info { | ||
38 | __u16 source; /* source-type mask */ | ||
39 | __u16 dest; /* dest-type mask */ | ||
40 | __u32 invert_source; | ||
41 | __u32 invert_dest; | ||
42 | }; | ||
43 | |||
44 | #endif | ||
diff --git a/include/linux/netfilter/xt_cluster.h b/include/linux/netfilter/xt_cluster.h index 886682656f09..9b883c8fbf54 100644 --- a/include/linux/netfilter/xt_cluster.h +++ b/include/linux/netfilter/xt_cluster.h | |||
@@ -1,15 +1,17 @@ | |||
1 | #ifndef _XT_CLUSTER_MATCH_H | 1 | #ifndef _XT_CLUSTER_MATCH_H |
2 | #define _XT_CLUSTER_MATCH_H | 2 | #define _XT_CLUSTER_MATCH_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | enum xt_cluster_flags { | 6 | enum xt_cluster_flags { |
5 | XT_CLUSTER_F_INV = (1 << 0) | 7 | XT_CLUSTER_F_INV = (1 << 0) |
6 | }; | 8 | }; |
7 | 9 | ||
8 | struct xt_cluster_match_info { | 10 | struct xt_cluster_match_info { |
9 | u_int32_t total_nodes; | 11 | __u32 total_nodes; |
10 | u_int32_t node_mask; | 12 | __u32 node_mask; |
11 | u_int32_t hash_seed; | 13 | __u32 hash_seed; |
12 | u_int32_t flags; | 14 | __u32 flags; |
13 | }; | 15 | }; |
14 | 16 | ||
15 | #define XT_CLUSTER_NODES_MAX 32 | 17 | #define XT_CLUSTER_NODES_MAX 32 |
diff --git a/include/linux/netfilter/xt_comment.h b/include/linux/netfilter/xt_comment.h index eacfedc6b5d0..0ea5e79f5bd7 100644 --- a/include/linux/netfilter/xt_comment.h +++ b/include/linux/netfilter/xt_comment.h | |||
@@ -4,7 +4,7 @@ | |||
4 | #define XT_MAX_COMMENT_LEN 256 | 4 | #define XT_MAX_COMMENT_LEN 256 |
5 | 5 | ||
6 | struct xt_comment_info { | 6 | struct xt_comment_info { |
7 | unsigned char comment[XT_MAX_COMMENT_LEN]; | 7 | char comment[XT_MAX_COMMENT_LEN]; |
8 | }; | 8 | }; |
9 | 9 | ||
10 | #endif /* XT_COMMENT_H */ | 10 | #endif /* XT_COMMENT_H */ |
diff --git a/include/linux/netfilter/xt_connbytes.h b/include/linux/netfilter/xt_connbytes.h index 92fcbb0d193e..f1d6c15bd9e3 100644 --- a/include/linux/netfilter/xt_connbytes.h +++ b/include/linux/netfilter/xt_connbytes.h | |||
@@ -17,8 +17,8 @@ enum xt_connbytes_direction { | |||
17 | 17 | ||
18 | struct xt_connbytes_info { | 18 | struct xt_connbytes_info { |
19 | struct { | 19 | struct { |
20 | aligned_u64 from; /* count to be matched */ | 20 | __aligned_u64 from; /* count to be matched */ |
21 | aligned_u64 to; /* count to be matched */ | 21 | __aligned_u64 to; /* count to be matched */ |
22 | } count; | 22 | } count; |
23 | __u8 what; /* ipt_connbytes_what */ | 23 | __u8 what; /* ipt_connbytes_what */ |
24 | __u8 direction; /* ipt_connbytes_direction */ | 24 | __u8 direction; /* ipt_connbytes_direction */ |
diff --git a/include/linux/netfilter/xt_connlimit.h b/include/linux/netfilter/xt_connlimit.h index 7e3284bcbd2b..0ca66e97acbc 100644 --- a/include/linux/netfilter/xt_connlimit.h +++ b/include/linux/netfilter/xt_connlimit.h | |||
@@ -1,8 +1,15 @@ | |||
1 | #ifndef _XT_CONNLIMIT_H | 1 | #ifndef _XT_CONNLIMIT_H |
2 | #define _XT_CONNLIMIT_H | 2 | #define _XT_CONNLIMIT_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | struct xt_connlimit_data; | 6 | struct xt_connlimit_data; |
5 | 7 | ||
8 | enum { | ||
9 | XT_CONNLIMIT_INVERT = 1 << 0, | ||
10 | XT_CONNLIMIT_DADDR = 1 << 1, | ||
11 | }; | ||
12 | |||
6 | struct xt_connlimit_info { | 13 | struct xt_connlimit_info { |
7 | union { | 14 | union { |
8 | union nf_inet_addr mask; | 15 | union nf_inet_addr mask; |
@@ -13,7 +20,14 @@ struct xt_connlimit_info { | |||
13 | }; | 20 | }; |
14 | #endif | 21 | #endif |
15 | }; | 22 | }; |
16 | unsigned int limit, inverse; | 23 | unsigned int limit; |
24 | union { | ||
25 | /* revision 0 */ | ||
26 | unsigned int inverse; | ||
27 | |||
28 | /* revision 1 */ | ||
29 | __u32 flags; | ||
30 | }; | ||
17 | 31 | ||
18 | /* Used internally by the kernel */ | 32 | /* Used internally by the kernel */ |
19 | struct xt_connlimit_data *data __attribute__((aligned(8))); | 33 | struct xt_connlimit_data *data __attribute__((aligned(8))); |
diff --git a/include/linux/netfilter/xt_conntrack.h b/include/linux/netfilter/xt_conntrack.h index 54f47a2f6152..74b904d8f99c 100644 --- a/include/linux/netfilter/xt_conntrack.h +++ b/include/linux/netfilter/xt_conntrack.h | |||
@@ -58,4 +58,19 @@ struct xt_conntrack_mtinfo2 { | |||
58 | __u16 state_mask, status_mask; | 58 | __u16 state_mask, status_mask; |
59 | }; | 59 | }; |
60 | 60 | ||
61 | struct xt_conntrack_mtinfo3 { | ||
62 | union nf_inet_addr origsrc_addr, origsrc_mask; | ||
63 | union nf_inet_addr origdst_addr, origdst_mask; | ||
64 | union nf_inet_addr replsrc_addr, replsrc_mask; | ||
65 | union nf_inet_addr repldst_addr, repldst_mask; | ||
66 | __u32 expires_min, expires_max; | ||
67 | __u16 l4proto; | ||
68 | __u16 origsrc_port, origdst_port; | ||
69 | __u16 replsrc_port, repldst_port; | ||
70 | __u16 match_flags, invert_flags; | ||
71 | __u16 state_mask, status_mask; | ||
72 | __u16 origsrc_port_high, origdst_port_high; | ||
73 | __u16 replsrc_port_high, repldst_port_high; | ||
74 | }; | ||
75 | |||
61 | #endif /*_XT_CONNTRACK_H*/ | 76 | #endif /*_XT_CONNTRACK_H*/ |
diff --git a/include/linux/netfilter/xt_devgroup.h b/include/linux/netfilter/xt_devgroup.h new file mode 100644 index 000000000000..1babde0ec900 --- /dev/null +++ b/include/linux/netfilter/xt_devgroup.h | |||
@@ -0,0 +1,21 @@ | |||
1 | #ifndef _XT_DEVGROUP_H | ||
2 | #define _XT_DEVGROUP_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | enum xt_devgroup_flags { | ||
7 | XT_DEVGROUP_MATCH_SRC = 0x1, | ||
8 | XT_DEVGROUP_INVERT_SRC = 0x2, | ||
9 | XT_DEVGROUP_MATCH_DST = 0x4, | ||
10 | XT_DEVGROUP_INVERT_DST = 0x8, | ||
11 | }; | ||
12 | |||
13 | struct xt_devgroup_info { | ||
14 | __u32 flags; | ||
15 | __u32 src_group; | ||
16 | __u32 src_mask; | ||
17 | __u32 dst_group; | ||
18 | __u32 dst_mask; | ||
19 | }; | ||
20 | |||
21 | #endif /* _XT_DEVGROUP_H */ | ||
diff --git a/include/linux/netfilter/xt_quota.h b/include/linux/netfilter/xt_quota.h index b0d28c659ab7..9314723f39ca 100644 --- a/include/linux/netfilter/xt_quota.h +++ b/include/linux/netfilter/xt_quota.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _XT_QUOTA_H | 1 | #ifndef _XT_QUOTA_H |
2 | #define _XT_QUOTA_H | 2 | #define _XT_QUOTA_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | enum xt_quota_flags { | 6 | enum xt_quota_flags { |
5 | XT_QUOTA_INVERT = 0x1, | 7 | XT_QUOTA_INVERT = 0x1, |
6 | }; | 8 | }; |
@@ -9,9 +11,9 @@ enum xt_quota_flags { | |||
9 | struct xt_quota_priv; | 11 | struct xt_quota_priv; |
10 | 12 | ||
11 | struct xt_quota_info { | 13 | struct xt_quota_info { |
12 | u_int32_t flags; | 14 | __u32 flags; |
13 | u_int32_t pad; | 15 | __u32 pad; |
14 | aligned_u64 quota; | 16 | __aligned_u64 quota; |
15 | 17 | ||
16 | /* Used internally by the kernel */ | 18 | /* Used internally by the kernel */ |
17 | struct xt_quota_priv *master; | 19 | struct xt_quota_priv *master; |
diff --git a/include/linux/netfilter/xt_set.h b/include/linux/netfilter/xt_set.h new file mode 100644 index 000000000000..081f1ded2842 --- /dev/null +++ b/include/linux/netfilter/xt_set.h | |||
@@ -0,0 +1,56 @@ | |||
1 | #ifndef _XT_SET_H | ||
2 | #define _XT_SET_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <linux/netfilter/ipset/ip_set.h> | ||
6 | |||
7 | /* Revision 0 interface: backward compatible with netfilter/iptables */ | ||
8 | |||
9 | /* | ||
10 | * Option flags for kernel operations (xt_set_info_v0) | ||
11 | */ | ||
12 | #define IPSET_SRC 0x01 /* Source match/add */ | ||
13 | #define IPSET_DST 0x02 /* Destination match/add */ | ||
14 | #define IPSET_MATCH_INV 0x04 /* Inverse matching */ | ||
15 | |||
16 | struct xt_set_info_v0 { | ||
17 | ip_set_id_t index; | ||
18 | union { | ||
19 | __u32 flags[IPSET_DIM_MAX + 1]; | ||
20 | struct { | ||
21 | __u32 __flags[IPSET_DIM_MAX]; | ||
22 | __u8 dim; | ||
23 | __u8 flags; | ||
24 | } compat; | ||
25 | } u; | ||
26 | }; | ||
27 | |||
28 | /* match and target infos */ | ||
29 | struct xt_set_info_match_v0 { | ||
30 | struct xt_set_info_v0 match_set; | ||
31 | }; | ||
32 | |||
33 | struct xt_set_info_target_v0 { | ||
34 | struct xt_set_info_v0 add_set; | ||
35 | struct xt_set_info_v0 del_set; | ||
36 | }; | ||
37 | |||
38 | /* Revision 1: current interface to netfilter/iptables */ | ||
39 | |||
40 | struct xt_set_info { | ||
41 | ip_set_id_t index; | ||
42 | __u8 dim; | ||
43 | __u8 flags; | ||
44 | }; | ||
45 | |||
46 | /* match and target infos */ | ||
47 | struct xt_set_info_match { | ||
48 | struct xt_set_info match_set; | ||
49 | }; | ||
50 | |||
51 | struct xt_set_info_target { | ||
52 | struct xt_set_info add_set; | ||
53 | struct xt_set_info del_set; | ||
54 | }; | ||
55 | |||
56 | #endif /*_XT_SET_H*/ | ||
diff --git a/include/linux/netfilter/xt_socket.h b/include/linux/netfilter/xt_socket.h index 6f475b8ff34b..26d7217bd4f1 100644 --- a/include/linux/netfilter/xt_socket.h +++ b/include/linux/netfilter/xt_socket.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _XT_SOCKET_H | 1 | #ifndef _XT_SOCKET_H |
2 | #define _XT_SOCKET_H | 2 | #define _XT_SOCKET_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | enum { | 6 | enum { |
5 | XT_SOCKET_TRANSPARENT = 1 << 0, | 7 | XT_SOCKET_TRANSPARENT = 1 << 0, |
6 | }; | 8 | }; |
diff --git a/include/linux/netfilter/xt_time.h b/include/linux/netfilter/xt_time.h index 14b6df412c9f..7c37fac576c4 100644 --- a/include/linux/netfilter/xt_time.h +++ b/include/linux/netfilter/xt_time.h | |||
@@ -1,14 +1,16 @@ | |||
1 | #ifndef _XT_TIME_H | 1 | #ifndef _XT_TIME_H |
2 | #define _XT_TIME_H 1 | 2 | #define _XT_TIME_H 1 |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | struct xt_time_info { | 6 | struct xt_time_info { |
5 | u_int32_t date_start; | 7 | __u32 date_start; |
6 | u_int32_t date_stop; | 8 | __u32 date_stop; |
7 | u_int32_t daytime_start; | 9 | __u32 daytime_start; |
8 | u_int32_t daytime_stop; | 10 | __u32 daytime_stop; |
9 | u_int32_t monthdays_match; | 11 | __u32 monthdays_match; |
10 | u_int8_t weekdays_match; | 12 | __u8 weekdays_match; |
11 | u_int8_t flags; | 13 | __u8 flags; |
12 | }; | 14 | }; |
13 | 15 | ||
14 | enum { | 16 | enum { |
diff --git a/include/linux/netfilter/xt_u32.h b/include/linux/netfilter/xt_u32.h index 9947f56cdbdd..04d1bfea03c2 100644 --- a/include/linux/netfilter/xt_u32.h +++ b/include/linux/netfilter/xt_u32.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _XT_U32_H | 1 | #ifndef _XT_U32_H |
2 | #define _XT_U32_H 1 | 2 | #define _XT_U32_H 1 |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | enum xt_u32_ops { | 6 | enum xt_u32_ops { |
5 | XT_U32_AND, | 7 | XT_U32_AND, |
6 | XT_U32_LEFTSH, | 8 | XT_U32_LEFTSH, |
@@ -9,13 +11,13 @@ enum xt_u32_ops { | |||
9 | }; | 11 | }; |
10 | 12 | ||
11 | struct xt_u32_location_element { | 13 | struct xt_u32_location_element { |
12 | u_int32_t number; | 14 | __u32 number; |
13 | u_int8_t nextop; | 15 | __u8 nextop; |
14 | }; | 16 | }; |
15 | 17 | ||
16 | struct xt_u32_value_element { | 18 | struct xt_u32_value_element { |
17 | u_int32_t min; | 19 | __u32 min; |
18 | u_int32_t max; | 20 | __u32 max; |
19 | }; | 21 | }; |
20 | 22 | ||
21 | /* | 23 | /* |
@@ -27,14 +29,14 @@ struct xt_u32_value_element { | |||
27 | struct xt_u32_test { | 29 | struct xt_u32_test { |
28 | struct xt_u32_location_element location[XT_U32_MAXSIZE+1]; | 30 | struct xt_u32_location_element location[XT_U32_MAXSIZE+1]; |
29 | struct xt_u32_value_element value[XT_U32_MAXSIZE+1]; | 31 | struct xt_u32_value_element value[XT_U32_MAXSIZE+1]; |
30 | u_int8_t nnums; | 32 | __u8 nnums; |
31 | u_int8_t nvalues; | 33 | __u8 nvalues; |
32 | }; | 34 | }; |
33 | 35 | ||
34 | struct xt_u32 { | 36 | struct xt_u32 { |
35 | struct xt_u32_test tests[XT_U32_MAXSIZE+1]; | 37 | struct xt_u32_test tests[XT_U32_MAXSIZE+1]; |
36 | u_int8_t ntests; | 38 | __u8 ntests; |
37 | u_int8_t invert; | 39 | __u8 invert; |
38 | }; | 40 | }; |
39 | 41 | ||
40 | #endif /* _XT_U32_H */ | 42 | #endif /* _XT_U32_H */ |
diff --git a/include/linux/netfilter_bridge/ebt_802_3.h b/include/linux/netfilter_bridge/ebt_802_3.h index c73ef0b18bdc..be5be1577a56 100644 --- a/include/linux/netfilter_bridge/ebt_802_3.h +++ b/include/linux/netfilter_bridge/ebt_802_3.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_802_3_H | 1 | #ifndef __LINUX_BRIDGE_EBT_802_3_H |
2 | #define __LINUX_BRIDGE_EBT_802_3_H | 2 | #define __LINUX_BRIDGE_EBT_802_3_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_802_3_SAP 0x01 | 6 | #define EBT_802_3_SAP 0x01 |
5 | #define EBT_802_3_TYPE 0x02 | 7 | #define EBT_802_3_TYPE 0x02 |
6 | 8 | ||
@@ -24,24 +26,24 @@ | |||
24 | 26 | ||
25 | /* ui has one byte ctrl, ni has two */ | 27 | /* ui has one byte ctrl, ni has two */ |
26 | struct hdr_ui { | 28 | struct hdr_ui { |
27 | uint8_t dsap; | 29 | __u8 dsap; |
28 | uint8_t ssap; | 30 | __u8 ssap; |
29 | uint8_t ctrl; | 31 | __u8 ctrl; |
30 | uint8_t orig[3]; | 32 | __u8 orig[3]; |
31 | __be16 type; | 33 | __be16 type; |
32 | }; | 34 | }; |
33 | 35 | ||
34 | struct hdr_ni { | 36 | struct hdr_ni { |
35 | uint8_t dsap; | 37 | __u8 dsap; |
36 | uint8_t ssap; | 38 | __u8 ssap; |
37 | __be16 ctrl; | 39 | __be16 ctrl; |
38 | uint8_t orig[3]; | 40 | __u8 orig[3]; |
39 | __be16 type; | 41 | __be16 type; |
40 | }; | 42 | }; |
41 | 43 | ||
42 | struct ebt_802_3_hdr { | 44 | struct ebt_802_3_hdr { |
43 | uint8_t daddr[6]; | 45 | __u8 daddr[6]; |
44 | uint8_t saddr[6]; | 46 | __u8 saddr[6]; |
45 | __be16 len; | 47 | __be16 len; |
46 | union { | 48 | union { |
47 | struct hdr_ui ui; | 49 | struct hdr_ui ui; |
@@ -59,10 +61,10 @@ static inline struct ebt_802_3_hdr *ebt_802_3_hdr(const struct sk_buff *skb) | |||
59 | #endif | 61 | #endif |
60 | 62 | ||
61 | struct ebt_802_3_info { | 63 | struct ebt_802_3_info { |
62 | uint8_t sap; | 64 | __u8 sap; |
63 | __be16 type; | 65 | __be16 type; |
64 | uint8_t bitmask; | 66 | __u8 bitmask; |
65 | uint8_t invflags; | 67 | __u8 invflags; |
66 | }; | 68 | }; |
67 | 69 | ||
68 | #endif | 70 | #endif |
diff --git a/include/linux/netfilter_bridge/ebt_among.h b/include/linux/netfilter_bridge/ebt_among.h index 0009558609a7..bd4e3ad0b706 100644 --- a/include/linux/netfilter_bridge/ebt_among.h +++ b/include/linux/netfilter_bridge/ebt_among.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_AMONG_H | 1 | #ifndef __LINUX_BRIDGE_EBT_AMONG_H |
2 | #define __LINUX_BRIDGE_EBT_AMONG_H | 2 | #define __LINUX_BRIDGE_EBT_AMONG_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_AMONG_DST 0x01 | 6 | #define EBT_AMONG_DST 0x01 |
5 | #define EBT_AMONG_SRC 0x02 | 7 | #define EBT_AMONG_SRC 0x02 |
6 | 8 | ||
@@ -30,7 +32,7 @@ | |||
30 | */ | 32 | */ |
31 | 33 | ||
32 | struct ebt_mac_wormhash_tuple { | 34 | struct ebt_mac_wormhash_tuple { |
33 | uint32_t cmp[2]; | 35 | __u32 cmp[2]; |
34 | __be32 ip; | 36 | __be32 ip; |
35 | }; | 37 | }; |
36 | 38 | ||
diff --git a/include/linux/netfilter_bridge/ebt_arp.h b/include/linux/netfilter_bridge/ebt_arp.h index cbf4843b6b0f..522f3e427f49 100644 --- a/include/linux/netfilter_bridge/ebt_arp.h +++ b/include/linux/netfilter_bridge/ebt_arp.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_ARP_H | 1 | #ifndef __LINUX_BRIDGE_EBT_ARP_H |
2 | #define __LINUX_BRIDGE_EBT_ARP_H | 2 | #define __LINUX_BRIDGE_EBT_ARP_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_ARP_OPCODE 0x01 | 6 | #define EBT_ARP_OPCODE 0x01 |
5 | #define EBT_ARP_HTYPE 0x02 | 7 | #define EBT_ARP_HTYPE 0x02 |
6 | #define EBT_ARP_PTYPE 0x04 | 8 | #define EBT_ARP_PTYPE 0x04 |
@@ -27,8 +29,8 @@ struct ebt_arp_info | |||
27 | unsigned char smmsk[ETH_ALEN]; | 29 | unsigned char smmsk[ETH_ALEN]; |
28 | unsigned char dmaddr[ETH_ALEN]; | 30 | unsigned char dmaddr[ETH_ALEN]; |
29 | unsigned char dmmsk[ETH_ALEN]; | 31 | unsigned char dmmsk[ETH_ALEN]; |
30 | uint8_t bitmask; | 32 | __u8 bitmask; |
31 | uint8_t invflags; | 33 | __u8 invflags; |
32 | }; | 34 | }; |
33 | 35 | ||
34 | #endif | 36 | #endif |
diff --git a/include/linux/netfilter_bridge/ebt_ip.h b/include/linux/netfilter_bridge/ebt_ip.h index 6a708fb92241..c4bbc41b0ea4 100644 --- a/include/linux/netfilter_bridge/ebt_ip.h +++ b/include/linux/netfilter_bridge/ebt_ip.h | |||
@@ -15,6 +15,8 @@ | |||
15 | #ifndef __LINUX_BRIDGE_EBT_IP_H | 15 | #ifndef __LINUX_BRIDGE_EBT_IP_H |
16 | #define __LINUX_BRIDGE_EBT_IP_H | 16 | #define __LINUX_BRIDGE_EBT_IP_H |
17 | 17 | ||
18 | #include <linux/types.h> | ||
19 | |||
18 | #define EBT_IP_SOURCE 0x01 | 20 | #define EBT_IP_SOURCE 0x01 |
19 | #define EBT_IP_DEST 0x02 | 21 | #define EBT_IP_DEST 0x02 |
20 | #define EBT_IP_TOS 0x04 | 22 | #define EBT_IP_TOS 0x04 |
@@ -31,12 +33,12 @@ struct ebt_ip_info { | |||
31 | __be32 daddr; | 33 | __be32 daddr; |
32 | __be32 smsk; | 34 | __be32 smsk; |
33 | __be32 dmsk; | 35 | __be32 dmsk; |
34 | uint8_t tos; | 36 | __u8 tos; |
35 | uint8_t protocol; | 37 | __u8 protocol; |
36 | uint8_t bitmask; | 38 | __u8 bitmask; |
37 | uint8_t invflags; | 39 | __u8 invflags; |
38 | uint16_t sport[2]; | 40 | __u16 sport[2]; |
39 | uint16_t dport[2]; | 41 | __u16 dport[2]; |
40 | }; | 42 | }; |
41 | 43 | ||
42 | #endif | 44 | #endif |
diff --git a/include/linux/netfilter_bridge/ebt_ip6.h b/include/linux/netfilter_bridge/ebt_ip6.h index e5de98701519..42b889682721 100644 --- a/include/linux/netfilter_bridge/ebt_ip6.h +++ b/include/linux/netfilter_bridge/ebt_ip6.h | |||
@@ -12,14 +12,19 @@ | |||
12 | #ifndef __LINUX_BRIDGE_EBT_IP6_H | 12 | #ifndef __LINUX_BRIDGE_EBT_IP6_H |
13 | #define __LINUX_BRIDGE_EBT_IP6_H | 13 | #define __LINUX_BRIDGE_EBT_IP6_H |
14 | 14 | ||
15 | #include <linux/types.h> | ||
16 | |||
15 | #define EBT_IP6_SOURCE 0x01 | 17 | #define EBT_IP6_SOURCE 0x01 |
16 | #define EBT_IP6_DEST 0x02 | 18 | #define EBT_IP6_DEST 0x02 |
17 | #define EBT_IP6_TCLASS 0x04 | 19 | #define EBT_IP6_TCLASS 0x04 |
18 | #define EBT_IP6_PROTO 0x08 | 20 | #define EBT_IP6_PROTO 0x08 |
19 | #define EBT_IP6_SPORT 0x10 | 21 | #define EBT_IP6_SPORT 0x10 |
20 | #define EBT_IP6_DPORT 0x20 | 22 | #define EBT_IP6_DPORT 0x20 |
23 | #define EBT_IP6_ICMP6 0x40 | ||
24 | |||
21 | #define EBT_IP6_MASK (EBT_IP6_SOURCE | EBT_IP6_DEST | EBT_IP6_TCLASS |\ | 25 | #define EBT_IP6_MASK (EBT_IP6_SOURCE | EBT_IP6_DEST | EBT_IP6_TCLASS |\ |
22 | EBT_IP6_PROTO | EBT_IP6_SPORT | EBT_IP6_DPORT) | 26 | EBT_IP6_PROTO | EBT_IP6_SPORT | EBT_IP6_DPORT | \ |
27 | EBT_IP6_ICMP6) | ||
23 | #define EBT_IP6_MATCH "ip6" | 28 | #define EBT_IP6_MATCH "ip6" |
24 | 29 | ||
25 | /* the same values are used for the invflags */ | 30 | /* the same values are used for the invflags */ |
@@ -28,12 +33,18 @@ struct ebt_ip6_info { | |||
28 | struct in6_addr daddr; | 33 | struct in6_addr daddr; |
29 | struct in6_addr smsk; | 34 | struct in6_addr smsk; |
30 | struct in6_addr dmsk; | 35 | struct in6_addr dmsk; |
31 | uint8_t tclass; | 36 | __u8 tclass; |
32 | uint8_t protocol; | 37 | __u8 protocol; |
33 | uint8_t bitmask; | 38 | __u8 bitmask; |
34 | uint8_t invflags; | 39 | __u8 invflags; |
35 | uint16_t sport[2]; | 40 | union { |
36 | uint16_t dport[2]; | 41 | __u16 sport[2]; |
42 | __u8 icmpv6_type[2]; | ||
43 | }; | ||
44 | union { | ||
45 | __u16 dport[2]; | ||
46 | __u8 icmpv6_code[2]; | ||
47 | }; | ||
37 | }; | 48 | }; |
38 | 49 | ||
39 | #endif | 50 | #endif |
diff --git a/include/linux/netfilter_bridge/ebt_limit.h b/include/linux/netfilter_bridge/ebt_limit.h index 4bf76b751676..66d80b30ba0e 100644 --- a/include/linux/netfilter_bridge/ebt_limit.h +++ b/include/linux/netfilter_bridge/ebt_limit.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_LIMIT_H | 1 | #ifndef __LINUX_BRIDGE_EBT_LIMIT_H |
2 | #define __LINUX_BRIDGE_EBT_LIMIT_H | 2 | #define __LINUX_BRIDGE_EBT_LIMIT_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_LIMIT_MATCH "limit" | 6 | #define EBT_LIMIT_MATCH "limit" |
5 | 7 | ||
6 | /* timings are in milliseconds. */ | 8 | /* timings are in milliseconds. */ |
@@ -10,13 +12,13 @@ | |||
10 | seconds, or one every 59 hours. */ | 12 | seconds, or one every 59 hours. */ |
11 | 13 | ||
12 | struct ebt_limit_info { | 14 | struct ebt_limit_info { |
13 | u_int32_t avg; /* Average secs between packets * scale */ | 15 | __u32 avg; /* Average secs between packets * scale */ |
14 | u_int32_t burst; /* Period multiplier for upper limit. */ | 16 | __u32 burst; /* Period multiplier for upper limit. */ |
15 | 17 | ||
16 | /* Used internally by the kernel */ | 18 | /* Used internally by the kernel */ |
17 | unsigned long prev; | 19 | unsigned long prev; |
18 | u_int32_t credit; | 20 | __u32 credit; |
19 | u_int32_t credit_cap, cost; | 21 | __u32 credit_cap, cost; |
20 | }; | 22 | }; |
21 | 23 | ||
22 | #endif | 24 | #endif |
diff --git a/include/linux/netfilter_bridge/ebt_log.h b/include/linux/netfilter_bridge/ebt_log.h index cc2cdfb764bc..7e7f1d1fe494 100644 --- a/include/linux/netfilter_bridge/ebt_log.h +++ b/include/linux/netfilter_bridge/ebt_log.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_LOG_H | 1 | #ifndef __LINUX_BRIDGE_EBT_LOG_H |
2 | #define __LINUX_BRIDGE_EBT_LOG_H | 2 | #define __LINUX_BRIDGE_EBT_LOG_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_LOG_IP 0x01 /* if the frame is made by ip, log the ip information */ | 6 | #define EBT_LOG_IP 0x01 /* if the frame is made by ip, log the ip information */ |
5 | #define EBT_LOG_ARP 0x02 | 7 | #define EBT_LOG_ARP 0x02 |
6 | #define EBT_LOG_NFLOG 0x04 | 8 | #define EBT_LOG_NFLOG 0x04 |
@@ -10,9 +12,9 @@ | |||
10 | #define EBT_LOG_WATCHER "log" | 12 | #define EBT_LOG_WATCHER "log" |
11 | 13 | ||
12 | struct ebt_log_info { | 14 | struct ebt_log_info { |
13 | uint8_t loglevel; | 15 | __u8 loglevel; |
14 | uint8_t prefix[EBT_LOG_PREFIX_SIZE]; | 16 | __u8 prefix[EBT_LOG_PREFIX_SIZE]; |
15 | uint32_t bitmask; | 17 | __u32 bitmask; |
16 | }; | 18 | }; |
17 | 19 | ||
18 | #endif | 20 | #endif |
diff --git a/include/linux/netfilter_bridge/ebt_mark_m.h b/include/linux/netfilter_bridge/ebt_mark_m.h index 9ceb10ec0ed6..410f9e5a71d4 100644 --- a/include/linux/netfilter_bridge/ebt_mark_m.h +++ b/include/linux/netfilter_bridge/ebt_mark_m.h | |||
@@ -1,13 +1,15 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_MARK_M_H | 1 | #ifndef __LINUX_BRIDGE_EBT_MARK_M_H |
2 | #define __LINUX_BRIDGE_EBT_MARK_M_H | 2 | #define __LINUX_BRIDGE_EBT_MARK_M_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_MARK_AND 0x01 | 6 | #define EBT_MARK_AND 0x01 |
5 | #define EBT_MARK_OR 0x02 | 7 | #define EBT_MARK_OR 0x02 |
6 | #define EBT_MARK_MASK (EBT_MARK_AND | EBT_MARK_OR) | 8 | #define EBT_MARK_MASK (EBT_MARK_AND | EBT_MARK_OR) |
7 | struct ebt_mark_m_info { | 9 | struct ebt_mark_m_info { |
8 | unsigned long mark, mask; | 10 | unsigned long mark, mask; |
9 | uint8_t invert; | 11 | __u8 invert; |
10 | uint8_t bitmask; | 12 | __u8 bitmask; |
11 | }; | 13 | }; |
12 | #define EBT_MARK_MATCH "mark_m" | 14 | #define EBT_MARK_MATCH "mark_m" |
13 | 15 | ||
diff --git a/include/linux/netfilter_bridge/ebt_nflog.h b/include/linux/netfilter_bridge/ebt_nflog.h index 052817849b83..df829fce9125 100644 --- a/include/linux/netfilter_bridge/ebt_nflog.h +++ b/include/linux/netfilter_bridge/ebt_nflog.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_NFLOG_H | 1 | #ifndef __LINUX_BRIDGE_EBT_NFLOG_H |
2 | #define __LINUX_BRIDGE_EBT_NFLOG_H | 2 | #define __LINUX_BRIDGE_EBT_NFLOG_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_NFLOG_MASK 0x0 | 6 | #define EBT_NFLOG_MASK 0x0 |
5 | 7 | ||
6 | #define EBT_NFLOG_PREFIX_SIZE 64 | 8 | #define EBT_NFLOG_PREFIX_SIZE 64 |
@@ -10,11 +12,11 @@ | |||
10 | #define EBT_NFLOG_DEFAULT_THRESHOLD 1 | 12 | #define EBT_NFLOG_DEFAULT_THRESHOLD 1 |
11 | 13 | ||
12 | struct ebt_nflog_info { | 14 | struct ebt_nflog_info { |
13 | u_int32_t len; | 15 | __u32 len; |
14 | u_int16_t group; | 16 | __u16 group; |
15 | u_int16_t threshold; | 17 | __u16 threshold; |
16 | u_int16_t flags; | 18 | __u16 flags; |
17 | u_int16_t pad; | 19 | __u16 pad; |
18 | char prefix[EBT_NFLOG_PREFIX_SIZE]; | 20 | char prefix[EBT_NFLOG_PREFIX_SIZE]; |
19 | }; | 21 | }; |
20 | 22 | ||
diff --git a/include/linux/netfilter_bridge/ebt_pkttype.h b/include/linux/netfilter_bridge/ebt_pkttype.h index 51a799840931..c241badcd036 100644 --- a/include/linux/netfilter_bridge/ebt_pkttype.h +++ b/include/linux/netfilter_bridge/ebt_pkttype.h | |||
@@ -1,9 +1,11 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_PKTTYPE_H | 1 | #ifndef __LINUX_BRIDGE_EBT_PKTTYPE_H |
2 | #define __LINUX_BRIDGE_EBT_PKTTYPE_H | 2 | #define __LINUX_BRIDGE_EBT_PKTTYPE_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | struct ebt_pkttype_info { | 6 | struct ebt_pkttype_info { |
5 | uint8_t pkt_type; | 7 | __u8 pkt_type; |
6 | uint8_t invert; | 8 | __u8 invert; |
7 | }; | 9 | }; |
8 | #define EBT_PKTTYPE_MATCH "pkttype" | 10 | #define EBT_PKTTYPE_MATCH "pkttype" |
9 | 11 | ||
diff --git a/include/linux/netfilter_bridge/ebt_stp.h b/include/linux/netfilter_bridge/ebt_stp.h index e503a0aa2728..1025b9f5fb7d 100644 --- a/include/linux/netfilter_bridge/ebt_stp.h +++ b/include/linux/netfilter_bridge/ebt_stp.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_STP_H | 1 | #ifndef __LINUX_BRIDGE_EBT_STP_H |
2 | #define __LINUX_BRIDGE_EBT_STP_H | 2 | #define __LINUX_BRIDGE_EBT_STP_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_STP_TYPE 0x0001 | 6 | #define EBT_STP_TYPE 0x0001 |
5 | 7 | ||
6 | #define EBT_STP_FLAGS 0x0002 | 8 | #define EBT_STP_FLAGS 0x0002 |
@@ -21,24 +23,24 @@ | |||
21 | #define EBT_STP_MATCH "stp" | 23 | #define EBT_STP_MATCH "stp" |
22 | 24 | ||
23 | struct ebt_stp_config_info { | 25 | struct ebt_stp_config_info { |
24 | uint8_t flags; | 26 | __u8 flags; |
25 | uint16_t root_priol, root_priou; | 27 | __u16 root_priol, root_priou; |
26 | char root_addr[6], root_addrmsk[6]; | 28 | char root_addr[6], root_addrmsk[6]; |
27 | uint32_t root_costl, root_costu; | 29 | __u32 root_costl, root_costu; |
28 | uint16_t sender_priol, sender_priou; | 30 | __u16 sender_priol, sender_priou; |
29 | char sender_addr[6], sender_addrmsk[6]; | 31 | char sender_addr[6], sender_addrmsk[6]; |
30 | uint16_t portl, portu; | 32 | __u16 portl, portu; |
31 | uint16_t msg_agel, msg_ageu; | 33 | __u16 msg_agel, msg_ageu; |
32 | uint16_t max_agel, max_ageu; | 34 | __u16 max_agel, max_ageu; |
33 | uint16_t hello_timel, hello_timeu; | 35 | __u16 hello_timel, hello_timeu; |
34 | uint16_t forward_delayl, forward_delayu; | 36 | __u16 forward_delayl, forward_delayu; |
35 | }; | 37 | }; |
36 | 38 | ||
37 | struct ebt_stp_info { | 39 | struct ebt_stp_info { |
38 | uint8_t type; | 40 | __u8 type; |
39 | struct ebt_stp_config_info config; | 41 | struct ebt_stp_config_info config; |
40 | uint16_t bitmask; | 42 | __u16 bitmask; |
41 | uint16_t invflags; | 43 | __u16 invflags; |
42 | }; | 44 | }; |
43 | 45 | ||
44 | #endif | 46 | #endif |
diff --git a/include/linux/netfilter_bridge/ebt_ulog.h b/include/linux/netfilter_bridge/ebt_ulog.h index b677e2671541..89a6becb5269 100644 --- a/include/linux/netfilter_bridge/ebt_ulog.h +++ b/include/linux/netfilter_bridge/ebt_ulog.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _EBT_ULOG_H | 1 | #ifndef _EBT_ULOG_H |
2 | #define _EBT_ULOG_H | 2 | #define _EBT_ULOG_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_ULOG_DEFAULT_NLGROUP 0 | 6 | #define EBT_ULOG_DEFAULT_NLGROUP 0 |
5 | #define EBT_ULOG_DEFAULT_QTHRESHOLD 1 | 7 | #define EBT_ULOG_DEFAULT_QTHRESHOLD 1 |
6 | #define EBT_ULOG_MAXNLGROUPS 32 /* hardcoded netlink max */ | 8 | #define EBT_ULOG_MAXNLGROUPS 32 /* hardcoded netlink max */ |
@@ -10,7 +12,7 @@ | |||
10 | #define EBT_ULOG_VERSION 1 | 12 | #define EBT_ULOG_VERSION 1 |
11 | 13 | ||
12 | struct ebt_ulog_info { | 14 | struct ebt_ulog_info { |
13 | uint32_t nlgroup; | 15 | __u32 nlgroup; |
14 | unsigned int cprange; | 16 | unsigned int cprange; |
15 | unsigned int qthreshold; | 17 | unsigned int qthreshold; |
16 | char prefix[EBT_ULOG_PREFIX_LEN]; | 18 | char prefix[EBT_ULOG_PREFIX_LEN]; |
diff --git a/include/linux/netfilter_bridge/ebt_vlan.h b/include/linux/netfilter_bridge/ebt_vlan.h index 1d98be4031e7..967d1d5cf98d 100644 --- a/include/linux/netfilter_bridge/ebt_vlan.h +++ b/include/linux/netfilter_bridge/ebt_vlan.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __LINUX_BRIDGE_EBT_VLAN_H | 1 | #ifndef __LINUX_BRIDGE_EBT_VLAN_H |
2 | #define __LINUX_BRIDGE_EBT_VLAN_H | 2 | #define __LINUX_BRIDGE_EBT_VLAN_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define EBT_VLAN_ID 0x01 | 6 | #define EBT_VLAN_ID 0x01 |
5 | #define EBT_VLAN_PRIO 0x02 | 7 | #define EBT_VLAN_PRIO 0x02 |
6 | #define EBT_VLAN_ENCAP 0x04 | 8 | #define EBT_VLAN_ENCAP 0x04 |
@@ -8,12 +10,12 @@ | |||
8 | #define EBT_VLAN_MATCH "vlan" | 10 | #define EBT_VLAN_MATCH "vlan" |
9 | 11 | ||
10 | struct ebt_vlan_info { | 12 | struct ebt_vlan_info { |
11 | uint16_t id; /* VLAN ID {1-4095} */ | 13 | __u16 id; /* VLAN ID {1-4095} */ |
12 | uint8_t prio; /* VLAN User Priority {0-7} */ | 14 | __u8 prio; /* VLAN User Priority {0-7} */ |
13 | __be16 encap; /* VLAN Encapsulated frame code {0-65535} */ | 15 | __be16 encap; /* VLAN Encapsulated frame code {0-65535} */ |
14 | uint8_t bitmask; /* Args bitmask bit 1=1 - ID arg, | 16 | __u8 bitmask; /* Args bitmask bit 1=1 - ID arg, |
15 | bit 2=1 User-Priority arg, bit 3=1 encap*/ | 17 | bit 2=1 User-Priority arg, bit 3=1 encap*/ |
16 | uint8_t invflags; /* Inverse bitmask bit 1=1 - inversed ID arg, | 18 | __u8 invflags; /* Inverse bitmask bit 1=1 - inversed ID arg, |
17 | bit 2=1 - inversed Pirority arg */ | 19 | bit 2=1 - inversed Pirority arg */ |
18 | }; | 20 | }; |
19 | 21 | ||
diff --git a/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h b/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h index e5a3687c8a72..c6a204c97047 100644 --- a/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h +++ b/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _IPT_CLUSTERIP_H_target | 1 | #ifndef _IPT_CLUSTERIP_H_target |
2 | #define _IPT_CLUSTERIP_H_target | 2 | #define _IPT_CLUSTERIP_H_target |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | enum clusterip_hashmode { | 6 | enum clusterip_hashmode { |
5 | CLUSTERIP_HASHMODE_SIP = 0, | 7 | CLUSTERIP_HASHMODE_SIP = 0, |
6 | CLUSTERIP_HASHMODE_SIP_SPT, | 8 | CLUSTERIP_HASHMODE_SIP_SPT, |
@@ -17,15 +19,15 @@ struct clusterip_config; | |||
17 | 19 | ||
18 | struct ipt_clusterip_tgt_info { | 20 | struct ipt_clusterip_tgt_info { |
19 | 21 | ||
20 | u_int32_t flags; | 22 | __u32 flags; |
21 | 23 | ||
22 | /* only relevant for new ones */ | 24 | /* only relevant for new ones */ |
23 | u_int8_t clustermac[6]; | 25 | __u8 clustermac[6]; |
24 | u_int16_t num_total_nodes; | 26 | __u16 num_total_nodes; |
25 | u_int16_t num_local_nodes; | 27 | __u16 num_local_nodes; |
26 | u_int16_t local_nodes[CLUSTERIP_MAX_NODES]; | 28 | __u16 local_nodes[CLUSTERIP_MAX_NODES]; |
27 | u_int32_t hash_mode; | 29 | __u32 hash_mode; |
28 | u_int32_t hash_initval; | 30 | __u32 hash_initval; |
29 | 31 | ||
30 | /* Used internally by the kernel */ | 32 | /* Used internally by the kernel */ |
31 | struct clusterip_config *config; | 33 | struct clusterip_config *config; |
diff --git a/include/linux/netfilter_ipv4/ipt_ECN.h b/include/linux/netfilter_ipv4/ipt_ECN.h index 7ca45918ab8e..bb88d5315a4d 100644 --- a/include/linux/netfilter_ipv4/ipt_ECN.h +++ b/include/linux/netfilter_ipv4/ipt_ECN.h | |||
@@ -8,6 +8,8 @@ | |||
8 | */ | 8 | */ |
9 | #ifndef _IPT_ECN_TARGET_H | 9 | #ifndef _IPT_ECN_TARGET_H |
10 | #define _IPT_ECN_TARGET_H | 10 | #define _IPT_ECN_TARGET_H |
11 | |||
12 | #include <linux/types.h> | ||
11 | #include <linux/netfilter/xt_DSCP.h> | 13 | #include <linux/netfilter/xt_DSCP.h> |
12 | 14 | ||
13 | #define IPT_ECN_IP_MASK (~XT_DSCP_MASK) | 15 | #define IPT_ECN_IP_MASK (~XT_DSCP_MASK) |
@@ -19,11 +21,11 @@ | |||
19 | #define IPT_ECN_OP_MASK 0xce | 21 | #define IPT_ECN_OP_MASK 0xce |
20 | 22 | ||
21 | struct ipt_ECN_info { | 23 | struct ipt_ECN_info { |
22 | u_int8_t operation; /* bitset of operations */ | 24 | __u8 operation; /* bitset of operations */ |
23 | u_int8_t ip_ect; /* ECT codepoint of IPv4 header, pre-shifted */ | 25 | __u8 ip_ect; /* ECT codepoint of IPv4 header, pre-shifted */ |
24 | union { | 26 | union { |
25 | struct { | 27 | struct { |
26 | u_int8_t ece:1, cwr:1; /* TCP ECT bits */ | 28 | __u8 ece:1, cwr:1; /* TCP ECT bits */ |
27 | } tcp; | 29 | } tcp; |
28 | } proto; | 30 | } proto; |
29 | }; | 31 | }; |
diff --git a/include/linux/netfilter_ipv4/ipt_SAME.h b/include/linux/netfilter_ipv4/ipt_SAME.h index 2529660c5b38..5bca78267afd 100644 --- a/include/linux/netfilter_ipv4/ipt_SAME.h +++ b/include/linux/netfilter_ipv4/ipt_SAME.h | |||
@@ -1,15 +1,17 @@ | |||
1 | #ifndef _IPT_SAME_H | 1 | #ifndef _IPT_SAME_H |
2 | #define _IPT_SAME_H | 2 | #define _IPT_SAME_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define IPT_SAME_MAX_RANGE 10 | 6 | #define IPT_SAME_MAX_RANGE 10 |
5 | 7 | ||
6 | #define IPT_SAME_NODST 0x01 | 8 | #define IPT_SAME_NODST 0x01 |
7 | 9 | ||
8 | struct ipt_same_info { | 10 | struct ipt_same_info { |
9 | unsigned char info; | 11 | unsigned char info; |
10 | u_int32_t rangesize; | 12 | __u32 rangesize; |
11 | u_int32_t ipnum; | 13 | __u32 ipnum; |
12 | u_int32_t *iparray; | 14 | __u32 *iparray; |
13 | 15 | ||
14 | /* hangs off end. */ | 16 | /* hangs off end. */ |
15 | struct nf_nat_range range[IPT_SAME_MAX_RANGE]; | 17 | struct nf_nat_range range[IPT_SAME_MAX_RANGE]; |
diff --git a/include/linux/netfilter_ipv4/ipt_TTL.h b/include/linux/netfilter_ipv4/ipt_TTL.h index ee6611edc112..f6ac169d92f9 100644 --- a/include/linux/netfilter_ipv4/ipt_TTL.h +++ b/include/linux/netfilter_ipv4/ipt_TTL.h | |||
@@ -4,6 +4,8 @@ | |||
4 | #ifndef _IPT_TTL_H | 4 | #ifndef _IPT_TTL_H |
5 | #define _IPT_TTL_H | 5 | #define _IPT_TTL_H |
6 | 6 | ||
7 | #include <linux/types.h> | ||
8 | |||
7 | enum { | 9 | enum { |
8 | IPT_TTL_SET = 0, | 10 | IPT_TTL_SET = 0, |
9 | IPT_TTL_INC, | 11 | IPT_TTL_INC, |
@@ -13,8 +15,8 @@ enum { | |||
13 | #define IPT_TTL_MAXMODE IPT_TTL_DEC | 15 | #define IPT_TTL_MAXMODE IPT_TTL_DEC |
14 | 16 | ||
15 | struct ipt_TTL_info { | 17 | struct ipt_TTL_info { |
16 | u_int8_t mode; | 18 | __u8 mode; |
17 | u_int8_t ttl; | 19 | __u8 ttl; |
18 | }; | 20 | }; |
19 | 21 | ||
20 | 22 | ||
diff --git a/include/linux/netfilter_ipv4/ipt_addrtype.h b/include/linux/netfilter_ipv4/ipt_addrtype.h index 446de6aef983..0da42237c8da 100644 --- a/include/linux/netfilter_ipv4/ipt_addrtype.h +++ b/include/linux/netfilter_ipv4/ipt_addrtype.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _IPT_ADDRTYPE_H | 1 | #ifndef _IPT_ADDRTYPE_H |
2 | #define _IPT_ADDRTYPE_H | 2 | #define _IPT_ADDRTYPE_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | enum { | 6 | enum { |
5 | IPT_ADDRTYPE_INVERT_SOURCE = 0x0001, | 7 | IPT_ADDRTYPE_INVERT_SOURCE = 0x0001, |
6 | IPT_ADDRTYPE_INVERT_DEST = 0x0002, | 8 | IPT_ADDRTYPE_INVERT_DEST = 0x0002, |
@@ -9,17 +11,17 @@ enum { | |||
9 | }; | 11 | }; |
10 | 12 | ||
11 | struct ipt_addrtype_info_v1 { | 13 | struct ipt_addrtype_info_v1 { |
12 | u_int16_t source; /* source-type mask */ | 14 | __u16 source; /* source-type mask */ |
13 | u_int16_t dest; /* dest-type mask */ | 15 | __u16 dest; /* dest-type mask */ |
14 | u_int32_t flags; | 16 | __u32 flags; |
15 | }; | 17 | }; |
16 | 18 | ||
17 | /* revision 0 */ | 19 | /* revision 0 */ |
18 | struct ipt_addrtype_info { | 20 | struct ipt_addrtype_info { |
19 | u_int16_t source; /* source-type mask */ | 21 | __u16 source; /* source-type mask */ |
20 | u_int16_t dest; /* dest-type mask */ | 22 | __u16 dest; /* dest-type mask */ |
21 | u_int32_t invert_source; | 23 | __u32 invert_source; |
22 | u_int32_t invert_dest; | 24 | __u32 invert_dest; |
23 | }; | 25 | }; |
24 | 26 | ||
25 | #endif | 27 | #endif |
diff --git a/include/linux/netfilter_ipv4/ipt_ah.h b/include/linux/netfilter_ipv4/ipt_ah.h index 2e555b4d05e3..4e02bb0119e3 100644 --- a/include/linux/netfilter_ipv4/ipt_ah.h +++ b/include/linux/netfilter_ipv4/ipt_ah.h | |||
@@ -1,9 +1,11 @@ | |||
1 | #ifndef _IPT_AH_H | 1 | #ifndef _IPT_AH_H |
2 | #define _IPT_AH_H | 2 | #define _IPT_AH_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | struct ipt_ah { | 6 | struct ipt_ah { |
5 | u_int32_t spis[2]; /* Security Parameter Index */ | 7 | __u32 spis[2]; /* Security Parameter Index */ |
6 | u_int8_t invflags; /* Inverse flags */ | 8 | __u8 invflags; /* Inverse flags */ |
7 | }; | 9 | }; |
8 | 10 | ||
9 | 11 | ||
diff --git a/include/linux/netfilter_ipv4/ipt_ecn.h b/include/linux/netfilter_ipv4/ipt_ecn.h index 9945baa4ccd7..eabf95fb7d3e 100644 --- a/include/linux/netfilter_ipv4/ipt_ecn.h +++ b/include/linux/netfilter_ipv4/ipt_ecn.h | |||
@@ -8,6 +8,8 @@ | |||
8 | */ | 8 | */ |
9 | #ifndef _IPT_ECN_H | 9 | #ifndef _IPT_ECN_H |
10 | #define _IPT_ECN_H | 10 | #define _IPT_ECN_H |
11 | |||
12 | #include <linux/types.h> | ||
11 | #include <linux/netfilter/xt_dscp.h> | 13 | #include <linux/netfilter/xt_dscp.h> |
12 | 14 | ||
13 | #define IPT_ECN_IP_MASK (~XT_DSCP_MASK) | 15 | #define IPT_ECN_IP_MASK (~XT_DSCP_MASK) |
@@ -20,12 +22,12 @@ | |||
20 | 22 | ||
21 | /* match info */ | 23 | /* match info */ |
22 | struct ipt_ecn_info { | 24 | struct ipt_ecn_info { |
23 | u_int8_t operation; | 25 | __u8 operation; |
24 | u_int8_t invert; | 26 | __u8 invert; |
25 | u_int8_t ip_ect; | 27 | __u8 ip_ect; |
26 | union { | 28 | union { |
27 | struct { | 29 | struct { |
28 | u_int8_t ect; | 30 | __u8 ect; |
29 | } tcp; | 31 | } tcp; |
30 | } proto; | 32 | } proto; |
31 | }; | 33 | }; |
diff --git a/include/linux/netfilter_ipv4/ipt_ttl.h b/include/linux/netfilter_ipv4/ipt_ttl.h index ee24fd86a3aa..37bee4442486 100644 --- a/include/linux/netfilter_ipv4/ipt_ttl.h +++ b/include/linux/netfilter_ipv4/ipt_ttl.h | |||
@@ -4,6 +4,8 @@ | |||
4 | #ifndef _IPT_TTL_H | 4 | #ifndef _IPT_TTL_H |
5 | #define _IPT_TTL_H | 5 | #define _IPT_TTL_H |
6 | 6 | ||
7 | #include <linux/types.h> | ||
8 | |||
7 | enum { | 9 | enum { |
8 | IPT_TTL_EQ = 0, /* equals */ | 10 | IPT_TTL_EQ = 0, /* equals */ |
9 | IPT_TTL_NE, /* not equals */ | 11 | IPT_TTL_NE, /* not equals */ |
@@ -13,8 +15,8 @@ enum { | |||
13 | 15 | ||
14 | 16 | ||
15 | struct ipt_ttl_info { | 17 | struct ipt_ttl_info { |
16 | u_int8_t mode; | 18 | __u8 mode; |
17 | u_int8_t ttl; | 19 | __u8 ttl; |
18 | }; | 20 | }; |
19 | 21 | ||
20 | 22 | ||
diff --git a/include/linux/netfilter_ipv6/ip6t_HL.h b/include/linux/netfilter_ipv6/ip6t_HL.h index afb7813d45ab..ebd8ead1bb63 100644 --- a/include/linux/netfilter_ipv6/ip6t_HL.h +++ b/include/linux/netfilter_ipv6/ip6t_HL.h | |||
@@ -5,6 +5,8 @@ | |||
5 | #ifndef _IP6T_HL_H | 5 | #ifndef _IP6T_HL_H |
6 | #define _IP6T_HL_H | 6 | #define _IP6T_HL_H |
7 | 7 | ||
8 | #include <linux/types.h> | ||
9 | |||
8 | enum { | 10 | enum { |
9 | IP6T_HL_SET = 0, | 11 | IP6T_HL_SET = 0, |
10 | IP6T_HL_INC, | 12 | IP6T_HL_INC, |
@@ -14,8 +16,8 @@ enum { | |||
14 | #define IP6T_HL_MAXMODE IP6T_HL_DEC | 16 | #define IP6T_HL_MAXMODE IP6T_HL_DEC |
15 | 17 | ||
16 | struct ip6t_HL_info { | 18 | struct ip6t_HL_info { |
17 | u_int8_t mode; | 19 | __u8 mode; |
18 | u_int8_t hop_limit; | 20 | __u8 hop_limit; |
19 | }; | 21 | }; |
20 | 22 | ||
21 | 23 | ||
diff --git a/include/linux/netfilter_ipv6/ip6t_REJECT.h b/include/linux/netfilter_ipv6/ip6t_REJECT.h index 6be6504162bb..205ed62e4605 100644 --- a/include/linux/netfilter_ipv6/ip6t_REJECT.h +++ b/include/linux/netfilter_ipv6/ip6t_REJECT.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _IP6T_REJECT_H | 1 | #ifndef _IP6T_REJECT_H |
2 | #define _IP6T_REJECT_H | 2 | #define _IP6T_REJECT_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | enum ip6t_reject_with { | 6 | enum ip6t_reject_with { |
5 | IP6T_ICMP6_NO_ROUTE, | 7 | IP6T_ICMP6_NO_ROUTE, |
6 | IP6T_ICMP6_ADM_PROHIBITED, | 8 | IP6T_ICMP6_ADM_PROHIBITED, |
@@ -12,7 +14,7 @@ enum ip6t_reject_with { | |||
12 | }; | 14 | }; |
13 | 15 | ||
14 | struct ip6t_reject_info { | 16 | struct ip6t_reject_info { |
15 | u_int32_t with; /* reject type */ | 17 | __u32 with; /* reject type */ |
16 | }; | 18 | }; |
17 | 19 | ||
18 | #endif /*_IP6T_REJECT_H*/ | 20 | #endif /*_IP6T_REJECT_H*/ |
diff --git a/include/linux/netfilter_ipv6/ip6t_ah.h b/include/linux/netfilter_ipv6/ip6t_ah.h index 17a745cfb2c7..5da2b65cb3ad 100644 --- a/include/linux/netfilter_ipv6/ip6t_ah.h +++ b/include/linux/netfilter_ipv6/ip6t_ah.h | |||
@@ -1,11 +1,13 @@ | |||
1 | #ifndef _IP6T_AH_H | 1 | #ifndef _IP6T_AH_H |
2 | #define _IP6T_AH_H | 2 | #define _IP6T_AH_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | struct ip6t_ah { | 6 | struct ip6t_ah { |
5 | u_int32_t spis[2]; /* Security Parameter Index */ | 7 | __u32 spis[2]; /* Security Parameter Index */ |
6 | u_int32_t hdrlen; /* Header Length */ | 8 | __u32 hdrlen; /* Header Length */ |
7 | u_int8_t hdrres; /* Test of the Reserved Filed */ | 9 | __u8 hdrres; /* Test of the Reserved Filed */ |
8 | u_int8_t invflags; /* Inverse flags */ | 10 | __u8 invflags; /* Inverse flags */ |
9 | }; | 11 | }; |
10 | 12 | ||
11 | #define IP6T_AH_SPI 0x01 | 13 | #define IP6T_AH_SPI 0x01 |
diff --git a/include/linux/netfilter_ipv6/ip6t_frag.h b/include/linux/netfilter_ipv6/ip6t_frag.h index 3724d0850920..b47f61b9e082 100644 --- a/include/linux/netfilter_ipv6/ip6t_frag.h +++ b/include/linux/netfilter_ipv6/ip6t_frag.h | |||
@@ -1,11 +1,13 @@ | |||
1 | #ifndef _IP6T_FRAG_H | 1 | #ifndef _IP6T_FRAG_H |
2 | #define _IP6T_FRAG_H | 2 | #define _IP6T_FRAG_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | struct ip6t_frag { | 6 | struct ip6t_frag { |
5 | u_int32_t ids[2]; /* Security Parameter Index */ | 7 | __u32 ids[2]; /* Security Parameter Index */ |
6 | u_int32_t hdrlen; /* Header Length */ | 8 | __u32 hdrlen; /* Header Length */ |
7 | u_int8_t flags; /* */ | 9 | __u8 flags; /* */ |
8 | u_int8_t invflags; /* Inverse flags */ | 10 | __u8 invflags; /* Inverse flags */ |
9 | }; | 11 | }; |
10 | 12 | ||
11 | #define IP6T_FRAG_IDS 0x01 | 13 | #define IP6T_FRAG_IDS 0x01 |
diff --git a/include/linux/netfilter_ipv6/ip6t_hl.h b/include/linux/netfilter_ipv6/ip6t_hl.h index 5ef91b8319a8..6e76dbc6c19a 100644 --- a/include/linux/netfilter_ipv6/ip6t_hl.h +++ b/include/linux/netfilter_ipv6/ip6t_hl.h | |||
@@ -5,6 +5,8 @@ | |||
5 | #ifndef _IP6T_HL_H | 5 | #ifndef _IP6T_HL_H |
6 | #define _IP6T_HL_H | 6 | #define _IP6T_HL_H |
7 | 7 | ||
8 | #include <linux/types.h> | ||
9 | |||
8 | enum { | 10 | enum { |
9 | IP6T_HL_EQ = 0, /* equals */ | 11 | IP6T_HL_EQ = 0, /* equals */ |
10 | IP6T_HL_NE, /* not equals */ | 12 | IP6T_HL_NE, /* not equals */ |
@@ -14,8 +16,8 @@ enum { | |||
14 | 16 | ||
15 | 17 | ||
16 | struct ip6t_hl_info { | 18 | struct ip6t_hl_info { |
17 | u_int8_t mode; | 19 | __u8 mode; |
18 | u_int8_t hop_limit; | 20 | __u8 hop_limit; |
19 | }; | 21 | }; |
20 | 22 | ||
21 | 23 | ||
diff --git a/include/linux/netfilter_ipv6/ip6t_ipv6header.h b/include/linux/netfilter_ipv6/ip6t_ipv6header.h index 01dfd445596a..efae3a20c214 100644 --- a/include/linux/netfilter_ipv6/ip6t_ipv6header.h +++ b/include/linux/netfilter_ipv6/ip6t_ipv6header.h | |||
@@ -8,10 +8,12 @@ on whether they contain certain headers */ | |||
8 | #ifndef __IPV6HEADER_H | 8 | #ifndef __IPV6HEADER_H |
9 | #define __IPV6HEADER_H | 9 | #define __IPV6HEADER_H |
10 | 10 | ||
11 | #include <linux/types.h> | ||
12 | |||
11 | struct ip6t_ipv6header_info { | 13 | struct ip6t_ipv6header_info { |
12 | u_int8_t matchflags; | 14 | __u8 matchflags; |
13 | u_int8_t invflags; | 15 | __u8 invflags; |
14 | u_int8_t modeflag; | 16 | __u8 modeflag; |
15 | }; | 17 | }; |
16 | 18 | ||
17 | #define MASK_HOPOPTS 128 | 19 | #define MASK_HOPOPTS 128 |
diff --git a/include/linux/netfilter_ipv6/ip6t_mh.h b/include/linux/netfilter_ipv6/ip6t_mh.h index 18549bca2d1f..a7729a5025cd 100644 --- a/include/linux/netfilter_ipv6/ip6t_mh.h +++ b/include/linux/netfilter_ipv6/ip6t_mh.h | |||
@@ -1,10 +1,12 @@ | |||
1 | #ifndef _IP6T_MH_H | 1 | #ifndef _IP6T_MH_H |
2 | #define _IP6T_MH_H | 2 | #define _IP6T_MH_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | /* MH matching stuff */ | 6 | /* MH matching stuff */ |
5 | struct ip6t_mh { | 7 | struct ip6t_mh { |
6 | u_int8_t types[2]; /* MH type range */ | 8 | __u8 types[2]; /* MH type range */ |
7 | u_int8_t invflags; /* Inverse flags */ | 9 | __u8 invflags; /* Inverse flags */ |
8 | }; | 10 | }; |
9 | 11 | ||
10 | /* Values for "invflags" field in struct ip6t_mh. */ | 12 | /* Values for "invflags" field in struct ip6t_mh. */ |
diff --git a/include/linux/netfilter_ipv6/ip6t_opts.h b/include/linux/netfilter_ipv6/ip6t_opts.h index 62d89bcd9f9c..17d419a811fd 100644 --- a/include/linux/netfilter_ipv6/ip6t_opts.h +++ b/include/linux/netfilter_ipv6/ip6t_opts.h | |||
@@ -1,14 +1,16 @@ | |||
1 | #ifndef _IP6T_OPTS_H | 1 | #ifndef _IP6T_OPTS_H |
2 | #define _IP6T_OPTS_H | 2 | #define _IP6T_OPTS_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
4 | #define IP6T_OPTS_OPTSNR 16 | 6 | #define IP6T_OPTS_OPTSNR 16 |
5 | 7 | ||
6 | struct ip6t_opts { | 8 | struct ip6t_opts { |
7 | u_int32_t hdrlen; /* Header Length */ | 9 | __u32 hdrlen; /* Header Length */ |
8 | u_int8_t flags; /* */ | 10 | __u8 flags; /* */ |
9 | u_int8_t invflags; /* Inverse flags */ | 11 | __u8 invflags; /* Inverse flags */ |
10 | u_int16_t opts[IP6T_OPTS_OPTSNR]; /* opts */ | 12 | __u16 opts[IP6T_OPTS_OPTSNR]; /* opts */ |
11 | u_int8_t optsnr; /* Nr of OPts */ | 13 | __u8 optsnr; /* Nr of OPts */ |
12 | }; | 14 | }; |
13 | 15 | ||
14 | #define IP6T_OPTS_LEN 0x01 | 16 | #define IP6T_OPTS_LEN 0x01 |
diff --git a/include/linux/netfilter_ipv6/ip6t_rt.h b/include/linux/netfilter_ipv6/ip6t_rt.h index ab91bfd2cd00..7605a5ff81cd 100644 --- a/include/linux/netfilter_ipv6/ip6t_rt.h +++ b/include/linux/netfilter_ipv6/ip6t_rt.h | |||
@@ -1,18 +1,19 @@ | |||
1 | #ifndef _IP6T_RT_H | 1 | #ifndef _IP6T_RT_H |
2 | #define _IP6T_RT_H | 2 | #define _IP6T_RT_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
4 | /*#include <linux/in6.h>*/ | 5 | /*#include <linux/in6.h>*/ |
5 | 6 | ||
6 | #define IP6T_RT_HOPS 16 | 7 | #define IP6T_RT_HOPS 16 |
7 | 8 | ||
8 | struct ip6t_rt { | 9 | struct ip6t_rt { |
9 | u_int32_t rt_type; /* Routing Type */ | 10 | __u32 rt_type; /* Routing Type */ |
10 | u_int32_t segsleft[2]; /* Segments Left */ | 11 | __u32 segsleft[2]; /* Segments Left */ |
11 | u_int32_t hdrlen; /* Header Length */ | 12 | __u32 hdrlen; /* Header Length */ |
12 | u_int8_t flags; /* */ | 13 | __u8 flags; /* */ |
13 | u_int8_t invflags; /* Inverse flags */ | 14 | __u8 invflags; /* Inverse flags */ |
14 | struct in6_addr addrs[IP6T_RT_HOPS]; /* Hops */ | 15 | struct in6_addr addrs[IP6T_RT_HOPS]; /* Hops */ |
15 | u_int8_t addrnr; /* Nr of Addresses */ | 16 | __u8 addrnr; /* Nr of Addresses */ |
16 | }; | 17 | }; |
17 | 18 | ||
18 | #define IP6T_RT_TYP 0x01 | 19 | #define IP6T_RT_TYP 0x01 |
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index e2b9e63afa68..4c4ac3f3ce5a 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
@@ -160,10 +160,6 @@ struct netlink_skb_parms { | |||
160 | struct ucred creds; /* Skb credentials */ | 160 | struct ucred creds; /* Skb credentials */ |
161 | __u32 pid; | 161 | __u32 pid; |
162 | __u32 dst_group; | 162 | __u32 dst_group; |
163 | kernel_cap_t eff_cap; | ||
164 | __u32 loginuid; /* Login (audit) uid */ | ||
165 | __u32 sessionid; /* Session id (audit) */ | ||
166 | __u32 sid; /* SELinux security id */ | ||
167 | }; | 163 | }; |
168 | 164 | ||
169 | #define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) | 165 | #define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 6023efa9f5d9..f88522b10a38 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -501,7 +501,7 @@ extern int nfs_writepage(struct page *page, struct writeback_control *wbc); | |||
501 | extern int nfs_writepages(struct address_space *, struct writeback_control *); | 501 | extern int nfs_writepages(struct address_space *, struct writeback_control *); |
502 | extern int nfs_flush_incompatible(struct file *file, struct page *page); | 502 | extern int nfs_flush_incompatible(struct file *file, struct page *page); |
503 | extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); | 503 | extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); |
504 | extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); | 504 | extern void nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); |
505 | 505 | ||
506 | /* | 506 | /* |
507 | * Try to write back everything synchronously (but check the | 507 | * Try to write back everything synchronously (but check the |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 3e112de12d8d..216cea5db0aa 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -30,6 +30,8 @@ struct nfs_client { | |||
30 | #define NFS_CS_CALLBACK 1 /* - callback started */ | 30 | #define NFS_CS_CALLBACK 1 /* - callback started */ |
31 | #define NFS_CS_IDMAP 2 /* - idmap started */ | 31 | #define NFS_CS_IDMAP 2 /* - idmap started */ |
32 | #define NFS_CS_RENEWD 3 /* - renewd started */ | 32 | #define NFS_CS_RENEWD 3 /* - renewd started */ |
33 | #define NFS_CS_STOP_RENEW 4 /* no more state to renew */ | ||
34 | #define NFS_CS_CHECK_LEASE_TIME 5 /* need to check lease time */ | ||
33 | struct sockaddr_storage cl_addr; /* server identifier */ | 35 | struct sockaddr_storage cl_addr; /* server identifier */ |
34 | size_t cl_addrlen; | 36 | size_t cl_addrlen; |
35 | char * cl_hostname; /* hostname of server */ | 37 | char * cl_hostname; /* hostname of server */ |
@@ -75,7 +77,6 @@ struct nfs_client { | |||
75 | u32 cl_exchange_flags; | 77 | u32 cl_exchange_flags; |
76 | struct nfs4_session *cl_session; /* sharred session */ | 78 | struct nfs4_session *cl_session; /* sharred session */ |
77 | struct list_head cl_layouts; | 79 | struct list_head cl_layouts; |
78 | struct pnfs_deviceid_cache *cl_devid_cache; /* pNFS deviceid cache */ | ||
79 | #endif /* CONFIG_NFS_V4 */ | 80 | #endif /* CONFIG_NFS_V4 */ |
80 | 81 | ||
81 | #ifdef CONFIG_NFS_FSCACHE | 82 | #ifdef CONFIG_NFS_FSCACHE |
@@ -176,6 +177,7 @@ struct nfs_server { | |||
176 | #define NFS_CAP_CTIME (1U << 12) | 177 | #define NFS_CAP_CTIME (1U << 12) |
177 | #define NFS_CAP_MTIME (1U << 13) | 178 | #define NFS_CAP_MTIME (1U << 13) |
178 | #define NFS_CAP_POSIX_LOCK (1U << 14) | 179 | #define NFS_CAP_POSIX_LOCK (1U << 14) |
180 | #define NFS_CAP_UIDGID_NOMAP (1U << 15) | ||
179 | 181 | ||
180 | 182 | ||
181 | /* maximum number of slots to use */ | 183 | /* maximum number of slots to use */ |
diff --git a/include/linux/nfs_idmap.h b/include/linux/nfs_idmap.h index e8352dc5afb5..ae7d6a380dae 100644 --- a/include/linux/nfs_idmap.h +++ b/include/linux/nfs_idmap.h | |||
@@ -65,6 +65,7 @@ struct idmap_msg { | |||
65 | 65 | ||
66 | /* Forward declaration to make this header independent of others */ | 66 | /* Forward declaration to make this header independent of others */ |
67 | struct nfs_client; | 67 | struct nfs_client; |
68 | struct nfs_server; | ||
68 | 69 | ||
69 | #ifdef CONFIG_NFS_USE_NEW_IDMAPPER | 70 | #ifdef CONFIG_NFS_USE_NEW_IDMAPPER |
70 | 71 | ||
@@ -96,10 +97,10 @@ void nfs_idmap_delete(struct nfs_client *); | |||
96 | 97 | ||
97 | #endif /* CONFIG_NFS_USE_NEW_IDMAPPER */ | 98 | #endif /* CONFIG_NFS_USE_NEW_IDMAPPER */ |
98 | 99 | ||
99 | int nfs_map_name_to_uid(struct nfs_client *, const char *, size_t, __u32 *); | 100 | int nfs_map_name_to_uid(const struct nfs_server *, const char *, size_t, __u32 *); |
100 | int nfs_map_group_to_gid(struct nfs_client *, const char *, size_t, __u32 *); | 101 | int nfs_map_group_to_gid(const struct nfs_server *, const char *, size_t, __u32 *); |
101 | int nfs_map_uid_to_name(struct nfs_client *, __u32, char *, size_t); | 102 | int nfs_map_uid_to_name(const struct nfs_server *, __u32, char *, size_t); |
102 | int nfs_map_gid_to_group(struct nfs_client *, __u32, char *, size_t); | 103 | int nfs_map_gid_to_group(const struct nfs_server *, __u32, char *, size_t); |
103 | 104 | ||
104 | extern unsigned int nfs_idmap_cache_timeout; | 105 | extern unsigned int nfs_idmap_cache_timeout; |
105 | #endif /* __KERNEL__ */ | 106 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/nfs_iostat.h b/include/linux/nfs_iostat.h index 68b10f5f8907..8866bb3502ee 100644 --- a/include/linux/nfs_iostat.h +++ b/include/linux/nfs_iostat.h | |||
@@ -113,6 +113,8 @@ enum nfs_stat_eventcounters { | |||
113 | NFSIOS_SHORTREAD, | 113 | NFSIOS_SHORTREAD, |
114 | NFSIOS_SHORTWRITE, | 114 | NFSIOS_SHORTWRITE, |
115 | NFSIOS_DELAY, | 115 | NFSIOS_DELAY, |
116 | NFSIOS_PNFS_READ, | ||
117 | NFSIOS_PNFS_WRITE, | ||
116 | __NFSIOS_COUNTSMAX, | 118 | __NFSIOS_COUNTSMAX, |
117 | }; | 119 | }; |
118 | 120 | ||
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index d55cee73f634..90907ada6d52 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h | |||
@@ -59,9 +59,11 @@ struct nfs_pageio_descriptor { | |||
59 | unsigned int pg_base; | 59 | unsigned int pg_base; |
60 | 60 | ||
61 | struct inode *pg_inode; | 61 | struct inode *pg_inode; |
62 | int (*pg_doio)(struct inode *, struct list_head *, unsigned int, size_t, int); | 62 | int (*pg_doio)(struct nfs_pageio_descriptor *); |
63 | int pg_ioflags; | 63 | int pg_ioflags; |
64 | int pg_error; | 64 | int pg_error; |
65 | struct pnfs_layout_segment *pg_lseg; | ||
66 | int (*pg_test)(struct nfs_pageio_descriptor *, struct nfs_page *, struct nfs_page *); | ||
65 | }; | 67 | }; |
66 | 68 | ||
67 | #define NFS_WBACK_BUSY(req) (test_bit(PG_BUSY,&(req)->wb_flags)) | 69 | #define NFS_WBACK_BUSY(req) (test_bit(PG_BUSY,&(req)->wb_flags)) |
@@ -79,7 +81,7 @@ extern int nfs_scan_list(struct nfs_inode *nfsi, struct list_head *dst, | |||
79 | pgoff_t idx_start, unsigned int npages, int tag); | 81 | pgoff_t idx_start, unsigned int npages, int tag); |
80 | extern void nfs_pageio_init(struct nfs_pageio_descriptor *desc, | 82 | extern void nfs_pageio_init(struct nfs_pageio_descriptor *desc, |
81 | struct inode *inode, | 83 | struct inode *inode, |
82 | int (*doio)(struct inode *, struct list_head *, unsigned int, size_t, int), | 84 | int (*doio)(struct nfs_pageio_descriptor *desc), |
83 | size_t bsize, | 85 | size_t bsize, |
84 | int how); | 86 | int how); |
85 | extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *, | 87 | extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *, |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index b0068579bec2..2c2c67d2eb42 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -1016,9 +1016,12 @@ struct nfs_read_data { | |||
1016 | unsigned int npages; /* Max length of pagevec */ | 1016 | unsigned int npages; /* Max length of pagevec */ |
1017 | struct nfs_readargs args; | 1017 | struct nfs_readargs args; |
1018 | struct nfs_readres res; | 1018 | struct nfs_readres res; |
1019 | #ifdef CONFIG_NFS_V4 | ||
1020 | unsigned long timestamp; /* For lease renewal */ | 1019 | unsigned long timestamp; /* For lease renewal */ |
1021 | #endif | 1020 | struct pnfs_layout_segment *lseg; |
1021 | struct nfs_client *ds_clp; /* pNFS data server */ | ||
1022 | const struct rpc_call_ops *mds_ops; | ||
1023 | int (*read_done_cb) (struct rpc_task *task, struct nfs_read_data *data); | ||
1024 | __u64 mds_offset; | ||
1022 | struct page *page_array[NFS_PAGEVEC_SIZE]; | 1025 | struct page *page_array[NFS_PAGEVEC_SIZE]; |
1023 | }; | 1026 | }; |
1024 | 1027 | ||
@@ -1035,13 +1038,20 @@ struct nfs_write_data { | |||
1035 | unsigned int npages; /* Max length of pagevec */ | 1038 | unsigned int npages; /* Max length of pagevec */ |
1036 | struct nfs_writeargs args; /* argument struct */ | 1039 | struct nfs_writeargs args; /* argument struct */ |
1037 | struct nfs_writeres res; /* result struct */ | 1040 | struct nfs_writeres res; /* result struct */ |
1041 | struct pnfs_layout_segment *lseg; | ||
1042 | struct nfs_client *ds_clp; /* pNFS data server */ | ||
1043 | const struct rpc_call_ops *mds_ops; | ||
1044 | int (*write_done_cb) (struct rpc_task *task, struct nfs_write_data *data); | ||
1038 | #ifdef CONFIG_NFS_V4 | 1045 | #ifdef CONFIG_NFS_V4 |
1039 | unsigned long timestamp; /* For lease renewal */ | 1046 | unsigned long timestamp; /* For lease renewal */ |
1040 | #endif | 1047 | #endif |
1048 | __u64 mds_offset; /* Filelayout dense stripe */ | ||
1041 | struct page *page_array[NFS_PAGEVEC_SIZE]; | 1049 | struct page *page_array[NFS_PAGEVEC_SIZE]; |
1042 | }; | 1050 | }; |
1043 | 1051 | ||
1044 | struct nfs_access_entry; | 1052 | struct nfs_access_entry; |
1053 | struct nfs_client; | ||
1054 | struct rpc_timeout; | ||
1045 | 1055 | ||
1046 | /* | 1056 | /* |
1047 | * RPC procedure vector for NFSv2/NFSv3 demuxing | 1057 | * RPC procedure vector for NFSv2/NFSv3 demuxing |
@@ -1106,6 +1116,8 @@ struct nfs_rpc_ops { | |||
1106 | struct nfs_open_context *ctx, | 1116 | struct nfs_open_context *ctx, |
1107 | int open_flags, | 1117 | int open_flags, |
1108 | struct iattr *iattr); | 1118 | struct iattr *iattr); |
1119 | int (*init_client) (struct nfs_client *, const struct rpc_timeout *, | ||
1120 | const char *, rpc_authflavor_t, int); | ||
1109 | }; | 1121 | }; |
1110 | 1122 | ||
1111 | /* | 1123 | /* |
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h index 227e49dd5720..8768c469e93e 100644 --- a/include/linux/nilfs2_fs.h +++ b/include/linux/nilfs2_fs.h | |||
@@ -40,26 +40,7 @@ | |||
40 | 40 | ||
41 | #include <linux/types.h> | 41 | #include <linux/types.h> |
42 | #include <linux/ioctl.h> | 42 | #include <linux/ioctl.h> |
43 | 43 | #include <linux/magic.h> | |
44 | /* | ||
45 | * Inode flags stored in nilfs_inode and on-memory nilfs inode | ||
46 | * | ||
47 | * We define these flags based on ext2-fs because of the | ||
48 | * compatibility reason; to avoid problems in chattr(1) | ||
49 | */ | ||
50 | #define NILFS_SECRM_FL 0x00000001 /* Secure deletion */ | ||
51 | #define NILFS_UNRM_FL 0x00000002 /* Undelete */ | ||
52 | #define NILFS_SYNC_FL 0x00000008 /* Synchronous updates */ | ||
53 | #define NILFS_IMMUTABLE_FL 0x00000010 /* Immutable file */ | ||
54 | #define NILFS_APPEND_FL 0x00000020 /* writes to file may only append */ | ||
55 | #define NILFS_NODUMP_FL 0x00000040 /* do not dump file */ | ||
56 | #define NILFS_NOATIME_FL 0x00000080 /* do not update atime */ | ||
57 | /* Reserved for compression usage... */ | ||
58 | #define NILFS_NOTAIL_FL 0x00008000 /* file tail should not be merged */ | ||
59 | #define NILFS_DIRSYNC_FL 0x00010000 /* dirsync behaviour */ | ||
60 | |||
61 | #define NILFS_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ | ||
62 | #define NILFS_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ | ||
63 | 44 | ||
64 | 45 | ||
65 | #define NILFS_INODE_BMAP_SIZE 7 | 46 | #define NILFS_INODE_BMAP_SIZE 7 |
@@ -236,8 +217,10 @@ struct nilfs_super_block { | |||
236 | * If there is a bit set in the incompatible feature set that the kernel | 217 | * If there is a bit set in the incompatible feature set that the kernel |
237 | * doesn't know about, it should refuse to mount the filesystem. | 218 | * doesn't know about, it should refuse to mount the filesystem. |
238 | */ | 219 | */ |
220 | #define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 0x00000001ULL | ||
221 | |||
239 | #define NILFS_FEATURE_COMPAT_SUPP 0ULL | 222 | #define NILFS_FEATURE_COMPAT_SUPP 0ULL |
240 | #define NILFS_FEATURE_COMPAT_RO_SUPP 0ULL | 223 | #define NILFS_FEATURE_COMPAT_RO_SUPP NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT |
241 | #define NILFS_FEATURE_INCOMPAT_SUPP 0ULL | 224 | #define NILFS_FEATURE_INCOMPAT_SUPP 0ULL |
242 | 225 | ||
243 | /* | 226 | /* |
@@ -260,7 +243,6 @@ struct nilfs_super_block { | |||
260 | #define NILFS_USER_INO 11 /* Fisrt user's file inode number */ | 243 | #define NILFS_USER_INO 11 /* Fisrt user's file inode number */ |
261 | 244 | ||
262 | #define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */ | 245 | #define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */ |
263 | #define NILFS_SUPER_MAGIC 0x3434 /* NILFS filesystem magic number */ | ||
264 | 246 | ||
265 | #define NILFS_SEG_MIN_BLOCKS 16 /* Minimum number of blocks in | 247 | #define NILFS_SEG_MIN_BLOCKS 16 /* Minimum number of blocks in |
266 | a full segment */ | 248 | a full segment */ |
@@ -346,17 +328,21 @@ static inline unsigned nilfs_rec_len_from_disk(__le16 dlen) | |||
346 | { | 328 | { |
347 | unsigned len = le16_to_cpu(dlen); | 329 | unsigned len = le16_to_cpu(dlen); |
348 | 330 | ||
331 | #if !defined(__KERNEL__) || (PAGE_CACHE_SIZE >= 65536) | ||
349 | if (len == NILFS_MAX_REC_LEN) | 332 | if (len == NILFS_MAX_REC_LEN) |
350 | return 1 << 16; | 333 | return 1 << 16; |
334 | #endif | ||
351 | return len; | 335 | return len; |
352 | } | 336 | } |
353 | 337 | ||
354 | static inline __le16 nilfs_rec_len_to_disk(unsigned len) | 338 | static inline __le16 nilfs_rec_len_to_disk(unsigned len) |
355 | { | 339 | { |
340 | #if !defined(__KERNEL__) || (PAGE_CACHE_SIZE >= 65536) | ||
356 | if (len == (1 << 16)) | 341 | if (len == (1 << 16)) |
357 | return cpu_to_le16(NILFS_MAX_REC_LEN); | 342 | return cpu_to_le16(NILFS_MAX_REC_LEN); |
358 | else if (len > (1 << 16)) | 343 | else if (len > (1 << 16)) |
359 | BUG(); | 344 | BUG(); |
345 | #endif | ||
360 | return cpu_to_le16(len); | 346 | return cpu_to_le16(len); |
361 | } | 347 | } |
362 | 348 | ||
@@ -525,7 +511,7 @@ struct nilfs_checkpoint { | |||
525 | __le64 cp_create; | 511 | __le64 cp_create; |
526 | __le64 cp_nblk_inc; | 512 | __le64 cp_nblk_inc; |
527 | __le64 cp_inodes_count; | 513 | __le64 cp_inodes_count; |
528 | __le64 cp_blocks_count; /* Reserved (might be deleted) */ | 514 | __le64 cp_blocks_count; |
529 | 515 | ||
530 | /* Do not change the byte offset of ifile inode. | 516 | /* Do not change the byte offset of ifile inode. |
531 | To keep the compatibility of the disk format, | 517 | To keep the compatibility of the disk format, |
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 821ffb954f14..30022189104d 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h | |||
@@ -1243,6 +1243,8 @@ enum nl80211_rate_info { | |||
1243 | * @NL80211_STA_INFO_LLID: the station's mesh LLID | 1243 | * @NL80211_STA_INFO_LLID: the station's mesh LLID |
1244 | * @NL80211_STA_INFO_PLID: the station's mesh PLID | 1244 | * @NL80211_STA_INFO_PLID: the station's mesh PLID |
1245 | * @NL80211_STA_INFO_PLINK_STATE: peer link state for the station | 1245 | * @NL80211_STA_INFO_PLINK_STATE: peer link state for the station |
1246 | * @NL80211_STA_INFO_RX_BITRATE: last unicast data frame rx rate, nested | ||
1247 | * attribute, like NL80211_STA_INFO_TX_BITRATE. | ||
1246 | * @__NL80211_STA_INFO_AFTER_LAST: internal | 1248 | * @__NL80211_STA_INFO_AFTER_LAST: internal |
1247 | * @NL80211_STA_INFO_MAX: highest possible station info attribute | 1249 | * @NL80211_STA_INFO_MAX: highest possible station info attribute |
1248 | */ | 1250 | */ |
@@ -1261,6 +1263,7 @@ enum nl80211_sta_info { | |||
1261 | NL80211_STA_INFO_TX_RETRIES, | 1263 | NL80211_STA_INFO_TX_RETRIES, |
1262 | NL80211_STA_INFO_TX_FAILED, | 1264 | NL80211_STA_INFO_TX_FAILED, |
1263 | NL80211_STA_INFO_SIGNAL_AVG, | 1265 | NL80211_STA_INFO_SIGNAL_AVG, |
1266 | NL80211_STA_INFO_RX_BITRATE, | ||
1264 | 1267 | ||
1265 | /* keep last */ | 1268 | /* keep last */ |
1266 | __NL80211_STA_INFO_AFTER_LAST, | 1269 | __NL80211_STA_INFO_AFTER_LAST, |
diff --git a/include/linux/node.h b/include/linux/node.h index 1466945cc9ef..92370e22343c 100644 --- a/include/linux/node.h +++ b/include/linux/node.h | |||
@@ -39,7 +39,8 @@ extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); | |||
39 | extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); | 39 | extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); |
40 | extern int register_mem_sect_under_node(struct memory_block *mem_blk, | 40 | extern int register_mem_sect_under_node(struct memory_block *mem_blk, |
41 | int nid); | 41 | int nid); |
42 | extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk); | 42 | extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, |
43 | unsigned long phys_index); | ||
43 | 44 | ||
44 | #ifdef CONFIG_HUGETLBFS | 45 | #ifdef CONFIG_HUGETLBFS |
45 | extern void register_hugetlbfs_with_node(node_registration_func_t doregister, | 46 | extern void register_hugetlbfs_with_node(node_registration_func_t doregister, |
@@ -67,7 +68,8 @@ static inline int register_mem_sect_under_node(struct memory_block *mem_blk, | |||
67 | { | 68 | { |
68 | return 0; | 69 | return 0; |
69 | } | 70 | } |
70 | static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk) | 71 | static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, |
72 | unsigned long phys_index) | ||
71 | { | 73 | { |
72 | return 0; | 74 | return 0; |
73 | } | 75 | } |
diff --git a/include/linux/of.h b/include/linux/of.h index cad7cf0ab278..bfc0ed1b0ced 100644 --- a/include/linux/of.h +++ b/include/linux/of.h | |||
@@ -23,8 +23,6 @@ | |||
23 | 23 | ||
24 | #include <asm/byteorder.h> | 24 | #include <asm/byteorder.h> |
25 | 25 | ||
26 | #ifdef CONFIG_OF | ||
27 | |||
28 | typedef u32 phandle; | 26 | typedef u32 phandle; |
29 | typedef u32 ihandle; | 27 | typedef u32 ihandle; |
30 | 28 | ||
@@ -65,11 +63,18 @@ struct device_node { | |||
65 | #endif | 63 | #endif |
66 | }; | 64 | }; |
67 | 65 | ||
66 | #ifdef CONFIG_OF | ||
67 | |||
68 | /* Pointer for first entry in chain of all nodes. */ | 68 | /* Pointer for first entry in chain of all nodes. */ |
69 | extern struct device_node *allnodes; | 69 | extern struct device_node *allnodes; |
70 | extern struct device_node *of_chosen; | 70 | extern struct device_node *of_chosen; |
71 | extern rwlock_t devtree_lock; | 71 | extern rwlock_t devtree_lock; |
72 | 72 | ||
73 | static inline bool of_have_populated_dt(void) | ||
74 | { | ||
75 | return allnodes != NULL; | ||
76 | } | ||
77 | |||
73 | static inline bool of_node_is_root(const struct device_node *node) | 78 | static inline bool of_node_is_root(const struct device_node *node) |
74 | { | 79 | { |
75 | return node && (node->parent == NULL); | 80 | return node && (node->parent == NULL); |
@@ -103,7 +108,7 @@ extern void of_node_put(struct device_node *node); | |||
103 | #endif | 108 | #endif |
104 | 109 | ||
105 | /* | 110 | /* |
106 | * OF address retreival & translation | 111 | * OF address retrieval & translation |
107 | */ | 112 | */ |
108 | 113 | ||
109 | /* Helper to read a big number; size is in cells (not bytes) */ | 114 | /* Helper to read a big number; size is in cells (not bytes) */ |
@@ -222,5 +227,12 @@ extern void of_attach_node(struct device_node *); | |||
222 | extern void of_detach_node(struct device_node *); | 227 | extern void of_detach_node(struct device_node *); |
223 | #endif | 228 | #endif |
224 | 229 | ||
230 | #else | ||
231 | |||
232 | static inline bool of_have_populated_dt(void) | ||
233 | { | ||
234 | return false; | ||
235 | } | ||
236 | |||
225 | #endif /* CONFIG_OF */ | 237 | #endif /* CONFIG_OF */ |
226 | #endif /* _LINUX_OF_H */ | 238 | #endif /* _LINUX_OF_H */ |
diff --git a/include/linux/of_device.h b/include/linux/of_device.h index 975d347079d9..8bfe6c1d4365 100644 --- a/include/linux/of_device.h +++ b/include/linux/of_device.h | |||
@@ -18,10 +18,11 @@ extern void of_device_make_bus_id(struct device *dev); | |||
18 | * @drv: the device_driver structure to test | 18 | * @drv: the device_driver structure to test |
19 | * @dev: the device structure to match against | 19 | * @dev: the device structure to match against |
20 | */ | 20 | */ |
21 | static inline int of_driver_match_device(const struct device *dev, | 21 | static inline int of_driver_match_device(struct device *dev, |
22 | const struct device_driver *drv) | 22 | const struct device_driver *drv) |
23 | { | 23 | { |
24 | return of_match_device(drv->of_match_table, dev) != NULL; | 24 | dev->of_match = of_match_device(drv->of_match_table, dev); |
25 | return dev->of_match != NULL; | ||
25 | } | 26 | } |
26 | 27 | ||
27 | extern struct platform_device *of_dev_get(struct platform_device *dev); | 28 | extern struct platform_device *of_dev_get(struct platform_device *dev); |
diff --git a/include/linux/of_pci.h b/include/linux/of_pci.h new file mode 100644 index 000000000000..85a27b650d76 --- /dev/null +++ b/include/linux/of_pci.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef __OF_PCI_H | ||
2 | #define __OF_PCI_H | ||
3 | |||
4 | #include <linux/pci.h> | ||
5 | |||
6 | struct pci_dev; | ||
7 | struct of_irq; | ||
8 | int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq); | ||
9 | #endif | ||
diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h index a68716ad38ce..17c7e21c0bd7 100644 --- a/include/linux/of_platform.h +++ b/include/linux/of_platform.h | |||
@@ -23,13 +23,7 @@ | |||
23 | * of_platform_driver - Legacy of-aware driver for platform devices. | 23 | * of_platform_driver - Legacy of-aware driver for platform devices. |
24 | * | 24 | * |
25 | * An of_platform_driver driver is attached to a basic platform_device on | 25 | * An of_platform_driver driver is attached to a basic platform_device on |
26 | * ether the "platform bus" (platform_bus_type), or the ibm ebus | 26 | * the ibm ebus (ibmebus_bus_type). |
27 | * (ibmebus_bus_type). | ||
28 | * | ||
29 | * of_platform_driver is being phased out when used with the platform_bus_type, | ||
30 | * and regular platform_drivers should be used instead. When the transition | ||
31 | * is complete, only ibmebus will be using this structure, and the | ||
32 | * platform_driver member of this structure will be removed. | ||
33 | */ | 27 | */ |
34 | struct of_platform_driver | 28 | struct of_platform_driver |
35 | { | 29 | { |
@@ -42,26 +36,16 @@ struct of_platform_driver | |||
42 | int (*shutdown)(struct platform_device* dev); | 36 | int (*shutdown)(struct platform_device* dev); |
43 | 37 | ||
44 | struct device_driver driver; | 38 | struct device_driver driver; |
45 | struct platform_driver platform_driver; | ||
46 | }; | 39 | }; |
47 | #define to_of_platform_driver(drv) \ | 40 | #define to_of_platform_driver(drv) \ |
48 | container_of(drv,struct of_platform_driver, driver) | 41 | container_of(drv,struct of_platform_driver, driver) |
49 | 42 | ||
50 | extern int of_register_driver(struct of_platform_driver *drv, | ||
51 | struct bus_type *bus); | ||
52 | extern void of_unregister_driver(struct of_platform_driver *drv); | ||
53 | |||
54 | /* Platform drivers register/unregister */ | 43 | /* Platform drivers register/unregister */ |
55 | extern int of_register_platform_driver(struct of_platform_driver *drv); | ||
56 | extern void of_unregister_platform_driver(struct of_platform_driver *drv); | ||
57 | |||
58 | extern struct platform_device *of_device_alloc(struct device_node *np, | 44 | extern struct platform_device *of_device_alloc(struct device_node *np, |
59 | const char *bus_id, | 45 | const char *bus_id, |
60 | struct device *parent); | 46 | struct device *parent); |
61 | extern struct platform_device *of_find_device_by_node(struct device_node *np); | 47 | extern struct platform_device *of_find_device_by_node(struct device_node *np); |
62 | 48 | ||
63 | extern int of_bus_type_init(struct bus_type *bus, const char *name); | ||
64 | |||
65 | #if !defined(CONFIG_SPARC) /* SPARC has its own device registration method */ | 49 | #if !defined(CONFIG_SPARC) /* SPARC has its own device registration method */ |
66 | /* Platform devices and busses creation */ | 50 | /* Platform devices and busses creation */ |
67 | extern struct platform_device *of_platform_device_create(struct device_node *np, | 51 | extern struct platform_device *of_platform_device_create(struct device_node *np, |
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h index 1ca64113efe8..7f5cfd3b37dd 100644 --- a/include/linux/oprofile.h +++ b/include/linux/oprofile.h | |||
@@ -106,6 +106,13 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event); | |||
106 | void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | 106 | void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, |
107 | unsigned long event, int is_kernel); | 107 | unsigned long event, int is_kernel); |
108 | 108 | ||
109 | /** | ||
110 | * Add an hardware sample. | ||
111 | */ | ||
112 | void oprofile_add_ext_hw_sample(unsigned long pc, struct pt_regs * const regs, | ||
113 | unsigned long event, int is_kernel, | ||
114 | struct task_struct *task); | ||
115 | |||
109 | /* Use this instead when the PC value is not from the regs. Doesn't | 116 | /* Use this instead when the PC value is not from the regs. Doesn't |
110 | * backtrace. */ | 117 | * backtrace. */ |
111 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); | 118 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); |
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 0db8037e2725..811183de1ef5 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
@@ -196,7 +196,7 @@ static inline int __TestClearPage##uname(struct page *page) { return 0; } | |||
196 | 196 | ||
197 | struct page; /* forward declaration */ | 197 | struct page; /* forward declaration */ |
198 | 198 | ||
199 | TESTPAGEFLAG(Locked, locked) TESTSETFLAG(Locked, locked) | 199 | TESTPAGEFLAG(Locked, locked) |
200 | PAGEFLAG(Error, error) TESTCLEARFLAG(Error, error) | 200 | PAGEFLAG(Error, error) TESTCLEARFLAG(Error, error) |
201 | PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced) | 201 | PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced) |
202 | PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty) | 202 | PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty) |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 9c66e994540f..29ebba54c238 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
@@ -455,8 +455,9 @@ int add_to_page_cache_locked(struct page *page, struct address_space *mapping, | |||
455 | pgoff_t index, gfp_t gfp_mask); | 455 | pgoff_t index, gfp_t gfp_mask); |
456 | int add_to_page_cache_lru(struct page *page, struct address_space *mapping, | 456 | int add_to_page_cache_lru(struct page *page, struct address_space *mapping, |
457 | pgoff_t index, gfp_t gfp_mask); | 457 | pgoff_t index, gfp_t gfp_mask); |
458 | extern void remove_from_page_cache(struct page *page); | 458 | extern void delete_from_page_cache(struct page *page); |
459 | extern void __remove_from_page_cache(struct page *page); | 459 | extern void __delete_from_page_cache(struct page *page); |
460 | int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask); | ||
460 | 461 | ||
461 | /* | 462 | /* |
462 | * Like add_to_page_cache_locked, but used to add newly allocated pages: | 463 | * Like add_to_page_cache_locked, but used to add newly allocated pages: |
diff --git a/include/linux/pata_arasan_cf_data.h b/include/linux/pata_arasan_cf_data.h new file mode 100644 index 000000000000..a6ee9aa898bb --- /dev/null +++ b/include/linux/pata_arasan_cf_data.h | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * include/linux/pata_arasan_cf_data.h | ||
3 | * | ||
4 | * Arasan Compact Flash host controller platform data header file | ||
5 | * | ||
6 | * Copyright (C) 2011 ST Microelectronics | ||
7 | * Viresh Kumar <viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef _PATA_ARASAN_CF_DATA_H | ||
15 | #define _PATA_ARASAN_CF_DATA_H | ||
16 | |||
17 | #include <linux/platform_device.h> | ||
18 | |||
19 | struct arasan_cf_pdata { | ||
20 | u8 cf_if_clk; | ||
21 | #define CF_IF_CLK_100M (0x0) | ||
22 | #define CF_IF_CLK_75M (0x1) | ||
23 | #define CF_IF_CLK_66M (0x2) | ||
24 | #define CF_IF_CLK_50M (0x3) | ||
25 | #define CF_IF_CLK_40M (0x4) | ||
26 | #define CF_IF_CLK_33M (0x5) | ||
27 | #define CF_IF_CLK_25M (0x6) | ||
28 | #define CF_IF_CLK_125M (0x7) | ||
29 | #define CF_IF_CLK_150M (0x8) | ||
30 | #define CF_IF_CLK_166M (0x9) | ||
31 | #define CF_IF_CLK_200M (0xA) | ||
32 | /* | ||
33 | * Platform specific incapabilities of CF controller is handled via | ||
34 | * quirks | ||
35 | */ | ||
36 | u32 quirk; | ||
37 | #define CF_BROKEN_PIO (1) | ||
38 | #define CF_BROKEN_MWDMA (1 << 1) | ||
39 | #define CF_BROKEN_UDMA (1 << 2) | ||
40 | /* This is platform specific data for the DMA controller */ | ||
41 | void *dma_priv; | ||
42 | }; | ||
43 | |||
44 | static inline void | ||
45 | set_arasan_cf_pdata(struct platform_device *pdev, struct arasan_cf_pdata *data) | ||
46 | { | ||
47 | pdev->dev.platform_data = data; | ||
48 | } | ||
49 | #endif /* _PATA_ARASAN_CF_DATA_H */ | ||
diff --git a/include/linux/pci.h b/include/linux/pci.h index 559d02897075..16c9f2e61977 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -1191,6 +1191,11 @@ static inline int pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
1191 | return 0; | 1191 | return 0; |
1192 | } | 1192 | } |
1193 | 1193 | ||
1194 | static inline int pci_wake_from_d3(struct pci_dev *dev, bool enable) | ||
1195 | { | ||
1196 | return 0; | ||
1197 | } | ||
1198 | |||
1194 | static inline pci_power_t pci_choose_state(struct pci_dev *dev, | 1199 | static inline pci_power_t pci_choose_state(struct pci_dev *dev, |
1195 | pm_message_t state) | 1200 | pm_message_t state) |
1196 | { | 1201 | { |
@@ -1479,6 +1484,7 @@ void pci_request_acs(void); | |||
1479 | #define PCI_VPD_RO_KEYWORD_PARTNO "PN" | 1484 | #define PCI_VPD_RO_KEYWORD_PARTNO "PN" |
1480 | #define PCI_VPD_RO_KEYWORD_MFR_ID "MN" | 1485 | #define PCI_VPD_RO_KEYWORD_MFR_ID "MN" |
1481 | #define PCI_VPD_RO_KEYWORD_VENDOR0 "V0" | 1486 | #define PCI_VPD_RO_KEYWORD_VENDOR0 "V0" |
1487 | #define PCI_VPD_RO_KEYWORD_CHKSUM "RV" | ||
1482 | 1488 | ||
1483 | /** | 1489 | /** |
1484 | * pci_vpd_lrdt_size - Extracts the Large Resource Data Type length | 1490 | * pci_vpd_lrdt_size - Extracts the Large Resource Data Type length |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 3adb06ebf841..bda221dfaf0a 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -517,7 +517,8 @@ | |||
517 | #define PCI_DEVICE_ID_AMD_11H_NB_DRAM 0x1302 | 517 | #define PCI_DEVICE_ID_AMD_11H_NB_DRAM 0x1302 |
518 | #define PCI_DEVICE_ID_AMD_11H_NB_MISC 0x1303 | 518 | #define PCI_DEVICE_ID_AMD_11H_NB_MISC 0x1303 |
519 | #define PCI_DEVICE_ID_AMD_11H_NB_LINK 0x1304 | 519 | #define PCI_DEVICE_ID_AMD_11H_NB_LINK 0x1304 |
520 | #define PCI_DEVICE_ID_AMD_15H_NB_MISC 0x1603 | 520 | #define PCI_DEVICE_ID_AMD_15H_NB_F3 0x1603 |
521 | #define PCI_DEVICE_ID_AMD_15H_NB_LINK 0x1604 | ||
521 | #define PCI_DEVICE_ID_AMD_CNB17H_F3 0x1703 | 522 | #define PCI_DEVICE_ID_AMD_CNB17H_F3 0x1703 |
522 | #define PCI_DEVICE_ID_AMD_LANCE 0x2000 | 523 | #define PCI_DEVICE_ID_AMD_LANCE 0x2000 |
523 | #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 | 524 | #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 |
@@ -2078,6 +2079,8 @@ | |||
2078 | #define PCI_DEVICE_ID_TIGON3_5723 0x165b | 2079 | #define PCI_DEVICE_ID_TIGON3_5723 0x165b |
2079 | #define PCI_DEVICE_ID_TIGON3_5705M 0x165d | 2080 | #define PCI_DEVICE_ID_TIGON3_5705M 0x165d |
2080 | #define PCI_DEVICE_ID_TIGON3_5705M_2 0x165e | 2081 | #define PCI_DEVICE_ID_TIGON3_5705M_2 0x165e |
2082 | #define PCI_DEVICE_ID_NX2_57712 0x1662 | ||
2083 | #define PCI_DEVICE_ID_NX2_57712E 0x1663 | ||
2081 | #define PCI_DEVICE_ID_TIGON3_5714 0x1668 | 2084 | #define PCI_DEVICE_ID_TIGON3_5714 0x1668 |
2082 | #define PCI_DEVICE_ID_TIGON3_5714S 0x1669 | 2085 | #define PCI_DEVICE_ID_TIGON3_5714S 0x1669 |
2083 | #define PCI_DEVICE_ID_TIGON3_5780 0x166a | 2086 | #define PCI_DEVICE_ID_TIGON3_5780 0x166a |
@@ -2480,6 +2483,9 @@ | |||
2480 | #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 | 2483 | #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 |
2481 | #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_0 0x1d40 | 2484 | #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_0 0x1d40 |
2482 | #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_1 0x1d41 | 2485 | #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_1 0x1d41 |
2486 | #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MIN 0x2310 | ||
2487 | #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MAX 0x231f | ||
2488 | #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 | ||
2483 | #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 | 2489 | #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 |
2484 | #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 | 2490 | #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 |
2485 | #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 | 2491 | #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 27c3c6fcfad3..3a5c4449fd36 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
@@ -255,6 +255,30 @@ extern void __bad_size_call_parameter(void); | |||
255 | pscr2_ret__; \ | 255 | pscr2_ret__; \ |
256 | }) | 256 | }) |
257 | 257 | ||
258 | /* | ||
259 | * Special handling for cmpxchg_double. cmpxchg_double is passed two | ||
260 | * percpu variables. The first has to be aligned to a double word | ||
261 | * boundary and the second has to follow directly thereafter. | ||
262 | */ | ||
263 | #define __pcpu_double_call_return_bool(stem, pcp1, pcp2, ...) \ | ||
264 | ({ \ | ||
265 | bool pdcrb_ret__; \ | ||
266 | __verify_pcpu_ptr(&pcp1); \ | ||
267 | BUILD_BUG_ON(sizeof(pcp1) != sizeof(pcp2)); \ | ||
268 | VM_BUG_ON((unsigned long)(&pcp1) % (2 * sizeof(pcp1))); \ | ||
269 | VM_BUG_ON((unsigned long)(&pcp2) != \ | ||
270 | (unsigned long)(&pcp1) + sizeof(pcp1)); \ | ||
271 | switch(sizeof(pcp1)) { \ | ||
272 | case 1: pdcrb_ret__ = stem##1(pcp1, pcp2, __VA_ARGS__); break; \ | ||
273 | case 2: pdcrb_ret__ = stem##2(pcp1, pcp2, __VA_ARGS__); break; \ | ||
274 | case 4: pdcrb_ret__ = stem##4(pcp1, pcp2, __VA_ARGS__); break; \ | ||
275 | case 8: pdcrb_ret__ = stem##8(pcp1, pcp2, __VA_ARGS__); break; \ | ||
276 | default: \ | ||
277 | __bad_size_call_parameter(); break; \ | ||
278 | } \ | ||
279 | pdcrb_ret__; \ | ||
280 | }) | ||
281 | |||
258 | #define __pcpu_size_call(stem, variable, ...) \ | 282 | #define __pcpu_size_call(stem, variable, ...) \ |
259 | do { \ | 283 | do { \ |
260 | __verify_pcpu_ptr(&(variable)); \ | 284 | __verify_pcpu_ptr(&(variable)); \ |
@@ -501,6 +525,45 @@ do { \ | |||
501 | #endif | 525 | #endif |
502 | 526 | ||
503 | /* | 527 | /* |
528 | * cmpxchg_double replaces two adjacent scalars at once. The first | ||
529 | * two parameters are per cpu variables which have to be of the same | ||
530 | * size. A truth value is returned to indicate success or failure | ||
531 | * (since a double register result is difficult to handle). There is | ||
532 | * very limited hardware support for these operations, so only certain | ||
533 | * sizes may work. | ||
534 | */ | ||
535 | #define _this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
536 | ({ \ | ||
537 | int ret__; \ | ||
538 | preempt_disable(); \ | ||
539 | ret__ = __this_cpu_generic_cmpxchg_double(pcp1, pcp2, \ | ||
540 | oval1, oval2, nval1, nval2); \ | ||
541 | preempt_enable(); \ | ||
542 | ret__; \ | ||
543 | }) | ||
544 | |||
545 | #ifndef this_cpu_cmpxchg_double | ||
546 | # ifndef this_cpu_cmpxchg_double_1 | ||
547 | # define this_cpu_cmpxchg_double_1(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
548 | _this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
549 | # endif | ||
550 | # ifndef this_cpu_cmpxchg_double_2 | ||
551 | # define this_cpu_cmpxchg_double_2(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
552 | _this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
553 | # endif | ||
554 | # ifndef this_cpu_cmpxchg_double_4 | ||
555 | # define this_cpu_cmpxchg_double_4(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
556 | _this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
557 | # endif | ||
558 | # ifndef this_cpu_cmpxchg_double_8 | ||
559 | # define this_cpu_cmpxchg_double_8(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
560 | _this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
561 | # endif | ||
562 | # define this_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
563 | __pcpu_double_call_return_bool(this_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2)) | ||
564 | #endif | ||
565 | |||
566 | /* | ||
504 | * Generic percpu operations that do not require preemption handling. | 567 | * Generic percpu operations that do not require preemption handling. |
505 | * Either we do not care about races or the caller has the | 568 | * Either we do not care about races or the caller has the |
506 | * responsibility of handling preemptions issues. Arch code can still | 569 | * responsibility of handling preemptions issues. Arch code can still |
@@ -703,6 +766,39 @@ do { \ | |||
703 | __pcpu_size_call_return2(__this_cpu_cmpxchg_, pcp, oval, nval) | 766 | __pcpu_size_call_return2(__this_cpu_cmpxchg_, pcp, oval, nval) |
704 | #endif | 767 | #endif |
705 | 768 | ||
769 | #define __this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
770 | ({ \ | ||
771 | int __ret = 0; \ | ||
772 | if (__this_cpu_read(pcp1) == (oval1) && \ | ||
773 | __this_cpu_read(pcp2) == (oval2)) { \ | ||
774 | __this_cpu_write(pcp1, (nval1)); \ | ||
775 | __this_cpu_write(pcp2, (nval2)); \ | ||
776 | __ret = 1; \ | ||
777 | } \ | ||
778 | (__ret); \ | ||
779 | }) | ||
780 | |||
781 | #ifndef __this_cpu_cmpxchg_double | ||
782 | # ifndef __this_cpu_cmpxchg_double_1 | ||
783 | # define __this_cpu_cmpxchg_double_1(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
784 | __this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
785 | # endif | ||
786 | # ifndef __this_cpu_cmpxchg_double_2 | ||
787 | # define __this_cpu_cmpxchg_double_2(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
788 | __this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
789 | # endif | ||
790 | # ifndef __this_cpu_cmpxchg_double_4 | ||
791 | # define __this_cpu_cmpxchg_double_4(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
792 | __this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
793 | # endif | ||
794 | # ifndef __this_cpu_cmpxchg_double_8 | ||
795 | # define __this_cpu_cmpxchg_double_8(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
796 | __this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
797 | # endif | ||
798 | # define __this_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
799 | __pcpu_double_call_return_bool(__this_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2)) | ||
800 | #endif | ||
801 | |||
706 | /* | 802 | /* |
707 | * IRQ safe versions of the per cpu RMW operations. Note that these operations | 803 | * IRQ safe versions of the per cpu RMW operations. Note that these operations |
708 | * are *not* safe against modification of the same variable from another | 804 | * are *not* safe against modification of the same variable from another |
@@ -823,4 +919,36 @@ do { \ | |||
823 | __pcpu_size_call_return2(irqsafe_cpu_cmpxchg_, (pcp), oval, nval) | 919 | __pcpu_size_call_return2(irqsafe_cpu_cmpxchg_, (pcp), oval, nval) |
824 | #endif | 920 | #endif |
825 | 921 | ||
922 | #define irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
923 | ({ \ | ||
924 | int ret__; \ | ||
925 | unsigned long flags; \ | ||
926 | local_irq_save(flags); \ | ||
927 | ret__ = __this_cpu_generic_cmpxchg_double(pcp1, pcp2, \ | ||
928 | oval1, oval2, nval1, nval2); \ | ||
929 | local_irq_restore(flags); \ | ||
930 | ret__; \ | ||
931 | }) | ||
932 | |||
933 | #ifndef irqsafe_cpu_cmpxchg_double | ||
934 | # ifndef irqsafe_cpu_cmpxchg_double_1 | ||
935 | # define irqsafe_cpu_cmpxchg_double_1(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
936 | irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
937 | # endif | ||
938 | # ifndef irqsafe_cpu_cmpxchg_double_2 | ||
939 | # define irqsafe_cpu_cmpxchg_double_2(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
940 | irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
941 | # endif | ||
942 | # ifndef irqsafe_cpu_cmpxchg_double_4 | ||
943 | # define irqsafe_cpu_cmpxchg_double_4(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
944 | irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
945 | # endif | ||
946 | # ifndef irqsafe_cpu_cmpxchg_double_8 | ||
947 | # define irqsafe_cpu_cmpxchg_double_8(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
948 | irqsafe_generic_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) | ||
949 | # endif | ||
950 | # define irqsafe_cpu_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \ | ||
951 | __pcpu_double_call_return_int(irqsafe_cpu_cmpxchg_double_, (pcp1), (pcp2), (oval1), (oval2), (nval1), (nval2)) | ||
952 | #endif | ||
953 | |||
826 | #endif /* __LINUX_PERCPU_H */ | 954 | #endif /* __LINUX_PERCPU_H */ |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index dda5b0a3ff60..f495c0147240 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -225,8 +225,14 @@ struct perf_event_attr { | |||
225 | }; | 225 | }; |
226 | 226 | ||
227 | __u32 bp_type; | 227 | __u32 bp_type; |
228 | __u64 bp_addr; | 228 | union { |
229 | __u64 bp_len; | 229 | __u64 bp_addr; |
230 | __u64 config1; /* extension of config */ | ||
231 | }; | ||
232 | union { | ||
233 | __u64 bp_len; | ||
234 | __u64 config2; /* extension of config1 */ | ||
235 | }; | ||
230 | }; | 236 | }; |
231 | 237 | ||
232 | /* | 238 | /* |
@@ -464,6 +470,7 @@ enum perf_callchain_context { | |||
464 | 470 | ||
465 | #define PERF_FLAG_FD_NO_GROUP (1U << 0) | 471 | #define PERF_FLAG_FD_NO_GROUP (1U << 0) |
466 | #define PERF_FLAG_FD_OUTPUT (1U << 1) | 472 | #define PERF_FLAG_FD_OUTPUT (1U << 1) |
473 | #define PERF_FLAG_PID_CGROUP (1U << 2) /* pid=cgroup id, per-cpu mode only */ | ||
467 | 474 | ||
468 | #ifdef __KERNEL__ | 475 | #ifdef __KERNEL__ |
469 | /* | 476 | /* |
@@ -471,6 +478,7 @@ enum perf_callchain_context { | |||
471 | */ | 478 | */ |
472 | 479 | ||
473 | #ifdef CONFIG_PERF_EVENTS | 480 | #ifdef CONFIG_PERF_EVENTS |
481 | # include <linux/cgroup.h> | ||
474 | # include <asm/perf_event.h> | 482 | # include <asm/perf_event.h> |
475 | # include <asm/local64.h> | 483 | # include <asm/local64.h> |
476 | #endif | 484 | #endif |
@@ -539,6 +547,9 @@ struct hw_perf_event { | |||
539 | unsigned long event_base; | 547 | unsigned long event_base; |
540 | int idx; | 548 | int idx; |
541 | int last_cpu; | 549 | int last_cpu; |
550 | unsigned int extra_reg; | ||
551 | u64 extra_config; | ||
552 | int extra_alloc; | ||
542 | }; | 553 | }; |
543 | struct { /* software */ | 554 | struct { /* software */ |
544 | struct hrtimer hrtimer; | 555 | struct hrtimer hrtimer; |
@@ -716,6 +727,22 @@ struct swevent_hlist { | |||
716 | #define PERF_ATTACH_GROUP 0x02 | 727 | #define PERF_ATTACH_GROUP 0x02 |
717 | #define PERF_ATTACH_TASK 0x04 | 728 | #define PERF_ATTACH_TASK 0x04 |
718 | 729 | ||
730 | #ifdef CONFIG_CGROUP_PERF | ||
731 | /* | ||
732 | * perf_cgroup_info keeps track of time_enabled for a cgroup. | ||
733 | * This is a per-cpu dynamically allocated data structure. | ||
734 | */ | ||
735 | struct perf_cgroup_info { | ||
736 | u64 time; | ||
737 | u64 timestamp; | ||
738 | }; | ||
739 | |||
740 | struct perf_cgroup { | ||
741 | struct cgroup_subsys_state css; | ||
742 | struct perf_cgroup_info *info; /* timing info, one per cpu */ | ||
743 | }; | ||
744 | #endif | ||
745 | |||
719 | /** | 746 | /** |
720 | * struct perf_event - performance event kernel representation: | 747 | * struct perf_event - performance event kernel representation: |
721 | */ | 748 | */ |
@@ -832,6 +859,11 @@ struct perf_event { | |||
832 | struct event_filter *filter; | 859 | struct event_filter *filter; |
833 | #endif | 860 | #endif |
834 | 861 | ||
862 | #ifdef CONFIG_CGROUP_PERF | ||
863 | struct perf_cgroup *cgrp; /* cgroup event is attach to */ | ||
864 | int cgrp_defer_enabled; | ||
865 | #endif | ||
866 | |||
835 | #endif /* CONFIG_PERF_EVENTS */ | 867 | #endif /* CONFIG_PERF_EVENTS */ |
836 | }; | 868 | }; |
837 | 869 | ||
@@ -846,8 +878,8 @@ enum perf_event_context_type { | |||
846 | * Used as a container for task events and CPU events as well: | 878 | * Used as a container for task events and CPU events as well: |
847 | */ | 879 | */ |
848 | struct perf_event_context { | 880 | struct perf_event_context { |
849 | enum perf_event_context_type type; | ||
850 | struct pmu *pmu; | 881 | struct pmu *pmu; |
882 | enum perf_event_context_type type; | ||
851 | /* | 883 | /* |
852 | * Protect the states of the events in the list, | 884 | * Protect the states of the events in the list, |
853 | * nr_active, and the list: | 885 | * nr_active, and the list: |
@@ -886,6 +918,7 @@ struct perf_event_context { | |||
886 | u64 generation; | 918 | u64 generation; |
887 | int pin_count; | 919 | int pin_count; |
888 | struct rcu_head rcu_head; | 920 | struct rcu_head rcu_head; |
921 | int nr_cgroups; /* cgroup events present */ | ||
889 | }; | 922 | }; |
890 | 923 | ||
891 | /* | 924 | /* |
@@ -905,6 +938,9 @@ struct perf_cpu_context { | |||
905 | struct list_head rotation_list; | 938 | struct list_head rotation_list; |
906 | int jiffies_interval; | 939 | int jiffies_interval; |
907 | struct pmu *active_pmu; | 940 | struct pmu *active_pmu; |
941 | #ifdef CONFIG_CGROUP_PERF | ||
942 | struct perf_cgroup *cgrp; | ||
943 | #endif | ||
908 | }; | 944 | }; |
909 | 945 | ||
910 | struct perf_output_handle { | 946 | struct perf_output_handle { |
@@ -1040,11 +1076,11 @@ have_event: | |||
1040 | __perf_sw_event(event_id, nr, nmi, regs, addr); | 1076 | __perf_sw_event(event_id, nr, nmi, regs, addr); |
1041 | } | 1077 | } |
1042 | 1078 | ||
1043 | extern atomic_t perf_task_events; | 1079 | extern atomic_t perf_sched_events; |
1044 | 1080 | ||
1045 | static inline void perf_event_task_sched_in(struct task_struct *task) | 1081 | static inline void perf_event_task_sched_in(struct task_struct *task) |
1046 | { | 1082 | { |
1047 | COND_STMT(&perf_task_events, __perf_event_task_sched_in(task)); | 1083 | COND_STMT(&perf_sched_events, __perf_event_task_sched_in(task)); |
1048 | } | 1084 | } |
1049 | 1085 | ||
1050 | static inline | 1086 | static inline |
@@ -1052,7 +1088,7 @@ void perf_event_task_sched_out(struct task_struct *task, struct task_struct *nex | |||
1052 | { | 1088 | { |
1053 | perf_sw_event(PERF_COUNT_SW_CONTEXT_SWITCHES, 1, 1, NULL, 0); | 1089 | perf_sw_event(PERF_COUNT_SW_CONTEXT_SWITCHES, 1, 1, NULL, 0); |
1054 | 1090 | ||
1055 | COND_STMT(&perf_task_events, __perf_event_task_sched_out(task, next)); | 1091 | COND_STMT(&perf_sched_events, __perf_event_task_sched_out(task, next)); |
1056 | } | 1092 | } |
1057 | 1093 | ||
1058 | extern void perf_event_mmap(struct vm_area_struct *vma); | 1094 | extern void perf_event_mmap(struct vm_area_struct *vma); |
@@ -1083,6 +1119,10 @@ extern int sysctl_perf_event_paranoid; | |||
1083 | extern int sysctl_perf_event_mlock; | 1119 | extern int sysctl_perf_event_mlock; |
1084 | extern int sysctl_perf_event_sample_rate; | 1120 | extern int sysctl_perf_event_sample_rate; |
1085 | 1121 | ||
1122 | extern int perf_proc_update_handler(struct ctl_table *table, int write, | ||
1123 | void __user *buffer, size_t *lenp, | ||
1124 | loff_t *ppos); | ||
1125 | |||
1086 | static inline bool perf_paranoid_tracepoint_raw(void) | 1126 | static inline bool perf_paranoid_tracepoint_raw(void) |
1087 | { | 1127 | { |
1088 | return sysctl_perf_event_paranoid > -1; | 1128 | return sysctl_perf_event_paranoid > -1; |
diff --git a/include/linux/phonet.h b/include/linux/phonet.h index 26c8df786918..6fb13841db45 100644 --- a/include/linux/phonet.h +++ b/include/linux/phonet.h | |||
@@ -36,9 +36,7 @@ | |||
36 | /* Socket options for SOL_PNPIPE level */ | 36 | /* Socket options for SOL_PNPIPE level */ |
37 | #define PNPIPE_ENCAP 1 | 37 | #define PNPIPE_ENCAP 1 |
38 | #define PNPIPE_IFINDEX 2 | 38 | #define PNPIPE_IFINDEX 2 |
39 | #define PNPIPE_PIPE_HANDLE 3 | 39 | #define PNPIPE_HANDLE 3 |
40 | #define PNPIPE_ENABLE 4 | ||
41 | /* unused slot */ | ||
42 | 40 | ||
43 | #define PNADDR_ANY 0 | 41 | #define PNADDR_ANY 0 |
44 | #define PNADDR_BROADCAST 0xFC | 42 | #define PNADDR_BROADCAST 0xFC |
diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h index 2cfa4bc8dea6..b1032a3fafdc 100644 --- a/include/linux/pkt_sched.h +++ b/include/linux/pkt_sched.h | |||
@@ -247,6 +247,35 @@ struct tc_gred_sopt { | |||
247 | __u16 pad1; | 247 | __u16 pad1; |
248 | }; | 248 | }; |
249 | 249 | ||
250 | /* CHOKe section */ | ||
251 | |||
252 | enum { | ||
253 | TCA_CHOKE_UNSPEC, | ||
254 | TCA_CHOKE_PARMS, | ||
255 | TCA_CHOKE_STAB, | ||
256 | __TCA_CHOKE_MAX, | ||
257 | }; | ||
258 | |||
259 | #define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1) | ||
260 | |||
261 | struct tc_choke_qopt { | ||
262 | __u32 limit; /* Hard queue length (packets) */ | ||
263 | __u32 qth_min; /* Min average threshold (packets) */ | ||
264 | __u32 qth_max; /* Max average threshold (packets) */ | ||
265 | unsigned char Wlog; /* log(W) */ | ||
266 | unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ | ||
267 | unsigned char Scell_log; /* cell size for idle damping */ | ||
268 | unsigned char flags; /* see RED flags */ | ||
269 | }; | ||
270 | |||
271 | struct tc_choke_xstats { | ||
272 | __u32 early; /* Early drops */ | ||
273 | __u32 pdrop; /* Drops due to queue limits */ | ||
274 | __u32 other; /* Drops due to drop() calls */ | ||
275 | __u32 marked; /* Marked packets */ | ||
276 | __u32 matched; /* Drops due to flow match */ | ||
277 | }; | ||
278 | |||
250 | /* HTB section */ | 279 | /* HTB section */ |
251 | #define TC_HTB_NUMPRIO 8 | 280 | #define TC_HTB_NUMPRIO 8 |
252 | #define TC_HTB_MAXDEPTH 8 | 281 | #define TC_HTB_MAXDEPTH 8 |
@@ -435,6 +464,7 @@ enum { | |||
435 | TCA_NETEM_DELAY_DIST, | 464 | TCA_NETEM_DELAY_DIST, |
436 | TCA_NETEM_REORDER, | 465 | TCA_NETEM_REORDER, |
437 | TCA_NETEM_CORRUPT, | 466 | TCA_NETEM_CORRUPT, |
467 | TCA_NETEM_LOSS, | ||
438 | __TCA_NETEM_MAX, | 468 | __TCA_NETEM_MAX, |
439 | }; | 469 | }; |
440 | 470 | ||
@@ -465,7 +495,33 @@ struct tc_netem_corrupt { | |||
465 | __u32 correlation; | 495 | __u32 correlation; |
466 | }; | 496 | }; |
467 | 497 | ||
498 | enum { | ||
499 | NETEM_LOSS_UNSPEC, | ||
500 | NETEM_LOSS_GI, /* General Intuitive - 4 state model */ | ||
501 | NETEM_LOSS_GE, /* Gilbert Elliot models */ | ||
502 | __NETEM_LOSS_MAX | ||
503 | }; | ||
504 | #define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1) | ||
505 | |||
506 | /* State transition probablities for 4 state model */ | ||
507 | struct tc_netem_gimodel { | ||
508 | __u32 p13; | ||
509 | __u32 p31; | ||
510 | __u32 p32; | ||
511 | __u32 p14; | ||
512 | __u32 p23; | ||
513 | }; | ||
514 | |||
515 | /* Gilbert-Elliot models */ | ||
516 | struct tc_netem_gemodel { | ||
517 | __u32 p; | ||
518 | __u32 r; | ||
519 | __u32 h; | ||
520 | __u32 k1; | ||
521 | }; | ||
522 | |||
468 | #define NETEM_DIST_SCALE 8192 | 523 | #define NETEM_DIST_SCALE 8192 |
524 | #define NETEM_DIST_MAX 16384 | ||
469 | 525 | ||
470 | /* DRR */ | 526 | /* DRR */ |
471 | 527 | ||
@@ -481,4 +537,55 @@ struct tc_drr_stats { | |||
481 | __u32 deficit; | 537 | __u32 deficit; |
482 | }; | 538 | }; |
483 | 539 | ||
540 | /* MQPRIO */ | ||
541 | #define TC_QOPT_BITMASK 15 | ||
542 | #define TC_QOPT_MAX_QUEUE 16 | ||
543 | |||
544 | struct tc_mqprio_qopt { | ||
545 | __u8 num_tc; | ||
546 | __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; | ||
547 | __u8 hw; | ||
548 | __u16 count[TC_QOPT_MAX_QUEUE]; | ||
549 | __u16 offset[TC_QOPT_MAX_QUEUE]; | ||
550 | }; | ||
551 | |||
552 | /* SFB */ | ||
553 | |||
554 | enum { | ||
555 | TCA_SFB_UNSPEC, | ||
556 | TCA_SFB_PARMS, | ||
557 | __TCA_SFB_MAX, | ||
558 | }; | ||
559 | |||
560 | #define TCA_SFB_MAX (__TCA_SFB_MAX - 1) | ||
561 | |||
562 | /* | ||
563 | * Note: increment, decrement are Q0.16 fixed-point values. | ||
564 | */ | ||
565 | struct tc_sfb_qopt { | ||
566 | __u32 rehash_interval; /* delay between hash move, in ms */ | ||
567 | __u32 warmup_time; /* double buffering warmup time in ms (warmup_time < rehash_interval) */ | ||
568 | __u32 max; /* max len of qlen_min */ | ||
569 | __u32 bin_size; /* maximum queue length per bin */ | ||
570 | __u32 increment; /* probability increment, (d1 in Blue) */ | ||
571 | __u32 decrement; /* probability decrement, (d2 in Blue) */ | ||
572 | __u32 limit; /* max SFB queue length */ | ||
573 | __u32 penalty_rate; /* inelastic flows are rate limited to 'rate' pps */ | ||
574 | __u32 penalty_burst; | ||
575 | }; | ||
576 | |||
577 | struct tc_sfb_xstats { | ||
578 | __u32 earlydrop; | ||
579 | __u32 penaltydrop; | ||
580 | __u32 bucketdrop; | ||
581 | __u32 queuedrop; | ||
582 | __u32 childdrop; /* drops in child qdisc */ | ||
583 | __u32 marked; | ||
584 | __u32 maxqlen; | ||
585 | __u32 maxprob; | ||
586 | __u32 avgprob; | ||
587 | }; | ||
588 | |||
589 | #define SFB_MAX_PROB 0xFFFF | ||
590 | |||
484 | #endif | 591 | #endif |
diff --git a/include/linux/platform_data/msm_serial_hs.h b/include/linux/platform_data/msm_serial_hs.h new file mode 100644 index 000000000000..98a2046f8b31 --- /dev/null +++ b/include/linux/platform_data/msm_serial_hs.h | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Google, Inc. | ||
3 | * Author: Nick Pelly <npelly@google.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_MSM_SERIAL_HS_H | ||
16 | #define __ASM_ARCH_MSM_SERIAL_HS_H | ||
17 | |||
18 | #include <linux/serial_core.h> | ||
19 | |||
20 | /* API to request the uart clock off or on for low power management | ||
21 | * Clients should call request_clock_off() when no uart data is expected, | ||
22 | * and must call request_clock_on() before any further uart data can be | ||
23 | * received. */ | ||
24 | extern void msm_hs_request_clock_off(struct uart_port *uport); | ||
25 | extern void msm_hs_request_clock_on(struct uart_port *uport); | ||
26 | |||
27 | /** | ||
28 | * struct msm_serial_hs_platform_data | ||
29 | * @rx_wakeup_irq: Rx activity irq | ||
30 | * @rx_to_inject: extra character to be inserted to Rx tty on wakeup | ||
31 | * @inject_rx: 1 = insert rx_to_inject. 0 = do not insert extra character | ||
32 | * @exit_lpm_cb: function called before every Tx transaction | ||
33 | * | ||
34 | * This is an optional structure required for UART Rx GPIO IRQ based | ||
35 | * wakeup from low power state. UART wakeup can be triggered by RX activity | ||
36 | * (using a wakeup GPIO on the UART RX pin). This should only be used if | ||
37 | * there is not a wakeup GPIO on the UART CTS, and the first RX byte is | ||
38 | * known (eg., with the Bluetooth Texas Instruments HCILL protocol), | ||
39 | * since the first RX byte will always be lost. RTS will be asserted even | ||
40 | * while the UART is clocked off in this mode of operation. | ||
41 | */ | ||
42 | struct msm_serial_hs_platform_data { | ||
43 | int rx_wakeup_irq; | ||
44 | unsigned char inject_rx_on_wakeup; | ||
45 | char rx_to_inject; | ||
46 | void (*exit_lpm_cb)(struct uart_port *); | ||
47 | }; | ||
48 | |||
49 | #endif | ||
diff --git a/include/linux/platform_data/tegra_usb.h b/include/linux/platform_data/tegra_usb.h new file mode 100644 index 000000000000..6bca5b569acb --- /dev/null +++ b/include/linux/platform_data/tegra_usb.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010 Google, Inc. | ||
3 | * | ||
4 | * This software is licensed under the terms of the GNU General Public | ||
5 | * License version 2, as published by the Free Software Foundation, and | ||
6 | * may be copied, distributed, and modified under those terms. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #ifndef _TEGRA_USB_H_ | ||
16 | #define _TEGRA_USB_H_ | ||
17 | |||
18 | enum tegra_usb_operating_modes { | ||
19 | TEGRA_USB_DEVICE, | ||
20 | TEGRA_USB_HOST, | ||
21 | TEGRA_USB_OTG, | ||
22 | }; | ||
23 | |||
24 | struct tegra_ehci_platform_data { | ||
25 | enum tegra_usb_operating_modes operating_mode; | ||
26 | /* power down the phy on bus suspend */ | ||
27 | int power_down_on_bus_suspend; | ||
28 | void *phy_config; | ||
29 | }; | ||
30 | |||
31 | #endif /* _TEGRA_USB_H_ */ | ||
diff --git a/include/linux/platform_data/uio_pruss.h b/include/linux/platform_data/uio_pruss.h new file mode 100644 index 000000000000..f39140aabc6f --- /dev/null +++ b/include/linux/platform_data/uio_pruss.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * include/linux/platform_data/uio_pruss.h | ||
3 | * | ||
4 | * Platform data for uio_pruss driver | ||
5 | * | ||
6 | * Copyright (C) 2010-11 Texas Instruments Incorporated - http://www.ti.com/ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License as | ||
10 | * published by the Free Software Foundation version 2. | ||
11 | * | ||
12 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
13 | * kind, whether express or implied; without even the implied warranty | ||
14 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef _UIO_PRUSS_H_ | ||
19 | #define _UIO_PRUSS_H_ | ||
20 | |||
21 | /* To configure the PRUSS INTC base offset for UIO driver */ | ||
22 | struct uio_pruss_pdata { | ||
23 | u32 pintc_base; | ||
24 | }; | ||
25 | #endif /* _UIO_PRUSS_H_ */ | ||
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 2e700ec0601f..d96db9825708 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h | |||
@@ -130,8 +130,15 @@ extern void platform_driver_unregister(struct platform_driver *); | |||
130 | extern int platform_driver_probe(struct platform_driver *driver, | 130 | extern int platform_driver_probe(struct platform_driver *driver, |
131 | int (*probe)(struct platform_device *)); | 131 | int (*probe)(struct platform_device *)); |
132 | 132 | ||
133 | #define platform_get_drvdata(_dev) dev_get_drvdata(&(_dev)->dev) | 133 | static inline void *platform_get_drvdata(const struct platform_device *pdev) |
134 | #define platform_set_drvdata(_dev,data) dev_set_drvdata(&(_dev)->dev, (data)) | 134 | { |
135 | return dev_get_drvdata(&pdev->dev); | ||
136 | } | ||
137 | |||
138 | static inline void platform_set_drvdata(struct platform_device *pdev, void *data) | ||
139 | { | ||
140 | dev_set_drvdata(&pdev->dev, data); | ||
141 | } | ||
135 | 142 | ||
136 | extern struct platform_device *platform_create_bundle(struct platform_driver *driver, | 143 | extern struct platform_device *platform_create_bundle(struct platform_driver *driver, |
137 | int (*probe)(struct platform_device *), | 144 | int (*probe)(struct platform_device *), |
diff --git a/include/linux/plist.h b/include/linux/plist.h index 7254eda078e5..c9b9f322c8d8 100644 --- a/include/linux/plist.h +++ b/include/linux/plist.h | |||
@@ -31,15 +31,17 @@ | |||
31 | * | 31 | * |
32 | * Simple ASCII art explanation: | 32 | * Simple ASCII art explanation: |
33 | * | 33 | * |
34 | * |HEAD | | 34 | * pl:prio_list (only for plist_node) |
35 | * | | | 35 | * nl:node_list |
36 | * |prio_list.prev|<------------------------------------| | 36 | * HEAD| NODE(S) |
37 | * |prio_list.next|<->|pl|<->|pl|<--------------->|pl|<-| | 37 | * | |
38 | * |10 | |10| |21| |21| |21| |40| (prio) | 38 | * ||------------------------------------| |
39 | * | | | | | | | | | | | | | 39 | * ||->|pl|<->|pl|<--------------->|pl|<-| |
40 | * | | | | | | | | | | | | | 40 | * | |10| |21| |21| |21| |40| (prio) |
41 | * |node_list.next|<->|nl|<->|nl|<->|nl|<->|nl|<->|nl|<-| | 41 | * | | | | | | | | | | | |
42 | * |node_list.prev|<------------------------------------| | 42 | * | | | | | | | | | | | |
43 | * |->|nl|<->|nl|<->|nl|<->|nl|<->|nl|<->|nl|<-| | ||
44 | * |-------------------------------------------| | ||
43 | * | 45 | * |
44 | * The nodes on the prio_list list are sorted by priority to simplify | 46 | * The nodes on the prio_list list are sorted by priority to simplify |
45 | * the insertion of new nodes. There are no nodes with duplicate | 47 | * the insertion of new nodes. There are no nodes with duplicate |
@@ -78,7 +80,6 @@ | |||
78 | #include <linux/spinlock_types.h> | 80 | #include <linux/spinlock_types.h> |
79 | 81 | ||
80 | struct plist_head { | 82 | struct plist_head { |
81 | struct list_head prio_list; | ||
82 | struct list_head node_list; | 83 | struct list_head node_list; |
83 | #ifdef CONFIG_DEBUG_PI_LIST | 84 | #ifdef CONFIG_DEBUG_PI_LIST |
84 | raw_spinlock_t *rawlock; | 85 | raw_spinlock_t *rawlock; |
@@ -88,7 +89,8 @@ struct plist_head { | |||
88 | 89 | ||
89 | struct plist_node { | 90 | struct plist_node { |
90 | int prio; | 91 | int prio; |
91 | struct plist_head plist; | 92 | struct list_head prio_list; |
93 | struct list_head node_list; | ||
92 | }; | 94 | }; |
93 | 95 | ||
94 | #ifdef CONFIG_DEBUG_PI_LIST | 96 | #ifdef CONFIG_DEBUG_PI_LIST |
@@ -100,7 +102,6 @@ struct plist_node { | |||
100 | #endif | 102 | #endif |
101 | 103 | ||
102 | #define _PLIST_HEAD_INIT(head) \ | 104 | #define _PLIST_HEAD_INIT(head) \ |
103 | .prio_list = LIST_HEAD_INIT((head).prio_list), \ | ||
104 | .node_list = LIST_HEAD_INIT((head).node_list) | 105 | .node_list = LIST_HEAD_INIT((head).node_list) |
105 | 106 | ||
106 | /** | 107 | /** |
@@ -133,7 +134,8 @@ struct plist_node { | |||
133 | #define PLIST_NODE_INIT(node, __prio) \ | 134 | #define PLIST_NODE_INIT(node, __prio) \ |
134 | { \ | 135 | { \ |
135 | .prio = (__prio), \ | 136 | .prio = (__prio), \ |
136 | .plist = { _PLIST_HEAD_INIT((node).plist) }, \ | 137 | .prio_list = LIST_HEAD_INIT((node).prio_list), \ |
138 | .node_list = LIST_HEAD_INIT((node).node_list), \ | ||
137 | } | 139 | } |
138 | 140 | ||
139 | /** | 141 | /** |
@@ -144,7 +146,6 @@ struct plist_node { | |||
144 | static inline void | 146 | static inline void |
145 | plist_head_init(struct plist_head *head, spinlock_t *lock) | 147 | plist_head_init(struct plist_head *head, spinlock_t *lock) |
146 | { | 148 | { |
147 | INIT_LIST_HEAD(&head->prio_list); | ||
148 | INIT_LIST_HEAD(&head->node_list); | 149 | INIT_LIST_HEAD(&head->node_list); |
149 | #ifdef CONFIG_DEBUG_PI_LIST | 150 | #ifdef CONFIG_DEBUG_PI_LIST |
150 | head->spinlock = lock; | 151 | head->spinlock = lock; |
@@ -160,7 +161,6 @@ plist_head_init(struct plist_head *head, spinlock_t *lock) | |||
160 | static inline void | 161 | static inline void |
161 | plist_head_init_raw(struct plist_head *head, raw_spinlock_t *lock) | 162 | plist_head_init_raw(struct plist_head *head, raw_spinlock_t *lock) |
162 | { | 163 | { |
163 | INIT_LIST_HEAD(&head->prio_list); | ||
164 | INIT_LIST_HEAD(&head->node_list); | 164 | INIT_LIST_HEAD(&head->node_list); |
165 | #ifdef CONFIG_DEBUG_PI_LIST | 165 | #ifdef CONFIG_DEBUG_PI_LIST |
166 | head->rawlock = lock; | 166 | head->rawlock = lock; |
@@ -176,7 +176,8 @@ plist_head_init_raw(struct plist_head *head, raw_spinlock_t *lock) | |||
176 | static inline void plist_node_init(struct plist_node *node, int prio) | 176 | static inline void plist_node_init(struct plist_node *node, int prio) |
177 | { | 177 | { |
178 | node->prio = prio; | 178 | node->prio = prio; |
179 | plist_head_init(&node->plist, NULL); | 179 | INIT_LIST_HEAD(&node->prio_list); |
180 | INIT_LIST_HEAD(&node->node_list); | ||
180 | } | 181 | } |
181 | 182 | ||
182 | extern void plist_add(struct plist_node *node, struct plist_head *head); | 183 | extern void plist_add(struct plist_node *node, struct plist_head *head); |
@@ -188,7 +189,7 @@ extern void plist_del(struct plist_node *node, struct plist_head *head); | |||
188 | * @head: the head for your list | 189 | * @head: the head for your list |
189 | */ | 190 | */ |
190 | #define plist_for_each(pos, head) \ | 191 | #define plist_for_each(pos, head) \ |
191 | list_for_each_entry(pos, &(head)->node_list, plist.node_list) | 192 | list_for_each_entry(pos, &(head)->node_list, node_list) |
192 | 193 | ||
193 | /** | 194 | /** |
194 | * plist_for_each_safe - iterate safely over a plist of given type | 195 | * plist_for_each_safe - iterate safely over a plist of given type |
@@ -199,7 +200,7 @@ extern void plist_del(struct plist_node *node, struct plist_head *head); | |||
199 | * Iterate over a plist of given type, safe against removal of list entry. | 200 | * Iterate over a plist of given type, safe against removal of list entry. |
200 | */ | 201 | */ |
201 | #define plist_for_each_safe(pos, n, head) \ | 202 | #define plist_for_each_safe(pos, n, head) \ |
202 | list_for_each_entry_safe(pos, n, &(head)->node_list, plist.node_list) | 203 | list_for_each_entry_safe(pos, n, &(head)->node_list, node_list) |
203 | 204 | ||
204 | /** | 205 | /** |
205 | * plist_for_each_entry - iterate over list of given type | 206 | * plist_for_each_entry - iterate over list of given type |
@@ -208,7 +209,7 @@ extern void plist_del(struct plist_node *node, struct plist_head *head); | |||
208 | * @mem: the name of the list_struct within the struct | 209 | * @mem: the name of the list_struct within the struct |
209 | */ | 210 | */ |
210 | #define plist_for_each_entry(pos, head, mem) \ | 211 | #define plist_for_each_entry(pos, head, mem) \ |
211 | list_for_each_entry(pos, &(head)->node_list, mem.plist.node_list) | 212 | list_for_each_entry(pos, &(head)->node_list, mem.node_list) |
212 | 213 | ||
213 | /** | 214 | /** |
214 | * plist_for_each_entry_safe - iterate safely over list of given type | 215 | * plist_for_each_entry_safe - iterate safely over list of given type |
@@ -220,7 +221,7 @@ extern void plist_del(struct plist_node *node, struct plist_head *head); | |||
220 | * Iterate over list of given type, safe against removal of list entry. | 221 | * Iterate over list of given type, safe against removal of list entry. |
221 | */ | 222 | */ |
222 | #define plist_for_each_entry_safe(pos, n, head, m) \ | 223 | #define plist_for_each_entry_safe(pos, n, head, m) \ |
223 | list_for_each_entry_safe(pos, n, &(head)->node_list, m.plist.node_list) | 224 | list_for_each_entry_safe(pos, n, &(head)->node_list, m.node_list) |
224 | 225 | ||
225 | /** | 226 | /** |
226 | * plist_head_empty - return !0 if a plist_head is empty | 227 | * plist_head_empty - return !0 if a plist_head is empty |
@@ -237,7 +238,7 @@ static inline int plist_head_empty(const struct plist_head *head) | |||
237 | */ | 238 | */ |
238 | static inline int plist_node_empty(const struct plist_node *node) | 239 | static inline int plist_node_empty(const struct plist_node *node) |
239 | { | 240 | { |
240 | return plist_head_empty(&node->plist); | 241 | return list_empty(&node->node_list); |
241 | } | 242 | } |
242 | 243 | ||
243 | /* All functions below assume the plist_head is not empty. */ | 244 | /* All functions below assume the plist_head is not empty. */ |
@@ -285,7 +286,7 @@ static inline int plist_node_empty(const struct plist_node *node) | |||
285 | static inline struct plist_node *plist_first(const struct plist_head *head) | 286 | static inline struct plist_node *plist_first(const struct plist_head *head) |
286 | { | 287 | { |
287 | return list_entry(head->node_list.next, | 288 | return list_entry(head->node_list.next, |
288 | struct plist_node, plist.node_list); | 289 | struct plist_node, node_list); |
289 | } | 290 | } |
290 | 291 | ||
291 | /** | 292 | /** |
@@ -297,7 +298,7 @@ static inline struct plist_node *plist_first(const struct plist_head *head) | |||
297 | static inline struct plist_node *plist_last(const struct plist_head *head) | 298 | static inline struct plist_node *plist_last(const struct plist_head *head) |
298 | { | 299 | { |
299 | return list_entry(head->node_list.prev, | 300 | return list_entry(head->node_list.prev, |
300 | struct plist_node, plist.node_list); | 301 | struct plist_node, node_list); |
301 | } | 302 | } |
302 | 303 | ||
303 | #endif | 304 | #endif |
diff --git a/include/linux/pm.h b/include/linux/pm.h index 21415cc91cbb..6618216bb973 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
@@ -267,7 +267,7 @@ const struct dev_pm_ops name = { \ | |||
267 | * callbacks provided by device drivers supporting both the system sleep PM and | 267 | * callbacks provided by device drivers supporting both the system sleep PM and |
268 | * runtime PM, make the pm member point to generic_subsys_pm_ops. | 268 | * runtime PM, make the pm member point to generic_subsys_pm_ops. |
269 | */ | 269 | */ |
270 | #ifdef CONFIG_PM_OPS | 270 | #ifdef CONFIG_PM |
271 | extern struct dev_pm_ops generic_subsys_pm_ops; | 271 | extern struct dev_pm_ops generic_subsys_pm_ops; |
272 | #define GENERIC_SUBSYS_PM_OPS (&generic_subsys_pm_ops) | 272 | #define GENERIC_SUBSYS_PM_OPS (&generic_subsys_pm_ops) |
273 | #else | 273 | #else |
@@ -465,6 +465,14 @@ struct dev_pm_info { | |||
465 | 465 | ||
466 | extern void update_pm_runtime_accounting(struct device *dev); | 466 | extern void update_pm_runtime_accounting(struct device *dev); |
467 | 467 | ||
468 | /* | ||
469 | * Power domains provide callbacks that are executed during system suspend, | ||
470 | * hibernation, system resume and during runtime PM transitions along with | ||
471 | * subsystem-level and driver-level callbacks. | ||
472 | */ | ||
473 | struct dev_power_domain { | ||
474 | struct dev_pm_ops ops; | ||
475 | }; | ||
468 | 476 | ||
469 | /* | 477 | /* |
470 | * The PM_EVENT_ messages are also used by drivers implementing the legacy | 478 | * The PM_EVENT_ messages are also used by drivers implementing the legacy |
@@ -565,15 +573,6 @@ enum dpm_order { | |||
565 | DPM_ORDER_DEV_LAST, | 573 | DPM_ORDER_DEV_LAST, |
566 | }; | 574 | }; |
567 | 575 | ||
568 | /* | ||
569 | * Global Power Management flags | ||
570 | * Used to keep APM and ACPI from both being active | ||
571 | */ | ||
572 | extern unsigned int pm_flags; | ||
573 | |||
574 | #define PM_APM 1 | ||
575 | #define PM_ACPI 2 | ||
576 | |||
577 | extern int pm_generic_suspend(struct device *dev); | 576 | extern int pm_generic_suspend(struct device *dev); |
578 | extern int pm_generic_resume(struct device *dev); | 577 | extern int pm_generic_resume(struct device *dev); |
579 | extern int pm_generic_freeze(struct device *dev); | 578 | extern int pm_generic_freeze(struct device *dev); |
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index d34f067e2a7f..8de9aa6e7def 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h | |||
@@ -87,6 +87,11 @@ static inline bool pm_runtime_enabled(struct device *dev) | |||
87 | return !dev->power.disable_depth; | 87 | return !dev->power.disable_depth; |
88 | } | 88 | } |
89 | 89 | ||
90 | static inline bool pm_runtime_callbacks_present(struct device *dev) | ||
91 | { | ||
92 | return !dev->power.no_callbacks; | ||
93 | } | ||
94 | |||
90 | static inline void pm_runtime_mark_last_busy(struct device *dev) | 95 | static inline void pm_runtime_mark_last_busy(struct device *dev) |
91 | { | 96 | { |
92 | ACCESS_ONCE(dev->power.last_busy) = jiffies; | 97 | ACCESS_ONCE(dev->power.last_busy) = jiffies; |
@@ -133,6 +138,7 @@ static inline int pm_generic_runtime_resume(struct device *dev) { return 0; } | |||
133 | static inline void pm_runtime_no_callbacks(struct device *dev) {} | 138 | static inline void pm_runtime_no_callbacks(struct device *dev) {} |
134 | static inline void pm_runtime_irq_safe(struct device *dev) {} | 139 | static inline void pm_runtime_irq_safe(struct device *dev) {} |
135 | 140 | ||
141 | static inline bool pm_runtime_callbacks_present(struct device *dev) { return false; } | ||
136 | static inline void pm_runtime_mark_last_busy(struct device *dev) {} | 142 | static inline void pm_runtime_mark_last_busy(struct device *dev) {} |
137 | static inline void __pm_runtime_use_autosuspend(struct device *dev, | 143 | static inline void __pm_runtime_use_autosuspend(struct device *dev, |
138 | bool use) {} | 144 | bool use) {} |
diff --git a/include/linux/pm_wakeup.h b/include/linux/pm_wakeup.h index 03a67db03d01..a32da962d693 100644 --- a/include/linux/pm_wakeup.h +++ b/include/linux/pm_wakeup.h | |||
@@ -62,18 +62,11 @@ struct wakeup_source { | |||
62 | * Changes to device_may_wakeup take effect on the next pm state change. | 62 | * Changes to device_may_wakeup take effect on the next pm state change. |
63 | */ | 63 | */ |
64 | 64 | ||
65 | static inline void device_set_wakeup_capable(struct device *dev, bool capable) | ||
66 | { | ||
67 | dev->power.can_wakeup = capable; | ||
68 | } | ||
69 | |||
70 | static inline bool device_can_wakeup(struct device *dev) | 65 | static inline bool device_can_wakeup(struct device *dev) |
71 | { | 66 | { |
72 | return dev->power.can_wakeup; | 67 | return dev->power.can_wakeup; |
73 | } | 68 | } |
74 | 69 | ||
75 | |||
76 | |||
77 | static inline bool device_may_wakeup(struct device *dev) | 70 | static inline bool device_may_wakeup(struct device *dev) |
78 | { | 71 | { |
79 | return dev->power.can_wakeup && !!dev->power.wakeup; | 72 | return dev->power.can_wakeup && !!dev->power.wakeup; |
@@ -88,6 +81,7 @@ extern struct wakeup_source *wakeup_source_register(const char *name); | |||
88 | extern void wakeup_source_unregister(struct wakeup_source *ws); | 81 | extern void wakeup_source_unregister(struct wakeup_source *ws); |
89 | extern int device_wakeup_enable(struct device *dev); | 82 | extern int device_wakeup_enable(struct device *dev); |
90 | extern int device_wakeup_disable(struct device *dev); | 83 | extern int device_wakeup_disable(struct device *dev); |
84 | extern void device_set_wakeup_capable(struct device *dev, bool capable); | ||
91 | extern int device_init_wakeup(struct device *dev, bool val); | 85 | extern int device_init_wakeup(struct device *dev, bool val); |
92 | extern int device_set_wakeup_enable(struct device *dev, bool enable); | 86 | extern int device_set_wakeup_enable(struct device *dev, bool enable); |
93 | extern void __pm_stay_awake(struct wakeup_source *ws); | 87 | extern void __pm_stay_awake(struct wakeup_source *ws); |
diff --git a/include/linux/posix-clock.h b/include/linux/posix-clock.h new file mode 100644 index 000000000000..369e19d3750b --- /dev/null +++ b/include/linux/posix-clock.h | |||
@@ -0,0 +1,150 @@ | |||
1 | /* | ||
2 | * posix-clock.h - support for dynamic clock devices | ||
3 | * | ||
4 | * Copyright (C) 2010 OMICRON electronics GmbH | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | #ifndef _LINUX_POSIX_CLOCK_H_ | ||
21 | #define _LINUX_POSIX_CLOCK_H_ | ||
22 | |||
23 | #include <linux/cdev.h> | ||
24 | #include <linux/fs.h> | ||
25 | #include <linux/poll.h> | ||
26 | #include <linux/posix-timers.h> | ||
27 | |||
28 | struct posix_clock; | ||
29 | |||
30 | /** | ||
31 | * struct posix_clock_operations - functional interface to the clock | ||
32 | * | ||
33 | * Every posix clock is represented by a character device. Drivers may | ||
34 | * optionally offer extended capabilities by implementing the | ||
35 | * character device methods. The character device file operations are | ||
36 | * first handled by the clock device layer, then passed on to the | ||
37 | * driver by calling these functions. | ||
38 | * | ||
39 | * @owner: The clock driver should set to THIS_MODULE | ||
40 | * @clock_adjtime: Adjust the clock | ||
41 | * @clock_gettime: Read the current time | ||
42 | * @clock_getres: Get the clock resolution | ||
43 | * @clock_settime: Set the current time value | ||
44 | * @timer_create: Create a new timer | ||
45 | * @timer_delete: Remove a previously created timer | ||
46 | * @timer_gettime: Get remaining time and interval of a timer | ||
47 | * @timer_setttime: Set a timer's initial expiration and interval | ||
48 | * @fasync: Optional character device fasync method | ||
49 | * @mmap: Optional character device mmap method | ||
50 | * @open: Optional character device open method | ||
51 | * @release: Optional character device release method | ||
52 | * @ioctl: Optional character device ioctl method | ||
53 | * @read: Optional character device read method | ||
54 | * @poll: Optional character device poll method | ||
55 | */ | ||
56 | struct posix_clock_operations { | ||
57 | struct module *owner; | ||
58 | |||
59 | int (*clock_adjtime)(struct posix_clock *pc, struct timex *tx); | ||
60 | |||
61 | int (*clock_gettime)(struct posix_clock *pc, struct timespec *ts); | ||
62 | |||
63 | int (*clock_getres) (struct posix_clock *pc, struct timespec *ts); | ||
64 | |||
65 | int (*clock_settime)(struct posix_clock *pc, | ||
66 | const struct timespec *ts); | ||
67 | |||
68 | int (*timer_create) (struct posix_clock *pc, struct k_itimer *kit); | ||
69 | |||
70 | int (*timer_delete) (struct posix_clock *pc, struct k_itimer *kit); | ||
71 | |||
72 | void (*timer_gettime)(struct posix_clock *pc, | ||
73 | struct k_itimer *kit, struct itimerspec *tsp); | ||
74 | |||
75 | int (*timer_settime)(struct posix_clock *pc, | ||
76 | struct k_itimer *kit, int flags, | ||
77 | struct itimerspec *tsp, struct itimerspec *old); | ||
78 | /* | ||
79 | * Optional character device methods: | ||
80 | */ | ||
81 | int (*fasync) (struct posix_clock *pc, | ||
82 | int fd, struct file *file, int on); | ||
83 | |||
84 | long (*ioctl) (struct posix_clock *pc, | ||
85 | unsigned int cmd, unsigned long arg); | ||
86 | |||
87 | int (*mmap) (struct posix_clock *pc, | ||
88 | struct vm_area_struct *vma); | ||
89 | |||
90 | int (*open) (struct posix_clock *pc, fmode_t f_mode); | ||
91 | |||
92 | uint (*poll) (struct posix_clock *pc, | ||
93 | struct file *file, poll_table *wait); | ||
94 | |||
95 | int (*release) (struct posix_clock *pc); | ||
96 | |||
97 | ssize_t (*read) (struct posix_clock *pc, | ||
98 | uint flags, char __user *buf, size_t cnt); | ||
99 | }; | ||
100 | |||
101 | /** | ||
102 | * struct posix_clock - represents a dynamic posix clock | ||
103 | * | ||
104 | * @ops: Functional interface to the clock | ||
105 | * @cdev: Character device instance for this clock | ||
106 | * @kref: Reference count. | ||
107 | * @mutex: Protects the 'zombie' field from concurrent access. | ||
108 | * @zombie: If 'zombie' is true, then the hardware has disappeared. | ||
109 | * @release: A function to free the structure when the reference count reaches | ||
110 | * zero. May be NULL if structure is statically allocated. | ||
111 | * | ||
112 | * Drivers should embed their struct posix_clock within a private | ||
113 | * structure, obtaining a reference to it during callbacks using | ||
114 | * container_of(). | ||
115 | */ | ||
116 | struct posix_clock { | ||
117 | struct posix_clock_operations ops; | ||
118 | struct cdev cdev; | ||
119 | struct kref kref; | ||
120 | struct mutex mutex; | ||
121 | bool zombie; | ||
122 | void (*release)(struct posix_clock *clk); | ||
123 | }; | ||
124 | |||
125 | /** | ||
126 | * posix_clock_register() - register a new clock | ||
127 | * @clk: Pointer to the clock. Caller must provide 'ops' and 'release' | ||
128 | * @devid: Allocated device id | ||
129 | * | ||
130 | * A clock driver calls this function to register itself with the | ||
131 | * clock device subsystem. If 'clk' points to dynamically allocated | ||
132 | * memory, then the caller must provide a 'release' function to free | ||
133 | * that memory. | ||
134 | * | ||
135 | * Returns zero on success, non-zero otherwise. | ||
136 | */ | ||
137 | int posix_clock_register(struct posix_clock *clk, dev_t devid); | ||
138 | |||
139 | /** | ||
140 | * posix_clock_unregister() - unregister a clock | ||
141 | * @clk: Clock instance previously registered via posix_clock_register() | ||
142 | * | ||
143 | * A clock driver calls this function to remove itself from the clock | ||
144 | * device subsystem. The posix_clock itself will remain (in an | ||
145 | * inactive state) until its reference count drops to zero, at which | ||
146 | * point it will be deallocated with its 'release' method. | ||
147 | */ | ||
148 | void posix_clock_unregister(struct posix_clock *clk); | ||
149 | |||
150 | #endif | ||
diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 3e23844a6990..d51243ae0726 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/spinlock.h> | 4 | #include <linux/spinlock.h> |
5 | #include <linux/list.h> | 5 | #include <linux/list.h> |
6 | #include <linux/sched.h> | 6 | #include <linux/sched.h> |
7 | #include <linux/timex.h> | ||
7 | 8 | ||
8 | union cpu_time_count { | 9 | union cpu_time_count { |
9 | cputime_t cpu; | 10 | cputime_t cpu; |
@@ -17,10 +18,21 @@ struct cpu_timer_list { | |||
17 | int firing; | 18 | int firing; |
18 | }; | 19 | }; |
19 | 20 | ||
21 | /* | ||
22 | * Bit fields within a clockid: | ||
23 | * | ||
24 | * The most significant 29 bits hold either a pid or a file descriptor. | ||
25 | * | ||
26 | * Bit 2 indicates whether a cpu clock refers to a thread or a process. | ||
27 | * | ||
28 | * Bits 1 and 0 give the type: PROF=0, VIRT=1, SCHED=2, or FD=3. | ||
29 | * | ||
30 | * A clockid is invalid if bits 2, 1, and 0 are all set. | ||
31 | */ | ||
20 | #define CPUCLOCK_PID(clock) ((pid_t) ~((clock) >> 3)) | 32 | #define CPUCLOCK_PID(clock) ((pid_t) ~((clock) >> 3)) |
21 | #define CPUCLOCK_PERTHREAD(clock) \ | 33 | #define CPUCLOCK_PERTHREAD(clock) \ |
22 | (((clock) & (clockid_t) CPUCLOCK_PERTHREAD_MASK) != 0) | 34 | (((clock) & (clockid_t) CPUCLOCK_PERTHREAD_MASK) != 0) |
23 | #define CPUCLOCK_PID_MASK 7 | 35 | |
24 | #define CPUCLOCK_PERTHREAD_MASK 4 | 36 | #define CPUCLOCK_PERTHREAD_MASK 4 |
25 | #define CPUCLOCK_WHICH(clock) ((clock) & (clockid_t) CPUCLOCK_CLOCK_MASK) | 37 | #define CPUCLOCK_WHICH(clock) ((clock) & (clockid_t) CPUCLOCK_CLOCK_MASK) |
26 | #define CPUCLOCK_CLOCK_MASK 3 | 38 | #define CPUCLOCK_CLOCK_MASK 3 |
@@ -28,12 +40,17 @@ struct cpu_timer_list { | |||
28 | #define CPUCLOCK_VIRT 1 | 40 | #define CPUCLOCK_VIRT 1 |
29 | #define CPUCLOCK_SCHED 2 | 41 | #define CPUCLOCK_SCHED 2 |
30 | #define CPUCLOCK_MAX 3 | 42 | #define CPUCLOCK_MAX 3 |
43 | #define CLOCKFD CPUCLOCK_MAX | ||
44 | #define CLOCKFD_MASK (CPUCLOCK_PERTHREAD_MASK|CPUCLOCK_CLOCK_MASK) | ||
31 | 45 | ||
32 | #define MAKE_PROCESS_CPUCLOCK(pid, clock) \ | 46 | #define MAKE_PROCESS_CPUCLOCK(pid, clock) \ |
33 | ((~(clockid_t) (pid) << 3) | (clockid_t) (clock)) | 47 | ((~(clockid_t) (pid) << 3) | (clockid_t) (clock)) |
34 | #define MAKE_THREAD_CPUCLOCK(tid, clock) \ | 48 | #define MAKE_THREAD_CPUCLOCK(tid, clock) \ |
35 | MAKE_PROCESS_CPUCLOCK((tid), (clock) | CPUCLOCK_PERTHREAD_MASK) | 49 | MAKE_PROCESS_CPUCLOCK((tid), (clock) | CPUCLOCK_PERTHREAD_MASK) |
36 | 50 | ||
51 | #define FD_TO_CLOCKID(fd) ((~(clockid_t) (fd) << 3) | CLOCKFD) | ||
52 | #define CLOCKID_TO_FD(clk) ((unsigned int) ~((clk) >> 3)) | ||
53 | |||
37 | /* POSIX.1b interval timer structure. */ | 54 | /* POSIX.1b interval timer structure. */ |
38 | struct k_itimer { | 55 | struct k_itimer { |
39 | struct list_head list; /* free/ allocate list */ | 56 | struct list_head list; /* free/ allocate list */ |
@@ -67,10 +84,11 @@ struct k_itimer { | |||
67 | }; | 84 | }; |
68 | 85 | ||
69 | struct k_clock { | 86 | struct k_clock { |
70 | int res; /* in nanoseconds */ | ||
71 | int (*clock_getres) (const clockid_t which_clock, struct timespec *tp); | 87 | int (*clock_getres) (const clockid_t which_clock, struct timespec *tp); |
72 | int (*clock_set) (const clockid_t which_clock, struct timespec * tp); | 88 | int (*clock_set) (const clockid_t which_clock, |
89 | const struct timespec *tp); | ||
73 | int (*clock_get) (const clockid_t which_clock, struct timespec * tp); | 90 | int (*clock_get) (const clockid_t which_clock, struct timespec * tp); |
91 | int (*clock_adj) (const clockid_t which_clock, struct timex *tx); | ||
74 | int (*timer_create) (struct k_itimer *timer); | 92 | int (*timer_create) (struct k_itimer *timer); |
75 | int (*nsleep) (const clockid_t which_clock, int flags, | 93 | int (*nsleep) (const clockid_t which_clock, int flags, |
76 | struct timespec *, struct timespec __user *); | 94 | struct timespec *, struct timespec __user *); |
@@ -84,28 +102,14 @@ struct k_clock { | |||
84 | struct itimerspec * cur_setting); | 102 | struct itimerspec * cur_setting); |
85 | }; | 103 | }; |
86 | 104 | ||
87 | void register_posix_clock(const clockid_t clock_id, struct k_clock *new_clock); | 105 | extern struct k_clock clock_posix_cpu; |
106 | extern struct k_clock clock_posix_dynamic; | ||
88 | 107 | ||
89 | /* error handlers for timer_create, nanosleep and settime */ | 108 | void posix_timers_register_clock(const clockid_t clock_id, struct k_clock *new_clock); |
90 | int do_posix_clock_nonanosleep(const clockid_t, int flags, struct timespec *, | ||
91 | struct timespec __user *); | ||
92 | int do_posix_clock_nosettime(const clockid_t, struct timespec *tp); | ||
93 | 109 | ||
94 | /* function to call to trigger timer event */ | 110 | /* function to call to trigger timer event */ |
95 | int posix_timer_event(struct k_itimer *timr, int si_private); | 111 | int posix_timer_event(struct k_itimer *timr, int si_private); |
96 | 112 | ||
97 | int posix_cpu_clock_getres(const clockid_t which_clock, struct timespec *ts); | ||
98 | int posix_cpu_clock_get(const clockid_t which_clock, struct timespec *ts); | ||
99 | int posix_cpu_clock_set(const clockid_t which_clock, const struct timespec *ts); | ||
100 | int posix_cpu_timer_create(struct k_itimer *timer); | ||
101 | int posix_cpu_nsleep(const clockid_t which_clock, int flags, | ||
102 | struct timespec *rqtp, struct timespec __user *rmtp); | ||
103 | long posix_cpu_nsleep_restart(struct restart_block *restart_block); | ||
104 | int posix_cpu_timer_set(struct k_itimer *timer, int flags, | ||
105 | struct itimerspec *new, struct itimerspec *old); | ||
106 | int posix_cpu_timer_del(struct k_itimer *timer); | ||
107 | void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp); | ||
108 | |||
109 | void posix_cpu_timer_schedule(struct k_itimer *timer); | 113 | void posix_cpu_timer_schedule(struct k_itimer *timer); |
110 | 114 | ||
111 | void run_posix_cpu_timers(struct task_struct *task); | 115 | void run_posix_cpu_timers(struct task_struct *task); |
diff --git a/include/linux/pstore.h b/include/linux/pstore.h new file mode 100644 index 000000000000..41977737bb7d --- /dev/null +++ b/include/linux/pstore.h | |||
@@ -0,0 +1,60 @@ | |||
1 | /* | ||
2 | * Persistent Storage - pstore.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Intel Corporation <tony.luck@intel.com> | ||
5 | * | ||
6 | * This code is the generic layer to export data records from platform | ||
7 | * level persistent storage via a file system. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | #ifndef _LINUX_PSTORE_H | ||
23 | #define _LINUX_PSTORE_H | ||
24 | |||
25 | /* types */ | ||
26 | enum pstore_type_id { | ||
27 | PSTORE_TYPE_DMESG = 0, | ||
28 | PSTORE_TYPE_MCE = 1, | ||
29 | PSTORE_TYPE_UNKNOWN = 255 | ||
30 | }; | ||
31 | |||
32 | struct pstore_info { | ||
33 | struct module *owner; | ||
34 | char *name; | ||
35 | struct mutex buf_mutex; /* serialize access to 'buf' */ | ||
36 | char *buf; | ||
37 | size_t bufsize; | ||
38 | size_t (*read)(u64 *id, enum pstore_type_id *type, | ||
39 | struct timespec *time); | ||
40 | u64 (*write)(enum pstore_type_id type, size_t size); | ||
41 | int (*erase)(u64 id); | ||
42 | }; | ||
43 | |||
44 | #ifdef CONFIG_PSTORE | ||
45 | extern int pstore_register(struct pstore_info *); | ||
46 | extern int pstore_write(enum pstore_type_id type, char *buf, size_t size); | ||
47 | #else | ||
48 | static inline int | ||
49 | pstore_register(struct pstore_info *psi) | ||
50 | { | ||
51 | return -ENODEV; | ||
52 | } | ||
53 | static inline int | ||
54 | pstore_write(enum pstore_type_id type, char *buf, size_t size) | ||
55 | { | ||
56 | return -ENODEV; | ||
57 | } | ||
58 | #endif | ||
59 | |||
60 | #endif /*_LINUX_PSTORE_H*/ | ||
diff --git a/include/linux/pwm_backlight.h b/include/linux/pwm_backlight.h index e031e1a486d9..5e3e25a3c9c3 100644 --- a/include/linux/pwm_backlight.h +++ b/include/linux/pwm_backlight.h | |||
@@ -4,6 +4,8 @@ | |||
4 | #ifndef __LINUX_PWM_BACKLIGHT_H | 4 | #ifndef __LINUX_PWM_BACKLIGHT_H |
5 | #define __LINUX_PWM_BACKLIGHT_H | 5 | #define __LINUX_PWM_BACKLIGHT_H |
6 | 6 | ||
7 | #include <linux/backlight.h> | ||
8 | |||
7 | struct platform_pwm_backlight_data { | 9 | struct platform_pwm_backlight_data { |
8 | int pwm_id; | 10 | int pwm_id; |
9 | unsigned int max_brightness; | 11 | unsigned int max_brightness; |
@@ -13,6 +15,7 @@ struct platform_pwm_backlight_data { | |||
13 | int (*init)(struct device *dev); | 15 | int (*init)(struct device *dev); |
14 | int (*notify)(struct device *dev, int brightness); | 16 | int (*notify)(struct device *dev, int brightness); |
15 | void (*exit)(struct device *dev); | 17 | void (*exit)(struct device *dev); |
18 | int (*check_fb)(struct device *dev, struct fb_info *info); | ||
16 | }; | 19 | }; |
17 | 20 | ||
18 | #endif | 21 | #endif |
diff --git a/include/linux/reiserfs_xattr.h b/include/linux/reiserfs_xattr.h index 3b94c91f20a6..6deef5dc95fb 100644 --- a/include/linux/reiserfs_xattr.h +++ b/include/linux/reiserfs_xattr.h | |||
@@ -63,6 +63,7 @@ extern const struct xattr_handler reiserfs_xattr_trusted_handler; | |||
63 | extern const struct xattr_handler reiserfs_xattr_security_handler; | 63 | extern const struct xattr_handler reiserfs_xattr_security_handler; |
64 | #ifdef CONFIG_REISERFS_FS_SECURITY | 64 | #ifdef CONFIG_REISERFS_FS_SECURITY |
65 | int reiserfs_security_init(struct inode *dir, struct inode *inode, | 65 | int reiserfs_security_init(struct inode *dir, struct inode *inode, |
66 | const struct qstr *qstr, | ||
66 | struct reiserfs_security_handle *sec); | 67 | struct reiserfs_security_handle *sec); |
67 | int reiserfs_security_write(struct reiserfs_transaction_handle *th, | 68 | int reiserfs_security_write(struct reiserfs_transaction_handle *th, |
68 | struct inode *inode, | 69 | struct inode *inode, |
@@ -130,6 +131,7 @@ static inline void reiserfs_init_xattr_rwsem(struct inode *inode) | |||
130 | #ifndef CONFIG_REISERFS_FS_SECURITY | 131 | #ifndef CONFIG_REISERFS_FS_SECURITY |
131 | static inline int reiserfs_security_init(struct inode *dir, | 132 | static inline int reiserfs_security_init(struct inode *dir, |
132 | struct inode *inode, | 133 | struct inode *inode, |
134 | const struct qstr *qstr, | ||
133 | struct reiserfs_security_handle *sec) | 135 | struct reiserfs_security_handle *sec) |
134 | { | 136 | { |
135 | return 0; | 137 | return 0; |
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 8d3a2486544d..ab38ac80b0f9 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h | |||
@@ -100,6 +100,8 @@ void ring_buffer_free(struct ring_buffer *buffer); | |||
100 | 100 | ||
101 | int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size); | 101 | int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size); |
102 | 102 | ||
103 | void ring_buffer_change_overwrite(struct ring_buffer *buffer, int val); | ||
104 | |||
103 | struct ring_buffer_event *ring_buffer_lock_reserve(struct ring_buffer *buffer, | 105 | struct ring_buffer_event *ring_buffer_lock_reserve(struct ring_buffer *buffer, |
104 | unsigned long length); | 106 | unsigned long length); |
105 | int ring_buffer_unlock_commit(struct ring_buffer *buffer, | 107 | int ring_buffer_unlock_commit(struct ring_buffer *buffer, |
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index e9fd04ca1e51..830e65dc01ee 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
@@ -27,18 +27,15 @@ | |||
27 | struct anon_vma { | 27 | struct anon_vma { |
28 | struct anon_vma *root; /* Root of this anon_vma tree */ | 28 | struct anon_vma *root; /* Root of this anon_vma tree */ |
29 | spinlock_t lock; /* Serialize access to vma list */ | 29 | spinlock_t lock; /* Serialize access to vma list */ |
30 | #if defined(CONFIG_KSM) || defined(CONFIG_MIGRATION) | ||
31 | |||
32 | /* | 30 | /* |
33 | * The external_refcount is taken by either KSM or page migration | 31 | * The refcount is taken on an anon_vma when there is no |
34 | * to take a reference to an anon_vma when there is no | ||
35 | * guarantee that the vma of page tables will exist for | 32 | * guarantee that the vma of page tables will exist for |
36 | * the duration of the operation. A caller that takes | 33 | * the duration of the operation. A caller that takes |
37 | * the reference is responsible for clearing up the | 34 | * the reference is responsible for clearing up the |
38 | * anon_vma if they are the last user on release | 35 | * anon_vma if they are the last user on release |
39 | */ | 36 | */ |
40 | atomic_t external_refcount; | 37 | atomic_t refcount; |
41 | #endif | 38 | |
42 | /* | 39 | /* |
43 | * NOTE: the LSB of the head.next is set by | 40 | * NOTE: the LSB of the head.next is set by |
44 | * mm_take_all_locks() _after_ taking the above lock. So the | 41 | * mm_take_all_locks() _after_ taking the above lock. So the |
@@ -71,42 +68,19 @@ struct anon_vma_chain { | |||
71 | }; | 68 | }; |
72 | 69 | ||
73 | #ifdef CONFIG_MMU | 70 | #ifdef CONFIG_MMU |
74 | #if defined(CONFIG_KSM) || defined(CONFIG_MIGRATION) | ||
75 | static inline void anonvma_external_refcount_init(struct anon_vma *anon_vma) | ||
76 | { | ||
77 | atomic_set(&anon_vma->external_refcount, 0); | ||
78 | } | ||
79 | |||
80 | static inline int anonvma_external_refcount(struct anon_vma *anon_vma) | ||
81 | { | ||
82 | return atomic_read(&anon_vma->external_refcount); | ||
83 | } | ||
84 | |||
85 | static inline void get_anon_vma(struct anon_vma *anon_vma) | 71 | static inline void get_anon_vma(struct anon_vma *anon_vma) |
86 | { | 72 | { |
87 | atomic_inc(&anon_vma->external_refcount); | 73 | atomic_inc(&anon_vma->refcount); |
88 | } | 74 | } |
89 | 75 | ||
90 | void drop_anon_vma(struct anon_vma *); | 76 | void __put_anon_vma(struct anon_vma *anon_vma); |
91 | #else | ||
92 | static inline void anonvma_external_refcount_init(struct anon_vma *anon_vma) | ||
93 | { | ||
94 | } | ||
95 | 77 | ||
96 | static inline int anonvma_external_refcount(struct anon_vma *anon_vma) | 78 | static inline void put_anon_vma(struct anon_vma *anon_vma) |
97 | { | ||
98 | return 0; | ||
99 | } | ||
100 | |||
101 | static inline void get_anon_vma(struct anon_vma *anon_vma) | ||
102 | { | 79 | { |
80 | if (atomic_dec_and_test(&anon_vma->refcount)) | ||
81 | __put_anon_vma(anon_vma); | ||
103 | } | 82 | } |
104 | 83 | ||
105 | static inline void drop_anon_vma(struct anon_vma *anon_vma) | ||
106 | { | ||
107 | } | ||
108 | #endif /* CONFIG_KSM */ | ||
109 | |||
110 | static inline struct anon_vma *page_anon_vma(struct page *page) | 84 | static inline struct anon_vma *page_anon_vma(struct page *page) |
111 | { | 85 | { |
112 | if (((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) != | 86 | if (((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) != |
@@ -148,7 +122,6 @@ void unlink_anon_vmas(struct vm_area_struct *); | |||
148 | int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *); | 122 | int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *); |
149 | int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *); | 123 | int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *); |
150 | void __anon_vma_link(struct vm_area_struct *); | 124 | void __anon_vma_link(struct vm_area_struct *); |
151 | void anon_vma_free(struct anon_vma *); | ||
152 | 125 | ||
153 | static inline void anon_vma_merge(struct vm_area_struct *vma, | 126 | static inline void anon_vma_merge(struct vm_area_struct *vma, |
154 | struct vm_area_struct *next) | 127 | struct vm_area_struct *next) |
@@ -157,6 +130,8 @@ static inline void anon_vma_merge(struct vm_area_struct *vma, | |||
157 | unlink_anon_vmas(next); | 130 | unlink_anon_vmas(next); |
158 | } | 131 | } |
159 | 132 | ||
133 | struct anon_vma *page_get_anon_vma(struct page *page); | ||
134 | |||
160 | /* | 135 | /* |
161 | * rmap interfaces called when adding or removing pte of page | 136 | * rmap interfaces called when adding or removing pte of page |
162 | */ | 137 | */ |
diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 89c3e5182991..2ca7e8a78060 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h | |||
@@ -133,7 +133,6 @@ extern struct class *rtc_class; | |||
133 | * The (current) exceptions are mostly filesystem hooks: | 133 | * The (current) exceptions are mostly filesystem hooks: |
134 | * - the proc() hook for procfs | 134 | * - the proc() hook for procfs |
135 | * - non-ioctl() chardev hooks: open(), release(), read_callback() | 135 | * - non-ioctl() chardev hooks: open(), release(), read_callback() |
136 | * - periodic irq calls: irq_set_state(), irq_set_freq() | ||
137 | * | 136 | * |
138 | * REVISIT those periodic irq calls *do* have ops_lock when they're | 137 | * REVISIT those periodic irq calls *do* have ops_lock when they're |
139 | * issued through ioctl() ... | 138 | * issued through ioctl() ... |
@@ -148,11 +147,8 @@ struct rtc_class_ops { | |||
148 | int (*set_alarm)(struct device *, struct rtc_wkalrm *); | 147 | int (*set_alarm)(struct device *, struct rtc_wkalrm *); |
149 | int (*proc)(struct device *, struct seq_file *); | 148 | int (*proc)(struct device *, struct seq_file *); |
150 | int (*set_mmss)(struct device *, unsigned long secs); | 149 | int (*set_mmss)(struct device *, unsigned long secs); |
151 | int (*irq_set_state)(struct device *, int enabled); | ||
152 | int (*irq_set_freq)(struct device *, int freq); | ||
153 | int (*read_callback)(struct device *, int data); | 150 | int (*read_callback)(struct device *, int data); |
154 | int (*alarm_irq_enable)(struct device *, unsigned int enabled); | 151 | int (*alarm_irq_enable)(struct device *, unsigned int enabled); |
155 | int (*update_irq_enable)(struct device *, unsigned int enabled); | ||
156 | }; | 152 | }; |
157 | 153 | ||
158 | #define RTC_DEVICE_NAME_SIZE 20 | 154 | #define RTC_DEVICE_NAME_SIZE 20 |
@@ -227,6 +223,7 @@ extern void rtc_device_unregister(struct rtc_device *rtc); | |||
227 | extern int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm); | 223 | extern int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm); |
228 | extern int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm); | 224 | extern int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm); |
229 | extern int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs); | 225 | extern int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs); |
226 | int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm); | ||
230 | extern int rtc_read_alarm(struct rtc_device *rtc, | 227 | extern int rtc_read_alarm(struct rtc_device *rtc, |
231 | struct rtc_wkalrm *alrm); | 228 | struct rtc_wkalrm *alrm); |
232 | extern int rtc_set_alarm(struct rtc_device *rtc, | 229 | extern int rtc_set_alarm(struct rtc_device *rtc, |
diff --git a/include/linux/rwlock_types.h b/include/linux/rwlock_types.h index bd31808c7d8e..cc0072e93e36 100644 --- a/include/linux/rwlock_types.h +++ b/include/linux/rwlock_types.h | |||
@@ -43,14 +43,6 @@ typedef struct { | |||
43 | RW_DEP_MAP_INIT(lockname) } | 43 | RW_DEP_MAP_INIT(lockname) } |
44 | #endif | 44 | #endif |
45 | 45 | ||
46 | /* | ||
47 | * RW_LOCK_UNLOCKED defeat lockdep state tracking and is hence | ||
48 | * deprecated. | ||
49 | * | ||
50 | * Please use DEFINE_RWLOCK() or __RW_LOCK_UNLOCKED() as appropriate. | ||
51 | */ | ||
52 | #define RW_LOCK_UNLOCKED __RW_LOCK_UNLOCKED(old_style_rw_init) | ||
53 | |||
54 | #define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x) | 46 | #define DEFINE_RWLOCK(x) rwlock_t x = __RW_LOCK_UNLOCKED(x) |
55 | 47 | ||
56 | #endif /* __LINUX_RWLOCK_TYPES_H */ | 48 | #endif /* __LINUX_RWLOCK_TYPES_H */ |
diff --git a/include/linux/rwsem-spinlock.h b/include/linux/rwsem-spinlock.h index bdfcc2527970..34701241b673 100644 --- a/include/linux/rwsem-spinlock.h +++ b/include/linux/rwsem-spinlock.h | |||
@@ -12,15 +12,7 @@ | |||
12 | #error "please don't include linux/rwsem-spinlock.h directly, use linux/rwsem.h instead" | 12 | #error "please don't include linux/rwsem-spinlock.h directly, use linux/rwsem.h instead" |
13 | #endif | 13 | #endif |
14 | 14 | ||
15 | #include <linux/spinlock.h> | ||
16 | #include <linux/list.h> | ||
17 | |||
18 | #ifdef __KERNEL__ | 15 | #ifdef __KERNEL__ |
19 | |||
20 | #include <linux/types.h> | ||
21 | |||
22 | struct rwsem_waiter; | ||
23 | |||
24 | /* | 16 | /* |
25 | * the rw-semaphore definition | 17 | * the rw-semaphore definition |
26 | * - if activity is 0 then there are no active readers or writers | 18 | * - if activity is 0 then there are no active readers or writers |
@@ -37,28 +29,7 @@ struct rw_semaphore { | |||
37 | #endif | 29 | #endif |
38 | }; | 30 | }; |
39 | 31 | ||
40 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 32 | #define RWSEM_UNLOCKED_VALUE 0x00000000 |
41 | # define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname } | ||
42 | #else | ||
43 | # define __RWSEM_DEP_MAP_INIT(lockname) | ||
44 | #endif | ||
45 | |||
46 | #define __RWSEM_INITIALIZER(name) \ | ||
47 | { 0, __SPIN_LOCK_UNLOCKED(name.wait_lock), LIST_HEAD_INIT((name).wait_list) \ | ||
48 | __RWSEM_DEP_MAP_INIT(name) } | ||
49 | |||
50 | #define DECLARE_RWSEM(name) \ | ||
51 | struct rw_semaphore name = __RWSEM_INITIALIZER(name) | ||
52 | |||
53 | extern void __init_rwsem(struct rw_semaphore *sem, const char *name, | ||
54 | struct lock_class_key *key); | ||
55 | |||
56 | #define init_rwsem(sem) \ | ||
57 | do { \ | ||
58 | static struct lock_class_key __key; \ | ||
59 | \ | ||
60 | __init_rwsem((sem), #sem, &__key); \ | ||
61 | } while (0) | ||
62 | 33 | ||
63 | extern void __down_read(struct rw_semaphore *sem); | 34 | extern void __down_read(struct rw_semaphore *sem); |
64 | extern int __down_read_trylock(struct rw_semaphore *sem); | 35 | extern int __down_read_trylock(struct rw_semaphore *sem); |
diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index efd348fe8ca7..a8afe9cd000c 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h | |||
@@ -11,6 +11,9 @@ | |||
11 | 11 | ||
12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/list.h> | ||
15 | #include <linux/spinlock.h> | ||
16 | |||
14 | #include <asm/system.h> | 17 | #include <asm/system.h> |
15 | #include <asm/atomic.h> | 18 | #include <asm/atomic.h> |
16 | 19 | ||
@@ -19,9 +22,57 @@ struct rw_semaphore; | |||
19 | #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK | 22 | #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK |
20 | #include <linux/rwsem-spinlock.h> /* use a generic implementation */ | 23 | #include <linux/rwsem-spinlock.h> /* use a generic implementation */ |
21 | #else | 24 | #else |
22 | #include <asm/rwsem.h> /* use an arch-specific implementation */ | 25 | /* All arch specific implementations share the same struct */ |
26 | struct rw_semaphore { | ||
27 | long count; | ||
28 | spinlock_t wait_lock; | ||
29 | struct list_head wait_list; | ||
30 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
31 | struct lockdep_map dep_map; | ||
32 | #endif | ||
33 | }; | ||
34 | |||
35 | extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem); | ||
36 | extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem); | ||
37 | extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *); | ||
38 | extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem); | ||
39 | |||
40 | /* Include the arch specific part */ | ||
41 | #include <asm/rwsem.h> | ||
42 | |||
43 | /* In all implementations count != 0 means locked */ | ||
44 | static inline int rwsem_is_locked(struct rw_semaphore *sem) | ||
45 | { | ||
46 | return sem->count != 0; | ||
47 | } | ||
48 | |||
49 | #endif | ||
50 | |||
51 | /* Common initializer macros and functions */ | ||
52 | |||
53 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
54 | # define __RWSEM_DEP_MAP_INIT(lockname) , .dep_map = { .name = #lockname } | ||
55 | #else | ||
56 | # define __RWSEM_DEP_MAP_INIT(lockname) | ||
23 | #endif | 57 | #endif |
24 | 58 | ||
59 | #define __RWSEM_INITIALIZER(name) \ | ||
60 | { RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED(name.wait_lock), \ | ||
61 | LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) } | ||
62 | |||
63 | #define DECLARE_RWSEM(name) \ | ||
64 | struct rw_semaphore name = __RWSEM_INITIALIZER(name) | ||
65 | |||
66 | extern void __init_rwsem(struct rw_semaphore *sem, const char *name, | ||
67 | struct lock_class_key *key); | ||
68 | |||
69 | #define init_rwsem(sem) \ | ||
70 | do { \ | ||
71 | static struct lock_class_key __key; \ | ||
72 | \ | ||
73 | __init_rwsem((sem), #sem, &__key); \ | ||
74 | } while (0) | ||
75 | |||
25 | /* | 76 | /* |
26 | * lock for reading | 77 | * lock for reading |
27 | */ | 78 | */ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 777d8a5ed06b..4b601be3dace 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1058,6 +1058,7 @@ struct sched_class { | |||
1058 | void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags); | 1058 | void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags); |
1059 | void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags); | 1059 | void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags); |
1060 | void (*yield_task) (struct rq *rq); | 1060 | void (*yield_task) (struct rq *rq); |
1061 | bool (*yield_to_task) (struct rq *rq, struct task_struct *p, bool preempt); | ||
1061 | 1062 | ||
1062 | void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int flags); | 1063 | void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int flags); |
1063 | 1064 | ||
@@ -1084,12 +1085,10 @@ struct sched_class { | |||
1084 | void (*task_tick) (struct rq *rq, struct task_struct *p, int queued); | 1085 | void (*task_tick) (struct rq *rq, struct task_struct *p, int queued); |
1085 | void (*task_fork) (struct task_struct *p); | 1086 | void (*task_fork) (struct task_struct *p); |
1086 | 1087 | ||
1087 | void (*switched_from) (struct rq *this_rq, struct task_struct *task, | 1088 | void (*switched_from) (struct rq *this_rq, struct task_struct *task); |
1088 | int running); | 1089 | void (*switched_to) (struct rq *this_rq, struct task_struct *task); |
1089 | void (*switched_to) (struct rq *this_rq, struct task_struct *task, | ||
1090 | int running); | ||
1091 | void (*prio_changed) (struct rq *this_rq, struct task_struct *task, | 1090 | void (*prio_changed) (struct rq *this_rq, struct task_struct *task, |
1092 | int oldprio, int running); | 1091 | int oldprio); |
1093 | 1092 | ||
1094 | unsigned int (*get_rr_interval) (struct rq *rq, | 1093 | unsigned int (*get_rr_interval) (struct rq *rq, |
1095 | struct task_struct *task); | 1094 | struct task_struct *task); |
@@ -1472,6 +1471,7 @@ struct task_struct { | |||
1472 | #ifdef CONFIG_NUMA | 1471 | #ifdef CONFIG_NUMA |
1473 | struct mempolicy *mempolicy; /* Protected by alloc_lock */ | 1472 | struct mempolicy *mempolicy; /* Protected by alloc_lock */ |
1474 | short il_next; | 1473 | short il_next; |
1474 | short pref_node_fork; | ||
1475 | #endif | 1475 | #endif |
1476 | atomic_t fs_excl; /* holding fs exclusive resources */ | 1476 | atomic_t fs_excl; /* holding fs exclusive resources */ |
1477 | struct rcu_head rcu; | 1477 | struct rcu_head rcu; |
@@ -1715,7 +1715,6 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t * | |||
1715 | /* | 1715 | /* |
1716 | * Per process flags | 1716 | * Per process flags |
1717 | */ | 1717 | */ |
1718 | #define PF_KSOFTIRQD 0x00000001 /* I am ksoftirqd */ | ||
1719 | #define PF_STARTING 0x00000002 /* being created */ | 1718 | #define PF_STARTING 0x00000002 /* being created */ |
1720 | #define PF_EXITING 0x00000004 /* getting shut down */ | 1719 | #define PF_EXITING 0x00000004 /* getting shut down */ |
1721 | #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ | 1720 | #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ |
@@ -1945,8 +1944,6 @@ int sched_rt_handler(struct ctl_table *table, int write, | |||
1945 | void __user *buffer, size_t *lenp, | 1944 | void __user *buffer, size_t *lenp, |
1946 | loff_t *ppos); | 1945 | loff_t *ppos); |
1947 | 1946 | ||
1948 | extern unsigned int sysctl_sched_compat_yield; | ||
1949 | |||
1950 | #ifdef CONFIG_SCHED_AUTOGROUP | 1947 | #ifdef CONFIG_SCHED_AUTOGROUP |
1951 | extern unsigned int sysctl_sched_autogroup_enabled; | 1948 | extern unsigned int sysctl_sched_autogroup_enabled; |
1952 | 1949 | ||
@@ -1977,6 +1974,7 @@ static inline int rt_mutex_getprio(struct task_struct *p) | |||
1977 | # define rt_mutex_adjust_pi(p) do { } while (0) | 1974 | # define rt_mutex_adjust_pi(p) do { } while (0) |
1978 | #endif | 1975 | #endif |
1979 | 1976 | ||
1977 | extern bool yield_to(struct task_struct *p, bool preempt); | ||
1980 | extern void set_user_nice(struct task_struct *p, long nice); | 1978 | extern void set_user_nice(struct task_struct *p, long nice); |
1981 | extern int task_prio(const struct task_struct *p); | 1979 | extern int task_prio(const struct task_struct *p); |
1982 | extern int task_nice(const struct task_struct *p); | 1980 | extern int task_nice(const struct task_struct *p); |
@@ -2049,7 +2047,7 @@ extern void release_uids(struct user_namespace *ns); | |||
2049 | 2047 | ||
2050 | #include <asm/current.h> | 2048 | #include <asm/current.h> |
2051 | 2049 | ||
2052 | extern void do_timer(unsigned long ticks); | 2050 | extern void xtime_update(unsigned long ticks); |
2053 | 2051 | ||
2054 | extern int wake_up_state(struct task_struct *tsk, unsigned int state); | 2052 | extern int wake_up_state(struct task_struct *tsk, unsigned int state); |
2055 | extern int wake_up_process(struct task_struct *tsk); | 2053 | extern int wake_up_process(struct task_struct *tsk); |
@@ -2578,13 +2576,6 @@ static inline void inc_syscw(struct task_struct *tsk) | |||
2578 | #define TASK_SIZE_OF(tsk) TASK_SIZE | 2576 | #define TASK_SIZE_OF(tsk) TASK_SIZE |
2579 | #endif | 2577 | #endif |
2580 | 2578 | ||
2581 | /* | ||
2582 | * Call the function if the target task is executing on a CPU right now: | ||
2583 | */ | ||
2584 | extern void task_oncpu_function_call(struct task_struct *p, | ||
2585 | void (*func) (void *info), void *info); | ||
2586 | |||
2587 | |||
2588 | #ifdef CONFIG_MM_OWNER | 2579 | #ifdef CONFIG_MM_OWNER |
2589 | extern void mm_update_next_owner(struct mm_struct *mm); | 2580 | extern void mm_update_next_owner(struct mm_struct *mm); |
2590 | extern void mm_init_owner(struct mm_struct *mm, struct task_struct *p); | 2581 | extern void mm_init_owner(struct mm_struct *mm, struct task_struct *p); |
diff --git a/include/linux/security.h b/include/linux/security.h index b2b7f9749f5e..56cac520d014 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/fs.h> | 25 | #include <linux/fs.h> |
26 | #include <linux/fsnotify.h> | 26 | #include <linux/fsnotify.h> |
27 | #include <linux/binfmts.h> | 27 | #include <linux/binfmts.h> |
28 | #include <linux/dcache.h> | ||
28 | #include <linux/signal.h> | 29 | #include <linux/signal.h> |
29 | #include <linux/resource.h> | 30 | #include <linux/resource.h> |
30 | #include <linux/sem.h> | 31 | #include <linux/sem.h> |
@@ -53,7 +54,7 @@ struct audit_krule; | |||
53 | */ | 54 | */ |
54 | extern int cap_capable(struct task_struct *tsk, const struct cred *cred, | 55 | extern int cap_capable(struct task_struct *tsk, const struct cred *cred, |
55 | int cap, int audit); | 56 | int cap, int audit); |
56 | extern int cap_settime(struct timespec *ts, struct timezone *tz); | 57 | extern int cap_settime(const struct timespec *ts, const struct timezone *tz); |
57 | extern int cap_ptrace_access_check(struct task_struct *child, unsigned int mode); | 58 | extern int cap_ptrace_access_check(struct task_struct *child, unsigned int mode); |
58 | extern int cap_ptrace_traceme(struct task_struct *parent); | 59 | extern int cap_ptrace_traceme(struct task_struct *parent); |
59 | extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 60 | extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
@@ -267,6 +268,12 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
267 | * @orig the original mount data copied from userspace. | 268 | * @orig the original mount data copied from userspace. |
268 | * @copy copied data which will be passed to the security module. | 269 | * @copy copied data which will be passed to the security module. |
269 | * Returns 0 if the copy was successful. | 270 | * Returns 0 if the copy was successful. |
271 | * @sb_remount: | ||
272 | * Extracts security system specifc mount options and verifys no changes | ||
273 | * are being made to those options. | ||
274 | * @sb superblock being remounted | ||
275 | * @data contains the filesystem-specific data. | ||
276 | * Return 0 if permission is granted. | ||
270 | * @sb_umount: | 277 | * @sb_umount: |
271 | * Check permission before the @mnt file system is unmounted. | 278 | * Check permission before the @mnt file system is unmounted. |
272 | * @mnt contains the mounted file system. | 279 | * @mnt contains the mounted file system. |
@@ -315,6 +322,7 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
315 | * then it should return -EOPNOTSUPP to skip this processing. | 322 | * then it should return -EOPNOTSUPP to skip this processing. |
316 | * @inode contains the inode structure of the newly created inode. | 323 | * @inode contains the inode structure of the newly created inode. |
317 | * @dir contains the inode structure of the parent directory. | 324 | * @dir contains the inode structure of the parent directory. |
325 | * @qstr contains the last path component of the new object | ||
318 | * @name will be set to the allocated name suffix (e.g. selinux). | 326 | * @name will be set to the allocated name suffix (e.g. selinux). |
319 | * @value will be set to the allocated attribute value. | 327 | * @value will be set to the allocated attribute value. |
320 | * @len will be set to the length of the value. | 328 | * @len will be set to the length of the value. |
@@ -1257,12 +1265,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
1257 | * @cap contains the capability <include/linux/capability.h>. | 1265 | * @cap contains the capability <include/linux/capability.h>. |
1258 | * @audit: Whether to write an audit message or not | 1266 | * @audit: Whether to write an audit message or not |
1259 | * Return 0 if the capability is granted for @tsk. | 1267 | * Return 0 if the capability is granted for @tsk. |
1260 | * @sysctl: | ||
1261 | * Check permission before accessing the @table sysctl variable in the | ||
1262 | * manner specified by @op. | ||
1263 | * @table contains the ctl_table structure for the sysctl variable. | ||
1264 | * @op contains the operation (001 = search, 002 = write, 004 = read). | ||
1265 | * Return 0 if permission is granted. | ||
1266 | * @syslog: | 1268 | * @syslog: |
1267 | * Check permission before accessing the kernel message ring or changing | 1269 | * Check permission before accessing the kernel message ring or changing |
1268 | * logging to the console. | 1270 | * logging to the console. |
@@ -1383,11 +1385,10 @@ struct security_operations { | |||
1383 | const kernel_cap_t *permitted); | 1385 | const kernel_cap_t *permitted); |
1384 | int (*capable) (struct task_struct *tsk, const struct cred *cred, | 1386 | int (*capable) (struct task_struct *tsk, const struct cred *cred, |
1385 | int cap, int audit); | 1387 | int cap, int audit); |
1386 | int (*sysctl) (struct ctl_table *table, int op); | ||
1387 | int (*quotactl) (int cmds, int type, int id, struct super_block *sb); | 1388 | int (*quotactl) (int cmds, int type, int id, struct super_block *sb); |
1388 | int (*quota_on) (struct dentry *dentry); | 1389 | int (*quota_on) (struct dentry *dentry); |
1389 | int (*syslog) (int type); | 1390 | int (*syslog) (int type); |
1390 | int (*settime) (struct timespec *ts, struct timezone *tz); | 1391 | int (*settime) (const struct timespec *ts, const struct timezone *tz); |
1391 | int (*vm_enough_memory) (struct mm_struct *mm, long pages); | 1392 | int (*vm_enough_memory) (struct mm_struct *mm, long pages); |
1392 | 1393 | ||
1393 | int (*bprm_set_creds) (struct linux_binprm *bprm); | 1394 | int (*bprm_set_creds) (struct linux_binprm *bprm); |
@@ -1399,6 +1400,7 @@ struct security_operations { | |||
1399 | int (*sb_alloc_security) (struct super_block *sb); | 1400 | int (*sb_alloc_security) (struct super_block *sb); |
1400 | void (*sb_free_security) (struct super_block *sb); | 1401 | void (*sb_free_security) (struct super_block *sb); |
1401 | int (*sb_copy_data) (char *orig, char *copy); | 1402 | int (*sb_copy_data) (char *orig, char *copy); |
1403 | int (*sb_remount) (struct super_block *sb, void *data); | ||
1402 | int (*sb_kern_mount) (struct super_block *sb, int flags, void *data); | 1404 | int (*sb_kern_mount) (struct super_block *sb, int flags, void *data); |
1403 | int (*sb_show_options) (struct seq_file *m, struct super_block *sb); | 1405 | int (*sb_show_options) (struct seq_file *m, struct super_block *sb); |
1404 | int (*sb_statfs) (struct dentry *dentry); | 1406 | int (*sb_statfs) (struct dentry *dentry); |
@@ -1435,7 +1437,8 @@ struct security_operations { | |||
1435 | int (*inode_alloc_security) (struct inode *inode); | 1437 | int (*inode_alloc_security) (struct inode *inode); |
1436 | void (*inode_free_security) (struct inode *inode); | 1438 | void (*inode_free_security) (struct inode *inode); |
1437 | int (*inode_init_security) (struct inode *inode, struct inode *dir, | 1439 | int (*inode_init_security) (struct inode *inode, struct inode *dir, |
1438 | char **name, void **value, size_t *len); | 1440 | const struct qstr *qstr, char **name, |
1441 | void **value, size_t *len); | ||
1439 | int (*inode_create) (struct inode *dir, | 1442 | int (*inode_create) (struct inode *dir, |
1440 | struct dentry *dentry, int mode); | 1443 | struct dentry *dentry, int mode); |
1441 | int (*inode_link) (struct dentry *old_dentry, | 1444 | int (*inode_link) (struct dentry *old_dentry, |
@@ -1623,7 +1626,7 @@ struct security_operations { | |||
1623 | int (*xfrm_policy_lookup) (struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); | 1626 | int (*xfrm_policy_lookup) (struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); |
1624 | int (*xfrm_state_pol_flow_match) (struct xfrm_state *x, | 1627 | int (*xfrm_state_pol_flow_match) (struct xfrm_state *x, |
1625 | struct xfrm_policy *xp, | 1628 | struct xfrm_policy *xp, |
1626 | struct flowi *fl); | 1629 | const struct flowi *fl); |
1627 | int (*xfrm_decode_session) (struct sk_buff *skb, u32 *secid, int ckall); | 1630 | int (*xfrm_decode_session) (struct sk_buff *skb, u32 *secid, int ckall); |
1628 | #endif /* CONFIG_SECURITY_NETWORK_XFRM */ | 1631 | #endif /* CONFIG_SECURITY_NETWORK_XFRM */ |
1629 | 1632 | ||
@@ -1665,11 +1668,10 @@ int security_capset(struct cred *new, const struct cred *old, | |||
1665 | int security_capable(const struct cred *cred, int cap); | 1668 | int security_capable(const struct cred *cred, int cap); |
1666 | int security_real_capable(struct task_struct *tsk, int cap); | 1669 | int security_real_capable(struct task_struct *tsk, int cap); |
1667 | int security_real_capable_noaudit(struct task_struct *tsk, int cap); | 1670 | int security_real_capable_noaudit(struct task_struct *tsk, int cap); |
1668 | int security_sysctl(struct ctl_table *table, int op); | ||
1669 | int security_quotactl(int cmds, int type, int id, struct super_block *sb); | 1671 | int security_quotactl(int cmds, int type, int id, struct super_block *sb); |
1670 | int security_quota_on(struct dentry *dentry); | 1672 | int security_quota_on(struct dentry *dentry); |
1671 | int security_syslog(int type); | 1673 | int security_syslog(int type); |
1672 | int security_settime(struct timespec *ts, struct timezone *tz); | 1674 | int security_settime(const struct timespec *ts, const struct timezone *tz); |
1673 | int security_vm_enough_memory(long pages); | 1675 | int security_vm_enough_memory(long pages); |
1674 | int security_vm_enough_memory_mm(struct mm_struct *mm, long pages); | 1676 | int security_vm_enough_memory_mm(struct mm_struct *mm, long pages); |
1675 | int security_vm_enough_memory_kern(long pages); | 1677 | int security_vm_enough_memory_kern(long pages); |
@@ -1681,6 +1683,7 @@ int security_bprm_secureexec(struct linux_binprm *bprm); | |||
1681 | int security_sb_alloc(struct super_block *sb); | 1683 | int security_sb_alloc(struct super_block *sb); |
1682 | void security_sb_free(struct super_block *sb); | 1684 | void security_sb_free(struct super_block *sb); |
1683 | int security_sb_copy_data(char *orig, char *copy); | 1685 | int security_sb_copy_data(char *orig, char *copy); |
1686 | int security_sb_remount(struct super_block *sb, void *data); | ||
1684 | int security_sb_kern_mount(struct super_block *sb, int flags, void *data); | 1687 | int security_sb_kern_mount(struct super_block *sb, int flags, void *data); |
1685 | int security_sb_show_options(struct seq_file *m, struct super_block *sb); | 1688 | int security_sb_show_options(struct seq_file *m, struct super_block *sb); |
1686 | int security_sb_statfs(struct dentry *dentry); | 1689 | int security_sb_statfs(struct dentry *dentry); |
@@ -1696,7 +1699,8 @@ int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts); | |||
1696 | int security_inode_alloc(struct inode *inode); | 1699 | int security_inode_alloc(struct inode *inode); |
1697 | void security_inode_free(struct inode *inode); | 1700 | void security_inode_free(struct inode *inode); |
1698 | int security_inode_init_security(struct inode *inode, struct inode *dir, | 1701 | int security_inode_init_security(struct inode *inode, struct inode *dir, |
1699 | char **name, void **value, size_t *len); | 1702 | const struct qstr *qstr, char **name, |
1703 | void **value, size_t *len); | ||
1700 | int security_inode_create(struct inode *dir, struct dentry *dentry, int mode); | 1704 | int security_inode_create(struct inode *dir, struct dentry *dentry, int mode); |
1701 | int security_inode_link(struct dentry *old_dentry, struct inode *dir, | 1705 | int security_inode_link(struct dentry *old_dentry, struct inode *dir, |
1702 | struct dentry *new_dentry); | 1706 | struct dentry *new_dentry); |
@@ -1883,11 +1887,6 @@ int security_real_capable_noaudit(struct task_struct *tsk, int cap) | |||
1883 | return ret; | 1887 | return ret; |
1884 | } | 1888 | } |
1885 | 1889 | ||
1886 | static inline int security_sysctl(struct ctl_table *table, int op) | ||
1887 | { | ||
1888 | return 0; | ||
1889 | } | ||
1890 | |||
1891 | static inline int security_quotactl(int cmds, int type, int id, | 1890 | static inline int security_quotactl(int cmds, int type, int id, |
1892 | struct super_block *sb) | 1891 | struct super_block *sb) |
1893 | { | 1892 | { |
@@ -1904,7 +1903,8 @@ static inline int security_syslog(int type) | |||
1904 | return 0; | 1903 | return 0; |
1905 | } | 1904 | } |
1906 | 1905 | ||
1907 | static inline int security_settime(struct timespec *ts, struct timezone *tz) | 1906 | static inline int security_settime(const struct timespec *ts, |
1907 | const struct timezone *tz) | ||
1908 | { | 1908 | { |
1909 | return cap_settime(ts, tz); | 1909 | return cap_settime(ts, tz); |
1910 | } | 1910 | } |
@@ -1964,6 +1964,11 @@ static inline int security_sb_copy_data(char *orig, char *copy) | |||
1964 | return 0; | 1964 | return 0; |
1965 | } | 1965 | } |
1966 | 1966 | ||
1967 | static inline int security_sb_remount(struct super_block *sb, void *data) | ||
1968 | { | ||
1969 | return 0; | ||
1970 | } | ||
1971 | |||
1967 | static inline int security_sb_kern_mount(struct super_block *sb, int flags, void *data) | 1972 | static inline int security_sb_kern_mount(struct super_block *sb, int flags, void *data) |
1968 | { | 1973 | { |
1969 | return 0; | 1974 | return 0; |
@@ -2023,6 +2028,7 @@ static inline void security_inode_free(struct inode *inode) | |||
2023 | 2028 | ||
2024 | static inline int security_inode_init_security(struct inode *inode, | 2029 | static inline int security_inode_init_security(struct inode *inode, |
2025 | struct inode *dir, | 2030 | struct inode *dir, |
2031 | const struct qstr *qstr, | ||
2026 | char **name, | 2032 | char **name, |
2027 | void **value, | 2033 | void **value, |
2028 | size_t *len) | 2034 | size_t *len) |
@@ -2761,7 +2767,8 @@ int security_xfrm_state_delete(struct xfrm_state *x); | |||
2761 | void security_xfrm_state_free(struct xfrm_state *x); | 2767 | void security_xfrm_state_free(struct xfrm_state *x); |
2762 | int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); | 2768 | int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); |
2763 | int security_xfrm_state_pol_flow_match(struct xfrm_state *x, | 2769 | int security_xfrm_state_pol_flow_match(struct xfrm_state *x, |
2764 | struct xfrm_policy *xp, struct flowi *fl); | 2770 | struct xfrm_policy *xp, |
2771 | const struct flowi *fl); | ||
2765 | int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid); | 2772 | int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid); |
2766 | void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl); | 2773 | void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl); |
2767 | 2774 | ||
@@ -2813,7 +2820,7 @@ static inline int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_s | |||
2813 | } | 2820 | } |
2814 | 2821 | ||
2815 | static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x, | 2822 | static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x, |
2816 | struct xfrm_policy *xp, struct flowi *fl) | 2823 | struct xfrm_policy *xp, const struct flowi *fl) |
2817 | { | 2824 | { |
2818 | return 1; | 2825 | return 1; |
2819 | } | 2826 | } |
diff --git a/include/linux/serial_sci.h b/include/linux/serial_sci.h index 1630d9cae22a..a2afc9fbe186 100644 --- a/include/linux/serial_sci.h +++ b/include/linux/serial_sci.h | |||
@@ -34,28 +34,32 @@ enum { | |||
34 | SCIx_NR_IRQS, | 34 | SCIx_NR_IRQS, |
35 | }; | 35 | }; |
36 | 36 | ||
37 | #define SCIx_IRQ_MUXED(irq) \ | ||
38 | { \ | ||
39 | [SCIx_ERI_IRQ] = (irq), \ | ||
40 | [SCIx_RXI_IRQ] = (irq), \ | ||
41 | [SCIx_TXI_IRQ] = (irq), \ | ||
42 | [SCIx_BRI_IRQ] = (irq), \ | ||
43 | } | ||
44 | |||
37 | struct device; | 45 | struct device; |
38 | 46 | ||
39 | /* | 47 | /* |
40 | * Platform device specific platform_data struct | 48 | * Platform device specific platform_data struct |
41 | */ | 49 | */ |
42 | struct plat_sci_port { | 50 | struct plat_sci_port { |
43 | void __iomem *membase; /* io cookie */ | ||
44 | unsigned long mapbase; /* resource base */ | 51 | unsigned long mapbase; /* resource base */ |
45 | unsigned int irqs[SCIx_NR_IRQS]; /* ERI, RXI, TXI, BRI */ | 52 | unsigned int irqs[SCIx_NR_IRQS]; /* ERI, RXI, TXI, BRI */ |
46 | unsigned int type; /* SCI / SCIF / IRDA */ | 53 | unsigned int type; /* SCI / SCIF / IRDA */ |
47 | upf_t flags; /* UPF_* flags */ | 54 | upf_t flags; /* UPF_* flags */ |
48 | char *clk; /* clock string */ | ||
49 | 55 | ||
50 | unsigned int scbrr_algo_id; /* SCBRR calculation algo */ | 56 | unsigned int scbrr_algo_id; /* SCBRR calculation algo */ |
51 | unsigned int scscr; /* SCSCR initialization */ | 57 | unsigned int scscr; /* SCSCR initialization */ |
52 | 58 | ||
53 | struct device *dma_dev; | 59 | struct device *dma_dev; |
54 | 60 | ||
55 | #ifdef CONFIG_SERIAL_SH_SCI_DMA | 61 | unsigned int dma_slave_tx; |
56 | unsigned int dma_slave_tx; | 62 | unsigned int dma_slave_rx; |
57 | unsigned int dma_slave_rx; | ||
58 | #endif | ||
59 | }; | 63 | }; |
60 | 64 | ||
61 | #endif /* __LINUX_SERIAL_SCI_H */ | 65 | #endif /* __LINUX_SERIAL_SCI_H */ |
diff --git a/include/linux/sigma.h b/include/linux/sigma.h new file mode 100644 index 000000000000..e2accb3164d8 --- /dev/null +++ b/include/linux/sigma.h | |||
@@ -0,0 +1,60 @@ | |||
1 | /* | ||
2 | * Load firmware files from Analog Devices SigmaStudio | ||
3 | * | ||
4 | * Copyright 2009-2011 Analog Devices Inc. | ||
5 | * | ||
6 | * Licensed under the GPL-2 or later. | ||
7 | */ | ||
8 | |||
9 | #ifndef __SIGMA_FIRMWARE_H__ | ||
10 | #define __SIGMA_FIRMWARE_H__ | ||
11 | |||
12 | #include <linux/firmware.h> | ||
13 | #include <linux/types.h> | ||
14 | |||
15 | struct i2c_client; | ||
16 | |||
17 | #define SIGMA_MAGIC "ADISIGM" | ||
18 | |||
19 | struct sigma_firmware { | ||
20 | const struct firmware *fw; | ||
21 | size_t pos; | ||
22 | }; | ||
23 | |||
24 | struct sigma_firmware_header { | ||
25 | unsigned char magic[7]; | ||
26 | u8 version; | ||
27 | u32 crc; | ||
28 | }; | ||
29 | |||
30 | enum { | ||
31 | SIGMA_ACTION_WRITEXBYTES = 0, | ||
32 | SIGMA_ACTION_WRITESINGLE, | ||
33 | SIGMA_ACTION_WRITESAFELOAD, | ||
34 | SIGMA_ACTION_DELAY, | ||
35 | SIGMA_ACTION_PLLWAIT, | ||
36 | SIGMA_ACTION_NOOP, | ||
37 | SIGMA_ACTION_END, | ||
38 | }; | ||
39 | |||
40 | struct sigma_action { | ||
41 | u8 instr; | ||
42 | u8 len_hi; | ||
43 | u16 len; | ||
44 | u16 addr; | ||
45 | unsigned char payload[]; | ||
46 | }; | ||
47 | |||
48 | static inline u32 sigma_action_len(struct sigma_action *sa) | ||
49 | { | ||
50 | return (sa->len_hi << 16) | sa->len; | ||
51 | } | ||
52 | |||
53 | static inline size_t sigma_action_size(struct sigma_action *sa, u32 payload_len) | ||
54 | { | ||
55 | return sizeof(*sa) + payload_len + (payload_len % 2); | ||
56 | } | ||
57 | |||
58 | extern int process_sigma_firmware(struct i2c_client *client, const char *name); | ||
59 | |||
60 | #endif | ||
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index bf221d65d9ad..24cfa626931e 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -388,10 +388,7 @@ struct sk_buff { | |||
388 | kmemcheck_bitfield_begin(flags2); | 388 | kmemcheck_bitfield_begin(flags2); |
389 | __u16 queue_mapping:16; | 389 | __u16 queue_mapping:16; |
390 | #ifdef CONFIG_IPV6_NDISC_NODETYPE | 390 | #ifdef CONFIG_IPV6_NDISC_NODETYPE |
391 | __u8 ndisc_nodetype:2, | 391 | __u8 ndisc_nodetype:2; |
392 | deliver_no_wcard:1; | ||
393 | #else | ||
394 | __u8 deliver_no_wcard:1; | ||
395 | #endif | 392 | #endif |
396 | __u8 ooo_okay:1; | 393 | __u8 ooo_okay:1; |
397 | kmemcheck_bitfield_end(flags2); | 394 | kmemcheck_bitfield_end(flags2); |
@@ -1801,6 +1798,15 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
1801 | prefetch(skb->prev), (skb != (struct sk_buff *)(queue)); \ | 1798 | prefetch(skb->prev), (skb != (struct sk_buff *)(queue)); \ |
1802 | skb = skb->prev) | 1799 | skb = skb->prev) |
1803 | 1800 | ||
1801 | #define skb_queue_reverse_walk_safe(queue, skb, tmp) \ | ||
1802 | for (skb = (queue)->prev, tmp = skb->prev; \ | ||
1803 | skb != (struct sk_buff *)(queue); \ | ||
1804 | skb = tmp, tmp = skb->prev) | ||
1805 | |||
1806 | #define skb_queue_reverse_walk_from_safe(queue, skb, tmp) \ | ||
1807 | for (tmp = skb->prev; \ | ||
1808 | skb != (struct sk_buff *)(queue); \ | ||
1809 | skb = tmp, tmp = skb->prev) | ||
1804 | 1810 | ||
1805 | static inline bool skb_has_frag_list(const struct sk_buff *skb) | 1811 | static inline bool skb_has_frag_list(const struct sk_buff *skb) |
1806 | { | 1812 | { |
@@ -1868,7 +1874,7 @@ extern void skb_split(struct sk_buff *skb, | |||
1868 | extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, | 1874 | extern int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, |
1869 | int shiftlen); | 1875 | int shiftlen); |
1870 | 1876 | ||
1871 | extern struct sk_buff *skb_segment(struct sk_buff *skb, int features); | 1877 | extern struct sk_buff *skb_segment(struct sk_buff *skb, u32 features); |
1872 | 1878 | ||
1873 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, | 1879 | static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, |
1874 | int len, void *buffer) | 1880 | int len, void *buffer) |
diff --git a/include/linux/slab.h b/include/linux/slab.h index fa9086647eb7..ad4dd1c8d30a 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
@@ -105,7 +105,6 @@ void kmem_cache_destroy(struct kmem_cache *); | |||
105 | int kmem_cache_shrink(struct kmem_cache *); | 105 | int kmem_cache_shrink(struct kmem_cache *); |
106 | void kmem_cache_free(struct kmem_cache *, void *); | 106 | void kmem_cache_free(struct kmem_cache *, void *); |
107 | unsigned int kmem_cache_size(struct kmem_cache *); | 107 | unsigned int kmem_cache_size(struct kmem_cache *); |
108 | const char *kmem_cache_name(struct kmem_cache *); | ||
109 | 108 | ||
110 | /* | 109 | /* |
111 | * Please use this macro to create slab caches. Simply specify the | 110 | * Please use this macro to create slab caches. Simply specify the |
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 8b6e8ae5d5ca..45ca123e8002 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
@@ -32,10 +32,14 @@ enum stat_item { | |||
32 | DEACTIVATE_TO_TAIL, /* Cpu slab was moved to the tail of partials */ | 32 | DEACTIVATE_TO_TAIL, /* Cpu slab was moved to the tail of partials */ |
33 | DEACTIVATE_REMOTE_FREES,/* Slab contained remotely freed objects */ | 33 | DEACTIVATE_REMOTE_FREES,/* Slab contained remotely freed objects */ |
34 | ORDER_FALLBACK, /* Number of times fallback was necessary */ | 34 | ORDER_FALLBACK, /* Number of times fallback was necessary */ |
35 | CMPXCHG_DOUBLE_CPU_FAIL,/* Failure of this_cpu_cmpxchg_double */ | ||
35 | NR_SLUB_STAT_ITEMS }; | 36 | NR_SLUB_STAT_ITEMS }; |
36 | 37 | ||
37 | struct kmem_cache_cpu { | 38 | struct kmem_cache_cpu { |
38 | void **freelist; /* Pointer to first free per cpu object */ | 39 | void **freelist; /* Pointer to next available object */ |
40 | #ifdef CONFIG_CMPXCHG_LOCAL | ||
41 | unsigned long tid; /* Globally unique transaction id */ | ||
42 | #endif | ||
39 | struct page *page; /* The slab from which we are allocating */ | 43 | struct page *page; /* The slab from which we are allocating */ |
40 | int node; /* The node of the page (or -1 for debug) */ | 44 | int node; /* The node of the page (or -1 for debug) */ |
41 | #ifdef CONFIG_SLUB_STATS | 45 | #ifdef CONFIG_SLUB_STATS |
@@ -70,6 +74,7 @@ struct kmem_cache { | |||
70 | struct kmem_cache_cpu __percpu *cpu_slab; | 74 | struct kmem_cache_cpu __percpu *cpu_slab; |
71 | /* Used for retriving partial slabs etc */ | 75 | /* Used for retriving partial slabs etc */ |
72 | unsigned long flags; | 76 | unsigned long flags; |
77 | unsigned long min_partial; | ||
73 | int size; /* The size of an object including meta data */ | 78 | int size; /* The size of an object including meta data */ |
74 | int objsize; /* The size of an object without meta data */ | 79 | int objsize; /* The size of an object without meta data */ |
75 | int offset; /* Free pointer offset. */ | 80 | int offset; /* Free pointer offset. */ |
@@ -83,7 +88,7 @@ struct kmem_cache { | |||
83 | void (*ctor)(void *); | 88 | void (*ctor)(void *); |
84 | int inuse; /* Offset to metadata */ | 89 | int inuse; /* Offset to metadata */ |
85 | int align; /* Alignment */ | 90 | int align; /* Alignment */ |
86 | unsigned long min_partial; | 91 | int reserved; /* Reserved bytes at the end of slabs */ |
87 | const char *name; /* Name (only for display!) */ | 92 | const char *name; /* Name (only for display!) */ |
88 | struct list_head list; /* List of slab caches */ | 93 | struct list_head list; /* List of slab caches */ |
89 | #ifdef CONFIG_SYSFS | 94 | #ifdef CONFIG_SYSFS |
diff --git a/include/linux/smp.h b/include/linux/smp.h index 6dc95cac6b3d..48159dd320d0 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
@@ -114,6 +114,8 @@ int on_each_cpu(smp_call_func_t func, void *info, int wait); | |||
114 | void smp_prepare_boot_cpu(void); | 114 | void smp_prepare_boot_cpu(void); |
115 | 115 | ||
116 | extern unsigned int setup_max_cpus; | 116 | extern unsigned int setup_max_cpus; |
117 | extern void __init setup_nr_cpu_ids(void); | ||
118 | extern void __init smp_init(void); | ||
117 | 119 | ||
118 | #else /* !SMP */ | 120 | #else /* !SMP */ |
119 | 121 | ||
diff --git a/include/linux/smp_lock.h b/include/linux/smp_lock.h deleted file mode 100644 index 3a1988202731..000000000000 --- a/include/linux/smp_lock.h +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
1 | #ifndef __LINUX_SMPLOCK_H | ||
2 | #define __LINUX_SMPLOCK_H | ||
3 | |||
4 | #ifdef CONFIG_LOCK_KERNEL | ||
5 | #include <linux/sched.h> | ||
6 | |||
7 | extern int __lockfunc __reacquire_kernel_lock(void); | ||
8 | extern void __lockfunc __release_kernel_lock(void); | ||
9 | |||
10 | /* | ||
11 | * Release/re-acquire global kernel lock for the scheduler | ||
12 | */ | ||
13 | #define release_kernel_lock(tsk) do { \ | ||
14 | if (unlikely((tsk)->lock_depth >= 0)) \ | ||
15 | __release_kernel_lock(); \ | ||
16 | } while (0) | ||
17 | |||
18 | static inline int reacquire_kernel_lock(struct task_struct *task) | ||
19 | { | ||
20 | if (unlikely(task->lock_depth >= 0)) | ||
21 | return __reacquire_kernel_lock(); | ||
22 | return 0; | ||
23 | } | ||
24 | |||
25 | extern void __lockfunc | ||
26 | _lock_kernel(const char *func, const char *file, int line) | ||
27 | __acquires(kernel_lock); | ||
28 | |||
29 | extern void __lockfunc | ||
30 | _unlock_kernel(const char *func, const char *file, int line) | ||
31 | __releases(kernel_lock); | ||
32 | |||
33 | #define lock_kernel() do { \ | ||
34 | _lock_kernel(__func__, __FILE__, __LINE__); \ | ||
35 | } while (0) | ||
36 | |||
37 | #define unlock_kernel() do { \ | ||
38 | _unlock_kernel(__func__, __FILE__, __LINE__); \ | ||
39 | } while (0) | ||
40 | |||
41 | /* | ||
42 | * Various legacy drivers don't really need the BKL in a specific | ||
43 | * function, but they *do* need to know that the BKL became available. | ||
44 | * This function just avoids wrapping a bunch of lock/unlock pairs | ||
45 | * around code which doesn't really need it. | ||
46 | */ | ||
47 | static inline void cycle_kernel_lock(void) | ||
48 | { | ||
49 | lock_kernel(); | ||
50 | unlock_kernel(); | ||
51 | } | ||
52 | |||
53 | #else | ||
54 | |||
55 | #ifdef CONFIG_BKL /* provoke build bug if not set */ | ||
56 | #define lock_kernel() | ||
57 | #define unlock_kernel() | ||
58 | #define cycle_kernel_lock() do { } while(0) | ||
59 | #endif /* CONFIG_BKL */ | ||
60 | |||
61 | #define release_kernel_lock(task) do { } while(0) | ||
62 | #define reacquire_kernel_lock(task) 0 | ||
63 | |||
64 | #endif /* CONFIG_LOCK_KERNEL */ | ||
65 | #endif /* __LINUX_SMPLOCK_H */ | ||
diff --git a/include/linux/sockios.h b/include/linux/sockios.h index 241f179347d9..7997a506ad41 100644 --- a/include/linux/sockios.h +++ b/include/linux/sockios.h | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | /* Linux-specific socket ioctls */ | 23 | /* Linux-specific socket ioctls */ |
24 | #define SIOCINQ FIONREAD | 24 | #define SIOCINQ FIONREAD |
25 | #define SIOCOUTQ TIOCOUTQ | 25 | #define SIOCOUTQ TIOCOUTQ /* output queue size (not sent + not acked) */ |
26 | 26 | ||
27 | /* Routing table calls. */ | 27 | /* Routing table calls. */ |
28 | #define SIOCADDRT 0x890B /* add routing table entry */ | 28 | #define SIOCADDRT 0x890B /* add routing table entry */ |
@@ -83,6 +83,8 @@ | |||
83 | 83 | ||
84 | #define SIOCWANDEV 0x894A /* get/set netdev parameters */ | 84 | #define SIOCWANDEV 0x894A /* get/set netdev parameters */ |
85 | 85 | ||
86 | #define SIOCOUTQNSD 0x894B /* output queue size (not sent only) */ | ||
87 | |||
86 | /* ARP cache control calls. */ | 88 | /* ARP cache control calls. */ |
87 | /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ | 89 | /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ |
88 | #define SIOCDARP 0x8953 /* delete ARP table entry */ | 90 | #define SIOCDARP 0x8953 /* delete ARP table entry */ |
diff --git a/include/linux/spi/dw_spi.h b/include/linux/spi/dw_spi.h deleted file mode 100644 index 6cd10f6ad472..000000000000 --- a/include/linux/spi/dw_spi.h +++ /dev/null | |||
@@ -1,233 +0,0 @@ | |||
1 | #ifndef DW_SPI_HEADER_H | ||
2 | #define DW_SPI_HEADER_H | ||
3 | |||
4 | #include <linux/io.h> | ||
5 | |||
6 | /* Bit fields in CTRLR0 */ | ||
7 | #define SPI_DFS_OFFSET 0 | ||
8 | |||
9 | #define SPI_FRF_OFFSET 4 | ||
10 | #define SPI_FRF_SPI 0x0 | ||
11 | #define SPI_FRF_SSP 0x1 | ||
12 | #define SPI_FRF_MICROWIRE 0x2 | ||
13 | #define SPI_FRF_RESV 0x3 | ||
14 | |||
15 | #define SPI_MODE_OFFSET 6 | ||
16 | #define SPI_SCPH_OFFSET 6 | ||
17 | #define SPI_SCOL_OFFSET 7 | ||
18 | |||
19 | #define SPI_TMOD_OFFSET 8 | ||
20 | #define SPI_TMOD_MASK (0x3 << SPI_TMOD_OFFSET) | ||
21 | #define SPI_TMOD_TR 0x0 /* xmit & recv */ | ||
22 | #define SPI_TMOD_TO 0x1 /* xmit only */ | ||
23 | #define SPI_TMOD_RO 0x2 /* recv only */ | ||
24 | #define SPI_TMOD_EPROMREAD 0x3 /* eeprom read mode */ | ||
25 | |||
26 | #define SPI_SLVOE_OFFSET 10 | ||
27 | #define SPI_SRL_OFFSET 11 | ||
28 | #define SPI_CFS_OFFSET 12 | ||
29 | |||
30 | /* Bit fields in SR, 7 bits */ | ||
31 | #define SR_MASK 0x7f /* cover 7 bits */ | ||
32 | #define SR_BUSY (1 << 0) | ||
33 | #define SR_TF_NOT_FULL (1 << 1) | ||
34 | #define SR_TF_EMPT (1 << 2) | ||
35 | #define SR_RF_NOT_EMPT (1 << 3) | ||
36 | #define SR_RF_FULL (1 << 4) | ||
37 | #define SR_TX_ERR (1 << 5) | ||
38 | #define SR_DCOL (1 << 6) | ||
39 | |||
40 | /* Bit fields in ISR, IMR, RISR, 7 bits */ | ||
41 | #define SPI_INT_TXEI (1 << 0) | ||
42 | #define SPI_INT_TXOI (1 << 1) | ||
43 | #define SPI_INT_RXUI (1 << 2) | ||
44 | #define SPI_INT_RXOI (1 << 3) | ||
45 | #define SPI_INT_RXFI (1 << 4) | ||
46 | #define SPI_INT_MSTI (1 << 5) | ||
47 | |||
48 | /* TX RX interrupt level threshhold, max can be 256 */ | ||
49 | #define SPI_INT_THRESHOLD 32 | ||
50 | |||
51 | enum dw_ssi_type { | ||
52 | SSI_MOTO_SPI = 0, | ||
53 | SSI_TI_SSP, | ||
54 | SSI_NS_MICROWIRE, | ||
55 | }; | ||
56 | |||
57 | struct dw_spi_reg { | ||
58 | u32 ctrl0; | ||
59 | u32 ctrl1; | ||
60 | u32 ssienr; | ||
61 | u32 mwcr; | ||
62 | u32 ser; | ||
63 | u32 baudr; | ||
64 | u32 txfltr; | ||
65 | u32 rxfltr; | ||
66 | u32 txflr; | ||
67 | u32 rxflr; | ||
68 | u32 sr; | ||
69 | u32 imr; | ||
70 | u32 isr; | ||
71 | u32 risr; | ||
72 | u32 txoicr; | ||
73 | u32 rxoicr; | ||
74 | u32 rxuicr; | ||
75 | u32 msticr; | ||
76 | u32 icr; | ||
77 | u32 dmacr; | ||
78 | u32 dmatdlr; | ||
79 | u32 dmardlr; | ||
80 | u32 idr; | ||
81 | u32 version; | ||
82 | u32 dr; /* Currently oper as 32 bits, | ||
83 | though only low 16 bits matters */ | ||
84 | } __packed; | ||
85 | |||
86 | struct dw_spi; | ||
87 | struct dw_spi_dma_ops { | ||
88 | int (*dma_init)(struct dw_spi *dws); | ||
89 | void (*dma_exit)(struct dw_spi *dws); | ||
90 | int (*dma_transfer)(struct dw_spi *dws, int cs_change); | ||
91 | }; | ||
92 | |||
93 | struct dw_spi { | ||
94 | struct spi_master *master; | ||
95 | struct spi_device *cur_dev; | ||
96 | struct device *parent_dev; | ||
97 | enum dw_ssi_type type; | ||
98 | |||
99 | void __iomem *regs; | ||
100 | unsigned long paddr; | ||
101 | u32 iolen; | ||
102 | int irq; | ||
103 | u32 fifo_len; /* depth of the FIFO buffer */ | ||
104 | u32 max_freq; /* max bus freq supported */ | ||
105 | |||
106 | u16 bus_num; | ||
107 | u16 num_cs; /* supported slave numbers */ | ||
108 | |||
109 | /* Driver message queue */ | ||
110 | struct workqueue_struct *workqueue; | ||
111 | struct work_struct pump_messages; | ||
112 | spinlock_t lock; | ||
113 | struct list_head queue; | ||
114 | int busy; | ||
115 | int run; | ||
116 | |||
117 | /* Message Transfer pump */ | ||
118 | struct tasklet_struct pump_transfers; | ||
119 | |||
120 | /* Current message transfer state info */ | ||
121 | struct spi_message *cur_msg; | ||
122 | struct spi_transfer *cur_transfer; | ||
123 | struct chip_data *cur_chip; | ||
124 | struct chip_data *prev_chip; | ||
125 | size_t len; | ||
126 | void *tx; | ||
127 | void *tx_end; | ||
128 | void *rx; | ||
129 | void *rx_end; | ||
130 | int dma_mapped; | ||
131 | dma_addr_t rx_dma; | ||
132 | dma_addr_t tx_dma; | ||
133 | size_t rx_map_len; | ||
134 | size_t tx_map_len; | ||
135 | u8 n_bytes; /* current is a 1/2 bytes op */ | ||
136 | u8 max_bits_per_word; /* maxim is 16b */ | ||
137 | u32 dma_width; | ||
138 | int cs_change; | ||
139 | int (*write)(struct dw_spi *dws); | ||
140 | int (*read)(struct dw_spi *dws); | ||
141 | irqreturn_t (*transfer_handler)(struct dw_spi *dws); | ||
142 | void (*cs_control)(u32 command); | ||
143 | |||
144 | /* Dma info */ | ||
145 | int dma_inited; | ||
146 | struct dma_chan *txchan; | ||
147 | struct scatterlist tx_sgl; | ||
148 | struct dma_chan *rxchan; | ||
149 | struct scatterlist rx_sgl; | ||
150 | int dma_chan_done; | ||
151 | struct device *dma_dev; | ||
152 | dma_addr_t dma_addr; /* phy address of the Data register */ | ||
153 | struct dw_spi_dma_ops *dma_ops; | ||
154 | void *dma_priv; /* platform relate info */ | ||
155 | struct pci_dev *dmac; | ||
156 | |||
157 | /* Bus interface info */ | ||
158 | void *priv; | ||
159 | #ifdef CONFIG_DEBUG_FS | ||
160 | struct dentry *debugfs; | ||
161 | #endif | ||
162 | }; | ||
163 | |||
164 | #define dw_readl(dw, name) \ | ||
165 | __raw_readl(&(((struct dw_spi_reg *)dw->regs)->name)) | ||
166 | #define dw_writel(dw, name, val) \ | ||
167 | __raw_writel((val), &(((struct dw_spi_reg *)dw->regs)->name)) | ||
168 | #define dw_readw(dw, name) \ | ||
169 | __raw_readw(&(((struct dw_spi_reg *)dw->regs)->name)) | ||
170 | #define dw_writew(dw, name, val) \ | ||
171 | __raw_writew((val), &(((struct dw_spi_reg *)dw->regs)->name)) | ||
172 | |||
173 | static inline void spi_enable_chip(struct dw_spi *dws, int enable) | ||
174 | { | ||
175 | dw_writel(dws, ssienr, (enable ? 1 : 0)); | ||
176 | } | ||
177 | |||
178 | static inline void spi_set_clk(struct dw_spi *dws, u16 div) | ||
179 | { | ||
180 | dw_writel(dws, baudr, div); | ||
181 | } | ||
182 | |||
183 | static inline void spi_chip_sel(struct dw_spi *dws, u16 cs) | ||
184 | { | ||
185 | if (cs > dws->num_cs) | ||
186 | return; | ||
187 | |||
188 | if (dws->cs_control) | ||
189 | dws->cs_control(1); | ||
190 | |||
191 | dw_writel(dws, ser, 1 << cs); | ||
192 | } | ||
193 | |||
194 | /* Disable IRQ bits */ | ||
195 | static inline void spi_mask_intr(struct dw_spi *dws, u32 mask) | ||
196 | { | ||
197 | u32 new_mask; | ||
198 | |||
199 | new_mask = dw_readl(dws, imr) & ~mask; | ||
200 | dw_writel(dws, imr, new_mask); | ||
201 | } | ||
202 | |||
203 | /* Enable IRQ bits */ | ||
204 | static inline void spi_umask_intr(struct dw_spi *dws, u32 mask) | ||
205 | { | ||
206 | u32 new_mask; | ||
207 | |||
208 | new_mask = dw_readl(dws, imr) | mask; | ||
209 | dw_writel(dws, imr, new_mask); | ||
210 | } | ||
211 | |||
212 | /* | ||
213 | * Each SPI slave device to work with dw_api controller should | ||
214 | * has such a structure claiming its working mode (PIO/DMA etc), | ||
215 | * which can be save in the "controller_data" member of the | ||
216 | * struct spi_device | ||
217 | */ | ||
218 | struct dw_spi_chip { | ||
219 | u8 poll_mode; /* 0 for contoller polling mode */ | ||
220 | u8 type; /* SPI/SSP/Micrwire */ | ||
221 | u8 enable_dma; | ||
222 | void (*cs_control)(u32 command); | ||
223 | }; | ||
224 | |||
225 | extern int dw_spi_add_host(struct dw_spi *dws); | ||
226 | extern void dw_spi_remove_host(struct dw_spi *dws); | ||
227 | extern int dw_spi_suspend_host(struct dw_spi *dws); | ||
228 | extern int dw_spi_resume_host(struct dw_spi *dws); | ||
229 | extern void dw_spi_xfer_done(struct dw_spi *dws); | ||
230 | |||
231 | /* platform related setup */ | ||
232 | extern int dw_spi_mid_init(struct dw_spi *dws); /* Intel MID platforms */ | ||
233 | #endif /* DW_SPI_HEADER_H */ | ||
diff --git a/include/linux/spi/ifx_modem.h b/include/linux/spi/ifx_modem.h index a68f3b19d112..394fec9e7722 100644 --- a/include/linux/spi/ifx_modem.h +++ b/include/linux/spi/ifx_modem.h | |||
@@ -2,13 +2,18 @@ | |||
2 | #define LINUX_IFX_MODEM_H | 2 | #define LINUX_IFX_MODEM_H |
3 | 3 | ||
4 | struct ifx_modem_platform_data { | 4 | struct ifx_modem_platform_data { |
5 | unsigned short rst_out; /* modem reset out */ | 5 | unsigned short rst_out; /* modem reset out */ |
6 | unsigned short pwr_on; /* power on */ | 6 | unsigned short pwr_on; /* power on */ |
7 | unsigned short rst_pmu; /* reset modem */ | 7 | unsigned short rst_pmu; /* reset modem */ |
8 | unsigned short tx_pwr; /* modem power threshold */ | 8 | unsigned short tx_pwr; /* modem power threshold */ |
9 | unsigned short srdy; /* SRDY */ | 9 | unsigned short srdy; /* SRDY */ |
10 | unsigned short mrdy; /* MRDY */ | 10 | unsigned short mrdy; /* MRDY */ |
11 | unsigned short is_6160; /* Modem type */ | 11 | unsigned char modem_type; /* Modem type */ |
12 | unsigned long max_hz; /* max SPI frequency */ | ||
13 | unsigned short use_dma:1; /* spi protocol driver supplies | ||
14 | dma-able addrs */ | ||
12 | }; | 15 | }; |
16 | #define IFX_MODEM_6160 1 | ||
17 | #define IFX_MODEM_6260 2 | ||
13 | 18 | ||
14 | #endif | 19 | #endif |
diff --git a/include/linux/spi/mcp23s08.h b/include/linux/spi/mcp23s08.h index 22ef107d7704..c42cff8ca191 100644 --- a/include/linux/spi/mcp23s08.h +++ b/include/linux/spi/mcp23s08.h | |||
@@ -2,21 +2,24 @@ | |||
2 | /* FIXME driver should be able to handle IRQs... */ | 2 | /* FIXME driver should be able to handle IRQs... */ |
3 | 3 | ||
4 | struct mcp23s08_chip_info { | 4 | struct mcp23s08_chip_info { |
5 | bool is_present; /* true iff populated */ | 5 | bool is_present; /* true if populated */ |
6 | u8 pullups; /* BIT(x) means enable pullup x */ | 6 | unsigned pullups; /* BIT(x) means enable pullup x */ |
7 | }; | 7 | }; |
8 | 8 | ||
9 | struct mcp23s08_platform_data { | 9 | struct mcp23s08_platform_data { |
10 | /* Four slaves (numbered 0..3) can share one SPI chipselect, and | 10 | /* For mcp23s08, up to 4 slaves (numbered 0..3) can share one SPI |
11 | * will provide 8..32 GPIOs using 1..4 gpio_chip instances. | 11 | * chipselect, each providing 1 gpio_chip instance with 8 gpios. |
12 | * For mpc23s17, up to 8 slaves (numbered 0..7) can share one SPI | ||
13 | * chipselect, each providing 1 gpio_chip (port A + port B) with | ||
14 | * 16 gpios. | ||
12 | */ | 15 | */ |
13 | struct mcp23s08_chip_info chip[4]; | 16 | struct mcp23s08_chip_info chip[8]; |
14 | 17 | ||
15 | /* "base" is the number of the first GPIO. Dynamic assignment is | 18 | /* "base" is the number of the first GPIO. Dynamic assignment is |
16 | * not currently supported, and even if there are gaps in chip | 19 | * not currently supported, and even if there are gaps in chip |
17 | * addressing the GPIO numbers are sequential .. so for example | 20 | * addressing the GPIO numbers are sequential .. so for example |
18 | * if only slaves 0 and 3 are present, their GPIOs range from | 21 | * if only slaves 0 and 3 are present, their GPIOs range from |
19 | * base to base+15. | 22 | * base to base+15 (or base+31 for s17 variant). |
20 | */ | 23 | */ |
21 | unsigned base; | 24 | unsigned base; |
22 | 25 | ||
diff --git a/include/linux/spi/spi_oc_tiny.h b/include/linux/spi/spi_oc_tiny.h new file mode 100644 index 000000000000..1ac529cf4f06 --- /dev/null +++ b/include/linux/spi/spi_oc_tiny.h | |||
@@ -0,0 +1,20 @@ | |||
1 | #ifndef _LINUX_SPI_SPI_OC_TINY_H | ||
2 | #define _LINUX_SPI_SPI_OC_TINY_H | ||
3 | |||
4 | /** | ||
5 | * struct tiny_spi_platform_data - platform data of the OpenCores tiny SPI | ||
6 | * @freq: input clock freq to the core. | ||
7 | * @baudwidth: baud rate divider width of the core. | ||
8 | * @gpio_cs_count: number of gpio pins used for chipselect. | ||
9 | * @gpio_cs: array of gpio pins used for chipselect. | ||
10 | * | ||
11 | * freq and baudwidth are used only if the divider is programmable. | ||
12 | */ | ||
13 | struct tiny_spi_platform_data { | ||
14 | unsigned int freq; | ||
15 | unsigned int baudwidth; | ||
16 | unsigned int gpio_cs_count; | ||
17 | int *gpio_cs; | ||
18 | }; | ||
19 | |||
20 | #endif /* _LINUX_SPI_SPI_OC_TINY_H */ | ||
diff --git a/include/linux/spi/tsc2005.h b/include/linux/spi/tsc2005.h new file mode 100644 index 000000000000..d9b0c84220c7 --- /dev/null +++ b/include/linux/spi/tsc2005.h | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * This file is part of TSC2005 touchscreen driver | ||
3 | * | ||
4 | * Copyright (C) 2009-2010 Nokia Corporation | ||
5 | * | ||
6 | * Contact: Aaro Koskinen <aaro.koskinen@nokia.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | * | ||
22 | */ | ||
23 | |||
24 | #ifndef _LINUX_SPI_TSC2005_H | ||
25 | #define _LINUX_SPI_TSC2005_H | ||
26 | |||
27 | #include <linux/types.h> | ||
28 | |||
29 | struct tsc2005_platform_data { | ||
30 | int ts_pressure_max; | ||
31 | int ts_pressure_fudge; | ||
32 | int ts_x_max; | ||
33 | int ts_x_fudge; | ||
34 | int ts_y_max; | ||
35 | int ts_y_fudge; | ||
36 | int ts_x_plate_ohm; | ||
37 | unsigned int esd_timeout_ms; | ||
38 | void (*set_reset)(bool enable); | ||
39 | }; | ||
40 | |||
41 | #endif | ||
diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h index 851b7783720d..73548eb13a5d 100644 --- a/include/linux/spinlock_types.h +++ b/include/linux/spinlock_types.h | |||
@@ -81,14 +81,6 @@ typedef struct spinlock { | |||
81 | #define __SPIN_LOCK_UNLOCKED(lockname) \ | 81 | #define __SPIN_LOCK_UNLOCKED(lockname) \ |
82 | (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) | 82 | (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) |
83 | 83 | ||
84 | /* | ||
85 | * SPIN_LOCK_UNLOCKED defeats lockdep state tracking and is hence | ||
86 | * deprecated. | ||
87 | * Please use DEFINE_SPINLOCK() or __SPIN_LOCK_UNLOCKED() as | ||
88 | * appropriate. | ||
89 | */ | ||
90 | #define SPIN_LOCK_UNLOCKED __SPIN_LOCK_UNLOCKED(old_style_spin_init) | ||
91 | |||
92 | #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) | 84 | #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) |
93 | 85 | ||
94 | #include <linux/rwlock_types.h> | 86 | #include <linux/rwlock_types.h> |
diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h index 489f7b6d61c5..402955ae48ce 100644 --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h | |||
@@ -85,6 +85,8 @@ | |||
85 | #define SSB_IMSTATE_AP_RSV 0x00000030 /* Reserved */ | 85 | #define SSB_IMSTATE_AP_RSV 0x00000030 /* Reserved */ |
86 | #define SSB_IMSTATE_IBE 0x00020000 /* In Band Error */ | 86 | #define SSB_IMSTATE_IBE 0x00020000 /* In Band Error */ |
87 | #define SSB_IMSTATE_TO 0x00040000 /* Timeout */ | 87 | #define SSB_IMSTATE_TO 0x00040000 /* Timeout */ |
88 | #define SSB_IMSTATE_BUSY 0x01800000 /* Busy (Backplane rev >= 2.3 only) */ | ||
89 | #define SSB_IMSTATE_REJECT 0x02000000 /* Reject (Backplane rev >= 2.3 only) */ | ||
88 | #define SSB_INTVEC 0x0F94 /* SB Interrupt Mask */ | 90 | #define SSB_INTVEC 0x0F94 /* SB Interrupt Mask */ |
89 | #define SSB_INTVEC_PCI 0x00000001 /* Enable interrupts for PCI */ | 91 | #define SSB_INTVEC_PCI 0x00000001 /* Enable interrupts for PCI */ |
90 | #define SSB_INTVEC_ENET0 0x00000002 /* Enable interrupts for enet 0 */ | 92 | #define SSB_INTVEC_ENET0 0x00000002 /* Enable interrupts for enet 0 */ |
@@ -97,7 +99,6 @@ | |||
97 | #define SSB_TMSLOW_RESET 0x00000001 /* Reset */ | 99 | #define SSB_TMSLOW_RESET 0x00000001 /* Reset */ |
98 | #define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */ | 100 | #define SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */ |
99 | #define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */ | 101 | #define SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */ |
100 | #define SSB_TMSLOW_PHYCLK 0x00000010 /* MAC PHY Clock Control Enable */ | ||
101 | #define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */ | 102 | #define SSB_TMSLOW_CLOCK 0x00010000 /* Clock Enable */ |
102 | #define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */ | 103 | #define SSB_TMSLOW_FGC 0x00020000 /* Force Gated Clocks On */ |
103 | #define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */ | 104 | #define SSB_TMSLOW_PE 0x40000000 /* Power Management Enable */ |
@@ -268,6 +269,8 @@ | |||
268 | /* SPROM Revision 4 */ | 269 | /* SPROM Revision 4 */ |
269 | #define SSB_SPROM4_BFLLO 0x0044 /* Boardflags (low 16 bits) */ | 270 | #define SSB_SPROM4_BFLLO 0x0044 /* Boardflags (low 16 bits) */ |
270 | #define SSB_SPROM4_BFLHI 0x0046 /* Board Flags Hi */ | 271 | #define SSB_SPROM4_BFLHI 0x0046 /* Board Flags Hi */ |
272 | #define SSB_SPROM4_BFL2LO 0x0048 /* Board flags 2 (low 16 bits) */ | ||
273 | #define SSB_SPROM4_BFL2HI 0x004A /* Board flags 2 Hi */ | ||
271 | #define SSB_SPROM4_IL0MAC 0x004C /* 6 byte MAC address for a/b/g/n */ | 274 | #define SSB_SPROM4_IL0MAC 0x004C /* 6 byte MAC address for a/b/g/n */ |
272 | #define SSB_SPROM4_CCODE 0x0052 /* Country Code (2 bytes) */ | 275 | #define SSB_SPROM4_CCODE 0x0052 /* Country Code (2 bytes) */ |
273 | #define SSB_SPROM4_GPIOA 0x0056 /* Gen. Purpose IO # 0 and 1 */ | 276 | #define SSB_SPROM4_GPIOA 0x0056 /* Gen. Purpose IO # 0 and 1 */ |
@@ -358,6 +361,8 @@ | |||
358 | #define SSB_SPROM5_CCODE 0x0044 /* Country Code (2 bytes) */ | 361 | #define SSB_SPROM5_CCODE 0x0044 /* Country Code (2 bytes) */ |
359 | #define SSB_SPROM5_BFLLO 0x004A /* Boardflags (low 16 bits) */ | 362 | #define SSB_SPROM5_BFLLO 0x004A /* Boardflags (low 16 bits) */ |
360 | #define SSB_SPROM5_BFLHI 0x004C /* Board Flags Hi */ | 363 | #define SSB_SPROM5_BFLHI 0x004C /* Board Flags Hi */ |
364 | #define SSB_SPROM5_BFL2LO 0x004E /* Board flags 2 (low 16 bits) */ | ||
365 | #define SSB_SPROM5_BFL2HI 0x0050 /* Board flags 2 Hi */ | ||
361 | #define SSB_SPROM5_IL0MAC 0x0052 /* 6 byte MAC address for a/b/g/n */ | 366 | #define SSB_SPROM5_IL0MAC 0x0052 /* 6 byte MAC address for a/b/g/n */ |
362 | #define SSB_SPROM5_GPIOA 0x0076 /* Gen. Purpose IO # 0 and 1 */ | 367 | #define SSB_SPROM5_GPIOA 0x0076 /* Gen. Purpose IO # 0 and 1 */ |
363 | #define SSB_SPROM5_GPIOA_P0 0x00FF /* Pin 0 */ | 368 | #define SSB_SPROM5_GPIOA_P0 0x00FF /* Pin 0 */ |
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index ef9476a36ff7..db7bcaf7c5bd 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
@@ -129,6 +129,7 @@ struct rpc_create_args { | |||
129 | struct rpc_clnt *rpc_create(struct rpc_create_args *args); | 129 | struct rpc_clnt *rpc_create(struct rpc_create_args *args); |
130 | struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *, | 130 | struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *, |
131 | struct rpc_program *, u32); | 131 | struct rpc_program *, u32); |
132 | void rpc_task_reset_client(struct rpc_task *task, struct rpc_clnt *clnt); | ||
132 | struct rpc_clnt *rpc_clone_client(struct rpc_clnt *); | 133 | struct rpc_clnt *rpc_clone_client(struct rpc_clnt *); |
133 | void rpc_shutdown_client(struct rpc_clnt *); | 134 | void rpc_shutdown_client(struct rpc_clnt *); |
134 | void rpc_release_client(struct rpc_clnt *); | 135 | void rpc_release_client(struct rpc_clnt *); |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index bef0f535f746..a0f998c07c65 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/uio.h> | 12 | #include <linux/uio.h> |
13 | #include <linux/socket.h> | 13 | #include <linux/socket.h> |
14 | #include <linux/in.h> | 14 | #include <linux/in.h> |
15 | #include <linux/kref.h> | ||
16 | #include <linux/ktime.h> | 15 | #include <linux/ktime.h> |
17 | #include <linux/sunrpc/sched.h> | 16 | #include <linux/sunrpc/sched.h> |
18 | #include <linux/sunrpc/xdr.h> | 17 | #include <linux/sunrpc/xdr.h> |
@@ -146,7 +145,7 @@ enum xprt_transports { | |||
146 | }; | 145 | }; |
147 | 146 | ||
148 | struct rpc_xprt { | 147 | struct rpc_xprt { |
149 | struct kref kref; /* Reference count */ | 148 | atomic_t count; /* Reference count */ |
150 | struct rpc_xprt_ops * ops; /* transport methods */ | 149 | struct rpc_xprt_ops * ops; /* transport methods */ |
151 | 150 | ||
152 | const struct rpc_timeout *timeout; /* timeout parms */ | 151 | const struct rpc_timeout *timeout; /* timeout parms */ |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 4d559325d919..ed6ebe690f4a 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
@@ -155,6 +155,15 @@ enum { | |||
155 | #define SWAP_CLUSTER_MAX 32 | 155 | #define SWAP_CLUSTER_MAX 32 |
156 | #define COMPACT_CLUSTER_MAX SWAP_CLUSTER_MAX | 156 | #define COMPACT_CLUSTER_MAX SWAP_CLUSTER_MAX |
157 | 157 | ||
158 | /* | ||
159 | * Ratio between the present memory in the zone and the "gap" that | ||
160 | * we're allowing kswapd to shrink in addition to the per-zone high | ||
161 | * wmark, even for zones that already have the high wmark satisfied, | ||
162 | * in order to provide better per-zone lru behavior. We are ok to | ||
163 | * spend not more than 1% of the memory for this zone balancing "gap". | ||
164 | */ | ||
165 | #define KSWAPD_ZONE_BALANCE_GAP_RATIO 100 | ||
166 | |||
158 | #define SWAP_MAP_MAX 0x3e /* Max duplication count, in first swap_map */ | 167 | #define SWAP_MAP_MAX 0x3e /* Max duplication count, in first swap_map */ |
159 | #define SWAP_MAP_BAD 0x3f /* Note pageblock is bad, in first swap_map */ | 168 | #define SWAP_MAP_BAD 0x3f /* Note pageblock is bad, in first swap_map */ |
160 | #define SWAP_HAS_CACHE 0x40 /* Flag page is cached, in first swap_map */ | 169 | #define SWAP_HAS_CACHE 0x40 /* Flag page is cached, in first swap_map */ |
@@ -215,6 +224,7 @@ extern void mark_page_accessed(struct page *); | |||
215 | extern void lru_add_drain(void); | 224 | extern void lru_add_drain(void); |
216 | extern int lru_add_drain_all(void); | 225 | extern int lru_add_drain_all(void); |
217 | extern void rotate_reclaimable_page(struct page *page); | 226 | extern void rotate_reclaimable_page(struct page *page); |
227 | extern void deactivate_page(struct page *page); | ||
218 | extern void swap_setup(void); | 228 | extern void swap_setup(void); |
219 | 229 | ||
220 | extern void add_page_to_unevictable_list(struct page *page); | 230 | extern void add_page_to_unevictable_list(struct page *page); |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 98664db1be47..83ecc1749ef6 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -62,6 +62,7 @@ struct robust_list_head; | |||
62 | struct getcpu_cache; | 62 | struct getcpu_cache; |
63 | struct old_linux_dirent; | 63 | struct old_linux_dirent; |
64 | struct perf_event_attr; | 64 | struct perf_event_attr; |
65 | struct file_handle; | ||
65 | 66 | ||
66 | #include <linux/types.h> | 67 | #include <linux/types.h> |
67 | #include <linux/aio_abi.h> | 68 | #include <linux/aio_abi.h> |
@@ -132,11 +133,11 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
132 | .class = &event_class_syscall_enter, \ | 133 | .class = &event_class_syscall_enter, \ |
133 | .event.funcs = &enter_syscall_print_funcs, \ | 134 | .event.funcs = &enter_syscall_print_funcs, \ |
134 | .data = (void *)&__syscall_meta_##sname,\ | 135 | .data = (void *)&__syscall_meta_##sname,\ |
136 | .flags = TRACE_EVENT_FL_CAP_ANY, \ | ||
135 | }; \ | 137 | }; \ |
136 | static struct ftrace_event_call __used \ | 138 | static struct ftrace_event_call __used \ |
137 | __attribute__((section("_ftrace_events"))) \ | 139 | __attribute__((section("_ftrace_events"))) \ |
138 | *__event_enter_##sname = &event_enter_##sname; \ | 140 | *__event_enter_##sname = &event_enter_##sname; |
139 | __TRACE_EVENT_FLAGS(enter_##sname, TRACE_EVENT_FL_CAP_ANY) | ||
140 | 141 | ||
141 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ | 142 | #define SYSCALL_TRACE_EXIT_EVENT(sname) \ |
142 | static struct syscall_metadata __syscall_meta_##sname; \ | 143 | static struct syscall_metadata __syscall_meta_##sname; \ |
@@ -146,11 +147,11 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
146 | .class = &event_class_syscall_exit, \ | 147 | .class = &event_class_syscall_exit, \ |
147 | .event.funcs = &exit_syscall_print_funcs, \ | 148 | .event.funcs = &exit_syscall_print_funcs, \ |
148 | .data = (void *)&__syscall_meta_##sname,\ | 149 | .data = (void *)&__syscall_meta_##sname,\ |
150 | .flags = TRACE_EVENT_FL_CAP_ANY, \ | ||
149 | }; \ | 151 | }; \ |
150 | static struct ftrace_event_call __used \ | 152 | static struct ftrace_event_call __used \ |
151 | __attribute__((section("_ftrace_events"))) \ | 153 | __attribute__((section("_ftrace_events"))) \ |
152 | *__event_exit_##sname = &event_exit_##sname; \ | 154 | *__event_exit_##sname = &event_exit_##sname; |
153 | __TRACE_EVENT_FLAGS(exit_##sname, TRACE_EVENT_FL_CAP_ANY) | ||
154 | 155 | ||
155 | #define SYSCALL_METADATA(sname, nb) \ | 156 | #define SYSCALL_METADATA(sname, nb) \ |
156 | SYSCALL_TRACE_ENTER_EVENT(sname); \ | 157 | SYSCALL_TRACE_ENTER_EVENT(sname); \ |
@@ -158,6 +159,7 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
158 | static struct syscall_metadata __used \ | 159 | static struct syscall_metadata __used \ |
159 | __syscall_meta_##sname = { \ | 160 | __syscall_meta_##sname = { \ |
160 | .name = "sys"#sname, \ | 161 | .name = "sys"#sname, \ |
162 | .syscall_nr = -1, /* Filled in at boot */ \ | ||
161 | .nb_args = nb, \ | 163 | .nb_args = nb, \ |
162 | .types = types_##sname, \ | 164 | .types = types_##sname, \ |
163 | .args = args_##sname, \ | 165 | .args = args_##sname, \ |
@@ -175,6 +177,7 @@ extern struct trace_event_functions exit_syscall_print_funcs; | |||
175 | static struct syscall_metadata __used \ | 177 | static struct syscall_metadata __used \ |
176 | __syscall_meta__##sname = { \ | 178 | __syscall_meta__##sname = { \ |
177 | .name = "sys_"#sname, \ | 179 | .name = "sys_"#sname, \ |
180 | .syscall_nr = -1, /* Filled in at boot */ \ | ||
178 | .nb_args = 0, \ | 181 | .nb_args = 0, \ |
179 | .enter_event = &event_enter__##sname, \ | 182 | .enter_event = &event_enter__##sname, \ |
180 | .exit_event = &event_exit__##sname, \ | 183 | .exit_event = &event_exit__##sname, \ |
@@ -313,6 +316,8 @@ asmlinkage long sys_clock_settime(clockid_t which_clock, | |||
313 | const struct timespec __user *tp); | 316 | const struct timespec __user *tp); |
314 | asmlinkage long sys_clock_gettime(clockid_t which_clock, | 317 | asmlinkage long sys_clock_gettime(clockid_t which_clock, |
315 | struct timespec __user *tp); | 318 | struct timespec __user *tp); |
319 | asmlinkage long sys_clock_adjtime(clockid_t which_clock, | ||
320 | struct timex __user *tx); | ||
316 | asmlinkage long sys_clock_getres(clockid_t which_clock, | 321 | asmlinkage long sys_clock_getres(clockid_t which_clock, |
317 | struct timespec __user *tp); | 322 | struct timespec __user *tp); |
318 | asmlinkage long sys_clock_nanosleep(clockid_t which_clock, int flags, | 323 | asmlinkage long sys_clock_nanosleep(clockid_t which_clock, int flags, |
@@ -820,6 +825,7 @@ asmlinkage long sys_fanotify_init(unsigned int flags, unsigned int event_f_flags | |||
820 | asmlinkage long sys_fanotify_mark(int fanotify_fd, unsigned int flags, | 825 | asmlinkage long sys_fanotify_mark(int fanotify_fd, unsigned int flags, |
821 | u64 mask, int fd, | 826 | u64 mask, int fd, |
822 | const char __user *pathname); | 827 | const char __user *pathname); |
828 | asmlinkage long sys_syncfs(int fd); | ||
823 | 829 | ||
824 | int kernel_execve(const char *filename, const char *const argv[], const char *const envp[]); | 830 | int kernel_execve(const char *filename, const char *const argv[], const char *const envp[]); |
825 | 831 | ||
@@ -832,5 +838,10 @@ asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len, | |||
832 | unsigned long prot, unsigned long flags, | 838 | unsigned long prot, unsigned long flags, |
833 | unsigned long fd, unsigned long pgoff); | 839 | unsigned long fd, unsigned long pgoff); |
834 | asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg); | 840 | asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg); |
835 | 841 | asmlinkage long sys_name_to_handle_at(int dfd, const char __user *name, | |
842 | struct file_handle __user *handle, | ||
843 | int __user *mnt_id, int flag); | ||
844 | asmlinkage long sys_open_by_handle_at(int mountdirfd, | ||
845 | struct file_handle __user *handle, | ||
846 | int flags); | ||
836 | #endif | 847 | #endif |
diff --git a/include/linux/syscore_ops.h b/include/linux/syscore_ops.h new file mode 100644 index 000000000000..27b3b0bc41a9 --- /dev/null +++ b/include/linux/syscore_ops.h | |||
@@ -0,0 +1,29 @@ | |||
1 | /* | ||
2 | * syscore_ops.h - System core operations. | ||
3 | * | ||
4 | * Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc. | ||
5 | * | ||
6 | * This file is released under the GPLv2. | ||
7 | */ | ||
8 | |||
9 | #ifndef _LINUX_SYSCORE_OPS_H | ||
10 | #define _LINUX_SYSCORE_OPS_H | ||
11 | |||
12 | #include <linux/list.h> | ||
13 | |||
14 | struct syscore_ops { | ||
15 | struct list_head node; | ||
16 | int (*suspend)(void); | ||
17 | void (*resume)(void); | ||
18 | void (*shutdown)(void); | ||
19 | }; | ||
20 | |||
21 | extern void register_syscore_ops(struct syscore_ops *ops); | ||
22 | extern void unregister_syscore_ops(struct syscore_ops *ops); | ||
23 | #ifdef CONFIG_PM_SLEEP | ||
24 | extern int syscore_suspend(void); | ||
25 | extern void syscore_resume(void); | ||
26 | #endif | ||
27 | extern void syscore_shutdown(void); | ||
28 | |||
29 | #endif | ||
diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h index c90696544176..20fc303947d3 100644 --- a/include/linux/thread_info.h +++ b/include/linux/thread_info.h | |||
@@ -18,9 +18,6 @@ struct compat_timespec; | |||
18 | struct restart_block { | 18 | struct restart_block { |
19 | long (*fn)(struct restart_block *); | 19 | long (*fn)(struct restart_block *); |
20 | union { | 20 | union { |
21 | struct { | ||
22 | unsigned long arg0, arg1, arg2, arg3; | ||
23 | }; | ||
24 | /* For futex_wait and futex_wait_requeue_pi */ | 21 | /* For futex_wait and futex_wait_requeue_pi */ |
25 | struct { | 22 | struct { |
26 | u32 __user *uaddr; | 23 | u32 __user *uaddr; |
diff --git a/include/linux/ti_wilink_st.h b/include/linux/ti_wilink_st.h index 4c7be2263011..7071ec5d0118 100644 --- a/include/linux/ti_wilink_st.h +++ b/include/linux/ti_wilink_st.h | |||
@@ -26,15 +26,6 @@ | |||
26 | #define TI_WILINK_ST_H | 26 | #define TI_WILINK_ST_H |
27 | 27 | ||
28 | /** | 28 | /** |
29 | * enum kim_gpio_state - Few protocols such as FM have ACTIVE LOW | ||
30 | * gpio states for their chip/core enable gpios | ||
31 | */ | ||
32 | enum kim_gpio_state { | ||
33 | KIM_GPIO_INACTIVE, | ||
34 | KIM_GPIO_ACTIVE, | ||
35 | }; | ||
36 | |||
37 | /** | ||
38 | * enum proto-type - The protocol on WiLink chips which share a | 29 | * enum proto-type - The protocol on WiLink chips which share a |
39 | * common physical interface like UART. | 30 | * common physical interface like UART. |
40 | */ | 31 | */ |
@@ -42,7 +33,7 @@ enum proto_type { | |||
42 | ST_BT, | 33 | ST_BT, |
43 | ST_FM, | 34 | ST_FM, |
44 | ST_GPS, | 35 | ST_GPS, |
45 | ST_MAX, | 36 | ST_MAX_CHANNELS = 16, |
46 | }; | 37 | }; |
47 | 38 | ||
48 | /** | 39 | /** |
@@ -62,6 +53,17 @@ enum proto_type { | |||
62 | * @priv_data: privdate data holder for the protocol drivers, sent | 53 | * @priv_data: privdate data holder for the protocol drivers, sent |
63 | * from the protocol drivers during registration, and sent back on | 54 | * from the protocol drivers during registration, and sent back on |
64 | * reg_complete_cb and recv. | 55 | * reg_complete_cb and recv. |
56 | * @chnl_id: channel id the protocol driver is interested in, the channel | ||
57 | * id is nothing but the 1st byte of the packet in UART frame. | ||
58 | * @max_frame_size: size of the largest frame the protocol can receive. | ||
59 | * @hdr_len: length of the header structure of the protocol. | ||
60 | * @offset_len_in_hdr: this provides the offset of the length field in the | ||
61 | * header structure of the protocol header, to assist ST to know | ||
62 | * how much to receive, if the data is split across UART frames. | ||
63 | * @len_size: whether the length field inside the header is 2 bytes | ||
64 | * or 1 byte. | ||
65 | * @reserve: the number of bytes ST needs to reserve in the skb being | ||
66 | * prepared for the protocol driver. | ||
65 | */ | 67 | */ |
66 | struct st_proto_s { | 68 | struct st_proto_s { |
67 | enum proto_type type; | 69 | enum proto_type type; |
@@ -70,10 +72,17 @@ struct st_proto_s { | |||
70 | void (*reg_complete_cb) (void *, char data); | 72 | void (*reg_complete_cb) (void *, char data); |
71 | long (*write) (struct sk_buff *skb); | 73 | long (*write) (struct sk_buff *skb); |
72 | void *priv_data; | 74 | void *priv_data; |
75 | |||
76 | unsigned char chnl_id; | ||
77 | unsigned short max_frame_size; | ||
78 | unsigned char hdr_len; | ||
79 | unsigned char offset_len_in_hdr; | ||
80 | unsigned char len_size; | ||
81 | unsigned char reserve; | ||
73 | }; | 82 | }; |
74 | 83 | ||
75 | extern long st_register(struct st_proto_s *); | 84 | extern long st_register(struct st_proto_s *); |
76 | extern long st_unregister(enum proto_type); | 85 | extern long st_unregister(struct st_proto_s *); |
77 | 86 | ||
78 | 87 | ||
79 | /* | 88 | /* |
@@ -114,6 +123,7 @@ extern long st_unregister(enum proto_type); | |||
114 | * @rx_skb: the skb where all data for a protocol gets accumulated, | 123 | * @rx_skb: the skb where all data for a protocol gets accumulated, |
115 | * since tty might not call receive when a complete event packet | 124 | * since tty might not call receive when a complete event packet |
116 | * is received, the states, count and the skb needs to be maintained. | 125 | * is received, the states, count and the skb needs to be maintained. |
126 | * @rx_chnl: the channel ID for which the data is getting accumalated for. | ||
117 | * @txq: the list of skbs which needs to be sent onto the TTY. | 127 | * @txq: the list of skbs which needs to be sent onto the TTY. |
118 | * @tx_waitq: if the chip is not in AWAKE state, the skbs needs to be queued | 128 | * @tx_waitq: if the chip is not in AWAKE state, the skbs needs to be queued |
119 | * up in here, PM(WAKEUP_IND) data needs to be sent and then the skbs | 129 | * up in here, PM(WAKEUP_IND) data needs to be sent and then the skbs |
@@ -135,10 +145,11 @@ struct st_data_s { | |||
135 | #define ST_TX_SENDING 1 | 145 | #define ST_TX_SENDING 1 |
136 | #define ST_TX_WAKEUP 2 | 146 | #define ST_TX_WAKEUP 2 |
137 | unsigned long tx_state; | 147 | unsigned long tx_state; |
138 | struct st_proto_s *list[ST_MAX]; | 148 | struct st_proto_s *list[ST_MAX_CHANNELS]; |
139 | unsigned long rx_state; | 149 | unsigned long rx_state; |
140 | unsigned long rx_count; | 150 | unsigned long rx_count; |
141 | struct sk_buff *rx_skb; | 151 | struct sk_buff *rx_skb; |
152 | unsigned char rx_chnl; | ||
142 | struct sk_buff_head txq, tx_waitq; | 153 | struct sk_buff_head txq, tx_waitq; |
143 | spinlock_t lock; | 154 | spinlock_t lock; |
144 | unsigned char protos_registered; | 155 | unsigned char protos_registered; |
@@ -146,6 +157,11 @@ struct st_data_s { | |||
146 | void *kim_data; | 157 | void *kim_data; |
147 | }; | 158 | }; |
148 | 159 | ||
160 | /* | ||
161 | * wrapper around tty->ops->write_room to check | ||
162 | * availability during firmware download | ||
163 | */ | ||
164 | int st_get_uart_wr_room(struct st_data_s *st_gdata); | ||
149 | /** | 165 | /** |
150 | * st_int_write - | 166 | * st_int_write - |
151 | * point this to tty->driver->write or tty->ops->write | 167 | * point this to tty->driver->write or tty->ops->write |
@@ -186,8 +202,9 @@ void gps_chrdrv_stub_init(void); | |||
186 | /* time in msec to wait for | 202 | /* time in msec to wait for |
187 | * line discipline to be installed | 203 | * line discipline to be installed |
188 | */ | 204 | */ |
189 | #define LDISC_TIME 500 | 205 | #define LDISC_TIME 1000 |
190 | #define CMD_RESP_TIME 500 | 206 | #define CMD_RESP_TIME 800 |
207 | #define CMD_WR_TIME 5000 | ||
191 | #define MAKEWORD(a, b) ((unsigned short)(((unsigned char)(a)) \ | 208 | #define MAKEWORD(a, b) ((unsigned short)(((unsigned char)(a)) \ |
192 | | ((unsigned short)((unsigned char)(b))) << 8)) | 209 | | ((unsigned short)((unsigned char)(b))) << 8)) |
193 | 210 | ||
@@ -210,6 +227,7 @@ struct chip_version { | |||
210 | unsigned short maj_ver; | 227 | unsigned short maj_ver; |
211 | }; | 228 | }; |
212 | 229 | ||
230 | #define UART_DEV_NAME_LEN 32 | ||
213 | /** | 231 | /** |
214 | * struct kim_data_s - the KIM internal data, embedded as the | 232 | * struct kim_data_s - the KIM internal data, embedded as the |
215 | * platform's drv data. One for each ST device in the system. | 233 | * platform's drv data. One for each ST device in the system. |
@@ -225,14 +243,11 @@ struct chip_version { | |||
225 | * the ldisc was properly installed. | 243 | * the ldisc was properly installed. |
226 | * @resp_buffer: data buffer for the .bts fw file name. | 244 | * @resp_buffer: data buffer for the .bts fw file name. |
227 | * @fw_entry: firmware class struct to request/release the fw. | 245 | * @fw_entry: firmware class struct to request/release the fw. |
228 | * @gpios: the list of core/chip enable gpios for BT, FM and GPS cores. | ||
229 | * @rx_state: the rx state for kim's receive func during fw download. | 246 | * @rx_state: the rx state for kim's receive func during fw download. |
230 | * @rx_count: the rx count for the kim's receive func during fw download. | 247 | * @rx_count: the rx count for the kim's receive func during fw download. |
231 | * @rx_skb: all of fw data might not come at once, and hence data storage for | 248 | * @rx_skb: all of fw data might not come at once, and hence data storage for |
232 | * whole of the fw response, only HCI_EVENTs and hence diff from ST's | 249 | * whole of the fw response, only HCI_EVENTs and hence diff from ST's |
233 | * response. | 250 | * response. |
234 | * @rfkill: rfkill data for each of the cores to be registered with rfkill. | ||
235 | * @rf_protos: proto types of the data registered with rfkill sub-system. | ||
236 | * @core_data: ST core's data, which mainly is the tty's disc_data | 251 | * @core_data: ST core's data, which mainly is the tty's disc_data |
237 | * @version: chip version available via a sysfs entry. | 252 | * @version: chip version available via a sysfs entry. |
238 | * | 253 | * |
@@ -243,14 +258,16 @@ struct kim_data_s { | |||
243 | struct completion kim_rcvd, ldisc_installed; | 258 | struct completion kim_rcvd, ldisc_installed; |
244 | char resp_buffer[30]; | 259 | char resp_buffer[30]; |
245 | const struct firmware *fw_entry; | 260 | const struct firmware *fw_entry; |
246 | long gpios[ST_MAX]; | 261 | long nshutdown; |
247 | unsigned long rx_state; | 262 | unsigned long rx_state; |
248 | unsigned long rx_count; | 263 | unsigned long rx_count; |
249 | struct sk_buff *rx_skb; | 264 | struct sk_buff *rx_skb; |
250 | struct rfkill *rfkill[ST_MAX]; | ||
251 | enum proto_type rf_protos[ST_MAX]; | ||
252 | struct st_data_s *core_data; | 265 | struct st_data_s *core_data; |
253 | struct chip_version version; | 266 | struct chip_version version; |
267 | unsigned char ldisc_install; | ||
268 | unsigned char dev_name[UART_DEV_NAME_LEN]; | ||
269 | unsigned char flow_cntrl; | ||
270 | unsigned long baud_rate; | ||
254 | }; | 271 | }; |
255 | 272 | ||
256 | /** | 273 | /** |
@@ -262,7 +279,6 @@ long st_kim_start(void *); | |||
262 | long st_kim_stop(void *); | 279 | long st_kim_stop(void *); |
263 | 280 | ||
264 | void st_kim_recv(void *, const unsigned char *, long count); | 281 | void st_kim_recv(void *, const unsigned char *, long count); |
265 | void st_kim_chip_toggle(enum proto_type, enum kim_gpio_state); | ||
266 | void st_kim_complete(void *); | 282 | void st_kim_complete(void *); |
267 | void kim_st_list_protocols(struct st_data_s *, void *); | 283 | void kim_st_list_protocols(struct st_data_s *, void *); |
268 | 284 | ||
@@ -338,12 +354,8 @@ struct hci_command { | |||
338 | 354 | ||
339 | /* ST LL receiver states */ | 355 | /* ST LL receiver states */ |
340 | #define ST_W4_PACKET_TYPE 0 | 356 | #define ST_W4_PACKET_TYPE 0 |
341 | #define ST_BT_W4_EVENT_HDR 1 | 357 | #define ST_W4_HEADER 1 |
342 | #define ST_BT_W4_ACL_HDR 2 | 358 | #define ST_W4_DATA 2 |
343 | #define ST_BT_W4_SCO_HDR 3 | ||
344 | #define ST_BT_W4_DATA 4 | ||
345 | #define ST_FM_W4_EVENT_HDR 5 | ||
346 | #define ST_GPS_W4_EVENT_HDR 6 | ||
347 | 359 | ||
348 | /* ST LL state machines */ | 360 | /* ST LL state machines */ |
349 | #define ST_LL_ASLEEP 0 | 361 | #define ST_LL_ASLEEP 0 |
@@ -397,4 +409,14 @@ struct gps_event_hdr { | |||
397 | u16 plen; | 409 | u16 plen; |
398 | } __attribute__ ((packed)); | 410 | } __attribute__ ((packed)); |
399 | 411 | ||
412 | /* platform data */ | ||
413 | struct ti_st_plat_data { | ||
414 | long nshutdown_gpio; | ||
415 | unsigned char dev_name[UART_DEV_NAME_LEN]; /* uart name */ | ||
416 | unsigned char flow_cntrl; /* flow control flag */ | ||
417 | unsigned long baud_rate; | ||
418 | int (*suspend)(struct platform_device *, pm_message_t); | ||
419 | int (*resume)(struct platform_device *); | ||
420 | }; | ||
421 | |||
400 | #endif /* TI_WILINK_ST_H */ | 422 | #endif /* TI_WILINK_ST_H */ |
diff --git a/include/linux/time.h b/include/linux/time.h index 1e6d3b59238d..454a26205787 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -113,8 +113,6 @@ static inline struct timespec timespec_sub(struct timespec lhs, | |||
113 | #define timespec_valid(ts) \ | 113 | #define timespec_valid(ts) \ |
114 | (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) | 114 | (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) |
115 | 115 | ||
116 | extern seqlock_t xtime_lock; | ||
117 | |||
118 | extern void read_persistent_clock(struct timespec *ts); | 116 | extern void read_persistent_clock(struct timespec *ts); |
119 | extern void read_boot_clock(struct timespec *ts); | 117 | extern void read_boot_clock(struct timespec *ts); |
120 | extern int update_persistent_clock(struct timespec now); | 118 | extern int update_persistent_clock(struct timespec now); |
@@ -125,8 +123,9 @@ extern int timekeeping_suspended; | |||
125 | unsigned long get_seconds(void); | 123 | unsigned long get_seconds(void); |
126 | struct timespec current_kernel_time(void); | 124 | struct timespec current_kernel_time(void); |
127 | struct timespec __current_kernel_time(void); /* does not take xtime_lock */ | 125 | struct timespec __current_kernel_time(void); /* does not take xtime_lock */ |
128 | struct timespec __get_wall_to_monotonic(void); /* does not take xtime_lock */ | ||
129 | struct timespec get_monotonic_coarse(void); | 126 | struct timespec get_monotonic_coarse(void); |
127 | void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim, | ||
128 | struct timespec *wtom, struct timespec *sleep); | ||
130 | 129 | ||
131 | #define CURRENT_TIME (current_kernel_time()) | 130 | #define CURRENT_TIME (current_kernel_time()) |
132 | #define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 }) | 131 | #define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 }) |
@@ -147,8 +146,9 @@ static inline u32 arch_gettimeoffset(void) { return 0; } | |||
147 | #endif | 146 | #endif |
148 | 147 | ||
149 | extern void do_gettimeofday(struct timeval *tv); | 148 | extern void do_gettimeofday(struct timeval *tv); |
150 | extern int do_settimeofday(struct timespec *tv); | 149 | extern int do_settimeofday(const struct timespec *tv); |
151 | extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz); | 150 | extern int do_sys_settimeofday(const struct timespec *tv, |
151 | const struct timezone *tz); | ||
152 | #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts) | 152 | #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts) |
153 | extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags); | 153 | extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags); |
154 | struct itimerval; | 154 | struct itimerval; |
@@ -162,12 +162,13 @@ extern void getnstime_raw_and_real(struct timespec *ts_raw, | |||
162 | struct timespec *ts_real); | 162 | struct timespec *ts_real); |
163 | extern void getboottime(struct timespec *ts); | 163 | extern void getboottime(struct timespec *ts); |
164 | extern void monotonic_to_bootbased(struct timespec *ts); | 164 | extern void monotonic_to_bootbased(struct timespec *ts); |
165 | extern void get_monotonic_boottime(struct timespec *ts); | ||
165 | 166 | ||
166 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); | 167 | extern struct timespec timespec_trunc(struct timespec t, unsigned gran); |
167 | extern int timekeeping_valid_for_hres(void); | 168 | extern int timekeeping_valid_for_hres(void); |
168 | extern u64 timekeeping_max_deferment(void); | 169 | extern u64 timekeeping_max_deferment(void); |
169 | extern void update_wall_time(void); | ||
170 | extern void timekeeping_leap_insert(int leapsecond); | 170 | extern void timekeeping_leap_insert(int leapsecond); |
171 | extern int timekeeping_inject_offset(struct timespec *ts); | ||
171 | 172 | ||
172 | struct tms; | 173 | struct tms; |
173 | extern void do_sys_times(struct tms *); | 174 | extern void do_sys_times(struct tms *); |
@@ -292,6 +293,7 @@ struct itimerval { | |||
292 | #define CLOCK_MONOTONIC_RAW 4 | 293 | #define CLOCK_MONOTONIC_RAW 4 |
293 | #define CLOCK_REALTIME_COARSE 5 | 294 | #define CLOCK_REALTIME_COARSE 5 |
294 | #define CLOCK_MONOTONIC_COARSE 6 | 295 | #define CLOCK_MONOTONIC_COARSE 6 |
296 | #define CLOCK_BOOTTIME 7 | ||
295 | 297 | ||
296 | /* | 298 | /* |
297 | * The IDs of various hardware clocks: | 299 | * The IDs of various hardware clocks: |
diff --git a/include/linux/timex.h b/include/linux/timex.h index d23999f9499d..aa60fe7b6ed6 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h | |||
@@ -73,7 +73,7 @@ struct timex { | |||
73 | long tolerance; /* clock frequency tolerance (ppm) | 73 | long tolerance; /* clock frequency tolerance (ppm) |
74 | * (read only) | 74 | * (read only) |
75 | */ | 75 | */ |
76 | struct timeval time; /* (read only) */ | 76 | struct timeval time; /* (read only, except for ADJ_SETOFFSET) */ |
77 | long tick; /* (modified) usecs between clock ticks */ | 77 | long tick; /* (modified) usecs between clock ticks */ |
78 | 78 | ||
79 | long ppsfreq; /* pps frequency (scaled ppm) (ro) */ | 79 | long ppsfreq; /* pps frequency (scaled ppm) (ro) */ |
@@ -102,6 +102,7 @@ struct timex { | |||
102 | #define ADJ_STATUS 0x0010 /* clock status */ | 102 | #define ADJ_STATUS 0x0010 /* clock status */ |
103 | #define ADJ_TIMECONST 0x0020 /* pll time constant */ | 103 | #define ADJ_TIMECONST 0x0020 /* pll time constant */ |
104 | #define ADJ_TAI 0x0080 /* set TAI offset */ | 104 | #define ADJ_TAI 0x0080 /* set TAI offset */ |
105 | #define ADJ_SETOFFSET 0x0100 /* add 'time' to current time */ | ||
105 | #define ADJ_MICRO 0x1000 /* select microsecond resolution */ | 106 | #define ADJ_MICRO 0x1000 /* select microsecond resolution */ |
106 | #define ADJ_NANO 0x2000 /* select nanosecond resolution */ | 107 | #define ADJ_NANO 0x2000 /* select nanosecond resolution */ |
107 | #define ADJ_TICK 0x4000 /* tick value */ | 108 | #define ADJ_TICK 0x4000 /* tick value */ |
diff --git a/include/linux/tipc.h b/include/linux/tipc.h index 1eefa3f6d1f4..a5b994a204d2 100644 --- a/include/linux/tipc.h +++ b/include/linux/tipc.h | |||
@@ -2,7 +2,7 @@ | |||
2 | * include/linux/tipc.h: Include file for TIPC socket interface | 2 | * include/linux/tipc.h: Include file for TIPC socket interface |
3 | * | 3 | * |
4 | * Copyright (c) 2003-2006, Ericsson AB | 4 | * Copyright (c) 2003-2006, Ericsson AB |
5 | * Copyright (c) 2005, Wind River Systems | 5 | * Copyright (c) 2005, 2010-2011, Wind River Systems |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
8 | * Redistribution and use in source and binary forms, with or without | 8 | * Redistribution and use in source and binary forms, with or without |
@@ -130,12 +130,6 @@ static inline unsigned int tipc_node(__u32 addr) | |||
130 | #define TIPC_SUB_PORTS 0x01 /* filter for port availability */ | 130 | #define TIPC_SUB_PORTS 0x01 /* filter for port availability */ |
131 | #define TIPC_SUB_SERVICE 0x02 /* filter for service availability */ | 131 | #define TIPC_SUB_SERVICE 0x02 /* filter for service availability */ |
132 | #define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */ | 132 | #define TIPC_SUB_CANCEL 0x04 /* cancel a subscription */ |
133 | #if 0 | ||
134 | /* The following filter options are not currently implemented */ | ||
135 | #define TIPC_SUB_NO_BIND_EVTS 0x04 /* filter out "publish" events */ | ||
136 | #define TIPC_SUB_NO_UNBIND_EVTS 0x08 /* filter out "withdraw" events */ | ||
137 | #define TIPC_SUB_SINGLE_EVT 0x10 /* expire after first event */ | ||
138 | #endif | ||
139 | 133 | ||
140 | #define TIPC_WAIT_FOREVER (~0) /* timeout for permanent subscription */ | 134 | #define TIPC_WAIT_FOREVER (~0) /* timeout for permanent subscription */ |
141 | 135 | ||
diff --git a/include/linux/tipc_config.h b/include/linux/tipc_config.h index 7d42460a5e3c..0db239590b4d 100644 --- a/include/linux/tipc_config.h +++ b/include/linux/tipc_config.h | |||
@@ -2,7 +2,7 @@ | |||
2 | * include/linux/tipc_config.h: Include file for TIPC configuration interface | 2 | * include/linux/tipc_config.h: Include file for TIPC configuration interface |
3 | * | 3 | * |
4 | * Copyright (c) 2003-2006, Ericsson AB | 4 | * Copyright (c) 2003-2006, Ericsson AB |
5 | * Copyright (c) 2005-2007, Wind River Systems | 5 | * Copyright (c) 2005-2007, 2010-2011, Wind River Systems |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
8 | * Redistribution and use in source and binary forms, with or without | 8 | * Redistribution and use in source and binary forms, with or without |
@@ -76,13 +76,6 @@ | |||
76 | #define TIPC_CMD_SHOW_LINK_STATS 0x000B /* tx link_name, rx ultra_string */ | 76 | #define TIPC_CMD_SHOW_LINK_STATS 0x000B /* tx link_name, rx ultra_string */ |
77 | #define TIPC_CMD_SHOW_STATS 0x000F /* tx unsigned, rx ultra_string */ | 77 | #define TIPC_CMD_SHOW_STATS 0x000F /* tx unsigned, rx ultra_string */ |
78 | 78 | ||
79 | #if 0 | ||
80 | #define TIPC_CMD_SHOW_PORT_STATS 0x0008 /* tx port_ref, rx ultra_string */ | ||
81 | #define TIPC_CMD_RESET_PORT_STATS 0x0009 /* tx port_ref, rx none */ | ||
82 | #define TIPC_CMD_GET_ROUTES 0x000A /* tx ?, rx ? */ | ||
83 | #define TIPC_CMD_GET_LINK_PEER 0x000D /* tx link_name, rx ? */ | ||
84 | #endif | ||
85 | |||
86 | /* | 79 | /* |
87 | * Protected commands: | 80 | * Protected commands: |
88 | * May only be issued by "network administration capable" process. | 81 | * May only be issued by "network administration capable" process. |
@@ -96,7 +89,7 @@ | |||
96 | #define TIPC_CMD_GET_MAX_SUBSCR 0x4006 /* tx none, rx unsigned */ | 89 | #define TIPC_CMD_GET_MAX_SUBSCR 0x4006 /* tx none, rx unsigned */ |
97 | #define TIPC_CMD_GET_MAX_ZONES 0x4007 /* obsoleted */ | 90 | #define TIPC_CMD_GET_MAX_ZONES 0x4007 /* obsoleted */ |
98 | #define TIPC_CMD_GET_MAX_CLUSTERS 0x4008 /* obsoleted */ | 91 | #define TIPC_CMD_GET_MAX_CLUSTERS 0x4008 /* obsoleted */ |
99 | #define TIPC_CMD_GET_MAX_NODES 0x4009 /* tx none, rx unsigned */ | 92 | #define TIPC_CMD_GET_MAX_NODES 0x4009 /* obsoleted */ |
100 | #define TIPC_CMD_GET_MAX_SLAVES 0x400A /* obsoleted */ | 93 | #define TIPC_CMD_GET_MAX_SLAVES 0x400A /* obsoleted */ |
101 | #define TIPC_CMD_GET_NETID 0x400B /* tx none, rx unsigned */ | 94 | #define TIPC_CMD_GET_NETID 0x400B /* tx none, rx unsigned */ |
102 | 95 | ||
@@ -109,13 +102,6 @@ | |||
109 | #define TIPC_CMD_DUMP_LOG 0x410B /* tx none, rx ultra_string */ | 102 | #define TIPC_CMD_DUMP_LOG 0x410B /* tx none, rx ultra_string */ |
110 | #define TIPC_CMD_RESET_LINK_STATS 0x410C /* tx link_name, rx none */ | 103 | #define TIPC_CMD_RESET_LINK_STATS 0x410C /* tx link_name, rx none */ |
111 | 104 | ||
112 | #if 0 | ||
113 | #define TIPC_CMD_CREATE_LINK 0x4103 /* tx link_create, rx none */ | ||
114 | #define TIPC_CMD_REMOVE_LINK 0x4104 /* tx link_name, rx none */ | ||
115 | #define TIPC_CMD_BLOCK_LINK 0x4105 /* tx link_name, rx none */ | ||
116 | #define TIPC_CMD_UNBLOCK_LINK 0x4106 /* tx link_name, rx none */ | ||
117 | #endif | ||
118 | |||
119 | /* | 105 | /* |
120 | * Private commands: | 106 | * Private commands: |
121 | * May only be issued by "network administration capable" process. | 107 | * May only be issued by "network administration capable" process. |
@@ -123,16 +109,13 @@ | |||
123 | */ | 109 | */ |
124 | 110 | ||
125 | #define TIPC_CMD_SET_NODE_ADDR 0x8001 /* tx net_addr, rx none */ | 111 | #define TIPC_CMD_SET_NODE_ADDR 0x8001 /* tx net_addr, rx none */ |
126 | #if 0 | ||
127 | #define TIPC_CMD_SET_ZONE_MASTER 0x8002 /* tx none, rx none */ | ||
128 | #endif | ||
129 | #define TIPC_CMD_SET_REMOTE_MNG 0x8003 /* tx unsigned, rx none */ | 112 | #define TIPC_CMD_SET_REMOTE_MNG 0x8003 /* tx unsigned, rx none */ |
130 | #define TIPC_CMD_SET_MAX_PORTS 0x8004 /* tx unsigned, rx none */ | 113 | #define TIPC_CMD_SET_MAX_PORTS 0x8004 /* tx unsigned, rx none */ |
131 | #define TIPC_CMD_SET_MAX_PUBL 0x8005 /* tx unsigned, rx none */ | 114 | #define TIPC_CMD_SET_MAX_PUBL 0x8005 /* tx unsigned, rx none */ |
132 | #define TIPC_CMD_SET_MAX_SUBSCR 0x8006 /* tx unsigned, rx none */ | 115 | #define TIPC_CMD_SET_MAX_SUBSCR 0x8006 /* tx unsigned, rx none */ |
133 | #define TIPC_CMD_SET_MAX_ZONES 0x8007 /* obsoleted */ | 116 | #define TIPC_CMD_SET_MAX_ZONES 0x8007 /* obsoleted */ |
134 | #define TIPC_CMD_SET_MAX_CLUSTERS 0x8008 /* obsoleted */ | 117 | #define TIPC_CMD_SET_MAX_CLUSTERS 0x8008 /* obsoleted */ |
135 | #define TIPC_CMD_SET_MAX_NODES 0x8009 /* tx unsigned, rx none */ | 118 | #define TIPC_CMD_SET_MAX_NODES 0x8009 /* obsoleted */ |
136 | #define TIPC_CMD_SET_MAX_SLAVES 0x800A /* obsoleted */ | 119 | #define TIPC_CMD_SET_MAX_SLAVES 0x800A /* obsoleted */ |
137 | #define TIPC_CMD_SET_NETID 0x800B /* tx unsigned, rx none */ | 120 | #define TIPC_CMD_SET_NETID 0x800B /* tx unsigned, rx none */ |
138 | 121 | ||
@@ -193,6 +176,10 @@ | |||
193 | #define TIPC_DEF_LINK_TOL 1500 | 176 | #define TIPC_DEF_LINK_TOL 1500 |
194 | #define TIPC_MAX_LINK_TOL 30000 | 177 | #define TIPC_MAX_LINK_TOL 30000 |
195 | 178 | ||
179 | #if (TIPC_MIN_LINK_TOL < 16) | ||
180 | #error "TIPC_MIN_LINK_TOL is too small (abort limit may be NaN)" | ||
181 | #endif | ||
182 | |||
196 | /* | 183 | /* |
197 | * Link window limits (min, default, max), in packets | 184 | * Link window limits (min, default, max), in packets |
198 | */ | 185 | */ |
@@ -215,7 +202,7 @@ struct tipc_link_info { | |||
215 | 202 | ||
216 | struct tipc_bearer_config { | 203 | struct tipc_bearer_config { |
217 | __be32 priority; /* Range [1,31]. Override per link */ | 204 | __be32 priority; /* Range [1,31]. Override per link */ |
218 | __be32 detect_scope; | 205 | __be32 disc_domain; /* <Z.C.N> describing desired nodes */ |
219 | char name[TIPC_MAX_BEARER_NAME]; | 206 | char name[TIPC_MAX_BEARER_NAME]; |
220 | }; | 207 | }; |
221 | 208 | ||
@@ -247,15 +234,6 @@ struct tipc_name_table_query { | |||
247 | #define TIPC_CFG_NOT_SUPPORTED "\x84" /* request is not supported by TIPC */ | 234 | #define TIPC_CFG_NOT_SUPPORTED "\x84" /* request is not supported by TIPC */ |
248 | #define TIPC_CFG_INVALID_VALUE "\x85" /* request has invalid argument value */ | 235 | #define TIPC_CFG_INVALID_VALUE "\x85" /* request has invalid argument value */ |
249 | 236 | ||
250 | #if 0 | ||
251 | /* prototypes TLV structures for proposed commands */ | ||
252 | struct tipc_link_create { | ||
253 | __u32 domain; | ||
254 | struct tipc_media_addr peer_addr; | ||
255 | char bearer_name[TIPC_MAX_BEARER_NAME]; | ||
256 | }; | ||
257 | #endif | ||
258 | |||
259 | /* | 237 | /* |
260 | * A TLV consists of a descriptor, followed by the TLV value. | 238 | * A TLV consists of a descriptor, followed by the TLV value. |
261 | * TLV descriptor fields are stored in network byte order; | 239 | * TLV descriptor fields are stored in network byte order; |
diff --git a/include/linux/tty.h b/include/linux/tty.h index 54e4eaaa0561..9f469c700550 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -82,7 +82,7 @@ struct tty_buffer { | |||
82 | 82 | ||
83 | 83 | ||
84 | struct tty_bufhead { | 84 | struct tty_bufhead { |
85 | struct delayed_work work; | 85 | struct work_struct work; |
86 | spinlock_t lock; | 86 | spinlock_t lock; |
87 | struct tty_buffer *head; /* Queue head */ | 87 | struct tty_buffer *head; /* Queue head */ |
88 | struct tty_buffer *tail; /* Active buffer */ | 88 | struct tty_buffer *tail; /* Active buffer */ |
@@ -448,6 +448,7 @@ extern void tty_encode_baud_rate(struct tty_struct *tty, | |||
448 | speed_t ibaud, speed_t obaud); | 448 | speed_t ibaud, speed_t obaud); |
449 | extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old); | 449 | extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old); |
450 | extern int tty_termios_hw_change(struct ktermios *a, struct ktermios *b); | 450 | extern int tty_termios_hw_change(struct ktermios *a, struct ktermios *b); |
451 | extern int tty_set_termios(struct tty_struct *tty, struct ktermios *kt); | ||
451 | 452 | ||
452 | extern struct tty_ldisc *tty_ldisc_ref(struct tty_struct *); | 453 | extern struct tty_ldisc *tty_ldisc_ref(struct tty_struct *); |
453 | extern void tty_ldisc_deref(struct tty_ldisc *); | 454 | extern void tty_ldisc_deref(struct tty_ldisc *); |
@@ -584,10 +585,10 @@ extern int pcxe_open(struct tty_struct *tty, struct file *filp); | |||
584 | 585 | ||
585 | /* vt.c */ | 586 | /* vt.c */ |
586 | 587 | ||
587 | extern int vt_ioctl(struct tty_struct *tty, struct file *file, | 588 | extern int vt_ioctl(struct tty_struct *tty, |
588 | unsigned int cmd, unsigned long arg); | 589 | unsigned int cmd, unsigned long arg); |
589 | 590 | ||
590 | extern long vt_compat_ioctl(struct tty_struct *tty, struct file * file, | 591 | extern long vt_compat_ioctl(struct tty_struct *tty, |
591 | unsigned int cmd, unsigned long arg); | 592 | unsigned int cmd, unsigned long arg); |
592 | 593 | ||
593 | /* tty_mutex.c */ | 594 | /* tty_mutex.c */ |
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index c3d43eb4150c..9deeac855240 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h | |||
@@ -98,8 +98,7 @@ | |||
98 | * | 98 | * |
99 | * Note: Do not call this function directly, call tty_write_room | 99 | * Note: Do not call this function directly, call tty_write_room |
100 | * | 100 | * |
101 | * int (*ioctl)(struct tty_struct *tty, struct file * file, | 101 | * int (*ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); |
102 | * unsigned int cmd, unsigned long arg); | ||
103 | * | 102 | * |
104 | * This routine allows the tty driver to implement | 103 | * This routine allows the tty driver to implement |
105 | * device-specific ioctls. If the ioctl number passed in cmd | 104 | * device-specific ioctls. If the ioctl number passed in cmd |
@@ -107,7 +106,7 @@ | |||
107 | * | 106 | * |
108 | * Optional | 107 | * Optional |
109 | * | 108 | * |
110 | * long (*compat_ioctl)(struct tty_struct *tty, struct file * file, | 109 | * long (*compat_ioctl)(struct tty_struct *tty,, |
111 | * unsigned int cmd, unsigned long arg); | 110 | * unsigned int cmd, unsigned long arg); |
112 | * | 111 | * |
113 | * implement ioctl processing for 32 bit process on 64 bit system | 112 | * implement ioctl processing for 32 bit process on 64 bit system |
@@ -256,9 +255,9 @@ struct tty_operations { | |||
256 | void (*flush_chars)(struct tty_struct *tty); | 255 | void (*flush_chars)(struct tty_struct *tty); |
257 | int (*write_room)(struct tty_struct *tty); | 256 | int (*write_room)(struct tty_struct *tty); |
258 | int (*chars_in_buffer)(struct tty_struct *tty); | 257 | int (*chars_in_buffer)(struct tty_struct *tty); |
259 | int (*ioctl)(struct tty_struct *tty, struct file * file, | 258 | int (*ioctl)(struct tty_struct *tty, |
260 | unsigned int cmd, unsigned long arg); | 259 | unsigned int cmd, unsigned long arg); |
261 | long (*compat_ioctl)(struct tty_struct *tty, struct file * file, | 260 | long (*compat_ioctl)(struct tty_struct *tty, |
262 | unsigned int cmd, unsigned long arg); | 261 | unsigned int cmd, unsigned long arg); |
263 | void (*set_termios)(struct tty_struct *tty, struct ktermios * old); | 262 | void (*set_termios)(struct tty_struct *tty, struct ktermios * old); |
264 | void (*throttle)(struct tty_struct * tty); | 263 | void (*throttle)(struct tty_struct * tty); |
@@ -271,8 +270,8 @@ struct tty_operations { | |||
271 | void (*set_ldisc)(struct tty_struct *tty); | 270 | void (*set_ldisc)(struct tty_struct *tty); |
272 | void (*wait_until_sent)(struct tty_struct *tty, int timeout); | 271 | void (*wait_until_sent)(struct tty_struct *tty, int timeout); |
273 | void (*send_xchar)(struct tty_struct *tty, char ch); | 272 | void (*send_xchar)(struct tty_struct *tty, char ch); |
274 | int (*tiocmget)(struct tty_struct *tty, struct file *file); | 273 | int (*tiocmget)(struct tty_struct *tty); |
275 | int (*tiocmset)(struct tty_struct *tty, struct file *file, | 274 | int (*tiocmset)(struct tty_struct *tty, |
276 | unsigned int set, unsigned int clear); | 275 | unsigned int set, unsigned int clear); |
277 | int (*resize)(struct tty_struct *tty, struct winsize *ws); | 276 | int (*resize)(struct tty_struct *tty, struct winsize *ws); |
278 | int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); | 277 | int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); |
diff --git a/include/linux/types.h b/include/linux/types.h index c2a9eb44f2fa..176da8c1fbb1 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
@@ -150,6 +150,12 @@ typedef unsigned long blkcnt_t; | |||
150 | #define pgoff_t unsigned long | 150 | #define pgoff_t unsigned long |
151 | #endif | 151 | #endif |
152 | 152 | ||
153 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | ||
154 | typedef u64 dma_addr_t; | ||
155 | #else | ||
156 | typedef u32 dma_addr_t; | ||
157 | #endif /* dma_addr_t */ | ||
158 | |||
153 | #endif /* __KERNEL__ */ | 159 | #endif /* __KERNEL__ */ |
154 | 160 | ||
155 | /* | 161 | /* |
diff --git a/include/linux/usb.h b/include/linux/usb.h index bd69b65f3356..e63efeb378e3 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -976,6 +976,7 @@ extern int usb_disabled(void); | |||
976 | #define URB_SETUP_MAP_SINGLE 0x00100000 /* Setup packet DMA mapped */ | 976 | #define URB_SETUP_MAP_SINGLE 0x00100000 /* Setup packet DMA mapped */ |
977 | #define URB_SETUP_MAP_LOCAL 0x00200000 /* HCD-local setup packet */ | 977 | #define URB_SETUP_MAP_LOCAL 0x00200000 /* HCD-local setup packet */ |
978 | #define URB_DMA_SG_COMBINED 0x00400000 /* S-G entries were combined */ | 978 | #define URB_DMA_SG_COMBINED 0x00400000 /* S-G entries were combined */ |
979 | #define URB_ALIGNED_TEMP_BUFFER 0x00800000 /* Temp buffer was alloc'd */ | ||
979 | 980 | ||
980 | struct usb_iso_packet_descriptor { | 981 | struct usb_iso_packet_descriptor { |
981 | unsigned int offset; | 982 | unsigned int offset; |
diff --git a/include/linux/usb/Kbuild b/include/linux/usb/Kbuild index 51410e0200cf..ed91fb62674b 100644 --- a/include/linux/usb/Kbuild +++ b/include/linux/usb/Kbuild | |||
@@ -2,6 +2,7 @@ header-y += audio.h | |||
2 | header-y += cdc.h | 2 | header-y += cdc.h |
3 | header-y += ch9.h | 3 | header-y += ch9.h |
4 | header-y += ch11.h | 4 | header-y += ch11.h |
5 | header-y += functionfs.h | ||
5 | header-y += gadgetfs.h | 6 | header-y += gadgetfs.h |
6 | header-y += midi.h | 7 | header-y += midi.h |
7 | header-y += g_printer.h | 8 | header-y += g_printer.h |
diff --git a/include/linux/usb/ch11.h b/include/linux/usb/ch11.h index 10ec0699bea4..4ebaf0824179 100644 --- a/include/linux/usb/ch11.h +++ b/include/linux/usb/ch11.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #define HUB_RESET_TT 9 | 26 | #define HUB_RESET_TT 9 |
27 | #define HUB_GET_TT_STATE 10 | 27 | #define HUB_GET_TT_STATE 10 |
28 | #define HUB_STOP_TT 11 | 28 | #define HUB_STOP_TT 11 |
29 | #define HUB_SET_DEPTH 12 | ||
29 | 30 | ||
30 | /* | 31 | /* |
31 | * Hub class additional requests defined by USB 3.0 spec | 32 | * Hub class additional requests defined by USB 3.0 spec |
@@ -61,6 +62,12 @@ | |||
61 | #define USB_PORT_FEAT_TEST 21 | 62 | #define USB_PORT_FEAT_TEST 21 |
62 | #define USB_PORT_FEAT_INDICATOR 22 | 63 | #define USB_PORT_FEAT_INDICATOR 22 |
63 | #define USB_PORT_FEAT_C_PORT_L1 23 | 64 | #define USB_PORT_FEAT_C_PORT_L1 23 |
65 | #define USB_PORT_FEAT_C_PORT_LINK_STATE 25 | ||
66 | #define USB_PORT_FEAT_C_PORT_CONFIG_ERROR 26 | ||
67 | #define USB_PORT_FEAT_PORT_REMOTE_WAKE_MASK 27 | ||
68 | #define USB_PORT_FEAT_BH_PORT_RESET 28 | ||
69 | #define USB_PORT_FEAT_C_BH_PORT_RESET 29 | ||
70 | #define USB_PORT_FEAT_FORCE_LINKPM_ACCEPT 30 | ||
64 | 71 | ||
65 | /* | 72 | /* |
66 | * Port feature selectors added by USB 3.0 spec. | 73 | * Port feature selectors added by USB 3.0 spec. |
@@ -102,7 +109,6 @@ struct usb_port_status { | |||
102 | #define USB_PORT_STAT_TEST 0x0800 | 109 | #define USB_PORT_STAT_TEST 0x0800 |
103 | #define USB_PORT_STAT_INDICATOR 0x1000 | 110 | #define USB_PORT_STAT_INDICATOR 0x1000 |
104 | /* bits 13 to 15 are reserved */ | 111 | /* bits 13 to 15 are reserved */ |
105 | #define USB_PORT_STAT_SUPER_SPEED 0x8000 /* Linux-internal */ | ||
106 | 112 | ||
107 | /* | 113 | /* |
108 | * Additions to wPortStatus bit field from USB 3.0 | 114 | * Additions to wPortStatus bit field from USB 3.0 |
@@ -110,8 +116,14 @@ struct usb_port_status { | |||
110 | */ | 116 | */ |
111 | #define USB_PORT_STAT_LINK_STATE 0x01e0 | 117 | #define USB_PORT_STAT_LINK_STATE 0x01e0 |
112 | #define USB_SS_PORT_STAT_POWER 0x0200 | 118 | #define USB_SS_PORT_STAT_POWER 0x0200 |
119 | #define USB_SS_PORT_STAT_SPEED 0x1c00 | ||
113 | #define USB_PORT_STAT_SPEED_5GBPS 0x0000 | 120 | #define USB_PORT_STAT_SPEED_5GBPS 0x0000 |
114 | /* Valid only if port is enabled */ | 121 | /* Valid only if port is enabled */ |
122 | /* Bits that are the same from USB 2.0 */ | ||
123 | #define USB_SS_PORT_STAT_MASK (USB_PORT_STAT_CONNECTION | \ | ||
124 | USB_PORT_STAT_ENABLE | \ | ||
125 | USB_PORT_STAT_OVERCURRENT | \ | ||
126 | USB_PORT_STAT_RESET) | ||
115 | 127 | ||
116 | /* | 128 | /* |
117 | * Definitions for PORT_LINK_STATE values | 129 | * Definitions for PORT_LINK_STATE values |
@@ -132,8 +144,8 @@ struct usb_port_status { | |||
132 | 144 | ||
133 | /* | 145 | /* |
134 | * wPortChange bit field | 146 | * wPortChange bit field |
135 | * See USB 2.0 spec Table 11-22 | 147 | * See USB 2.0 spec Table 11-22 and USB 2.0 LPM ECN Table-4.10 |
136 | * Bits 0 to 4 shown, bits 5 to 15 are reserved | 148 | * Bits 0 to 5 shown, bits 6 to 15 are reserved |
137 | */ | 149 | */ |
138 | #define USB_PORT_STAT_C_CONNECTION 0x0001 | 150 | #define USB_PORT_STAT_C_CONNECTION 0x0001 |
139 | #define USB_PORT_STAT_C_ENABLE 0x0002 | 151 | #define USB_PORT_STAT_C_ENABLE 0x0002 |
@@ -141,6 +153,13 @@ struct usb_port_status { | |||
141 | #define USB_PORT_STAT_C_OVERCURRENT 0x0008 | 153 | #define USB_PORT_STAT_C_OVERCURRENT 0x0008 |
142 | #define USB_PORT_STAT_C_RESET 0x0010 | 154 | #define USB_PORT_STAT_C_RESET 0x0010 |
143 | #define USB_PORT_STAT_C_L1 0x0020 | 155 | #define USB_PORT_STAT_C_L1 0x0020 |
156 | /* | ||
157 | * USB 3.0 wPortChange bit fields | ||
158 | * See USB 3.0 spec Table 10-11 | ||
159 | */ | ||
160 | #define USB_PORT_STAT_C_BH_RESET 0x0020 | ||
161 | #define USB_PORT_STAT_C_LINK_STATE 0x0040 | ||
162 | #define USB_PORT_STAT_C_CONFIG_ERROR 0x0080 | ||
144 | 163 | ||
145 | /* | 164 | /* |
146 | * wHubCharacteristics (masks) | 165 | * wHubCharacteristics (masks) |
@@ -175,7 +194,9 @@ struct usb_hub_status { | |||
175 | */ | 194 | */ |
176 | 195 | ||
177 | #define USB_DT_HUB (USB_TYPE_CLASS | 0x09) | 196 | #define USB_DT_HUB (USB_TYPE_CLASS | 0x09) |
197 | #define USB_DT_SS_HUB (USB_TYPE_CLASS | 0x0a) | ||
178 | #define USB_DT_HUB_NONVAR_SIZE 7 | 198 | #define USB_DT_HUB_NONVAR_SIZE 7 |
199 | #define USB_DT_SS_HUB_SIZE 12 | ||
179 | 200 | ||
180 | struct usb_hub_descriptor { | 201 | struct usb_hub_descriptor { |
181 | __u8 bDescLength; | 202 | __u8 bDescLength; |
@@ -184,11 +205,22 @@ struct usb_hub_descriptor { | |||
184 | __le16 wHubCharacteristics; | 205 | __le16 wHubCharacteristics; |
185 | __u8 bPwrOn2PwrGood; | 206 | __u8 bPwrOn2PwrGood; |
186 | __u8 bHubContrCurrent; | 207 | __u8 bHubContrCurrent; |
187 | /* add 1 bit for hub status change; round to bytes */ | ||
188 | __u8 DeviceRemovable[(USB_MAXCHILDREN + 1 + 7) / 8]; | ||
189 | __u8 PortPwrCtrlMask[(USB_MAXCHILDREN + 1 + 7) / 8]; | ||
190 | } __attribute__ ((packed)); | ||
191 | 208 | ||
209 | /* 2.0 and 3.0 hubs differ here */ | ||
210 | union { | ||
211 | struct { | ||
212 | /* add 1 bit for hub status change; round to bytes */ | ||
213 | __u8 DeviceRemovable[(USB_MAXCHILDREN + 1 + 7) / 8]; | ||
214 | __u8 PortPwrCtrlMask[(USB_MAXCHILDREN + 1 + 7) / 8]; | ||
215 | } __attribute__ ((packed)) hs; | ||
216 | |||
217 | struct { | ||
218 | __u8 bHubHdrDecLat; | ||
219 | __u16 wHubDelay; | ||
220 | __u16 DeviceRemovable; | ||
221 | } __attribute__ ((packed)) ss; | ||
222 | } u; | ||
223 | } __attribute__ ((packed)); | ||
192 | 224 | ||
193 | /* port indicator status selectors, tables 11-7 and 11-25 */ | 225 | /* port indicator status selectors, tables 11-7 and 11-25 */ |
194 | #define HUB_LED_AUTO 0 | 226 | #define HUB_LED_AUTO 0 |
diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index ab461948b579..b72f305ce6bd 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h | |||
@@ -584,7 +584,9 @@ struct usb_ss_ep_comp_descriptor { | |||
584 | 584 | ||
585 | #define USB_DT_SS_EP_COMP_SIZE 6 | 585 | #define USB_DT_SS_EP_COMP_SIZE 6 |
586 | /* Bits 4:0 of bmAttributes if this is a bulk endpoint */ | 586 | /* Bits 4:0 of bmAttributes if this is a bulk endpoint */ |
587 | #define USB_SS_MAX_STREAMS(p) (1 << (p & 0x1f)) | 587 | #define USB_SS_MAX_STREAMS(p) (1 << ((p) & 0x1f)) |
588 | /* Bits 1:0 of bmAttributes if this is an isoc endpoint */ | ||
589 | #define USB_SS_MULT(p) (1 + ((p) & 0x3)) | ||
588 | 590 | ||
589 | /*-------------------------------------------------------------------------*/ | 591 | /*-------------------------------------------------------------------------*/ |
590 | 592 | ||
diff --git a/include/linux/usb/ehci_def.h b/include/linux/usb/ehci_def.h index 2e262cb15425..656380245198 100644 --- a/include/linux/usb/ehci_def.h +++ b/include/linux/usb/ehci_def.h | |||
@@ -127,7 +127,9 @@ struct ehci_regs { | |||
127 | #define PORT_WKDISC_E (1<<21) /* wake on disconnect (enable) */ | 127 | #define PORT_WKDISC_E (1<<21) /* wake on disconnect (enable) */ |
128 | #define PORT_WKCONN_E (1<<20) /* wake on connect (enable) */ | 128 | #define PORT_WKCONN_E (1<<20) /* wake on connect (enable) */ |
129 | /* 19:16 for port testing */ | 129 | /* 19:16 for port testing */ |
130 | #define PORT_TEST_PKT (0x4<<16) /* Port Test Control - packet test */ | 130 | #define PORT_TEST(x) (((x)&0xf)<<16) /* Port Test Control */ |
131 | #define PORT_TEST_PKT PORT_TEST(0x4) /* Port Test Control - packet test */ | ||
132 | #define PORT_TEST_FORCE PORT_TEST(0x5) /* Port Test Control - force enable */ | ||
131 | #define PORT_LED_OFF (0<<14) | 133 | #define PORT_LED_OFF (0<<14) |
132 | #define PORT_LED_AMBER (1<<14) | 134 | #define PORT_LED_AMBER (1<<14) |
133 | #define PORT_LED_GREEN (2<<14) | 135 | #define PORT_LED_GREEN (2<<14) |
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index a854fe89484e..0097136ba45d 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h | |||
@@ -76,6 +76,10 @@ struct usb_hcd { | |||
76 | struct kref kref; /* reference counter */ | 76 | struct kref kref; /* reference counter */ |
77 | 77 | ||
78 | const char *product_desc; /* product/vendor string */ | 78 | const char *product_desc; /* product/vendor string */ |
79 | int speed; /* Speed for this roothub. | ||
80 | * May be different from | ||
81 | * hcd->driver->flags & HCD_MASK | ||
82 | */ | ||
79 | char irq_descr[24]; /* driver + bus # */ | 83 | char irq_descr[24]; /* driver + bus # */ |
80 | 84 | ||
81 | struct timer_list rh_timer; /* drives root-hub polling */ | 85 | struct timer_list rh_timer; /* drives root-hub polling */ |
@@ -99,6 +103,8 @@ struct usb_hcd { | |||
99 | #define HCD_FLAG_POLL_RH 2 /* poll for rh status? */ | 103 | #define HCD_FLAG_POLL_RH 2 /* poll for rh status? */ |
100 | #define HCD_FLAG_POLL_PENDING 3 /* status has changed? */ | 104 | #define HCD_FLAG_POLL_PENDING 3 /* status has changed? */ |
101 | #define HCD_FLAG_WAKEUP_PENDING 4 /* root hub is resuming? */ | 105 | #define HCD_FLAG_WAKEUP_PENDING 4 /* root hub is resuming? */ |
106 | #define HCD_FLAG_RH_RUNNING 5 /* root hub is running? */ | ||
107 | #define HCD_FLAG_DEAD 6 /* controller has died? */ | ||
102 | 108 | ||
103 | /* The flags can be tested using these macros; they are likely to | 109 | /* The flags can be tested using these macros; they are likely to |
104 | * be slightly faster than test_bit(). | 110 | * be slightly faster than test_bit(). |
@@ -108,6 +114,8 @@ struct usb_hcd { | |||
108 | #define HCD_POLL_RH(hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_RH)) | 114 | #define HCD_POLL_RH(hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_RH)) |
109 | #define HCD_POLL_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING)) | 115 | #define HCD_POLL_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING)) |
110 | #define HCD_WAKEUP_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING)) | 116 | #define HCD_WAKEUP_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING)) |
117 | #define HCD_RH_RUNNING(hcd) ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING)) | ||
118 | #define HCD_DEAD(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEAD)) | ||
111 | 119 | ||
112 | /* Flags that get set only during HCD registration or removal. */ | 120 | /* Flags that get set only during HCD registration or removal. */ |
113 | unsigned rh_registered:1;/* is root hub registered? */ | 121 | unsigned rh_registered:1;/* is root hub registered? */ |
@@ -138,7 +146,9 @@ struct usb_hcd { | |||
138 | * bandwidth_mutex should be dropped after a successful control message | 146 | * bandwidth_mutex should be dropped after a successful control message |
139 | * to the device, or resetting the bandwidth after a failed attempt. | 147 | * to the device, or resetting the bandwidth after a failed attempt. |
140 | */ | 148 | */ |
141 | struct mutex bandwidth_mutex; | 149 | struct mutex *bandwidth_mutex; |
150 | struct usb_hcd *shared_hcd; | ||
151 | struct usb_hcd *primary_hcd; | ||
142 | 152 | ||
143 | 153 | ||
144 | #define HCD_BUFFER_POOLS 4 | 154 | #define HCD_BUFFER_POOLS 4 |
@@ -201,6 +211,7 @@ struct hc_driver { | |||
201 | int flags; | 211 | int flags; |
202 | #define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */ | 212 | #define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */ |
203 | #define HCD_LOCAL_MEM 0x0002 /* HC needs local memory */ | 213 | #define HCD_LOCAL_MEM 0x0002 /* HC needs local memory */ |
214 | #define HCD_SHARED 0x0004 /* Two (or more) usb_hcds share HW */ | ||
204 | #define HCD_USB11 0x0010 /* USB 1.1 */ | 215 | #define HCD_USB11 0x0010 /* USB 1.1 */ |
205 | #define HCD_USB2 0x0020 /* USB 2.0 */ | 216 | #define HCD_USB2 0x0020 /* USB 2.0 */ |
206 | #define HCD_USB3 0x0040 /* USB 3.0 */ | 217 | #define HCD_USB3 0x0040 /* USB 3.0 */ |
@@ -234,6 +245,19 @@ struct hc_driver { | |||
234 | int (*urb_dequeue)(struct usb_hcd *hcd, | 245 | int (*urb_dequeue)(struct usb_hcd *hcd, |
235 | struct urb *urb, int status); | 246 | struct urb *urb, int status); |
236 | 247 | ||
248 | /* | ||
249 | * (optional) these hooks allow an HCD to override the default DMA | ||
250 | * mapping and unmapping routines. In general, they shouldn't be | ||
251 | * necessary unless the host controller has special DMA requirements, | ||
252 | * such as alignment contraints. If these are not specified, the | ||
253 | * general usb_hcd_(un)?map_urb_for_dma functions will be used instead | ||
254 | * (and it may be a good idea to call these functions in your HCD | ||
255 | * implementation) | ||
256 | */ | ||
257 | int (*map_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb, | ||
258 | gfp_t mem_flags); | ||
259 | void (*unmap_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb); | ||
260 | |||
237 | /* hw synch, freeing endpoint resources that urb_dequeue can't */ | 261 | /* hw synch, freeing endpoint resources that urb_dequeue can't */ |
238 | void (*endpoint_disable)(struct usb_hcd *hcd, | 262 | void (*endpoint_disable)(struct usb_hcd *hcd, |
239 | struct usb_host_endpoint *ep); | 263 | struct usb_host_endpoint *ep); |
@@ -330,8 +354,10 @@ extern int usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags); | |||
330 | extern int usb_hcd_unlink_urb(struct urb *urb, int status); | 354 | extern int usb_hcd_unlink_urb(struct urb *urb, int status); |
331 | extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, | 355 | extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, |
332 | int status); | 356 | int status); |
333 | extern void unmap_urb_setup_for_dma(struct usb_hcd *, struct urb *); | 357 | extern int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, |
334 | extern void unmap_urb_for_dma(struct usb_hcd *, struct urb *); | 358 | gfp_t mem_flags); |
359 | extern void usb_hcd_unmap_urb_setup_for_dma(struct usb_hcd *, struct urb *); | ||
360 | extern void usb_hcd_unmap_urb_for_dma(struct usb_hcd *, struct urb *); | ||
335 | extern void usb_hcd_flush_endpoint(struct usb_device *udev, | 361 | extern void usb_hcd_flush_endpoint(struct usb_device *udev, |
336 | struct usb_host_endpoint *ep); | 362 | struct usb_host_endpoint *ep); |
337 | extern void usb_hcd_disable_endpoint(struct usb_device *udev, | 363 | extern void usb_hcd_disable_endpoint(struct usb_device *udev, |
@@ -347,8 +373,12 @@ extern int usb_hcd_get_frame_number(struct usb_device *udev); | |||
347 | 373 | ||
348 | extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, | 374 | extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, |
349 | struct device *dev, const char *bus_name); | 375 | struct device *dev, const char *bus_name); |
376 | extern struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver, | ||
377 | struct device *dev, const char *bus_name, | ||
378 | struct usb_hcd *shared_hcd); | ||
350 | extern struct usb_hcd *usb_get_hcd(struct usb_hcd *hcd); | 379 | extern struct usb_hcd *usb_get_hcd(struct usb_hcd *hcd); |
351 | extern void usb_put_hcd(struct usb_hcd *hcd); | 380 | extern void usb_put_hcd(struct usb_hcd *hcd); |
381 | extern int usb_hcd_is_primary_hcd(struct usb_hcd *hcd); | ||
352 | extern int usb_add_hcd(struct usb_hcd *hcd, | 382 | extern int usb_add_hcd(struct usb_hcd *hcd, |
353 | unsigned int irqnum, unsigned long irqflags); | 383 | unsigned int irqnum, unsigned long irqflags); |
354 | extern void usb_remove_hcd(struct usb_hcd *hcd); | 384 | extern void usb_remove_hcd(struct usb_hcd *hcd); |
@@ -622,13 +652,6 @@ static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb, | |||
622 | 652 | ||
623 | /*-------------------------------------------------------------------------*/ | 653 | /*-------------------------------------------------------------------------*/ |
624 | 654 | ||
625 | /* hub.h ... DeviceRemovable in 2.4.2-ac11, gone in 2.4.10 */ | ||
626 | /* bleech -- resurfaced in 2.4.11 or 2.4.12 */ | ||
627 | #define bitmap DeviceRemovable | ||
628 | |||
629 | |||
630 | /*-------------------------------------------------------------------------*/ | ||
631 | |||
632 | /* random stuff */ | 655 | /* random stuff */ |
633 | 656 | ||
634 | #define RUN_CONTEXT (in_irq() ? "in_irq" \ | 657 | #define RUN_CONTEXT (in_irq() ? "in_irq" \ |
diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h index 3675e03b1539..3657403eac18 100644 --- a/include/linux/usb/msm_hsusb.h +++ b/include/linux/usb/msm_hsusb.h | |||
@@ -55,7 +55,7 @@ enum otg_control_type { | |||
55 | 55 | ||
56 | /** | 56 | /** |
57 | * struct msm_otg_platform_data - platform device data | 57 | * struct msm_otg_platform_data - platform device data |
58 | * for msm72k_otg driver. | 58 | * for msm_otg driver. |
59 | * @phy_init_seq: PHY configuration sequence. val, reg pairs | 59 | * @phy_init_seq: PHY configuration sequence. val, reg pairs |
60 | * terminated by -1. | 60 | * terminated by -1. |
61 | * @vbus_power: VBUS power on/off routine. | 61 | * @vbus_power: VBUS power on/off routine. |
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h index a1a1e7a73ec9..6e40718f5abe 100644 --- a/include/linux/usb/otg.h +++ b/include/linux/usb/otg.h | |||
@@ -66,6 +66,7 @@ struct otg_transceiver { | |||
66 | 66 | ||
67 | u8 default_a; | 67 | u8 default_a; |
68 | enum usb_otg_state state; | 68 | enum usb_otg_state state; |
69 | enum usb_xceiv_events last_event; | ||
69 | 70 | ||
70 | struct usb_bus *host; | 71 | struct usb_bus *host; |
71 | struct usb_gadget *gadget; | 72 | struct usb_gadget *gadget; |
@@ -74,7 +75,7 @@ struct otg_transceiver { | |||
74 | void __iomem *io_priv; | 75 | void __iomem *io_priv; |
75 | 76 | ||
76 | /* for notification of usb_xceiv_events */ | 77 | /* for notification of usb_xceiv_events */ |
77 | struct blocking_notifier_head notifier; | 78 | struct atomic_notifier_head notifier; |
78 | 79 | ||
79 | /* to pass extra port status to the root hub */ | 80 | /* to pass extra port status to the root hub */ |
80 | u16 port_status; | 81 | u16 port_status; |
@@ -234,13 +235,13 @@ otg_start_srp(struct otg_transceiver *otg) | |||
234 | static inline int | 235 | static inline int |
235 | otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb) | 236 | otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb) |
236 | { | 237 | { |
237 | return blocking_notifier_chain_register(&otg->notifier, nb); | 238 | return atomic_notifier_chain_register(&otg->notifier, nb); |
238 | } | 239 | } |
239 | 240 | ||
240 | static inline void | 241 | static inline void |
241 | otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb) | 242 | otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb) |
242 | { | 243 | { |
243 | blocking_notifier_chain_unregister(&otg->notifier, nb); | 244 | atomic_notifier_chain_unregister(&otg->notifier, nb); |
244 | } | 245 | } |
245 | 246 | ||
246 | /* for OTG controller drivers (and maybe other stuff) */ | 247 | /* for OTG controller drivers (and maybe other stuff) */ |
diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index c9049139a7a5..b29f70b2ecae 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h | |||
@@ -191,7 +191,8 @@ static inline void usb_set_serial_data(struct usb_serial *serial, void *data) | |||
191 | * @id_table: pointer to a list of usb_device_id structures that define all | 191 | * @id_table: pointer to a list of usb_device_id structures that define all |
192 | * of the devices this structure can support. | 192 | * of the devices this structure can support. |
193 | * @num_ports: the number of different ports this device will have. | 193 | * @num_ports: the number of different ports this device will have. |
194 | * @bulk_in_size: bytes to allocate for bulk-in buffer (0 = end-point size) | 194 | * @bulk_in_size: minimum number of bytes to allocate for bulk-in buffer |
195 | * (0 = end-point size) | ||
195 | * @bulk_out_size: bytes to allocate for bulk-out buffer (0 = end-point size) | 196 | * @bulk_out_size: bytes to allocate for bulk-out buffer (0 = end-point size) |
196 | * @calc_num_ports: pointer to a function to determine how many ports this | 197 | * @calc_num_ports: pointer to a function to determine how many ports this |
197 | * device has dynamically. It will be called after the probe() | 198 | * device has dynamically. It will be called after the probe() |
@@ -260,7 +261,7 @@ struct usb_serial_driver { | |||
260 | const unsigned char *buf, int count); | 261 | const unsigned char *buf, int count); |
261 | /* Called only by the tty layer */ | 262 | /* Called only by the tty layer */ |
262 | int (*write_room)(struct tty_struct *tty); | 263 | int (*write_room)(struct tty_struct *tty); |
263 | int (*ioctl)(struct tty_struct *tty, struct file *file, | 264 | int (*ioctl)(struct tty_struct *tty, |
264 | unsigned int cmd, unsigned long arg); | 265 | unsigned int cmd, unsigned long arg); |
265 | void (*set_termios)(struct tty_struct *tty, | 266 | void (*set_termios)(struct tty_struct *tty, |
266 | struct usb_serial_port *port, struct ktermios *old); | 267 | struct usb_serial_port *port, struct ktermios *old); |
@@ -268,8 +269,8 @@ struct usb_serial_driver { | |||
268 | int (*chars_in_buffer)(struct tty_struct *tty); | 269 | int (*chars_in_buffer)(struct tty_struct *tty); |
269 | void (*throttle)(struct tty_struct *tty); | 270 | void (*throttle)(struct tty_struct *tty); |
270 | void (*unthrottle)(struct tty_struct *tty); | 271 | void (*unthrottle)(struct tty_struct *tty); |
271 | int (*tiocmget)(struct tty_struct *tty, struct file *file); | 272 | int (*tiocmget)(struct tty_struct *tty); |
272 | int (*tiocmset)(struct tty_struct *tty, struct file *file, | 273 | int (*tiocmset)(struct tty_struct *tty, |
273 | unsigned int set, unsigned int clear); | 274 | unsigned int set, unsigned int clear); |
274 | int (*get_icount)(struct tty_struct *tty, | 275 | int (*get_icount)(struct tty_struct *tty, |
275 | struct serial_icounter_struct *icount); | 276 | struct serial_icounter_struct *icount); |
diff --git a/include/linux/usb/ulpi.h b/include/linux/usb/ulpi.h index 82b1507f4735..9595796d62ed 100644 --- a/include/linux/usb/ulpi.h +++ b/include/linux/usb/ulpi.h | |||
@@ -184,4 +184,9 @@ | |||
184 | struct otg_transceiver *otg_ulpi_create(struct otg_io_access_ops *ops, | 184 | struct otg_transceiver *otg_ulpi_create(struct otg_io_access_ops *ops, |
185 | unsigned int flags); | 185 | unsigned int flags); |
186 | 186 | ||
187 | #ifdef CONFIG_USB_ULPI_VIEWPORT | ||
188 | /* access ops for controllers with a viewport register */ | ||
189 | extern struct otg_io_access_ops ulpi_viewport_access_ops; | ||
190 | #endif | ||
191 | |||
187 | #endif /* __LINUX_USB_ULPI_H */ | 192 | #endif /* __LINUX_USB_ULPI_H */ |
diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 833e676d6d92..461c0119664f 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h | |||
@@ -220,12 +220,12 @@ static inline unsigned long node_page_state(int node, | |||
220 | zone_page_state(&zones[ZONE_MOVABLE], item); | 220 | zone_page_state(&zones[ZONE_MOVABLE], item); |
221 | } | 221 | } |
222 | 222 | ||
223 | extern void zone_statistics(struct zone *, struct zone *); | 223 | extern void zone_statistics(struct zone *, struct zone *, gfp_t gfp); |
224 | 224 | ||
225 | #else | 225 | #else |
226 | 226 | ||
227 | #define node_page_state(node, item) global_page_state(item) | 227 | #define node_page_state(node, item) global_page_state(item) |
228 | #define zone_statistics(_zl,_z) do { } while (0) | 228 | #define zone_statistics(_zl, _z, gfp) do { } while (0) |
229 | 229 | ||
230 | #endif /* CONFIG_NUMA */ | 230 | #endif /* CONFIG_NUMA */ |
231 | 231 | ||
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 6625cc1ab758..4d05e14ea60c 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h | |||
@@ -142,14 +142,6 @@ static inline bool vt_force_oops_output(struct vc_data *vc) | |||
142 | return false; | 142 | return false; |
143 | } | 143 | } |
144 | 144 | ||
145 | /* | ||
146 | * vc_screen.c shares this temporary buffer with the console write code so that | ||
147 | * we can easily avoid touching user space while holding the console spinlock. | ||
148 | */ | ||
149 | |||
150 | #define CON_BUF_SIZE (CONFIG_BASE_SMALL ? 256 : PAGE_SIZE) | ||
151 | extern char con_buf[CON_BUF_SIZE]; | ||
152 | extern struct mutex con_buf_mtx; | ||
153 | extern char vt_dont_switch; | 145 | extern char vt_dont_switch; |
154 | extern int default_utf8; | 146 | extern int default_utf8; |
155 | extern int global_cursor_default; | 147 | extern int global_cursor_default; |
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index f7998a3bf020..f584aba78ca9 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
@@ -286,11 +286,15 @@ enum { | |||
286 | * any specific CPU, not concurrency managed, and all queued works are | 286 | * any specific CPU, not concurrency managed, and all queued works are |
287 | * executed immediately as long as max_active limit is not reached and | 287 | * executed immediately as long as max_active limit is not reached and |
288 | * resources are available. | 288 | * resources are available. |
289 | * | ||
290 | * system_freezable_wq is equivalent to system_wq except that it's | ||
291 | * freezable. | ||
289 | */ | 292 | */ |
290 | extern struct workqueue_struct *system_wq; | 293 | extern struct workqueue_struct *system_wq; |
291 | extern struct workqueue_struct *system_long_wq; | 294 | extern struct workqueue_struct *system_long_wq; |
292 | extern struct workqueue_struct *system_nrt_wq; | 295 | extern struct workqueue_struct *system_nrt_wq; |
293 | extern struct workqueue_struct *system_unbound_wq; | 296 | extern struct workqueue_struct *system_unbound_wq; |
297 | extern struct workqueue_struct *system_freezable_wq; | ||
294 | 298 | ||
295 | extern struct workqueue_struct * | 299 | extern struct workqueue_struct * |
296 | __alloc_workqueue_key(const char *name, unsigned int flags, int max_active, | 300 | __alloc_workqueue_key(const char *name, unsigned int flags, int max_active, |
diff --git a/include/linux/xattr.h b/include/linux/xattr.h index e6131ef98d8f..6050783005bd 100644 --- a/include/linux/xattr.h +++ b/include/linux/xattr.h | |||
@@ -42,11 +42,13 @@ | |||
42 | #define XATTR_SMACK_IPOUT "SMACK64IPOUT" | 42 | #define XATTR_SMACK_IPOUT "SMACK64IPOUT" |
43 | #define XATTR_SMACK_EXEC "SMACK64EXEC" | 43 | #define XATTR_SMACK_EXEC "SMACK64EXEC" |
44 | #define XATTR_SMACK_TRANSMUTE "SMACK64TRANSMUTE" | 44 | #define XATTR_SMACK_TRANSMUTE "SMACK64TRANSMUTE" |
45 | #define XATTR_SMACK_MMAP "SMACK64MMAP" | ||
45 | #define XATTR_NAME_SMACK XATTR_SECURITY_PREFIX XATTR_SMACK_SUFFIX | 46 | #define XATTR_NAME_SMACK XATTR_SECURITY_PREFIX XATTR_SMACK_SUFFIX |
46 | #define XATTR_NAME_SMACKIPIN XATTR_SECURITY_PREFIX XATTR_SMACK_IPIN | 47 | #define XATTR_NAME_SMACKIPIN XATTR_SECURITY_PREFIX XATTR_SMACK_IPIN |
47 | #define XATTR_NAME_SMACKIPOUT XATTR_SECURITY_PREFIX XATTR_SMACK_IPOUT | 48 | #define XATTR_NAME_SMACKIPOUT XATTR_SECURITY_PREFIX XATTR_SMACK_IPOUT |
48 | #define XATTR_NAME_SMACKEXEC XATTR_SECURITY_PREFIX XATTR_SMACK_EXEC | 49 | #define XATTR_NAME_SMACKEXEC XATTR_SECURITY_PREFIX XATTR_SMACK_EXEC |
49 | #define XATTR_NAME_SMACKTRANSMUTE XATTR_SECURITY_PREFIX XATTR_SMACK_TRANSMUTE | 50 | #define XATTR_NAME_SMACKTRANSMUTE XATTR_SECURITY_PREFIX XATTR_SMACK_TRANSMUTE |
51 | #define XATTR_NAME_SMACKMMAP XATTR_SECURITY_PREFIX XATTR_SMACK_MMAP | ||
50 | 52 | ||
51 | #define XATTR_CAPS_SUFFIX "capability" | 53 | #define XATTR_CAPS_SUFFIX "capability" |
52 | #define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX | 54 | #define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX |
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index 930fdd2de79c..22e61fdf75a2 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h | |||
@@ -84,6 +84,16 @@ struct xfrm_replay_state { | |||
84 | __u32 bitmap; | 84 | __u32 bitmap; |
85 | }; | 85 | }; |
86 | 86 | ||
87 | struct xfrm_replay_state_esn { | ||
88 | unsigned int bmp_len; | ||
89 | __u32 oseq; | ||
90 | __u32 seq; | ||
91 | __u32 oseq_hi; | ||
92 | __u32 seq_hi; | ||
93 | __u32 replay_window; | ||
94 | __u32 bmp[0]; | ||
95 | }; | ||
96 | |||
87 | struct xfrm_algo { | 97 | struct xfrm_algo { |
88 | char alg_name[64]; | 98 | char alg_name[64]; |
89 | unsigned int alg_key_len; /* in bits */ | 99 | unsigned int alg_key_len; /* in bits */ |
@@ -284,6 +294,7 @@ enum xfrm_attr_type_t { | |||
284 | XFRMA_ALG_AUTH_TRUNC, /* struct xfrm_algo_auth */ | 294 | XFRMA_ALG_AUTH_TRUNC, /* struct xfrm_algo_auth */ |
285 | XFRMA_MARK, /* struct xfrm_mark */ | 295 | XFRMA_MARK, /* struct xfrm_mark */ |
286 | XFRMA_TFCPAD, /* __u32 */ | 296 | XFRMA_TFCPAD, /* __u32 */ |
297 | XFRMA_REPLAY_ESN_VAL, /* struct xfrm_replay_esn */ | ||
287 | __XFRMA_MAX | 298 | __XFRMA_MAX |
288 | 299 | ||
289 | #define XFRMA_MAX (__XFRMA_MAX - 1) | 300 | #define XFRMA_MAX (__XFRMA_MAX - 1) |
@@ -350,6 +361,8 @@ struct xfrm_usersa_info { | |||
350 | #define XFRM_STATE_WILDRECV 8 | 361 | #define XFRM_STATE_WILDRECV 8 |
351 | #define XFRM_STATE_ICMP 16 | 362 | #define XFRM_STATE_ICMP 16 |
352 | #define XFRM_STATE_AF_UNSPEC 32 | 363 | #define XFRM_STATE_AF_UNSPEC 32 |
364 | #define XFRM_STATE_ALIGN4 64 | ||
365 | #define XFRM_STATE_ESN 128 | ||
353 | }; | 366 | }; |
354 | 367 | ||
355 | struct xfrm_usersa_id { | 368 | struct xfrm_usersa_id { |
diff --git a/include/linux/zlib.h b/include/linux/zlib.h index 40c49cb3eb51..9c5a6b4de0a3 100644 --- a/include/linux/zlib.h +++ b/include/linux/zlib.h | |||
@@ -179,11 +179,16 @@ typedef z_stream *z_streamp; | |||
179 | 179 | ||
180 | /* basic functions */ | 180 | /* basic functions */ |
181 | 181 | ||
182 | extern int zlib_deflate_workspacesize (void); | 182 | extern int zlib_deflate_workspacesize (int windowBits, int memLevel); |
183 | /* | 183 | /* |
184 | Returns the number of bytes that needs to be allocated for a per- | 184 | Returns the number of bytes that needs to be allocated for a per- |
185 | stream workspace. A pointer to this number of bytes should be | 185 | stream workspace with the specified parameters. A pointer to this |
186 | returned in stream->workspace before calling zlib_deflateInit(). | 186 | number of bytes should be returned in stream->workspace before |
187 | you call zlib_deflateInit() or zlib_deflateInit2(). If you call | ||
188 | zlib_deflateInit(), specify windowBits = MAX_WBITS and memLevel = | ||
189 | MAX_MEM_LEVEL here. If you call zlib_deflateInit2(), the windowBits | ||
190 | and memLevel parameters passed to zlib_deflateInit2() must not | ||
191 | exceed those passed here. | ||
187 | */ | 192 | */ |
188 | 193 | ||
189 | /* | 194 | /* |
diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h index 071fd7a8d781..6b75a6971346 100644 --- a/include/net/9p/9p.h +++ b/include/net/9p/9p.h | |||
@@ -139,6 +139,8 @@ do { \ | |||
139 | */ | 139 | */ |
140 | 140 | ||
141 | enum p9_msg_t { | 141 | enum p9_msg_t { |
142 | P9_TSYNCFS = 0, | ||
143 | P9_RSYNCFS, | ||
142 | P9_TLERROR = 6, | 144 | P9_TLERROR = 6, |
143 | P9_RLERROR, | 145 | P9_RLERROR, |
144 | P9_TSTATFS = 8, | 146 | P9_TSTATFS = 8, |
@@ -688,7 +690,11 @@ struct p9_rwstat { | |||
688 | * @id: protocol operating identifier of type &p9_msg_t | 690 | * @id: protocol operating identifier of type &p9_msg_t |
689 | * @tag: transaction id of the request | 691 | * @tag: transaction id of the request |
690 | * @offset: used by marshalling routines to track currentposition in buffer | 692 | * @offset: used by marshalling routines to track currentposition in buffer |
691 | * @capacity: used by marshalling routines to track total capacity | 693 | * @capacity: used by marshalling routines to track total malloc'd capacity |
694 | * @pubuf: Payload user buffer given by the caller | ||
695 | * @pubuf: Payload kernel buffer given by the caller | ||
696 | * @pbuf_size: pubuf/pkbuf(only one will be !NULL) size to be read/write. | ||
697 | * @private: For transport layer's use. | ||
692 | * @sdata: payload | 698 | * @sdata: payload |
693 | * | 699 | * |
694 | * &p9_fcall represents the structure for all 9P RPC | 700 | * &p9_fcall represents the structure for all 9P RPC |
@@ -705,6 +711,10 @@ struct p9_fcall { | |||
705 | 711 | ||
706 | size_t offset; | 712 | size_t offset; |
707 | size_t capacity; | 713 | size_t capacity; |
714 | char __user *pubuf; | ||
715 | char *pkbuf; | ||
716 | size_t pbuf_size; | ||
717 | void *private; | ||
708 | 718 | ||
709 | uint8_t *sdata; | 719 | uint8_t *sdata; |
710 | }; | 720 | }; |
diff --git a/include/net/9p/client.h b/include/net/9p/client.h index 83ba6a4d58a3..0a30977e3c1f 100644 --- a/include/net/9p/client.h +++ b/include/net/9p/client.h | |||
@@ -230,6 +230,7 @@ int p9_client_create_dotl(struct p9_fid *ofid, char *name, u32 flags, u32 mode, | |||
230 | gid_t gid, struct p9_qid *qid); | 230 | gid_t gid, struct p9_qid *qid); |
231 | int p9_client_clunk(struct p9_fid *fid); | 231 | int p9_client_clunk(struct p9_fid *fid); |
232 | int p9_client_fsync(struct p9_fid *fid, int datasync); | 232 | int p9_client_fsync(struct p9_fid *fid, int datasync); |
233 | int p9_client_sync_fs(struct p9_fid *fid); | ||
233 | int p9_client_remove(struct p9_fid *fid); | 234 | int p9_client_remove(struct p9_fid *fid); |
234 | int p9_client_read(struct p9_fid *fid, char *data, char __user *udata, | 235 | int p9_client_read(struct p9_fid *fid, char *data, char __user *udata, |
235 | u64 offset, u32 count); | 236 | u64 offset, u32 count); |
diff --git a/include/net/9p/transport.h b/include/net/9p/transport.h index 6d5886efb102..82868f18c573 100644 --- a/include/net/9p/transport.h +++ b/include/net/9p/transport.h | |||
@@ -26,11 +26,19 @@ | |||
26 | #ifndef NET_9P_TRANSPORT_H | 26 | #ifndef NET_9P_TRANSPORT_H |
27 | #define NET_9P_TRANSPORT_H | 27 | #define NET_9P_TRANSPORT_H |
28 | 28 | ||
29 | #define P9_TRANS_PREF_PAYLOAD_MASK 0x1 | ||
30 | |||
31 | /* Default. Add Payload to PDU before sending it down to transport layer */ | ||
32 | #define P9_TRANS_PREF_PAYLOAD_DEF 0x0 | ||
33 | /* Send pay load seperately to transport layer along with PDU.*/ | ||
34 | #define P9_TRANS_PREF_PAYLOAD_SEP 0x1 | ||
35 | |||
29 | /** | 36 | /** |
30 | * struct p9_trans_module - transport module interface | 37 | * struct p9_trans_module - transport module interface |
31 | * @list: used to maintain a list of currently available transports | 38 | * @list: used to maintain a list of currently available transports |
32 | * @name: the human-readable name of the transport | 39 | * @name: the human-readable name of the transport |
33 | * @maxsize: transport provided maximum packet size | 40 | * @maxsize: transport provided maximum packet size |
41 | * @pref: Preferences of this transport | ||
34 | * @def: set if this transport should be considered the default | 42 | * @def: set if this transport should be considered the default |
35 | * @create: member function to create a new connection on this transport | 43 | * @create: member function to create a new connection on this transport |
36 | * @request: member function to issue a request to the transport | 44 | * @request: member function to issue a request to the transport |
@@ -47,6 +55,7 @@ struct p9_trans_module { | |||
47 | struct list_head list; | 55 | struct list_head list; |
48 | char *name; /* name of transport */ | 56 | char *name; /* name of transport */ |
49 | int maxsize; /* max message size of transport */ | 57 | int maxsize; /* max message size of transport */ |
58 | int pref; /* Preferences of this transport */ | ||
50 | int def; /* this transport should be default */ | 59 | int def; /* this transport should be default */ |
51 | struct module *owner; | 60 | struct module *owner; |
52 | int (*create)(struct p9_client *, const char *, char *); | 61 | int (*create)(struct p9_client *, const char *, char *); |
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 0c5e72503b77..43750439c521 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h | |||
@@ -64,6 +64,11 @@ struct bt_security { | |||
64 | 64 | ||
65 | #define BT_DEFER_SETUP 7 | 65 | #define BT_DEFER_SETUP 7 |
66 | 66 | ||
67 | #define BT_FLUSHABLE 8 | ||
68 | |||
69 | #define BT_FLUSHABLE_OFF 0 | ||
70 | #define BT_FLUSHABLE_ON 1 | ||
71 | |||
67 | #define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg) | 72 | #define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg) |
68 | #define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg) | 73 | #define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg) |
69 | #define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg) | 74 | #define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg) |
@@ -200,4 +205,32 @@ extern void bt_sysfs_cleanup(void); | |||
200 | 205 | ||
201 | extern struct dentry *bt_debugfs; | 206 | extern struct dentry *bt_debugfs; |
202 | 207 | ||
208 | #ifdef CONFIG_BT_L2CAP | ||
209 | int l2cap_init(void); | ||
210 | void l2cap_exit(void); | ||
211 | #else | ||
212 | static inline int l2cap_init(void) | ||
213 | { | ||
214 | return 0; | ||
215 | } | ||
216 | |||
217 | static inline void l2cap_exit(void) | ||
218 | { | ||
219 | } | ||
220 | #endif | ||
221 | |||
222 | #ifdef CONFIG_BT_SCO | ||
223 | int sco_init(void); | ||
224 | void sco_exit(void); | ||
225 | #else | ||
226 | static inline int sco_init(void) | ||
227 | { | ||
228 | return 0; | ||
229 | } | ||
230 | |||
231 | static inline void sco_exit(void) | ||
232 | { | ||
233 | } | ||
234 | #endif | ||
235 | |||
203 | #endif /* __BLUETOOTH_H */ | 236 | #endif /* __BLUETOOTH_H */ |
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 29a7a8ca0438..ec6acf2f1c0b 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -76,6 +76,14 @@ enum { | |||
76 | HCI_INQUIRY, | 76 | HCI_INQUIRY, |
77 | 77 | ||
78 | HCI_RAW, | 78 | HCI_RAW, |
79 | |||
80 | HCI_SETUP, | ||
81 | HCI_AUTO_OFF, | ||
82 | HCI_MGMT, | ||
83 | HCI_PAIRABLE, | ||
84 | HCI_SERVICE_CACHE, | ||
85 | HCI_LINK_KEYS, | ||
86 | HCI_DEBUG_KEYS, | ||
79 | }; | 87 | }; |
80 | 88 | ||
81 | /* HCI ioctl defines */ | 89 | /* HCI ioctl defines */ |
@@ -111,6 +119,7 @@ enum { | |||
111 | #define HCI_PAIRING_TIMEOUT (60000) /* 60 seconds */ | 119 | #define HCI_PAIRING_TIMEOUT (60000) /* 60 seconds */ |
112 | #define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */ | 120 | #define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */ |
113 | #define HCI_INIT_TIMEOUT (10000) /* 10 seconds */ | 121 | #define HCI_INIT_TIMEOUT (10000) /* 10 seconds */ |
122 | #define HCI_CMD_TIMEOUT (1000) /* 1 seconds */ | ||
114 | 123 | ||
115 | /* HCI data types */ | 124 | /* HCI data types */ |
116 | #define HCI_COMMAND_PKT 0x01 | 125 | #define HCI_COMMAND_PKT 0x01 |
@@ -150,6 +159,7 @@ enum { | |||
150 | #define EDR_ESCO_MASK (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5) | 159 | #define EDR_ESCO_MASK (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5) |
151 | 160 | ||
152 | /* ACL flags */ | 161 | /* ACL flags */ |
162 | #define ACL_START_NO_FLUSH 0x00 | ||
153 | #define ACL_CONT 0x01 | 163 | #define ACL_CONT 0x01 |
154 | #define ACL_START 0x02 | 164 | #define ACL_START 0x02 |
155 | #define ACL_ACTIVE_BCAST 0x04 | 165 | #define ACL_ACTIVE_BCAST 0x04 |
@@ -159,6 +169,8 @@ enum { | |||
159 | #define SCO_LINK 0x00 | 169 | #define SCO_LINK 0x00 |
160 | #define ACL_LINK 0x01 | 170 | #define ACL_LINK 0x01 |
161 | #define ESCO_LINK 0x02 | 171 | #define ESCO_LINK 0x02 |
172 | /* Low Energy links do not have defined link type. Use invented one */ | ||
173 | #define LE_LINK 0x80 | ||
162 | 174 | ||
163 | /* LMP features */ | 175 | /* LMP features */ |
164 | #define LMP_3SLOT 0x01 | 176 | #define LMP_3SLOT 0x01 |
@@ -183,17 +195,25 @@ enum { | |||
183 | #define LMP_PSCHEME 0x02 | 195 | #define LMP_PSCHEME 0x02 |
184 | #define LMP_PCONTROL 0x04 | 196 | #define LMP_PCONTROL 0x04 |
185 | 197 | ||
198 | #define LMP_RSSI_INQ 0x40 | ||
186 | #define LMP_ESCO 0x80 | 199 | #define LMP_ESCO 0x80 |
187 | 200 | ||
188 | #define LMP_EV4 0x01 | 201 | #define LMP_EV4 0x01 |
189 | #define LMP_EV5 0x02 | 202 | #define LMP_EV5 0x02 |
203 | #define LMP_LE 0x40 | ||
190 | 204 | ||
191 | #define LMP_SNIFF_SUBR 0x02 | 205 | #define LMP_SNIFF_SUBR 0x02 |
206 | #define LMP_PAUSE_ENC 0x04 | ||
192 | #define LMP_EDR_ESCO_2M 0x20 | 207 | #define LMP_EDR_ESCO_2M 0x20 |
193 | #define LMP_EDR_ESCO_3M 0x40 | 208 | #define LMP_EDR_ESCO_3M 0x40 |
194 | #define LMP_EDR_3S_ESCO 0x80 | 209 | #define LMP_EDR_3S_ESCO 0x80 |
195 | 210 | ||
211 | #define LMP_EXT_INQ 0x01 | ||
196 | #define LMP_SIMPLE_PAIR 0x08 | 212 | #define LMP_SIMPLE_PAIR 0x08 |
213 | #define LMP_NO_FLUSH 0x40 | ||
214 | |||
215 | #define LMP_LSTO 0x01 | ||
216 | #define LMP_INQ_TX_PWR 0x02 | ||
197 | 217 | ||
198 | /* Connection modes */ | 218 | /* Connection modes */ |
199 | #define HCI_CM_ACTIVE 0x0000 | 219 | #define HCI_CM_ACTIVE 0x0000 |
@@ -225,6 +245,8 @@ enum { | |||
225 | #define HCI_AT_GENERAL_BONDING_MITM 0x05 | 245 | #define HCI_AT_GENERAL_BONDING_MITM 0x05 |
226 | 246 | ||
227 | /* ----- HCI Commands ---- */ | 247 | /* ----- HCI Commands ---- */ |
248 | #define HCI_OP_NOP 0x0000 | ||
249 | |||
228 | #define HCI_OP_INQUIRY 0x0401 | 250 | #define HCI_OP_INQUIRY 0x0401 |
229 | struct hci_cp_inquiry { | 251 | struct hci_cp_inquiry { |
230 | __u8 lap[3]; | 252 | __u8 lap[3]; |
@@ -292,11 +314,19 @@ struct hci_cp_pin_code_reply { | |||
292 | __u8 pin_len; | 314 | __u8 pin_len; |
293 | __u8 pin_code[16]; | 315 | __u8 pin_code[16]; |
294 | } __packed; | 316 | } __packed; |
317 | struct hci_rp_pin_code_reply { | ||
318 | __u8 status; | ||
319 | bdaddr_t bdaddr; | ||
320 | } __packed; | ||
295 | 321 | ||
296 | #define HCI_OP_PIN_CODE_NEG_REPLY 0x040e | 322 | #define HCI_OP_PIN_CODE_NEG_REPLY 0x040e |
297 | struct hci_cp_pin_code_neg_reply { | 323 | struct hci_cp_pin_code_neg_reply { |
298 | bdaddr_t bdaddr; | 324 | bdaddr_t bdaddr; |
299 | } __packed; | 325 | } __packed; |
326 | struct hci_rp_pin_code_neg_reply { | ||
327 | __u8 status; | ||
328 | bdaddr_t bdaddr; | ||
329 | } __packed; | ||
300 | 330 | ||
301 | #define HCI_OP_CHANGE_CONN_PTYPE 0x040f | 331 | #define HCI_OP_CHANGE_CONN_PTYPE 0x040f |
302 | struct hci_cp_change_conn_ptype { | 332 | struct hci_cp_change_conn_ptype { |
@@ -377,6 +407,31 @@ struct hci_cp_reject_sync_conn_req { | |||
377 | __u8 reason; | 407 | __u8 reason; |
378 | } __packed; | 408 | } __packed; |
379 | 409 | ||
410 | #define HCI_OP_IO_CAPABILITY_REPLY 0x042b | ||
411 | struct hci_cp_io_capability_reply { | ||
412 | bdaddr_t bdaddr; | ||
413 | __u8 capability; | ||
414 | __u8 oob_data; | ||
415 | __u8 authentication; | ||
416 | } __packed; | ||
417 | |||
418 | #define HCI_OP_USER_CONFIRM_REPLY 0x042c | ||
419 | struct hci_cp_user_confirm_reply { | ||
420 | bdaddr_t bdaddr; | ||
421 | } __packed; | ||
422 | struct hci_rp_user_confirm_reply { | ||
423 | __u8 status; | ||
424 | bdaddr_t bdaddr; | ||
425 | } __packed; | ||
426 | |||
427 | #define HCI_OP_USER_CONFIRM_NEG_REPLY 0x042d | ||
428 | |||
429 | #define HCI_OP_IO_CAPABILITY_NEG_REPLY 0x0434 | ||
430 | struct hci_cp_io_capability_neg_reply { | ||
431 | bdaddr_t bdaddr; | ||
432 | __u8 reason; | ||
433 | } __packed; | ||
434 | |||
380 | #define HCI_OP_SNIFF_MODE 0x0803 | 435 | #define HCI_OP_SNIFF_MODE 0x0803 |
381 | struct hci_cp_sniff_mode { | 436 | struct hci_cp_sniff_mode { |
382 | __le16 handle; | 437 | __le16 handle; |
@@ -474,6 +529,12 @@ struct hci_cp_set_event_flt { | |||
474 | #define HCI_CONN_SETUP_AUTO_OFF 0x01 | 529 | #define HCI_CONN_SETUP_AUTO_OFF 0x01 |
475 | #define HCI_CONN_SETUP_AUTO_ON 0x02 | 530 | #define HCI_CONN_SETUP_AUTO_ON 0x02 |
476 | 531 | ||
532 | #define HCI_OP_DELETE_STORED_LINK_KEY 0x0c12 | ||
533 | struct hci_cp_delete_stored_link_key { | ||
534 | bdaddr_t bdaddr; | ||
535 | __u8 delete_all; | ||
536 | } __packed; | ||
537 | |||
477 | #define HCI_OP_WRITE_LOCAL_NAME 0x0c13 | 538 | #define HCI_OP_WRITE_LOCAL_NAME 0x0c13 |
478 | struct hci_cp_write_local_name { | 539 | struct hci_cp_write_local_name { |
479 | __u8 name[248]; | 540 | __u8 name[248]; |
@@ -537,6 +598,8 @@ struct hci_cp_host_buffer_size { | |||
537 | __le16 sco_max_pkt; | 598 | __le16 sco_max_pkt; |
538 | } __packed; | 599 | } __packed; |
539 | 600 | ||
601 | #define HCI_OP_WRITE_INQUIRY_MODE 0x0c45 | ||
602 | |||
540 | #define HCI_OP_READ_SSP_MODE 0x0c55 | 603 | #define HCI_OP_READ_SSP_MODE 0x0c55 |
541 | struct hci_rp_read_ssp_mode { | 604 | struct hci_rp_read_ssp_mode { |
542 | __u8 status; | 605 | __u8 status; |
@@ -548,6 +611,8 @@ struct hci_cp_write_ssp_mode { | |||
548 | __u8 mode; | 611 | __u8 mode; |
549 | } __packed; | 612 | } __packed; |
550 | 613 | ||
614 | #define HCI_OP_READ_INQ_RSP_TX_POWER 0x0c58 | ||
615 | |||
551 | #define HCI_OP_READ_LOCAL_VERSION 0x1001 | 616 | #define HCI_OP_READ_LOCAL_VERSION 0x1001 |
552 | struct hci_rp_read_local_version { | 617 | struct hci_rp_read_local_version { |
553 | __u8 status; | 618 | __u8 status; |
@@ -593,6 +658,47 @@ struct hci_rp_read_bd_addr { | |||
593 | bdaddr_t bdaddr; | 658 | bdaddr_t bdaddr; |
594 | } __packed; | 659 | } __packed; |
595 | 660 | ||
661 | #define HCI_OP_LE_SET_EVENT_MASK 0x2001 | ||
662 | struct hci_cp_le_set_event_mask { | ||
663 | __u8 mask[8]; | ||
664 | } __packed; | ||
665 | |||
666 | #define HCI_OP_LE_READ_BUFFER_SIZE 0x2002 | ||
667 | struct hci_rp_le_read_buffer_size { | ||
668 | __u8 status; | ||
669 | __le16 le_mtu; | ||
670 | __u8 le_max_pkt; | ||
671 | } __packed; | ||
672 | |||
673 | #define HCI_OP_LE_CREATE_CONN 0x200d | ||
674 | struct hci_cp_le_create_conn { | ||
675 | __le16 scan_interval; | ||
676 | __le16 scan_window; | ||
677 | __u8 filter_policy; | ||
678 | __u8 peer_addr_type; | ||
679 | bdaddr_t peer_addr; | ||
680 | __u8 own_address_type; | ||
681 | __le16 conn_interval_min; | ||
682 | __le16 conn_interval_max; | ||
683 | __le16 conn_latency; | ||
684 | __le16 supervision_timeout; | ||
685 | __le16 min_ce_len; | ||
686 | __le16 max_ce_len; | ||
687 | } __packed; | ||
688 | |||
689 | #define HCI_OP_LE_CREATE_CONN_CANCEL 0x200e | ||
690 | |||
691 | #define HCI_OP_LE_CONN_UPDATE 0x2013 | ||
692 | struct hci_cp_le_conn_update { | ||
693 | __le16 handle; | ||
694 | __le16 conn_interval_min; | ||
695 | __le16 conn_interval_max; | ||
696 | __le16 conn_latency; | ||
697 | __le16 supervision_timeout; | ||
698 | __le16 min_ce_len; | ||
699 | __le16 max_ce_len; | ||
700 | } __packed; | ||
701 | |||
596 | /* ---- HCI Events ---- */ | 702 | /* ---- HCI Events ---- */ |
597 | #define HCI_EV_INQUIRY_COMPLETE 0x01 | 703 | #define HCI_EV_INQUIRY_COMPLETE 0x01 |
598 | 704 | ||
@@ -833,6 +939,20 @@ struct hci_ev_io_capa_request { | |||
833 | bdaddr_t bdaddr; | 939 | bdaddr_t bdaddr; |
834 | } __packed; | 940 | } __packed; |
835 | 941 | ||
942 | #define HCI_EV_IO_CAPA_REPLY 0x32 | ||
943 | struct hci_ev_io_capa_reply { | ||
944 | bdaddr_t bdaddr; | ||
945 | __u8 capability; | ||
946 | __u8 oob_data; | ||
947 | __u8 authentication; | ||
948 | } __packed; | ||
949 | |||
950 | #define HCI_EV_USER_CONFIRM_REQUEST 0x33 | ||
951 | struct hci_ev_user_confirm_req { | ||
952 | bdaddr_t bdaddr; | ||
953 | __le32 passkey; | ||
954 | } __packed; | ||
955 | |||
836 | #define HCI_EV_SIMPLE_PAIR_COMPLETE 0x36 | 956 | #define HCI_EV_SIMPLE_PAIR_COMPLETE 0x36 |
837 | struct hci_ev_simple_pair_complete { | 957 | struct hci_ev_simple_pair_complete { |
838 | __u8 status; | 958 | __u8 status; |
@@ -845,6 +965,25 @@ struct hci_ev_remote_host_features { | |||
845 | __u8 features[8]; | 965 | __u8 features[8]; |
846 | } __packed; | 966 | } __packed; |
847 | 967 | ||
968 | #define HCI_EV_LE_META 0x3e | ||
969 | struct hci_ev_le_meta { | ||
970 | __u8 subevent; | ||
971 | } __packed; | ||
972 | |||
973 | /* Low energy meta events */ | ||
974 | #define HCI_EV_LE_CONN_COMPLETE 0x01 | ||
975 | struct hci_ev_le_conn_complete { | ||
976 | __u8 status; | ||
977 | __le16 handle; | ||
978 | __u8 role; | ||
979 | __u8 bdaddr_type; | ||
980 | bdaddr_t bdaddr; | ||
981 | __le16 interval; | ||
982 | __le16 latency; | ||
983 | __le16 supervision_timeout; | ||
984 | __u8 clk_accurancy; | ||
985 | } __packed; | ||
986 | |||
848 | /* Internal events generated by Bluetooth stack */ | 987 | /* Internal events generated by Bluetooth stack */ |
849 | #define HCI_EV_STACK_INTERNAL 0xfd | 988 | #define HCI_EV_STACK_INTERNAL 0xfd |
850 | struct hci_ev_stack_internal { | 989 | struct hci_ev_stack_internal { |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index d2cf88407690..441dadbf6a89 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -60,12 +60,28 @@ struct hci_conn_hash { | |||
60 | spinlock_t lock; | 60 | spinlock_t lock; |
61 | unsigned int acl_num; | 61 | unsigned int acl_num; |
62 | unsigned int sco_num; | 62 | unsigned int sco_num; |
63 | unsigned int le_num; | ||
63 | }; | 64 | }; |
64 | 65 | ||
65 | struct bdaddr_list { | 66 | struct bdaddr_list { |
66 | struct list_head list; | 67 | struct list_head list; |
67 | bdaddr_t bdaddr; | 68 | bdaddr_t bdaddr; |
68 | }; | 69 | }; |
70 | |||
71 | struct bt_uuid { | ||
72 | struct list_head list; | ||
73 | u8 uuid[16]; | ||
74 | u8 svc_hint; | ||
75 | }; | ||
76 | |||
77 | struct link_key { | ||
78 | struct list_head list; | ||
79 | bdaddr_t bdaddr; | ||
80 | u8 type; | ||
81 | u8 val[16]; | ||
82 | u8 pin_len; | ||
83 | }; | ||
84 | |||
69 | #define NUM_REASSEMBLY 4 | 85 | #define NUM_REASSEMBLY 4 |
70 | struct hci_dev { | 86 | struct hci_dev { |
71 | struct list_head list; | 87 | struct list_head list; |
@@ -80,13 +96,18 @@ struct hci_dev { | |||
80 | bdaddr_t bdaddr; | 96 | bdaddr_t bdaddr; |
81 | __u8 dev_name[248]; | 97 | __u8 dev_name[248]; |
82 | __u8 dev_class[3]; | 98 | __u8 dev_class[3]; |
99 | __u8 major_class; | ||
100 | __u8 minor_class; | ||
83 | __u8 features[8]; | 101 | __u8 features[8]; |
84 | __u8 commands[64]; | 102 | __u8 commands[64]; |
85 | __u8 ssp_mode; | 103 | __u8 ssp_mode; |
86 | __u8 hci_ver; | 104 | __u8 hci_ver; |
87 | __u16 hci_rev; | 105 | __u16 hci_rev; |
106 | __u8 lmp_ver; | ||
88 | __u16 manufacturer; | 107 | __u16 manufacturer; |
108 | __le16 lmp_subver; | ||
89 | __u16 voice_setting; | 109 | __u16 voice_setting; |
110 | __u8 io_capability; | ||
90 | 111 | ||
91 | __u16 pkt_type; | 112 | __u16 pkt_type; |
92 | __u16 esco_type; | 113 | __u16 esco_type; |
@@ -102,18 +123,26 @@ struct hci_dev { | |||
102 | atomic_t cmd_cnt; | 123 | atomic_t cmd_cnt; |
103 | unsigned int acl_cnt; | 124 | unsigned int acl_cnt; |
104 | unsigned int sco_cnt; | 125 | unsigned int sco_cnt; |
126 | unsigned int le_cnt; | ||
105 | 127 | ||
106 | unsigned int acl_mtu; | 128 | unsigned int acl_mtu; |
107 | unsigned int sco_mtu; | 129 | unsigned int sco_mtu; |
130 | unsigned int le_mtu; | ||
108 | unsigned int acl_pkts; | 131 | unsigned int acl_pkts; |
109 | unsigned int sco_pkts; | 132 | unsigned int sco_pkts; |
133 | unsigned int le_pkts; | ||
110 | 134 | ||
111 | unsigned long cmd_last_tx; | ||
112 | unsigned long acl_last_tx; | 135 | unsigned long acl_last_tx; |
113 | unsigned long sco_last_tx; | 136 | unsigned long sco_last_tx; |
137 | unsigned long le_last_tx; | ||
114 | 138 | ||
115 | struct workqueue_struct *workqueue; | 139 | struct workqueue_struct *workqueue; |
116 | 140 | ||
141 | struct work_struct power_on; | ||
142 | struct work_struct power_off; | ||
143 | struct timer_list off_timer; | ||
144 | |||
145 | struct timer_list cmd_timer; | ||
117 | struct tasklet_struct cmd_task; | 146 | struct tasklet_struct cmd_task; |
118 | struct tasklet_struct rx_task; | 147 | struct tasklet_struct rx_task; |
119 | struct tasklet_struct tx_task; | 148 | struct tasklet_struct tx_task; |
@@ -129,12 +158,17 @@ struct hci_dev { | |||
129 | wait_queue_head_t req_wait_q; | 158 | wait_queue_head_t req_wait_q; |
130 | __u32 req_status; | 159 | __u32 req_status; |
131 | __u32 req_result; | 160 | __u32 req_result; |
132 | __u16 req_last_cmd; | 161 | |
162 | __u16 init_last_cmd; | ||
133 | 163 | ||
134 | struct inquiry_cache inq_cache; | 164 | struct inquiry_cache inq_cache; |
135 | struct hci_conn_hash conn_hash; | 165 | struct hci_conn_hash conn_hash; |
136 | struct list_head blacklist; | 166 | struct list_head blacklist; |
137 | 167 | ||
168 | struct list_head uuids; | ||
169 | |||
170 | struct list_head link_keys; | ||
171 | |||
138 | struct hci_dev_stats stat; | 172 | struct hci_dev_stats stat; |
139 | 173 | ||
140 | struct sk_buff_head driver_init; | 174 | struct sk_buff_head driver_init; |
@@ -165,31 +199,37 @@ struct hci_dev { | |||
165 | struct hci_conn { | 199 | struct hci_conn { |
166 | struct list_head list; | 200 | struct list_head list; |
167 | 201 | ||
168 | atomic_t refcnt; | 202 | atomic_t refcnt; |
169 | spinlock_t lock; | 203 | spinlock_t lock; |
170 | 204 | ||
171 | bdaddr_t dst; | 205 | bdaddr_t dst; |
172 | __u16 handle; | 206 | __u16 handle; |
173 | __u16 state; | 207 | __u16 state; |
174 | __u8 mode; | 208 | __u8 mode; |
175 | __u8 type; | 209 | __u8 type; |
176 | __u8 out; | 210 | __u8 out; |
177 | __u8 attempt; | 211 | __u8 attempt; |
178 | __u8 dev_class[3]; | 212 | __u8 dev_class[3]; |
179 | __u8 features[8]; | 213 | __u8 features[8]; |
180 | __u8 ssp_mode; | 214 | __u8 ssp_mode; |
181 | __u16 interval; | 215 | __u16 interval; |
182 | __u16 pkt_type; | 216 | __u16 pkt_type; |
183 | __u16 link_policy; | 217 | __u16 link_policy; |
184 | __u32 link_mode; | 218 | __u32 link_mode; |
185 | __u8 auth_type; | 219 | __u8 auth_type; |
186 | __u8 sec_level; | 220 | __u8 sec_level; |
187 | __u8 pending_sec_level; | 221 | __u8 pending_sec_level; |
188 | __u8 power_save; | 222 | __u8 pin_length; |
189 | __u16 disc_timeout; | 223 | __u8 io_capability; |
190 | unsigned long pend; | 224 | __u8 power_save; |
191 | 225 | __u16 disc_timeout; | |
192 | unsigned int sent; | 226 | unsigned long pend; |
227 | |||
228 | __u8 remote_cap; | ||
229 | __u8 remote_oob; | ||
230 | __u8 remote_auth; | ||
231 | |||
232 | unsigned int sent; | ||
193 | 233 | ||
194 | struct sk_buff_head data_q; | 234 | struct sk_buff_head data_q; |
195 | 235 | ||
@@ -208,6 +248,10 @@ struct hci_conn { | |||
208 | void *priv; | 248 | void *priv; |
209 | 249 | ||
210 | struct hci_conn *link; | 250 | struct hci_conn *link; |
251 | |||
252 | void (*connect_cfm_cb) (struct hci_conn *conn, u8 status); | ||
253 | void (*security_cfm_cb) (struct hci_conn *conn, u8 status); | ||
254 | void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason); | ||
211 | }; | 255 | }; |
212 | 256 | ||
213 | extern struct hci_proto *hci_proto[]; | 257 | extern struct hci_proto *hci_proto[]; |
@@ -274,24 +318,40 @@ static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c) | |||
274 | { | 318 | { |
275 | struct hci_conn_hash *h = &hdev->conn_hash; | 319 | struct hci_conn_hash *h = &hdev->conn_hash; |
276 | list_add(&c->list, &h->list); | 320 | list_add(&c->list, &h->list); |
277 | if (c->type == ACL_LINK) | 321 | switch (c->type) { |
322 | case ACL_LINK: | ||
278 | h->acl_num++; | 323 | h->acl_num++; |
279 | else | 324 | break; |
325 | case LE_LINK: | ||
326 | h->le_num++; | ||
327 | break; | ||
328 | case SCO_LINK: | ||
329 | case ESCO_LINK: | ||
280 | h->sco_num++; | 330 | h->sco_num++; |
331 | break; | ||
332 | } | ||
281 | } | 333 | } |
282 | 334 | ||
283 | static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c) | 335 | static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c) |
284 | { | 336 | { |
285 | struct hci_conn_hash *h = &hdev->conn_hash; | 337 | struct hci_conn_hash *h = &hdev->conn_hash; |
286 | list_del(&c->list); | 338 | list_del(&c->list); |
287 | if (c->type == ACL_LINK) | 339 | switch (c->type) { |
340 | case ACL_LINK: | ||
288 | h->acl_num--; | 341 | h->acl_num--; |
289 | else | 342 | break; |
343 | case LE_LINK: | ||
344 | h->le_num--; | ||
345 | break; | ||
346 | case SCO_LINK: | ||
347 | case ESCO_LINK: | ||
290 | h->sco_num--; | 348 | h->sco_num--; |
349 | break; | ||
350 | } | ||
291 | } | 351 | } |
292 | 352 | ||
293 | static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev, | 353 | static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev, |
294 | __u16 handle) | 354 | __u16 handle) |
295 | { | 355 | { |
296 | struct hci_conn_hash *h = &hdev->conn_hash; | 356 | struct hci_conn_hash *h = &hdev->conn_hash; |
297 | struct list_head *p; | 357 | struct list_head *p; |
@@ -306,7 +366,7 @@ static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev, | |||
306 | } | 366 | } |
307 | 367 | ||
308 | static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev, | 368 | static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev, |
309 | __u8 type, bdaddr_t *ba) | 369 | __u8 type, bdaddr_t *ba) |
310 | { | 370 | { |
311 | struct hci_conn_hash *h = &hdev->conn_hash; | 371 | struct hci_conn_hash *h = &hdev->conn_hash; |
312 | struct list_head *p; | 372 | struct list_head *p; |
@@ -321,7 +381,7 @@ static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev, | |||
321 | } | 381 | } |
322 | 382 | ||
323 | static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev, | 383 | static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev, |
324 | __u8 type, __u16 state) | 384 | __u8 type, __u16 state) |
325 | { | 385 | { |
326 | struct hci_conn_hash *h = &hdev->conn_hash; | 386 | struct hci_conn_hash *h = &hdev->conn_hash; |
327 | struct list_head *p; | 387 | struct list_head *p; |
@@ -437,6 +497,16 @@ int hci_inquiry(void __user *arg); | |||
437 | struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr); | 497 | struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr); |
438 | int hci_blacklist_clear(struct hci_dev *hdev); | 498 | int hci_blacklist_clear(struct hci_dev *hdev); |
439 | 499 | ||
500 | int hci_uuids_clear(struct hci_dev *hdev); | ||
501 | |||
502 | int hci_link_keys_clear(struct hci_dev *hdev); | ||
503 | struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr); | ||
504 | int hci_add_link_key(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr, | ||
505 | u8 *key, u8 type, u8 pin_len); | ||
506 | int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr); | ||
507 | |||
508 | void hci_del_off_timer(struct hci_dev *hdev); | ||
509 | |||
440 | void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); | 510 | void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); |
441 | 511 | ||
442 | int hci_recv_frame(struct sk_buff *skb); | 512 | int hci_recv_frame(struct sk_buff *skb); |
@@ -458,6 +528,8 @@ void hci_conn_del_sysfs(struct hci_conn *conn); | |||
458 | #define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR) | 528 | #define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR) |
459 | #define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO) | 529 | #define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO) |
460 | #define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR) | 530 | #define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR) |
531 | #define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH) | ||
532 | #define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE) | ||
461 | 533 | ||
462 | /* ----- HCI protocols ----- */ | 534 | /* ----- HCI protocols ----- */ |
463 | struct hci_proto { | 535 | struct hci_proto { |
@@ -503,6 +575,9 @@ static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status) | |||
503 | hp = hci_proto[HCI_PROTO_SCO]; | 575 | hp = hci_proto[HCI_PROTO_SCO]; |
504 | if (hp && hp->connect_cfm) | 576 | if (hp && hp->connect_cfm) |
505 | hp->connect_cfm(conn, status); | 577 | hp->connect_cfm(conn, status); |
578 | |||
579 | if (conn->connect_cfm_cb) | ||
580 | conn->connect_cfm_cb(conn, status); | ||
506 | } | 581 | } |
507 | 582 | ||
508 | static inline int hci_proto_disconn_ind(struct hci_conn *conn) | 583 | static inline int hci_proto_disconn_ind(struct hci_conn *conn) |
@@ -532,6 +607,9 @@ static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason) | |||
532 | hp = hci_proto[HCI_PROTO_SCO]; | 607 | hp = hci_proto[HCI_PROTO_SCO]; |
533 | if (hp && hp->disconn_cfm) | 608 | if (hp && hp->disconn_cfm) |
534 | hp->disconn_cfm(conn, reason); | 609 | hp->disconn_cfm(conn, reason); |
610 | |||
611 | if (conn->disconn_cfm_cb) | ||
612 | conn->disconn_cfm_cb(conn, reason); | ||
535 | } | 613 | } |
536 | 614 | ||
537 | static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status) | 615 | static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status) |
@@ -551,6 +629,9 @@ static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status) | |||
551 | hp = hci_proto[HCI_PROTO_SCO]; | 629 | hp = hci_proto[HCI_PROTO_SCO]; |
552 | if (hp && hp->security_cfm) | 630 | if (hp && hp->security_cfm) |
553 | hp->security_cfm(conn, status, encrypt); | 631 | hp->security_cfm(conn, status, encrypt); |
632 | |||
633 | if (conn->security_cfm_cb) | ||
634 | conn->security_cfm_cb(conn, status); | ||
554 | } | 635 | } |
555 | 636 | ||
556 | static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt) | 637 | static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt) |
@@ -564,6 +645,9 @@ static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u | |||
564 | hp = hci_proto[HCI_PROTO_SCO]; | 645 | hp = hci_proto[HCI_PROTO_SCO]; |
565 | if (hp && hp->security_cfm) | 646 | if (hp && hp->security_cfm) |
566 | hp->security_cfm(conn, status, encrypt); | 647 | hp->security_cfm(conn, status, encrypt); |
648 | |||
649 | if (conn->security_cfm_cb) | ||
650 | conn->security_cfm_cb(conn, status); | ||
567 | } | 651 | } |
568 | 652 | ||
569 | int hci_register_proto(struct hci_proto *hproto); | 653 | int hci_register_proto(struct hci_proto *hproto); |
@@ -660,12 +744,29 @@ void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode); | |||
660 | void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data); | 744 | void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data); |
661 | 745 | ||
662 | /* ----- HCI Sockets ----- */ | 746 | /* ----- HCI Sockets ----- */ |
663 | void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb); | 747 | void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb, |
748 | struct sock *skip_sk); | ||
664 | 749 | ||
665 | /* Management interface */ | 750 | /* Management interface */ |
666 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); | 751 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); |
667 | int mgmt_index_added(u16 index); | 752 | int mgmt_index_added(u16 index); |
668 | int mgmt_index_removed(u16 index); | 753 | int mgmt_index_removed(u16 index); |
754 | int mgmt_powered(u16 index, u8 powered); | ||
755 | int mgmt_discoverable(u16 index, u8 discoverable); | ||
756 | int mgmt_connectable(u16 index, u8 connectable); | ||
757 | int mgmt_new_key(u16 index, struct link_key *key, u8 old_key_type); | ||
758 | int mgmt_connected(u16 index, bdaddr_t *bdaddr); | ||
759 | int mgmt_disconnected(u16 index, bdaddr_t *bdaddr); | ||
760 | int mgmt_disconnect_failed(u16 index); | ||
761 | int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status); | ||
762 | int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr); | ||
763 | int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status); | ||
764 | int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status); | ||
765 | int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value); | ||
766 | int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status); | ||
767 | int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr, | ||
768 | u8 status); | ||
769 | int mgmt_auth_failed(u16 index, bdaddr_t *bdaddr, u8 status); | ||
669 | 770 | ||
670 | /* HCI info for socket */ | 771 | /* HCI info for socket */ |
671 | #define hci_pi(sk) ((struct hci_pinfo *) sk) | 772 | #define hci_pi(sk) ((struct hci_pinfo *) sk) |
@@ -697,4 +798,6 @@ struct hci_sec_filter { | |||
697 | 798 | ||
698 | void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result); | 799 | void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result); |
699 | 800 | ||
801 | void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, | ||
802 | u16 latency, u16 to_multiplier); | ||
700 | #endif /* __HCI_CORE_H */ | 803 | #endif /* __HCI_CORE_H */ |
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 7ad25ca60ec0..4f4bff1eaed6 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
@@ -38,6 +38,7 @@ | |||
38 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */ | 38 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */ |
39 | #define L2CAP_DEFAULT_ACK_TO 200 | 39 | #define L2CAP_DEFAULT_ACK_TO 200 |
40 | #define L2CAP_LOCAL_BUSY_TRIES 12 | 40 | #define L2CAP_LOCAL_BUSY_TRIES 12 |
41 | #define L2CAP_LE_DEFAULT_MTU 23 | ||
41 | 42 | ||
42 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ | 43 | #define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ |
43 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ | 44 | #define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ |
@@ -88,6 +89,8 @@ struct l2cap_conninfo { | |||
88 | #define L2CAP_ECHO_RSP 0x09 | 89 | #define L2CAP_ECHO_RSP 0x09 |
89 | #define L2CAP_INFO_REQ 0x0a | 90 | #define L2CAP_INFO_REQ 0x0a |
90 | #define L2CAP_INFO_RSP 0x0b | 91 | #define L2CAP_INFO_RSP 0x0b |
92 | #define L2CAP_CONN_PARAM_UPDATE_REQ 0x12 | ||
93 | #define L2CAP_CONN_PARAM_UPDATE_RSP 0x13 | ||
91 | 94 | ||
92 | /* L2CAP feature mask */ | 95 | /* L2CAP feature mask */ |
93 | #define L2CAP_FEAT_FLOWCTL 0x00000001 | 96 | #define L2CAP_FEAT_FLOWCTL 0x00000001 |
@@ -160,6 +163,9 @@ struct l2cap_conn_rsp { | |||
160 | /* channel indentifier */ | 163 | /* channel indentifier */ |
161 | #define L2CAP_CID_SIGNALING 0x0001 | 164 | #define L2CAP_CID_SIGNALING 0x0001 |
162 | #define L2CAP_CID_CONN_LESS 0x0002 | 165 | #define L2CAP_CID_CONN_LESS 0x0002 |
166 | #define L2CAP_CID_LE_DATA 0x0004 | ||
167 | #define L2CAP_CID_LE_SIGNALING 0x0005 | ||
168 | #define L2CAP_CID_SMP 0x0006 | ||
163 | #define L2CAP_CID_DYN_START 0x0040 | 169 | #define L2CAP_CID_DYN_START 0x0040 |
164 | #define L2CAP_CID_DYN_END 0xffff | 170 | #define L2CAP_CID_DYN_END 0xffff |
165 | 171 | ||
@@ -255,6 +261,21 @@ struct l2cap_info_rsp { | |||
255 | #define L2CAP_IR_SUCCESS 0x0000 | 261 | #define L2CAP_IR_SUCCESS 0x0000 |
256 | #define L2CAP_IR_NOTSUPP 0x0001 | 262 | #define L2CAP_IR_NOTSUPP 0x0001 |
257 | 263 | ||
264 | struct l2cap_conn_param_update_req { | ||
265 | __le16 min; | ||
266 | __le16 max; | ||
267 | __le16 latency; | ||
268 | __le16 to_multiplier; | ||
269 | } __packed; | ||
270 | |||
271 | struct l2cap_conn_param_update_rsp { | ||
272 | __le16 result; | ||
273 | } __packed; | ||
274 | |||
275 | /* Connection Parameters result */ | ||
276 | #define L2CAP_CONN_PARAM_ACCEPTED 0x0000 | ||
277 | #define L2CAP_CONN_PARAM_REJECTED 0x0001 | ||
278 | |||
258 | /* ----- L2CAP connections ----- */ | 279 | /* ----- L2CAP connections ----- */ |
259 | struct l2cap_chan_list { | 280 | struct l2cap_chan_list { |
260 | struct sock *head; | 281 | struct sock *head; |
@@ -327,6 +348,7 @@ struct l2cap_pinfo { | |||
327 | __u8 sec_level; | 348 | __u8 sec_level; |
328 | __u8 role_switch; | 349 | __u8 role_switch; |
329 | __u8 force_reliable; | 350 | __u8 force_reliable; |
351 | __u8 flushable; | ||
330 | 352 | ||
331 | __u8 conf_req[64]; | 353 | __u8 conf_req[64]; |
332 | __u8 conf_len; | 354 | __u8 conf_len; |
@@ -423,6 +445,35 @@ static inline int l2cap_tx_window_full(struct sock *sk) | |||
423 | #define __is_sframe(ctrl) ((ctrl) & L2CAP_CTRL_FRAME_TYPE) | 445 | #define __is_sframe(ctrl) ((ctrl) & L2CAP_CTRL_FRAME_TYPE) |
424 | #define __is_sar_start(ctrl) (((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START) | 446 | #define __is_sar_start(ctrl) (((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START) |
425 | 447 | ||
426 | void l2cap_load(void); | 448 | extern int disable_ertm; |
449 | extern const struct proto_ops l2cap_sock_ops; | ||
450 | extern struct bt_sock_list l2cap_sk_list; | ||
451 | |||
452 | int l2cap_init_sockets(void); | ||
453 | void l2cap_cleanup_sockets(void); | ||
454 | |||
455 | u8 l2cap_get_ident(struct l2cap_conn *conn); | ||
456 | void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data); | ||
457 | int l2cap_build_conf_req(struct sock *sk, void *data); | ||
458 | int __l2cap_wait_ack(struct sock *sk); | ||
459 | |||
460 | struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, size_t len); | ||
461 | struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size_t len); | ||
462 | struct sk_buff *l2cap_create_iframe_pdu(struct sock *sk, struct msghdr *msg, size_t len, u16 control, u16 sdulen); | ||
463 | int l2cap_sar_segment_sdu(struct sock *sk, struct msghdr *msg, size_t len); | ||
464 | void l2cap_do_send(struct sock *sk, struct sk_buff *skb); | ||
465 | void l2cap_streaming_send(struct sock *sk); | ||
466 | int l2cap_ertm_send(struct sock *sk); | ||
467 | |||
468 | void l2cap_sock_set_timer(struct sock *sk, long timeout); | ||
469 | void l2cap_sock_clear_timer(struct sock *sk); | ||
470 | void __l2cap_sock_close(struct sock *sk, int reason); | ||
471 | void l2cap_sock_kill(struct sock *sk); | ||
472 | void l2cap_sock_init(struct sock *sk, struct sock *parent); | ||
473 | struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, | ||
474 | int proto, gfp_t prio); | ||
475 | void l2cap_send_disconn_req(struct l2cap_conn *conn, struct sock *sk, int err); | ||
476 | void l2cap_chan_del(struct sock *sk, int err); | ||
477 | int l2cap_do_connect(struct sock *sk); | ||
427 | 478 | ||
428 | #endif /* __L2CAP_H */ | 479 | #endif /* __L2CAP_H */ |
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index ca29c1367ffd..5fabfa886b3e 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h | |||
@@ -21,11 +21,13 @@ | |||
21 | SOFTWARE IS DISCLAIMED. | 21 | SOFTWARE IS DISCLAIMED. |
22 | */ | 22 | */ |
23 | 23 | ||
24 | #define MGMT_INDEX_NONE 0xFFFF | ||
25 | |||
24 | struct mgmt_hdr { | 26 | struct mgmt_hdr { |
25 | __le16 opcode; | 27 | __le16 opcode; |
28 | __le16 index; | ||
26 | __le16 len; | 29 | __le16 len; |
27 | } __packed; | 30 | } __packed; |
28 | #define MGMT_HDR_SIZE 4 | ||
29 | 31 | ||
30 | #define MGMT_OP_READ_VERSION 0x0001 | 32 | #define MGMT_OP_READ_VERSION 0x0001 |
31 | struct mgmt_rp_read_version { | 33 | struct mgmt_rp_read_version { |
@@ -40,13 +42,10 @@ struct mgmt_rp_read_index_list { | |||
40 | } __packed; | 42 | } __packed; |
41 | 43 | ||
42 | #define MGMT_OP_READ_INFO 0x0004 | 44 | #define MGMT_OP_READ_INFO 0x0004 |
43 | struct mgmt_cp_read_info { | ||
44 | __le16 index; | ||
45 | } __packed; | ||
46 | struct mgmt_rp_read_info { | 45 | struct mgmt_rp_read_info { |
47 | __le16 index; | ||
48 | __u8 type; | 46 | __u8 type; |
49 | __u8 powered; | 47 | __u8 powered; |
48 | __u8 connectable; | ||
50 | __u8 discoverable; | 49 | __u8 discoverable; |
51 | __u8 pairable; | 50 | __u8 pairable; |
52 | __u8 sec_mode; | 51 | __u8 sec_mode; |
@@ -58,6 +57,116 @@ struct mgmt_rp_read_info { | |||
58 | __u16 hci_rev; | 57 | __u16 hci_rev; |
59 | } __packed; | 58 | } __packed; |
60 | 59 | ||
60 | struct mgmt_mode { | ||
61 | __u8 val; | ||
62 | } __packed; | ||
63 | |||
64 | #define MGMT_OP_SET_POWERED 0x0005 | ||
65 | |||
66 | #define MGMT_OP_SET_DISCOVERABLE 0x0006 | ||
67 | |||
68 | #define MGMT_OP_SET_CONNECTABLE 0x0007 | ||
69 | |||
70 | #define MGMT_OP_SET_PAIRABLE 0x0008 | ||
71 | |||
72 | #define MGMT_OP_ADD_UUID 0x0009 | ||
73 | struct mgmt_cp_add_uuid { | ||
74 | __u8 uuid[16]; | ||
75 | __u8 svc_hint; | ||
76 | } __packed; | ||
77 | |||
78 | #define MGMT_OP_REMOVE_UUID 0x000A | ||
79 | struct mgmt_cp_remove_uuid { | ||
80 | __u8 uuid[16]; | ||
81 | } __packed; | ||
82 | |||
83 | #define MGMT_OP_SET_DEV_CLASS 0x000B | ||
84 | struct mgmt_cp_set_dev_class { | ||
85 | __u8 major; | ||
86 | __u8 minor; | ||
87 | } __packed; | ||
88 | |||
89 | #define MGMT_OP_SET_SERVICE_CACHE 0x000C | ||
90 | struct mgmt_cp_set_service_cache { | ||
91 | __u8 enable; | ||
92 | } __packed; | ||
93 | |||
94 | struct mgmt_key_info { | ||
95 | bdaddr_t bdaddr; | ||
96 | u8 type; | ||
97 | u8 val[16]; | ||
98 | u8 pin_len; | ||
99 | } __packed; | ||
100 | |||
101 | #define MGMT_OP_LOAD_KEYS 0x000D | ||
102 | struct mgmt_cp_load_keys { | ||
103 | __u8 debug_keys; | ||
104 | __le16 key_count; | ||
105 | struct mgmt_key_info keys[0]; | ||
106 | } __packed; | ||
107 | |||
108 | #define MGMT_OP_REMOVE_KEY 0x000E | ||
109 | struct mgmt_cp_remove_key { | ||
110 | bdaddr_t bdaddr; | ||
111 | __u8 disconnect; | ||
112 | } __packed; | ||
113 | |||
114 | #define MGMT_OP_DISCONNECT 0x000F | ||
115 | struct mgmt_cp_disconnect { | ||
116 | bdaddr_t bdaddr; | ||
117 | } __packed; | ||
118 | struct mgmt_rp_disconnect { | ||
119 | bdaddr_t bdaddr; | ||
120 | } __packed; | ||
121 | |||
122 | #define MGMT_OP_GET_CONNECTIONS 0x0010 | ||
123 | struct mgmt_rp_get_connections { | ||
124 | __le16 conn_count; | ||
125 | bdaddr_t conn[0]; | ||
126 | } __packed; | ||
127 | |||
128 | #define MGMT_OP_PIN_CODE_REPLY 0x0011 | ||
129 | struct mgmt_cp_pin_code_reply { | ||
130 | bdaddr_t bdaddr; | ||
131 | __u8 pin_len; | ||
132 | __u8 pin_code[16]; | ||
133 | } __packed; | ||
134 | struct mgmt_rp_pin_code_reply { | ||
135 | bdaddr_t bdaddr; | ||
136 | uint8_t status; | ||
137 | } __packed; | ||
138 | |||
139 | #define MGMT_OP_PIN_CODE_NEG_REPLY 0x0012 | ||
140 | struct mgmt_cp_pin_code_neg_reply { | ||
141 | bdaddr_t bdaddr; | ||
142 | } __packed; | ||
143 | |||
144 | #define MGMT_OP_SET_IO_CAPABILITY 0x0013 | ||
145 | struct mgmt_cp_set_io_capability { | ||
146 | __u8 io_capability; | ||
147 | } __packed; | ||
148 | |||
149 | #define MGMT_OP_PAIR_DEVICE 0x0014 | ||
150 | struct mgmt_cp_pair_device { | ||
151 | bdaddr_t bdaddr; | ||
152 | __u8 io_cap; | ||
153 | } __packed; | ||
154 | struct mgmt_rp_pair_device { | ||
155 | bdaddr_t bdaddr; | ||
156 | __u8 status; | ||
157 | } __packed; | ||
158 | |||
159 | #define MGMT_OP_USER_CONFIRM_REPLY 0x0015 | ||
160 | struct mgmt_cp_user_confirm_reply { | ||
161 | bdaddr_t bdaddr; | ||
162 | } __packed; | ||
163 | struct mgmt_rp_user_confirm_reply { | ||
164 | bdaddr_t bdaddr; | ||
165 | __u8 status; | ||
166 | } __packed; | ||
167 | |||
168 | #define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x0016 | ||
169 | |||
61 | #define MGMT_EV_CMD_COMPLETE 0x0001 | 170 | #define MGMT_EV_CMD_COMPLETE 0x0001 |
62 | struct mgmt_ev_cmd_complete { | 171 | struct mgmt_ev_cmd_complete { |
63 | __le16 opcode; | 172 | __le16 opcode; |
@@ -72,16 +181,56 @@ struct mgmt_ev_cmd_status { | |||
72 | 181 | ||
73 | #define MGMT_EV_CONTROLLER_ERROR 0x0003 | 182 | #define MGMT_EV_CONTROLLER_ERROR 0x0003 |
74 | struct mgmt_ev_controller_error { | 183 | struct mgmt_ev_controller_error { |
75 | __le16 index; | ||
76 | __u8 error_code; | 184 | __u8 error_code; |
77 | } __packed; | 185 | } __packed; |
78 | 186 | ||
79 | #define MGMT_EV_INDEX_ADDED 0x0004 | 187 | #define MGMT_EV_INDEX_ADDED 0x0004 |
80 | struct mgmt_ev_index_added { | ||
81 | __le16 index; | ||
82 | } __packed; | ||
83 | 188 | ||
84 | #define MGMT_EV_INDEX_REMOVED 0x0005 | 189 | #define MGMT_EV_INDEX_REMOVED 0x0005 |
85 | struct mgmt_ev_index_removed { | 190 | |
86 | __le16 index; | 191 | #define MGMT_EV_POWERED 0x0006 |
192 | |||
193 | #define MGMT_EV_DISCOVERABLE 0x0007 | ||
194 | |||
195 | #define MGMT_EV_CONNECTABLE 0x0008 | ||
196 | |||
197 | #define MGMT_EV_PAIRABLE 0x0009 | ||
198 | |||
199 | #define MGMT_EV_NEW_KEY 0x000A | ||
200 | struct mgmt_ev_new_key { | ||
201 | struct mgmt_key_info key; | ||
202 | __u8 old_key_type; | ||
203 | } __packed; | ||
204 | |||
205 | #define MGMT_EV_CONNECTED 0x000B | ||
206 | struct mgmt_ev_connected { | ||
207 | bdaddr_t bdaddr; | ||
208 | } __packed; | ||
209 | |||
210 | #define MGMT_EV_DISCONNECTED 0x000C | ||
211 | struct mgmt_ev_disconnected { | ||
212 | bdaddr_t bdaddr; | ||
213 | } __packed; | ||
214 | |||
215 | #define MGMT_EV_CONNECT_FAILED 0x000D | ||
216 | struct mgmt_ev_connect_failed { | ||
217 | bdaddr_t bdaddr; | ||
218 | __u8 status; | ||
219 | } __packed; | ||
220 | |||
221 | #define MGMT_EV_PIN_CODE_REQUEST 0x000E | ||
222 | struct mgmt_ev_pin_code_request { | ||
223 | bdaddr_t bdaddr; | ||
224 | } __packed; | ||
225 | |||
226 | #define MGMT_EV_USER_CONFIRM_REQUEST 0x000F | ||
227 | struct mgmt_ev_user_confirm_request { | ||
228 | bdaddr_t bdaddr; | ||
229 | __le32 value; | ||
230 | } __packed; | ||
231 | |||
232 | #define MGMT_EV_AUTH_FAILED 0x0010 | ||
233 | struct mgmt_ev_auth_failed { | ||
234 | bdaddr_t bdaddr; | ||
235 | __u8 status; | ||
87 | } __packed; | 236 | } __packed; |
diff --git a/include/net/bluetooth/smp.h b/include/net/bluetooth/smp.h new file mode 100644 index 000000000000..8f2edbf979dc --- /dev/null +++ b/include/net/bluetooth/smp.h | |||
@@ -0,0 +1,76 @@ | |||
1 | #ifndef __SMP_H | ||
2 | #define __SMP_H | ||
3 | |||
4 | struct smp_command_hdr { | ||
5 | __u8 code; | ||
6 | } __packed; | ||
7 | |||
8 | #define SMP_CMD_PAIRING_REQ 0x01 | ||
9 | #define SMP_CMD_PAIRING_RSP 0x02 | ||
10 | struct smp_cmd_pairing { | ||
11 | __u8 io_capability; | ||
12 | __u8 oob_flag; | ||
13 | __u8 auth_req; | ||
14 | __u8 max_key_size; | ||
15 | __u8 init_key_dist; | ||
16 | __u8 resp_key_dist; | ||
17 | } __packed; | ||
18 | |||
19 | #define SMP_CMD_PAIRING_CONFIRM 0x03 | ||
20 | struct smp_cmd_pairing_confirm { | ||
21 | __u8 confirm_val[16]; | ||
22 | } __packed; | ||
23 | |||
24 | #define SMP_CMD_PAIRING_RANDOM 0x04 | ||
25 | struct smp_cmd_pairing_random { | ||
26 | __u8 rand_val[16]; | ||
27 | } __packed; | ||
28 | |||
29 | #define SMP_CMD_PAIRING_FAIL 0x05 | ||
30 | struct smp_cmd_pairing_fail { | ||
31 | __u8 reason; | ||
32 | } __packed; | ||
33 | |||
34 | #define SMP_CMD_ENCRYPT_INFO 0x06 | ||
35 | struct smp_cmd_encrypt_info { | ||
36 | __u8 ltk[16]; | ||
37 | } __packed; | ||
38 | |||
39 | #define SMP_CMD_MASTER_IDENT 0x07 | ||
40 | struct smp_cmd_master_ident { | ||
41 | __u16 ediv; | ||
42 | __u8 rand[8]; | ||
43 | } __packed; | ||
44 | |||
45 | #define SMP_CMD_IDENT_INFO 0x08 | ||
46 | struct smp_cmd_ident_info { | ||
47 | __u8 irk[16]; | ||
48 | } __packed; | ||
49 | |||
50 | #define SMP_CMD_IDENT_ADDR_INFO 0x09 | ||
51 | struct smp_cmd_ident_addr_info { | ||
52 | __u8 addr_type; | ||
53 | bdaddr_t bdaddr; | ||
54 | } __packed; | ||
55 | |||
56 | #define SMP_CMD_SIGN_INFO 0x0a | ||
57 | struct smp_cmd_sign_info { | ||
58 | __u8 csrk[16]; | ||
59 | } __packed; | ||
60 | |||
61 | #define SMP_CMD_SECURITY_REQ 0x0b | ||
62 | struct smp_cmd_security_req { | ||
63 | __u8 auth_req; | ||
64 | } __packed; | ||
65 | |||
66 | #define SMP_PASSKEY_ENTRY_FAILED 0x01 | ||
67 | #define SMP_OOB_NOT_AVAIL 0x02 | ||
68 | #define SMP_AUTH_REQUIREMENTS 0x03 | ||
69 | #define SMP_CONFIRM_FAILED 0x04 | ||
70 | #define SMP_PAIRING_NOTSUPP 0x05 | ||
71 | #define SMP_ENC_KEY_SIZE 0x06 | ||
72 | #define SMP_CMD_NOTSUPP 0x07 | ||
73 | #define SMP_UNSPECIFIED 0x08 | ||
74 | #define SMP_REPEATED_ATTEMPTS 0x09 | ||
75 | |||
76 | #endif /* __SMP_H */ | ||
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 1322695beb52..60f7876b6da8 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -413,7 +413,7 @@ struct station_parameters { | |||
413 | * @STATION_INFO_PLID: @plid filled | 413 | * @STATION_INFO_PLID: @plid filled |
414 | * @STATION_INFO_PLINK_STATE: @plink_state filled | 414 | * @STATION_INFO_PLINK_STATE: @plink_state filled |
415 | * @STATION_INFO_SIGNAL: @signal filled | 415 | * @STATION_INFO_SIGNAL: @signal filled |
416 | * @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled | 416 | * @STATION_INFO_TX_BITRATE: @txrate fields are filled |
417 | * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) | 417 | * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) |
418 | * @STATION_INFO_RX_PACKETS: @rx_packets filled | 418 | * @STATION_INFO_RX_PACKETS: @rx_packets filled |
419 | * @STATION_INFO_TX_PACKETS: @tx_packets filled | 419 | * @STATION_INFO_TX_PACKETS: @tx_packets filled |
@@ -421,6 +421,7 @@ struct station_parameters { | |||
421 | * @STATION_INFO_TX_FAILED: @tx_failed filled | 421 | * @STATION_INFO_TX_FAILED: @tx_failed filled |
422 | * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled | 422 | * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled |
423 | * @STATION_INFO_SIGNAL_AVG: @signal_avg filled | 423 | * @STATION_INFO_SIGNAL_AVG: @signal_avg filled |
424 | * @STATION_INFO_RX_BITRATE: @rxrate fields are filled | ||
424 | */ | 425 | */ |
425 | enum station_info_flags { | 426 | enum station_info_flags { |
426 | STATION_INFO_INACTIVE_TIME = 1<<0, | 427 | STATION_INFO_INACTIVE_TIME = 1<<0, |
@@ -437,6 +438,7 @@ enum station_info_flags { | |||
437 | STATION_INFO_TX_FAILED = 1<<11, | 438 | STATION_INFO_TX_FAILED = 1<<11, |
438 | STATION_INFO_RX_DROP_MISC = 1<<12, | 439 | STATION_INFO_RX_DROP_MISC = 1<<12, |
439 | STATION_INFO_SIGNAL_AVG = 1<<13, | 440 | STATION_INFO_SIGNAL_AVG = 1<<13, |
441 | STATION_INFO_RX_BITRATE = 1<<14, | ||
440 | }; | 442 | }; |
441 | 443 | ||
442 | /** | 444 | /** |
@@ -506,6 +508,7 @@ struct station_info { | |||
506 | s8 signal; | 508 | s8 signal; |
507 | s8 signal_avg; | 509 | s8 signal_avg; |
508 | struct rate_info txrate; | 510 | struct rate_info txrate; |
511 | struct rate_info rxrate; | ||
509 | u32 rx_packets; | 512 | u32 rx_packets; |
510 | u32 tx_packets; | 513 | u32 tx_packets; |
511 | u32 tx_retries; | 514 | u32 tx_retries; |
@@ -1194,6 +1197,10 @@ struct cfg80211_pmksa { | |||
1194 | * (also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX). | 1197 | * (also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX). |
1195 | * | 1198 | * |
1196 | * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant). | 1199 | * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant). |
1200 | * | ||
1201 | * @set_ringparam: Set tx and rx ring sizes. | ||
1202 | * | ||
1203 | * @get_ringparam: Get tx and rx ring current and maximum sizes. | ||
1197 | */ | 1204 | */ |
1198 | struct cfg80211_ops { | 1205 | struct cfg80211_ops { |
1199 | int (*suspend)(struct wiphy *wiphy); | 1206 | int (*suspend)(struct wiphy *wiphy); |
@@ -1361,6 +1368,10 @@ struct cfg80211_ops { | |||
1361 | 1368 | ||
1362 | int (*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant); | 1369 | int (*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant); |
1363 | int (*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant); | 1370 | int (*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant); |
1371 | |||
1372 | int (*set_ringparam)(struct wiphy *wiphy, u32 tx, u32 rx); | ||
1373 | void (*get_ringparam)(struct wiphy *wiphy, | ||
1374 | u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max); | ||
1364 | }; | 1375 | }; |
1365 | 1376 | ||
1366 | /* | 1377 | /* |
@@ -1790,8 +1801,9 @@ static inline void *wdev_priv(struct wireless_dev *wdev) | |||
1790 | /** | 1801 | /** |
1791 | * ieee80211_channel_to_frequency - convert channel number to frequency | 1802 | * ieee80211_channel_to_frequency - convert channel number to frequency |
1792 | * @chan: channel number | 1803 | * @chan: channel number |
1804 | * @band: band, necessary due to channel number overlap | ||
1793 | */ | 1805 | */ |
1794 | extern int ieee80211_channel_to_frequency(int chan); | 1806 | extern int ieee80211_channel_to_frequency(int chan, enum ieee80211_band band); |
1795 | 1807 | ||
1796 | /** | 1808 | /** |
1797 | * ieee80211_frequency_to_channel - convert frequency to channel number | 1809 | * ieee80211_frequency_to_channel - convert frequency to channel number |
diff --git a/include/net/dcbnl.h b/include/net/dcbnl.h index a8e7852b10ab..e5983c9053dc 100644 --- a/include/net/dcbnl.h +++ b/include/net/dcbnl.h | |||
@@ -43,6 +43,8 @@ struct dcbnl_rtnl_ops { | |||
43 | int (*ieee_setpfc) (struct net_device *, struct ieee_pfc *); | 43 | int (*ieee_setpfc) (struct net_device *, struct ieee_pfc *); |
44 | int (*ieee_getapp) (struct net_device *, struct dcb_app *); | 44 | int (*ieee_getapp) (struct net_device *, struct dcb_app *); |
45 | int (*ieee_setapp) (struct net_device *, struct dcb_app *); | 45 | int (*ieee_setapp) (struct net_device *, struct dcb_app *); |
46 | int (*ieee_peer_getets) (struct net_device *, struct ieee_ets *); | ||
47 | int (*ieee_peer_getpfc) (struct net_device *, struct ieee_pfc *); | ||
46 | 48 | ||
47 | /* CEE std */ | 49 | /* CEE std */ |
48 | u8 (*getstate)(struct net_device *); | 50 | u8 (*getstate)(struct net_device *); |
@@ -77,7 +79,14 @@ struct dcbnl_rtnl_ops { | |||
77 | u8 (*getdcbx)(struct net_device *); | 79 | u8 (*getdcbx)(struct net_device *); |
78 | u8 (*setdcbx)(struct net_device *, u8); | 80 | u8 (*setdcbx)(struct net_device *, u8); |
79 | 81 | ||
82 | /* peer apps */ | ||
83 | int (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *, | ||
84 | u16 *); | ||
85 | int (*peer_getapptable)(struct net_device *, struct dcb_app *); | ||
80 | 86 | ||
87 | /* CEE peer */ | ||
88 | int (*cee_peer_getpg) (struct net_device *, struct cee_pg *); | ||
89 | int (*cee_peer_getpfc) (struct net_device *, struct cee_pfc *); | ||
81 | }; | 90 | }; |
82 | 91 | ||
83 | #endif /* __NET_DCBNL_H__ */ | 92 | #endif /* __NET_DCBNL_H__ */ |
diff --git a/include/net/dn.h b/include/net/dn.h index a514a3cf4573..298521e0d8a2 100644 --- a/include/net/dn.h +++ b/include/net/dn.h | |||
@@ -192,10 +192,10 @@ static inline void dn_dn2eth(unsigned char *ethaddr, __le16 addr) | |||
192 | ethaddr[5] = (__u8)(a >> 8); | 192 | ethaddr[5] = (__u8)(a >> 8); |
193 | } | 193 | } |
194 | 194 | ||
195 | static inline void dn_sk_ports_copy(struct flowi *fl, struct dn_scp *scp) | 195 | static inline void dn_sk_ports_copy(struct flowidn *fld, struct dn_scp *scp) |
196 | { | 196 | { |
197 | fl->uli_u.dnports.sport = scp->addrloc; | 197 | fld->fld_sport = scp->addrloc; |
198 | fl->uli_u.dnports.dport = scp->addrrem; | 198 | fld->fld_dport = scp->addrrem; |
199 | } | 199 | } |
200 | 200 | ||
201 | extern unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu); | 201 | extern unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu); |
diff --git a/include/net/dn_fib.h b/include/net/dn_fib.h index bbcde3238e58..782ef7cb4930 100644 --- a/include/net/dn_fib.h +++ b/include/net/dn_fib.h | |||
@@ -98,7 +98,7 @@ struct dn_fib_table { | |||
98 | int (*delete)(struct dn_fib_table *t, struct rtmsg *r, | 98 | int (*delete)(struct dn_fib_table *t, struct rtmsg *r, |
99 | struct dn_kern_rta *rta, struct nlmsghdr *n, | 99 | struct dn_kern_rta *rta, struct nlmsghdr *n, |
100 | struct netlink_skb_parms *req); | 100 | struct netlink_skb_parms *req); |
101 | int (*lookup)(struct dn_fib_table *t, const struct flowi *fl, | 101 | int (*lookup)(struct dn_fib_table *t, const struct flowidn *fld, |
102 | struct dn_fib_res *res); | 102 | struct dn_fib_res *res); |
103 | int (*flush)(struct dn_fib_table *t); | 103 | int (*flush)(struct dn_fib_table *t); |
104 | int (*dump)(struct dn_fib_table *t, struct sk_buff *skb, struct netlink_callback *cb); | 104 | int (*dump)(struct dn_fib_table *t, struct sk_buff *skb, struct netlink_callback *cb); |
@@ -119,12 +119,12 @@ extern struct dn_fib_info *dn_fib_create_info(const struct rtmsg *r, | |||
119 | struct dn_kern_rta *rta, | 119 | struct dn_kern_rta *rta, |
120 | const struct nlmsghdr *nlh, int *errp); | 120 | const struct nlmsghdr *nlh, int *errp); |
121 | extern int dn_fib_semantic_match(int type, struct dn_fib_info *fi, | 121 | extern int dn_fib_semantic_match(int type, struct dn_fib_info *fi, |
122 | const struct flowi *fl, | 122 | const struct flowidn *fld, |
123 | struct dn_fib_res *res); | 123 | struct dn_fib_res *res); |
124 | extern void dn_fib_release_info(struct dn_fib_info *fi); | 124 | extern void dn_fib_release_info(struct dn_fib_info *fi); |
125 | extern __le16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type); | 125 | extern __le16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type); |
126 | extern void dn_fib_flush(void); | 126 | extern void dn_fib_flush(void); |
127 | extern void dn_fib_select_multipath(const struct flowi *fl, | 127 | extern void dn_fib_select_multipath(const struct flowidn *fld, |
128 | struct dn_fib_res *res); | 128 | struct dn_fib_res *res); |
129 | 129 | ||
130 | /* | 130 | /* |
@@ -141,7 +141,7 @@ extern void dn_fib_table_cleanup(void); | |||
141 | extern void dn_fib_rules_init(void); | 141 | extern void dn_fib_rules_init(void); |
142 | extern void dn_fib_rules_cleanup(void); | 142 | extern void dn_fib_rules_cleanup(void); |
143 | extern unsigned dnet_addr_type(__le16 addr); | 143 | extern unsigned dnet_addr_type(__le16 addr); |
144 | extern int dn_fib_lookup(struct flowi *fl, struct dn_fib_res *res); | 144 | extern int dn_fib_lookup(struct flowidn *fld, struct dn_fib_res *res); |
145 | 145 | ||
146 | extern int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb); | 146 | extern int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb); |
147 | 147 | ||
diff --git a/include/net/dn_route.h b/include/net/dn_route.h index 9b185df265fb..81712cfa1ddf 100644 --- a/include/net/dn_route.h +++ b/include/net/dn_route.h | |||
@@ -16,7 +16,7 @@ | |||
16 | *******************************************************************************/ | 16 | *******************************************************************************/ |
17 | 17 | ||
18 | extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri); | 18 | extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri); |
19 | extern int dn_route_output_sock(struct dst_entry **pprt, struct flowi *, struct sock *sk, int flags); | 19 | extern int dn_route_output_sock(struct dst_entry **pprt, struct flowidn *, struct sock *sk, int flags); |
20 | extern int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb); | 20 | extern int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb); |
21 | extern void dn_rt_cache_flush(int delay); | 21 | extern void dn_rt_cache_flush(int delay); |
22 | 22 | ||
@@ -67,7 +67,7 @@ extern void dn_rt_cache_flush(int delay); | |||
67 | struct dn_route { | 67 | struct dn_route { |
68 | struct dst_entry dst; | 68 | struct dst_entry dst; |
69 | 69 | ||
70 | struct flowi fl; | 70 | struct flowidn fld; |
71 | 71 | ||
72 | __le16 rt_saddr; | 72 | __le16 rt_saddr; |
73 | __le16 rt_daddr; | 73 | __le16 rt_daddr; |
@@ -82,12 +82,12 @@ struct dn_route { | |||
82 | 82 | ||
83 | static inline bool dn_is_input_route(struct dn_route *rt) | 83 | static inline bool dn_is_input_route(struct dn_route *rt) |
84 | { | 84 | { |
85 | return rt->fl.iif != 0; | 85 | return rt->fld.flowidn_iif != 0; |
86 | } | 86 | } |
87 | 87 | ||
88 | static inline bool dn_is_output_route(struct dn_route *rt) | 88 | static inline bool dn_is_output_route(struct dn_route *rt) |
89 | { | 89 | { |
90 | return rt->fl.iif == 0; | 90 | return rt->fld.flowidn_iif == 0; |
91 | } | 91 | } |
92 | 92 | ||
93 | extern void dn_route_init(void); | 93 | extern void dn_route_init(void); |
diff --git a/include/net/dst.h b/include/net/dst.h index 93b0310317be..2a46cbaef92d 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
@@ -40,24 +40,10 @@ struct dst_entry { | |||
40 | struct rcu_head rcu_head; | 40 | struct rcu_head rcu_head; |
41 | struct dst_entry *child; | 41 | struct dst_entry *child; |
42 | struct net_device *dev; | 42 | struct net_device *dev; |
43 | short error; | 43 | struct dst_ops *ops; |
44 | short obsolete; | 44 | unsigned long _metrics; |
45 | int flags; | ||
46 | #define DST_HOST 0x0001 | ||
47 | #define DST_NOXFRM 0x0002 | ||
48 | #define DST_NOPOLICY 0x0004 | ||
49 | #define DST_NOHASH 0x0008 | ||
50 | #define DST_NOCACHE 0x0010 | ||
51 | unsigned long expires; | 45 | unsigned long expires; |
52 | |||
53 | unsigned short header_len; /* more space at head required */ | ||
54 | unsigned short trailer_len; /* space to reserve at tail */ | ||
55 | |||
56 | unsigned int rate_tokens; | ||
57 | unsigned long rate_last; /* rate limiting for ICMP */ | ||
58 | |||
59 | struct dst_entry *path; | 46 | struct dst_entry *path; |
60 | |||
61 | struct neighbour *neighbour; | 47 | struct neighbour *neighbour; |
62 | struct hh_cache *hh; | 48 | struct hh_cache *hh; |
63 | #ifdef CONFIG_XFRM | 49 | #ifdef CONFIG_XFRM |
@@ -68,17 +54,16 @@ struct dst_entry { | |||
68 | int (*input)(struct sk_buff*); | 54 | int (*input)(struct sk_buff*); |
69 | int (*output)(struct sk_buff*); | 55 | int (*output)(struct sk_buff*); |
70 | 56 | ||
71 | struct dst_ops *ops; | 57 | short error; |
72 | 58 | short obsolete; | |
73 | u32 _metrics[RTAX_MAX]; | 59 | unsigned short header_len; /* more space at head required */ |
74 | 60 | unsigned short trailer_len; /* space to reserve at tail */ | |
75 | #ifdef CONFIG_NET_CLS_ROUTE | 61 | #ifdef CONFIG_IP_ROUTE_CLASSID |
76 | __u32 tclassid; | 62 | __u32 tclassid; |
77 | #else | 63 | #else |
78 | __u32 __pad2; | 64 | __u32 __pad2; |
79 | #endif | 65 | #endif |
80 | 66 | ||
81 | |||
82 | /* | 67 | /* |
83 | * Align __refcnt to a 64 bytes alignment | 68 | * Align __refcnt to a 64 bytes alignment |
84 | * (L1_CACHE_SIZE would be too much) | 69 | * (L1_CACHE_SIZE would be too much) |
@@ -93,6 +78,12 @@ struct dst_entry { | |||
93 | atomic_t __refcnt; /* client references */ | 78 | atomic_t __refcnt; /* client references */ |
94 | int __use; | 79 | int __use; |
95 | unsigned long lastuse; | 80 | unsigned long lastuse; |
81 | int flags; | ||
82 | #define DST_HOST 0x0001 | ||
83 | #define DST_NOXFRM 0x0002 | ||
84 | #define DST_NOPOLICY 0x0004 | ||
85 | #define DST_NOHASH 0x0008 | ||
86 | #define DST_NOCACHE 0x0010 | ||
96 | union { | 87 | union { |
97 | struct dst_entry *next; | 88 | struct dst_entry *next; |
98 | struct rtable __rcu *rt_next; | 89 | struct rtable __rcu *rt_next; |
@@ -103,10 +94,70 @@ struct dst_entry { | |||
103 | 94 | ||
104 | #ifdef __KERNEL__ | 95 | #ifdef __KERNEL__ |
105 | 96 | ||
97 | extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); | ||
98 | extern const u32 dst_default_metrics[RTAX_MAX]; | ||
99 | |||
100 | #define DST_METRICS_READ_ONLY 0x1UL | ||
101 | #define __DST_METRICS_PTR(Y) \ | ||
102 | ((u32 *)((Y) & ~DST_METRICS_READ_ONLY)) | ||
103 | #define DST_METRICS_PTR(X) __DST_METRICS_PTR((X)->_metrics) | ||
104 | |||
105 | static inline bool dst_metrics_read_only(const struct dst_entry *dst) | ||
106 | { | ||
107 | return dst->_metrics & DST_METRICS_READ_ONLY; | ||
108 | } | ||
109 | |||
110 | extern void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old); | ||
111 | |||
112 | static inline void dst_destroy_metrics_generic(struct dst_entry *dst) | ||
113 | { | ||
114 | unsigned long val = dst->_metrics; | ||
115 | if (!(val & DST_METRICS_READ_ONLY)) | ||
116 | __dst_destroy_metrics_generic(dst, val); | ||
117 | } | ||
118 | |||
119 | static inline u32 *dst_metrics_write_ptr(struct dst_entry *dst) | ||
120 | { | ||
121 | unsigned long p = dst->_metrics; | ||
122 | |||
123 | if (p & DST_METRICS_READ_ONLY) | ||
124 | return dst->ops->cow_metrics(dst, p); | ||
125 | return __DST_METRICS_PTR(p); | ||
126 | } | ||
127 | |||
128 | /* This may only be invoked before the entry has reached global | ||
129 | * visibility. | ||
130 | */ | ||
131 | static inline void dst_init_metrics(struct dst_entry *dst, | ||
132 | const u32 *src_metrics, | ||
133 | bool read_only) | ||
134 | { | ||
135 | dst->_metrics = ((unsigned long) src_metrics) | | ||
136 | (read_only ? DST_METRICS_READ_ONLY : 0); | ||
137 | } | ||
138 | |||
139 | static inline void dst_copy_metrics(struct dst_entry *dest, const struct dst_entry *src) | ||
140 | { | ||
141 | u32 *dst_metrics = dst_metrics_write_ptr(dest); | ||
142 | |||
143 | if (dst_metrics) { | ||
144 | u32 *src_metrics = DST_METRICS_PTR(src); | ||
145 | |||
146 | memcpy(dst_metrics, src_metrics, RTAX_MAX * sizeof(u32)); | ||
147 | } | ||
148 | } | ||
149 | |||
150 | static inline u32 *dst_metrics_ptr(struct dst_entry *dst) | ||
151 | { | ||
152 | return DST_METRICS_PTR(dst); | ||
153 | } | ||
154 | |||
106 | static inline u32 | 155 | static inline u32 |
107 | dst_metric_raw(const struct dst_entry *dst, const int metric) | 156 | dst_metric_raw(const struct dst_entry *dst, const int metric) |
108 | { | 157 | { |
109 | return dst->_metrics[metric-1]; | 158 | u32 *p = DST_METRICS_PTR(dst); |
159 | |||
160 | return p[metric-1]; | ||
110 | } | 161 | } |
111 | 162 | ||
112 | static inline u32 | 163 | static inline u32 |
@@ -131,22 +182,10 @@ dst_metric_advmss(const struct dst_entry *dst) | |||
131 | 182 | ||
132 | static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val) | 183 | static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val) |
133 | { | 184 | { |
134 | dst->_metrics[metric-1] = val; | 185 | u32 *p = dst_metrics_write_ptr(dst); |
135 | } | ||
136 | 186 | ||
137 | static inline void dst_import_metrics(struct dst_entry *dst, const u32 *src_metrics) | 187 | if (p) |
138 | { | 188 | p[metric-1] = val; |
139 | memcpy(dst->_metrics, src_metrics, RTAX_MAX * sizeof(u32)); | ||
140 | } | ||
141 | |||
142 | static inline void dst_copy_metrics(struct dst_entry *dest, const struct dst_entry *src) | ||
143 | { | ||
144 | dst_import_metrics(dest, src->_metrics); | ||
145 | } | ||
146 | |||
147 | static inline u32 *dst_metrics_ptr(struct dst_entry *dst) | ||
148 | { | ||
149 | return dst->_metrics; | ||
150 | } | 189 | } |
151 | 190 | ||
152 | static inline u32 | 191 | static inline u32 |
@@ -181,8 +220,6 @@ static inline u32 | |||
181 | dst_allfrag(const struct dst_entry *dst) | 220 | dst_allfrag(const struct dst_entry *dst) |
182 | { | 221 | { |
183 | int ret = dst_feature(dst, RTAX_FEATURE_ALLFRAG); | 222 | int ret = dst_feature(dst, RTAX_FEATURE_ALLFRAG); |
184 | /* Yes, _exactly_. This is paranoia. */ | ||
185 | barrier(); | ||
186 | return ret; | 223 | return ret; |
187 | } | 224 | } |
188 | 225 | ||
@@ -315,7 +352,7 @@ static inline struct dst_entry *skb_dst_pop(struct sk_buff *skb) | |||
315 | } | 352 | } |
316 | 353 | ||
317 | extern int dst_discard(struct sk_buff *skb); | 354 | extern int dst_discard(struct sk_buff *skb); |
318 | extern void * dst_alloc(struct dst_ops * ops); | 355 | extern void *dst_alloc(struct dst_ops * ops, int initial_ref); |
319 | extern void __dst_free(struct dst_entry * dst); | 356 | extern void __dst_free(struct dst_entry * dst); |
320 | extern struct dst_entry *dst_destroy(struct dst_entry * dst); | 357 | extern struct dst_entry *dst_destroy(struct dst_entry * dst); |
321 | 358 | ||
@@ -384,27 +421,22 @@ extern void dst_init(void); | |||
384 | 421 | ||
385 | /* Flags for xfrm_lookup flags argument. */ | 422 | /* Flags for xfrm_lookup flags argument. */ |
386 | enum { | 423 | enum { |
387 | XFRM_LOOKUP_WAIT = 1 << 0, | 424 | XFRM_LOOKUP_ICMP = 1 << 0, |
388 | XFRM_LOOKUP_ICMP = 1 << 1, | ||
389 | }; | 425 | }; |
390 | 426 | ||
391 | struct flowi; | 427 | struct flowi; |
392 | #ifndef CONFIG_XFRM | 428 | #ifndef CONFIG_XFRM |
393 | static inline int xfrm_lookup(struct net *net, struct dst_entry **dst_p, | 429 | static inline struct dst_entry *xfrm_lookup(struct net *net, |
394 | struct flowi *fl, struct sock *sk, int flags) | 430 | struct dst_entry *dst_orig, |
431 | const struct flowi *fl, struct sock *sk, | ||
432 | int flags) | ||
395 | { | 433 | { |
396 | return 0; | 434 | return dst_orig; |
397 | } | 435 | } |
398 | static inline int __xfrm_lookup(struct net *net, struct dst_entry **dst_p, | ||
399 | struct flowi *fl, struct sock *sk, int flags) | ||
400 | { | ||
401 | return 0; | ||
402 | } | ||
403 | #else | 436 | #else |
404 | extern int xfrm_lookup(struct net *net, struct dst_entry **dst_p, | 437 | extern struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig, |
405 | struct flowi *fl, struct sock *sk, int flags); | 438 | const struct flowi *fl, struct sock *sk, |
406 | extern int __xfrm_lookup(struct net *net, struct dst_entry **dst_p, | 439 | int flags); |
407 | struct flowi *fl, struct sock *sk, int flags); | ||
408 | #endif | 440 | #endif |
409 | #endif | 441 | #endif |
410 | 442 | ||
diff --git a/include/net/dst_ops.h b/include/net/dst_ops.h index 21a320b8708e..dc0746328947 100644 --- a/include/net/dst_ops.h +++ b/include/net/dst_ops.h | |||
@@ -18,6 +18,7 @@ struct dst_ops { | |||
18 | struct dst_entry * (*check)(struct dst_entry *, __u32 cookie); | 18 | struct dst_entry * (*check)(struct dst_entry *, __u32 cookie); |
19 | unsigned int (*default_advmss)(const struct dst_entry *); | 19 | unsigned int (*default_advmss)(const struct dst_entry *); |
20 | unsigned int (*default_mtu)(const struct dst_entry *); | 20 | unsigned int (*default_mtu)(const struct dst_entry *); |
21 | u32 * (*cow_metrics)(struct dst_entry *, unsigned long); | ||
21 | void (*destroy)(struct dst_entry *); | 22 | void (*destroy)(struct dst_entry *); |
22 | void (*ifdown)(struct dst_entry *, | 23 | void (*ifdown)(struct dst_entry *, |
23 | struct net_device *dev, int how); | 24 | struct net_device *dev, int how); |
diff --git a/include/net/flow.h b/include/net/flow.h index 240b7f356c71..7fe5a0f9483a 100644 --- a/include/net/flow.h +++ b/include/net/flow.h | |||
@@ -10,78 +10,136 @@ | |||
10 | #include <linux/in6.h> | 10 | #include <linux/in6.h> |
11 | #include <asm/atomic.h> | 11 | #include <asm/atomic.h> |
12 | 12 | ||
13 | struct flowi { | 13 | struct flowi_common { |
14 | int oif; | 14 | int flowic_oif; |
15 | int iif; | 15 | int flowic_iif; |
16 | __u32 mark; | 16 | __u32 flowic_mark; |
17 | __u8 flowic_tos; | ||
18 | __u8 flowic_scope; | ||
19 | __u8 flowic_proto; | ||
20 | __u8 flowic_flags; | ||
21 | #define FLOWI_FLAG_ANYSRC 0x01 | ||
22 | #define FLOWI_FLAG_PRECOW_METRICS 0x02 | ||
23 | #define FLOWI_FLAG_CAN_SLEEP 0x04 | ||
24 | __u32 flowic_secid; | ||
25 | }; | ||
17 | 26 | ||
27 | union flowi_uli { | ||
28 | struct { | ||
29 | __be16 sport; | ||
30 | __be16 dport; | ||
31 | } ports; | ||
32 | |||
33 | struct { | ||
34 | __u8 type; | ||
35 | __u8 code; | ||
36 | } icmpt; | ||
37 | |||
38 | struct { | ||
39 | __le16 sport; | ||
40 | __le16 dport; | ||
41 | } dnports; | ||
42 | |||
43 | __be32 spi; | ||
44 | __be32 gre_key; | ||
45 | |||
46 | struct { | ||
47 | __u8 type; | ||
48 | } mht; | ||
49 | }; | ||
50 | |||
51 | struct flowi4 { | ||
52 | struct flowi_common __fl_common; | ||
53 | #define flowi4_oif __fl_common.flowic_oif | ||
54 | #define flowi4_iif __fl_common.flowic_iif | ||
55 | #define flowi4_mark __fl_common.flowic_mark | ||
56 | #define flowi4_tos __fl_common.flowic_tos | ||
57 | #define flowi4_scope __fl_common.flowic_scope | ||
58 | #define flowi4_proto __fl_common.flowic_proto | ||
59 | #define flowi4_flags __fl_common.flowic_flags | ||
60 | #define flowi4_secid __fl_common.flowic_secid | ||
61 | __be32 daddr; | ||
62 | __be32 saddr; | ||
63 | union flowi_uli uli; | ||
64 | #define fl4_sport uli.ports.sport | ||
65 | #define fl4_dport uli.ports.dport | ||
66 | #define fl4_icmp_type uli.icmpt.type | ||
67 | #define fl4_icmp_code uli.icmpt.code | ||
68 | #define fl4_ipsec_spi uli.spi | ||
69 | #define fl4_mh_type uli.mht.type | ||
70 | #define fl4_gre_key uli.gre_key | ||
71 | }; | ||
72 | |||
73 | struct flowi6 { | ||
74 | struct flowi_common __fl_common; | ||
75 | #define flowi6_oif __fl_common.flowic_oif | ||
76 | #define flowi6_iif __fl_common.flowic_iif | ||
77 | #define flowi6_mark __fl_common.flowic_mark | ||
78 | #define flowi6_tos __fl_common.flowic_tos | ||
79 | #define flowi6_scope __fl_common.flowic_scope | ||
80 | #define flowi6_proto __fl_common.flowic_proto | ||
81 | #define flowi6_flags __fl_common.flowic_flags | ||
82 | #define flowi6_secid __fl_common.flowic_secid | ||
83 | struct in6_addr daddr; | ||
84 | struct in6_addr saddr; | ||
85 | __be32 flowlabel; | ||
86 | union flowi_uli uli; | ||
87 | #define fl6_sport uli.ports.sport | ||
88 | #define fl6_dport uli.ports.dport | ||
89 | #define fl6_icmp_type uli.icmpt.type | ||
90 | #define fl6_icmp_code uli.icmpt.code | ||
91 | #define fl6_ipsec_spi uli.spi | ||
92 | #define fl6_mh_type uli.mht.type | ||
93 | #define fl6_gre_key uli.gre_key | ||
94 | }; | ||
95 | |||
96 | struct flowidn { | ||
97 | struct flowi_common __fl_common; | ||
98 | #define flowidn_oif __fl_common.flowic_oif | ||
99 | #define flowidn_iif __fl_common.flowic_iif | ||
100 | #define flowidn_mark __fl_common.flowic_mark | ||
101 | #define flowidn_scope __fl_common.flowic_scope | ||
102 | #define flowidn_proto __fl_common.flowic_proto | ||
103 | #define flowidn_flags __fl_common.flowic_flags | ||
104 | __le16 daddr; | ||
105 | __le16 saddr; | ||
106 | union flowi_uli uli; | ||
107 | #define fld_sport uli.ports.sport | ||
108 | #define fld_dport uli.ports.dport | ||
109 | }; | ||
110 | |||
111 | struct flowi { | ||
18 | union { | 112 | union { |
19 | struct { | 113 | struct flowi_common __fl_common; |
20 | __be32 daddr; | 114 | struct flowi4 ip4; |
21 | __be32 saddr; | 115 | struct flowi6 ip6; |
22 | __u8 tos; | 116 | struct flowidn dn; |
23 | __u8 scope; | 117 | } u; |
24 | } ip4_u; | 118 | #define flowi_oif u.__fl_common.flowic_oif |
25 | 119 | #define flowi_iif u.__fl_common.flowic_iif | |
26 | struct { | 120 | #define flowi_mark u.__fl_common.flowic_mark |
27 | struct in6_addr daddr; | 121 | #define flowi_tos u.__fl_common.flowic_tos |
28 | struct in6_addr saddr; | 122 | #define flowi_scope u.__fl_common.flowic_scope |
29 | __be32 flowlabel; | 123 | #define flowi_proto u.__fl_common.flowic_proto |
30 | } ip6_u; | 124 | #define flowi_flags u.__fl_common.flowic_flags |
31 | 125 | #define flowi_secid u.__fl_common.flowic_secid | |
32 | struct { | ||
33 | __le16 daddr; | ||
34 | __le16 saddr; | ||
35 | __u8 scope; | ||
36 | } dn_u; | ||
37 | } nl_u; | ||
38 | #define fld_dst nl_u.dn_u.daddr | ||
39 | #define fld_src nl_u.dn_u.saddr | ||
40 | #define fld_scope nl_u.dn_u.scope | ||
41 | #define fl6_dst nl_u.ip6_u.daddr | ||
42 | #define fl6_src nl_u.ip6_u.saddr | ||
43 | #define fl6_flowlabel nl_u.ip6_u.flowlabel | ||
44 | #define fl4_dst nl_u.ip4_u.daddr | ||
45 | #define fl4_src nl_u.ip4_u.saddr | ||
46 | #define fl4_tos nl_u.ip4_u.tos | ||
47 | #define fl4_scope nl_u.ip4_u.scope | ||
48 | |||
49 | __u8 proto; | ||
50 | __u8 flags; | ||
51 | #define FLOWI_FLAG_ANYSRC 0x01 | ||
52 | union { | ||
53 | struct { | ||
54 | __be16 sport; | ||
55 | __be16 dport; | ||
56 | } ports; | ||
57 | |||
58 | struct { | ||
59 | __u8 type; | ||
60 | __u8 code; | ||
61 | } icmpt; | ||
62 | |||
63 | struct { | ||
64 | __le16 sport; | ||
65 | __le16 dport; | ||
66 | } dnports; | ||
67 | |||
68 | __be32 spi; | ||
69 | __be32 gre_key; | ||
70 | |||
71 | struct { | ||
72 | __u8 type; | ||
73 | } mht; | ||
74 | } uli_u; | ||
75 | #define fl_ip_sport uli_u.ports.sport | ||
76 | #define fl_ip_dport uli_u.ports.dport | ||
77 | #define fl_icmp_type uli_u.icmpt.type | ||
78 | #define fl_icmp_code uli_u.icmpt.code | ||
79 | #define fl_ipsec_spi uli_u.spi | ||
80 | #define fl_mh_type uli_u.mht.type | ||
81 | #define fl_gre_key uli_u.gre_key | ||
82 | __u32 secid; /* used by xfrm; see secid.txt */ | ||
83 | } __attribute__((__aligned__(BITS_PER_LONG/8))); | 126 | } __attribute__((__aligned__(BITS_PER_LONG/8))); |
84 | 127 | ||
128 | static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4) | ||
129 | { | ||
130 | return container_of(fl4, struct flowi, u.ip4); | ||
131 | } | ||
132 | |||
133 | static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6) | ||
134 | { | ||
135 | return container_of(fl6, struct flowi, u.ip6); | ||
136 | } | ||
137 | |||
138 | static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn) | ||
139 | { | ||
140 | return container_of(fldn, struct flowi, u.dn); | ||
141 | } | ||
142 | |||
85 | #define FLOW_DIR_IN 0 | 143 | #define FLOW_DIR_IN 0 |
86 | #define FLOW_DIR_OUT 1 | 144 | #define FLOW_DIR_OUT 1 |
87 | #define FLOW_DIR_FWD 2 | 145 | #define FLOW_DIR_FWD 2 |
@@ -101,20 +159,14 @@ struct flow_cache_ops { | |||
101 | }; | 159 | }; |
102 | 160 | ||
103 | typedef struct flow_cache_object *(*flow_resolve_t)( | 161 | typedef struct flow_cache_object *(*flow_resolve_t)( |
104 | struct net *net, struct flowi *key, u16 family, | 162 | struct net *net, const struct flowi *key, u16 family, |
105 | u8 dir, struct flow_cache_object *oldobj, void *ctx); | 163 | u8 dir, struct flow_cache_object *oldobj, void *ctx); |
106 | 164 | ||
107 | extern struct flow_cache_object *flow_cache_lookup( | 165 | extern struct flow_cache_object *flow_cache_lookup( |
108 | struct net *net, struct flowi *key, u16 family, | 166 | struct net *net, const struct flowi *key, u16 family, |
109 | u8 dir, flow_resolve_t resolver, void *ctx); | 167 | u8 dir, flow_resolve_t resolver, void *ctx); |
110 | 168 | ||
111 | extern void flow_cache_flush(void); | 169 | extern void flow_cache_flush(void); |
112 | extern atomic_t flow_cache_genid; | 170 | extern atomic_t flow_cache_genid; |
113 | 171 | ||
114 | static inline int flow_cache_uli_match(struct flowi *fl1, struct flowi *fl2) | ||
115 | { | ||
116 | return (fl1->proto == fl2->proto && | ||
117 | !memcmp(&fl1->uli_u, &fl2->uli_u, sizeof(fl1->uli_u))); | ||
118 | } | ||
119 | |||
120 | #endif | 172 | #endif |
diff --git a/include/net/icmp.h b/include/net/icmp.h index 6e991e0d0d6f..f0698b955b73 100644 --- a/include/net/icmp.h +++ b/include/net/icmp.h | |||
@@ -45,7 +45,4 @@ extern int icmp_ioctl(struct sock *sk, int cmd, unsigned long arg); | |||
45 | extern int icmp_init(void); | 45 | extern int icmp_init(void); |
46 | extern void icmp_out_count(struct net *net, unsigned char type); | 46 | extern void icmp_out_count(struct net *net, unsigned char type); |
47 | 47 | ||
48 | /* Move into dst.h ? */ | ||
49 | extern int xrlim_allow(struct dst_entry *dst, int timeout); | ||
50 | |||
51 | #endif /* _ICMP_H */ | 48 | #endif /* _ICMP_H */ |
diff --git a/include/net/ieee80211_radiotap.h b/include/net/ieee80211_radiotap.h index af49f8ab7f81..b0be5fb9de19 100644 --- a/include/net/ieee80211_radiotap.h +++ b/include/net/ieee80211_radiotap.h | |||
@@ -178,6 +178,11 @@ struct ieee80211_radiotap_header { | |||
178 | * | 178 | * |
179 | * Number of unicast retries a transmitted frame used. | 179 | * Number of unicast retries a transmitted frame used. |
180 | * | 180 | * |
181 | * IEEE80211_RADIOTAP_MCS u8, u8, u8 unitless | ||
182 | * | ||
183 | * Contains a bitmap of known fields/flags, the flags, and | ||
184 | * the MCS index. | ||
185 | * | ||
181 | */ | 186 | */ |
182 | enum ieee80211_radiotap_type { | 187 | enum ieee80211_radiotap_type { |
183 | IEEE80211_RADIOTAP_TSFT = 0, | 188 | IEEE80211_RADIOTAP_TSFT = 0, |
@@ -199,6 +204,8 @@ enum ieee80211_radiotap_type { | |||
199 | IEEE80211_RADIOTAP_RTS_RETRIES = 16, | 204 | IEEE80211_RADIOTAP_RTS_RETRIES = 16, |
200 | IEEE80211_RADIOTAP_DATA_RETRIES = 17, | 205 | IEEE80211_RADIOTAP_DATA_RETRIES = 17, |
201 | 206 | ||
207 | IEEE80211_RADIOTAP_MCS = 19, | ||
208 | |||
202 | /* valid in every it_present bitmap, even vendor namespaces */ | 209 | /* valid in every it_present bitmap, even vendor namespaces */ |
203 | IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, | 210 | IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, |
204 | IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, | 211 | IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, |
@@ -245,6 +252,24 @@ enum ieee80211_radiotap_type { | |||
245 | #define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */ | 252 | #define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */ |
246 | #define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */ | 253 | #define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */ |
247 | 254 | ||
255 | |||
256 | /* For IEEE80211_RADIOTAP_MCS */ | ||
257 | #define IEEE80211_RADIOTAP_MCS_HAVE_BW 0x01 | ||
258 | #define IEEE80211_RADIOTAP_MCS_HAVE_MCS 0x02 | ||
259 | #define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04 | ||
260 | #define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08 | ||
261 | #define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10 | ||
262 | |||
263 | #define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03 | ||
264 | #define IEEE80211_RADIOTAP_MCS_BW_20 0 | ||
265 | #define IEEE80211_RADIOTAP_MCS_BW_40 1 | ||
266 | #define IEEE80211_RADIOTAP_MCS_BW_20L 2 | ||
267 | #define IEEE80211_RADIOTAP_MCS_BW_20U 3 | ||
268 | #define IEEE80211_RADIOTAP_MCS_SGI 0x04 | ||
269 | #define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08 | ||
270 | #define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10 | ||
271 | |||
272 | |||
248 | /* Ugly macro to convert literal channel numbers into their mhz equivalents | 273 | /* Ugly macro to convert literal channel numbers into their mhz equivalents |
249 | * There are certianly some conditions that will break this (like feeding it '30') | 274 | * There are certianly some conditions that will break this (like feeding it '30') |
250 | * but they shouldn't arise since nothing talks on channel 30. */ | 275 | * but they shouldn't arise since nothing talks on channel 30. */ |
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index 8181498fa96c..7a37369f8ea3 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h | |||
@@ -86,6 +86,19 @@ static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk) | |||
86 | return (struct inet_request_sock *)sk; | 86 | return (struct inet_request_sock *)sk; |
87 | } | 87 | } |
88 | 88 | ||
89 | struct inet_cork { | ||
90 | unsigned int flags; | ||
91 | unsigned int fragsize; | ||
92 | struct ip_options *opt; | ||
93 | struct dst_entry *dst; | ||
94 | int length; /* Total length of all frames */ | ||
95 | __be32 addr; | ||
96 | struct flowi fl; | ||
97 | struct page *page; | ||
98 | u32 off; | ||
99 | u8 tx_flags; | ||
100 | }; | ||
101 | |||
89 | struct ip_mc_socklist; | 102 | struct ip_mc_socklist; |
90 | struct ipv6_pinfo; | 103 | struct ipv6_pinfo; |
91 | struct rtable; | 104 | struct rtable; |
@@ -143,15 +156,7 @@ struct inet_sock { | |||
143 | int mc_index; | 156 | int mc_index; |
144 | __be32 mc_addr; | 157 | __be32 mc_addr; |
145 | struct ip_mc_socklist __rcu *mc_list; | 158 | struct ip_mc_socklist __rcu *mc_list; |
146 | struct { | 159 | struct inet_cork cork; |
147 | unsigned int flags; | ||
148 | unsigned int fragsize; | ||
149 | struct ip_options *opt; | ||
150 | struct dst_entry *dst; | ||
151 | int length; /* Total length of all frames */ | ||
152 | __be32 addr; | ||
153 | struct flowi fl; | ||
154 | } cork; | ||
155 | }; | 160 | }; |
156 | 161 | ||
157 | #define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */ | 162 | #define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */ |
@@ -219,7 +224,13 @@ static inline struct request_sock *inet_reqsk_alloc(struct request_sock_ops *ops | |||
219 | 224 | ||
220 | static inline __u8 inet_sk_flowi_flags(const struct sock *sk) | 225 | static inline __u8 inet_sk_flowi_flags(const struct sock *sk) |
221 | { | 226 | { |
222 | return inet_sk(sk)->transparent ? FLOWI_FLAG_ANYSRC : 0; | 227 | __u8 flags = 0; |
228 | |||
229 | if (inet_sk(sk)->transparent) | ||
230 | flags |= FLOWI_FLAG_ANYSRC; | ||
231 | if (sk->sk_protocol == IPPROTO_TCP) | ||
232 | flags |= FLOWI_FLAG_PRECOW_METRICS; | ||
233 | return flags; | ||
223 | } | 234 | } |
224 | 235 | ||
225 | #endif /* _INET_SOCK_H */ | 236 | #endif /* _INET_SOCK_H */ |
diff --git a/include/net/inetpeer.h b/include/net/inetpeer.h index 599d96e74114..e6dd8da6b2ad 100644 --- a/include/net/inetpeer.h +++ b/include/net/inetpeer.h | |||
@@ -11,15 +11,20 @@ | |||
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/jiffies.h> | 12 | #include <linux/jiffies.h> |
13 | #include <linux/spinlock.h> | 13 | #include <linux/spinlock.h> |
14 | #include <linux/rtnetlink.h> | ||
14 | #include <net/ipv6.h> | 15 | #include <net/ipv6.h> |
15 | #include <asm/atomic.h> | 16 | #include <asm/atomic.h> |
16 | 17 | ||
17 | struct inetpeer_addr { | 18 | struct inetpeer_addr_base { |
18 | union { | 19 | union { |
19 | __be32 a4; | 20 | __be32 a4; |
20 | __be32 a6[4]; | 21 | __be32 a6[4]; |
21 | }; | 22 | }; |
22 | __u16 family; | 23 | }; |
24 | |||
25 | struct inetpeer_addr { | ||
26 | struct inetpeer_addr_base addr; | ||
27 | __u16 family; | ||
23 | }; | 28 | }; |
24 | 29 | ||
25 | struct inet_peer { | 30 | struct inet_peer { |
@@ -33,15 +38,22 @@ struct inet_peer { | |||
33 | atomic_t refcnt; | 38 | atomic_t refcnt; |
34 | /* | 39 | /* |
35 | * Once inet_peer is queued for deletion (refcnt == -1), following fields | 40 | * Once inet_peer is queued for deletion (refcnt == -1), following fields |
36 | * are not available: rid, ip_id_count, tcp_ts, tcp_ts_stamp | 41 | * are not available: rid, ip_id_count, tcp_ts, tcp_ts_stamp, metrics |
37 | * We can share memory with rcu_head to keep inet_peer small | 42 | * We can share memory with rcu_head to help keep inet_peer small. |
38 | */ | 43 | */ |
39 | union { | 44 | union { |
40 | struct { | 45 | struct { |
41 | atomic_t rid; /* Frag reception counter */ | 46 | atomic_t rid; /* Frag reception counter */ |
42 | atomic_t ip_id_count; /* IP ID for the next packet */ | 47 | atomic_t ip_id_count; /* IP ID for the next packet */ |
43 | __u32 tcp_ts; | 48 | __u32 tcp_ts; |
44 | __u32 tcp_ts_stamp; | 49 | __u32 tcp_ts_stamp; |
50 | u32 metrics[RTAX_MAX]; | ||
51 | u32 rate_tokens; /* rate limiting for ICMP */ | ||
52 | unsigned long rate_last; | ||
53 | unsigned long pmtu_expires; | ||
54 | u32 pmtu_orig; | ||
55 | u32 pmtu_learned; | ||
56 | struct inetpeer_addr_base redirect_learned; | ||
45 | }; | 57 | }; |
46 | struct rcu_head rcu; | 58 | struct rcu_head rcu; |
47 | }; | 59 | }; |
@@ -49,6 +61,13 @@ struct inet_peer { | |||
49 | 61 | ||
50 | void inet_initpeers(void) __init; | 62 | void inet_initpeers(void) __init; |
51 | 63 | ||
64 | #define INETPEER_METRICS_NEW (~(u32) 0) | ||
65 | |||
66 | static inline bool inet_metrics_new(const struct inet_peer *p) | ||
67 | { | ||
68 | return p->metrics[RTAX_LOCK-1] == INETPEER_METRICS_NEW; | ||
69 | } | ||
70 | |||
52 | /* can be called with or without local BH being disabled */ | 71 | /* can be called with or without local BH being disabled */ |
53 | struct inet_peer *inet_getpeer(struct inetpeer_addr *daddr, int create); | 72 | struct inet_peer *inet_getpeer(struct inetpeer_addr *daddr, int create); |
54 | 73 | ||
@@ -56,7 +75,7 @@ static inline struct inet_peer *inet_getpeer_v4(__be32 v4daddr, int create) | |||
56 | { | 75 | { |
57 | struct inetpeer_addr daddr; | 76 | struct inetpeer_addr daddr; |
58 | 77 | ||
59 | daddr.a4 = v4daddr; | 78 | daddr.addr.a4 = v4daddr; |
60 | daddr.family = AF_INET; | 79 | daddr.family = AF_INET; |
61 | return inet_getpeer(&daddr, create); | 80 | return inet_getpeer(&daddr, create); |
62 | } | 81 | } |
@@ -65,13 +84,14 @@ static inline struct inet_peer *inet_getpeer_v6(struct in6_addr *v6daddr, int cr | |||
65 | { | 84 | { |
66 | struct inetpeer_addr daddr; | 85 | struct inetpeer_addr daddr; |
67 | 86 | ||
68 | ipv6_addr_copy((struct in6_addr *)daddr.a6, v6daddr); | 87 | ipv6_addr_copy((struct in6_addr *)daddr.addr.a6, v6daddr); |
69 | daddr.family = AF_INET6; | 88 | daddr.family = AF_INET6; |
70 | return inet_getpeer(&daddr, create); | 89 | return inet_getpeer(&daddr, create); |
71 | } | 90 | } |
72 | 91 | ||
73 | /* can be called from BH context or outside */ | 92 | /* can be called from BH context or outside */ |
74 | extern void inet_putpeer(struct inet_peer *p); | 93 | extern void inet_putpeer(struct inet_peer *p); |
94 | extern bool inet_peer_xrlim_allow(struct inet_peer *peer, int timeout); | ||
75 | 95 | ||
76 | /* | 96 | /* |
77 | * temporary check to make sure we dont access rid, ip_id_count, tcp_ts, | 97 | * temporary check to make sure we dont access rid, ip_id_count, tcp_ts, |
diff --git a/include/net/ip.h b/include/net/ip.h index 67fac78a186b..a4f631108c54 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -116,8 +116,24 @@ extern int ip_append_data(struct sock *sk, | |||
116 | extern int ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb); | 116 | extern int ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb); |
117 | extern ssize_t ip_append_page(struct sock *sk, struct page *page, | 117 | extern ssize_t ip_append_page(struct sock *sk, struct page *page, |
118 | int offset, size_t size, int flags); | 118 | int offset, size_t size, int flags); |
119 | extern struct sk_buff *__ip_make_skb(struct sock *sk, | ||
120 | struct sk_buff_head *queue, | ||
121 | struct inet_cork *cork); | ||
122 | extern int ip_send_skb(struct sk_buff *skb); | ||
119 | extern int ip_push_pending_frames(struct sock *sk); | 123 | extern int ip_push_pending_frames(struct sock *sk); |
120 | extern void ip_flush_pending_frames(struct sock *sk); | 124 | extern void ip_flush_pending_frames(struct sock *sk); |
125 | extern struct sk_buff *ip_make_skb(struct sock *sk, | ||
126 | int getfrag(void *from, char *to, int offset, int len, | ||
127 | int odd, struct sk_buff *skb), | ||
128 | void *from, int length, int transhdrlen, | ||
129 | struct ipcm_cookie *ipc, | ||
130 | struct rtable **rtp, | ||
131 | unsigned int flags); | ||
132 | |||
133 | static inline struct sk_buff *ip_finish_skb(struct sock *sk) | ||
134 | { | ||
135 | return __ip_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork); | ||
136 | } | ||
121 | 137 | ||
122 | /* datagram.c */ | 138 | /* datagram.c */ |
123 | extern int ip4_datagram_connect(struct sock *sk, | 139 | extern int ip4_datagram_connect(struct sock *sk, |
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 708ff7cb8806..bc3cde0a810c 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
@@ -108,6 +108,7 @@ struct rt6_info { | |||
108 | u32 rt6i_flags; | 108 | u32 rt6i_flags; |
109 | struct rt6key rt6i_src; | 109 | struct rt6key rt6i_src; |
110 | u32 rt6i_metric; | 110 | u32 rt6i_metric; |
111 | u32 rt6i_peer_genid; | ||
111 | 112 | ||
112 | struct inet6_dev *rt6i_idev; | 113 | struct inet6_dev *rt6i_idev; |
113 | struct inet_peer *rt6i_peer; | 114 | struct inet_peer *rt6i_peer; |
@@ -182,7 +183,7 @@ struct fib6_table { | |||
182 | 183 | ||
183 | typedef struct rt6_info *(*pol_lookup_t)(struct net *, | 184 | typedef struct rt6_info *(*pol_lookup_t)(struct net *, |
184 | struct fib6_table *, | 185 | struct fib6_table *, |
185 | struct flowi *, int); | 186 | struct flowi6 *, int); |
186 | 187 | ||
187 | /* | 188 | /* |
188 | * exported functions | 189 | * exported functions |
@@ -191,7 +192,7 @@ typedef struct rt6_info *(*pol_lookup_t)(struct net *, | |||
191 | extern struct fib6_table *fib6_get_table(struct net *net, u32 id); | 192 | extern struct fib6_table *fib6_get_table(struct net *net, u32 id); |
192 | extern struct fib6_table *fib6_new_table(struct net *net, u32 id); | 193 | extern struct fib6_table *fib6_new_table(struct net *net, u32 id); |
193 | extern struct dst_entry *fib6_rule_lookup(struct net *net, | 194 | extern struct dst_entry *fib6_rule_lookup(struct net *net, |
194 | struct flowi *fl, int flags, | 195 | struct flowi6 *fl6, int flags, |
195 | pol_lookup_t lookup); | 196 | pol_lookup_t lookup); |
196 | 197 | ||
197 | extern struct fib6_node *fib6_lookup(struct fib6_node *root, | 198 | extern struct fib6_node *fib6_lookup(struct fib6_node *root, |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 8552f0a2e854..642a80bb42cf 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
@@ -71,7 +71,7 @@ extern void ip6_route_input(struct sk_buff *skb); | |||
71 | 71 | ||
72 | extern struct dst_entry * ip6_route_output(struct net *net, | 72 | extern struct dst_entry * ip6_route_output(struct net *net, |
73 | struct sock *sk, | 73 | struct sock *sk, |
74 | struct flowi *fl); | 74 | struct flowi6 *fl6); |
75 | 75 | ||
76 | extern int ip6_route_init(void); | 76 | extern int ip6_route_init(void); |
77 | extern void ip6_route_cleanup(void); | 77 | extern void ip6_route_cleanup(void); |
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index 07bdb5e9e8ac..a1a858035913 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h | |||
@@ -51,15 +51,17 @@ struct fib_nh { | |||
51 | struct fib_info *nh_parent; | 51 | struct fib_info *nh_parent; |
52 | unsigned nh_flags; | 52 | unsigned nh_flags; |
53 | unsigned char nh_scope; | 53 | unsigned char nh_scope; |
54 | unsigned char nh_cfg_scope; | ||
54 | #ifdef CONFIG_IP_ROUTE_MULTIPATH | 55 | #ifdef CONFIG_IP_ROUTE_MULTIPATH |
55 | int nh_weight; | 56 | int nh_weight; |
56 | int nh_power; | 57 | int nh_power; |
57 | #endif | 58 | #endif |
58 | #ifdef CONFIG_NET_CLS_ROUTE | 59 | #ifdef CONFIG_IP_ROUTE_CLASSID |
59 | __u32 nh_tclassid; | 60 | __u32 nh_tclassid; |
60 | #endif | 61 | #endif |
61 | int nh_oif; | 62 | int nh_oif; |
62 | __be32 nh_gw; | 63 | __be32 nh_gw; |
64 | __be32 nh_saddr; | ||
63 | }; | 65 | }; |
64 | 66 | ||
65 | /* | 67 | /* |
@@ -77,7 +79,7 @@ struct fib_info { | |||
77 | int fib_protocol; | 79 | int fib_protocol; |
78 | __be32 fib_prefsrc; | 80 | __be32 fib_prefsrc; |
79 | u32 fib_priority; | 81 | u32 fib_priority; |
80 | u32 fib_metrics[RTAX_MAX]; | 82 | u32 *fib_metrics; |
81 | #define fib_mtu fib_metrics[RTAX_MTU-1] | 83 | #define fib_mtu fib_metrics[RTAX_MTU-1] |
82 | #define fib_window fib_metrics[RTAX_WINDOW-1] | 84 | #define fib_window fib_metrics[RTAX_WINDOW-1] |
83 | #define fib_rtt fib_metrics[RTAX_RTT-1] | 85 | #define fib_rtt fib_metrics[RTAX_RTT-1] |
@@ -96,12 +98,15 @@ struct fib_info { | |||
96 | struct fib_rule; | 98 | struct fib_rule; |
97 | #endif | 99 | #endif |
98 | 100 | ||
101 | struct fib_table; | ||
99 | struct fib_result { | 102 | struct fib_result { |
100 | unsigned char prefixlen; | 103 | unsigned char prefixlen; |
101 | unsigned char nh_sel; | 104 | unsigned char nh_sel; |
102 | unsigned char type; | 105 | unsigned char type; |
103 | unsigned char scope; | 106 | unsigned char scope; |
104 | struct fib_info *fi; | 107 | struct fib_info *fi; |
108 | struct fib_table *table; | ||
109 | struct list_head *fa_head; | ||
105 | #ifdef CONFIG_IP_MULTIPLE_TABLES | 110 | #ifdef CONFIG_IP_MULTIPLE_TABLES |
106 | struct fib_rule *r; | 111 | struct fib_rule *r; |
107 | #endif | 112 | #endif |
@@ -136,11 +141,13 @@ struct fib_result_nl { | |||
136 | 141 | ||
137 | #endif /* CONFIG_IP_ROUTE_MULTIPATH */ | 142 | #endif /* CONFIG_IP_ROUTE_MULTIPATH */ |
138 | 143 | ||
139 | #define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res)) | 144 | #define FIB_RES_SADDR(res) (FIB_RES_NH(res).nh_saddr) |
140 | #define FIB_RES_GW(res) (FIB_RES_NH(res).nh_gw) | 145 | #define FIB_RES_GW(res) (FIB_RES_NH(res).nh_gw) |
141 | #define FIB_RES_DEV(res) (FIB_RES_NH(res).nh_dev) | 146 | #define FIB_RES_DEV(res) (FIB_RES_NH(res).nh_dev) |
142 | #define FIB_RES_OIF(res) (FIB_RES_NH(res).nh_oif) | 147 | #define FIB_RES_OIF(res) (FIB_RES_NH(res).nh_oif) |
143 | 148 | ||
149 | #define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : FIB_RES_SADDR(res)) | ||
150 | |||
144 | struct fib_table { | 151 | struct fib_table { |
145 | struct hlist_node tb_hlist; | 152 | struct hlist_node tb_hlist; |
146 | u32 tb_id; | 153 | u32 tb_id; |
@@ -148,16 +155,13 @@ struct fib_table { | |||
148 | unsigned char tb_data[0]; | 155 | unsigned char tb_data[0]; |
149 | }; | 156 | }; |
150 | 157 | ||
151 | extern int fib_table_lookup(struct fib_table *tb, const struct flowi *flp, | 158 | extern int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, |
152 | struct fib_result *res, int fib_flags); | 159 | struct fib_result *res, int fib_flags); |
153 | extern int fib_table_insert(struct fib_table *, struct fib_config *); | 160 | extern int fib_table_insert(struct fib_table *, struct fib_config *); |
154 | extern int fib_table_delete(struct fib_table *, struct fib_config *); | 161 | extern int fib_table_delete(struct fib_table *, struct fib_config *); |
155 | extern int fib_table_dump(struct fib_table *table, struct sk_buff *skb, | 162 | extern int fib_table_dump(struct fib_table *table, struct sk_buff *skb, |
156 | struct netlink_callback *cb); | 163 | struct netlink_callback *cb); |
157 | extern int fib_table_flush(struct fib_table *table); | 164 | extern int fib_table_flush(struct fib_table *table); |
158 | extern void fib_table_select_default(struct fib_table *table, | ||
159 | const struct flowi *flp, | ||
160 | struct fib_result *res); | ||
161 | extern void fib_free_table(struct fib_table *tb); | 165 | extern void fib_free_table(struct fib_table *tb); |
162 | 166 | ||
163 | 167 | ||
@@ -182,7 +186,7 @@ static inline struct fib_table *fib_new_table(struct net *net, u32 id) | |||
182 | return fib_get_table(net, id); | 186 | return fib_get_table(net, id); |
183 | } | 187 | } |
184 | 188 | ||
185 | static inline int fib_lookup(struct net *net, const struct flowi *flp, | 189 | static inline int fib_lookup(struct net *net, const struct flowi4 *flp, |
186 | struct fib_result *res) | 190 | struct fib_result *res) |
187 | { | 191 | { |
188 | struct fib_table *table; | 192 | struct fib_table *table; |
@@ -201,11 +205,11 @@ static inline int fib_lookup(struct net *net, const struct flowi *flp, | |||
201 | extern int __net_init fib4_rules_init(struct net *net); | 205 | extern int __net_init fib4_rules_init(struct net *net); |
202 | extern void __net_exit fib4_rules_exit(struct net *net); | 206 | extern void __net_exit fib4_rules_exit(struct net *net); |
203 | 207 | ||
204 | #ifdef CONFIG_NET_CLS_ROUTE | 208 | #ifdef CONFIG_IP_ROUTE_CLASSID |
205 | extern u32 fib_rules_tclass(struct fib_result *res); | 209 | extern u32 fib_rules_tclass(const struct fib_result *res); |
206 | #endif | 210 | #endif |
207 | 211 | ||
208 | extern int fib_lookup(struct net *n, struct flowi *flp, struct fib_result *res); | 212 | extern int fib_lookup(struct net *n, struct flowi4 *flp, struct fib_result *res); |
209 | 213 | ||
210 | extern struct fib_table *fib_new_table(struct net *net, u32 id); | 214 | extern struct fib_table *fib_new_table(struct net *net, u32 id); |
211 | extern struct fib_table *fib_get_table(struct net *net, u32 id); | 215 | extern struct fib_table *fib_get_table(struct net *net, u32 id); |
@@ -218,24 +222,23 @@ extern void ip_fib_init(void); | |||
218 | extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, | 222 | extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, |
219 | struct net_device *dev, __be32 *spec_dst, | 223 | struct net_device *dev, __be32 *spec_dst, |
220 | u32 *itag, u32 mark); | 224 | u32 *itag, u32 mark); |
221 | extern void fib_select_default(struct net *net, const struct flowi *flp, | 225 | extern void fib_select_default(struct fib_result *res); |
222 | struct fib_result *res); | ||
223 | 226 | ||
224 | /* Exported by fib_semantics.c */ | 227 | /* Exported by fib_semantics.c */ |
225 | extern int ip_fib_check_default(__be32 gw, struct net_device *dev); | 228 | extern int ip_fib_check_default(__be32 gw, struct net_device *dev); |
226 | extern int fib_sync_down_dev(struct net_device *dev, int force); | 229 | extern int fib_sync_down_dev(struct net_device *dev, int force); |
227 | extern int fib_sync_down_addr(struct net *net, __be32 local); | 230 | extern int fib_sync_down_addr(struct net *net, __be32 local); |
231 | extern void fib_update_nh_saddrs(struct net_device *dev); | ||
228 | extern int fib_sync_up(struct net_device *dev); | 232 | extern int fib_sync_up(struct net_device *dev); |
229 | extern __be32 __fib_res_prefsrc(struct fib_result *res); | 233 | extern void fib_select_multipath(struct fib_result *res); |
230 | extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res); | ||
231 | 234 | ||
232 | /* Exported by fib_{hash|trie}.c */ | 235 | /* Exported by fib_trie.c */ |
233 | extern void fib_hash_init(void); | 236 | extern void fib_trie_init(void); |
234 | extern struct fib_table *fib_hash_table(u32 id); | 237 | extern struct fib_table *fib_trie_table(u32 id); |
235 | 238 | ||
236 | static inline void fib_combine_itag(u32 *itag, struct fib_result *res) | 239 | static inline void fib_combine_itag(u32 *itag, const struct fib_result *res) |
237 | { | 240 | { |
238 | #ifdef CONFIG_NET_CLS_ROUTE | 241 | #ifdef CONFIG_IP_ROUTE_CLASSID |
239 | #ifdef CONFIG_IP_MULTIPLE_TABLES | 242 | #ifdef CONFIG_IP_MULTIPLE_TABLES |
240 | u32 rtag; | 243 | u32 rtag; |
241 | #endif | 244 | #endif |
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h index b7bbd6c28cfa..30b49ed72f0d 100644 --- a/include/net/ip_vs.h +++ b/include/net/ip_vs.h | |||
@@ -28,6 +28,80 @@ | |||
28 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 28 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
29 | #include <net/netfilter/nf_conntrack.h> | 29 | #include <net/netfilter/nf_conntrack.h> |
30 | #endif | 30 | #endif |
31 | #include <net/net_namespace.h> /* Netw namespace */ | ||
32 | |||
33 | /* | ||
34 | * Generic access of ipvs struct | ||
35 | */ | ||
36 | static inline struct netns_ipvs *net_ipvs(struct net* net) | ||
37 | { | ||
38 | return net->ipvs; | ||
39 | } | ||
40 | /* | ||
41 | * Get net ptr from skb in traffic cases | ||
42 | * use skb_sknet when call is from userland (ioctl or netlink) | ||
43 | */ | ||
44 | static inline struct net *skb_net(const struct sk_buff *skb) | ||
45 | { | ||
46 | #ifdef CONFIG_NET_NS | ||
47 | #ifdef CONFIG_IP_VS_DEBUG | ||
48 | /* | ||
49 | * This is used for debug only. | ||
50 | * Start with the most likely hit | ||
51 | * End with BUG | ||
52 | */ | ||
53 | if (likely(skb->dev && skb->dev->nd_net)) | ||
54 | return dev_net(skb->dev); | ||
55 | if (skb_dst(skb)->dev) | ||
56 | return dev_net(skb_dst(skb)->dev); | ||
57 | WARN(skb->sk, "Maybe skb_sknet should be used in %s() at line:%d\n", | ||
58 | __func__, __LINE__); | ||
59 | if (likely(skb->sk && skb->sk->sk_net)) | ||
60 | return sock_net(skb->sk); | ||
61 | pr_err("There is no net ptr to find in the skb in %s() line:%d\n", | ||
62 | __func__, __LINE__); | ||
63 | BUG(); | ||
64 | #else | ||
65 | return dev_net(skb->dev ? : skb_dst(skb)->dev); | ||
66 | #endif | ||
67 | #else | ||
68 | return &init_net; | ||
69 | #endif | ||
70 | } | ||
71 | |||
72 | static inline struct net *skb_sknet(const struct sk_buff *skb) | ||
73 | { | ||
74 | #ifdef CONFIG_NET_NS | ||
75 | #ifdef CONFIG_IP_VS_DEBUG | ||
76 | /* Start with the most likely hit */ | ||
77 | if (likely(skb->sk && skb->sk->sk_net)) | ||
78 | return sock_net(skb->sk); | ||
79 | WARN(skb->dev, "Maybe skb_net should be used instead in %s() line:%d\n", | ||
80 | __func__, __LINE__); | ||
81 | if (likely(skb->dev && skb->dev->nd_net)) | ||
82 | return dev_net(skb->dev); | ||
83 | pr_err("There is no net ptr to find in the skb in %s() line:%d\n", | ||
84 | __func__, __LINE__); | ||
85 | BUG(); | ||
86 | #else | ||
87 | return sock_net(skb->sk); | ||
88 | #endif | ||
89 | #else | ||
90 | return &init_net; | ||
91 | #endif | ||
92 | } | ||
93 | /* | ||
94 | * This one needed for single_open_net since net is stored directly in | ||
95 | * private not as a struct i.e. seq_file_net cant be used. | ||
96 | */ | ||
97 | static inline struct net *seq_file_single_net(struct seq_file *seq) | ||
98 | { | ||
99 | #ifdef CONFIG_NET_NS | ||
100 | return (struct net *)seq->private; | ||
101 | #else | ||
102 | return &init_net; | ||
103 | #endif | ||
104 | } | ||
31 | 105 | ||
32 | /* Connections' size value needed by ip_vs_ctl.c */ | 106 | /* Connections' size value needed by ip_vs_ctl.c */ |
33 | extern int ip_vs_conn_tab_size; | 107 | extern int ip_vs_conn_tab_size; |
@@ -258,6 +332,23 @@ struct ip_vs_seq { | |||
258 | before last resized pkt */ | 332 | before last resized pkt */ |
259 | }; | 333 | }; |
260 | 334 | ||
335 | /* | ||
336 | * counters per cpu | ||
337 | */ | ||
338 | struct ip_vs_counters { | ||
339 | __u32 conns; /* connections scheduled */ | ||
340 | __u32 inpkts; /* incoming packets */ | ||
341 | __u32 outpkts; /* outgoing packets */ | ||
342 | __u64 inbytes; /* incoming bytes */ | ||
343 | __u64 outbytes; /* outgoing bytes */ | ||
344 | }; | ||
345 | /* | ||
346 | * Stats per cpu | ||
347 | */ | ||
348 | struct ip_vs_cpu_stats { | ||
349 | struct ip_vs_counters ustats; | ||
350 | struct u64_stats_sync syncp; | ||
351 | }; | ||
261 | 352 | ||
262 | /* | 353 | /* |
263 | * IPVS statistics objects | 354 | * IPVS statistics objects |
@@ -279,10 +370,11 @@ struct ip_vs_estimator { | |||
279 | }; | 370 | }; |
280 | 371 | ||
281 | struct ip_vs_stats { | 372 | struct ip_vs_stats { |
282 | struct ip_vs_stats_user ustats; /* statistics */ | 373 | struct ip_vs_stats_user ustats; /* statistics */ |
283 | struct ip_vs_estimator est; /* estimator */ | 374 | struct ip_vs_estimator est; /* estimator */ |
284 | 375 | struct ip_vs_cpu_stats *cpustats; /* per cpu counters */ | |
285 | spinlock_t lock; /* spin lock */ | 376 | spinlock_t lock; /* spin lock */ |
377 | struct ip_vs_stats_user ustats0; /* reset values */ | ||
286 | }; | 378 | }; |
287 | 379 | ||
288 | struct dst_entry; | 380 | struct dst_entry; |
@@ -290,6 +382,7 @@ struct iphdr; | |||
290 | struct ip_vs_conn; | 382 | struct ip_vs_conn; |
291 | struct ip_vs_app; | 383 | struct ip_vs_app; |
292 | struct sk_buff; | 384 | struct sk_buff; |
385 | struct ip_vs_proto_data; | ||
293 | 386 | ||
294 | struct ip_vs_protocol { | 387 | struct ip_vs_protocol { |
295 | struct ip_vs_protocol *next; | 388 | struct ip_vs_protocol *next; |
@@ -297,21 +390,22 @@ struct ip_vs_protocol { | |||
297 | u16 protocol; | 390 | u16 protocol; |
298 | u16 num_states; | 391 | u16 num_states; |
299 | int dont_defrag; | 392 | int dont_defrag; |
300 | atomic_t appcnt; /* counter of proto app incs */ | ||
301 | int *timeout_table; /* protocol timeout table */ | ||
302 | 393 | ||
303 | void (*init)(struct ip_vs_protocol *pp); | 394 | void (*init)(struct ip_vs_protocol *pp); |
304 | 395 | ||
305 | void (*exit)(struct ip_vs_protocol *pp); | 396 | void (*exit)(struct ip_vs_protocol *pp); |
306 | 397 | ||
398 | void (*init_netns)(struct net *net, struct ip_vs_proto_data *pd); | ||
399 | |||
400 | void (*exit_netns)(struct net *net, struct ip_vs_proto_data *pd); | ||
401 | |||
307 | int (*conn_schedule)(int af, struct sk_buff *skb, | 402 | int (*conn_schedule)(int af, struct sk_buff *skb, |
308 | struct ip_vs_protocol *pp, | 403 | struct ip_vs_proto_data *pd, |
309 | int *verdict, struct ip_vs_conn **cpp); | 404 | int *verdict, struct ip_vs_conn **cpp); |
310 | 405 | ||
311 | struct ip_vs_conn * | 406 | struct ip_vs_conn * |
312 | (*conn_in_get)(int af, | 407 | (*conn_in_get)(int af, |
313 | const struct sk_buff *skb, | 408 | const struct sk_buff *skb, |
314 | struct ip_vs_protocol *pp, | ||
315 | const struct ip_vs_iphdr *iph, | 409 | const struct ip_vs_iphdr *iph, |
316 | unsigned int proto_off, | 410 | unsigned int proto_off, |
317 | int inverse); | 411 | int inverse); |
@@ -319,7 +413,6 @@ struct ip_vs_protocol { | |||
319 | struct ip_vs_conn * | 413 | struct ip_vs_conn * |
320 | (*conn_out_get)(int af, | 414 | (*conn_out_get)(int af, |
321 | const struct sk_buff *skb, | 415 | const struct sk_buff *skb, |
322 | struct ip_vs_protocol *pp, | ||
323 | const struct ip_vs_iphdr *iph, | 416 | const struct ip_vs_iphdr *iph, |
324 | unsigned int proto_off, | 417 | unsigned int proto_off, |
325 | int inverse); | 418 | int inverse); |
@@ -337,11 +430,11 @@ struct ip_vs_protocol { | |||
337 | 430 | ||
338 | int (*state_transition)(struct ip_vs_conn *cp, int direction, | 431 | int (*state_transition)(struct ip_vs_conn *cp, int direction, |
339 | const struct sk_buff *skb, | 432 | const struct sk_buff *skb, |
340 | struct ip_vs_protocol *pp); | 433 | struct ip_vs_proto_data *pd); |
341 | 434 | ||
342 | int (*register_app)(struct ip_vs_app *inc); | 435 | int (*register_app)(struct net *net, struct ip_vs_app *inc); |
343 | 436 | ||
344 | void (*unregister_app)(struct ip_vs_app *inc); | 437 | void (*unregister_app)(struct net *net, struct ip_vs_app *inc); |
345 | 438 | ||
346 | int (*app_conn_bind)(struct ip_vs_conn *cp); | 439 | int (*app_conn_bind)(struct ip_vs_conn *cp); |
347 | 440 | ||
@@ -350,14 +443,26 @@ struct ip_vs_protocol { | |||
350 | int offset, | 443 | int offset, |
351 | const char *msg); | 444 | const char *msg); |
352 | 445 | ||
353 | void (*timeout_change)(struct ip_vs_protocol *pp, int flags); | 446 | void (*timeout_change)(struct ip_vs_proto_data *pd, int flags); |
447 | }; | ||
354 | 448 | ||
355 | int (*set_state_timeout)(struct ip_vs_protocol *pp, char *sname, int to); | 449 | /* |
450 | * protocol data per netns | ||
451 | */ | ||
452 | struct ip_vs_proto_data { | ||
453 | struct ip_vs_proto_data *next; | ||
454 | struct ip_vs_protocol *pp; | ||
455 | int *timeout_table; /* protocol timeout table */ | ||
456 | atomic_t appcnt; /* counter of proto app incs. */ | ||
457 | struct tcp_states_t *tcp_state_table; | ||
356 | }; | 458 | }; |
357 | 459 | ||
358 | extern struct ip_vs_protocol * ip_vs_proto_get(unsigned short proto); | 460 | extern struct ip_vs_protocol *ip_vs_proto_get(unsigned short proto); |
461 | extern struct ip_vs_proto_data *ip_vs_proto_data_get(struct net *net, | ||
462 | unsigned short proto); | ||
359 | 463 | ||
360 | struct ip_vs_conn_param { | 464 | struct ip_vs_conn_param { |
465 | struct net *net; | ||
361 | const union nf_inet_addr *caddr; | 466 | const union nf_inet_addr *caddr; |
362 | const union nf_inet_addr *vaddr; | 467 | const union nf_inet_addr *vaddr; |
363 | __be16 cport; | 468 | __be16 cport; |
@@ -374,17 +479,20 @@ struct ip_vs_conn_param { | |||
374 | * IP_VS structure allocated for each dynamically scheduled connection | 479 | * IP_VS structure allocated for each dynamically scheduled connection |
375 | */ | 480 | */ |
376 | struct ip_vs_conn { | 481 | struct ip_vs_conn { |
377 | struct list_head c_list; /* hashed list heads */ | 482 | struct hlist_node c_list; /* hashed list heads */ |
378 | 483 | #ifdef CONFIG_NET_NS | |
484 | struct net *net; /* Name space */ | ||
485 | #endif | ||
379 | /* Protocol, addresses and port numbers */ | 486 | /* Protocol, addresses and port numbers */ |
380 | u16 af; /* address family */ | 487 | u16 af; /* address family */ |
381 | union nf_inet_addr caddr; /* client address */ | 488 | __be16 cport; |
382 | union nf_inet_addr vaddr; /* virtual address */ | 489 | __be16 vport; |
383 | union nf_inet_addr daddr; /* destination address */ | 490 | __be16 dport; |
384 | volatile __u32 flags; /* status flags */ | 491 | __u32 fwmark; /* Fire wall mark from skb */ |
385 | __be16 cport; | 492 | union nf_inet_addr caddr; /* client address */ |
386 | __be16 vport; | 493 | union nf_inet_addr vaddr; /* virtual address */ |
387 | __be16 dport; | 494 | union nf_inet_addr daddr; /* destination address */ |
495 | volatile __u32 flags; /* status flags */ | ||
388 | __u16 protocol; /* Which protocol (TCP/UDP) */ | 496 | __u16 protocol; /* Which protocol (TCP/UDP) */ |
389 | 497 | ||
390 | /* counter and timer */ | 498 | /* counter and timer */ |
@@ -422,10 +530,38 @@ struct ip_vs_conn { | |||
422 | struct ip_vs_seq in_seq; /* incoming seq. struct */ | 530 | struct ip_vs_seq in_seq; /* incoming seq. struct */ |
423 | struct ip_vs_seq out_seq; /* outgoing seq. struct */ | 531 | struct ip_vs_seq out_seq; /* outgoing seq. struct */ |
424 | 532 | ||
533 | const struct ip_vs_pe *pe; | ||
425 | char *pe_data; | 534 | char *pe_data; |
426 | __u8 pe_data_len; | 535 | __u8 pe_data_len; |
427 | }; | 536 | }; |
428 | 537 | ||
538 | /* | ||
539 | * To save some memory in conn table when name space is disabled. | ||
540 | */ | ||
541 | static inline struct net *ip_vs_conn_net(const struct ip_vs_conn *cp) | ||
542 | { | ||
543 | #ifdef CONFIG_NET_NS | ||
544 | return cp->net; | ||
545 | #else | ||
546 | return &init_net; | ||
547 | #endif | ||
548 | } | ||
549 | static inline void ip_vs_conn_net_set(struct ip_vs_conn *cp, struct net *net) | ||
550 | { | ||
551 | #ifdef CONFIG_NET_NS | ||
552 | cp->net = net; | ||
553 | #endif | ||
554 | } | ||
555 | |||
556 | static inline int ip_vs_conn_net_eq(const struct ip_vs_conn *cp, | ||
557 | struct net *net) | ||
558 | { | ||
559 | #ifdef CONFIG_NET_NS | ||
560 | return cp->net == net; | ||
561 | #else | ||
562 | return 1; | ||
563 | #endif | ||
564 | } | ||
429 | 565 | ||
430 | /* | 566 | /* |
431 | * Extended internal versions of struct ip_vs_service_user and | 567 | * Extended internal versions of struct ip_vs_service_user and |
@@ -485,6 +621,7 @@ struct ip_vs_service { | |||
485 | unsigned flags; /* service status flags */ | 621 | unsigned flags; /* service status flags */ |
486 | unsigned timeout; /* persistent timeout in ticks */ | 622 | unsigned timeout; /* persistent timeout in ticks */ |
487 | __be32 netmask; /* grouping granularity */ | 623 | __be32 netmask; /* grouping granularity */ |
624 | struct net *net; | ||
488 | 625 | ||
489 | struct list_head destinations; /* real server d-linked list */ | 626 | struct list_head destinations; /* real server d-linked list */ |
490 | __u32 num_dests; /* number of servers */ | 627 | __u32 num_dests; /* number of servers */ |
@@ -510,8 +647,8 @@ struct ip_vs_dest { | |||
510 | struct list_head d_list; /* for table with all the dests */ | 647 | struct list_head d_list; /* for table with all the dests */ |
511 | 648 | ||
512 | u16 af; /* address family */ | 649 | u16 af; /* address family */ |
513 | union nf_inet_addr addr; /* IP address of the server */ | ||
514 | __be16 port; /* port number of the server */ | 650 | __be16 port; /* port number of the server */ |
651 | union nf_inet_addr addr; /* IP address of the server */ | ||
515 | volatile unsigned flags; /* dest status flags */ | 652 | volatile unsigned flags; /* dest status flags */ |
516 | atomic_t conn_flags; /* flags to copy to conn */ | 653 | atomic_t conn_flags; /* flags to copy to conn */ |
517 | atomic_t weight; /* server weight */ | 654 | atomic_t weight; /* server weight */ |
@@ -538,8 +675,8 @@ struct ip_vs_dest { | |||
538 | /* for virtual service */ | 675 | /* for virtual service */ |
539 | struct ip_vs_service *svc; /* service it belongs to */ | 676 | struct ip_vs_service *svc; /* service it belongs to */ |
540 | __u16 protocol; /* which protocol (TCP/UDP) */ | 677 | __u16 protocol; /* which protocol (TCP/UDP) */ |
541 | union nf_inet_addr vaddr; /* virtual IP address */ | ||
542 | __be16 vport; /* virtual port number */ | 678 | __be16 vport; /* virtual port number */ |
679 | union nf_inet_addr vaddr; /* virtual IP address */ | ||
543 | __u32 vfwmark; /* firewall mark of service */ | 680 | __u32 vfwmark; /* firewall mark of service */ |
544 | }; | 681 | }; |
545 | 682 | ||
@@ -651,6 +788,169 @@ struct ip_vs_app { | |||
651 | void (*timeout_change)(struct ip_vs_app *app, int flags); | 788 | void (*timeout_change)(struct ip_vs_app *app, int flags); |
652 | }; | 789 | }; |
653 | 790 | ||
791 | /* IPVS in network namespace */ | ||
792 | struct netns_ipvs { | ||
793 | int gen; /* Generation */ | ||
794 | /* | ||
795 | * Hash table: for real service lookups | ||
796 | */ | ||
797 | #define IP_VS_RTAB_BITS 4 | ||
798 | #define IP_VS_RTAB_SIZE (1 << IP_VS_RTAB_BITS) | ||
799 | #define IP_VS_RTAB_MASK (IP_VS_RTAB_SIZE - 1) | ||
800 | |||
801 | struct list_head rs_table[IP_VS_RTAB_SIZE]; | ||
802 | /* ip_vs_app */ | ||
803 | struct list_head app_list; | ||
804 | |||
805 | /* ip_vs_proto */ | ||
806 | #define IP_VS_PROTO_TAB_SIZE 32 /* must be power of 2 */ | ||
807 | struct ip_vs_proto_data *proto_data_table[IP_VS_PROTO_TAB_SIZE]; | ||
808 | /* ip_vs_proto_tcp */ | ||
809 | #ifdef CONFIG_IP_VS_PROTO_TCP | ||
810 | #define TCP_APP_TAB_BITS 4 | ||
811 | #define TCP_APP_TAB_SIZE (1 << TCP_APP_TAB_BITS) | ||
812 | #define TCP_APP_TAB_MASK (TCP_APP_TAB_SIZE - 1) | ||
813 | struct list_head tcp_apps[TCP_APP_TAB_SIZE]; | ||
814 | spinlock_t tcp_app_lock; | ||
815 | #endif | ||
816 | /* ip_vs_proto_udp */ | ||
817 | #ifdef CONFIG_IP_VS_PROTO_UDP | ||
818 | #define UDP_APP_TAB_BITS 4 | ||
819 | #define UDP_APP_TAB_SIZE (1 << UDP_APP_TAB_BITS) | ||
820 | #define UDP_APP_TAB_MASK (UDP_APP_TAB_SIZE - 1) | ||
821 | struct list_head udp_apps[UDP_APP_TAB_SIZE]; | ||
822 | spinlock_t udp_app_lock; | ||
823 | #endif | ||
824 | /* ip_vs_proto_sctp */ | ||
825 | #ifdef CONFIG_IP_VS_PROTO_SCTP | ||
826 | #define SCTP_APP_TAB_BITS 4 | ||
827 | #define SCTP_APP_TAB_SIZE (1 << SCTP_APP_TAB_BITS) | ||
828 | #define SCTP_APP_TAB_MASK (SCTP_APP_TAB_SIZE - 1) | ||
829 | /* Hash table for SCTP application incarnations */ | ||
830 | struct list_head sctp_apps[SCTP_APP_TAB_SIZE]; | ||
831 | spinlock_t sctp_app_lock; | ||
832 | #endif | ||
833 | /* ip_vs_conn */ | ||
834 | atomic_t conn_count; /* connection counter */ | ||
835 | |||
836 | /* ip_vs_ctl */ | ||
837 | struct ip_vs_stats tot_stats; /* Statistics & est. */ | ||
838 | |||
839 | int num_services; /* no of virtual services */ | ||
840 | |||
841 | rwlock_t rs_lock; /* real services table */ | ||
842 | /* semaphore for IPVS sockopts. And, [gs]etsockopt may sleep. */ | ||
843 | struct lock_class_key ctl_key; /* ctl_mutex debuging */ | ||
844 | /* Trash for destinations */ | ||
845 | struct list_head dest_trash; | ||
846 | /* Service counters */ | ||
847 | atomic_t ftpsvc_counter; | ||
848 | atomic_t nullsvc_counter; | ||
849 | |||
850 | #ifdef CONFIG_SYSCTL | ||
851 | /* 1/rate drop and drop-entry variables */ | ||
852 | struct delayed_work defense_work; /* Work handler */ | ||
853 | int drop_rate; | ||
854 | int drop_counter; | ||
855 | atomic_t dropentry; | ||
856 | /* locks in ctl.c */ | ||
857 | spinlock_t dropentry_lock; /* drop entry handling */ | ||
858 | spinlock_t droppacket_lock; /* drop packet handling */ | ||
859 | spinlock_t securetcp_lock; /* state and timeout tables */ | ||
860 | |||
861 | /* sys-ctl struct */ | ||
862 | struct ctl_table_header *sysctl_hdr; | ||
863 | struct ctl_table *sysctl_tbl; | ||
864 | #endif | ||
865 | |||
866 | /* sysctl variables */ | ||
867 | int sysctl_amemthresh; | ||
868 | int sysctl_am_droprate; | ||
869 | int sysctl_drop_entry; | ||
870 | int sysctl_drop_packet; | ||
871 | int sysctl_secure_tcp; | ||
872 | #ifdef CONFIG_IP_VS_NFCT | ||
873 | int sysctl_conntrack; | ||
874 | #endif | ||
875 | int sysctl_snat_reroute; | ||
876 | int sysctl_sync_ver; | ||
877 | int sysctl_cache_bypass; | ||
878 | int sysctl_expire_nodest_conn; | ||
879 | int sysctl_expire_quiescent_template; | ||
880 | int sysctl_sync_threshold[2]; | ||
881 | int sysctl_nat_icmp_send; | ||
882 | |||
883 | /* ip_vs_lblc */ | ||
884 | int sysctl_lblc_expiration; | ||
885 | struct ctl_table_header *lblc_ctl_header; | ||
886 | struct ctl_table *lblc_ctl_table; | ||
887 | /* ip_vs_lblcr */ | ||
888 | int sysctl_lblcr_expiration; | ||
889 | struct ctl_table_header *lblcr_ctl_header; | ||
890 | struct ctl_table *lblcr_ctl_table; | ||
891 | /* ip_vs_est */ | ||
892 | struct list_head est_list; /* estimator list */ | ||
893 | spinlock_t est_lock; | ||
894 | struct timer_list est_timer; /* Estimation timer */ | ||
895 | /* ip_vs_sync */ | ||
896 | struct list_head sync_queue; | ||
897 | spinlock_t sync_lock; | ||
898 | struct ip_vs_sync_buff *sync_buff; | ||
899 | spinlock_t sync_buff_lock; | ||
900 | struct sockaddr_in sync_mcast_addr; | ||
901 | struct task_struct *master_thread; | ||
902 | struct task_struct *backup_thread; | ||
903 | int send_mesg_maxlen; | ||
904 | int recv_mesg_maxlen; | ||
905 | volatile int sync_state; | ||
906 | volatile int master_syncid; | ||
907 | volatile int backup_syncid; | ||
908 | /* multicast interface name */ | ||
909 | char master_mcast_ifn[IP_VS_IFNAME_MAXLEN]; | ||
910 | char backup_mcast_ifn[IP_VS_IFNAME_MAXLEN]; | ||
911 | /* net name space ptr */ | ||
912 | struct net *net; /* Needed by timer routines */ | ||
913 | }; | ||
914 | |||
915 | #define DEFAULT_SYNC_THRESHOLD 3 | ||
916 | #define DEFAULT_SYNC_PERIOD 50 | ||
917 | #define DEFAULT_SYNC_VER 1 | ||
918 | |||
919 | #ifdef CONFIG_SYSCTL | ||
920 | |||
921 | static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs) | ||
922 | { | ||
923 | return ipvs->sysctl_sync_threshold[0]; | ||
924 | } | ||
925 | |||
926 | static inline int sysctl_sync_period(struct netns_ipvs *ipvs) | ||
927 | { | ||
928 | return ipvs->sysctl_sync_threshold[1]; | ||
929 | } | ||
930 | |||
931 | static inline int sysctl_sync_ver(struct netns_ipvs *ipvs) | ||
932 | { | ||
933 | return ipvs->sysctl_sync_ver; | ||
934 | } | ||
935 | |||
936 | #else | ||
937 | |||
938 | static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs) | ||
939 | { | ||
940 | return DEFAULT_SYNC_THRESHOLD; | ||
941 | } | ||
942 | |||
943 | static inline int sysctl_sync_period(struct netns_ipvs *ipvs) | ||
944 | { | ||
945 | return DEFAULT_SYNC_PERIOD; | ||
946 | } | ||
947 | |||
948 | static inline int sysctl_sync_ver(struct netns_ipvs *ipvs) | ||
949 | { | ||
950 | return DEFAULT_SYNC_VER; | ||
951 | } | ||
952 | |||
953 | #endif | ||
654 | 954 | ||
655 | /* | 955 | /* |
656 | * IPVS core functions | 956 | * IPVS core functions |
@@ -674,13 +974,14 @@ enum { | |||
674 | IP_VS_DIR_LAST, | 974 | IP_VS_DIR_LAST, |
675 | }; | 975 | }; |
676 | 976 | ||
677 | static inline void ip_vs_conn_fill_param(int af, int protocol, | 977 | static inline void ip_vs_conn_fill_param(struct net *net, int af, int protocol, |
678 | const union nf_inet_addr *caddr, | 978 | const union nf_inet_addr *caddr, |
679 | __be16 cport, | 979 | __be16 cport, |
680 | const union nf_inet_addr *vaddr, | 980 | const union nf_inet_addr *vaddr, |
681 | __be16 vport, | 981 | __be16 vport, |
682 | struct ip_vs_conn_param *p) | 982 | struct ip_vs_conn_param *p) |
683 | { | 983 | { |
984 | p->net = net; | ||
684 | p->af = af; | 985 | p->af = af; |
685 | p->protocol = protocol; | 986 | p->protocol = protocol; |
686 | p->caddr = caddr; | 987 | p->caddr = caddr; |
@@ -695,7 +996,6 @@ struct ip_vs_conn *ip_vs_conn_in_get(const struct ip_vs_conn_param *p); | |||
695 | struct ip_vs_conn *ip_vs_ct_in_get(const struct ip_vs_conn_param *p); | 996 | struct ip_vs_conn *ip_vs_ct_in_get(const struct ip_vs_conn_param *p); |
696 | 997 | ||
697 | struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb, | 998 | struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb, |
698 | struct ip_vs_protocol *pp, | ||
699 | const struct ip_vs_iphdr *iph, | 999 | const struct ip_vs_iphdr *iph, |
700 | unsigned int proto_off, | 1000 | unsigned int proto_off, |
701 | int inverse); | 1001 | int inverse); |
@@ -703,7 +1003,6 @@ struct ip_vs_conn * ip_vs_conn_in_get_proto(int af, const struct sk_buff *skb, | |||
703 | struct ip_vs_conn *ip_vs_conn_out_get(const struct ip_vs_conn_param *p); | 1003 | struct ip_vs_conn *ip_vs_conn_out_get(const struct ip_vs_conn_param *p); |
704 | 1004 | ||
705 | struct ip_vs_conn * ip_vs_conn_out_get_proto(int af, const struct sk_buff *skb, | 1005 | struct ip_vs_conn * ip_vs_conn_out_get_proto(int af, const struct sk_buff *skb, |
706 | struct ip_vs_protocol *pp, | ||
707 | const struct ip_vs_iphdr *iph, | 1006 | const struct ip_vs_iphdr *iph, |
708 | unsigned int proto_off, | 1007 | unsigned int proto_off, |
709 | int inverse); | 1008 | int inverse); |
@@ -719,14 +1018,14 @@ extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport); | |||
719 | struct ip_vs_conn *ip_vs_conn_new(const struct ip_vs_conn_param *p, | 1018 | struct ip_vs_conn *ip_vs_conn_new(const struct ip_vs_conn_param *p, |
720 | const union nf_inet_addr *daddr, | 1019 | const union nf_inet_addr *daddr, |
721 | __be16 dport, unsigned flags, | 1020 | __be16 dport, unsigned flags, |
722 | struct ip_vs_dest *dest); | 1021 | struct ip_vs_dest *dest, __u32 fwmark); |
723 | extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp); | 1022 | extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp); |
724 | 1023 | ||
725 | extern const char * ip_vs_state_name(__u16 proto, int state); | 1024 | extern const char * ip_vs_state_name(__u16 proto, int state); |
726 | 1025 | ||
727 | extern void ip_vs_tcp_conn_listen(struct ip_vs_conn *cp); | 1026 | extern void ip_vs_tcp_conn_listen(struct net *net, struct ip_vs_conn *cp); |
728 | extern int ip_vs_check_template(struct ip_vs_conn *ct); | 1027 | extern int ip_vs_check_template(struct ip_vs_conn *ct); |
729 | extern void ip_vs_random_dropentry(void); | 1028 | extern void ip_vs_random_dropentry(struct net *net); |
730 | extern int ip_vs_conn_init(void); | 1029 | extern int ip_vs_conn_init(void); |
731 | extern void ip_vs_conn_cleanup(void); | 1030 | extern void ip_vs_conn_cleanup(void); |
732 | 1031 | ||
@@ -796,12 +1095,12 @@ ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp) | |||
796 | * (from ip_vs_app.c) | 1095 | * (from ip_vs_app.c) |
797 | */ | 1096 | */ |
798 | #define IP_VS_APP_MAX_PORTS 8 | 1097 | #define IP_VS_APP_MAX_PORTS 8 |
799 | extern int register_ip_vs_app(struct ip_vs_app *app); | 1098 | extern int register_ip_vs_app(struct net *net, struct ip_vs_app *app); |
800 | extern void unregister_ip_vs_app(struct ip_vs_app *app); | 1099 | extern void unregister_ip_vs_app(struct net *net, struct ip_vs_app *app); |
801 | extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp); | 1100 | extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp); |
802 | extern void ip_vs_unbind_app(struct ip_vs_conn *cp); | 1101 | extern void ip_vs_unbind_app(struct ip_vs_conn *cp); |
803 | extern int | 1102 | extern int register_ip_vs_app_inc(struct net *net, struct ip_vs_app *app, |
804 | register_ip_vs_app_inc(struct ip_vs_app *app, __u16 proto, __u16 port); | 1103 | __u16 proto, __u16 port); |
805 | extern int ip_vs_app_inc_get(struct ip_vs_app *inc); | 1104 | extern int ip_vs_app_inc_get(struct ip_vs_app *inc); |
806 | extern void ip_vs_app_inc_put(struct ip_vs_app *inc); | 1105 | extern void ip_vs_app_inc_put(struct ip_vs_app *inc); |
807 | 1106 | ||
@@ -814,15 +1113,27 @@ void ip_vs_bind_pe(struct ip_vs_service *svc, struct ip_vs_pe *pe); | |||
814 | void ip_vs_unbind_pe(struct ip_vs_service *svc); | 1113 | void ip_vs_unbind_pe(struct ip_vs_service *svc); |
815 | int register_ip_vs_pe(struct ip_vs_pe *pe); | 1114 | int register_ip_vs_pe(struct ip_vs_pe *pe); |
816 | int unregister_ip_vs_pe(struct ip_vs_pe *pe); | 1115 | int unregister_ip_vs_pe(struct ip_vs_pe *pe); |
817 | extern struct ip_vs_pe *ip_vs_pe_get(const char *name); | 1116 | struct ip_vs_pe *ip_vs_pe_getbyname(const char *name); |
818 | extern void ip_vs_pe_put(struct ip_vs_pe *pe); | 1117 | struct ip_vs_pe *__ip_vs_pe_getbyname(const char *pe_name); |
1118 | |||
1119 | static inline void ip_vs_pe_get(const struct ip_vs_pe *pe) | ||
1120 | { | ||
1121 | if (pe && pe->module) | ||
1122 | __module_get(pe->module); | ||
1123 | } | ||
1124 | |||
1125 | static inline void ip_vs_pe_put(const struct ip_vs_pe *pe) | ||
1126 | { | ||
1127 | if (pe && pe->module) | ||
1128 | module_put(pe->module); | ||
1129 | } | ||
819 | 1130 | ||
820 | /* | 1131 | /* |
821 | * IPVS protocol functions (from ip_vs_proto.c) | 1132 | * IPVS protocol functions (from ip_vs_proto.c) |
822 | */ | 1133 | */ |
823 | extern int ip_vs_protocol_init(void); | 1134 | extern int ip_vs_protocol_init(void); |
824 | extern void ip_vs_protocol_cleanup(void); | 1135 | extern void ip_vs_protocol_cleanup(void); |
825 | extern void ip_vs_protocol_timeout_change(int flags); | 1136 | extern void ip_vs_protocol_timeout_change(struct netns_ipvs *ipvs, int flags); |
826 | extern int *ip_vs_create_timeout_table(int *table, int size); | 1137 | extern int *ip_vs_create_timeout_table(int *table, int size); |
827 | extern int | 1138 | extern int |
828 | ip_vs_set_state_timeout(int *table, int num, const char *const *names, | 1139 | ip_vs_set_state_timeout(int *table, int num, const char *const *names, |
@@ -852,26 +1163,23 @@ extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name); | |||
852 | extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler); | 1163 | extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler); |
853 | extern struct ip_vs_conn * | 1164 | extern struct ip_vs_conn * |
854 | ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb, | 1165 | ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb, |
855 | struct ip_vs_protocol *pp, int *ignored); | 1166 | struct ip_vs_proto_data *pd, int *ignored); |
856 | extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, | 1167 | extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, |
857 | struct ip_vs_protocol *pp); | 1168 | struct ip_vs_proto_data *pd); |
1169 | |||
1170 | extern void ip_vs_scheduler_err(struct ip_vs_service *svc, const char *msg); | ||
858 | 1171 | ||
859 | 1172 | ||
860 | /* | 1173 | /* |
861 | * IPVS control data and functions (from ip_vs_ctl.c) | 1174 | * IPVS control data and functions (from ip_vs_ctl.c) |
862 | */ | 1175 | */ |
863 | extern int sysctl_ip_vs_cache_bypass; | ||
864 | extern int sysctl_ip_vs_expire_nodest_conn; | ||
865 | extern int sysctl_ip_vs_expire_quiescent_template; | ||
866 | extern int sysctl_ip_vs_sync_threshold[2]; | ||
867 | extern int sysctl_ip_vs_nat_icmp_send; | ||
868 | extern int sysctl_ip_vs_conntrack; | ||
869 | extern int sysctl_ip_vs_snat_reroute; | ||
870 | extern struct ip_vs_stats ip_vs_stats; | 1176 | extern struct ip_vs_stats ip_vs_stats; |
871 | extern const struct ctl_path net_vs_ctl_path[]; | 1177 | extern const struct ctl_path net_vs_ctl_path[]; |
1178 | extern int sysctl_ip_vs_sync_ver; | ||
872 | 1179 | ||
1180 | extern void ip_vs_sync_switch_mode(struct net *net, int mode); | ||
873 | extern struct ip_vs_service * | 1181 | extern struct ip_vs_service * |
874 | ip_vs_service_get(int af, __u32 fwmark, __u16 protocol, | 1182 | ip_vs_service_get(struct net *net, int af, __u32 fwmark, __u16 protocol, |
875 | const union nf_inet_addr *vaddr, __be16 vport); | 1183 | const union nf_inet_addr *vaddr, __be16 vport); |
876 | 1184 | ||
877 | static inline void ip_vs_service_put(struct ip_vs_service *svc) | 1185 | static inline void ip_vs_service_put(struct ip_vs_service *svc) |
@@ -880,7 +1188,7 @@ static inline void ip_vs_service_put(struct ip_vs_service *svc) | |||
880 | } | 1188 | } |
881 | 1189 | ||
882 | extern struct ip_vs_dest * | 1190 | extern struct ip_vs_dest * |
883 | ip_vs_lookup_real_service(int af, __u16 protocol, | 1191 | ip_vs_lookup_real_service(struct net *net, int af, __u16 protocol, |
884 | const union nf_inet_addr *daddr, __be16 dport); | 1192 | const union nf_inet_addr *daddr, __be16 dport); |
885 | 1193 | ||
886 | extern int ip_vs_use_count_inc(void); | 1194 | extern int ip_vs_use_count_inc(void); |
@@ -888,8 +1196,9 @@ extern void ip_vs_use_count_dec(void); | |||
888 | extern int ip_vs_control_init(void); | 1196 | extern int ip_vs_control_init(void); |
889 | extern void ip_vs_control_cleanup(void); | 1197 | extern void ip_vs_control_cleanup(void); |
890 | extern struct ip_vs_dest * | 1198 | extern struct ip_vs_dest * |
891 | ip_vs_find_dest(int af, const union nf_inet_addr *daddr, __be16 dport, | 1199 | ip_vs_find_dest(struct net *net, int af, const union nf_inet_addr *daddr, |
892 | const union nf_inet_addr *vaddr, __be16 vport, __u16 protocol); | 1200 | __be16 dport, const union nf_inet_addr *vaddr, __be16 vport, |
1201 | __u16 protocol, __u32 fwmark); | ||
893 | extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp); | 1202 | extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp); |
894 | 1203 | ||
895 | 1204 | ||
@@ -897,14 +1206,12 @@ extern struct ip_vs_dest *ip_vs_try_bind_dest(struct ip_vs_conn *cp); | |||
897 | * IPVS sync daemon data and function prototypes | 1206 | * IPVS sync daemon data and function prototypes |
898 | * (from ip_vs_sync.c) | 1207 | * (from ip_vs_sync.c) |
899 | */ | 1208 | */ |
900 | extern volatile int ip_vs_sync_state; | 1209 | extern int start_sync_thread(struct net *net, int state, char *mcast_ifn, |
901 | extern volatile int ip_vs_master_syncid; | 1210 | __u8 syncid); |
902 | extern volatile int ip_vs_backup_syncid; | 1211 | extern int stop_sync_thread(struct net *net, int state); |
903 | extern char ip_vs_master_mcast_ifn[IP_VS_IFNAME_MAXLEN]; | 1212 | extern void ip_vs_sync_conn(struct net *net, struct ip_vs_conn *cp); |
904 | extern char ip_vs_backup_mcast_ifn[IP_VS_IFNAME_MAXLEN]; | 1213 | extern int ip_vs_sync_init(void); |
905 | extern int start_sync_thread(int state, char *mcast_ifn, __u8 syncid); | 1214 | extern void ip_vs_sync_cleanup(void); |
906 | extern int stop_sync_thread(int state); | ||
907 | extern void ip_vs_sync_conn(struct ip_vs_conn *cp); | ||
908 | 1215 | ||
909 | 1216 | ||
910 | /* | 1217 | /* |
@@ -912,9 +1219,11 @@ extern void ip_vs_sync_conn(struct ip_vs_conn *cp); | |||
912 | */ | 1219 | */ |
913 | extern int ip_vs_estimator_init(void); | 1220 | extern int ip_vs_estimator_init(void); |
914 | extern void ip_vs_estimator_cleanup(void); | 1221 | extern void ip_vs_estimator_cleanup(void); |
915 | extern void ip_vs_new_estimator(struct ip_vs_stats *stats); | 1222 | extern void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats); |
916 | extern void ip_vs_kill_estimator(struct ip_vs_stats *stats); | 1223 | extern void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats); |
917 | extern void ip_vs_zero_estimator(struct ip_vs_stats *stats); | 1224 | extern void ip_vs_zero_estimator(struct ip_vs_stats *stats); |
1225 | extern void ip_vs_read_estimator(struct ip_vs_stats_user *dst, | ||
1226 | struct ip_vs_stats *stats); | ||
918 | 1227 | ||
919 | /* | 1228 | /* |
920 | * Various IPVS packet transmitters (from ip_vs_xmit.c) | 1229 | * Various IPVS packet transmitters (from ip_vs_xmit.c) |
@@ -947,21 +1256,25 @@ extern int ip_vs_icmp_xmit_v6 | |||
947 | int offset); | 1256 | int offset); |
948 | #endif | 1257 | #endif |
949 | 1258 | ||
1259 | #ifdef CONFIG_SYSCTL | ||
950 | /* | 1260 | /* |
951 | * This is a simple mechanism to ignore packets when | 1261 | * This is a simple mechanism to ignore packets when |
952 | * we are loaded. Just set ip_vs_drop_rate to 'n' and | 1262 | * we are loaded. Just set ip_vs_drop_rate to 'n' and |
953 | * we start to drop 1/rate of the packets | 1263 | * we start to drop 1/rate of the packets |
954 | */ | 1264 | */ |
955 | extern int ip_vs_drop_rate; | ||
956 | extern int ip_vs_drop_counter; | ||
957 | 1265 | ||
958 | static __inline__ int ip_vs_todrop(void) | 1266 | static inline int ip_vs_todrop(struct netns_ipvs *ipvs) |
959 | { | 1267 | { |
960 | if (!ip_vs_drop_rate) return 0; | 1268 | if (!ipvs->drop_rate) |
961 | if (--ip_vs_drop_counter > 0) return 0; | 1269 | return 0; |
962 | ip_vs_drop_counter = ip_vs_drop_rate; | 1270 | if (--ipvs->drop_counter > 0) |
1271 | return 0; | ||
1272 | ipvs->drop_counter = ipvs->drop_rate; | ||
963 | return 1; | 1273 | return 1; |
964 | } | 1274 | } |
1275 | #else | ||
1276 | static inline int ip_vs_todrop(struct netns_ipvs *ipvs) { return 0; } | ||
1277 | #endif | ||
965 | 1278 | ||
966 | /* | 1279 | /* |
967 | * ip_vs_fwd_tag returns the forwarding tag of the connection | 1280 | * ip_vs_fwd_tag returns the forwarding tag of the connection |
@@ -1031,7 +1344,7 @@ static inline void ip_vs_notrack(struct sk_buff *skb) | |||
1031 | { | 1344 | { |
1032 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 1345 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
1033 | enum ip_conntrack_info ctinfo; | 1346 | enum ip_conntrack_info ctinfo; |
1034 | struct nf_conn *ct = ct = nf_ct_get(skb, &ctinfo); | 1347 | struct nf_conn *ct = nf_ct_get(skb, &ctinfo); |
1035 | 1348 | ||
1036 | if (!ct || !nf_ct_is_untracked(ct)) { | 1349 | if (!ct || !nf_ct_is_untracked(ct)) { |
1037 | nf_reset(skb); | 1350 | nf_reset(skb); |
@@ -1047,9 +1360,13 @@ static inline void ip_vs_notrack(struct sk_buff *skb) | |||
1047 | * Netfilter connection tracking | 1360 | * Netfilter connection tracking |
1048 | * (from ip_vs_nfct.c) | 1361 | * (from ip_vs_nfct.c) |
1049 | */ | 1362 | */ |
1050 | static inline int ip_vs_conntrack_enabled(void) | 1363 | static inline int ip_vs_conntrack_enabled(struct netns_ipvs *ipvs) |
1051 | { | 1364 | { |
1052 | return sysctl_ip_vs_conntrack; | 1365 | #ifdef CONFIG_SYSCTL |
1366 | return ipvs->sysctl_conntrack; | ||
1367 | #else | ||
1368 | return 0; | ||
1369 | #endif | ||
1053 | } | 1370 | } |
1054 | 1371 | ||
1055 | extern void ip_vs_update_conntrack(struct sk_buff *skb, struct ip_vs_conn *cp, | 1372 | extern void ip_vs_update_conntrack(struct sk_buff *skb, struct ip_vs_conn *cp, |
@@ -1062,7 +1379,7 @@ extern void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp); | |||
1062 | 1379 | ||
1063 | #else | 1380 | #else |
1064 | 1381 | ||
1065 | static inline int ip_vs_conntrack_enabled(void) | 1382 | static inline int ip_vs_conntrack_enabled(struct netns_ipvs *ipvs) |
1066 | { | 1383 | { |
1067 | return 0; | 1384 | return 0; |
1068 | } | 1385 | } |
@@ -1084,6 +1401,20 @@ static inline void ip_vs_conn_drop_conntrack(struct ip_vs_conn *cp) | |||
1084 | /* CONFIG_IP_VS_NFCT */ | 1401 | /* CONFIG_IP_VS_NFCT */ |
1085 | #endif | 1402 | #endif |
1086 | 1403 | ||
1404 | static inline unsigned int | ||
1405 | ip_vs_dest_conn_overhead(struct ip_vs_dest *dest) | ||
1406 | { | ||
1407 | /* | ||
1408 | * We think the overhead of processing active connections is 256 | ||
1409 | * times higher than that of inactive connections in average. (This | ||
1410 | * 256 times might not be accurate, we will change it later) We | ||
1411 | * use the following formula to estimate the overhead now: | ||
1412 | * dest->activeconns*256 + dest->inactconns | ||
1413 | */ | ||
1414 | return (atomic_read(&dest->activeconns) << 8) + | ||
1415 | atomic_read(&dest->inactconns); | ||
1416 | } | ||
1417 | |||
1087 | #endif /* __KERNEL__ */ | 1418 | #endif /* __KERNEL__ */ |
1088 | 1419 | ||
1089 | #endif /* _NET_IP_VS_H */ | 1420 | #endif /* _NET_IP_VS_H */ |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 96e50e0ce3ca..34200f9e6805 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -492,7 +492,7 @@ extern int ip6_rcv_finish(struct sk_buff *skb); | |||
492 | */ | 492 | */ |
493 | extern int ip6_xmit(struct sock *sk, | 493 | extern int ip6_xmit(struct sock *sk, |
494 | struct sk_buff *skb, | 494 | struct sk_buff *skb, |
495 | struct flowi *fl, | 495 | struct flowi6 *fl6, |
496 | struct ipv6_txoptions *opt); | 496 | struct ipv6_txoptions *opt); |
497 | 497 | ||
498 | extern int ip6_nd_hdr(struct sock *sk, | 498 | extern int ip6_nd_hdr(struct sock *sk, |
@@ -512,7 +512,7 @@ extern int ip6_append_data(struct sock *sk, | |||
512 | int hlimit, | 512 | int hlimit, |
513 | int tclass, | 513 | int tclass, |
514 | struct ipv6_txoptions *opt, | 514 | struct ipv6_txoptions *opt, |
515 | struct flowi *fl, | 515 | struct flowi6 *fl6, |
516 | struct rt6_info *rt, | 516 | struct rt6_info *rt, |
517 | unsigned int flags, | 517 | unsigned int flags, |
518 | int dontfrag); | 518 | int dontfrag); |
@@ -523,13 +523,17 @@ extern void ip6_flush_pending_frames(struct sock *sk); | |||
523 | 523 | ||
524 | extern int ip6_dst_lookup(struct sock *sk, | 524 | extern int ip6_dst_lookup(struct sock *sk, |
525 | struct dst_entry **dst, | 525 | struct dst_entry **dst, |
526 | struct flowi *fl); | 526 | struct flowi6 *fl6); |
527 | extern int ip6_dst_blackhole(struct sock *sk, | 527 | extern struct dst_entry * ip6_dst_lookup_flow(struct sock *sk, |
528 | struct dst_entry **dst, | 528 | struct flowi6 *fl6, |
529 | struct flowi *fl); | 529 | const struct in6_addr *final_dst, |
530 | extern int ip6_sk_dst_lookup(struct sock *sk, | 530 | bool can_sleep); |
531 | struct dst_entry **dst, | 531 | extern struct dst_entry * ip6_sk_dst_lookup_flow(struct sock *sk, |
532 | struct flowi *fl); | 532 | struct flowi6 *fl6, |
533 | const struct in6_addr *final_dst, | ||
534 | bool can_sleep); | ||
535 | extern struct dst_entry * ip6_blackhole_route(struct net *net, | ||
536 | struct dst_entry *orig_dst); | ||
533 | 537 | ||
534 | /* | 538 | /* |
535 | * skb processing functions | 539 | * skb processing functions |
@@ -562,7 +566,7 @@ extern int ipv6_ext_hdr(u8 nexthdr); | |||
562 | 566 | ||
563 | extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type); | 567 | extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type); |
564 | 568 | ||
565 | extern struct in6_addr *fl6_update_dst(struct flowi *fl, | 569 | extern struct in6_addr *fl6_update_dst(struct flowi6 *fl6, |
566 | const struct ipv6_txoptions *opt, | 570 | const struct ipv6_txoptions *opt, |
567 | struct in6_addr *orig); | 571 | struct in6_addr *orig); |
568 | 572 | ||
@@ -596,8 +600,8 @@ extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len); | |||
596 | extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len); | 600 | extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len); |
597 | extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, | 601 | extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port, |
598 | u32 info, u8 *payload); | 602 | u32 info, u8 *payload); |
599 | extern void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info); | 603 | extern void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info); |
600 | extern void ipv6_local_rxpmtu(struct sock *sk, struct flowi *fl, u32 mtu); | 604 | extern void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu); |
601 | 605 | ||
602 | extern int inet6_release(struct socket *sock); | 606 | extern int inet6_release(struct socket *sock); |
603 | extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, | 607 | extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, |
diff --git a/include/net/irda/ircomm_tty.h b/include/net/irda/ircomm_tty.h index eea2e6152389..59ba38bc400f 100644 --- a/include/net/irda/ircomm_tty.h +++ b/include/net/irda/ircomm_tty.h | |||
@@ -120,10 +120,10 @@ struct ircomm_tty_cb { | |||
120 | void ircomm_tty_start(struct tty_struct *tty); | 120 | void ircomm_tty_start(struct tty_struct *tty); |
121 | void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self); | 121 | void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self); |
122 | 122 | ||
123 | extern int ircomm_tty_tiocmget(struct tty_struct *tty, struct file *file); | 123 | extern int ircomm_tty_tiocmget(struct tty_struct *tty); |
124 | extern int ircomm_tty_tiocmset(struct tty_struct *tty, struct file *file, | 124 | extern int ircomm_tty_tiocmset(struct tty_struct *tty, |
125 | unsigned int set, unsigned int clear); | 125 | unsigned int set, unsigned int clear); |
126 | extern int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file, | 126 | extern int ircomm_tty_ioctl(struct tty_struct *tty, |
127 | unsigned int cmd, unsigned long arg); | 127 | unsigned int cmd, unsigned long arg); |
128 | extern void ircomm_tty_set_termios(struct tty_struct *tty, | 128 | extern void ircomm_tty_set_termios(struct tty_struct *tty, |
129 | struct ktermios *old_termios); | 129 | struct ktermios *old_termios); |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 62c0ce2d1dc8..8650e7bf2ed0 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -341,6 +341,9 @@ struct ieee80211_bss_conf { | |||
341 | * the off-channel channel when a remain-on-channel offload is done | 341 | * the off-channel channel when a remain-on-channel offload is done |
342 | * in hardware -- normal packets still flow and are expected to be | 342 | * in hardware -- normal packets still flow and are expected to be |
343 | * handled properly by the device. | 343 | * handled properly by the device. |
344 | * @IEEE80211_TX_INTFL_TKIP_MIC_FAILURE: Marks this packet to be used for TKIP | ||
345 | * testing. It will be sent out with incorrect Michael MIC key to allow | ||
346 | * TKIP countermeasures to be tested. | ||
344 | * | 347 | * |
345 | * Note: If you have to add new flags to the enumeration, then don't | 348 | * Note: If you have to add new flags to the enumeration, then don't |
346 | * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. | 349 | * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. |
@@ -370,6 +373,7 @@ enum mac80211_tx_control_flags { | |||
370 | IEEE80211_TX_CTL_LDPC = BIT(22), | 373 | IEEE80211_TX_CTL_LDPC = BIT(22), |
371 | IEEE80211_TX_CTL_STBC = BIT(23) | BIT(24), | 374 | IEEE80211_TX_CTL_STBC = BIT(23) | BIT(24), |
372 | IEEE80211_TX_CTL_TX_OFFCHAN = BIT(25), | 375 | IEEE80211_TX_CTL_TX_OFFCHAN = BIT(25), |
376 | IEEE80211_TX_INTFL_TKIP_MIC_FAILURE = BIT(26), | ||
373 | }; | 377 | }; |
374 | 378 | ||
375 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 | 379 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 |
@@ -595,9 +599,10 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) | |||
595 | * the frame. | 599 | * the frame. |
596 | * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on | 600 | * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on |
597 | * the frame. | 601 | * the frame. |
598 | * @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field) | 602 | * @RX_FLAG_MACTIME_MPDU: The timestamp passed in the RX status (@mactime |
599 | * is valid. This is useful in monitor mode and necessary for beacon frames | 603 | * field) is valid and contains the time the first symbol of the MPDU |
600 | * to enable IBSS merging. | 604 | * was received. This is useful in monitor mode and for proper IBSS |
605 | * merging. | ||
601 | * @RX_FLAG_SHORTPRE: Short preamble was used for this frame | 606 | * @RX_FLAG_SHORTPRE: Short preamble was used for this frame |
602 | * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index | 607 | * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index |
603 | * @RX_FLAG_40MHZ: HT40 (40 MHz) was used | 608 | * @RX_FLAG_40MHZ: HT40 (40 MHz) was used |
@@ -610,7 +615,7 @@ enum mac80211_rx_flags { | |||
610 | RX_FLAG_IV_STRIPPED = 1<<4, | 615 | RX_FLAG_IV_STRIPPED = 1<<4, |
611 | RX_FLAG_FAILED_FCS_CRC = 1<<5, | 616 | RX_FLAG_FAILED_FCS_CRC = 1<<5, |
612 | RX_FLAG_FAILED_PLCP_CRC = 1<<6, | 617 | RX_FLAG_FAILED_PLCP_CRC = 1<<6, |
613 | RX_FLAG_TSFT = 1<<7, | 618 | RX_FLAG_MACTIME_MPDU = 1<<7, |
614 | RX_FLAG_SHORTPRE = 1<<8, | 619 | RX_FLAG_SHORTPRE = 1<<8, |
615 | RX_FLAG_HT = 1<<9, | 620 | RX_FLAG_HT = 1<<9, |
616 | RX_FLAG_40MHZ = 1<<10, | 621 | RX_FLAG_40MHZ = 1<<10, |
@@ -1069,6 +1074,13 @@ enum ieee80211_tkip_key_type { | |||
1069 | * to decrypt group addressed frames, then IBSS RSN support is still | 1074 | * to decrypt group addressed frames, then IBSS RSN support is still |
1070 | * possible but software crypto will be used. Advertise the wiphy flag | 1075 | * possible but software crypto will be used. Advertise the wiphy flag |
1071 | * only in that case. | 1076 | * only in that case. |
1077 | * | ||
1078 | * @IEEE80211_HW_AP_LINK_PS: When operating in AP mode the device | ||
1079 | * autonomously manages the PS status of connected stations. When | ||
1080 | * this flag is set mac80211 will not trigger PS mode for connected | ||
1081 | * stations based on the PM bit of incoming frames. | ||
1082 | * Use ieee80211_start_ps()/ieee8021_end_ps() to manually configure | ||
1083 | * the PS mode of connected stations. | ||
1072 | */ | 1084 | */ |
1073 | enum ieee80211_hw_flags { | 1085 | enum ieee80211_hw_flags { |
1074 | IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, | 1086 | IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, |
@@ -1093,6 +1105,7 @@ enum ieee80211_hw_flags { | |||
1093 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, | 1105 | IEEE80211_HW_CONNECTION_MONITOR = 1<<19, |
1094 | IEEE80211_HW_SUPPORTS_CQM_RSSI = 1<<20, | 1106 | IEEE80211_HW_SUPPORTS_CQM_RSSI = 1<<20, |
1095 | IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21, | 1107 | IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21, |
1108 | IEEE80211_HW_AP_LINK_PS = 1<<22, | ||
1096 | }; | 1109 | }; |
1097 | 1110 | ||
1098 | /** | 1111 | /** |
@@ -1147,6 +1160,17 @@ enum ieee80211_hw_flags { | |||
1147 | * @napi_weight: weight used for NAPI polling. You must specify an | 1160 | * @napi_weight: weight used for NAPI polling. You must specify an |
1148 | * appropriate value here if a napi_poll operation is provided | 1161 | * appropriate value here if a napi_poll operation is provided |
1149 | * by your driver. | 1162 | * by your driver. |
1163 | |||
1164 | * @max_rx_aggregation_subframes: maximum buffer size (number of | ||
1165 | * sub-frames) to be used for A-MPDU block ack receiver | ||
1166 | * aggregation. | ||
1167 | * This is only relevant if the device has restrictions on the | ||
1168 | * number of subframes, if it relies on mac80211 to do reordering | ||
1169 | * it shouldn't be set. | ||
1170 | * | ||
1171 | * @max_tx_aggregation_subframes: maximum number of subframes in an | ||
1172 | * aggregate an HT driver will transmit, used by the peer as a | ||
1173 | * hint to size its reorder buffer. | ||
1150 | */ | 1174 | */ |
1151 | struct ieee80211_hw { | 1175 | struct ieee80211_hw { |
1152 | struct ieee80211_conf conf; | 1176 | struct ieee80211_conf conf; |
@@ -1165,6 +1189,8 @@ struct ieee80211_hw { | |||
1165 | u8 max_rates; | 1189 | u8 max_rates; |
1166 | u8 max_report_rates; | 1190 | u8 max_report_rates; |
1167 | u8 max_rate_tries; | 1191 | u8 max_rate_tries; |
1192 | u8 max_rx_aggregation_subframes; | ||
1193 | u8 max_tx_aggregation_subframes; | ||
1168 | }; | 1194 | }; |
1169 | 1195 | ||
1170 | /** | 1196 | /** |
@@ -1688,7 +1714,9 @@ enum ieee80211_ampdu_mlme_action { | |||
1688 | * station, AP, IBSS/WDS/mesh peer etc. This callback can sleep. | 1714 | * station, AP, IBSS/WDS/mesh peer etc. This callback can sleep. |
1689 | * | 1715 | * |
1690 | * @sta_notify: Notifies low level driver about power state transition of an | 1716 | * @sta_notify: Notifies low level driver about power state transition of an |
1691 | * associated station, AP, IBSS/WDS/mesh peer etc. Must be atomic. | 1717 | * associated station, AP, IBSS/WDS/mesh peer etc. For a VIF operating |
1718 | * in AP mode, this callback will not be called when the flag | ||
1719 | * %IEEE80211_HW_AP_LINK_PS is set. Must be atomic. | ||
1692 | * | 1720 | * |
1693 | * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), | 1721 | * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), |
1694 | * bursting) for a hardware TX queue. | 1722 | * bursting) for a hardware TX queue. |
@@ -1723,6 +1751,10 @@ enum ieee80211_ampdu_mlme_action { | |||
1723 | * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) | 1751 | * ieee80211_ampdu_mlme_action. Starting sequence number (@ssn) |
1724 | * is the first frame we expect to perform the action on. Notice | 1752 | * is the first frame we expect to perform the action on. Notice |
1725 | * that TX/RX_STOP can pass NULL for this parameter. | 1753 | * that TX/RX_STOP can pass NULL for this parameter. |
1754 | * The @buf_size parameter is only valid when the action is set to | ||
1755 | * %IEEE80211_AMPDU_TX_OPERATIONAL and indicates the peer's reorder | ||
1756 | * buffer size (number of subframes) for this session -- aggregates | ||
1757 | * containing more subframes than this may not be transmitted to the peer. | ||
1726 | * Returns a negative error code on failure. | 1758 | * Returns a negative error code on failure. |
1727 | * The callback can sleep. | 1759 | * The callback can sleep. |
1728 | * | 1760 | * |
@@ -1767,9 +1799,18 @@ enum ieee80211_ampdu_mlme_action { | |||
1767 | * ieee80211_remain_on_channel_expired(). This callback may sleep. | 1799 | * ieee80211_remain_on_channel_expired(). This callback may sleep. |
1768 | * @cancel_remain_on_channel: Requests that an ongoing off-channel period is | 1800 | * @cancel_remain_on_channel: Requests that an ongoing off-channel period is |
1769 | * aborted before it expires. This callback may sleep. | 1801 | * aborted before it expires. This callback may sleep. |
1802 | * @offchannel_tx: Transmit frame on another channel, wait for a response | ||
1803 | * and return. Reliable TX status must be reported for the frame. If the | ||
1804 | * return value is 1, then the @remain_on_channel will be used with a | ||
1805 | * regular transmission (if supported.) | ||
1806 | * @offchannel_tx_cancel_wait: cancel wait associated with offchannel TX | ||
1807 | * | ||
1808 | * @set_ringparam: Set tx and rx ring sizes. | ||
1809 | * | ||
1810 | * @get_ringparam: Get tx and rx ring current and maximum sizes. | ||
1770 | */ | 1811 | */ |
1771 | struct ieee80211_ops { | 1812 | struct ieee80211_ops { |
1772 | int (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); | 1813 | void (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); |
1773 | int (*start)(struct ieee80211_hw *hw); | 1814 | int (*start)(struct ieee80211_hw *hw); |
1774 | void (*stop)(struct ieee80211_hw *hw); | 1815 | void (*stop)(struct ieee80211_hw *hw); |
1775 | int (*add_interface)(struct ieee80211_hw *hw, | 1816 | int (*add_interface)(struct ieee80211_hw *hw, |
@@ -1825,7 +1866,8 @@ struct ieee80211_ops { | |||
1825 | int (*ampdu_action)(struct ieee80211_hw *hw, | 1866 | int (*ampdu_action)(struct ieee80211_hw *hw, |
1826 | struct ieee80211_vif *vif, | 1867 | struct ieee80211_vif *vif, |
1827 | enum ieee80211_ampdu_mlme_action action, | 1868 | enum ieee80211_ampdu_mlme_action action, |
1828 | struct ieee80211_sta *sta, u16 tid, u16 *ssn); | 1869 | struct ieee80211_sta *sta, u16 tid, u16 *ssn, |
1870 | u8 buf_size); | ||
1829 | int (*get_survey)(struct ieee80211_hw *hw, int idx, | 1871 | int (*get_survey)(struct ieee80211_hw *hw, int idx, |
1830 | struct survey_info *survey); | 1872 | struct survey_info *survey); |
1831 | void (*rfkill_poll)(struct ieee80211_hw *hw); | 1873 | void (*rfkill_poll)(struct ieee80211_hw *hw); |
@@ -1845,6 +1887,14 @@ struct ieee80211_ops { | |||
1845 | enum nl80211_channel_type channel_type, | 1887 | enum nl80211_channel_type channel_type, |
1846 | int duration); | 1888 | int duration); |
1847 | int (*cancel_remain_on_channel)(struct ieee80211_hw *hw); | 1889 | int (*cancel_remain_on_channel)(struct ieee80211_hw *hw); |
1890 | int (*offchannel_tx)(struct ieee80211_hw *hw, struct sk_buff *skb, | ||
1891 | struct ieee80211_channel *chan, | ||
1892 | enum nl80211_channel_type channel_type, | ||
1893 | unsigned int wait); | ||
1894 | int (*offchannel_tx_cancel_wait)(struct ieee80211_hw *hw); | ||
1895 | int (*set_ringparam)(struct ieee80211_hw *hw, u32 tx, u32 rx); | ||
1896 | void (*get_ringparam)(struct ieee80211_hw *hw, | ||
1897 | u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max); | ||
1848 | }; | 1898 | }; |
1849 | 1899 | ||
1850 | /** | 1900 | /** |
@@ -2113,6 +2163,48 @@ static inline void ieee80211_rx_ni(struct ieee80211_hw *hw, | |||
2113 | local_bh_enable(); | 2163 | local_bh_enable(); |
2114 | } | 2164 | } |
2115 | 2165 | ||
2166 | /** | ||
2167 | * ieee80211_sta_ps_transition - PS transition for connected sta | ||
2168 | * | ||
2169 | * When operating in AP mode with the %IEEE80211_HW_AP_LINK_PS | ||
2170 | * flag set, use this function to inform mac80211 about a connected station | ||
2171 | * entering/leaving PS mode. | ||
2172 | * | ||
2173 | * This function may not be called in IRQ context or with softirqs enabled. | ||
2174 | * | ||
2175 | * Calls to this function for a single hardware must be synchronized against | ||
2176 | * each other. | ||
2177 | * | ||
2178 | * The function returns -EINVAL when the requested PS mode is already set. | ||
2179 | * | ||
2180 | * @sta: currently connected sta | ||
2181 | * @start: start or stop PS | ||
2182 | */ | ||
2183 | int ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool start); | ||
2184 | |||
2185 | /** | ||
2186 | * ieee80211_sta_ps_transition_ni - PS transition for connected sta | ||
2187 | * (in process context) | ||
2188 | * | ||
2189 | * Like ieee80211_sta_ps_transition() but can be called in process context | ||
2190 | * (internally disables bottom halves). Concurrent call restriction still | ||
2191 | * applies. | ||
2192 | * | ||
2193 | * @sta: currently connected sta | ||
2194 | * @start: start or stop PS | ||
2195 | */ | ||
2196 | static inline int ieee80211_sta_ps_transition_ni(struct ieee80211_sta *sta, | ||
2197 | bool start) | ||
2198 | { | ||
2199 | int ret; | ||
2200 | |||
2201 | local_bh_disable(); | ||
2202 | ret = ieee80211_sta_ps_transition(sta, start); | ||
2203 | local_bh_enable(); | ||
2204 | |||
2205 | return ret; | ||
2206 | } | ||
2207 | |||
2116 | /* | 2208 | /* |
2117 | * The TX headroom reserved by mac80211 for its own tx_status functions. | 2209 | * The TX headroom reserved by mac80211 for its own tx_status functions. |
2118 | * This is enough for the radiotap header. | 2210 | * This is enough for the radiotap header. |
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 1bf812b21fb7..3ae491932bc8 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h | |||
@@ -27,6 +27,7 @@ struct sock; | |||
27 | struct ctl_table_header; | 27 | struct ctl_table_header; |
28 | struct net_generic; | 28 | struct net_generic; |
29 | struct sock; | 29 | struct sock; |
30 | struct netns_ipvs; | ||
30 | 31 | ||
31 | 32 | ||
32 | #define NETDEV_HASHBITS 8 | 33 | #define NETDEV_HASHBITS 8 |
@@ -94,6 +95,7 @@ struct net { | |||
94 | #ifdef CONFIG_XFRM | 95 | #ifdef CONFIG_XFRM |
95 | struct netns_xfrm xfrm; | 96 | struct netns_xfrm xfrm; |
96 | #endif | 97 | #endif |
98 | struct netns_ipvs *ipvs; | ||
97 | }; | 99 | }; |
98 | 100 | ||
99 | 101 | ||
diff --git a/include/net/netevent.h b/include/net/netevent.h index e82b7bab3ff3..22b239c17eaa 100644 --- a/include/net/netevent.h +++ b/include/net/netevent.h | |||
@@ -21,7 +21,6 @@ struct netevent_redirect { | |||
21 | 21 | ||
22 | enum netevent_notif_type { | 22 | enum netevent_notif_type { |
23 | NETEVENT_NEIGH_UPDATE = 1, /* arg is struct neighbour ptr */ | 23 | NETEVENT_NEIGH_UPDATE = 1, /* arg is struct neighbour ptr */ |
24 | NETEVENT_PMTU_UPDATE, /* arg is struct dst_entry ptr */ | ||
25 | NETEVENT_REDIRECT, /* arg is struct netevent_redirect ptr */ | 24 | NETEVENT_REDIRECT, /* arg is struct netevent_redirect ptr */ |
26 | }; | 25 | }; |
27 | 26 | ||
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index d85cff10e169..d0d13378991e 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h | |||
@@ -50,11 +50,24 @@ union nf_conntrack_expect_proto { | |||
50 | /* per conntrack: application helper private data */ | 50 | /* per conntrack: application helper private data */ |
51 | union nf_conntrack_help { | 51 | union nf_conntrack_help { |
52 | /* insert conntrack helper private data (master) here */ | 52 | /* insert conntrack helper private data (master) here */ |
53 | #if defined(CONFIG_NF_CONNTRACK_FTP) || defined(CONFIG_NF_CONNTRACK_FTP_MODULE) | ||
53 | struct nf_ct_ftp_master ct_ftp_info; | 54 | struct nf_ct_ftp_master ct_ftp_info; |
55 | #endif | ||
56 | #if defined(CONFIG_NF_CONNTRACK_PPTP) || \ | ||
57 | defined(CONFIG_NF_CONNTRACK_PPTP_MODULE) | ||
54 | struct nf_ct_pptp_master ct_pptp_info; | 58 | struct nf_ct_pptp_master ct_pptp_info; |
59 | #endif | ||
60 | #if defined(CONFIG_NF_CONNTRACK_H323) || \ | ||
61 | defined(CONFIG_NF_CONNTRACK_H323_MODULE) | ||
55 | struct nf_ct_h323_master ct_h323_info; | 62 | struct nf_ct_h323_master ct_h323_info; |
63 | #endif | ||
64 | #if defined(CONFIG_NF_CONNTRACK_SANE) || \ | ||
65 | defined(CONFIG_NF_CONNTRACK_SANE_MODULE) | ||
56 | struct nf_ct_sane_master ct_sane_info; | 66 | struct nf_ct_sane_master ct_sane_info; |
67 | #endif | ||
68 | #if defined(CONFIG_NF_CONNTRACK_SIP) || defined(CONFIG_NF_CONNTRACK_SIP_MODULE) | ||
57 | struct nf_ct_sip_master ct_sip_info; | 69 | struct nf_ct_sip_master ct_sip_info; |
70 | #endif | ||
58 | }; | 71 | }; |
59 | 72 | ||
60 | #include <linux/types.h> | 73 | #include <linux/types.h> |
@@ -116,14 +129,14 @@ struct nf_conn { | |||
116 | u_int32_t secmark; | 129 | u_int32_t secmark; |
117 | #endif | 130 | #endif |
118 | 131 | ||
119 | /* Storage reserved for other modules: */ | ||
120 | union nf_conntrack_proto proto; | ||
121 | |||
122 | /* Extensions */ | 132 | /* Extensions */ |
123 | struct nf_ct_ext *ext; | 133 | struct nf_ct_ext *ext; |
124 | #ifdef CONFIG_NET_NS | 134 | #ifdef CONFIG_NET_NS |
125 | struct net *ct_net; | 135 | struct net *ct_net; |
126 | #endif | 136 | #endif |
137 | |||
138 | /* Storage reserved for other modules, must be the last member */ | ||
139 | union nf_conntrack_proto proto; | ||
127 | }; | 140 | }; |
128 | 141 | ||
129 | static inline struct nf_conn * | 142 | static inline struct nf_conn * |
@@ -189,9 +202,9 @@ extern void nf_ct_l3proto_module_put(unsigned short l3proto); | |||
189 | * Allocate a hashtable of hlist_head (if nulls == 0), | 202 | * Allocate a hashtable of hlist_head (if nulls == 0), |
190 | * or hlist_nulls_head (if nulls == 1) | 203 | * or hlist_nulls_head (if nulls == 1) |
191 | */ | 204 | */ |
192 | extern void *nf_ct_alloc_hashtable(unsigned int *sizep, int *vmalloced, int nulls); | 205 | extern void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls); |
193 | 206 | ||
194 | extern void nf_ct_free_hashtable(void *hash, int vmalloced, unsigned int size); | 207 | extern void nf_ct_free_hashtable(void *hash, unsigned int size); |
195 | 208 | ||
196 | extern struct nf_conntrack_tuple_hash * | 209 | extern struct nf_conntrack_tuple_hash * |
197 | __nf_conntrack_find(struct net *net, u16 zone, | 210 | __nf_conntrack_find(struct net *net, u16 zone, |
diff --git a/include/net/netfilter/nf_conntrack_ecache.h b/include/net/netfilter/nf_conntrack_ecache.h index 349cefedc9f3..4283508b3e18 100644 --- a/include/net/netfilter/nf_conntrack_ecache.h +++ b/include/net/netfilter/nf_conntrack_ecache.h | |||
@@ -23,12 +23,17 @@ struct nf_conntrack_ecache { | |||
23 | static inline struct nf_conntrack_ecache * | 23 | static inline struct nf_conntrack_ecache * |
24 | nf_ct_ecache_find(const struct nf_conn *ct) | 24 | nf_ct_ecache_find(const struct nf_conn *ct) |
25 | { | 25 | { |
26 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | ||
26 | return nf_ct_ext_find(ct, NF_CT_EXT_ECACHE); | 27 | return nf_ct_ext_find(ct, NF_CT_EXT_ECACHE); |
28 | #else | ||
29 | return NULL; | ||
30 | #endif | ||
27 | } | 31 | } |
28 | 32 | ||
29 | static inline struct nf_conntrack_ecache * | 33 | static inline struct nf_conntrack_ecache * |
30 | nf_ct_ecache_ext_add(struct nf_conn *ct, u16 ctmask, u16 expmask, gfp_t gfp) | 34 | nf_ct_ecache_ext_add(struct nf_conn *ct, u16 ctmask, u16 expmask, gfp_t gfp) |
31 | { | 35 | { |
36 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | ||
32 | struct net *net = nf_ct_net(ct); | 37 | struct net *net = nf_ct_net(ct); |
33 | struct nf_conntrack_ecache *e; | 38 | struct nf_conntrack_ecache *e; |
34 | 39 | ||
@@ -45,6 +50,9 @@ nf_ct_ecache_ext_add(struct nf_conn *ct, u16 ctmask, u16 expmask, gfp_t gfp) | |||
45 | e->expmask = expmask; | 50 | e->expmask = expmask; |
46 | } | 51 | } |
47 | return e; | 52 | return e; |
53 | #else | ||
54 | return NULL; | ||
55 | #endif | ||
48 | }; | 56 | }; |
49 | 57 | ||
50 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | 58 | #ifdef CONFIG_NF_CONNTRACK_EVENTS |
@@ -59,7 +67,7 @@ struct nf_ct_event_notifier { | |||
59 | int (*fcn)(unsigned int events, struct nf_ct_event *item); | 67 | int (*fcn)(unsigned int events, struct nf_ct_event *item); |
60 | }; | 68 | }; |
61 | 69 | ||
62 | extern struct nf_ct_event_notifier *nf_conntrack_event_cb; | 70 | extern struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb; |
63 | extern int nf_conntrack_register_notifier(struct nf_ct_event_notifier *nb); | 71 | extern int nf_conntrack_register_notifier(struct nf_ct_event_notifier *nb); |
64 | extern void nf_conntrack_unregister_notifier(struct nf_ct_event_notifier *nb); | 72 | extern void nf_conntrack_unregister_notifier(struct nf_ct_event_notifier *nb); |
65 | 73 | ||
@@ -156,7 +164,7 @@ struct nf_exp_event_notifier { | |||
156 | int (*fcn)(unsigned int events, struct nf_exp_event *item); | 164 | int (*fcn)(unsigned int events, struct nf_exp_event *item); |
157 | }; | 165 | }; |
158 | 166 | ||
159 | extern struct nf_exp_event_notifier *nf_expect_event_cb; | 167 | extern struct nf_exp_event_notifier __rcu *nf_expect_event_cb; |
160 | extern int nf_ct_expect_register_notifier(struct nf_exp_event_notifier *nb); | 168 | extern int nf_ct_expect_register_notifier(struct nf_exp_event_notifier *nb); |
161 | extern void nf_ct_expect_unregister_notifier(struct nf_exp_event_notifier *nb); | 169 | extern void nf_ct_expect_unregister_notifier(struct nf_exp_event_notifier *nb); |
162 | 170 | ||
diff --git a/include/net/netfilter/nf_conntrack_extend.h b/include/net/netfilter/nf_conntrack_extend.h index 0772d296dfdb..2dcf31703acb 100644 --- a/include/net/netfilter/nf_conntrack_extend.h +++ b/include/net/netfilter/nf_conntrack_extend.h | |||
@@ -7,10 +7,19 @@ | |||
7 | 7 | ||
8 | enum nf_ct_ext_id { | 8 | enum nf_ct_ext_id { |
9 | NF_CT_EXT_HELPER, | 9 | NF_CT_EXT_HELPER, |
10 | #if defined(CONFIG_NF_NAT) || defined(CONFIG_NF_NAT_MODULE) | ||
10 | NF_CT_EXT_NAT, | 11 | NF_CT_EXT_NAT, |
12 | #endif | ||
11 | NF_CT_EXT_ACCT, | 13 | NF_CT_EXT_ACCT, |
14 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | ||
12 | NF_CT_EXT_ECACHE, | 15 | NF_CT_EXT_ECACHE, |
16 | #endif | ||
17 | #ifdef CONFIG_NF_CONNTRACK_ZONES | ||
13 | NF_CT_EXT_ZONE, | 18 | NF_CT_EXT_ZONE, |
19 | #endif | ||
20 | #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP | ||
21 | NF_CT_EXT_TSTAMP, | ||
22 | #endif | ||
14 | NF_CT_EXT_NUM, | 23 | NF_CT_EXT_NUM, |
15 | }; | 24 | }; |
16 | 25 | ||
@@ -19,6 +28,7 @@ enum nf_ct_ext_id { | |||
19 | #define NF_CT_EXT_ACCT_TYPE struct nf_conn_counter | 28 | #define NF_CT_EXT_ACCT_TYPE struct nf_conn_counter |
20 | #define NF_CT_EXT_ECACHE_TYPE struct nf_conntrack_ecache | 29 | #define NF_CT_EXT_ECACHE_TYPE struct nf_conntrack_ecache |
21 | #define NF_CT_EXT_ZONE_TYPE struct nf_conntrack_zone | 30 | #define NF_CT_EXT_ZONE_TYPE struct nf_conntrack_zone |
31 | #define NF_CT_EXT_TSTAMP_TYPE struct nf_conn_tstamp | ||
22 | 32 | ||
23 | /* Extensions: optional stuff which isn't permanently in struct. */ | 33 | /* Extensions: optional stuff which isn't permanently in struct. */ |
24 | struct nf_ct_ext { | 34 | struct nf_ct_ext { |
diff --git a/include/net/netfilter/nf_conntrack_helper.h b/include/net/netfilter/nf_conntrack_helper.h index 32c305dbdab6..f1c1311adc2c 100644 --- a/include/net/netfilter/nf_conntrack_helper.h +++ b/include/net/netfilter/nf_conntrack_helper.h | |||
@@ -63,4 +63,10 @@ static inline struct nf_conn_help *nfct_help(const struct nf_conn *ct) | |||
63 | extern int nf_conntrack_helper_init(void); | 63 | extern int nf_conntrack_helper_init(void); |
64 | extern void nf_conntrack_helper_fini(void); | 64 | extern void nf_conntrack_helper_fini(void); |
65 | 65 | ||
66 | extern int nf_conntrack_broadcast_help(struct sk_buff *skb, | ||
67 | unsigned int protoff, | ||
68 | struct nf_conn *ct, | ||
69 | enum ip_conntrack_info ctinfo, | ||
70 | unsigned int timeout); | ||
71 | |||
66 | #endif /*_NF_CONNTRACK_HELPER_H*/ | 72 | #endif /*_NF_CONNTRACK_HELPER_H*/ |
diff --git a/include/net/netfilter/nf_conntrack_l3proto.h b/include/net/netfilter/nf_conntrack_l3proto.h index a7547611e8f1..e8010f445ae1 100644 --- a/include/net/netfilter/nf_conntrack_l3proto.h +++ b/include/net/netfilter/nf_conntrack_l3proto.h | |||
@@ -73,7 +73,7 @@ struct nf_conntrack_l3proto { | |||
73 | struct module *me; | 73 | struct module *me; |
74 | }; | 74 | }; |
75 | 75 | ||
76 | extern struct nf_conntrack_l3proto *nf_ct_l3protos[AF_MAX]; | 76 | extern struct nf_conntrack_l3proto __rcu *nf_ct_l3protos[AF_MAX]; |
77 | 77 | ||
78 | /* Protocol registration. */ | 78 | /* Protocol registration. */ |
79 | extern int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto); | 79 | extern int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto); |
diff --git a/include/net/netfilter/nf_conntrack_timestamp.h b/include/net/netfilter/nf_conntrack_timestamp.h new file mode 100644 index 000000000000..fc9c82b1f06b --- /dev/null +++ b/include/net/netfilter/nf_conntrack_timestamp.h | |||
@@ -0,0 +1,65 @@ | |||
1 | #ifndef _NF_CONNTRACK_TSTAMP_H | ||
2 | #define _NF_CONNTRACK_TSTAMP_H | ||
3 | |||
4 | #include <net/net_namespace.h> | ||
5 | #include <linux/netfilter/nf_conntrack_common.h> | ||
6 | #include <linux/netfilter/nf_conntrack_tuple_common.h> | ||
7 | #include <net/netfilter/nf_conntrack.h> | ||
8 | #include <net/netfilter/nf_conntrack_extend.h> | ||
9 | |||
10 | struct nf_conn_tstamp { | ||
11 | u_int64_t start; | ||
12 | u_int64_t stop; | ||
13 | }; | ||
14 | |||
15 | static inline | ||
16 | struct nf_conn_tstamp *nf_conn_tstamp_find(const struct nf_conn *ct) | ||
17 | { | ||
18 | #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP | ||
19 | return nf_ct_ext_find(ct, NF_CT_EXT_TSTAMP); | ||
20 | #else | ||
21 | return NULL; | ||
22 | #endif | ||
23 | } | ||
24 | |||
25 | static inline | ||
26 | struct nf_conn_tstamp *nf_ct_tstamp_ext_add(struct nf_conn *ct, gfp_t gfp) | ||
27 | { | ||
28 | #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP | ||
29 | struct net *net = nf_ct_net(ct); | ||
30 | |||
31 | if (!net->ct.sysctl_tstamp) | ||
32 | return NULL; | ||
33 | |||
34 | return nf_ct_ext_add(ct, NF_CT_EXT_TSTAMP, gfp); | ||
35 | #else | ||
36 | return NULL; | ||
37 | #endif | ||
38 | }; | ||
39 | |||
40 | static inline bool nf_ct_tstamp_enabled(struct net *net) | ||
41 | { | ||
42 | return net->ct.sysctl_tstamp != 0; | ||
43 | } | ||
44 | |||
45 | static inline void nf_ct_set_tstamp(struct net *net, bool enable) | ||
46 | { | ||
47 | net->ct.sysctl_tstamp = enable; | ||
48 | } | ||
49 | |||
50 | #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP | ||
51 | extern int nf_conntrack_tstamp_init(struct net *net); | ||
52 | extern void nf_conntrack_tstamp_fini(struct net *net); | ||
53 | #else | ||
54 | static inline int nf_conntrack_tstamp_init(struct net *net) | ||
55 | { | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | static inline void nf_conntrack_tstamp_fini(struct net *net) | ||
60 | { | ||
61 | return; | ||
62 | } | ||
63 | #endif /* CONFIG_NF_CONNTRACK_TIMESTAMP */ | ||
64 | |||
65 | #endif /* _NF_CONNTRACK_TSTAMP_H */ | ||
diff --git a/include/net/netfilter/nf_nat.h b/include/net/netfilter/nf_nat.h index f5f09f032a90..aff80b190c12 100644 --- a/include/net/netfilter/nf_nat.h +++ b/include/net/netfilter/nf_nat.h | |||
@@ -56,7 +56,9 @@ struct nf_nat_multi_range_compat { | |||
56 | /* per conntrack: nat application helper private data */ | 56 | /* per conntrack: nat application helper private data */ |
57 | union nf_conntrack_nat_help { | 57 | union nf_conntrack_nat_help { |
58 | /* insert nat helper private data here */ | 58 | /* insert nat helper private data here */ |
59 | #if defined(CONFIG_NF_NAT_PPTP) || defined(CONFIG_NF_NAT_PPTP_MODULE) | ||
59 | struct nf_nat_pptp nat_pptp_info; | 60 | struct nf_nat_pptp nat_pptp_info; |
61 | #endif | ||
60 | }; | 62 | }; |
61 | 63 | ||
62 | struct nf_conn; | 64 | struct nf_conn; |
@@ -84,7 +86,11 @@ extern int nf_nat_used_tuple(const struct nf_conntrack_tuple *tuple, | |||
84 | 86 | ||
85 | static inline struct nf_conn_nat *nfct_nat(const struct nf_conn *ct) | 87 | static inline struct nf_conn_nat *nfct_nat(const struct nf_conn *ct) |
86 | { | 88 | { |
89 | #if defined(CONFIG_NF_NAT) || defined(CONFIG_NF_NAT_MODULE) | ||
87 | return nf_ct_ext_find(ct, NF_CT_EXT_NAT); | 90 | return nf_ct_ext_find(ct, NF_CT_EXT_NAT); |
91 | #else | ||
92 | return NULL; | ||
93 | #endif | ||
88 | } | 94 | } |
89 | 95 | ||
90 | #else /* !__KERNEL__: iptables wants this to compile. */ | 96 | #else /* !__KERNEL__: iptables wants this to compile. */ |
diff --git a/include/net/netfilter/nf_nat_core.h b/include/net/netfilter/nf_nat_core.h index 33602ab66190..3dc7b98effeb 100644 --- a/include/net/netfilter/nf_nat_core.h +++ b/include/net/netfilter/nf_nat_core.h | |||
@@ -21,9 +21,9 @@ static inline int nf_nat_initialized(struct nf_conn *ct, | |||
21 | enum nf_nat_manip_type manip) | 21 | enum nf_nat_manip_type manip) |
22 | { | 22 | { |
23 | if (manip == IP_NAT_MANIP_SRC) | 23 | if (manip == IP_NAT_MANIP_SRC) |
24 | return test_bit(IPS_SRC_NAT_DONE_BIT, &ct->status); | 24 | return ct->status & IPS_SRC_NAT_DONE; |
25 | else | 25 | else |
26 | return test_bit(IPS_DST_NAT_DONE_BIT, &ct->status); | 26 | return ct->status & IPS_DST_NAT_DONE; |
27 | } | 27 | } |
28 | 28 | ||
29 | struct nlattr; | 29 | struct nlattr; |
diff --git a/include/net/netlink.h b/include/net/netlink.h index 373f1a900cf4..8a3906a08f5f 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h | |||
@@ -856,18 +856,27 @@ static inline int nla_put_msecs(struct sk_buff *skb, int attrtype, | |||
856 | #define NLA_PUT_BE16(skb, attrtype, value) \ | 856 | #define NLA_PUT_BE16(skb, attrtype, value) \ |
857 | NLA_PUT_TYPE(skb, __be16, attrtype, value) | 857 | NLA_PUT_TYPE(skb, __be16, attrtype, value) |
858 | 858 | ||
859 | #define NLA_PUT_NET16(skb, attrtype, value) \ | ||
860 | NLA_PUT_BE16(skb, attrtype | NLA_F_NET_BYTEORDER, value) | ||
861 | |||
859 | #define NLA_PUT_U32(skb, attrtype, value) \ | 862 | #define NLA_PUT_U32(skb, attrtype, value) \ |
860 | NLA_PUT_TYPE(skb, u32, attrtype, value) | 863 | NLA_PUT_TYPE(skb, u32, attrtype, value) |
861 | 864 | ||
862 | #define NLA_PUT_BE32(skb, attrtype, value) \ | 865 | #define NLA_PUT_BE32(skb, attrtype, value) \ |
863 | NLA_PUT_TYPE(skb, __be32, attrtype, value) | 866 | NLA_PUT_TYPE(skb, __be32, attrtype, value) |
864 | 867 | ||
868 | #define NLA_PUT_NET32(skb, attrtype, value) \ | ||
869 | NLA_PUT_BE32(skb, attrtype | NLA_F_NET_BYTEORDER, value) | ||
870 | |||
865 | #define NLA_PUT_U64(skb, attrtype, value) \ | 871 | #define NLA_PUT_U64(skb, attrtype, value) \ |
866 | NLA_PUT_TYPE(skb, u64, attrtype, value) | 872 | NLA_PUT_TYPE(skb, u64, attrtype, value) |
867 | 873 | ||
868 | #define NLA_PUT_BE64(skb, attrtype, value) \ | 874 | #define NLA_PUT_BE64(skb, attrtype, value) \ |
869 | NLA_PUT_TYPE(skb, __be64, attrtype, value) | 875 | NLA_PUT_TYPE(skb, __be64, attrtype, value) |
870 | 876 | ||
877 | #define NLA_PUT_NET64(skb, attrtype, value) \ | ||
878 | NLA_PUT_BE64(skb, attrtype | NLA_F_NET_BYTEORDER, value) | ||
879 | |||
871 | #define NLA_PUT_STRING(skb, attrtype, value) \ | 880 | #define NLA_PUT_STRING(skb, attrtype, value) \ |
872 | NLA_PUT(skb, attrtype, strlen(value) + 1, value) | 881 | NLA_PUT(skb, attrtype, strlen(value) + 1, value) |
873 | 882 | ||
diff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h index d4958d4c6574..341eb089349e 100644 --- a/include/net/netns/conntrack.h +++ b/include/net/netns/conntrack.h | |||
@@ -21,15 +21,15 @@ struct netns_ct { | |||
21 | int sysctl_events; | 21 | int sysctl_events; |
22 | unsigned int sysctl_events_retry_timeout; | 22 | unsigned int sysctl_events_retry_timeout; |
23 | int sysctl_acct; | 23 | int sysctl_acct; |
24 | int sysctl_tstamp; | ||
24 | int sysctl_checksum; | 25 | int sysctl_checksum; |
25 | unsigned int sysctl_log_invalid; /* Log invalid packets */ | 26 | unsigned int sysctl_log_invalid; /* Log invalid packets */ |
26 | #ifdef CONFIG_SYSCTL | 27 | #ifdef CONFIG_SYSCTL |
27 | struct ctl_table_header *sysctl_header; | 28 | struct ctl_table_header *sysctl_header; |
28 | struct ctl_table_header *acct_sysctl_header; | 29 | struct ctl_table_header *acct_sysctl_header; |
30 | struct ctl_table_header *tstamp_sysctl_header; | ||
29 | struct ctl_table_header *event_sysctl_header; | 31 | struct ctl_table_header *event_sysctl_header; |
30 | #endif | 32 | #endif |
31 | int hash_vmalloc; | ||
32 | int expect_vmalloc; | ||
33 | char *slabname; | 33 | char *slabname; |
34 | }; | 34 | }; |
35 | #endif | 35 | #endif |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index d68c3f121774..e2e2ef57eca2 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
@@ -43,7 +43,6 @@ struct netns_ipv4 { | |||
43 | struct xt_table *nat_table; | 43 | struct xt_table *nat_table; |
44 | struct hlist_head *nat_bysource; | 44 | struct hlist_head *nat_bysource; |
45 | unsigned int nat_htable_size; | 45 | unsigned int nat_htable_size; |
46 | int nat_vmalloced; | ||
47 | #endif | 46 | #endif |
48 | 47 | ||
49 | int sysctl_icmp_echo_ignore_all; | 48 | int sysctl_icmp_echo_ignore_all; |
diff --git a/include/net/phonet/pep.h b/include/net/phonet/pep.h index b60b28c99e87..b669fe6dbc3b 100644 --- a/include/net/phonet/pep.h +++ b/include/net/phonet/pep.h | |||
@@ -28,7 +28,6 @@ struct pep_sock { | |||
28 | 28 | ||
29 | /* XXX: union-ify listening vs connected stuff ? */ | 29 | /* XXX: union-ify listening vs connected stuff ? */ |
30 | /* Listening socket stuff: */ | 30 | /* Listening socket stuff: */ |
31 | struct hlist_head ackq; | ||
32 | struct hlist_head hlist; | 31 | struct hlist_head hlist; |
33 | 32 | ||
34 | /* Connected socket stuff: */ | 33 | /* Connected socket stuff: */ |
@@ -45,10 +44,6 @@ struct pep_sock { | |||
45 | u8 tx_fc; /* TX flow control */ | 44 | u8 tx_fc; /* TX flow control */ |
46 | u8 init_enable; /* auto-enable at creation */ | 45 | u8 init_enable; /* auto-enable at creation */ |
47 | u8 aligned; | 46 | u8 aligned; |
48 | #ifdef CONFIG_PHONET_PIPECTRLR | ||
49 | u8 pipe_state; | ||
50 | struct sockaddr_pn remote_pep; | ||
51 | #endif | ||
52 | }; | 47 | }; |
53 | 48 | ||
54 | static inline struct pep_sock *pep_sk(struct sock *sk) | 49 | static inline struct pep_sock *pep_sk(struct sock *sk) |
@@ -158,6 +153,7 @@ enum { | |||
158 | PN_LEGACY_FLOW_CONTROL, | 153 | PN_LEGACY_FLOW_CONTROL, |
159 | PN_ONE_CREDIT_FLOW_CONTROL, | 154 | PN_ONE_CREDIT_FLOW_CONTROL, |
160 | PN_MULTI_CREDIT_FLOW_CONTROL, | 155 | PN_MULTI_CREDIT_FLOW_CONTROL, |
156 | PN_MAX_FLOW_CONTROL, | ||
161 | }; | 157 | }; |
162 | 158 | ||
163 | #define pn_flow_safe(fc) ((fc) >> 1) | 159 | #define pn_flow_safe(fc) ((fc) >> 1) |
@@ -169,21 +165,4 @@ enum { | |||
169 | PEP_IND_READY, | 165 | PEP_IND_READY, |
170 | }; | 166 | }; |
171 | 167 | ||
172 | #ifdef CONFIG_PHONET_PIPECTRLR | ||
173 | #define PNS_PEP_CONNECT_UTID 0x02 | ||
174 | #define PNS_PIPE_CREATED_IND_UTID 0x04 | ||
175 | #define PNS_PIPE_ENABLE_UTID 0x0A | ||
176 | #define PNS_PIPE_ENABLED_IND_UTID 0x0C | ||
177 | #define PNS_PIPE_DISABLE_UTID 0x0F | ||
178 | #define PNS_PIPE_DISABLED_IND_UTID 0x11 | ||
179 | #define PNS_PEP_DISCONNECT_UTID 0x06 | ||
180 | |||
181 | /* Used for tracking state of a pipe */ | ||
182 | enum { | ||
183 | PIPE_IDLE, | ||
184 | PIPE_DISABLED, | ||
185 | PIPE_ENABLED, | ||
186 | }; | ||
187 | #endif /* CONFIG_PHONET_PIPECTRLR */ | ||
188 | |||
189 | #endif | 168 | #endif |
diff --git a/include/net/phonet/phonet.h b/include/net/phonet/phonet.h index 5395e09187df..68e509750caa 100644 --- a/include/net/phonet/phonet.h +++ b/include/net/phonet/phonet.h | |||
@@ -36,6 +36,7 @@ | |||
36 | struct pn_sock { | 36 | struct pn_sock { |
37 | struct sock sk; | 37 | struct sock sk; |
38 | u16 sobject; | 38 | u16 sobject; |
39 | u16 dobject; | ||
39 | u8 resource; | 40 | u8 resource; |
40 | }; | 41 | }; |
41 | 42 | ||
diff --git a/include/net/protocol.h b/include/net/protocol.h index dc07495bce4c..6f7eb800974a 100644 --- a/include/net/protocol.h +++ b/include/net/protocol.h | |||
@@ -38,7 +38,7 @@ struct net_protocol { | |||
38 | void (*err_handler)(struct sk_buff *skb, u32 info); | 38 | void (*err_handler)(struct sk_buff *skb, u32 info); |
39 | int (*gso_send_check)(struct sk_buff *skb); | 39 | int (*gso_send_check)(struct sk_buff *skb); |
40 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, | 40 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, |
41 | int features); | 41 | u32 features); |
42 | struct sk_buff **(*gro_receive)(struct sk_buff **head, | 42 | struct sk_buff **(*gro_receive)(struct sk_buff **head, |
43 | struct sk_buff *skb); | 43 | struct sk_buff *skb); |
44 | int (*gro_complete)(struct sk_buff *skb); | 44 | int (*gro_complete)(struct sk_buff *skb); |
@@ -57,7 +57,7 @@ struct inet6_protocol { | |||
57 | 57 | ||
58 | int (*gso_send_check)(struct sk_buff *skb); | 58 | int (*gso_send_check)(struct sk_buff *skb); |
59 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, | 59 | struct sk_buff *(*gso_segment)(struct sk_buff *skb, |
60 | int features); | 60 | u32 features); |
61 | struct sk_buff **(*gro_receive)(struct sk_buff **head, | 61 | struct sk_buff **(*gro_receive)(struct sk_buff **head, |
62 | struct sk_buff *skb); | 62 | struct sk_buff *skb); |
63 | int (*gro_complete)(struct sk_buff *skb); | 63 | int (*gro_complete)(struct sk_buff *skb); |
diff --git a/include/net/route.h b/include/net/route.h index 93e10c453f6b..30d6cae3841a 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -49,36 +49,43 @@ | |||
49 | 49 | ||
50 | struct fib_nh; | 50 | struct fib_nh; |
51 | struct inet_peer; | 51 | struct inet_peer; |
52 | struct fib_info; | ||
52 | struct rtable { | 53 | struct rtable { |
53 | struct dst_entry dst; | 54 | struct dst_entry dst; |
54 | 55 | ||
55 | /* Cache lookup keys */ | 56 | /* Lookup key. */ |
56 | struct flowi fl; | 57 | __be32 rt_key_dst; |
58 | __be32 rt_key_src; | ||
57 | 59 | ||
58 | int rt_genid; | 60 | int rt_genid; |
59 | unsigned rt_flags; | 61 | unsigned rt_flags; |
60 | __u16 rt_type; | 62 | __u16 rt_type; |
63 | __u8 rt_tos; | ||
61 | 64 | ||
62 | __be32 rt_dst; /* Path destination */ | 65 | __be32 rt_dst; /* Path destination */ |
63 | __be32 rt_src; /* Path source */ | 66 | __be32 rt_src; /* Path source */ |
64 | int rt_iif; | 67 | int rt_iif; |
68 | int rt_oif; | ||
69 | __u32 rt_mark; | ||
65 | 70 | ||
66 | /* Info on neighbour */ | 71 | /* Info on neighbour */ |
67 | __be32 rt_gateway; | 72 | __be32 rt_gateway; |
68 | 73 | ||
69 | /* Miscellaneous cached information */ | 74 | /* Miscellaneous cached information */ |
70 | __be32 rt_spec_dst; /* RFC1122 specific destination */ | 75 | __be32 rt_spec_dst; /* RFC1122 specific destination */ |
76 | u32 rt_peer_genid; | ||
71 | struct inet_peer *peer; /* long-living peer info */ | 77 | struct inet_peer *peer; /* long-living peer info */ |
78 | struct fib_info *fi; /* for client ref to shared metrics */ | ||
72 | }; | 79 | }; |
73 | 80 | ||
74 | static inline bool rt_is_input_route(struct rtable *rt) | 81 | static inline bool rt_is_input_route(struct rtable *rt) |
75 | { | 82 | { |
76 | return rt->fl.iif != 0; | 83 | return rt->rt_iif != 0; |
77 | } | 84 | } |
78 | 85 | ||
79 | static inline bool rt_is_output_route(struct rtable *rt) | 86 | static inline bool rt_is_output_route(struct rtable *rt) |
80 | { | 87 | { |
81 | return rt->fl.iif == 0; | 88 | return rt->rt_iif == 0; |
82 | } | 89 | } |
83 | 90 | ||
84 | struct ip_rt_acct { | 91 | struct ip_rt_acct { |
@@ -115,9 +122,63 @@ extern void ip_rt_redirect(__be32 old_gw, __be32 dst, __be32 new_gw, | |||
115 | __be32 src, struct net_device *dev); | 122 | __be32 src, struct net_device *dev); |
116 | extern void rt_cache_flush(struct net *net, int how); | 123 | extern void rt_cache_flush(struct net *net, int how); |
117 | extern void rt_cache_flush_batch(struct net *net); | 124 | extern void rt_cache_flush_batch(struct net *net); |
118 | extern int __ip_route_output_key(struct net *, struct rtable **, const struct flowi *flp); | 125 | extern struct rtable *__ip_route_output_key(struct net *, const struct flowi4 *flp); |
119 | extern int ip_route_output_key(struct net *, struct rtable **, struct flowi *flp); | 126 | extern struct rtable *ip_route_output_flow(struct net *, struct flowi4 *flp, |
120 | extern int ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk, int flags); | 127 | struct sock *sk); |
128 | extern struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig); | ||
129 | |||
130 | static inline struct rtable *ip_route_output_key(struct net *net, struct flowi4 *flp) | ||
131 | { | ||
132 | return ip_route_output_flow(net, flp, NULL); | ||
133 | } | ||
134 | |||
135 | static inline struct rtable *ip_route_output(struct net *net, __be32 daddr, | ||
136 | __be32 saddr, u8 tos, int oif) | ||
137 | { | ||
138 | struct flowi4 fl4 = { | ||
139 | .flowi4_oif = oif, | ||
140 | .daddr = daddr, | ||
141 | .saddr = saddr, | ||
142 | .flowi4_tos = tos, | ||
143 | }; | ||
144 | return ip_route_output_key(net, &fl4); | ||
145 | } | ||
146 | |||
147 | static inline struct rtable *ip_route_output_ports(struct net *net, struct sock *sk, | ||
148 | __be32 daddr, __be32 saddr, | ||
149 | __be16 dport, __be16 sport, | ||
150 | __u8 proto, __u8 tos, int oif) | ||
151 | { | ||
152 | struct flowi4 fl4 = { | ||
153 | .flowi4_oif = oif, | ||
154 | .flowi4_flags = sk ? inet_sk_flowi_flags(sk) : 0, | ||
155 | .flowi4_mark = sk ? sk->sk_mark : 0, | ||
156 | .daddr = daddr, | ||
157 | .saddr = saddr, | ||
158 | .flowi4_tos = tos, | ||
159 | .flowi4_proto = proto, | ||
160 | .fl4_dport = dport, | ||
161 | .fl4_sport = sport, | ||
162 | }; | ||
163 | if (sk) | ||
164 | security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); | ||
165 | return ip_route_output_flow(net, &fl4, sk); | ||
166 | } | ||
167 | |||
168 | static inline struct rtable *ip_route_output_gre(struct net *net, | ||
169 | __be32 daddr, __be32 saddr, | ||
170 | __be32 gre_key, __u8 tos, int oif) | ||
171 | { | ||
172 | struct flowi4 fl4 = { | ||
173 | .flowi4_oif = oif, | ||
174 | .daddr = daddr, | ||
175 | .saddr = saddr, | ||
176 | .flowi4_tos = tos, | ||
177 | .flowi4_proto = IPPROTO_GRE, | ||
178 | .fl4_gre_key = gre_key, | ||
179 | }; | ||
180 | return ip_route_output_key(net, &fl4); | ||
181 | } | ||
121 | 182 | ||
122 | extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src, | 183 | extern int ip_route_input_common(struct sk_buff *skb, __be32 dst, __be32 src, |
123 | u8 tos, struct net_device *devin, bool noref); | 184 | u8 tos, struct net_device *devin, bool noref); |
@@ -162,57 +223,68 @@ static inline char rt_tos2priority(u8 tos) | |||
162 | return ip_tos2prio[IPTOS_TOS(tos)>>1]; | 223 | return ip_tos2prio[IPTOS_TOS(tos)>>1]; |
163 | } | 224 | } |
164 | 225 | ||
165 | static inline int ip_route_connect(struct rtable **rp, __be32 dst, | 226 | static inline struct rtable *ip_route_connect(__be32 dst, __be32 src, u32 tos, |
166 | __be32 src, u32 tos, int oif, u8 protocol, | 227 | int oif, u8 protocol, |
167 | __be16 sport, __be16 dport, struct sock *sk, | 228 | __be16 sport, __be16 dport, |
168 | int flags) | 229 | struct sock *sk, bool can_sleep) |
169 | { | 230 | { |
170 | struct flowi fl = { .oif = oif, | 231 | struct flowi4 fl4 = { |
171 | .mark = sk->sk_mark, | 232 | .flowi4_oif = oif, |
172 | .fl4_dst = dst, | 233 | .flowi4_mark = sk->sk_mark, |
173 | .fl4_src = src, | 234 | .daddr = dst, |
174 | .fl4_tos = tos, | 235 | .saddr = src, |
175 | .proto = protocol, | 236 | .flowi4_tos = tos, |
176 | .fl_ip_sport = sport, | 237 | .flowi4_proto = protocol, |
177 | .fl_ip_dport = dport }; | 238 | .fl4_sport = sport, |
178 | int err; | 239 | .fl4_dport = dport, |
240 | }; | ||
179 | struct net *net = sock_net(sk); | 241 | struct net *net = sock_net(sk); |
242 | struct rtable *rt; | ||
180 | 243 | ||
181 | if (inet_sk(sk)->transparent) | 244 | if (inet_sk(sk)->transparent) |
182 | fl.flags |= FLOWI_FLAG_ANYSRC; | 245 | fl4.flowi4_flags |= FLOWI_FLAG_ANYSRC; |
246 | if (protocol == IPPROTO_TCP) | ||
247 | fl4.flowi4_flags |= FLOWI_FLAG_PRECOW_METRICS; | ||
248 | if (can_sleep) | ||
249 | fl4.flowi4_flags |= FLOWI_FLAG_CAN_SLEEP; | ||
183 | 250 | ||
184 | if (!dst || !src) { | 251 | if (!dst || !src) { |
185 | err = __ip_route_output_key(net, rp, &fl); | 252 | rt = __ip_route_output_key(net, &fl4); |
186 | if (err) | 253 | if (IS_ERR(rt)) |
187 | return err; | 254 | return rt; |
188 | fl.fl4_dst = (*rp)->rt_dst; | 255 | fl4.daddr = rt->rt_dst; |
189 | fl.fl4_src = (*rp)->rt_src; | 256 | fl4.saddr = rt->rt_src; |
190 | ip_rt_put(*rp); | 257 | ip_rt_put(rt); |
191 | *rp = NULL; | ||
192 | } | 258 | } |
193 | security_sk_classify_flow(sk, &fl); | 259 | security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); |
194 | return ip_route_output_flow(net, rp, &fl, sk, flags); | 260 | return ip_route_output_flow(net, &fl4, sk); |
195 | } | 261 | } |
196 | 262 | ||
197 | static inline int ip_route_newports(struct rtable **rp, u8 protocol, | 263 | static inline struct rtable *ip_route_newports(struct rtable *rt, |
198 | __be16 sport, __be16 dport, struct sock *sk) | 264 | u8 protocol, __be16 orig_sport, |
265 | __be16 orig_dport, __be16 sport, | ||
266 | __be16 dport, struct sock *sk) | ||
199 | { | 267 | { |
200 | if (sport != (*rp)->fl.fl_ip_sport || | 268 | if (sport != orig_sport || dport != orig_dport) { |
201 | dport != (*rp)->fl.fl_ip_dport) { | 269 | struct flowi4 fl4 = { |
202 | struct flowi fl; | 270 | .flowi4_oif = rt->rt_oif, |
203 | 271 | .flowi4_mark = rt->rt_mark, | |
204 | memcpy(&fl, &(*rp)->fl, sizeof(fl)); | 272 | .daddr = rt->rt_key_dst, |
205 | fl.fl_ip_sport = sport; | 273 | .saddr = rt->rt_key_src, |
206 | fl.fl_ip_dport = dport; | 274 | .flowi4_tos = rt->rt_tos, |
207 | fl.proto = protocol; | 275 | .flowi4_proto = protocol, |
276 | .fl4_sport = sport, | ||
277 | .fl4_dport = dport | ||
278 | }; | ||
208 | if (inet_sk(sk)->transparent) | 279 | if (inet_sk(sk)->transparent) |
209 | fl.flags |= FLOWI_FLAG_ANYSRC; | 280 | fl4.flowi4_flags |= FLOWI_FLAG_ANYSRC; |
210 | ip_rt_put(*rp); | 281 | if (protocol == IPPROTO_TCP) |
211 | *rp = NULL; | 282 | fl4.flowi4_flags |= FLOWI_FLAG_PRECOW_METRICS; |
212 | security_sk_classify_flow(sk, &fl); | 283 | ip_rt_put(rt); |
213 | return ip_route_output_flow(sock_net(sk), rp, &fl, sk, 0); | 284 | security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); |
285 | return ip_route_output_flow(sock_net(sk), &fl4, sk); | ||
214 | } | 286 | } |
215 | return 0; | 287 | return rt; |
216 | } | 288 | } |
217 | 289 | ||
218 | extern void rt_bind_peer(struct rtable *rt, int create); | 290 | extern void rt_bind_peer(struct rtable *rt, int create); |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 04f8556313d5..a9505b6a18e3 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -31,10 +31,12 @@ enum qdisc_state_t { | |||
31 | * following bits are only changed while qdisc lock is held | 31 | * following bits are only changed while qdisc lock is held |
32 | */ | 32 | */ |
33 | enum qdisc___state_t { | 33 | enum qdisc___state_t { |
34 | __QDISC___STATE_RUNNING, | 34 | __QDISC___STATE_RUNNING = 1, |
35 | __QDISC___STATE_THROTTLED = 2, | ||
35 | }; | 36 | }; |
36 | 37 | ||
37 | struct qdisc_size_table { | 38 | struct qdisc_size_table { |
39 | struct rcu_head rcu; | ||
38 | struct list_head list; | 40 | struct list_head list; |
39 | struct tc_sizespec szopts; | 41 | struct tc_sizespec szopts; |
40 | int refcnt; | 42 | int refcnt; |
@@ -46,14 +48,13 @@ struct Qdisc { | |||
46 | struct sk_buff * (*dequeue)(struct Qdisc *dev); | 48 | struct sk_buff * (*dequeue)(struct Qdisc *dev); |
47 | unsigned flags; | 49 | unsigned flags; |
48 | #define TCQ_F_BUILTIN 1 | 50 | #define TCQ_F_BUILTIN 1 |
49 | #define TCQ_F_THROTTLED 2 | 51 | #define TCQ_F_INGRESS 2 |
50 | #define TCQ_F_INGRESS 4 | 52 | #define TCQ_F_CAN_BYPASS 4 |
51 | #define TCQ_F_CAN_BYPASS 8 | 53 | #define TCQ_F_MQROOT 8 |
52 | #define TCQ_F_MQROOT 16 | ||
53 | #define TCQ_F_WARN_NONWC (1 << 16) | 54 | #define TCQ_F_WARN_NONWC (1 << 16) |
54 | int padded; | 55 | int padded; |
55 | struct Qdisc_ops *ops; | 56 | struct Qdisc_ops *ops; |
56 | struct qdisc_size_table *stab; | 57 | struct qdisc_size_table __rcu *stab; |
57 | struct list_head list; | 58 | struct list_head list; |
58 | u32 handle; | 59 | u32 handle; |
59 | u32 parent; | 60 | u32 parent; |
@@ -78,25 +79,44 @@ struct Qdisc { | |||
78 | unsigned long state; | 79 | unsigned long state; |
79 | struct sk_buff_head q; | 80 | struct sk_buff_head q; |
80 | struct gnet_stats_basic_packed bstats; | 81 | struct gnet_stats_basic_packed bstats; |
81 | unsigned long __state; | 82 | unsigned int __state; |
82 | struct gnet_stats_queue qstats; | 83 | struct gnet_stats_queue qstats; |
83 | struct rcu_head rcu_head; | 84 | struct rcu_head rcu_head; |
84 | spinlock_t busylock; | 85 | spinlock_t busylock; |
86 | u32 limit; | ||
85 | }; | 87 | }; |
86 | 88 | ||
87 | static inline bool qdisc_is_running(struct Qdisc *qdisc) | 89 | static inline bool qdisc_is_running(const struct Qdisc *qdisc) |
88 | { | 90 | { |
89 | return test_bit(__QDISC___STATE_RUNNING, &qdisc->__state); | 91 | return (qdisc->__state & __QDISC___STATE_RUNNING) ? true : false; |
90 | } | 92 | } |
91 | 93 | ||
92 | static inline bool qdisc_run_begin(struct Qdisc *qdisc) | 94 | static inline bool qdisc_run_begin(struct Qdisc *qdisc) |
93 | { | 95 | { |
94 | return !__test_and_set_bit(__QDISC___STATE_RUNNING, &qdisc->__state); | 96 | if (qdisc_is_running(qdisc)) |
97 | return false; | ||
98 | qdisc->__state |= __QDISC___STATE_RUNNING; | ||
99 | return true; | ||
95 | } | 100 | } |
96 | 101 | ||
97 | static inline void qdisc_run_end(struct Qdisc *qdisc) | 102 | static inline void qdisc_run_end(struct Qdisc *qdisc) |
98 | { | 103 | { |
99 | __clear_bit(__QDISC___STATE_RUNNING, &qdisc->__state); | 104 | qdisc->__state &= ~__QDISC___STATE_RUNNING; |
105 | } | ||
106 | |||
107 | static inline bool qdisc_is_throttled(const struct Qdisc *qdisc) | ||
108 | { | ||
109 | return (qdisc->__state & __QDISC___STATE_THROTTLED) ? true : false; | ||
110 | } | ||
111 | |||
112 | static inline void qdisc_throttled(struct Qdisc *qdisc) | ||
113 | { | ||
114 | qdisc->__state |= __QDISC___STATE_THROTTLED; | ||
115 | } | ||
116 | |||
117 | static inline void qdisc_unthrottled(struct Qdisc *qdisc) | ||
118 | { | ||
119 | qdisc->__state &= ~__QDISC___STATE_THROTTLED; | ||
100 | } | 120 | } |
101 | 121 | ||
102 | struct Qdisc_class_ops { | 122 | struct Qdisc_class_ops { |
@@ -331,8 +351,8 @@ extern struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, | |||
331 | struct Qdisc_ops *ops); | 351 | struct Qdisc_ops *ops); |
332 | extern struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, | 352 | extern struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, |
333 | struct Qdisc_ops *ops, u32 parentid); | 353 | struct Qdisc_ops *ops, u32 parentid); |
334 | extern void qdisc_calculate_pkt_len(struct sk_buff *skb, | 354 | extern void __qdisc_calculate_pkt_len(struct sk_buff *skb, |
335 | struct qdisc_size_table *stab); | 355 | const struct qdisc_size_table *stab); |
336 | extern void tcf_destroy(struct tcf_proto *tp); | 356 | extern void tcf_destroy(struct tcf_proto *tp); |
337 | extern void tcf_destroy_chain(struct tcf_proto **fl); | 357 | extern void tcf_destroy_chain(struct tcf_proto **fl); |
338 | 358 | ||
@@ -411,12 +431,20 @@ enum net_xmit_qdisc_t { | |||
411 | #define net_xmit_drop_count(e) (1) | 431 | #define net_xmit_drop_count(e) (1) |
412 | #endif | 432 | #endif |
413 | 433 | ||
414 | static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | 434 | static inline void qdisc_calculate_pkt_len(struct sk_buff *skb, |
435 | const struct Qdisc *sch) | ||
415 | { | 436 | { |
416 | #ifdef CONFIG_NET_SCHED | 437 | #ifdef CONFIG_NET_SCHED |
417 | if (sch->stab) | 438 | struct qdisc_size_table *stab = rcu_dereference_bh(sch->stab); |
418 | qdisc_calculate_pkt_len(skb, sch->stab); | 439 | |
440 | if (stab) | ||
441 | __qdisc_calculate_pkt_len(skb, stab); | ||
419 | #endif | 442 | #endif |
443 | } | ||
444 | |||
445 | static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
446 | { | ||
447 | qdisc_calculate_pkt_len(skb, sch); | ||
420 | return sch->enqueue(skb, sch); | 448 | return sch->enqueue(skb, sch); |
421 | } | 449 | } |
422 | 450 | ||
diff --git a/include/net/snmp.h b/include/net/snmp.h index 762e2abce889..27461d6dd46f 100644 --- a/include/net/snmp.h +++ b/include/net/snmp.h | |||
@@ -150,7 +150,7 @@ struct linux_xfrm_mib { | |||
150 | #define SNMP_UPD_PO_STATS_BH(mib, basefield, addend) \ | 150 | #define SNMP_UPD_PO_STATS_BH(mib, basefield, addend) \ |
151 | do { \ | 151 | do { \ |
152 | __typeof__(*mib[0]) *ptr = \ | 152 | __typeof__(*mib[0]) *ptr = \ |
153 | __this_cpu_ptr((mib)[!in_softirq()]); \ | 153 | __this_cpu_ptr((mib)[0]); \ |
154 | ptr->mibs[basefield##PKTS]++; \ | 154 | ptr->mibs[basefield##PKTS]++; \ |
155 | ptr->mibs[basefield##OCTETS] += addend;\ | 155 | ptr->mibs[basefield##OCTETS] += addend;\ |
156 | } while (0) | 156 | } while (0) |
@@ -202,7 +202,7 @@ struct linux_xfrm_mib { | |||
202 | #define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend) \ | 202 | #define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend) \ |
203 | do { \ | 203 | do { \ |
204 | __typeof__(*mib[0]) *ptr; \ | 204 | __typeof__(*mib[0]) *ptr; \ |
205 | ptr = __this_cpu_ptr((mib)[!in_softirq()]); \ | 205 | ptr = __this_cpu_ptr((mib)[0]); \ |
206 | u64_stats_update_begin(&ptr->syncp); \ | 206 | u64_stats_update_begin(&ptr->syncp); \ |
207 | ptr->mibs[basefield##PKTS]++; \ | 207 | ptr->mibs[basefield##PKTS]++; \ |
208 | ptr->mibs[basefield##OCTETS] += addend; \ | 208 | ptr->mibs[basefield##OCTETS] += addend; \ |
diff --git a/include/net/sock.h b/include/net/sock.h index bc1cf7d88ccb..da0534d3401c 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -281,7 +281,7 @@ struct sock { | |||
281 | int sk_rcvbuf; | 281 | int sk_rcvbuf; |
282 | 282 | ||
283 | struct sk_filter __rcu *sk_filter; | 283 | struct sk_filter __rcu *sk_filter; |
284 | struct socket_wq *sk_wq; | 284 | struct socket_wq __rcu *sk_wq; |
285 | 285 | ||
286 | #ifdef CONFIG_NET_DMA | 286 | #ifdef CONFIG_NET_DMA |
287 | struct sk_buff_head sk_async_wait_queue; | 287 | struct sk_buff_head sk_async_wait_queue; |
@@ -1191,7 +1191,7 @@ extern void sk_filter_release_rcu(struct rcu_head *rcu); | |||
1191 | static inline void sk_filter_release(struct sk_filter *fp) | 1191 | static inline void sk_filter_release(struct sk_filter *fp) |
1192 | { | 1192 | { |
1193 | if (atomic_dec_and_test(&fp->refcnt)) | 1193 | if (atomic_dec_and_test(&fp->refcnt)) |
1194 | call_rcu_bh(&fp->rcu, sk_filter_release_rcu); | 1194 | call_rcu(&fp->rcu, sk_filter_release_rcu); |
1195 | } | 1195 | } |
1196 | 1196 | ||
1197 | static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp) | 1197 | static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp) |
@@ -1266,7 +1266,8 @@ static inline void sk_set_socket(struct sock *sk, struct socket *sock) | |||
1266 | 1266 | ||
1267 | static inline wait_queue_head_t *sk_sleep(struct sock *sk) | 1267 | static inline wait_queue_head_t *sk_sleep(struct sock *sk) |
1268 | { | 1268 | { |
1269 | return &sk->sk_wq->wait; | 1269 | BUILD_BUG_ON(offsetof(struct socket_wq, wait) != 0); |
1270 | return &rcu_dereference_raw(sk->sk_wq)->wait; | ||
1270 | } | 1271 | } |
1271 | /* Detach socket from process context. | 1272 | /* Detach socket from process context. |
1272 | * Announce socket dead, detach it from wait queue and inode. | 1273 | * Announce socket dead, detach it from wait queue and inode. |
@@ -1287,7 +1288,7 @@ static inline void sock_orphan(struct sock *sk) | |||
1287 | static inline void sock_graft(struct sock *sk, struct socket *parent) | 1288 | static inline void sock_graft(struct sock *sk, struct socket *parent) |
1288 | { | 1289 | { |
1289 | write_lock_bh(&sk->sk_callback_lock); | 1290 | write_lock_bh(&sk->sk_callback_lock); |
1290 | rcu_assign_pointer(sk->sk_wq, parent->wq); | 1291 | sk->sk_wq = parent->wq; |
1291 | parent->sk = sk; | 1292 | parent->sk = sk; |
1292 | sk_set_socket(sk, parent); | 1293 | sk_set_socket(sk, parent); |
1293 | security_sock_graft(sk, parent); | 1294 | security_sock_graft(sk, parent); |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 38509f047382..cda30ea354a2 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -196,6 +196,9 @@ extern void tcp_time_wait(struct sock *sk, int state, int timeo); | |||
196 | /* TCP thin-stream limits */ | 196 | /* TCP thin-stream limits */ |
197 | #define TCP_THIN_LINEAR_RETRIES 6 /* After 6 linear retries, do exp. backoff */ | 197 | #define TCP_THIN_LINEAR_RETRIES 6 /* After 6 linear retries, do exp. backoff */ |
198 | 198 | ||
199 | /* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */ | ||
200 | #define TCP_INIT_CWND 10 | ||
201 | |||
199 | extern struct inet_timewait_death_row tcp_death_row; | 202 | extern struct inet_timewait_death_row tcp_death_row; |
200 | 203 | ||
201 | /* sysctl variables for tcp */ | 204 | /* sysctl variables for tcp */ |
@@ -799,15 +802,6 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk) | |||
799 | /* Use define here intentionally to get WARN_ON location shown at the caller */ | 802 | /* Use define here intentionally to get WARN_ON location shown at the caller */ |
800 | #define tcp_verify_left_out(tp) WARN_ON(tcp_left_out(tp) > tp->packets_out) | 803 | #define tcp_verify_left_out(tp) WARN_ON(tcp_left_out(tp) > tp->packets_out) |
801 | 804 | ||
802 | /* | ||
803 | * Convert RFC 3390 larger initial window into an equivalent number of packets. | ||
804 | * This is based on the numbers specified in RFC 5681, 3.1. | ||
805 | */ | ||
806 | static inline u32 rfc3390_bytes_to_packets(const u32 smss) | ||
807 | { | ||
808 | return smss <= 1095 ? 4 : (smss > 2190 ? 2 : 3); | ||
809 | } | ||
810 | |||
811 | extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh); | 805 | extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh); |
812 | extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst); | 806 | extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst); |
813 | 807 | ||
@@ -1074,8 +1068,6 @@ static inline int tcp_paws_reject(const struct tcp_options_received *rx_opt, | |||
1074 | return 1; | 1068 | return 1; |
1075 | } | 1069 | } |
1076 | 1070 | ||
1077 | #define TCP_CHECK_TIMER(sk) do { } while (0) | ||
1078 | |||
1079 | static inline void tcp_mib_init(struct net *net) | 1071 | static inline void tcp_mib_init(struct net *net) |
1080 | { | 1072 | { |
1081 | /* See RFC 2012 */ | 1073 | /* See RFC 2012 */ |
@@ -1404,7 +1396,7 @@ extern struct request_sock_ops tcp6_request_sock_ops; | |||
1404 | extern void tcp_v4_destroy_sock(struct sock *sk); | 1396 | extern void tcp_v4_destroy_sock(struct sock *sk); |
1405 | 1397 | ||
1406 | extern int tcp_v4_gso_send_check(struct sk_buff *skb); | 1398 | extern int tcp_v4_gso_send_check(struct sk_buff *skb); |
1407 | extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features); | 1399 | extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, u32 features); |
1408 | extern struct sk_buff **tcp_gro_receive(struct sk_buff **head, | 1400 | extern struct sk_buff **tcp_gro_receive(struct sk_buff **head, |
1409 | struct sk_buff *skb); | 1401 | struct sk_buff *skb); |
1410 | extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head, | 1402 | extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head, |
diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h index 42a0eb68b7b6..eeb077dd735f 100644 --- a/include/net/transp_v6.h +++ b/include/net/transp_v6.h | |||
@@ -14,7 +14,7 @@ extern struct proto udpv6_prot; | |||
14 | extern struct proto udplitev6_prot; | 14 | extern struct proto udplitev6_prot; |
15 | extern struct proto tcpv6_prot; | 15 | extern struct proto tcpv6_prot; |
16 | 16 | ||
17 | struct flowi; | 17 | struct flowi6; |
18 | 18 | ||
19 | /* extention headers */ | 19 | /* extention headers */ |
20 | extern int ipv6_exthdrs_init(void); | 20 | extern int ipv6_exthdrs_init(void); |
@@ -42,7 +42,7 @@ extern int datagram_recv_ctl(struct sock *sk, | |||
42 | 42 | ||
43 | extern int datagram_send_ctl(struct net *net, | 43 | extern int datagram_send_ctl(struct net *net, |
44 | struct msghdr *msg, | 44 | struct msghdr *msg, |
45 | struct flowi *fl, | 45 | struct flowi6 *fl6, |
46 | struct ipv6_txoptions *opt, | 46 | struct ipv6_txoptions *opt, |
47 | int *hlimit, int *tclass, | 47 | int *hlimit, int *tclass, |
48 | int *dontfrag); | 48 | int *dontfrag); |
diff --git a/include/net/udp.h b/include/net/udp.h index bb967dd59bf7..67ea6fcb3ec0 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -144,6 +144,17 @@ static inline __wsum udp_csum_outgoing(struct sock *sk, struct sk_buff *skb) | |||
144 | return csum; | 144 | return csum; |
145 | } | 145 | } |
146 | 146 | ||
147 | static inline __wsum udp_csum(struct sk_buff *skb) | ||
148 | { | ||
149 | __wsum csum = csum_partial(skb_transport_header(skb), | ||
150 | sizeof(struct udphdr), skb->csum); | ||
151 | |||
152 | for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) { | ||
153 | csum = csum_add(csum, skb->csum); | ||
154 | } | ||
155 | return csum; | ||
156 | } | ||
157 | |||
147 | /* hash routines shared between UDPv4/6 and UDP-Litev4/6 */ | 158 | /* hash routines shared between UDPv4/6 and UDP-Litev4/6 */ |
148 | static inline void udp_lib_hash(struct sock *sk) | 159 | static inline void udp_lib_hash(struct sock *sk) |
149 | { | 160 | { |
@@ -245,5 +256,5 @@ extern void udp4_proc_exit(void); | |||
245 | extern void udp_init(void); | 256 | extern void udp_init(void); |
246 | 257 | ||
247 | extern int udp4_ufo_send_check(struct sk_buff *skb); | 258 | extern int udp4_ufo_send_check(struct sk_buff *skb); |
248 | extern struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, int features); | 259 | extern struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, u32 features); |
249 | #endif /* _UDP_H */ | 260 | #endif /* _UDP_H */ |
diff --git a/include/net/udplite.h b/include/net/udplite.h index afdffe607b24..673a024c6b2a 100644 --- a/include/net/udplite.h +++ b/include/net/udplite.h | |||
@@ -115,6 +115,18 @@ static inline __wsum udplite_csum_outgoing(struct sock *sk, struct sk_buff *skb) | |||
115 | return csum; | 115 | return csum; |
116 | } | 116 | } |
117 | 117 | ||
118 | static inline __wsum udplite_csum(struct sk_buff *skb) | ||
119 | { | ||
120 | struct sock *sk = skb->sk; | ||
121 | int cscov = udplite_sender_cscov(udp_sk(sk), udp_hdr(skb)); | ||
122 | const int off = skb_transport_offset(skb); | ||
123 | const int len = skb->len - off; | ||
124 | |||
125 | skb->ip_summed = CHECKSUM_NONE; /* no HW support for checksumming */ | ||
126 | |||
127 | return skb_checksum(skb, off, min(cscov, len), 0); | ||
128 | } | ||
129 | |||
118 | extern void udplite4_register(void); | 130 | extern void udplite4_register(void); |
119 | extern int udplite_get_port(struct sock *sk, unsigned short snum, | 131 | extern int udplite_get_port(struct sock *sk, unsigned short snum, |
120 | int (*scmp)(const struct sock *, const struct sock *)); | 132 | int (*scmp)(const struct sock *, const struct sock *)); |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index b9f385da758e..cffa5dc66449 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -36,6 +36,7 @@ | |||
36 | #define XFRM_PROTO_ROUTING IPPROTO_ROUTING | 36 | #define XFRM_PROTO_ROUTING IPPROTO_ROUTING |
37 | #define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS | 37 | #define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS |
38 | 38 | ||
39 | #define XFRM_ALIGN4(len) (((len) + 3) & ~3) | ||
39 | #define XFRM_ALIGN8(len) (((len) + 7) & ~7) | 40 | #define XFRM_ALIGN8(len) (((len) + 7) & ~7) |
40 | #define MODULE_ALIAS_XFRM_MODE(family, encap) \ | 41 | #define MODULE_ALIAS_XFRM_MODE(family, encap) \ |
41 | MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap)) | 42 | MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap)) |
@@ -185,9 +186,14 @@ struct xfrm_state { | |||
185 | 186 | ||
186 | /* State for replay detection */ | 187 | /* State for replay detection */ |
187 | struct xfrm_replay_state replay; | 188 | struct xfrm_replay_state replay; |
189 | struct xfrm_replay_state_esn *replay_esn; | ||
188 | 190 | ||
189 | /* Replay detection state at the time we sent the last notification */ | 191 | /* Replay detection state at the time we sent the last notification */ |
190 | struct xfrm_replay_state preplay; | 192 | struct xfrm_replay_state preplay; |
193 | struct xfrm_replay_state_esn *preplay_esn; | ||
194 | |||
195 | /* The functions for replay detection. */ | ||
196 | struct xfrm_replay *repl; | ||
191 | 197 | ||
192 | /* internal flag that only holds state for delayed aevent at the | 198 | /* internal flag that only holds state for delayed aevent at the |
193 | * moment | 199 | * moment |
@@ -258,6 +264,15 @@ struct km_event { | |||
258 | struct net *net; | 264 | struct net *net; |
259 | }; | 265 | }; |
260 | 266 | ||
267 | struct xfrm_replay { | ||
268 | void (*advance)(struct xfrm_state *x, __be32 net_seq); | ||
269 | int (*check)(struct xfrm_state *x, | ||
270 | struct sk_buff *skb, | ||
271 | __be32 net_seq); | ||
272 | void (*notify)(struct xfrm_state *x, int event); | ||
273 | int (*overflow)(struct xfrm_state *x, struct sk_buff *skb); | ||
274 | }; | ||
275 | |||
261 | struct net_device; | 276 | struct net_device; |
262 | struct xfrm_type; | 277 | struct xfrm_type; |
263 | struct xfrm_dst; | 278 | struct xfrm_dst; |
@@ -266,25 +281,26 @@ struct xfrm_policy_afinfo { | |||
266 | struct dst_ops *dst_ops; | 281 | struct dst_ops *dst_ops; |
267 | void (*garbage_collect)(struct net *net); | 282 | void (*garbage_collect)(struct net *net); |
268 | struct dst_entry *(*dst_lookup)(struct net *net, int tos, | 283 | struct dst_entry *(*dst_lookup)(struct net *net, int tos, |
269 | xfrm_address_t *saddr, | 284 | const xfrm_address_t *saddr, |
270 | xfrm_address_t *daddr); | 285 | const xfrm_address_t *daddr); |
271 | int (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr); | 286 | int (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr); |
272 | void (*decode_session)(struct sk_buff *skb, | 287 | void (*decode_session)(struct sk_buff *skb, |
273 | struct flowi *fl, | 288 | struct flowi *fl, |
274 | int reverse); | 289 | int reverse); |
275 | int (*get_tos)(struct flowi *fl); | 290 | int (*get_tos)(const struct flowi *fl); |
276 | int (*init_path)(struct xfrm_dst *path, | 291 | int (*init_path)(struct xfrm_dst *path, |
277 | struct dst_entry *dst, | 292 | struct dst_entry *dst, |
278 | int nfheader_len); | 293 | int nfheader_len); |
279 | int (*fill_dst)(struct xfrm_dst *xdst, | 294 | int (*fill_dst)(struct xfrm_dst *xdst, |
280 | struct net_device *dev, | 295 | struct net_device *dev, |
281 | struct flowi *fl); | 296 | const struct flowi *fl); |
297 | struct dst_entry *(*blackhole_route)(struct net *net, struct dst_entry *orig); | ||
282 | }; | 298 | }; |
283 | 299 | ||
284 | extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); | 300 | extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); |
285 | extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo); | 301 | extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo); |
286 | extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c); | 302 | extern void km_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c); |
287 | extern void km_state_notify(struct xfrm_state *x, struct km_event *c); | 303 | extern void km_state_notify(struct xfrm_state *x, const struct km_event *c); |
288 | 304 | ||
289 | struct xfrm_tmpl; | 305 | struct xfrm_tmpl; |
290 | extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol); | 306 | extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol); |
@@ -299,9 +315,12 @@ struct xfrm_state_afinfo { | |||
299 | const struct xfrm_type *type_map[IPPROTO_MAX]; | 315 | const struct xfrm_type *type_map[IPPROTO_MAX]; |
300 | struct xfrm_mode *mode_map[XFRM_MODE_MAX]; | 316 | struct xfrm_mode *mode_map[XFRM_MODE_MAX]; |
301 | int (*init_flags)(struct xfrm_state *x); | 317 | int (*init_flags)(struct xfrm_state *x); |
302 | void (*init_tempsel)(struct xfrm_selector *sel, struct flowi *fl); | 318 | void (*init_tempsel)(struct xfrm_selector *sel, |
303 | void (*init_temprop)(struct xfrm_state *x, struct xfrm_tmpl *tmpl, | 319 | const struct flowi *fl); |
304 | xfrm_address_t *daddr, xfrm_address_t *saddr); | 320 | void (*init_temprop)(struct xfrm_state *x, |
321 | const struct xfrm_tmpl *tmpl, | ||
322 | const xfrm_address_t *daddr, | ||
323 | const xfrm_address_t *saddr); | ||
305 | int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n); | 324 | int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n); |
306 | int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n); | 325 | int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n); |
307 | int (*output)(struct sk_buff *skb); | 326 | int (*output)(struct sk_buff *skb); |
@@ -332,7 +351,8 @@ struct xfrm_type { | |||
332 | void (*destructor)(struct xfrm_state *); | 351 | void (*destructor)(struct xfrm_state *); |
333 | int (*input)(struct xfrm_state *, struct sk_buff *skb); | 352 | int (*input)(struct xfrm_state *, struct sk_buff *skb); |
334 | int (*output)(struct xfrm_state *, struct sk_buff *pskb); | 353 | int (*output)(struct xfrm_state *, struct sk_buff *pskb); |
335 | int (*reject)(struct xfrm_state *, struct sk_buff *, struct flowi *); | 354 | int (*reject)(struct xfrm_state *, struct sk_buff *, |
355 | const struct flowi *); | ||
336 | int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **); | 356 | int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **); |
337 | /* Estimate maximal size of result of transformation of a dgram */ | 357 | /* Estimate maximal size of result of transformation of a dgram */ |
338 | u32 (*get_mtu)(struct xfrm_state *, int size); | 358 | u32 (*get_mtu)(struct xfrm_state *, int size); |
@@ -501,7 +521,7 @@ struct xfrm_policy { | |||
501 | struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH]; | 521 | struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH]; |
502 | }; | 522 | }; |
503 | 523 | ||
504 | static inline struct net *xp_net(struct xfrm_policy *xp) | 524 | static inline struct net *xp_net(const struct xfrm_policy *xp) |
505 | { | 525 | { |
506 | return read_pnet(&xp->xp_net); | 526 | return read_pnet(&xp->xp_net); |
507 | } | 527 | } |
@@ -545,13 +565,17 @@ struct xfrm_migrate { | |||
545 | struct xfrm_mgr { | 565 | struct xfrm_mgr { |
546 | struct list_head list; | 566 | struct list_head list; |
547 | char *id; | 567 | char *id; |
548 | int (*notify)(struct xfrm_state *x, struct km_event *c); | 568 | int (*notify)(struct xfrm_state *x, const struct km_event *c); |
549 | int (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir); | 569 | int (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir); |
550 | struct xfrm_policy *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir); | 570 | struct xfrm_policy *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir); |
551 | int (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport); | 571 | int (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport); |
552 | int (*notify_policy)(struct xfrm_policy *x, int dir, struct km_event *c); | 572 | int (*notify_policy)(struct xfrm_policy *x, int dir, const struct km_event *c); |
553 | int (*report)(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr); | 573 | int (*report)(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr); |
554 | int (*migrate)(struct xfrm_selector *sel, u8 dir, u8 type, struct xfrm_migrate *m, int num_bundles, struct xfrm_kmaddress *k); | 574 | int (*migrate)(const struct xfrm_selector *sel, |
575 | u8 dir, u8 type, | ||
576 | const struct xfrm_migrate *m, | ||
577 | int num_bundles, | ||
578 | const struct xfrm_kmaddress *k); | ||
555 | }; | 579 | }; |
556 | 580 | ||
557 | extern int xfrm_register_km(struct xfrm_mgr *km); | 581 | extern int xfrm_register_km(struct xfrm_mgr *km); |
@@ -570,8 +594,14 @@ struct xfrm_skb_cb { | |||
570 | 594 | ||
571 | /* Sequence number for replay protection. */ | 595 | /* Sequence number for replay protection. */ |
572 | union { | 596 | union { |
573 | u64 output; | 597 | struct { |
574 | __be32 input; | 598 | __u32 low; |
599 | __u32 hi; | ||
600 | } output; | ||
601 | struct { | ||
602 | __be32 low; | ||
603 | __be32 hi; | ||
604 | } input; | ||
575 | } seq; | 605 | } seq; |
576 | }; | 606 | }; |
577 | 607 | ||
@@ -675,6 +705,8 @@ extern void xfrm_audit_state_delete(struct xfrm_state *x, int result, | |||
675 | u32 auid, u32 ses, u32 secid); | 705 | u32 auid, u32 ses, u32 secid); |
676 | extern void xfrm_audit_state_replay_overflow(struct xfrm_state *x, | 706 | extern void xfrm_audit_state_replay_overflow(struct xfrm_state *x, |
677 | struct sk_buff *skb); | 707 | struct sk_buff *skb); |
708 | extern void xfrm_audit_state_replay(struct xfrm_state *x, | ||
709 | struct sk_buff *skb, __be32 net_seq); | ||
678 | extern void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family); | 710 | extern void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family); |
679 | extern void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family, | 711 | extern void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family, |
680 | __be32 net_spi, __be32 net_seq); | 712 | __be32 net_spi, __be32 net_seq); |
@@ -707,6 +739,11 @@ static inline void xfrm_audit_state_replay_overflow(struct xfrm_state *x, | |||
707 | { | 739 | { |
708 | } | 740 | } |
709 | 741 | ||
742 | static inline void xfrm_audit_state_replay(struct xfrm_state *x, | ||
743 | struct sk_buff *skb, __be32 net_seq) | ||
744 | { | ||
745 | } | ||
746 | |||
710 | static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb, | 747 | static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb, |
711 | u16 family) | 748 | u16 family) |
712 | { | 749 | { |
@@ -762,10 +799,11 @@ static inline void xfrm_state_hold(struct xfrm_state *x) | |||
762 | atomic_inc(&x->refcnt); | 799 | atomic_inc(&x->refcnt); |
763 | } | 800 | } |
764 | 801 | ||
765 | static __inline__ int addr_match(void *token1, void *token2, int prefixlen) | 802 | static inline bool addr_match(const void *token1, const void *token2, |
803 | int prefixlen) | ||
766 | { | 804 | { |
767 | __be32 *a1 = token1; | 805 | const __be32 *a1 = token1; |
768 | __be32 *a2 = token2; | 806 | const __be32 *a2 = token2; |
769 | int pdw; | 807 | int pdw; |
770 | int pbi; | 808 | int pbi; |
771 | 809 | ||
@@ -774,7 +812,7 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen) | |||
774 | 812 | ||
775 | if (pdw) | 813 | if (pdw) |
776 | if (memcmp(a1, a2, pdw << 2)) | 814 | if (memcmp(a1, a2, pdw << 2)) |
777 | return 0; | 815 | return false; |
778 | 816 | ||
779 | if (pbi) { | 817 | if (pbi) { |
780 | __be32 mask; | 818 | __be32 mask; |
@@ -782,32 +820,32 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen) | |||
782 | mask = htonl((0xffffffff) << (32 - pbi)); | 820 | mask = htonl((0xffffffff) << (32 - pbi)); |
783 | 821 | ||
784 | if ((a1[pdw] ^ a2[pdw]) & mask) | 822 | if ((a1[pdw] ^ a2[pdw]) & mask) |
785 | return 0; | 823 | return false; |
786 | } | 824 | } |
787 | 825 | ||
788 | return 1; | 826 | return true; |
789 | } | 827 | } |
790 | 828 | ||
791 | static __inline__ | 829 | static __inline__ |
792 | __be16 xfrm_flowi_sport(struct flowi *fl) | 830 | __be16 xfrm_flowi_sport(const struct flowi *fl, const union flowi_uli *uli) |
793 | { | 831 | { |
794 | __be16 port; | 832 | __be16 port; |
795 | switch(fl->proto) { | 833 | switch(fl->flowi_proto) { |
796 | case IPPROTO_TCP: | 834 | case IPPROTO_TCP: |
797 | case IPPROTO_UDP: | 835 | case IPPROTO_UDP: |
798 | case IPPROTO_UDPLITE: | 836 | case IPPROTO_UDPLITE: |
799 | case IPPROTO_SCTP: | 837 | case IPPROTO_SCTP: |
800 | port = fl->fl_ip_sport; | 838 | port = uli->ports.sport; |
801 | break; | 839 | break; |
802 | case IPPROTO_ICMP: | 840 | case IPPROTO_ICMP: |
803 | case IPPROTO_ICMPV6: | 841 | case IPPROTO_ICMPV6: |
804 | port = htons(fl->fl_icmp_type); | 842 | port = htons(uli->icmpt.type); |
805 | break; | 843 | break; |
806 | case IPPROTO_MH: | 844 | case IPPROTO_MH: |
807 | port = htons(fl->fl_mh_type); | 845 | port = htons(uli->mht.type); |
808 | break; | 846 | break; |
809 | case IPPROTO_GRE: | 847 | case IPPROTO_GRE: |
810 | port = htons(ntohl(fl->fl_gre_key) >> 16); | 848 | port = htons(ntohl(uli->gre_key) >> 16); |
811 | break; | 849 | break; |
812 | default: | 850 | default: |
813 | port = 0; /*XXX*/ | 851 | port = 0; /*XXX*/ |
@@ -816,22 +854,22 @@ __be16 xfrm_flowi_sport(struct flowi *fl) | |||
816 | } | 854 | } |
817 | 855 | ||
818 | static __inline__ | 856 | static __inline__ |
819 | __be16 xfrm_flowi_dport(struct flowi *fl) | 857 | __be16 xfrm_flowi_dport(const struct flowi *fl, const union flowi_uli *uli) |
820 | { | 858 | { |
821 | __be16 port; | 859 | __be16 port; |
822 | switch(fl->proto) { | 860 | switch(fl->flowi_proto) { |
823 | case IPPROTO_TCP: | 861 | case IPPROTO_TCP: |
824 | case IPPROTO_UDP: | 862 | case IPPROTO_UDP: |
825 | case IPPROTO_UDPLITE: | 863 | case IPPROTO_UDPLITE: |
826 | case IPPROTO_SCTP: | 864 | case IPPROTO_SCTP: |
827 | port = fl->fl_ip_dport; | 865 | port = uli->ports.dport; |
828 | break; | 866 | break; |
829 | case IPPROTO_ICMP: | 867 | case IPPROTO_ICMP: |
830 | case IPPROTO_ICMPV6: | 868 | case IPPROTO_ICMPV6: |
831 | port = htons(fl->fl_icmp_code); | 869 | port = htons(uli->icmpt.code); |
832 | break; | 870 | break; |
833 | case IPPROTO_GRE: | 871 | case IPPROTO_GRE: |
834 | port = htons(ntohl(fl->fl_gre_key) & 0xffff); | 872 | port = htons(ntohl(uli->gre_key) & 0xffff); |
835 | break; | 873 | break; |
836 | default: | 874 | default: |
837 | port = 0; /*XXX*/ | 875 | port = 0; /*XXX*/ |
@@ -839,7 +877,8 @@ __be16 xfrm_flowi_dport(struct flowi *fl) | |||
839 | return port; | 877 | return port; |
840 | } | 878 | } |
841 | 879 | ||
842 | extern int xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl, | 880 | extern int xfrm_selector_match(const struct xfrm_selector *sel, |
881 | const struct flowi *fl, | ||
843 | unsigned short family); | 882 | unsigned short family); |
844 | 883 | ||
845 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 884 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
@@ -947,7 +986,7 @@ secpath_reset(struct sk_buff *skb) | |||
947 | } | 986 | } |
948 | 987 | ||
949 | static inline int | 988 | static inline int |
950 | xfrm_addr_any(xfrm_address_t *addr, unsigned short family) | 989 | xfrm_addr_any(const xfrm_address_t *addr, unsigned short family) |
951 | { | 990 | { |
952 | switch (family) { | 991 | switch (family) { |
953 | case AF_INET: | 992 | case AF_INET: |
@@ -959,21 +998,21 @@ xfrm_addr_any(xfrm_address_t *addr, unsigned short family) | |||
959 | } | 998 | } |
960 | 999 | ||
961 | static inline int | 1000 | static inline int |
962 | __xfrm4_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x) | 1001 | __xfrm4_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x) |
963 | { | 1002 | { |
964 | return (tmpl->saddr.a4 && | 1003 | return (tmpl->saddr.a4 && |
965 | tmpl->saddr.a4 != x->props.saddr.a4); | 1004 | tmpl->saddr.a4 != x->props.saddr.a4); |
966 | } | 1005 | } |
967 | 1006 | ||
968 | static inline int | 1007 | static inline int |
969 | __xfrm6_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x) | 1008 | __xfrm6_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x) |
970 | { | 1009 | { |
971 | return (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) && | 1010 | return (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) && |
972 | ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr)); | 1011 | ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr)); |
973 | } | 1012 | } |
974 | 1013 | ||
975 | static inline int | 1014 | static inline int |
976 | xfrm_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x, unsigned short family) | 1015 | xfrm_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x, unsigned short family) |
977 | { | 1016 | { |
978 | switch (family) { | 1017 | switch (family) { |
979 | case AF_INET: | 1018 | case AF_INET: |
@@ -1126,49 +1165,49 @@ static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir, | |||
1126 | #endif | 1165 | #endif |
1127 | 1166 | ||
1128 | static __inline__ | 1167 | static __inline__ |
1129 | xfrm_address_t *xfrm_flowi_daddr(struct flowi *fl, unsigned short family) | 1168 | xfrm_address_t *xfrm_flowi_daddr(const struct flowi *fl, unsigned short family) |
1130 | { | 1169 | { |
1131 | switch (family){ | 1170 | switch (family){ |
1132 | case AF_INET: | 1171 | case AF_INET: |
1133 | return (xfrm_address_t *)&fl->fl4_dst; | 1172 | return (xfrm_address_t *)&fl->u.ip4.daddr; |
1134 | case AF_INET6: | 1173 | case AF_INET6: |
1135 | return (xfrm_address_t *)&fl->fl6_dst; | 1174 | return (xfrm_address_t *)&fl->u.ip6.daddr; |
1136 | } | 1175 | } |
1137 | return NULL; | 1176 | return NULL; |
1138 | } | 1177 | } |
1139 | 1178 | ||
1140 | static __inline__ | 1179 | static __inline__ |
1141 | xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family) | 1180 | xfrm_address_t *xfrm_flowi_saddr(const struct flowi *fl, unsigned short family) |
1142 | { | 1181 | { |
1143 | switch (family){ | 1182 | switch (family){ |
1144 | case AF_INET: | 1183 | case AF_INET: |
1145 | return (xfrm_address_t *)&fl->fl4_src; | 1184 | return (xfrm_address_t *)&fl->u.ip4.saddr; |
1146 | case AF_INET6: | 1185 | case AF_INET6: |
1147 | return (xfrm_address_t *)&fl->fl6_src; | 1186 | return (xfrm_address_t *)&fl->u.ip6.saddr; |
1148 | } | 1187 | } |
1149 | return NULL; | 1188 | return NULL; |
1150 | } | 1189 | } |
1151 | 1190 | ||
1152 | static __inline__ | 1191 | static __inline__ |
1153 | void xfrm_flowi_addr_get(struct flowi *fl, | 1192 | void xfrm_flowi_addr_get(const struct flowi *fl, |
1154 | xfrm_address_t *saddr, xfrm_address_t *daddr, | 1193 | xfrm_address_t *saddr, xfrm_address_t *daddr, |
1155 | unsigned short family) | 1194 | unsigned short family) |
1156 | { | 1195 | { |
1157 | switch(family) { | 1196 | switch(family) { |
1158 | case AF_INET: | 1197 | case AF_INET: |
1159 | memcpy(&saddr->a4, &fl->fl4_src, sizeof(saddr->a4)); | 1198 | memcpy(&saddr->a4, &fl->u.ip4.saddr, sizeof(saddr->a4)); |
1160 | memcpy(&daddr->a4, &fl->fl4_dst, sizeof(daddr->a4)); | 1199 | memcpy(&daddr->a4, &fl->u.ip4.daddr, sizeof(daddr->a4)); |
1161 | break; | 1200 | break; |
1162 | case AF_INET6: | 1201 | case AF_INET6: |
1163 | ipv6_addr_copy((struct in6_addr *)&saddr->a6, &fl->fl6_src); | 1202 | ipv6_addr_copy((struct in6_addr *)&saddr->a6, &fl->u.ip6.saddr); |
1164 | ipv6_addr_copy((struct in6_addr *)&daddr->a6, &fl->fl6_dst); | 1203 | ipv6_addr_copy((struct in6_addr *)&daddr->a6, &fl->u.ip6.daddr); |
1165 | break; | 1204 | break; |
1166 | } | 1205 | } |
1167 | } | 1206 | } |
1168 | 1207 | ||
1169 | static __inline__ int | 1208 | static __inline__ int |
1170 | __xfrm4_state_addr_check(struct xfrm_state *x, | 1209 | __xfrm4_state_addr_check(const struct xfrm_state *x, |
1171 | xfrm_address_t *daddr, xfrm_address_t *saddr) | 1210 | const xfrm_address_t *daddr, const xfrm_address_t *saddr) |
1172 | { | 1211 | { |
1173 | if (daddr->a4 == x->id.daddr.a4 && | 1212 | if (daddr->a4 == x->id.daddr.a4 && |
1174 | (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4)) | 1213 | (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4)) |
@@ -1177,8 +1216,8 @@ __xfrm4_state_addr_check(struct xfrm_state *x, | |||
1177 | } | 1216 | } |
1178 | 1217 | ||
1179 | static __inline__ int | 1218 | static __inline__ int |
1180 | __xfrm6_state_addr_check(struct xfrm_state *x, | 1219 | __xfrm6_state_addr_check(const struct xfrm_state *x, |
1181 | xfrm_address_t *daddr, xfrm_address_t *saddr) | 1220 | const xfrm_address_t *daddr, const xfrm_address_t *saddr) |
1182 | { | 1221 | { |
1183 | if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) && | 1222 | if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) && |
1184 | (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)|| | 1223 | (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)|| |
@@ -1189,8 +1228,8 @@ __xfrm6_state_addr_check(struct xfrm_state *x, | |||
1189 | } | 1228 | } |
1190 | 1229 | ||
1191 | static __inline__ int | 1230 | static __inline__ int |
1192 | xfrm_state_addr_check(struct xfrm_state *x, | 1231 | xfrm_state_addr_check(const struct xfrm_state *x, |
1193 | xfrm_address_t *daddr, xfrm_address_t *saddr, | 1232 | const xfrm_address_t *daddr, const xfrm_address_t *saddr, |
1194 | unsigned short family) | 1233 | unsigned short family) |
1195 | { | 1234 | { |
1196 | switch (family) { | 1235 | switch (family) { |
@@ -1203,23 +1242,23 @@ xfrm_state_addr_check(struct xfrm_state *x, | |||
1203 | } | 1242 | } |
1204 | 1243 | ||
1205 | static __inline__ int | 1244 | static __inline__ int |
1206 | xfrm_state_addr_flow_check(struct xfrm_state *x, struct flowi *fl, | 1245 | xfrm_state_addr_flow_check(const struct xfrm_state *x, const struct flowi *fl, |
1207 | unsigned short family) | 1246 | unsigned short family) |
1208 | { | 1247 | { |
1209 | switch (family) { | 1248 | switch (family) { |
1210 | case AF_INET: | 1249 | case AF_INET: |
1211 | return __xfrm4_state_addr_check(x, | 1250 | return __xfrm4_state_addr_check(x, |
1212 | (xfrm_address_t *)&fl->fl4_dst, | 1251 | (const xfrm_address_t *)&fl->u.ip4.daddr, |
1213 | (xfrm_address_t *)&fl->fl4_src); | 1252 | (const xfrm_address_t *)&fl->u.ip4.saddr); |
1214 | case AF_INET6: | 1253 | case AF_INET6: |
1215 | return __xfrm6_state_addr_check(x, | 1254 | return __xfrm6_state_addr_check(x, |
1216 | (xfrm_address_t *)&fl->fl6_dst, | 1255 | (const xfrm_address_t *)&fl->u.ip6.daddr, |
1217 | (xfrm_address_t *)&fl->fl6_src); | 1256 | (const xfrm_address_t *)&fl->u.ip6.saddr); |
1218 | } | 1257 | } |
1219 | return 0; | 1258 | return 0; |
1220 | } | 1259 | } |
1221 | 1260 | ||
1222 | static inline int xfrm_state_kern(struct xfrm_state *x) | 1261 | static inline int xfrm_state_kern(const struct xfrm_state *x) |
1223 | { | 1262 | { |
1224 | return atomic_read(&x->tunnel_users); | 1263 | return atomic_read(&x->tunnel_users); |
1225 | } | 1264 | } |
@@ -1323,8 +1362,10 @@ extern int xfrm_state_walk(struct net *net, struct xfrm_state_walk *walk, | |||
1323 | int (*func)(struct xfrm_state *, int, void*), void *); | 1362 | int (*func)(struct xfrm_state *, int, void*), void *); |
1324 | extern void xfrm_state_walk_done(struct xfrm_state_walk *walk); | 1363 | extern void xfrm_state_walk_done(struct xfrm_state_walk *walk); |
1325 | extern struct xfrm_state *xfrm_state_alloc(struct net *net); | 1364 | extern struct xfrm_state *xfrm_state_alloc(struct net *net); |
1326 | extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | 1365 | extern struct xfrm_state *xfrm_state_find(const xfrm_address_t *daddr, |
1327 | struct flowi *fl, struct xfrm_tmpl *tmpl, | 1366 | const xfrm_address_t *saddr, |
1367 | const struct flowi *fl, | ||
1368 | struct xfrm_tmpl *tmpl, | ||
1328 | struct xfrm_policy *pol, int *err, | 1369 | struct xfrm_policy *pol, int *err, |
1329 | unsigned short family); | 1370 | unsigned short family); |
1330 | extern struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark, | 1371 | extern struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark, |
@@ -1337,11 +1378,11 @@ extern void xfrm_state_insert(struct xfrm_state *x); | |||
1337 | extern int xfrm_state_add(struct xfrm_state *x); | 1378 | extern int xfrm_state_add(struct xfrm_state *x); |
1338 | extern int xfrm_state_update(struct xfrm_state *x); | 1379 | extern int xfrm_state_update(struct xfrm_state *x); |
1339 | extern struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark, | 1380 | extern struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark, |
1340 | xfrm_address_t *daddr, __be32 spi, | 1381 | const xfrm_address_t *daddr, __be32 spi, |
1341 | u8 proto, unsigned short family); | 1382 | u8 proto, unsigned short family); |
1342 | extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark, | 1383 | extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark, |
1343 | xfrm_address_t *daddr, | 1384 | const xfrm_address_t *daddr, |
1344 | xfrm_address_t *saddr, | 1385 | const xfrm_address_t *saddr, |
1345 | u8 proto, | 1386 | u8 proto, |
1346 | unsigned short family); | 1387 | unsigned short family); |
1347 | #ifdef CONFIG_XFRM_SUB_POLICY | 1388 | #ifdef CONFIG_XFRM_SUB_POLICY |
@@ -1386,11 +1427,10 @@ extern int xfrm_state_delete(struct xfrm_state *x); | |||
1386 | extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info); | 1427 | extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info); |
1387 | extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si); | 1428 | extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si); |
1388 | extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si); | 1429 | extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si); |
1389 | extern int xfrm_replay_check(struct xfrm_state *x, | 1430 | extern u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq); |
1390 | struct sk_buff *skb, __be32 seq); | 1431 | extern int xfrm_init_replay(struct xfrm_state *x); |
1391 | extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); | ||
1392 | extern void xfrm_replay_notify(struct xfrm_state *x, int event); | ||
1393 | extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); | 1432 | extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); |
1433 | extern int __xfrm_init_state(struct xfrm_state *x, bool init_replay); | ||
1394 | extern int xfrm_init_state(struct xfrm_state *x); | 1434 | extern int xfrm_init_state(struct xfrm_state *x); |
1395 | extern int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb); | 1435 | extern int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb); |
1396 | extern int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, | 1436 | extern int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, |
@@ -1468,19 +1508,19 @@ u32 xfrm_get_acqseq(void); | |||
1468 | extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi); | 1508 | extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi); |
1469 | struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark, | 1509 | struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark, |
1470 | u8 mode, u32 reqid, u8 proto, | 1510 | u8 mode, u32 reqid, u8 proto, |
1471 | xfrm_address_t *daddr, | 1511 | const xfrm_address_t *daddr, |
1472 | xfrm_address_t *saddr, int create, | 1512 | const xfrm_address_t *saddr, int create, |
1473 | unsigned short family); | 1513 | unsigned short family); |
1474 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); | 1514 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); |
1475 | 1515 | ||
1476 | #ifdef CONFIG_XFRM_MIGRATE | 1516 | #ifdef CONFIG_XFRM_MIGRATE |
1477 | extern int km_migrate(struct xfrm_selector *sel, u8 dir, u8 type, | 1517 | extern int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, |
1478 | struct xfrm_migrate *m, int num_bundles, | 1518 | const struct xfrm_migrate *m, int num_bundles, |
1479 | struct xfrm_kmaddress *k); | 1519 | const struct xfrm_kmaddress *k); |
1480 | extern struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m); | 1520 | extern struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m); |
1481 | extern struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x, | 1521 | extern struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x, |
1482 | struct xfrm_migrate *m); | 1522 | struct xfrm_migrate *m); |
1483 | extern int xfrm_migrate(struct xfrm_selector *sel, u8 dir, u8 type, | 1523 | extern int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, |
1484 | struct xfrm_migrate *m, int num_bundles, | 1524 | struct xfrm_migrate *m, int num_bundles, |
1485 | struct xfrm_kmaddress *k); | 1525 | struct xfrm_kmaddress *k); |
1486 | #endif | 1526 | #endif |
@@ -1500,10 +1540,10 @@ extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx); | |||
1500 | extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id); | 1540 | extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id); |
1501 | extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id); | 1541 | extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id); |
1502 | extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id); | 1542 | extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id); |
1503 | extern struct xfrm_algo_desc *xfrm_aalg_get_byname(char *name, int probe); | 1543 | extern struct xfrm_algo_desc *xfrm_aalg_get_byname(const char *name, int probe); |
1504 | extern struct xfrm_algo_desc *xfrm_ealg_get_byname(char *name, int probe); | 1544 | extern struct xfrm_algo_desc *xfrm_ealg_get_byname(const char *name, int probe); |
1505 | extern struct xfrm_algo_desc *xfrm_calg_get_byname(char *name, int probe); | 1545 | extern struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe); |
1506 | extern struct xfrm_algo_desc *xfrm_aead_get_byname(char *name, int icv_len, | 1546 | extern struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len, |
1507 | int probe); | 1547 | int probe); |
1508 | 1548 | ||
1509 | struct hash_desc; | 1549 | struct hash_desc; |
@@ -1511,7 +1551,8 @@ struct scatterlist; | |||
1511 | typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *, | 1551 | typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *, |
1512 | unsigned int); | 1552 | unsigned int); |
1513 | 1553 | ||
1514 | static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b, | 1554 | static inline int xfrm_addr_cmp(const xfrm_address_t *a, |
1555 | const xfrm_address_t *b, | ||
1515 | int family) | 1556 | int family) |
1516 | { | 1557 | { |
1517 | switch (family) { | 1558 | switch (family) { |
@@ -1544,16 +1585,21 @@ static inline int xfrm_aevent_is_on(struct net *net) | |||
1544 | } | 1585 | } |
1545 | #endif | 1586 | #endif |
1546 | 1587 | ||
1547 | static inline int xfrm_alg_len(struct xfrm_algo *alg) | 1588 | static inline int xfrm_alg_len(const struct xfrm_algo *alg) |
1548 | { | 1589 | { |
1549 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | 1590 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); |
1550 | } | 1591 | } |
1551 | 1592 | ||
1552 | static inline int xfrm_alg_auth_len(struct xfrm_algo_auth *alg) | 1593 | static inline int xfrm_alg_auth_len(const struct xfrm_algo_auth *alg) |
1553 | { | 1594 | { |
1554 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | 1595 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); |
1555 | } | 1596 | } |
1556 | 1597 | ||
1598 | static inline int xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay_esn) | ||
1599 | { | ||
1600 | return sizeof(*replay_esn) + replay_esn->bmp_len * sizeof(__u32); | ||
1601 | } | ||
1602 | |||
1557 | #ifdef CONFIG_XFRM_MIGRATE | 1603 | #ifdef CONFIG_XFRM_MIGRATE |
1558 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) | 1604 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) |
1559 | { | 1605 | { |
@@ -1597,7 +1643,7 @@ static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m) | |||
1597 | return m->v & m->m; | 1643 | return m->v & m->m; |
1598 | } | 1644 | } |
1599 | 1645 | ||
1600 | static inline int xfrm_mark_put(struct sk_buff *skb, struct xfrm_mark *m) | 1646 | static inline int xfrm_mark_put(struct sk_buff *skb, const struct xfrm_mark *m) |
1601 | { | 1647 | { |
1602 | if (m->m | m->v) | 1648 | if (m->m | m->v) |
1603 | NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m); | 1649 | NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m); |
diff --git a/include/scsi/fc/fc_ns.h b/include/scsi/fc/fc_ns.h index 185015dd1166..f7751d53f1d3 100644 --- a/include/scsi/fc/fc_ns.h +++ b/include/scsi/fc/fc_ns.h | |||
@@ -41,6 +41,7 @@ enum fc_ns_req { | |||
41 | FC_NS_GI_A = 0x0101, /* get identifiers - scope */ | 41 | FC_NS_GI_A = 0x0101, /* get identifiers - scope */ |
42 | FC_NS_GPN_ID = 0x0112, /* get port name by ID */ | 42 | FC_NS_GPN_ID = 0x0112, /* get port name by ID */ |
43 | FC_NS_GNN_ID = 0x0113, /* get node name by ID */ | 43 | FC_NS_GNN_ID = 0x0113, /* get node name by ID */ |
44 | FC_NS_GSPN_ID = 0x0118, /* get symbolic port name */ | ||
44 | FC_NS_GID_PN = 0x0121, /* get ID for port name */ | 45 | FC_NS_GID_PN = 0x0121, /* get ID for port name */ |
45 | FC_NS_GID_NN = 0x0131, /* get IDs for node name */ | 46 | FC_NS_GID_NN = 0x0131, /* get IDs for node name */ |
46 | FC_NS_GID_FT = 0x0171, /* get IDs by FC4 type */ | 47 | FC_NS_GID_FT = 0x0171, /* get IDs by FC4 type */ |
@@ -144,7 +145,7 @@ struct fc_ns_gid_pn { | |||
144 | }; | 145 | }; |
145 | 146 | ||
146 | /* | 147 | /* |
147 | * GID_PN response | 148 | * GID_PN response or GSPN_ID request |
148 | */ | 149 | */ |
149 | struct fc_gid_pn_resp { | 150 | struct fc_gid_pn_resp { |
150 | __u8 fp_resvd; | 151 | __u8 fp_resvd; |
@@ -152,6 +153,14 @@ struct fc_gid_pn_resp { | |||
152 | }; | 153 | }; |
153 | 154 | ||
154 | /* | 155 | /* |
156 | * GSPN_ID response | ||
157 | */ | ||
158 | struct fc_gspn_resp { | ||
159 | __u8 fp_name_len; | ||
160 | char fp_name[]; | ||
161 | }; | ||
162 | |||
163 | /* | ||
155 | * RFT_ID request - register FC-4 types for ID. | 164 | * RFT_ID request - register FC-4 types for ID. |
156 | */ | 165 | */ |
157 | struct fc_ns_rft_id { | 166 | struct fc_ns_rft_id { |
diff --git a/include/scsi/fc_encode.h b/include/scsi/fc_encode.h index 6d293c846a46..be418d8448a5 100644 --- a/include/scsi/fc_encode.h +++ b/include/scsi/fc_encode.h | |||
@@ -46,16 +46,11 @@ struct fc_ct_req { | |||
46 | } payload; | 46 | } payload; |
47 | }; | 47 | }; |
48 | 48 | ||
49 | /** | 49 | static inline void __fc_fill_fc_hdr(struct fc_frame_header *fh, |
50 | * fill FC header fields in specified fc_frame | 50 | enum fc_rctl r_ctl, |
51 | */ | 51 | u32 did, u32 sid, enum fc_fh_type type, |
52 | static inline void fc_fill_fc_hdr(struct fc_frame *fp, enum fc_rctl r_ctl, | 52 | u32 f_ctl, u32 parm_offset) |
53 | u32 did, u32 sid, enum fc_fh_type type, | ||
54 | u32 f_ctl, u32 parm_offset) | ||
55 | { | 53 | { |
56 | struct fc_frame_header *fh; | ||
57 | |||
58 | fh = fc_frame_header_get(fp); | ||
59 | WARN_ON(r_ctl == 0); | 54 | WARN_ON(r_ctl == 0); |
60 | fh->fh_r_ctl = r_ctl; | 55 | fh->fh_r_ctl = r_ctl; |
61 | hton24(fh->fh_d_id, did); | 56 | hton24(fh->fh_d_id, did); |
@@ -68,6 +63,19 @@ static inline void fc_fill_fc_hdr(struct fc_frame *fp, enum fc_rctl r_ctl, | |||
68 | } | 63 | } |
69 | 64 | ||
70 | /** | 65 | /** |
66 | * fill FC header fields in specified fc_frame | ||
67 | */ | ||
68 | static inline void fc_fill_fc_hdr(struct fc_frame *fp, enum fc_rctl r_ctl, | ||
69 | u32 did, u32 sid, enum fc_fh_type type, | ||
70 | u32 f_ctl, u32 parm_offset) | ||
71 | { | ||
72 | struct fc_frame_header *fh; | ||
73 | |||
74 | fh = fc_frame_header_get(fp); | ||
75 | __fc_fill_fc_hdr(fh, r_ctl, did, sid, type, f_ctl, parm_offset); | ||
76 | } | ||
77 | |||
78 | /** | ||
71 | * fc_adisc_fill() - Fill in adisc request frame | 79 | * fc_adisc_fill() - Fill in adisc request frame |
72 | * @lport: local port. | 80 | * @lport: local port. |
73 | * @fp: fc frame where payload will be placed. | 81 | * @fp: fc frame where payload will be placed. |
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index f53c8e31d5fb..24193c1b0da0 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h | |||
@@ -35,6 +35,8 @@ | |||
35 | 35 | ||
36 | #include <scsi/fc_frame.h> | 36 | #include <scsi/fc_frame.h> |
37 | 37 | ||
38 | #define FC_FC4_PROV_SIZE (FC_TYPE_FCP + 1) /* size of tables */ | ||
39 | |||
38 | /* | 40 | /* |
39 | * libfc error codes | 41 | * libfc error codes |
40 | */ | 42 | */ |
@@ -156,6 +158,7 @@ struct fc_rport_libfc_priv { | |||
156 | #define FC_RP_FLAGS_REC_SUPPORTED (1 << 0) | 158 | #define FC_RP_FLAGS_REC_SUPPORTED (1 << 0) |
157 | #define FC_RP_FLAGS_RETRY (1 << 1) | 159 | #define FC_RP_FLAGS_RETRY (1 << 1) |
158 | #define FC_RP_STARTED (1 << 2) | 160 | #define FC_RP_STARTED (1 << 2) |
161 | #define FC_RP_FLAGS_CONF_REQ (1 << 3) | ||
159 | unsigned int e_d_tov; | 162 | unsigned int e_d_tov; |
160 | unsigned int r_a_tov; | 163 | unsigned int r_a_tov; |
161 | }; | 164 | }; |
@@ -179,6 +182,7 @@ struct fc_rport_libfc_priv { | |||
179 | * @rp_mutex: The mutex that protects the remote port | 182 | * @rp_mutex: The mutex that protects the remote port |
180 | * @retry_work: Handle for retries | 183 | * @retry_work: Handle for retries |
181 | * @event_callback: Callback when READY, FAILED or LOGO states complete | 184 | * @event_callback: Callback when READY, FAILED or LOGO states complete |
185 | * @prli_count: Count of open PRLI sessions in providers | ||
182 | * @rcu: Structure used for freeing in an RCU-safe manner | 186 | * @rcu: Structure used for freeing in an RCU-safe manner |
183 | */ | 187 | */ |
184 | struct fc_rport_priv { | 188 | struct fc_rport_priv { |
@@ -202,7 +206,13 @@ struct fc_rport_priv { | |||
202 | struct list_head peers; | 206 | struct list_head peers; |
203 | struct work_struct event_work; | 207 | struct work_struct event_work; |
204 | u32 supported_classes; | 208 | u32 supported_classes; |
209 | u16 prli_count; | ||
205 | struct rcu_head rcu; | 210 | struct rcu_head rcu; |
211 | u16 sp_features; | ||
212 | u8 spp_type; | ||
213 | void (*lld_event_callback)(struct fc_lport *, | ||
214 | struct fc_rport_priv *, | ||
215 | enum fc_rport_event); | ||
206 | }; | 216 | }; |
207 | 217 | ||
208 | /** | 218 | /** |
@@ -551,6 +561,16 @@ struct libfc_function_template { | |||
551 | struct fc_seq *(*seq_start_next)(struct fc_seq *); | 561 | struct fc_seq *(*seq_start_next)(struct fc_seq *); |
552 | 562 | ||
553 | /* | 563 | /* |
564 | * Set a response handler for the exchange of the sequence. | ||
565 | * | ||
566 | * STATUS: OPTIONAL | ||
567 | */ | ||
568 | void (*seq_set_resp)(struct fc_seq *sp, | ||
569 | void (*resp)(struct fc_seq *, struct fc_frame *, | ||
570 | void *), | ||
571 | void *arg); | ||
572 | |||
573 | /* | ||
554 | * Assign a sequence for an incoming request frame. | 574 | * Assign a sequence for an incoming request frame. |
555 | * | 575 | * |
556 | * STATUS: OPTIONAL | 576 | * STATUS: OPTIONAL |
@@ -558,6 +578,13 @@ struct libfc_function_template { | |||
558 | struct fc_seq *(*seq_assign)(struct fc_lport *, struct fc_frame *); | 578 | struct fc_seq *(*seq_assign)(struct fc_lport *, struct fc_frame *); |
559 | 579 | ||
560 | /* | 580 | /* |
581 | * Release the reference on the sequence returned by seq_assign(). | ||
582 | * | ||
583 | * STATUS: OPTIONAL | ||
584 | */ | ||
585 | void (*seq_release)(struct fc_seq *); | ||
586 | |||
587 | /* | ||
561 | * Reset an exchange manager, completing all sequences and exchanges. | 588 | * Reset an exchange manager, completing all sequences and exchanges. |
562 | * If s_id is non-zero, reset only exchanges originating from that FID. | 589 | * If s_id is non-zero, reset only exchanges originating from that FID. |
563 | * If d_id is non-zero, reset only exchanges sending to that FID. | 590 | * If d_id is non-zero, reset only exchanges sending to that FID. |
@@ -656,6 +683,15 @@ struct libfc_function_template { | |||
656 | void (*rport_destroy)(struct kref *); | 683 | void (*rport_destroy)(struct kref *); |
657 | 684 | ||
658 | /* | 685 | /* |
686 | * Callback routine after the remote port is logged in | ||
687 | * | ||
688 | * STATUS: OPTIONAL | ||
689 | */ | ||
690 | void (*rport_event_callback)(struct fc_lport *, | ||
691 | struct fc_rport_priv *, | ||
692 | enum fc_rport_event); | ||
693 | |||
694 | /* | ||
659 | * Send a fcp cmd from fsp pkt. | 695 | * Send a fcp cmd from fsp pkt. |
660 | * Called with the SCSI host lock unlocked and irqs disabled. | 696 | * Called with the SCSI host lock unlocked and irqs disabled. |
661 | * | 697 | * |
@@ -749,6 +785,15 @@ struct fc_disc { | |||
749 | enum fc_disc_event); | 785 | enum fc_disc_event); |
750 | }; | 786 | }; |
751 | 787 | ||
788 | /* | ||
789 | * Local port notifier and events. | ||
790 | */ | ||
791 | extern struct blocking_notifier_head fc_lport_notifier_head; | ||
792 | enum fc_lport_event { | ||
793 | FC_LPORT_EV_ADD, | ||
794 | FC_LPORT_EV_DEL, | ||
795 | }; | ||
796 | |||
752 | /** | 797 | /** |
753 | * struct fc_lport - Local port | 798 | * struct fc_lport - Local port |
754 | * @host: The SCSI host associated with a local port | 799 | * @host: The SCSI host associated with a local port |
@@ -789,8 +834,10 @@ struct fc_disc { | |||
789 | * @lso_max: The maximum large offload send size | 834 | * @lso_max: The maximum large offload send size |
790 | * @fcts: FC-4 type mask | 835 | * @fcts: FC-4 type mask |
791 | * @lp_mutex: Mutex to protect the local port | 836 | * @lp_mutex: Mutex to protect the local port |
792 | * @list: Handle for list of local ports | 837 | * @list: Linkage on list of vport peers |
793 | * @retry_work: Handle to local port for delayed retry context | 838 | * @retry_work: Handle to local port for delayed retry context |
839 | * @prov: Pointers available for use by passive FC-4 providers | ||
840 | * @lport_list: Linkage on module-wide list of local ports | ||
794 | */ | 841 | */ |
795 | struct fc_lport { | 842 | struct fc_lport { |
796 | /* Associations */ | 843 | /* Associations */ |
@@ -846,8 +893,32 @@ struct fc_lport { | |||
846 | struct mutex lp_mutex; | 893 | struct mutex lp_mutex; |
847 | struct list_head list; | 894 | struct list_head list; |
848 | struct delayed_work retry_work; | 895 | struct delayed_work retry_work; |
896 | void *prov[FC_FC4_PROV_SIZE]; | ||
897 | struct list_head lport_list; | ||
849 | }; | 898 | }; |
850 | 899 | ||
900 | /** | ||
901 | * struct fc4_prov - FC-4 provider registration | ||
902 | * @prli: Handler for incoming PRLI | ||
903 | * @prlo: Handler for session reset | ||
904 | * @recv: Handler for incoming request | ||
905 | * @module: Pointer to module. May be NULL. | ||
906 | */ | ||
907 | struct fc4_prov { | ||
908 | int (*prli)(struct fc_rport_priv *, u32 spp_len, | ||
909 | const struct fc_els_spp *spp_in, | ||
910 | struct fc_els_spp *spp_out); | ||
911 | void (*prlo)(struct fc_rport_priv *); | ||
912 | void (*recv)(struct fc_lport *, struct fc_frame *); | ||
913 | struct module *module; | ||
914 | }; | ||
915 | |||
916 | /* | ||
917 | * Register FC-4 provider with libfc. | ||
918 | */ | ||
919 | int fc_fc4_register_provider(enum fc_fh_type type, struct fc4_prov *); | ||
920 | void fc_fc4_deregister_provider(enum fc_fh_type type, struct fc4_prov *); | ||
921 | |||
851 | /* | 922 | /* |
852 | * FC_LPORT HELPER FUNCTIONS | 923 | * FC_LPORT HELPER FUNCTIONS |
853 | *****************************/ | 924 | *****************************/ |
@@ -978,6 +1049,7 @@ struct fc_lport *libfc_vport_create(struct fc_vport *, int privsize); | |||
978 | struct fc_lport *fc_vport_id_lookup(struct fc_lport *, u32 port_id); | 1049 | struct fc_lport *fc_vport_id_lookup(struct fc_lport *, u32 port_id); |
979 | int fc_lport_bsg_request(struct fc_bsg_job *); | 1050 | int fc_lport_bsg_request(struct fc_bsg_job *); |
980 | void fc_lport_set_local_id(struct fc_lport *, u32 port_id); | 1051 | void fc_lport_set_local_id(struct fc_lport *, u32 port_id); |
1052 | void fc_lport_iterate(void (*func)(struct fc_lport *, void *), void *); | ||
981 | 1053 | ||
982 | /* | 1054 | /* |
983 | * REMOTE PORT LAYER | 1055 | * REMOTE PORT LAYER |
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h index feb6a94c90ea..8c1638b8c28e 100644 --- a/include/scsi/libfcoe.h +++ b/include/scsi/libfcoe.h | |||
@@ -33,6 +33,12 @@ | |||
33 | #define FCOE_MAX_CMD_LEN 16 /* Supported CDB length */ | 33 | #define FCOE_MAX_CMD_LEN 16 /* Supported CDB length */ |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * Max MTU for FCoE: 14 (FCoE header) + 24 (FC header) + 2112 (max FC payload) | ||
37 | * + 4 (FC CRC) + 4 (FCoE trailer) = 2158 bytes | ||
38 | */ | ||
39 | #define FCOE_MTU 2158 | ||
40 | |||
41 | /* | ||
36 | * FIP tunable parameters. | 42 | * FIP tunable parameters. |
37 | */ | 43 | */ |
38 | #define FCOE_CTLR_START_DELAY 2000 /* mS after first adv. to choose FCF */ | 44 | #define FCOE_CTLR_START_DELAY 2000 /* mS after first adv. to choose FCF */ |
@@ -221,6 +227,8 @@ int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_lport *, | |||
221 | u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int); | 227 | u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int); |
222 | int fcoe_libfc_config(struct fc_lport *, struct fcoe_ctlr *, | 228 | int fcoe_libfc_config(struct fc_lport *, struct fcoe_ctlr *, |
223 | const struct libfc_function_template *, int init_fcp); | 229 | const struct libfc_function_template *, int init_fcp); |
230 | u32 fcoe_fc_crc(struct fc_frame *fp); | ||
231 | int fcoe_start_io(struct sk_buff *skb); | ||
224 | 232 | ||
225 | /** | 233 | /** |
226 | * is_fip_mode() - returns true if FIP mode selected. | 234 | * is_fip_mode() - returns true if FIP mode selected. |
@@ -231,5 +239,102 @@ static inline bool is_fip_mode(struct fcoe_ctlr *fip) | |||
231 | return fip->state == FIP_ST_ENABLED; | 239 | return fip->state == FIP_ST_ENABLED; |
232 | } | 240 | } |
233 | 241 | ||
242 | /* helper for FCoE SW HBA drivers, can include subven and subdev if needed. The | ||
243 | * modpost would use pci_device_id table to auto-generate formatted module alias | ||
244 | * into the corresponding .mod.c file, but there may or may not be a pci device | ||
245 | * id table for FCoE drivers so we use the following helper for build the fcoe | ||
246 | * driver module alias. | ||
247 | */ | ||
248 | #define MODULE_ALIAS_FCOE_PCI(ven, dev) \ | ||
249 | MODULE_ALIAS("fcoe-pci:" \ | ||
250 | "v" __stringify(ven) \ | ||
251 | "d" __stringify(dev) "sv*sd*bc*sc*i*") | ||
252 | |||
253 | /* the name of the default FCoE transport driver fcoe.ko */ | ||
254 | #define FCOE_TRANSPORT_DEFAULT "fcoe" | ||
255 | |||
256 | /* struct fcoe_transport - The FCoE transport interface | ||
257 | * @name: a vendor specific name for their FCoE transport driver | ||
258 | * @attached: whether this transport is already attached | ||
259 | * @list: list linkage to all attached transports | ||
260 | * @match: handler to allow the transport driver to match up a given netdev | ||
261 | * @create: handler to sysfs entry of create for FCoE instances | ||
262 | * @destroy: handler to sysfs entry of destroy for FCoE instances | ||
263 | * @enable: handler to sysfs entry of enable for FCoE instances | ||
264 | * @disable: handler to sysfs entry of disable for FCoE instances | ||
265 | */ | ||
266 | struct fcoe_transport { | ||
267 | char name[IFNAMSIZ]; | ||
268 | bool attached; | ||
269 | struct list_head list; | ||
270 | bool (*match) (struct net_device *device); | ||
271 | int (*create) (struct net_device *device, enum fip_state fip_mode); | ||
272 | int (*destroy) (struct net_device *device); | ||
273 | int (*enable) (struct net_device *device); | ||
274 | int (*disable) (struct net_device *device); | ||
275 | }; | ||
276 | |||
277 | /** | ||
278 | * struct fcoe_percpu_s - The context for FCoE receive thread(s) | ||
279 | * @thread: The thread context | ||
280 | * @fcoe_rx_list: The queue of pending packets to process | ||
281 | * @page: The memory page for calculating frame trailer CRCs | ||
282 | * @crc_eof_offset: The offset into the CRC page pointing to available | ||
283 | * memory for a new trailer | ||
284 | */ | ||
285 | struct fcoe_percpu_s { | ||
286 | struct task_struct *thread; | ||
287 | struct sk_buff_head fcoe_rx_list; | ||
288 | struct page *crc_eof_page; | ||
289 | int crc_eof_offset; | ||
290 | }; | ||
291 | |||
292 | /** | ||
293 | * struct fcoe_port - The FCoE private structure | ||
294 | * @priv: The associated fcoe interface. The structure is | ||
295 | * defined by the low level driver | ||
296 | * @lport: The associated local port | ||
297 | * @fcoe_pending_queue: The pending Rx queue of skbs | ||
298 | * @fcoe_pending_queue_active: Indicates if the pending queue is active | ||
299 | * @max_queue_depth: Max queue depth of pending queue | ||
300 | * @min_queue_depth: Min queue depth of pending queue | ||
301 | * @timer: The queue timer | ||
302 | * @destroy_work: Handle for work context | ||
303 | * (to prevent RTNL deadlocks) | ||
304 | * @data_srt_addr: Source address for data | ||
305 | * | ||
306 | * An instance of this structure is to be allocated along with the | ||
307 | * Scsi_Host and libfc fc_lport structures. | ||
308 | */ | ||
309 | struct fcoe_port { | ||
310 | void *priv; | ||
311 | struct fc_lport *lport; | ||
312 | struct sk_buff_head fcoe_pending_queue; | ||
313 | u8 fcoe_pending_queue_active; | ||
314 | u32 max_queue_depth; | ||
315 | u32 min_queue_depth; | ||
316 | struct timer_list timer; | ||
317 | struct work_struct destroy_work; | ||
318 | u8 data_src_addr[ETH_ALEN]; | ||
319 | }; | ||
320 | void fcoe_clean_pending_queue(struct fc_lport *); | ||
321 | void fcoe_check_wait_queue(struct fc_lport *lport, struct sk_buff *skb); | ||
322 | void fcoe_queue_timer(ulong lport); | ||
323 | int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen, | ||
324 | struct fcoe_percpu_s *fps); | ||
325 | |||
326 | /** | ||
327 | * struct netdev_list | ||
328 | * A mapping from netdevice to fcoe_transport | ||
329 | */ | ||
330 | struct fcoe_netdev_mapping { | ||
331 | struct list_head list; | ||
332 | struct net_device *netdev; | ||
333 | struct fcoe_transport *ft; | ||
334 | }; | ||
335 | |||
336 | /* fcoe transports registration and deregistration */ | ||
337 | int fcoe_transport_attach(struct fcoe_transport *ft); | ||
338 | int fcoe_transport_detach(struct fcoe_transport *ft); | ||
234 | 339 | ||
235 | #endif /* _LIBFCOE_H */ | 340 | #endif /* _LIBFCOE_H */ |
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h index 748382b32b52..0f4367751b71 100644 --- a/include/scsi/libiscsi.h +++ b/include/scsi/libiscsi.h | |||
@@ -212,9 +212,6 @@ struct iscsi_conn { | |||
212 | /* values userspace uses to id a conn */ | 212 | /* values userspace uses to id a conn */ |
213 | int persistent_port; | 213 | int persistent_port; |
214 | char *persistent_address; | 214 | char *persistent_address; |
215 | /* remote portal currently connected to */ | ||
216 | int portal_port; | ||
217 | char portal_address[ISCSI_ADDRESS_BUF_LEN]; | ||
218 | 215 | ||
219 | /* MIB-statistics */ | 216 | /* MIB-statistics */ |
220 | uint64_t txdata_octets; | 217 | uint64_t txdata_octets; |
@@ -319,9 +316,6 @@ struct iscsi_host { | |||
319 | /* hw address or netdev iscsi connection is bound to */ | 316 | /* hw address or netdev iscsi connection is bound to */ |
320 | char *hwaddress; | 317 | char *hwaddress; |
321 | char *netdev; | 318 | char *netdev; |
322 | /* local address */ | ||
323 | int local_port; | ||
324 | char local_address[ISCSI_ADDRESS_BUF_LEN]; | ||
325 | 319 | ||
326 | wait_queue_head_t session_removal_wq; | 320 | wait_queue_head_t session_removal_wq; |
327 | /* protects sessions and state */ | 321 | /* protects sessions and state */ |
@@ -394,6 +388,8 @@ extern void iscsi_session_failure(struct iscsi_session *session, | |||
394 | enum iscsi_err err); | 388 | enum iscsi_err err); |
395 | extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, | 389 | extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, |
396 | enum iscsi_param param, char *buf); | 390 | enum iscsi_param param, char *buf); |
391 | extern int iscsi_conn_get_addr_param(struct sockaddr_storage *addr, | ||
392 | enum iscsi_param param, char *buf); | ||
397 | extern void iscsi_suspend_tx(struct iscsi_conn *conn); | 393 | extern void iscsi_suspend_tx(struct iscsi_conn *conn); |
398 | extern void iscsi_suspend_queue(struct iscsi_conn *conn); | 394 | extern void iscsi_suspend_queue(struct iscsi_conn *conn); |
399 | extern void iscsi_conn_queue_work(struct iscsi_conn *conn); | 395 | extern void iscsi_conn_queue_work(struct iscsi_conn *conn); |
diff --git a/include/scsi/sas_ata.h b/include/scsi/sas_ata.h index c583193ae929..9c159f74c6d0 100644 --- a/include/scsi/sas_ata.h +++ b/include/scsi/sas_ata.h | |||
@@ -39,6 +39,11 @@ int sas_ata_init_host_and_port(struct domain_device *found_dev, | |||
39 | struct scsi_target *starget); | 39 | struct scsi_target *starget); |
40 | 40 | ||
41 | void sas_ata_task_abort(struct sas_task *task); | 41 | void sas_ata_task_abort(struct sas_task *task); |
42 | void sas_ata_strategy_handler(struct Scsi_Host *shost); | ||
43 | int sas_ata_timed_out(struct scsi_cmnd *cmd, struct sas_task *task, | ||
44 | enum blk_eh_timer_return *rtn); | ||
45 | int sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q, | ||
46 | struct list_head *done_q); | ||
42 | 47 | ||
43 | #else | 48 | #else |
44 | 49 | ||
@@ -55,6 +60,23 @@ static inline int sas_ata_init_host_and_port(struct domain_device *found_dev, | |||
55 | static inline void sas_ata_task_abort(struct sas_task *task) | 60 | static inline void sas_ata_task_abort(struct sas_task *task) |
56 | { | 61 | { |
57 | } | 62 | } |
63 | |||
64 | static inline void sas_ata_strategy_handler(struct Scsi_Host *shost) | ||
65 | { | ||
66 | } | ||
67 | |||
68 | static inline int sas_ata_timed_out(struct scsi_cmnd *cmd, | ||
69 | struct sas_task *task, | ||
70 | enum blk_eh_timer_return *rtn) | ||
71 | { | ||
72 | return 0; | ||
73 | } | ||
74 | static inline int sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q, | ||
75 | struct list_head *done_q) | ||
76 | { | ||
77 | return 0; | ||
78 | } | ||
79 | |||
58 | #endif | 80 | #endif |
59 | 81 | ||
60 | #endif /* _SAS_ATA_H_ */ | 82 | #endif /* _SAS_ATA_H_ */ |
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index b76d4006e36d..3668903e397b 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h | |||
@@ -435,6 +435,10 @@ static inline int scsi_is_wlun(unsigned int lun) | |||
435 | * recover the link. Transport class will | 435 | * recover the link. Transport class will |
436 | * retry or fail IO */ | 436 | * retry or fail IO */ |
437 | #define DID_TRANSPORT_FAILFAST 0x0f /* Transport class fastfailed the io */ | 437 | #define DID_TRANSPORT_FAILFAST 0x0f /* Transport class fastfailed the io */ |
438 | #define DID_TARGET_FAILURE 0x10 /* Permanent target failure, do not retry on | ||
439 | * other paths */ | ||
440 | #define DID_NEXUS_FAILURE 0x11 /* Permanent nexus failure, retry on other | ||
441 | * paths might yield different results */ | ||
438 | #define DRIVER_OK 0x00 /* Driver status */ | 442 | #define DRIVER_OK 0x00 /* Driver status */ |
439 | 443 | ||
440 | /* | 444 | /* |
@@ -464,6 +468,7 @@ static inline int scsi_is_wlun(unsigned int lun) | |||
464 | #define TIMEOUT_ERROR 0x2007 | 468 | #define TIMEOUT_ERROR 0x2007 |
465 | #define SCSI_RETURN_NOT_HANDLED 0x2008 | 469 | #define SCSI_RETURN_NOT_HANDLED 0x2008 |
466 | #define FAST_IO_FAIL 0x2009 | 470 | #define FAST_IO_FAIL 0x2009 |
471 | #define TARGET_ERROR 0x200A | ||
467 | 472 | ||
468 | /* | 473 | /* |
469 | * Midlevel queue return values. | 474 | * Midlevel queue return values. |
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 85867dcde335..f171c65dc5a8 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
@@ -184,6 +184,7 @@ typedef void (*activate_complete)(void *, int); | |||
184 | struct scsi_device_handler { | 184 | struct scsi_device_handler { |
185 | /* Used by the infrastructure */ | 185 | /* Used by the infrastructure */ |
186 | struct list_head list; /* list of scsi_device_handlers */ | 186 | struct list_head list; /* list of scsi_device_handlers */ |
187 | int idx; | ||
187 | 188 | ||
188 | /* Filled by the hardware handler */ | 189 | /* Filled by the hardware handler */ |
189 | struct module *module; | 190 | struct module *module; |
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index 7fff94b3b2a8..bf8f52965675 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h | |||
@@ -101,6 +101,8 @@ struct iscsi_transport { | |||
101 | void (*destroy_conn) (struct iscsi_cls_conn *conn); | 101 | void (*destroy_conn) (struct iscsi_cls_conn *conn); |
102 | int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, | 102 | int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, |
103 | char *buf, int buflen); | 103 | char *buf, int buflen); |
104 | int (*get_ep_param) (struct iscsi_endpoint *ep, enum iscsi_param param, | ||
105 | char *buf); | ||
104 | int (*get_conn_param) (struct iscsi_cls_conn *conn, | 106 | int (*get_conn_param) (struct iscsi_cls_conn *conn, |
105 | enum iscsi_param param, char *buf); | 107 | enum iscsi_param param, char *buf); |
106 | int (*get_session_param) (struct iscsi_cls_session *session, | 108 | int (*get_session_param) (struct iscsi_cls_session *session, |
@@ -160,8 +162,9 @@ struct iscsi_cls_conn { | |||
160 | void *dd_data; /* LLD private data */ | 162 | void *dd_data; /* LLD private data */ |
161 | struct iscsi_transport *transport; | 163 | struct iscsi_transport *transport; |
162 | uint32_t cid; /* connection id */ | 164 | uint32_t cid; /* connection id */ |
165 | struct mutex ep_mutex; | ||
166 | struct iscsi_endpoint *ep; | ||
163 | 167 | ||
164 | int active; /* must be accessed with the connlock */ | ||
165 | struct device dev; /* sysfs transport/container device */ | 168 | struct device dev; /* sysfs transport/container device */ |
166 | }; | 169 | }; |
167 | 170 | ||
@@ -222,6 +225,7 @@ struct iscsi_endpoint { | |||
222 | void *dd_data; /* LLD private data */ | 225 | void *dd_data; /* LLD private data */ |
223 | struct device dev; | 226 | struct device dev; |
224 | uint64_t id; | 227 | uint64_t id; |
228 | struct iscsi_cls_conn *conn; | ||
225 | }; | 229 | }; |
226 | 230 | ||
227 | /* | 231 | /* |
diff --git a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h index b602f475cdbb..f1dcefe4532b 100644 --- a/include/sound/ac97_codec.h +++ b/include/sound/ac97_codec.h | |||
@@ -96,6 +96,10 @@ | |||
96 | #define AC97_FUNC_INFO 0x68 /* Function Information */ | 96 | #define AC97_FUNC_INFO 0x68 /* Function Information */ |
97 | #define AC97_SENSE_INFO 0x6a /* Sense Details */ | 97 | #define AC97_SENSE_INFO 0x6a /* Sense Details */ |
98 | 98 | ||
99 | /* volume controls */ | ||
100 | #define AC97_MUTE_MASK_MONO 0x8000 | ||
101 | #define AC97_MUTE_MASK_STEREO 0x8080 | ||
102 | |||
99 | /* slot allocation */ | 103 | /* slot allocation */ |
100 | #define AC97_SLOT_TAG 0 | 104 | #define AC97_SLOT_TAG 0 |
101 | #define AC97_SLOT_CMD_ADDR 1 | 105 | #define AC97_SLOT_CMD_ADDR 1 |
@@ -138,6 +142,7 @@ | |||
138 | #define AC97_BC_18BIT_ADC 0x0100 /* 18-bit ADC resolution */ | 142 | #define AC97_BC_18BIT_ADC 0x0100 /* 18-bit ADC resolution */ |
139 | #define AC97_BC_20BIT_ADC 0x0200 /* 20-bit ADC resolution */ | 143 | #define AC97_BC_20BIT_ADC 0x0200 /* 20-bit ADC resolution */ |
140 | #define AC97_BC_ADC_MASK 0x0300 | 144 | #define AC97_BC_ADC_MASK 0x0300 |
145 | #define AC97_BC_3D_TECH_ID_MASK 0x7c00 /* Per-vendor ID of 3D enhancement */ | ||
141 | 146 | ||
142 | /* general purpose */ | 147 | /* general purpose */ |
143 | #define AC97_GP_DRSS_MASK 0x0c00 /* double rate slot select */ | 148 | #define AC97_GP_DRSS_MASK 0x0c00 /* double rate slot select */ |
diff --git a/include/sound/control.h b/include/sound/control.h index 7715e6f00d38..e67db2869360 100644 --- a/include/sound/control.h +++ b/include/sound/control.h | |||
@@ -115,6 +115,8 @@ int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol); | |||
115 | int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol); | 115 | int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol); |
116 | int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id); | 116 | int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id); |
117 | int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id); | 117 | int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id); |
118 | int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id, | ||
119 | int active); | ||
118 | struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid); | 120 | struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid); |
119 | struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id); | 121 | struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id); |
120 | 122 | ||
diff --git a/include/sound/cs4271.h b/include/sound/cs4271.h new file mode 100644 index 000000000000..50a059e7d116 --- /dev/null +++ b/include/sound/cs4271.h | |||
@@ -0,0 +1,24 @@ | |||
1 | /* | ||
2 | * Definitions for CS4271 ASoC codec driver | ||
3 | * | ||
4 | * Copyright (c) 2010 Alexander Sverdlin <subaparts@yandex.ru> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version 2 | ||
9 | * of the License, or (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | */ | ||
16 | |||
17 | #ifndef __CS4271_H | ||
18 | #define __CS4271_H | ||
19 | |||
20 | struct cs4271_platform_data { | ||
21 | int gpio_nreset; /* GPIO driving Reset pin, if any */ | ||
22 | }; | ||
23 | |||
24 | #endif /* __CS4271_H */ | ||
diff --git a/include/sound/hdspm.h b/include/sound/hdspm.h index 81990b2bcc98..1774ff5ff632 100644 --- a/include/sound/hdspm.h +++ b/include/sound/hdspm.h | |||
@@ -3,8 +3,8 @@ | |||
3 | /* | 3 | /* |
4 | * Copyright (C) 2003 Winfried Ritsch (IEM) | 4 | * Copyright (C) 2003 Winfried Ritsch (IEM) |
5 | * based on hdsp.h from Thomas Charbonnel (thomas@undata.org) | 5 | * based on hdsp.h from Thomas Charbonnel (thomas@undata.org) |
6 | * | 6 | * |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by | 9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or | 10 | * the Free Software Foundation; either version 2 of the License, or |
@@ -23,50 +23,41 @@ | |||
23 | /* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */ | 23 | /* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */ |
24 | #define HDSPM_MAX_CHANNELS 64 | 24 | #define HDSPM_MAX_CHANNELS 64 |
25 | 25 | ||
26 | /* -------------------- IOCTL Peak/RMS Meters -------------------- */ | 26 | enum hdspm_io_type { |
27 | 27 | MADI, | |
28 | /* peam rms level structure like we get from hardware | 28 | MADIface, |
29 | 29 | AIO, | |
30 | maybe in future we can memory map it so I just copy it | 30 | AES32, |
31 | to user on ioctl call now an dont change anything | 31 | RayDAT |
32 | rms are made out of low and high values | 32 | }; |
33 | where (long) ????_rms = (????_rms_l >> 8) + ((????_rms_h & 0xFFFFFF00)<<24) | ||
34 | (i asume so from the code) | ||
35 | */ | ||
36 | |||
37 | struct hdspm_peak_rms { | ||
38 | |||
39 | unsigned int level_offset[1024]; | ||
40 | 33 | ||
41 | unsigned int input_peak[64]; | 34 | enum hdspm_speed { |
42 | unsigned int playback_peak[64]; | 35 | ss, |
43 | unsigned int output_peak[64]; | 36 | ds, |
44 | unsigned int xxx_peak[64]; /* not used */ | 37 | qs |
38 | }; | ||
45 | 39 | ||
46 | unsigned int reserved[256]; /* not used */ | 40 | /* -------------------- IOCTL Peak/RMS Meters -------------------- */ |
47 | 41 | ||
48 | unsigned int input_rms_l[64]; | 42 | struct hdspm_peak_rms { |
49 | unsigned int playback_rms_l[64]; | 43 | uint32_t input_peaks[64]; |
50 | unsigned int output_rms_l[64]; | 44 | uint32_t playback_peaks[64]; |
51 | unsigned int xxx_rms_l[64]; /* not used */ | 45 | uint32_t output_peaks[64]; |
52 | 46 | ||
53 | unsigned int input_rms_h[64]; | 47 | uint64_t input_rms[64]; |
54 | unsigned int playback_rms_h[64]; | 48 | uint64_t playback_rms[64]; |
55 | unsigned int output_rms_h[64]; | 49 | uint64_t output_rms[64]; |
56 | unsigned int xxx_rms_h[64]; /* not used */ | ||
57 | }; | ||
58 | 50 | ||
59 | struct hdspm_peak_rms_ioctl { | 51 | uint8_t speed; /* enum {ss, ds, qs} */ |
60 | struct hdspm_peak_rms *peak; | 52 | int status2; |
61 | }; | 53 | }; |
62 | 54 | ||
63 | /* use indirect access due to the limit of ioctl bit size */ | ||
64 | #define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \ | 55 | #define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \ |
65 | _IOR('H', 0x40, struct hdspm_peak_rms_ioctl) | 56 | _IOR('H', 0x42, struct hdspm_peak_rms) |
66 | 57 | ||
67 | /* ------------ CONFIG block IOCTL ---------------------- */ | 58 | /* ------------ CONFIG block IOCTL ---------------------- */ |
68 | 59 | ||
69 | struct hdspm_config_info { | 60 | struct hdspm_config { |
70 | unsigned char pref_sync_ref; | 61 | unsigned char pref_sync_ref; |
71 | unsigned char wordclock_sync_check; | 62 | unsigned char wordclock_sync_check; |
72 | unsigned char madi_sync_check; | 63 | unsigned char madi_sync_check; |
@@ -80,18 +71,121 @@ struct hdspm_config_info { | |||
80 | unsigned int analog_out; | 71 | unsigned int analog_out; |
81 | }; | 72 | }; |
82 | 73 | ||
83 | #define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO \ | 74 | #define SNDRV_HDSPM_IOCTL_GET_CONFIG \ |
84 | _IOR('H', 0x41, struct hdspm_config_info) | 75 | _IOR('H', 0x41, struct hdspm_config) |
76 | |||
77 | /** | ||
78 | * If there's a TCO (TimeCode Option) board installed, | ||
79 | * there are further options and status data available. | ||
80 | * The hdspm_ltc structure contains the current SMPTE | ||
81 | * timecode and some status information and can be | ||
82 | * obtained via SNDRV_HDSPM_IOCTL_GET_LTC or in the | ||
83 | * hdspm_status struct. | ||
84 | **/ | ||
85 | |||
86 | enum hdspm_ltc_format { | ||
87 | format_invalid, | ||
88 | fps_24, | ||
89 | fps_25, | ||
90 | fps_2997, | ||
91 | fps_30 | ||
92 | }; | ||
93 | |||
94 | enum hdspm_ltc_frame { | ||
95 | frame_invalid, | ||
96 | drop_frame, | ||
97 | full_frame | ||
98 | }; | ||
99 | |||
100 | enum hdspm_ltc_input_format { | ||
101 | ntsc, | ||
102 | pal, | ||
103 | no_video | ||
104 | }; | ||
105 | |||
106 | struct hdspm_ltc { | ||
107 | unsigned int ltc; | ||
85 | 108 | ||
109 | enum hdspm_ltc_format format; | ||
110 | enum hdspm_ltc_frame frame; | ||
111 | enum hdspm_ltc_input_format input_format; | ||
112 | }; | ||
113 | |||
114 | #define SNDRV_HDSPM_IOCTL_GET_LTC _IOR('H', 0x46, struct hdspm_mixer_ioctl) | ||
115 | |||
116 | /** | ||
117 | * The status data reflects the device's current state | ||
118 | * as determined by the card's configuration and | ||
119 | * connection status. | ||
120 | **/ | ||
121 | |||
122 | enum hdspm_sync { | ||
123 | hdspm_sync_no_lock = 0, | ||
124 | hdspm_sync_lock = 1, | ||
125 | hdspm_sync_sync = 2 | ||
126 | }; | ||
86 | 127 | ||
87 | /* get Soundcard Version */ | 128 | enum hdspm_madi_input { |
129 | hdspm_input_optical = 0, | ||
130 | hdspm_input_coax = 1 | ||
131 | }; | ||
132 | |||
133 | enum hdspm_madi_channel_format { | ||
134 | hdspm_format_ch_64 = 0, | ||
135 | hdspm_format_ch_56 = 1 | ||
136 | }; | ||
137 | |||
138 | enum hdspm_madi_frame_format { | ||
139 | hdspm_frame_48 = 0, | ||
140 | hdspm_frame_96 = 1 | ||
141 | }; | ||
142 | |||
143 | enum hdspm_syncsource { | ||
144 | syncsource_wc = 0, | ||
145 | syncsource_madi = 1, | ||
146 | syncsource_tco = 2, | ||
147 | syncsource_sync = 3, | ||
148 | syncsource_none = 4 | ||
149 | }; | ||
150 | |||
151 | struct hdspm_status { | ||
152 | uint8_t card_type; /* enum hdspm_io_type */ | ||
153 | enum hdspm_syncsource autosync_source; | ||
154 | |||
155 | uint64_t card_clock; | ||
156 | uint32_t master_period; | ||
157 | |||
158 | union { | ||
159 | struct { | ||
160 | uint8_t sync_wc; /* enum hdspm_sync */ | ||
161 | uint8_t sync_madi; /* enum hdspm_sync */ | ||
162 | uint8_t sync_tco; /* enum hdspm_sync */ | ||
163 | uint8_t sync_in; /* enum hdspm_sync */ | ||
164 | uint8_t madi_input; /* enum hdspm_madi_input */ | ||
165 | uint8_t channel_format; /* enum hdspm_madi_channel_format */ | ||
166 | uint8_t frame_format; /* enum hdspm_madi_frame_format */ | ||
167 | } madi; | ||
168 | } card_specific; | ||
169 | }; | ||
170 | |||
171 | #define SNDRV_HDSPM_IOCTL_GET_STATUS \ | ||
172 | _IOR('H', 0x47, struct hdspm_status) | ||
173 | |||
174 | /** | ||
175 | * Get information about the card and its add-ons. | ||
176 | **/ | ||
177 | |||
178 | #define HDSPM_ADDON_TCO 1 | ||
88 | 179 | ||
89 | struct hdspm_version { | 180 | struct hdspm_version { |
181 | uint8_t card_type; /* enum hdspm_io_type */ | ||
182 | char cardname[20]; | ||
183 | unsigned int serial; | ||
90 | unsigned short firmware_rev; | 184 | unsigned short firmware_rev; |
185 | int addons; | ||
91 | }; | 186 | }; |
92 | 187 | ||
93 | #define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x43, struct hdspm_version) | 188 | #define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x48, struct hdspm_version) |
94 | |||
95 | 189 | ||
96 | /* ------------- get Matrix Mixer IOCTL --------------- */ | 190 | /* ------------- get Matrix Mixer IOCTL --------------- */ |
97 | 191 | ||
@@ -103,7 +197,7 @@ struct hdspm_version { | |||
103 | /* equivalent to hardware definition, maybe for future feature of mmap of | 197 | /* equivalent to hardware definition, maybe for future feature of mmap of |
104 | * them | 198 | * them |
105 | */ | 199 | */ |
106 | /* each of 64 outputs has 64 infader and 64 outfader: | 200 | /* each of 64 outputs has 64 infader and 64 outfader: |
107 | Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */ | 201 | Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */ |
108 | 202 | ||
109 | #define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS | 203 | #define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS |
@@ -131,4 +225,5 @@ typedef struct hdspm_version hdspm_version_t; | |||
131 | typedef struct hdspm_channelfader snd_hdspm_channelfader_t; | 225 | typedef struct hdspm_channelfader snd_hdspm_channelfader_t; |
132 | typedef struct hdspm_mixer hdspm_mixer_t; | 226 | typedef struct hdspm_mixer hdspm_mixer_t; |
133 | 227 | ||
134 | #endif /* __SOUND_HDSPM_H */ | 228 | |
229 | #endif | ||
diff --git a/include/sound/mixer_oss.h b/include/sound/mixer_oss.h index 51fbcb4a277a..13cb0b430a1b 100644 --- a/include/sound/mixer_oss.h +++ b/include/sound/mixer_oss.h | |||
@@ -73,6 +73,9 @@ struct snd_mixer_oss_file { | |||
73 | struct snd_mixer_oss *mixer; | 73 | struct snd_mixer_oss *mixer; |
74 | }; | 74 | }; |
75 | 75 | ||
76 | int snd_mixer_oss_ioctl_card(struct snd_card *card, | ||
77 | unsigned int cmd, unsigned long arg); | ||
78 | |||
76 | #endif /* CONFIG_SND_MIXER_OSS */ | 79 | #endif /* CONFIG_SND_MIXER_OSS */ |
77 | 80 | ||
78 | #endif /* __SOUND_MIXER_OSS_H */ | 81 | #endif /* __SOUND_MIXER_OSS_H */ |
diff --git a/include/sound/pcm.h b/include/sound/pcm.h index e731f8d71934..430a9cc045e2 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h | |||
@@ -136,48 +136,49 @@ struct snd_pcm_ops { | |||
136 | SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000) | 136 | SNDRV_PCM_RATE_88200|SNDRV_PCM_RATE_96000) |
137 | #define SNDRV_PCM_RATE_8000_192000 (SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\ | 137 | #define SNDRV_PCM_RATE_8000_192000 (SNDRV_PCM_RATE_8000_96000|SNDRV_PCM_RATE_176400|\ |
138 | SNDRV_PCM_RATE_192000) | 138 | SNDRV_PCM_RATE_192000) |
139 | #define SNDRV_PCM_FMTBIT_S8 (1ULL << SNDRV_PCM_FORMAT_S8) | 139 | #define _SNDRV_PCM_FMTBIT(fmt) (1ULL << (__force int)SNDRV_PCM_FORMAT_##fmt) |
140 | #define SNDRV_PCM_FMTBIT_U8 (1ULL << SNDRV_PCM_FORMAT_U8) | 140 | #define SNDRV_PCM_FMTBIT_S8 _SNDRV_PCM_FMTBIT(S8) |
141 | #define SNDRV_PCM_FMTBIT_S16_LE (1ULL << SNDRV_PCM_FORMAT_S16_LE) | 141 | #define SNDRV_PCM_FMTBIT_U8 _SNDRV_PCM_FMTBIT(U8) |
142 | #define SNDRV_PCM_FMTBIT_S16_BE (1ULL << SNDRV_PCM_FORMAT_S16_BE) | 142 | #define SNDRV_PCM_FMTBIT_S16_LE _SNDRV_PCM_FMTBIT(S16_LE) |
143 | #define SNDRV_PCM_FMTBIT_U16_LE (1ULL << SNDRV_PCM_FORMAT_U16_LE) | 143 | #define SNDRV_PCM_FMTBIT_S16_BE _SNDRV_PCM_FMTBIT(S16_BE) |
144 | #define SNDRV_PCM_FMTBIT_U16_BE (1ULL << SNDRV_PCM_FORMAT_U16_BE) | 144 | #define SNDRV_PCM_FMTBIT_U16_LE _SNDRV_PCM_FMTBIT(U16_LE) |
145 | #define SNDRV_PCM_FMTBIT_S24_LE (1ULL << SNDRV_PCM_FORMAT_S24_LE) | 145 | #define SNDRV_PCM_FMTBIT_U16_BE _SNDRV_PCM_FMTBIT(U16_BE) |
146 | #define SNDRV_PCM_FMTBIT_S24_BE (1ULL << SNDRV_PCM_FORMAT_S24_BE) | 146 | #define SNDRV_PCM_FMTBIT_S24_LE _SNDRV_PCM_FMTBIT(S24_LE) |
147 | #define SNDRV_PCM_FMTBIT_U24_LE (1ULL << SNDRV_PCM_FORMAT_U24_LE) | 147 | #define SNDRV_PCM_FMTBIT_S24_BE _SNDRV_PCM_FMTBIT(S24_BE) |
148 | #define SNDRV_PCM_FMTBIT_U24_BE (1ULL << SNDRV_PCM_FORMAT_U24_BE) | 148 | #define SNDRV_PCM_FMTBIT_U24_LE _SNDRV_PCM_FMTBIT(U24_LE) |
149 | #define SNDRV_PCM_FMTBIT_S32_LE (1ULL << SNDRV_PCM_FORMAT_S32_LE) | 149 | #define SNDRV_PCM_FMTBIT_U24_BE _SNDRV_PCM_FMTBIT(U24_BE) |
150 | #define SNDRV_PCM_FMTBIT_S32_BE (1ULL << SNDRV_PCM_FORMAT_S32_BE) | 150 | #define SNDRV_PCM_FMTBIT_S32_LE _SNDRV_PCM_FMTBIT(S32_LE) |
151 | #define SNDRV_PCM_FMTBIT_U32_LE (1ULL << SNDRV_PCM_FORMAT_U32_LE) | 151 | #define SNDRV_PCM_FMTBIT_S32_BE _SNDRV_PCM_FMTBIT(S32_BE) |
152 | #define SNDRV_PCM_FMTBIT_U32_BE (1ULL << SNDRV_PCM_FORMAT_U32_BE) | 152 | #define SNDRV_PCM_FMTBIT_U32_LE _SNDRV_PCM_FMTBIT(U32_LE) |
153 | #define SNDRV_PCM_FMTBIT_FLOAT_LE (1ULL << SNDRV_PCM_FORMAT_FLOAT_LE) | 153 | #define SNDRV_PCM_FMTBIT_U32_BE _SNDRV_PCM_FMTBIT(U32_BE) |
154 | #define SNDRV_PCM_FMTBIT_FLOAT_BE (1ULL << SNDRV_PCM_FORMAT_FLOAT_BE) | 154 | #define SNDRV_PCM_FMTBIT_FLOAT_LE _SNDRV_PCM_FMTBIT(FLOAT_LE) |
155 | #define SNDRV_PCM_FMTBIT_FLOAT64_LE (1ULL << SNDRV_PCM_FORMAT_FLOAT64_LE) | 155 | #define SNDRV_PCM_FMTBIT_FLOAT_BE _SNDRV_PCM_FMTBIT(FLOAT_BE) |
156 | #define SNDRV_PCM_FMTBIT_FLOAT64_BE (1ULL << SNDRV_PCM_FORMAT_FLOAT64_BE) | 156 | #define SNDRV_PCM_FMTBIT_FLOAT64_LE _SNDRV_PCM_FMTBIT(FLOAT64_LE) |
157 | #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE (1ULL << SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE) | 157 | #define SNDRV_PCM_FMTBIT_FLOAT64_BE _SNDRV_PCM_FMTBIT(FLOAT64_BE) |
158 | #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE (1ULL << SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE) | 158 | #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_LE) |
159 | #define SNDRV_PCM_FMTBIT_MU_LAW (1ULL << SNDRV_PCM_FORMAT_MU_LAW) | 159 | #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE _SNDRV_PCM_FMTBIT(IEC958_SUBFRAME_BE) |
160 | #define SNDRV_PCM_FMTBIT_A_LAW (1ULL << SNDRV_PCM_FORMAT_A_LAW) | 160 | #define SNDRV_PCM_FMTBIT_MU_LAW _SNDRV_PCM_FMTBIT(MU_LAW) |
161 | #define SNDRV_PCM_FMTBIT_IMA_ADPCM (1ULL << SNDRV_PCM_FORMAT_IMA_ADPCM) | 161 | #define SNDRV_PCM_FMTBIT_A_LAW _SNDRV_PCM_FMTBIT(A_LAW) |
162 | #define SNDRV_PCM_FMTBIT_MPEG (1ULL << SNDRV_PCM_FORMAT_MPEG) | 162 | #define SNDRV_PCM_FMTBIT_IMA_ADPCM _SNDRV_PCM_FMTBIT(IMA_ADPCM) |
163 | #define SNDRV_PCM_FMTBIT_GSM (1ULL << SNDRV_PCM_FORMAT_GSM) | 163 | #define SNDRV_PCM_FMTBIT_MPEG _SNDRV_PCM_FMTBIT(MPEG) |
164 | #define SNDRV_PCM_FMTBIT_SPECIAL (1ULL << SNDRV_PCM_FORMAT_SPECIAL) | 164 | #define SNDRV_PCM_FMTBIT_GSM _SNDRV_PCM_FMTBIT(GSM) |
165 | #define SNDRV_PCM_FMTBIT_S24_3LE (1ULL << SNDRV_PCM_FORMAT_S24_3LE) | 165 | #define SNDRV_PCM_FMTBIT_SPECIAL _SNDRV_PCM_FMTBIT(SPECIAL) |
166 | #define SNDRV_PCM_FMTBIT_U24_3LE (1ULL << SNDRV_PCM_FORMAT_U24_3LE) | 166 | #define SNDRV_PCM_FMTBIT_S24_3LE _SNDRV_PCM_FMTBIT(S24_3LE) |
167 | #define SNDRV_PCM_FMTBIT_S24_3BE (1ULL << SNDRV_PCM_FORMAT_S24_3BE) | 167 | #define SNDRV_PCM_FMTBIT_U24_3LE _SNDRV_PCM_FMTBIT(U24_3LE) |
168 | #define SNDRV_PCM_FMTBIT_U24_3BE (1ULL << SNDRV_PCM_FORMAT_U24_3BE) | 168 | #define SNDRV_PCM_FMTBIT_S24_3BE _SNDRV_PCM_FMTBIT(S24_3BE) |
169 | #define SNDRV_PCM_FMTBIT_S20_3LE (1ULL << SNDRV_PCM_FORMAT_S20_3LE) | 169 | #define SNDRV_PCM_FMTBIT_U24_3BE _SNDRV_PCM_FMTBIT(U24_3BE) |
170 | #define SNDRV_PCM_FMTBIT_U20_3LE (1ULL << SNDRV_PCM_FORMAT_U20_3LE) | 170 | #define SNDRV_PCM_FMTBIT_S20_3LE _SNDRV_PCM_FMTBIT(S20_3LE) |
171 | #define SNDRV_PCM_FMTBIT_S20_3BE (1ULL << SNDRV_PCM_FORMAT_S20_3BE) | 171 | #define SNDRV_PCM_FMTBIT_U20_3LE _SNDRV_PCM_FMTBIT(U20_3LE) |
172 | #define SNDRV_PCM_FMTBIT_U20_3BE (1ULL << SNDRV_PCM_FORMAT_U20_3BE) | 172 | #define SNDRV_PCM_FMTBIT_S20_3BE _SNDRV_PCM_FMTBIT(S20_3BE) |
173 | #define SNDRV_PCM_FMTBIT_S18_3LE (1ULL << SNDRV_PCM_FORMAT_S18_3LE) | 173 | #define SNDRV_PCM_FMTBIT_U20_3BE _SNDRV_PCM_FMTBIT(U20_3BE) |
174 | #define SNDRV_PCM_FMTBIT_U18_3LE (1ULL << SNDRV_PCM_FORMAT_U18_3LE) | 174 | #define SNDRV_PCM_FMTBIT_S18_3LE _SNDRV_PCM_FMTBIT(S18_3LE) |
175 | #define SNDRV_PCM_FMTBIT_S18_3BE (1ULL << SNDRV_PCM_FORMAT_S18_3BE) | 175 | #define SNDRV_PCM_FMTBIT_U18_3LE _SNDRV_PCM_FMTBIT(U18_3LE) |
176 | #define SNDRV_PCM_FMTBIT_U18_3BE (1ULL << SNDRV_PCM_FORMAT_U18_3BE) | 176 | #define SNDRV_PCM_FMTBIT_S18_3BE _SNDRV_PCM_FMTBIT(S18_3BE) |
177 | #define SNDRV_PCM_FMTBIT_G723_24 (1ULL << SNDRV_PCM_FORMAT_G723_24) | 177 | #define SNDRV_PCM_FMTBIT_U18_3BE _SNDRV_PCM_FMTBIT(U18_3BE) |
178 | #define SNDRV_PCM_FMTBIT_G723_24_1B (1ULL << SNDRV_PCM_FORMAT_G723_24_1B) | 178 | #define SNDRV_PCM_FMTBIT_G723_24 _SNDRV_PCM_FMTBIT(G723_24) |
179 | #define SNDRV_PCM_FMTBIT_G723_40 (1ULL << SNDRV_PCM_FORMAT_G723_40) | 179 | #define SNDRV_PCM_FMTBIT_G723_24_1B _SNDRV_PCM_FMTBIT(G723_24_1B) |
180 | #define SNDRV_PCM_FMTBIT_G723_40_1B (1ULL << SNDRV_PCM_FORMAT_G723_40_1B) | 180 | #define SNDRV_PCM_FMTBIT_G723_40 _SNDRV_PCM_FMTBIT(G723_40) |
181 | #define SNDRV_PCM_FMTBIT_G723_40_1B _SNDRV_PCM_FMTBIT(G723_40_1B) | ||
181 | 182 | ||
182 | #ifdef SNDRV_LITTLE_ENDIAN | 183 | #ifdef SNDRV_LITTLE_ENDIAN |
183 | #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_LE | 184 | #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_LE |
@@ -490,7 +491,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, | |||
490 | int snd_pcm_status(struct snd_pcm_substream *substream, | 491 | int snd_pcm_status(struct snd_pcm_substream *substream, |
491 | struct snd_pcm_status *status); | 492 | struct snd_pcm_status *status); |
492 | int snd_pcm_start(struct snd_pcm_substream *substream); | 493 | int snd_pcm_start(struct snd_pcm_substream *substream); |
493 | int snd_pcm_stop(struct snd_pcm_substream *substream, int status); | 494 | int snd_pcm_stop(struct snd_pcm_substream *substream, snd_pcm_state_t status); |
494 | int snd_pcm_drain_done(struct snd_pcm_substream *substream); | 495 | int snd_pcm_drain_done(struct snd_pcm_substream *substream); |
495 | #ifdef CONFIG_PM | 496 | #ifdef CONFIG_PM |
496 | int snd_pcm_suspend(struct snd_pcm_substream *substream); | 497 | int snd_pcm_suspend(struct snd_pcm_substream *substream); |
@@ -748,8 +749,8 @@ static inline const struct snd_interval *hw_param_interval_c(const struct snd_pc | |||
748 | return ¶ms->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL]; | 749 | return ¶ms->intervals[var - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL]; |
749 | } | 750 | } |
750 | 751 | ||
751 | #define params_access(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_ACCESS)) | 752 | #define params_access(p) ((__force snd_pcm_access_t)snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_ACCESS))) |
752 | #define params_format(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_FORMAT)) | 753 | #define params_format(p) ((__force snd_pcm_format_t)snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_FORMAT))) |
753 | #define params_subformat(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_SUBFORMAT)) | 754 | #define params_subformat(p) snd_mask_min(hw_param_mask((p), SNDRV_PCM_HW_PARAM_SUBFORMAT)) |
754 | #define params_channels(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_CHANNELS)->min | 755 | #define params_channels(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_CHANNELS)->min |
755 | #define params_rate(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_RATE)->min | 756 | #define params_rate(p) hw_param_interval((p), SNDRV_PCM_HW_PARAM_RATE)->min |
diff --git a/include/sound/sh_fsi.h b/include/sound/sh_fsi.h index d79894192ae3..9a155f9d0a12 100644 --- a/include/sound/sh_fsi.h +++ b/include/sound/sh_fsi.h | |||
@@ -15,67 +15,29 @@ | |||
15 | #define FSI_PORT_A 0 | 15 | #define FSI_PORT_A 0 |
16 | #define FSI_PORT_B 1 | 16 | #define FSI_PORT_B 1 |
17 | 17 | ||
18 | /* flags format | ||
19 | |||
20 | * 0xABCDEEFF | ||
21 | * | ||
22 | * A: channel size for TDM (input) | ||
23 | * B: channel size for TDM (ooutput) | ||
24 | * C: inversion | ||
25 | * D: mode | ||
26 | * E: input format | ||
27 | * F: output format | ||
28 | */ | ||
29 | |||
30 | #include <linux/clk.h> | 18 | #include <linux/clk.h> |
31 | #include <sound/soc.h> | 19 | #include <sound/soc.h> |
32 | 20 | ||
33 | /* TDM channel */ | 21 | /* |
34 | #define SH_FSI_SET_CH_I(x) ((x & 0xF) << 28) | 22 | * flags format |
35 | #define SH_FSI_SET_CH_O(x) ((x & 0xF) << 24) | 23 | * |
36 | 24 | * 0x000000BA | |
37 | #define SH_FSI_CH_IMASK 0xF0000000 | 25 | * |
38 | #define SH_FSI_CH_OMASK 0x0F000000 | 26 | * A: inversion |
39 | #define SH_FSI_GET_CH_I(x) ((x & SH_FSI_CH_IMASK) >> 28) | 27 | * B: format mode |
40 | #define SH_FSI_GET_CH_O(x) ((x & SH_FSI_CH_OMASK) >> 24) | 28 | */ |
41 | |||
42 | /* clock inversion */ | ||
43 | #define SH_FSI_INVERSION_MASK 0x00F00000 | ||
44 | #define SH_FSI_LRM_INV (1 << 20) | ||
45 | #define SH_FSI_BRM_INV (1 << 21) | ||
46 | #define SH_FSI_LRS_INV (1 << 22) | ||
47 | #define SH_FSI_BRS_INV (1 << 23) | ||
48 | |||
49 | /* mode */ | ||
50 | #define SH_FSI_MODE_MASK 0x000F0000 | ||
51 | #define SH_FSI_IN_SLAVE_MODE (1 << 16) /* default master mode */ | ||
52 | #define SH_FSI_OUT_SLAVE_MODE (1 << 17) /* default master mode */ | ||
53 | |||
54 | /* DI format */ | ||
55 | #define SH_FSI_FMT_MASK 0x000000FF | ||
56 | #define SH_FSI_IFMT(x) (((SH_FSI_FMT_ ## x) & SH_FSI_FMT_MASK) << 8) | ||
57 | #define SH_FSI_OFMT(x) (((SH_FSI_FMT_ ## x) & SH_FSI_FMT_MASK) << 0) | ||
58 | #define SH_FSI_GET_IFMT(x) ((x >> 8) & SH_FSI_FMT_MASK) | ||
59 | #define SH_FSI_GET_OFMT(x) ((x >> 0) & SH_FSI_FMT_MASK) | ||
60 | |||
61 | #define SH_FSI_FMT_MONO 0 | ||
62 | #define SH_FSI_FMT_MONO_DELAY 1 | ||
63 | #define SH_FSI_FMT_PCM 2 | ||
64 | #define SH_FSI_FMT_I2S 3 | ||
65 | #define SH_FSI_FMT_TDM 4 | ||
66 | #define SH_FSI_FMT_TDM_DELAY 5 | ||
67 | #define SH_FSI_FMT_SPDIF 6 | ||
68 | |||
69 | |||
70 | #define SH_FSI_IFMT_TDM_CH(x) \ | ||
71 | (SH_FSI_IFMT(TDM) | SH_FSI_SET_CH_I(x)) | ||
72 | #define SH_FSI_IFMT_TDM_DELAY_CH(x) \ | ||
73 | (SH_FSI_IFMT(TDM_DELAY) | SH_FSI_SET_CH_I(x)) | ||
74 | 29 | ||
75 | #define SH_FSI_OFMT_TDM_CH(x) \ | 30 | /* A: clock inversion */ |
76 | (SH_FSI_OFMT(TDM) | SH_FSI_SET_CH_O(x)) | 31 | #define SH_FSI_INVERSION_MASK 0x0000000F |
77 | #define SH_FSI_OFMT_TDM_DELAY_CH(x) \ | 32 | #define SH_FSI_LRM_INV (1 << 0) |
78 | (SH_FSI_OFMT(TDM_DELAY) | SH_FSI_SET_CH_O(x)) | 33 | #define SH_FSI_BRM_INV (1 << 1) |
34 | #define SH_FSI_LRS_INV (1 << 2) | ||
35 | #define SH_FSI_BRS_INV (1 << 3) | ||
36 | |||
37 | /* B: format mode */ | ||
38 | #define SH_FSI_FMT_MASK 0x000000F0 | ||
39 | #define SH_FSI_FMT_DAI (0 << 4) | ||
40 | #define SH_FSI_FMT_SPDIF (1 << 4) | ||
79 | 41 | ||
80 | 42 | ||
81 | /* | 43 | /* |
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 8031769ac485..979ed84e07d6 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h | |||
@@ -157,6 +157,18 @@ | |||
157 | .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \ | 157 | .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \ |
158 | .event = wevent, .event_flags = wflags} | 158 | .event = wevent, .event_flags = wflags} |
159 | 159 | ||
160 | /* additional sequencing control within an event type */ | ||
161 | #define SND_SOC_DAPM_PGA_S(wname, wsubseq, wreg, wshift, winvert, \ | ||
162 | wevent, wflags) \ | ||
163 | { .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \ | ||
164 | .invert = winvert, .event = wevent, .event_flags = wflags, \ | ||
165 | .subseq = wsubseq} | ||
166 | #define SND_SOC_DAPM_SUPPLY_S(wname, wsubseq, wreg, wshift, winvert, wevent, \ | ||
167 | wflags) \ | ||
168 | { .id = snd_soc_dapm_supply, .name = wname, .reg = wreg, \ | ||
169 | .shift = wshift, .invert = winvert, .event = wevent, \ | ||
170 | .event_flags = wflags, .subseq = wsubseq} | ||
171 | |||
160 | /* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */ | 172 | /* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */ |
161 | #define SOC_PGA_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \ | 173 | #define SOC_PGA_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \ |
162 | wevent, wflags) \ | 174 | wevent, wflags) \ |
@@ -450,6 +462,7 @@ struct snd_soc_dapm_widget { | |||
450 | unsigned char ext:1; /* has external widgets */ | 462 | unsigned char ext:1; /* has external widgets */ |
451 | unsigned char force:1; /* force state */ | 463 | unsigned char force:1; /* force state */ |
452 | unsigned char ignore_suspend:1; /* kept enabled over suspend */ | 464 | unsigned char ignore_suspend:1; /* kept enabled over suspend */ |
465 | int subseq; /* sort within widget type */ | ||
453 | 466 | ||
454 | int (*power_check)(struct snd_soc_dapm_widget *w); | 467 | int (*power_check)(struct snd_soc_dapm_widget *w); |
455 | 468 | ||
@@ -487,6 +500,9 @@ struct snd_soc_dapm_context { | |||
487 | 500 | ||
488 | struct snd_soc_dapm_update *update; | 501 | struct snd_soc_dapm_update *update; |
489 | 502 | ||
503 | void (*seq_notifier)(struct snd_soc_dapm_context *, | ||
504 | enum snd_soc_dapm_type, int); | ||
505 | |||
490 | struct device *dev; /* from parent - for debug */ | 506 | struct device *dev; /* from parent - for debug */ |
491 | struct snd_soc_codec *codec; /* parent codec */ | 507 | struct snd_soc_codec *codec; /* parent codec */ |
492 | struct snd_soc_card *card; /* parent card */ | 508 | struct snd_soc_card *card; /* parent card */ |
diff --git a/include/sound/soc.h b/include/sound/soc.h index 74921f20a1d8..bfa4836ea107 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -234,6 +234,7 @@ struct snd_soc_codec; | |||
234 | struct snd_soc_codec_driver; | 234 | struct snd_soc_codec_driver; |
235 | struct soc_enum; | 235 | struct soc_enum; |
236 | struct snd_soc_jack; | 236 | struct snd_soc_jack; |
237 | struct snd_soc_jack_zone; | ||
237 | struct snd_soc_jack_pin; | 238 | struct snd_soc_jack_pin; |
238 | struct snd_soc_cache_ops; | 239 | struct snd_soc_cache_ops; |
239 | #include <sound/soc-dapm.h> | 240 | #include <sound/soc-dapm.h> |
@@ -258,6 +259,16 @@ enum snd_soc_compress_type { | |||
258 | SND_SOC_RBTREE_COMPRESSION | 259 | SND_SOC_RBTREE_COMPRESSION |
259 | }; | 260 | }; |
260 | 261 | ||
262 | int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id, | ||
263 | unsigned int freq, int dir); | ||
264 | int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source, | ||
265 | unsigned int freq_in, unsigned int freq_out); | ||
266 | |||
267 | int snd_soc_register_card(struct snd_soc_card *card); | ||
268 | int snd_soc_unregister_card(struct snd_soc_card *card); | ||
269 | int snd_soc_suspend(struct device *dev); | ||
270 | int snd_soc_resume(struct device *dev); | ||
271 | int snd_soc_poweroff(struct device *dev); | ||
261 | int snd_soc_register_platform(struct device *dev, | 272 | int snd_soc_register_platform(struct device *dev, |
262 | struct snd_soc_platform_driver *platform_drv); | 273 | struct snd_soc_platform_driver *platform_drv); |
263 | void snd_soc_unregister_platform(struct device *dev); | 274 | void snd_soc_unregister_platform(struct device *dev); |
@@ -265,7 +276,8 @@ int snd_soc_register_codec(struct device *dev, | |||
265 | const struct snd_soc_codec_driver *codec_drv, | 276 | const struct snd_soc_codec_driver *codec_drv, |
266 | struct snd_soc_dai_driver *dai_drv, int num_dai); | 277 | struct snd_soc_dai_driver *dai_drv, int num_dai); |
267 | void snd_soc_unregister_codec(struct device *dev); | 278 | void snd_soc_unregister_codec(struct device *dev); |
268 | int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg); | 279 | int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, |
280 | unsigned int reg); | ||
269 | int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, | 281 | int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, |
270 | int addr_bits, int data_bits, | 282 | int addr_bits, int data_bits, |
271 | enum snd_soc_control_type control); | 283 | enum snd_soc_control_type control); |
@@ -276,6 +288,10 @@ int snd_soc_cache_write(struct snd_soc_codec *codec, | |||
276 | unsigned int reg, unsigned int value); | 288 | unsigned int reg, unsigned int value); |
277 | int snd_soc_cache_read(struct snd_soc_codec *codec, | 289 | int snd_soc_cache_read(struct snd_soc_codec *codec, |
278 | unsigned int reg, unsigned int *value); | 290 | unsigned int reg, unsigned int *value); |
291 | int snd_soc_default_volatile_register(struct snd_soc_codec *codec, | ||
292 | unsigned int reg); | ||
293 | int snd_soc_default_readable_register(struct snd_soc_codec *codec, | ||
294 | unsigned int reg); | ||
279 | 295 | ||
280 | /* Utility functions to get clock rates from various things */ | 296 | /* Utility functions to get clock rates from various things */ |
281 | int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots); | 297 | int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots); |
@@ -297,6 +313,9 @@ void snd_soc_jack_notifier_register(struct snd_soc_jack *jack, | |||
297 | struct notifier_block *nb); | 313 | struct notifier_block *nb); |
298 | void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack, | 314 | void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack, |
299 | struct notifier_block *nb); | 315 | struct notifier_block *nb); |
316 | int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count, | ||
317 | struct snd_soc_jack_zone *zones); | ||
318 | int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage); | ||
300 | #ifdef CONFIG_GPIOLIB | 319 | #ifdef CONFIG_GPIOLIB |
301 | int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, | 320 | int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, |
302 | struct snd_soc_jack_gpio *gpios); | 321 | struct snd_soc_jack_gpio *gpios); |
@@ -321,7 +340,8 @@ void snd_soc_free_ac97_codec(struct snd_soc_codec *codec); | |||
321 | *Controls | 340 | *Controls |
322 | */ | 341 | */ |
323 | struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, | 342 | struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, |
324 | void *data, char *long_name); | 343 | void *data, char *long_name, |
344 | const char *prefix); | ||
325 | int snd_soc_add_controls(struct snd_soc_codec *codec, | 345 | int snd_soc_add_controls(struct snd_soc_codec *codec, |
326 | const struct snd_kcontrol_new *controls, int num_controls); | 346 | const struct snd_kcontrol_new *controls, int num_controls); |
327 | int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol, | 347 | int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol, |
@@ -367,6 +387,22 @@ int snd_soc_put_volsw_2r_sx(struct snd_kcontrol *kcontrol, | |||
367 | struct snd_ctl_elem_value *ucontrol); | 387 | struct snd_ctl_elem_value *ucontrol); |
368 | 388 | ||
369 | /** | 389 | /** |
390 | * struct snd_soc_reg_access - Describes whether a given register is | ||
391 | * readable, writable or volatile. | ||
392 | * | ||
393 | * @reg: the register number | ||
394 | * @read: whether this register is readable | ||
395 | * @write: whether this register is writable | ||
396 | * @vol: whether this register is volatile | ||
397 | */ | ||
398 | struct snd_soc_reg_access { | ||
399 | u16 reg; | ||
400 | u16 read; | ||
401 | u16 write; | ||
402 | u16 vol; | ||
403 | }; | ||
404 | |||
405 | /** | ||
370 | * struct snd_soc_jack_pin - Describes a pin to update based on jack detection | 406 | * struct snd_soc_jack_pin - Describes a pin to update based on jack detection |
371 | * | 407 | * |
372 | * @pin: name of the pin to update | 408 | * @pin: name of the pin to update |
@@ -381,6 +417,24 @@ struct snd_soc_jack_pin { | |||
381 | }; | 417 | }; |
382 | 418 | ||
383 | /** | 419 | /** |
420 | * struct snd_soc_jack_zone - Describes voltage zones of jack detection | ||
421 | * | ||
422 | * @min_mv: start voltage in mv | ||
423 | * @max_mv: end voltage in mv | ||
424 | * @jack_type: type of jack that is expected for this voltage | ||
425 | * @debounce_time: debounce_time for jack, codec driver should wait for this | ||
426 | * duration before reading the adc for voltages | ||
427 | * @:list: list container | ||
428 | */ | ||
429 | struct snd_soc_jack_zone { | ||
430 | unsigned int min_mv; | ||
431 | unsigned int max_mv; | ||
432 | unsigned int jack_type; | ||
433 | unsigned int debounce_time; | ||
434 | struct list_head list; | ||
435 | }; | ||
436 | |||
437 | /** | ||
384 | * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection | 438 | * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection |
385 | * | 439 | * |
386 | * @gpio: gpio number | 440 | * @gpio: gpio number |
@@ -388,6 +442,10 @@ struct snd_soc_jack_pin { | |||
388 | * @report: value to report when jack detected | 442 | * @report: value to report when jack detected |
389 | * @invert: report presence in low state | 443 | * @invert: report presence in low state |
390 | * @debouce_time: debouce time in ms | 444 | * @debouce_time: debouce time in ms |
445 | * @wake: enable as wake source | ||
446 | * @jack_status_check: callback function which overrides the detection | ||
447 | * to provide more complex checks (eg, reading an | ||
448 | * ADC). | ||
391 | */ | 449 | */ |
392 | #ifdef CONFIG_GPIOLIB | 450 | #ifdef CONFIG_GPIOLIB |
393 | struct snd_soc_jack_gpio { | 451 | struct snd_soc_jack_gpio { |
@@ -396,6 +454,8 @@ struct snd_soc_jack_gpio { | |||
396 | int report; | 454 | int report; |
397 | int invert; | 455 | int invert; |
398 | int debounce_time; | 456 | int debounce_time; |
457 | bool wake; | ||
458 | |||
399 | struct snd_soc_jack *jack; | 459 | struct snd_soc_jack *jack; |
400 | struct delayed_work work; | 460 | struct delayed_work work; |
401 | 461 | ||
@@ -409,6 +469,7 @@ struct snd_soc_jack { | |||
409 | struct list_head pins; | 469 | struct list_head pins; |
410 | int status; | 470 | int status; |
411 | struct blocking_notifier_head notifier; | 471 | struct blocking_notifier_head notifier; |
472 | struct list_head jack_zones; | ||
412 | }; | 473 | }; |
413 | 474 | ||
414 | /* SoC PCM stream information */ | 475 | /* SoC PCM stream information */ |
@@ -459,18 +520,22 @@ struct snd_soc_codec { | |||
459 | struct list_head card_list; | 520 | struct list_head card_list; |
460 | int num_dai; | 521 | int num_dai; |
461 | enum snd_soc_compress_type compress_type; | 522 | enum snd_soc_compress_type compress_type; |
523 | size_t reg_size; /* reg_cache_size * reg_word_size */ | ||
524 | int (*volatile_register)(struct snd_soc_codec *, unsigned int); | ||
525 | int (*readable_register)(struct snd_soc_codec *, unsigned int); | ||
462 | 526 | ||
463 | /* runtime */ | 527 | /* runtime */ |
464 | struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */ | 528 | struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */ |
465 | unsigned int active; | 529 | unsigned int active; |
466 | unsigned int cache_only:1; /* Suppress writes to hardware */ | 530 | unsigned int cache_bypass:1; /* Suppress access to the cache */ |
467 | unsigned int cache_sync:1; /* Cache needs to be synced to hardware */ | ||
468 | unsigned int suspended:1; /* Codec is in suspend PM state */ | 531 | unsigned int suspended:1; /* Codec is in suspend PM state */ |
469 | unsigned int probed:1; /* Codec has been probed */ | 532 | unsigned int probed:1; /* Codec has been probed */ |
470 | unsigned int ac97_registered:1; /* Codec has been AC97 registered */ | 533 | unsigned int ac97_registered:1; /* Codec has been AC97 registered */ |
471 | unsigned int ac97_created:1; /* Codec has been created by SoC */ | 534 | unsigned int ac97_created:1; /* Codec has been created by SoC */ |
472 | unsigned int sysfs_registered:1; /* codec has been sysfs registered */ | 535 | unsigned int sysfs_registered:1; /* codec has been sysfs registered */ |
473 | unsigned int cache_init:1; /* codec cache has been initialized */ | 536 | unsigned int cache_init:1; /* codec cache has been initialized */ |
537 | u32 cache_only; /* Suppress writes to hardware */ | ||
538 | u32 cache_sync; /* Cache needs to be synced to hardware */ | ||
474 | 539 | ||
475 | /* codec IO */ | 540 | /* codec IO */ |
476 | void *control_data; /* codec control (i2c/3wire) data */ | 541 | void *control_data; /* codec control (i2c/3wire) data */ |
@@ -503,22 +568,39 @@ struct snd_soc_codec_driver { | |||
503 | pm_message_t state); | 568 | pm_message_t state); |
504 | int (*resume)(struct snd_soc_codec *); | 569 | int (*resume)(struct snd_soc_codec *); |
505 | 570 | ||
571 | /* Default DAPM setup, added after probe() is run */ | ||
572 | const struct snd_soc_dapm_widget *dapm_widgets; | ||
573 | int num_dapm_widgets; | ||
574 | const struct snd_soc_dapm_route *dapm_routes; | ||
575 | int num_dapm_routes; | ||
576 | |||
577 | /* codec wide operations */ | ||
578 | int (*set_sysclk)(struct snd_soc_codec *codec, | ||
579 | int clk_id, unsigned int freq, int dir); | ||
580 | int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source, | ||
581 | unsigned int freq_in, unsigned int freq_out); | ||
582 | |||
506 | /* codec IO */ | 583 | /* codec IO */ |
507 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); | 584 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); |
508 | int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); | 585 | int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); |
509 | int (*display_register)(struct snd_soc_codec *, char *, | 586 | int (*display_register)(struct snd_soc_codec *, char *, |
510 | size_t, unsigned int); | 587 | size_t, unsigned int); |
511 | int (*volatile_register)(unsigned int); | 588 | int (*volatile_register)(struct snd_soc_codec *, unsigned int); |
512 | int (*readable_register)(unsigned int); | 589 | int (*readable_register)(struct snd_soc_codec *, unsigned int); |
513 | short reg_cache_size; | 590 | short reg_cache_size; |
514 | short reg_cache_step; | 591 | short reg_cache_step; |
515 | short reg_word_size; | 592 | short reg_word_size; |
516 | const void *reg_cache_default; | 593 | const void *reg_cache_default; |
594 | short reg_access_size; | ||
595 | const struct snd_soc_reg_access *reg_access_default; | ||
517 | enum snd_soc_compress_type compress_type; | 596 | enum snd_soc_compress_type compress_type; |
518 | 597 | ||
519 | /* codec bias level */ | 598 | /* codec bias level */ |
520 | int (*set_bias_level)(struct snd_soc_codec *, | 599 | int (*set_bias_level)(struct snd_soc_codec *, |
521 | enum snd_soc_bias_level level); | 600 | enum snd_soc_bias_level level); |
601 | |||
602 | void (*seq_notifier)(struct snd_soc_dapm_context *, | ||
603 | enum snd_soc_dapm_type, int); | ||
522 | }; | 604 | }; |
523 | 605 | ||
524 | /* SoC platform interface */ | 606 | /* SoC platform interface */ |
@@ -617,15 +699,16 @@ struct snd_soc_card { | |||
617 | 699 | ||
618 | bool instantiated; | 700 | bool instantiated; |
619 | 701 | ||
620 | int (*probe)(struct platform_device *pdev); | 702 | int (*probe)(struct snd_soc_card *card); |
621 | int (*remove)(struct platform_device *pdev); | 703 | int (*late_probe)(struct snd_soc_card *card); |
704 | int (*remove)(struct snd_soc_card *card); | ||
622 | 705 | ||
623 | /* the pre and post PM functions are used to do any PM work before and | 706 | /* the pre and post PM functions are used to do any PM work before and |
624 | * after the codec and DAI's do any PM work. */ | 707 | * after the codec and DAI's do any PM work. */ |
625 | int (*suspend_pre)(struct platform_device *pdev, pm_message_t state); | 708 | int (*suspend_pre)(struct snd_soc_card *card); |
626 | int (*suspend_post)(struct platform_device *pdev, pm_message_t state); | 709 | int (*suspend_post)(struct snd_soc_card *card); |
627 | int (*resume_pre)(struct platform_device *pdev); | 710 | int (*resume_pre)(struct snd_soc_card *card); |
628 | int (*resume_post)(struct platform_device *pdev); | 711 | int (*resume_post)(struct snd_soc_card *card); |
629 | 712 | ||
630 | /* callbacks */ | 713 | /* callbacks */ |
631 | int (*set_bias_level)(struct snd_soc_card *, | 714 | int (*set_bias_level)(struct snd_soc_card *, |
@@ -654,6 +737,14 @@ struct snd_soc_card { | |||
654 | struct snd_soc_pcm_runtime *rtd_aux; | 737 | struct snd_soc_pcm_runtime *rtd_aux; |
655 | int num_aux_rtd; | 738 | int num_aux_rtd; |
656 | 739 | ||
740 | /* | ||
741 | * Card-specific routes and widgets. | ||
742 | */ | ||
743 | struct snd_soc_dapm_widget *dapm_widgets; | ||
744 | int num_dapm_widgets; | ||
745 | struct snd_soc_dapm_route *dapm_routes; | ||
746 | int num_dapm_routes; | ||
747 | |||
657 | struct work_struct deferred_resume_work; | 748 | struct work_struct deferred_resume_work; |
658 | 749 | ||
659 | /* lists of probed devices belonging to this card */ | 750 | /* lists of probed devices belonging to this card */ |
@@ -665,11 +756,16 @@ struct snd_soc_card { | |||
665 | struct list_head paths; | 756 | struct list_head paths; |
666 | struct list_head dapm_list; | 757 | struct list_head dapm_list; |
667 | 758 | ||
759 | /* Generic DAPM context for the card */ | ||
760 | struct snd_soc_dapm_context dapm; | ||
761 | |||
668 | #ifdef CONFIG_DEBUG_FS | 762 | #ifdef CONFIG_DEBUG_FS |
669 | struct dentry *debugfs_card_root; | 763 | struct dentry *debugfs_card_root; |
670 | struct dentry *debugfs_pop_time; | 764 | struct dentry *debugfs_pop_time; |
671 | #endif | 765 | #endif |
672 | u32 pop_time; | 766 | u32 pop_time; |
767 | |||
768 | void *drvdata; | ||
673 | }; | 769 | }; |
674 | 770 | ||
675 | /* SoC machine DAI configuration, glues a codec and cpu DAI together */ | 771 | /* SoC machine DAI configuration, glues a codec and cpu DAI together */ |
@@ -721,6 +817,17 @@ unsigned int snd_soc_write(struct snd_soc_codec *codec, | |||
721 | 817 | ||
722 | /* device driver data */ | 818 | /* device driver data */ |
723 | 819 | ||
820 | static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card, | ||
821 | void *data) | ||
822 | { | ||
823 | card->drvdata = data; | ||
824 | } | ||
825 | |||
826 | static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card) | ||
827 | { | ||
828 | return card->drvdata; | ||
829 | } | ||
830 | |||
724 | static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec, | 831 | static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec, |
725 | void *data) | 832 | void *data) |
726 | { | 833 | { |
@@ -754,6 +861,22 @@ static inline void *snd_soc_pcm_get_drvdata(struct snd_soc_pcm_runtime *rtd) | |||
754 | return dev_get_drvdata(&rtd->dev); | 861 | return dev_get_drvdata(&rtd->dev); |
755 | } | 862 | } |
756 | 863 | ||
864 | static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card) | ||
865 | { | ||
866 | INIT_LIST_HEAD(&card->dai_dev_list); | ||
867 | INIT_LIST_HEAD(&card->codec_dev_list); | ||
868 | INIT_LIST_HEAD(&card->platform_dev_list); | ||
869 | INIT_LIST_HEAD(&card->widgets); | ||
870 | INIT_LIST_HEAD(&card->paths); | ||
871 | INIT_LIST_HEAD(&card->dapm_list); | ||
872 | } | ||
873 | |||
757 | #include <sound/soc-dai.h> | 874 | #include <sound/soc-dai.h> |
758 | 875 | ||
876 | #ifdef CONFIG_DEBUG_FS | ||
877 | extern struct dentry *snd_soc_debugfs_root; | ||
878 | #endif | ||
879 | |||
880 | extern const struct dev_pm_ops snd_soc_pm_ops; | ||
881 | |||
759 | #endif | 882 | #endif |
diff --git a/include/sound/tlv320aic32x4.h b/include/sound/tlv320aic32x4.h new file mode 100644 index 000000000000..c009f70b4029 --- /dev/null +++ b/include/sound/tlv320aic32x4.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * tlv320aic32x4.h -- TLV320AIC32X4 Soc Audio driver platform data | ||
3 | * | ||
4 | * Copyright 2011 Vista Silicon S.L. | ||
5 | * | ||
6 | * Author: Javier Martin <javier.martin@vista-silicon.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #ifndef _AIC32X4_PDATA_H | ||
14 | #define _AIC32X4_PDATA_H | ||
15 | |||
16 | #define AIC32X4_PWR_MICBIAS_2075_LDOIN 0x00000001 | ||
17 | #define AIC32X4_PWR_AVDD_DVDD_WEAK_DISABLE 0x00000002 | ||
18 | #define AIC32X4_PWR_AIC32X4_LDO_ENABLE 0x00000004 | ||
19 | #define AIC32X4_PWR_CMMODE_LDOIN_RANGE_18_36 0x00000008 | ||
20 | #define AIC32X4_PWR_CMMODE_HP_LDOIN_POWERED 0x00000010 | ||
21 | |||
22 | #define AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K 0x00000001 | ||
23 | #define AIC32X4_MICPGA_ROUTE_RMIC_IN1L_10K 0x00000002 | ||
24 | |||
25 | struct aic32x4_pdata { | ||
26 | u32 power_cfg; | ||
27 | u32 micpga_routing; | ||
28 | bool swapdacs; | ||
29 | }; | ||
30 | |||
31 | #endif | ||
diff --git a/include/sound/version.h b/include/sound/version.h index bf69a5b7e65f..8fc5321e1ecc 100644 --- a/include/sound/version.h +++ b/include/sound/version.h | |||
@@ -1,3 +1,3 @@ | |||
1 | /* include/version.h */ | 1 | /* include/version.h */ |
2 | #define CONFIG_SND_VERSION "1.0.23" | 2 | #define CONFIG_SND_VERSION "1.0.24" |
3 | #define CONFIG_SND_DATE "" | 3 | #define CONFIG_SND_DATE "" |
diff --git a/include/sound/wm8903.h b/include/sound/wm8903.h index 1eeebd534f7e..cf7ccb76a8de 100644 --- a/include/sound/wm8903.h +++ b/include/sound/wm8903.h | |||
@@ -33,6 +33,21 @@ | |||
33 | #define WM8903_MICBIAS_ENA_WIDTH 1 /* MICBIAS_ENA */ | 33 | #define WM8903_MICBIAS_ENA_WIDTH 1 /* MICBIAS_ENA */ |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * WM8903_GPn_FN values | ||
37 | * | ||
38 | * See datasheets for list of valid values per pin | ||
39 | */ | ||
40 | #define WM8903_GPn_FN_GPIO_OUTPUT 0 | ||
41 | #define WM8903_GPn_FN_BCLK 1 | ||
42 | #define WM8903_GPn_FN_IRQ_OUTPT 2 | ||
43 | #define WM8903_GPn_FN_GPIO_INPUT 3 | ||
44 | #define WM8903_GPn_FN_MICBIAS_CURRENT_DETECT 4 | ||
45 | #define WM8903_GPn_FN_MICBIAS_SHORT_DETECT 5 | ||
46 | #define WM8903_GPn_FN_DMIC_LR_CLK_OUTPUT 6 | ||
47 | #define WM8903_GPn_FN_FLL_LOCK_OUTPUT 8 | ||
48 | #define WM8903_GPn_FN_FLL_CLOCK_OUTPUT 9 | ||
49 | |||
50 | /* | ||
36 | * R116 (0x74) - GPIO Control 1 | 51 | * R116 (0x74) - GPIO Control 1 |
37 | */ | 52 | */ |
38 | #define WM8903_GP1_FN_MASK 0x1F00 /* GP1_FN - [12:8] */ | 53 | #define WM8903_GP1_FN_MASK 0x1F00 /* GP1_FN - [12:8] */ |
@@ -227,6 +242,8 @@ | |||
227 | #define WM8903_GP5_DB_SHIFT 0 /* GP5_DB */ | 242 | #define WM8903_GP5_DB_SHIFT 0 /* GP5_DB */ |
228 | #define WM8903_GP5_DB_WIDTH 1 /* GP5_DB */ | 243 | #define WM8903_GP5_DB_WIDTH 1 /* GP5_DB */ |
229 | 244 | ||
245 | #define WM8903_NUM_GPIO 5 | ||
246 | |||
230 | struct wm8903_platform_data { | 247 | struct wm8903_platform_data { |
231 | bool irq_active_low; /* Set if IRQ active low, default high */ | 248 | bool irq_active_low; /* Set if IRQ active low, default high */ |
232 | 249 | ||
@@ -239,7 +256,8 @@ struct wm8903_platform_data { | |||
239 | 256 | ||
240 | int micdet_delay; /* Delay after microphone detection (ms) */ | 257 | int micdet_delay; /* Delay after microphone detection (ms) */ |
241 | 258 | ||
242 | u32 gpio_cfg[5]; /* Default register values for GPIO pin mux */ | 259 | int gpio_base; |
260 | u32 gpio_cfg[WM8903_NUM_GPIO]; /* Default register values for GPIO pin mux */ | ||
243 | }; | 261 | }; |
244 | 262 | ||
245 | #endif | 263 | #endif |
diff --git a/include/sound/wm9081.h b/include/sound/wm9081.h index e173ddbf6bd4..f34b0b1716d8 100644 --- a/include/sound/wm9081.h +++ b/include/sound/wm9081.h | |||
@@ -17,9 +17,12 @@ struct wm9081_retune_mobile_setting { | |||
17 | u16 config[20]; | 17 | u16 config[20]; |
18 | }; | 18 | }; |
19 | 19 | ||
20 | struct wm9081_retune_mobile_config { | 20 | struct wm9081_pdata { |
21 | struct wm9081_retune_mobile_setting *configs; | 21 | bool irq_high; /* IRQ is active high */ |
22 | int num_configs; | 22 | bool irq_cmos; /* IRQ is in CMOS mode */ |
23 | |||
24 | struct wm9081_retune_mobile_setting *retune_configs; | ||
25 | int num_retune_configs; | ||
23 | }; | 26 | }; |
24 | 27 | ||
25 | #endif | 28 | #endif |
diff --git a/include/trace/events/asoc.h b/include/trace/events/asoc.h index 186e84db4b54..ae973d2e27a1 100644 --- a/include/trace/events/asoc.h +++ b/include/trace/events/asoc.h | |||
@@ -229,6 +229,31 @@ TRACE_EVENT(snd_soc_jack_notify, | |||
229 | TP_printk("jack=%s %x", __get_str(name), (int)__entry->val) | 229 | TP_printk("jack=%s %x", __get_str(name), (int)__entry->val) |
230 | ); | 230 | ); |
231 | 231 | ||
232 | TRACE_EVENT(snd_soc_cache_sync, | ||
233 | |||
234 | TP_PROTO(struct snd_soc_codec *codec, const char *type, | ||
235 | const char *status), | ||
236 | |||
237 | TP_ARGS(codec, type, status), | ||
238 | |||
239 | TP_STRUCT__entry( | ||
240 | __string( name, codec->name ) | ||
241 | __string( status, status ) | ||
242 | __string( type, type ) | ||
243 | __field( int, id ) | ||
244 | ), | ||
245 | |||
246 | TP_fast_assign( | ||
247 | __assign_str(name, codec->name); | ||
248 | __assign_str(status, status); | ||
249 | __assign_str(type, type); | ||
250 | __entry->id = codec->id; | ||
251 | ), | ||
252 | |||
253 | TP_printk("codec=%s.%d type=%s status=%s", __get_str(name), | ||
254 | (int)__entry->id, __get_str(type), __get_str(status)) | ||
255 | ); | ||
256 | |||
232 | #endif /* _TRACE_ASOC_H */ | 257 | #endif /* _TRACE_ASOC_H */ |
233 | 258 | ||
234 | /* This part must be outside protection */ | 259 | /* This part must be outside protection */ |
diff --git a/include/trace/events/bkl.h b/include/trace/events/bkl.h deleted file mode 100644 index 1af72dc24278..000000000000 --- a/include/trace/events/bkl.h +++ /dev/null | |||
@@ -1,61 +0,0 @@ | |||
1 | #undef TRACE_SYSTEM | ||
2 | #define TRACE_SYSTEM bkl | ||
3 | |||
4 | #if !defined(_TRACE_BKL_H) || defined(TRACE_HEADER_MULTI_READ) | ||
5 | #define _TRACE_BKL_H | ||
6 | |||
7 | #include <linux/tracepoint.h> | ||
8 | |||
9 | TRACE_EVENT(lock_kernel, | ||
10 | |||
11 | TP_PROTO(const char *func, const char *file, int line), | ||
12 | |||
13 | TP_ARGS(func, file, line), | ||
14 | |||
15 | TP_STRUCT__entry( | ||
16 | __field( int, depth ) | ||
17 | __field_ext( const char *, func, FILTER_PTR_STRING ) | ||
18 | __field_ext( const char *, file, FILTER_PTR_STRING ) | ||
19 | __field( int, line ) | ||
20 | ), | ||
21 | |||
22 | TP_fast_assign( | ||
23 | /* We want to record the lock_depth after lock is acquired */ | ||
24 | __entry->depth = current->lock_depth + 1; | ||
25 | __entry->func = func; | ||
26 | __entry->file = file; | ||
27 | __entry->line = line; | ||
28 | ), | ||
29 | |||
30 | TP_printk("depth=%d file:line=%s:%d func=%s()", __entry->depth, | ||
31 | __entry->file, __entry->line, __entry->func) | ||
32 | ); | ||
33 | |||
34 | TRACE_EVENT(unlock_kernel, | ||
35 | |||
36 | TP_PROTO(const char *func, const char *file, int line), | ||
37 | |||
38 | TP_ARGS(func, file, line), | ||
39 | |||
40 | TP_STRUCT__entry( | ||
41 | __field(int, depth ) | ||
42 | __field(const char *, func ) | ||
43 | __field(const char *, file ) | ||
44 | __field(int, line ) | ||
45 | ), | ||
46 | |||
47 | TP_fast_assign( | ||
48 | __entry->depth = current->lock_depth; | ||
49 | __entry->func = func; | ||
50 | __entry->file = file; | ||
51 | __entry->line = line; | ||
52 | ), | ||
53 | |||
54 | TP_printk("depth=%d file:line=%s:%d func=%s()", __entry->depth, | ||
55 | __entry->file, __entry->line, __entry->func) | ||
56 | ); | ||
57 | |||
58 | #endif /* _TRACE_BKL_H */ | ||
59 | |||
60 | /* This part must be outside protection */ | ||
61 | #include <trace/define_trace.h> | ||
diff --git a/include/trace/events/mce.h b/include/trace/events/mce.h index 7eee77895cb3..4cbbcef6baa8 100644 --- a/include/trace/events/mce.h +++ b/include/trace/events/mce.h | |||
@@ -17,36 +17,36 @@ TRACE_EVENT(mce_record, | |||
17 | TP_STRUCT__entry( | 17 | TP_STRUCT__entry( |
18 | __field( u64, mcgcap ) | 18 | __field( u64, mcgcap ) |
19 | __field( u64, mcgstatus ) | 19 | __field( u64, mcgstatus ) |
20 | __field( u8, bank ) | ||
21 | __field( u64, status ) | 20 | __field( u64, status ) |
22 | __field( u64, addr ) | 21 | __field( u64, addr ) |
23 | __field( u64, misc ) | 22 | __field( u64, misc ) |
24 | __field( u64, ip ) | 23 | __field( u64, ip ) |
25 | __field( u8, cs ) | ||
26 | __field( u64, tsc ) | 24 | __field( u64, tsc ) |
27 | __field( u64, walltime ) | 25 | __field( u64, walltime ) |
28 | __field( u32, cpu ) | 26 | __field( u32, cpu ) |
29 | __field( u32, cpuid ) | 27 | __field( u32, cpuid ) |
30 | __field( u32, apicid ) | 28 | __field( u32, apicid ) |
31 | __field( u32, socketid ) | 29 | __field( u32, socketid ) |
30 | __field( u8, cs ) | ||
31 | __field( u8, bank ) | ||
32 | __field( u8, cpuvendor ) | 32 | __field( u8, cpuvendor ) |
33 | ), | 33 | ), |
34 | 34 | ||
35 | TP_fast_assign( | 35 | TP_fast_assign( |
36 | __entry->mcgcap = m->mcgcap; | 36 | __entry->mcgcap = m->mcgcap; |
37 | __entry->mcgstatus = m->mcgstatus; | 37 | __entry->mcgstatus = m->mcgstatus; |
38 | __entry->bank = m->bank; | ||
39 | __entry->status = m->status; | 38 | __entry->status = m->status; |
40 | __entry->addr = m->addr; | 39 | __entry->addr = m->addr; |
41 | __entry->misc = m->misc; | 40 | __entry->misc = m->misc; |
42 | __entry->ip = m->ip; | 41 | __entry->ip = m->ip; |
43 | __entry->cs = m->cs; | ||
44 | __entry->tsc = m->tsc; | 42 | __entry->tsc = m->tsc; |
45 | __entry->walltime = m->time; | 43 | __entry->walltime = m->time; |
46 | __entry->cpu = m->extcpu; | 44 | __entry->cpu = m->extcpu; |
47 | __entry->cpuid = m->cpuid; | 45 | __entry->cpuid = m->cpuid; |
48 | __entry->apicid = m->apicid; | 46 | __entry->apicid = m->apicid; |
49 | __entry->socketid = m->socketid; | 47 | __entry->socketid = m->socketid; |
48 | __entry->cs = m->cs; | ||
49 | __entry->bank = m->bank; | ||
50 | __entry->cpuvendor = m->cpuvendor; | 50 | __entry->cpuvendor = m->cpuvendor; |
51 | ), | 51 | ), |
52 | 52 | ||
diff --git a/include/trace/events/module.h b/include/trace/events/module.h index c6bae36547e5..21a546d27c0c 100644 --- a/include/trace/events/module.h +++ b/include/trace/events/module.h | |||
@@ -108,14 +108,14 @@ TRACE_EVENT(module_request, | |||
108 | TP_ARGS(name, wait, ip), | 108 | TP_ARGS(name, wait, ip), |
109 | 109 | ||
110 | TP_STRUCT__entry( | 110 | TP_STRUCT__entry( |
111 | __field( bool, wait ) | ||
112 | __field( unsigned long, ip ) | 111 | __field( unsigned long, ip ) |
112 | __field( bool, wait ) | ||
113 | __string( name, name ) | 113 | __string( name, name ) |
114 | ), | 114 | ), |
115 | 115 | ||
116 | TP_fast_assign( | 116 | TP_fast_assign( |
117 | __entry->wait = wait; | ||
118 | __entry->ip = ip; | 117 | __entry->ip = ip; |
118 | __entry->wait = wait; | ||
119 | __assign_str(name, name); | 119 | __assign_str(name, name); |
120 | ), | 120 | ), |
121 | 121 | ||
@@ -129,4 +129,3 @@ TRACE_EVENT(module_request, | |||
129 | 129 | ||
130 | /* This part must be outside protection */ | 130 | /* This part must be outside protection */ |
131 | #include <trace/define_trace.h> | 131 | #include <trace/define_trace.h> |
132 | |||
diff --git a/include/trace/events/scsi.h b/include/trace/events/scsi.h index 25fbefdf2f2e..db6c93510f74 100644 --- a/include/trace/events/scsi.h +++ b/include/trace/events/scsi.h | |||
@@ -184,6 +184,17 @@ | |||
184 | scsi_statusbyte_name(SAM_STAT_ACA_ACTIVE), \ | 184 | scsi_statusbyte_name(SAM_STAT_ACA_ACTIVE), \ |
185 | scsi_statusbyte_name(SAM_STAT_TASK_ABORTED)) | 185 | scsi_statusbyte_name(SAM_STAT_TASK_ABORTED)) |
186 | 186 | ||
187 | #define scsi_prot_op_name(result) { result, #result } | ||
188 | #define show_prot_op_name(val) \ | ||
189 | __print_symbolic(val, \ | ||
190 | scsi_prot_op_name(SCSI_PROT_NORMAL), \ | ||
191 | scsi_prot_op_name(SCSI_PROT_READ_INSERT), \ | ||
192 | scsi_prot_op_name(SCSI_PROT_WRITE_STRIP), \ | ||
193 | scsi_prot_op_name(SCSI_PROT_READ_STRIP), \ | ||
194 | scsi_prot_op_name(SCSI_PROT_WRITE_INSERT), \ | ||
195 | scsi_prot_op_name(SCSI_PROT_READ_PASS), \ | ||
196 | scsi_prot_op_name(SCSI_PROT_WRITE_PASS)) | ||
197 | |||
187 | const char *scsi_trace_parse_cdb(struct trace_seq*, unsigned char*, int); | 198 | const char *scsi_trace_parse_cdb(struct trace_seq*, unsigned char*, int); |
188 | #define __parse_cdb(cdb, len) scsi_trace_parse_cdb(p, cdb, len) | 199 | #define __parse_cdb(cdb, len) scsi_trace_parse_cdb(p, cdb, len) |
189 | 200 | ||
@@ -202,6 +213,7 @@ TRACE_EVENT(scsi_dispatch_cmd_start, | |||
202 | __field( unsigned int, cmd_len ) | 213 | __field( unsigned int, cmd_len ) |
203 | __field( unsigned int, data_sglen ) | 214 | __field( unsigned int, data_sglen ) |
204 | __field( unsigned int, prot_sglen ) | 215 | __field( unsigned int, prot_sglen ) |
216 | __field( unsigned char, prot_op ) | ||
205 | __dynamic_array(unsigned char, cmnd, cmd->cmd_len) | 217 | __dynamic_array(unsigned char, cmnd, cmd->cmd_len) |
206 | ), | 218 | ), |
207 | 219 | ||
@@ -214,13 +226,15 @@ TRACE_EVENT(scsi_dispatch_cmd_start, | |||
214 | __entry->cmd_len = cmd->cmd_len; | 226 | __entry->cmd_len = cmd->cmd_len; |
215 | __entry->data_sglen = scsi_sg_count(cmd); | 227 | __entry->data_sglen = scsi_sg_count(cmd); |
216 | __entry->prot_sglen = scsi_prot_sg_count(cmd); | 228 | __entry->prot_sglen = scsi_prot_sg_count(cmd); |
229 | __entry->prot_op = scsi_get_prot_op(cmd); | ||
217 | memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len); | 230 | memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len); |
218 | ), | 231 | ), |
219 | 232 | ||
220 | TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u" \ | 233 | TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u" \ |
221 | " cmnd=(%s %s raw=%s)", | 234 | " prot_op=%s cmnd=(%s %s raw=%s)", |
222 | __entry->host_no, __entry->channel, __entry->id, | 235 | __entry->host_no, __entry->channel, __entry->id, |
223 | __entry->lun, __entry->data_sglen, __entry->prot_sglen, | 236 | __entry->lun, __entry->data_sglen, __entry->prot_sglen, |
237 | show_prot_op_name(__entry->prot_op), | ||
224 | show_opcode_name(__entry->opcode), | 238 | show_opcode_name(__entry->opcode), |
225 | __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len), | 239 | __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len), |
226 | __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len)) | 240 | __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len)) |
@@ -242,6 +256,7 @@ TRACE_EVENT(scsi_dispatch_cmd_error, | |||
242 | __field( unsigned int, cmd_len ) | 256 | __field( unsigned int, cmd_len ) |
243 | __field( unsigned int, data_sglen ) | 257 | __field( unsigned int, data_sglen ) |
244 | __field( unsigned int, prot_sglen ) | 258 | __field( unsigned int, prot_sglen ) |
259 | __field( unsigned char, prot_op ) | ||
245 | __dynamic_array(unsigned char, cmnd, cmd->cmd_len) | 260 | __dynamic_array(unsigned char, cmnd, cmd->cmd_len) |
246 | ), | 261 | ), |
247 | 262 | ||
@@ -255,13 +270,15 @@ TRACE_EVENT(scsi_dispatch_cmd_error, | |||
255 | __entry->cmd_len = cmd->cmd_len; | 270 | __entry->cmd_len = cmd->cmd_len; |
256 | __entry->data_sglen = scsi_sg_count(cmd); | 271 | __entry->data_sglen = scsi_sg_count(cmd); |
257 | __entry->prot_sglen = scsi_prot_sg_count(cmd); | 272 | __entry->prot_sglen = scsi_prot_sg_count(cmd); |
273 | __entry->prot_op = scsi_get_prot_op(cmd); | ||
258 | memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len); | 274 | memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len); |
259 | ), | 275 | ), |
260 | 276 | ||
261 | TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u" \ | 277 | TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u" \ |
262 | " cmnd=(%s %s raw=%s) rtn=%d", | 278 | " prot_op=%s cmnd=(%s %s raw=%s) rtn=%d", |
263 | __entry->host_no, __entry->channel, __entry->id, | 279 | __entry->host_no, __entry->channel, __entry->id, |
264 | __entry->lun, __entry->data_sglen, __entry->prot_sglen, | 280 | __entry->lun, __entry->data_sglen, __entry->prot_sglen, |
281 | show_prot_op_name(__entry->prot_op), | ||
265 | show_opcode_name(__entry->opcode), | 282 | show_opcode_name(__entry->opcode), |
266 | __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len), | 283 | __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len), |
267 | __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len), | 284 | __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len), |
@@ -284,6 +301,7 @@ DECLARE_EVENT_CLASS(scsi_cmd_done_timeout_template, | |||
284 | __field( unsigned int, cmd_len ) | 301 | __field( unsigned int, cmd_len ) |
285 | __field( unsigned int, data_sglen ) | 302 | __field( unsigned int, data_sglen ) |
286 | __field( unsigned int, prot_sglen ) | 303 | __field( unsigned int, prot_sglen ) |
304 | __field( unsigned char, prot_op ) | ||
287 | __dynamic_array(unsigned char, cmnd, cmd->cmd_len) | 305 | __dynamic_array(unsigned char, cmnd, cmd->cmd_len) |
288 | ), | 306 | ), |
289 | 307 | ||
@@ -297,14 +315,16 @@ DECLARE_EVENT_CLASS(scsi_cmd_done_timeout_template, | |||
297 | __entry->cmd_len = cmd->cmd_len; | 315 | __entry->cmd_len = cmd->cmd_len; |
298 | __entry->data_sglen = scsi_sg_count(cmd); | 316 | __entry->data_sglen = scsi_sg_count(cmd); |
299 | __entry->prot_sglen = scsi_prot_sg_count(cmd); | 317 | __entry->prot_sglen = scsi_prot_sg_count(cmd); |
318 | __entry->prot_op = scsi_get_prot_op(cmd); | ||
300 | memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len); | 319 | memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len); |
301 | ), | 320 | ), |
302 | 321 | ||
303 | TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u " \ | 322 | TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u " \ |
304 | "prot_sgl=%u cmnd=(%s %s raw=%s) result=(driver=%s host=%s " \ | 323 | "prot_sgl=%u prot_op=%s cmnd=(%s %s raw=%s) result=(driver=" \ |
305 | "message=%s status=%s)", | 324 | "%s host=%s message=%s status=%s)", |
306 | __entry->host_no, __entry->channel, __entry->id, | 325 | __entry->host_no, __entry->channel, __entry->id, |
307 | __entry->lun, __entry->data_sglen, __entry->prot_sglen, | 326 | __entry->lun, __entry->data_sglen, __entry->prot_sglen, |
327 | show_prot_op_name(__entry->prot_op), | ||
308 | show_opcode_name(__entry->opcode), | 328 | show_opcode_name(__entry->opcode), |
309 | __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len), | 329 | __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len), |
310 | __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len), | 330 | __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len), |
diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h index f10293c41b1e..0c68ae22da22 100644 --- a/include/trace/events/skb.h +++ b/include/trace/events/skb.h | |||
@@ -19,14 +19,14 @@ TRACE_EVENT(kfree_skb, | |||
19 | 19 | ||
20 | TP_STRUCT__entry( | 20 | TP_STRUCT__entry( |
21 | __field( void *, skbaddr ) | 21 | __field( void *, skbaddr ) |
22 | __field( unsigned short, protocol ) | ||
23 | __field( void *, location ) | 22 | __field( void *, location ) |
23 | __field( unsigned short, protocol ) | ||
24 | ), | 24 | ), |
25 | 25 | ||
26 | TP_fast_assign( | 26 | TP_fast_assign( |
27 | __entry->skbaddr = skb; | 27 | __entry->skbaddr = skb; |
28 | __entry->protocol = ntohs(skb->protocol); | ||
29 | __entry->location = location; | 28 | __entry->location = location; |
29 | __entry->protocol = ntohs(skb->protocol); | ||
30 | ), | 30 | ), |
31 | 31 | ||
32 | TP_printk("skbaddr=%p protocol=%u location=%p", | 32 | TP_printk("skbaddr=%p protocol=%u location=%p", |
diff --git a/include/video/sh_mobile_lcdc.h b/include/video/sh_mobile_lcdc.h index daabae5817c6..2c8d369190b3 100644 --- a/include/video/sh_mobile_lcdc.h +++ b/include/video/sh_mobile_lcdc.h | |||
@@ -59,6 +59,8 @@ struct sh_mobile_lcdc_board_cfg { | |||
59 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); | 59 | struct sh_mobile_lcdc_sys_bus_ops *sys_ops); |
60 | void (*display_on)(void *board_data, struct fb_info *info); | 60 | void (*display_on)(void *board_data, struct fb_info *info); |
61 | void (*display_off)(void *board_data); | 61 | void (*display_off)(void *board_data); |
62 | int (*set_brightness)(void *board_data, int brightness); | ||
63 | int (*get_brightness)(void *board_data); | ||
62 | }; | 64 | }; |
63 | 65 | ||
64 | struct sh_mobile_lcdc_lcd_size_cfg { /* width and height of panel in mm */ | 66 | struct sh_mobile_lcdc_lcd_size_cfg { /* width and height of panel in mm */ |
@@ -66,6 +68,12 @@ struct sh_mobile_lcdc_lcd_size_cfg { /* width and height of panel in mm */ | |||
66 | unsigned long height; | 68 | unsigned long height; |
67 | }; | 69 | }; |
68 | 70 | ||
71 | /* backlight info */ | ||
72 | struct sh_mobile_lcdc_bl_info { | ||
73 | const char *name; | ||
74 | int max_brightness; | ||
75 | }; | ||
76 | |||
69 | struct sh_mobile_lcdc_chan_cfg { | 77 | struct sh_mobile_lcdc_chan_cfg { |
70 | int chan; | 78 | int chan; |
71 | int bpp; | 79 | int bpp; |
@@ -76,7 +84,9 @@ struct sh_mobile_lcdc_chan_cfg { | |||
76 | int num_cfg; | 84 | int num_cfg; |
77 | struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg; | 85 | struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg; |
78 | struct sh_mobile_lcdc_board_cfg board_cfg; | 86 | struct sh_mobile_lcdc_board_cfg board_cfg; |
87 | struct sh_mobile_lcdc_bl_info bl_info; | ||
79 | struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ | 88 | struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ |
89 | int nonstd; | ||
80 | }; | 90 | }; |
81 | 91 | ||
82 | struct sh_mobile_lcdc_info { | 92 | struct sh_mobile_lcdc_info { |
diff --git a/include/xen/balloon.h b/include/xen/balloon.h new file mode 100644 index 000000000000..a2b22f01a51d --- /dev/null +++ b/include/xen/balloon.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /****************************************************************************** | ||
2 | * Xen balloon functionality | ||
3 | */ | ||
4 | |||
5 | #define RETRY_UNLIMITED 0 | ||
6 | |||
7 | struct balloon_stats { | ||
8 | /* We aim for 'current allocation' == 'target allocation'. */ | ||
9 | unsigned long current_pages; | ||
10 | unsigned long target_pages; | ||
11 | /* Number of pages in high- and low-memory balloons. */ | ||
12 | unsigned long balloon_low; | ||
13 | unsigned long balloon_high; | ||
14 | unsigned long schedule_delay; | ||
15 | unsigned long max_schedule_delay; | ||
16 | unsigned long retry_count; | ||
17 | unsigned long max_retry_count; | ||
18 | }; | ||
19 | |||
20 | extern struct balloon_stats balloon_stats; | ||
21 | |||
22 | void balloon_set_new_target(unsigned long target); | ||
23 | |||
24 | int alloc_xenballooned_pages(int nr_pages, struct page** pages); | ||
25 | void free_xenballooned_pages(int nr_pages, struct page** pages); | ||
diff --git a/include/xen/events.h b/include/xen/events.h index 00f53ddcc062..f1b87ad48ac7 100644 --- a/include/xen/events.h +++ b/include/xen/events.h | |||
@@ -23,6 +23,12 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi, | |||
23 | unsigned long irqflags, | 23 | unsigned long irqflags, |
24 | const char *devname, | 24 | const char *devname, |
25 | void *dev_id); | 25 | void *dev_id); |
26 | int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain, | ||
27 | unsigned int remote_port, | ||
28 | irq_handler_t handler, | ||
29 | unsigned long irqflags, | ||
30 | const char *devname, | ||
31 | void *dev_id); | ||
26 | 32 | ||
27 | /* | 33 | /* |
28 | * Common unbind function for all event sources. Takes IRQ to unbind from. | 34 | * Common unbind function for all event sources. Takes IRQ to unbind from. |
@@ -41,9 +47,9 @@ static inline void notify_remote_via_evtchn(int port) | |||
41 | (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send); | 47 | (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send); |
42 | } | 48 | } |
43 | 49 | ||
44 | extern void notify_remote_via_irq(int irq); | 50 | void notify_remote_via_irq(int irq); |
45 | 51 | ||
46 | extern void xen_irq_resume(void); | 52 | void xen_irq_resume(void); |
47 | 53 | ||
48 | /* Clear an irq's pending state, in preparation for polling on it */ | 54 | /* Clear an irq's pending state, in preparation for polling on it */ |
49 | void xen_clear_irq_pending(int irq); | 55 | void xen_clear_irq_pending(int irq); |
@@ -62,35 +68,29 @@ void xen_poll_irq_timeout(int irq, u64 timeout); | |||
62 | unsigned irq_from_evtchn(unsigned int evtchn); | 68 | unsigned irq_from_evtchn(unsigned int evtchn); |
63 | 69 | ||
64 | /* Xen HVM evtchn vector callback */ | 70 | /* Xen HVM evtchn vector callback */ |
65 | extern void xen_hvm_callback_vector(void); | 71 | void xen_hvm_callback_vector(void); |
66 | extern int xen_have_vector_callback; | 72 | extern int xen_have_vector_callback; |
67 | int xen_set_callback_via(uint64_t via); | 73 | int xen_set_callback_via(uint64_t via); |
68 | void xen_evtchn_do_upcall(struct pt_regs *regs); | 74 | void xen_evtchn_do_upcall(struct pt_regs *regs); |
69 | void xen_hvm_evtchn_do_upcall(void); | 75 | void xen_hvm_evtchn_do_upcall(void); |
70 | 76 | ||
71 | /* Allocate an irq for a physical interrupt, given a gsi. "Legacy" | 77 | /* Allocate a pirq for a physical interrupt, given a gsi. */ |
72 | * GSIs are identity mapped; others are dynamically allocated as | 78 | int xen_allocate_pirq_gsi(unsigned gsi); |
73 | * usual. */ | 79 | /* Bind a pirq for a physical interrupt to an irq. */ |
74 | int xen_allocate_pirq(unsigned gsi, int shareable, char *name); | 80 | int xen_bind_pirq_gsi_to_irq(unsigned gsi, |
75 | int xen_map_pirq_gsi(unsigned pirq, unsigned gsi, int shareable, char *name); | 81 | unsigned pirq, int shareable, char *name); |
76 | 82 | ||
77 | #ifdef CONFIG_PCI_MSI | 83 | #ifdef CONFIG_PCI_MSI |
78 | /* Allocate an irq and a pirq to be used with MSIs. */ | 84 | /* Allocate a pirq for a MSI style physical interrupt. */ |
79 | #define XEN_ALLOC_PIRQ (1 << 0) | 85 | int xen_allocate_pirq_msi(struct pci_dev *dev, struct msi_desc *msidesc); |
80 | #define XEN_ALLOC_IRQ (1 << 1) | 86 | /* Bind an PSI pirq to an irq. */ |
81 | void xen_allocate_pirq_msi(char *name, int *irq, int *pirq, int alloc_mask); | 87 | int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, |
82 | int xen_create_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int type); | 88 | int pirq, int vector, const char *name); |
83 | #endif | 89 | #endif |
84 | 90 | ||
85 | /* De-allocates the above mentioned physical interrupt. */ | 91 | /* De-allocates the above mentioned physical interrupt. */ |
86 | int xen_destroy_irq(int irq); | 92 | int xen_destroy_irq(int irq); |
87 | 93 | ||
88 | /* Return vector allocated to pirq */ | ||
89 | int xen_vector_from_irq(unsigned pirq); | ||
90 | |||
91 | /* Return gsi allocated to pirq */ | ||
92 | int xen_gsi_from_irq(unsigned pirq); | ||
93 | |||
94 | /* Return irq from pirq */ | 94 | /* Return irq from pirq */ |
95 | int xen_irq_from_pirq(unsigned pirq); | 95 | int xen_irq_from_pirq(unsigned pirq); |
96 | 96 | ||
diff --git a/include/xen/gntalloc.h b/include/xen/gntalloc.h new file mode 100644 index 000000000000..76bd58065f4f --- /dev/null +++ b/include/xen/gntalloc.h | |||
@@ -0,0 +1,82 @@ | |||
1 | /****************************************************************************** | ||
2 | * gntalloc.h | ||
3 | * | ||
4 | * Interface to /dev/xen/gntalloc. | ||
5 | * | ||
6 | * Author: Daniel De Graaf <dgdegra@tycho.nsa.gov> | ||
7 | * | ||
8 | * This file is in the public domain. | ||
9 | */ | ||
10 | |||
11 | #ifndef __LINUX_PUBLIC_GNTALLOC_H__ | ||
12 | #define __LINUX_PUBLIC_GNTALLOC_H__ | ||
13 | |||
14 | /* | ||
15 | * Allocates a new page and creates a new grant reference. | ||
16 | */ | ||
17 | #define IOCTL_GNTALLOC_ALLOC_GREF \ | ||
18 | _IOC(_IOC_NONE, 'G', 5, sizeof(struct ioctl_gntalloc_alloc_gref)) | ||
19 | struct ioctl_gntalloc_alloc_gref { | ||
20 | /* IN parameters */ | ||
21 | /* The ID of the domain to be given access to the grants. */ | ||
22 | uint16_t domid; | ||
23 | /* Flags for this mapping */ | ||
24 | uint16_t flags; | ||
25 | /* Number of pages to map */ | ||
26 | uint32_t count; | ||
27 | /* OUT parameters */ | ||
28 | /* The offset to be used on a subsequent call to mmap(). */ | ||
29 | uint64_t index; | ||
30 | /* The grant references of the newly created grant, one per page */ | ||
31 | /* Variable size, depending on count */ | ||
32 | uint32_t gref_ids[1]; | ||
33 | }; | ||
34 | |||
35 | #define GNTALLOC_FLAG_WRITABLE 1 | ||
36 | |||
37 | /* | ||
38 | * Deallocates the grant reference, allowing the associated page to be freed if | ||
39 | * no other domains are using it. | ||
40 | */ | ||
41 | #define IOCTL_GNTALLOC_DEALLOC_GREF \ | ||
42 | _IOC(_IOC_NONE, 'G', 6, sizeof(struct ioctl_gntalloc_dealloc_gref)) | ||
43 | struct ioctl_gntalloc_dealloc_gref { | ||
44 | /* IN parameters */ | ||
45 | /* The offset returned in the map operation */ | ||
46 | uint64_t index; | ||
47 | /* Number of references to unmap */ | ||
48 | uint32_t count; | ||
49 | }; | ||
50 | |||
51 | /* | ||
52 | * Sets up an unmap notification within the page, so that the other side can do | ||
53 | * cleanup if this side crashes. Required to implement cross-domain robust | ||
54 | * mutexes or close notification on communication channels. | ||
55 | * | ||
56 | * Each mapped page only supports one notification; multiple calls referring to | ||
57 | * the same page overwrite the previous notification. You must clear the | ||
58 | * notification prior to the IOCTL_GNTALLOC_DEALLOC_GREF if you do not want it | ||
59 | * to occur. | ||
60 | */ | ||
61 | #define IOCTL_GNTALLOC_SET_UNMAP_NOTIFY \ | ||
62 | _IOC(_IOC_NONE, 'G', 7, sizeof(struct ioctl_gntalloc_unmap_notify)) | ||
63 | struct ioctl_gntalloc_unmap_notify { | ||
64 | /* IN parameters */ | ||
65 | /* Offset in the file descriptor for a byte within the page (same as | ||
66 | * used in mmap). If using UNMAP_NOTIFY_CLEAR_BYTE, this is the byte to | ||
67 | * be cleared. Otherwise, it can be any byte in the page whose | ||
68 | * notification we are adjusting. | ||
69 | */ | ||
70 | uint64_t index; | ||
71 | /* Action(s) to take on unmap */ | ||
72 | uint32_t action; | ||
73 | /* Event channel to notify */ | ||
74 | uint32_t event_channel_port; | ||
75 | }; | ||
76 | |||
77 | /* Clear (set to zero) the byte specified by index */ | ||
78 | #define UNMAP_NOTIFY_CLEAR_BYTE 0x1 | ||
79 | /* Send an interrupt on the indicated event channel */ | ||
80 | #define UNMAP_NOTIFY_SEND_EVENT 0x2 | ||
81 | |||
82 | #endif /* __LINUX_PUBLIC_GNTALLOC_H__ */ | ||
diff --git a/include/xen/gntdev.h b/include/xen/gntdev.h index eb23f4188f5a..5304bd3c84c5 100644 --- a/include/xen/gntdev.h +++ b/include/xen/gntdev.h | |||
@@ -116,4 +116,35 @@ struct ioctl_gntdev_set_max_grants { | |||
116 | uint32_t count; | 116 | uint32_t count; |
117 | }; | 117 | }; |
118 | 118 | ||
119 | /* | ||
120 | * Sets up an unmap notification within the page, so that the other side can do | ||
121 | * cleanup if this side crashes. Required to implement cross-domain robust | ||
122 | * mutexes or close notification on communication channels. | ||
123 | * | ||
124 | * Each mapped page only supports one notification; multiple calls referring to | ||
125 | * the same page overwrite the previous notification. You must clear the | ||
126 | * notification prior to the IOCTL_GNTALLOC_DEALLOC_GREF if you do not want it | ||
127 | * to occur. | ||
128 | */ | ||
129 | #define IOCTL_GNTDEV_SET_UNMAP_NOTIFY \ | ||
130 | _IOC(_IOC_NONE, 'G', 7, sizeof(struct ioctl_gntdev_unmap_notify)) | ||
131 | struct ioctl_gntdev_unmap_notify { | ||
132 | /* IN parameters */ | ||
133 | /* Offset in the file descriptor for a byte within the page (same as | ||
134 | * used in mmap). If using UNMAP_NOTIFY_CLEAR_BYTE, this is the byte to | ||
135 | * be cleared. Otherwise, it can be any byte in the page whose | ||
136 | * notification we are adjusting. | ||
137 | */ | ||
138 | uint64_t index; | ||
139 | /* Action(s) to take on unmap */ | ||
140 | uint32_t action; | ||
141 | /* Event channel to notify */ | ||
142 | uint32_t event_channel_port; | ||
143 | }; | ||
144 | |||
145 | /* Clear (set to zero) the byte specified by index */ | ||
146 | #define UNMAP_NOTIFY_CLEAR_BYTE 0x1 | ||
147 | /* Send an interrupt on the indicated event channel */ | ||
148 | #define UNMAP_NOTIFY_SEND_EVENT 0x2 | ||
149 | |||
119 | #endif /* __LINUX_PUBLIC_GNTDEV_H__ */ | 150 | #endif /* __LINUX_PUBLIC_GNTDEV_H__ */ |
diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h index c2d1fa4dc1ee..61e523af3c46 100644 --- a/include/xen/interface/io/blkif.h +++ b/include/xen/interface/io/blkif.h | |||
@@ -51,11 +51,7 @@ typedef uint64_t blkif_sector_t; | |||
51 | */ | 51 | */ |
52 | #define BLKIF_MAX_SEGMENTS_PER_REQUEST 11 | 52 | #define BLKIF_MAX_SEGMENTS_PER_REQUEST 11 |
53 | 53 | ||
54 | struct blkif_request { | 54 | struct blkif_request_rw { |
55 | uint8_t operation; /* BLKIF_OP_??? */ | ||
56 | uint8_t nr_segments; /* number of segments */ | ||
57 | blkif_vdev_t handle; /* only for read/write requests */ | ||
58 | uint64_t id; /* private guest value, echoed in resp */ | ||
59 | blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ | 55 | blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ |
60 | struct blkif_request_segment { | 56 | struct blkif_request_segment { |
61 | grant_ref_t gref; /* reference to I/O buffer frame */ | 57 | grant_ref_t gref; /* reference to I/O buffer frame */ |
@@ -65,6 +61,16 @@ struct blkif_request { | |||
65 | } seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; | 61 | } seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; |
66 | }; | 62 | }; |
67 | 63 | ||
64 | struct blkif_request { | ||
65 | uint8_t operation; /* BLKIF_OP_??? */ | ||
66 | uint8_t nr_segments; /* number of segments */ | ||
67 | blkif_vdev_t handle; /* only for read/write requests */ | ||
68 | uint64_t id; /* private guest value, echoed in resp */ | ||
69 | union { | ||
70 | struct blkif_request_rw rw; | ||
71 | } u; | ||
72 | }; | ||
73 | |||
68 | struct blkif_response { | 74 | struct blkif_response { |
69 | uint64_t id; /* copied from request */ | 75 | uint64_t id; /* copied from request */ |
70 | uint8_t operation; /* copied from request */ | 76 | uint8_t operation; /* copied from request */ |
@@ -91,4 +97,25 @@ DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response); | |||
91 | #define VDISK_REMOVABLE 0x2 | 97 | #define VDISK_REMOVABLE 0x2 |
92 | #define VDISK_READONLY 0x4 | 98 | #define VDISK_READONLY 0x4 |
93 | 99 | ||
100 | /* Xen-defined major numbers for virtual disks, they look strangely | ||
101 | * familiar */ | ||
102 | #define XEN_IDE0_MAJOR 3 | ||
103 | #define XEN_IDE1_MAJOR 22 | ||
104 | #define XEN_SCSI_DISK0_MAJOR 8 | ||
105 | #define XEN_SCSI_DISK1_MAJOR 65 | ||
106 | #define XEN_SCSI_DISK2_MAJOR 66 | ||
107 | #define XEN_SCSI_DISK3_MAJOR 67 | ||
108 | #define XEN_SCSI_DISK4_MAJOR 68 | ||
109 | #define XEN_SCSI_DISK5_MAJOR 69 | ||
110 | #define XEN_SCSI_DISK6_MAJOR 70 | ||
111 | #define XEN_SCSI_DISK7_MAJOR 71 | ||
112 | #define XEN_SCSI_DISK8_MAJOR 128 | ||
113 | #define XEN_SCSI_DISK9_MAJOR 129 | ||
114 | #define XEN_SCSI_DISK10_MAJOR 130 | ||
115 | #define XEN_SCSI_DISK11_MAJOR 131 | ||
116 | #define XEN_SCSI_DISK12_MAJOR 132 | ||
117 | #define XEN_SCSI_DISK13_MAJOR 133 | ||
118 | #define XEN_SCSI_DISK14_MAJOR 134 | ||
119 | #define XEN_SCSI_DISK15_MAJOR 135 | ||
120 | |||
94 | #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ | 121 | #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ |
diff --git a/include/xen/interface/io/netif.h b/include/xen/interface/io/netif.h index 518481c95f18..cb94668f6e9f 100644 --- a/include/xen/interface/io/netif.h +++ b/include/xen/interface/io/netif.h | |||
@@ -22,50 +22,50 @@ | |||
22 | 22 | ||
23 | /* | 23 | /* |
24 | * This is the 'wire' format for packets: | 24 | * This is the 'wire' format for packets: |
25 | * Request 1: netif_tx_request -- NETTXF_* (any flags) | 25 | * Request 1: xen_netif_tx_request -- XEN_NETTXF_* (any flags) |
26 | * [Request 2: netif_tx_extra] (only if request 1 has NETTXF_extra_info) | 26 | * [Request 2: xen_netif_extra_info] (only if request 1 has XEN_NETTXF_extra_info) |
27 | * [Request 3: netif_tx_extra] (only if request 2 has XEN_NETIF_EXTRA_MORE) | 27 | * [Request 3: xen_netif_extra_info] (only if request 2 has XEN_NETIF_EXTRA_MORE) |
28 | * Request 4: netif_tx_request -- NETTXF_more_data | 28 | * Request 4: xen_netif_tx_request -- XEN_NETTXF_more_data |
29 | * Request 5: netif_tx_request -- NETTXF_more_data | 29 | * Request 5: xen_netif_tx_request -- XEN_NETTXF_more_data |
30 | * ... | 30 | * ... |
31 | * Request N: netif_tx_request -- 0 | 31 | * Request N: xen_netif_tx_request -- 0 |
32 | */ | 32 | */ |
33 | 33 | ||
34 | /* Protocol checksum field is blank in the packet (hardware offload)? */ | 34 | /* Protocol checksum field is blank in the packet (hardware offload)? */ |
35 | #define _NETTXF_csum_blank (0) | 35 | #define _XEN_NETTXF_csum_blank (0) |
36 | #define NETTXF_csum_blank (1U<<_NETTXF_csum_blank) | 36 | #define XEN_NETTXF_csum_blank (1U<<_XEN_NETTXF_csum_blank) |
37 | 37 | ||
38 | /* Packet data has been validated against protocol checksum. */ | 38 | /* Packet data has been validated against protocol checksum. */ |
39 | #define _NETTXF_data_validated (1) | 39 | #define _XEN_NETTXF_data_validated (1) |
40 | #define NETTXF_data_validated (1U<<_NETTXF_data_validated) | 40 | #define XEN_NETTXF_data_validated (1U<<_XEN_NETTXF_data_validated) |
41 | 41 | ||
42 | /* Packet continues in the next request descriptor. */ | 42 | /* Packet continues in the next request descriptor. */ |
43 | #define _NETTXF_more_data (2) | 43 | #define _XEN_NETTXF_more_data (2) |
44 | #define NETTXF_more_data (1U<<_NETTXF_more_data) | 44 | #define XEN_NETTXF_more_data (1U<<_XEN_NETTXF_more_data) |
45 | 45 | ||
46 | /* Packet to be followed by extra descriptor(s). */ | 46 | /* Packet to be followed by extra descriptor(s). */ |
47 | #define _NETTXF_extra_info (3) | 47 | #define _XEN_NETTXF_extra_info (3) |
48 | #define NETTXF_extra_info (1U<<_NETTXF_extra_info) | 48 | #define XEN_NETTXF_extra_info (1U<<_XEN_NETTXF_extra_info) |
49 | 49 | ||
50 | struct xen_netif_tx_request { | 50 | struct xen_netif_tx_request { |
51 | grant_ref_t gref; /* Reference to buffer page */ | 51 | grant_ref_t gref; /* Reference to buffer page */ |
52 | uint16_t offset; /* Offset within buffer page */ | 52 | uint16_t offset; /* Offset within buffer page */ |
53 | uint16_t flags; /* NETTXF_* */ | 53 | uint16_t flags; /* XEN_NETTXF_* */ |
54 | uint16_t id; /* Echoed in response message. */ | 54 | uint16_t id; /* Echoed in response message. */ |
55 | uint16_t size; /* Packet size in bytes. */ | 55 | uint16_t size; /* Packet size in bytes. */ |
56 | }; | 56 | }; |
57 | 57 | ||
58 | /* Types of netif_extra_info descriptors. */ | 58 | /* Types of xen_netif_extra_info descriptors. */ |
59 | #define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ | 59 | #define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */ |
60 | #define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ | 60 | #define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */ |
61 | #define XEN_NETIF_EXTRA_TYPE_MAX (2) | 61 | #define XEN_NETIF_EXTRA_TYPE_MAX (2) |
62 | 62 | ||
63 | /* netif_extra_info flags. */ | 63 | /* xen_netif_extra_info flags. */ |
64 | #define _XEN_NETIF_EXTRA_FLAG_MORE (0) | 64 | #define _XEN_NETIF_EXTRA_FLAG_MORE (0) |
65 | #define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) | 65 | #define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE) |
66 | 66 | ||
67 | /* GSO types - only TCPv4 currently supported. */ | 67 | /* GSO types - only TCPv4 currently supported. */ |
68 | #define XEN_NETIF_GSO_TYPE_TCPV4 (1) | 68 | #define XEN_NETIF_GSO_TYPE_TCPV4 (1) |
69 | 69 | ||
70 | /* | 70 | /* |
71 | * This structure needs to fit within both netif_tx_request and | 71 | * This structure needs to fit within both netif_tx_request and |
@@ -107,7 +107,7 @@ struct xen_netif_extra_info { | |||
107 | 107 | ||
108 | struct xen_netif_tx_response { | 108 | struct xen_netif_tx_response { |
109 | uint16_t id; | 109 | uint16_t id; |
110 | int16_t status; /* NETIF_RSP_* */ | 110 | int16_t status; /* XEN_NETIF_RSP_* */ |
111 | }; | 111 | }; |
112 | 112 | ||
113 | struct xen_netif_rx_request { | 113 | struct xen_netif_rx_request { |
@@ -116,25 +116,29 @@ struct xen_netif_rx_request { | |||
116 | }; | 116 | }; |
117 | 117 | ||
118 | /* Packet data has been validated against protocol checksum. */ | 118 | /* Packet data has been validated against protocol checksum. */ |
119 | #define _NETRXF_data_validated (0) | 119 | #define _XEN_NETRXF_data_validated (0) |
120 | #define NETRXF_data_validated (1U<<_NETRXF_data_validated) | 120 | #define XEN_NETRXF_data_validated (1U<<_XEN_NETRXF_data_validated) |
121 | 121 | ||
122 | /* Protocol checksum field is blank in the packet (hardware offload)? */ | 122 | /* Protocol checksum field is blank in the packet (hardware offload)? */ |
123 | #define _NETRXF_csum_blank (1) | 123 | #define _XEN_NETRXF_csum_blank (1) |
124 | #define NETRXF_csum_blank (1U<<_NETRXF_csum_blank) | 124 | #define XEN_NETRXF_csum_blank (1U<<_XEN_NETRXF_csum_blank) |
125 | 125 | ||
126 | /* Packet continues in the next request descriptor. */ | 126 | /* Packet continues in the next request descriptor. */ |
127 | #define _NETRXF_more_data (2) | 127 | #define _XEN_NETRXF_more_data (2) |
128 | #define NETRXF_more_data (1U<<_NETRXF_more_data) | 128 | #define XEN_NETRXF_more_data (1U<<_XEN_NETRXF_more_data) |
129 | 129 | ||
130 | /* Packet to be followed by extra descriptor(s). */ | 130 | /* Packet to be followed by extra descriptor(s). */ |
131 | #define _NETRXF_extra_info (3) | 131 | #define _XEN_NETRXF_extra_info (3) |
132 | #define NETRXF_extra_info (1U<<_NETRXF_extra_info) | 132 | #define XEN_NETRXF_extra_info (1U<<_XEN_NETRXF_extra_info) |
133 | |||
134 | /* GSO Prefix descriptor. */ | ||
135 | #define _XEN_NETRXF_gso_prefix (4) | ||
136 | #define XEN_NETRXF_gso_prefix (1U<<_XEN_NETRXF_gso_prefix) | ||
133 | 137 | ||
134 | struct xen_netif_rx_response { | 138 | struct xen_netif_rx_response { |
135 | uint16_t id; | 139 | uint16_t id; |
136 | uint16_t offset; /* Offset in page of start of received packet */ | 140 | uint16_t offset; /* Offset in page of start of received packet */ |
137 | uint16_t flags; /* NETRXF_* */ | 141 | uint16_t flags; /* XEN_NETRXF_* */ |
138 | int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */ | 142 | int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */ |
139 | }; | 143 | }; |
140 | 144 | ||
@@ -149,10 +153,10 @@ DEFINE_RING_TYPES(xen_netif_rx, | |||
149 | struct xen_netif_rx_request, | 153 | struct xen_netif_rx_request, |
150 | struct xen_netif_rx_response); | 154 | struct xen_netif_rx_response); |
151 | 155 | ||
152 | #define NETIF_RSP_DROPPED -2 | 156 | #define XEN_NETIF_RSP_DROPPED -2 |
153 | #define NETIF_RSP_ERROR -1 | 157 | #define XEN_NETIF_RSP_ERROR -1 |
154 | #define NETIF_RSP_OKAY 0 | 158 | #define XEN_NETIF_RSP_OKAY 0 |
155 | /* No response: used for auxiliary requests (e.g., netif_tx_extra). */ | 159 | /* No response: used for auxiliary requests (e.g., xen_netif_extra_info). */ |
156 | #define NETIF_RSP_NULL 1 | 160 | #define XEN_NETIF_RSP_NULL 1 |
157 | 161 | ||
158 | #endif | 162 | #endif |
diff --git a/include/xen/interface/sched.h b/include/xen/interface/sched.h index 5fec575a800a..dd55dac340de 100644 --- a/include/xen/interface/sched.h +++ b/include/xen/interface/sched.h | |||
@@ -65,6 +65,39 @@ struct sched_poll { | |||
65 | DEFINE_GUEST_HANDLE_STRUCT(sched_poll); | 65 | DEFINE_GUEST_HANDLE_STRUCT(sched_poll); |
66 | 66 | ||
67 | /* | 67 | /* |
68 | * Declare a shutdown for another domain. The main use of this function is | ||
69 | * in interpreting shutdown requests and reasons for fully-virtualized | ||
70 | * domains. A para-virtualized domain may use SCHEDOP_shutdown directly. | ||
71 | * @arg == pointer to sched_remote_shutdown structure. | ||
72 | */ | ||
73 | #define SCHEDOP_remote_shutdown 4 | ||
74 | struct sched_remote_shutdown { | ||
75 | domid_t domain_id; /* Remote domain ID */ | ||
76 | unsigned int reason; /* SHUTDOWN_xxx reason */ | ||
77 | }; | ||
78 | |||
79 | /* | ||
80 | * Latch a shutdown code, so that when the domain later shuts down it | ||
81 | * reports this code to the control tools. | ||
82 | * @arg == as for SCHEDOP_shutdown. | ||
83 | */ | ||
84 | #define SCHEDOP_shutdown_code 5 | ||
85 | |||
86 | /* | ||
87 | * Setup, poke and destroy a domain watchdog timer. | ||
88 | * @arg == pointer to sched_watchdog structure. | ||
89 | * With id == 0, setup a domain watchdog timer to cause domain shutdown | ||
90 | * after timeout, returns watchdog id. | ||
91 | * With id != 0 and timeout == 0, destroy domain watchdog timer. | ||
92 | * With id != 0 and timeout != 0, poke watchdog timer and set new timeout. | ||
93 | */ | ||
94 | #define SCHEDOP_watchdog 6 | ||
95 | struct sched_watchdog { | ||
96 | uint32_t id; /* watchdog ID */ | ||
97 | uint32_t timeout; /* timeout */ | ||
98 | }; | ||
99 | |||
100 | /* | ||
68 | * Reason codes for SCHEDOP_shutdown. These may be interpreted by control | 101 | * Reason codes for SCHEDOP_shutdown. These may be interpreted by control |
69 | * software to determine the appropriate action. For the most part, Xen does | 102 | * software to determine the appropriate action. For the most part, Xen does |
70 | * not care about the shutdown code. | 103 | * not care about the shutdown code. |
@@ -73,5 +106,6 @@ DEFINE_GUEST_HANDLE_STRUCT(sched_poll); | |||
73 | #define SHUTDOWN_reboot 1 /* Clean up, kill, and then restart. */ | 106 | #define SHUTDOWN_reboot 1 /* Clean up, kill, and then restart. */ |
74 | #define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */ | 107 | #define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */ |
75 | #define SHUTDOWN_crash 3 /* Tell controller we've crashed. */ | 108 | #define SHUTDOWN_crash 3 /* Tell controller we've crashed. */ |
109 | #define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */ | ||
76 | 110 | ||
77 | #endif /* __XEN_PUBLIC_SCHED_H__ */ | 111 | #endif /* __XEN_PUBLIC_SCHED_H__ */ |
diff --git a/include/xen/interface/xen.h b/include/xen/interface/xen.h index 2befa3e2f1bc..b33257bc7e83 100644 --- a/include/xen/interface/xen.h +++ b/include/xen/interface/xen.h | |||
@@ -30,7 +30,7 @@ | |||
30 | #define __HYPERVISOR_stack_switch 3 | 30 | #define __HYPERVISOR_stack_switch 3 |
31 | #define __HYPERVISOR_set_callbacks 4 | 31 | #define __HYPERVISOR_set_callbacks 4 |
32 | #define __HYPERVISOR_fpu_taskswitch 5 | 32 | #define __HYPERVISOR_fpu_taskswitch 5 |
33 | #define __HYPERVISOR_sched_op 6 | 33 | #define __HYPERVISOR_sched_op_compat 6 |
34 | #define __HYPERVISOR_dom0_op 7 | 34 | #define __HYPERVISOR_dom0_op 7 |
35 | #define __HYPERVISOR_set_debugreg 8 | 35 | #define __HYPERVISOR_set_debugreg 8 |
36 | #define __HYPERVISOR_get_debugreg 9 | 36 | #define __HYPERVISOR_get_debugreg 9 |
@@ -52,7 +52,7 @@ | |||
52 | #define __HYPERVISOR_mmuext_op 26 | 52 | #define __HYPERVISOR_mmuext_op 26 |
53 | #define __HYPERVISOR_acm_op 27 | 53 | #define __HYPERVISOR_acm_op 27 |
54 | #define __HYPERVISOR_nmi_op 28 | 54 | #define __HYPERVISOR_nmi_op 28 |
55 | #define __HYPERVISOR_sched_op_new 29 | 55 | #define __HYPERVISOR_sched_op 29 |
56 | #define __HYPERVISOR_callback_op 30 | 56 | #define __HYPERVISOR_callback_op 30 |
57 | #define __HYPERVISOR_xenoprof_op 31 | 57 | #define __HYPERVISOR_xenoprof_op 31 |
58 | #define __HYPERVISOR_event_channel_op 32 | 58 | #define __HYPERVISOR_event_channel_op 32 |
diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h index 98b92154a264..03c85d7387fb 100644 --- a/include/xen/xen-ops.h +++ b/include/xen/xen-ops.h | |||
@@ -5,9 +5,9 @@ | |||
5 | 5 | ||
6 | DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu); | 6 | DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu); |
7 | 7 | ||
8 | void xen_pre_suspend(void); | 8 | void xen_arch_pre_suspend(void); |
9 | void xen_post_suspend(int suspend_cancelled); | 9 | void xen_arch_post_suspend(int suspend_cancelled); |
10 | void xen_hvm_post_suspend(int suspend_cancelled); | 10 | void xen_arch_hvm_post_suspend(int suspend_cancelled); |
11 | 11 | ||
12 | void xen_mm_pin_all(void); | 12 | void xen_mm_pin_all(void); |
13 | void xen_mm_unpin_all(void); | 13 | void xen_mm_unpin_all(void); |
diff --git a/include/xen/xenbus.h b/include/xen/xenbus.h index 7a1d15ff19b7..5467369e0889 100644 --- a/include/xen/xenbus.h +++ b/include/xen/xenbus.h | |||
@@ -92,7 +92,7 @@ struct xenbus_driver { | |||
92 | void (*otherend_changed)(struct xenbus_device *dev, | 92 | void (*otherend_changed)(struct xenbus_device *dev, |
93 | enum xenbus_state backend_state); | 93 | enum xenbus_state backend_state); |
94 | int (*remove)(struct xenbus_device *dev); | 94 | int (*remove)(struct xenbus_device *dev); |
95 | int (*suspend)(struct xenbus_device *dev, pm_message_t state); | 95 | int (*suspend)(struct xenbus_device *dev); |
96 | int (*resume)(struct xenbus_device *dev); | 96 | int (*resume)(struct xenbus_device *dev); |
97 | int (*uevent)(struct xenbus_device *, struct kobj_uevent_env *); | 97 | int (*uevent)(struct xenbus_device *, struct kobj_uevent_env *); |
98 | struct device_driver driver; | 98 | struct device_driver driver; |